1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
mod discovery;
mod utils;

pub mod build;
pub mod error;

use std::collections::HashSet;
use std::env;
use std::path::PathBuf;

pub fn discover() -> Result<Vec<build::Build>, error::DiscoveryError> {
    let mut builds: HashSet<build::Build> = HashSet::new();

    discovery::installations_from_env(&mut builds)?;

    #[cfg(target_family = "windows")] {
        let system_drive: PathBuf = env::var_os("SystemDrive")
            .map(|system_drive_name| format!("{}\\", system_drive_name.to_string_lossy()))
            .map(|system_drive| PathBuf::from(system_drive))
            .ok_or(error::DiscoveryError::FailedToLocateSystemDrive)?;

        // XAMPP
        discovery::builds_from_dir(&mut builds, system_drive.join("xampp").join("php"))?;
        // Cygwin
        discovery::builds_from_dir(&mut builds, system_drive.join("cygwin64").join("bin"))?;
        discovery::builds_from_dir(&mut builds, system_drive.join("cygwin").join("bin"))?;
        // Chocolatey
        discovery::builds_from_dir(&mut builds, system_drive.join("tools"))?;
        // WAMP
        discovery::builds_from_dir(
            &mut builds,
            system_drive.join("wamp64").join("bin").join("php"),
        )?;
        discovery::builds_from_dir(
            &mut builds,
            system_drive.join("wamp").join("bin").join("php"),
        )?;
        // MAMP
        discovery::builds_from_dir(
            &mut builds,
            system_drive.join("mamp").join("bin").join("php"),
        )?;
    }

    #[cfg(not(target_family = "windows"))] {
        if let Some(home) = env::var_os("HOME") {
            let home: PathBuf = home.into();

            // phpbrew
            discovery::scan_dir_for_builds(&mut builds, home.join(".phpbrew").join("php"))?;
            // .phpenv
            discovery::scan_dir_for_builds(&mut builds, home.join(".phpenv").join("versions"))?;
        }

        #[cfg(target_os = "macos")] {
            // MacPorts (/opt/local/sbin/php-fpm71, /opt/local/bin/php71)
            discovery::scan_dir_for_builds(
                &mut builds,
                PathBuf::from("/opt/local"),
            )?;
            // MAMP
            discovery::scan_dir_for_builds(
                &mut builds,
                PathBuf::from("/Applications/MAMP/bin/php/"),
            )?;
        }

        #[cfg(target_os = "linux")] {
            // Ondrej PPA on Linux (bin/php7.2)
            discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/usr"))?;
            // Remi's RPM repository
            discovery::scan_dir_for_builds(&mut builds, PathBuf::from("/opt/remi"))?;
        }
    }

    Ok(builds.into_iter().collect())
}