use super::*;#[test]fn parse_version() { assert_eq!(git_version_from_bytes(b"git version 2.37.2").unwrap(), (2, 37, 2)); assert_eq!( git_version_from_bytes(b"git version 2.32.1 (Apple Git-133)").unwrap(), (2, 32, 1) );}#[test]fn parse_version_with_trailing_newline() { assert_eq!(git_version_from_bytes(b"git version 2.37.2\n").unwrap(), (2, 37, 2));}const SCOPE_ENV_VALUE: &str = "gitconfig";fn populate_ad_hoc_config_files(dir: &Path) { const CONFIG_DATA: &[u8] = b"[foo]\n\tbar = baz\n"; let paths: &[PathBuf] = if cfg!(windows) { let unc_literal_nul = dir.canonicalize().expect("directory exists").join("nul"); &[dir.join(SCOPE_ENV_VALUE), dir.join("-"), unc_literal_nul] } else { &[dir.join(SCOPE_ENV_VALUE), dir.join("-"), dir.join(":")] }; // Create the files. for path in paths { std::fs::write(path, CONFIG_DATA).expect("can write contents"); } // Verify the files. This is mostly to show we really made a `\\?\...\nul` on Windows. for path in paths { let buf = std::fs::read(path).expect("the file really exists"); assert_eq!(buf, CONFIG_DATA, "{path:?} should be a config file"); }}#[test]fn configure_command_clears_external_config() { let temp = tempfile::TempDir::new().expect("can create temp dir"); populate_ad_hoc_config_files(temp.path()); let mut cmd = std::process::Command::new(GIT_PROGRAM); cmd.env("GIT_CONFIG_SYSTEM", SCOPE_ENV_VALUE); cmd.env("GIT_CONFIG_GLOBAL", SCOPE_ENV_VALUE); configure_command( &mut cmd, gix_hash::Kind::default(), ["config", "-l", "--show-origin"], temp.path(), ); let output = cmd.output().expect("can run git"); let lines: Vec<_> = output .stdout .to_str() .expect("valid UTF-8") .lines() .filter(|line| !line.starts_with("command line:\t")) .collect(); let status = output.status.code().expect("terminated normally"); assert_eq!(lines, Vec::<&str>::new(), "should be no config variables from files"); assert_eq!(status, 0, "reading the config should succeed");}#[test]#[cfg(windows)]fn bash_program_ok_for_platform() { let path = bash_program(); assert!(path.is_absolute()); let for_version = std::process::Command::new(path) .arg("--version") .output() .expect("can pass it `--version`"); assert!(for_version.status.success(), "passing `--version` succeeds"); let version_line = for_version .stdout .lines() .nth(0) .expect("`--version` output has first line"); assert!( version_line.ends_with(b"-pc-msys)"), // On Windows, "-pc-linux-gnu)" would be WSL. "it is an MSYS bash (such as Git Bash)" ); let for_uname_os = std::process::Command::new(path) .args(["-c", "uname -o"]) .output() .expect("can tell it to run `uname -o`"); assert!(for_uname_os.status.success(), "telling it to run `uname -o` succeeds"); assert_eq!( for_uname_os.stdout.trim_end(), b"Msys", "it runs commands in an MSYS environment" );}#[test]#[cfg(not(windows))]fn bash_program_ok_for_platform() { assert_eq!(bash_program(), Path::new("bash"));}#[test]fn bash_program_unix_path() { let path = bash_program() .to_str() .expect("This test depends on the bash path being valid Unicode"); assert!( !path.contains('\\'), "The path to bash should have no backslashes, barring very unusual environments" );}fn is_rooted_relative(path: impl AsRef<Path>) -> bool { let p = path.as_ref(); p.is_relative() && p.has_root()}#[test]#[cfg(windows)]fn unix_style_absolute_is_rooted_relative() { assert!(is_rooted_relative("/bin/bash"), "can detect paths like /bin/bash");}#[test]fn bash_program_absolute_or_unrooted() { let bash = bash_program(); assert!(!is_rooted_relative(bash), "{bash:?}");}
use super::*;
#[test]
fn parse_version() {
assert_eq!(git_version_from_bytes(b"git version 2.37.2").unwrap(), (2, 37, 2));
assert_eq!(
git_version_from_bytes(b"git version 2.32.1 (Apple Git-133)").unwrap(),
(2, 32, 1)
);
}
#[test]
fn parse_version_with_trailing_newline() {
assert_eq!(git_version_from_bytes(b"git version 2.37.2\n").unwrap(), (2, 37, 2));
}
const SCOPE_ENV_VALUE: &str = "gitconfig";
fn populate_ad_hoc_config_files(dir: &Path) {
const CONFIG_DATA: &[u8] = b"[foo]\n\tbar = baz\n";
let paths: &[PathBuf] = if cfg!(windows) {
let unc_literal_nul = dir.canonicalize().expect("directory exists").join("nul");
&[dir.join(SCOPE_ENV_VALUE), dir.join("-"), unc_literal_nul]
} else {
&[dir.join(SCOPE_ENV_VALUE), dir.join("-"), dir.join(":")]
};
// Create the files.
for path in paths {
std::fs::write(path, CONFIG_DATA).expect("can write contents");
}
// Verify the files. This is mostly to show we really made a `\\?\...\nul` on Windows.
for path in paths {
let buf = std::fs::read(path).expect("the file really exists");
assert_eq!(buf, CONFIG_DATA, "{path:?} should be a config file");
}
}
#[test]
fn configure_command_clears_external_config() {
let temp = tempfile::TempDir::new().expect("can create temp dir");
populate_ad_hoc_config_files(temp.path());
let mut cmd = std::process::Command::new(GIT_PROGRAM);
cmd.env("GIT_CONFIG_SYSTEM", SCOPE_ENV_VALUE);
cmd.env("GIT_CONFIG_GLOBAL", SCOPE_ENV_VALUE);
configure_command(
&mut cmd,
gix_hash::Kind::default(),
["config", "-l", "--show-origin"],
temp.path(),
);
let output = cmd.output().expect("can run git");
let lines: Vec<_> = output
.stdout
.to_str()
.expect("valid UTF-8")
.lines()
.filter(|line| !line.starts_with("command line:\t"))
.collect();
let status = output.status.code().expect("terminated normally");
assert_eq!(lines, Vec::<&str>::new(), "should be no config variables from files");
assert_eq!(status, 0, "reading the config should succeed");
}
#[test]
#[cfg(windows)]
fn bash_program_ok_for_platform() {
let path = bash_program();
assert!(path.is_absolute());
let for_version = std::process::Command::new(path)
.arg("--version")
.output()
.expect("can pass it `--version`");
assert!(for_version.status.success(), "passing `--version` succeeds");
let version_line = for_version
.stdout
.lines()
.nth(0)
.expect("`--version` output has first line");
assert!(
version_line.ends_with(b"-pc-msys)"), // On Windows, "-pc-linux-gnu)" would be WSL.
"it is an MSYS bash (such as Git Bash)"
);
let for_uname_os = std::process::Command::new(path)
.args(["-c", "uname -o"])
.output()
.expect("can tell it to run `uname -o`");
assert!(for_uname_os.status.success(), "telling it to run `uname -o` succeeds");
assert_eq!(
for_uname_os.stdout.trim_end(),
b"Msys",
"it runs commands in an MSYS environment"
);
}
#[test]
#[cfg(not(windows))]
fn bash_program_ok_for_platform() {
assert_eq!(bash_program(), Path::new("bash"));
}
#[test]
fn bash_program_unix_path() {
let path = bash_program()
.to_str()
.expect("This test depends on the bash path being valid Unicode");
assert!(
!path.contains('\\'),
"The path to bash should have no backslashes, barring very unusual environments"
);
}
fn is_rooted_relative(path: impl AsRef<Path>) -> bool {
let p = path.as_ref();
p.is_relative() && p.has_root()
}
#[test]
#[cfg(windows)]
fn unix_style_absolute_is_rooted_relative() {
assert!(is_rooted_relative("/bin/bash"), "can detect paths like /bin/bash");
}
#[test]
fn bash_program_absolute_or_unrooted() {
let bash = bash_program();
assert!(!is_rooted_relative(bash), "{bash:?}");
}