Sebastian Thielmake fmtc665aef4 years agoHistory
167 lines · 5.2 KB · Rust
RawDownload
use std::path::Path; use git_discover::upwards::Options; use crate::upwards::repo_path; fn assert_repo_is_current_workdir(path: git_discover::repository::Path, work_dir: &Path) {    assert_eq!(        path.into_repository_and_work_tree_directories()            .1            .expect("work dir")            .file_name(),        work_dir.file_name()    );} #[test]fn git_dir_candidate_within_ceiling_allows_discovery() -> crate::Result {    let work_dir = repo_path()?;    let dir = work_dir.join("some/very/deeply/nested/subdir");    let (repo_path, _trust) = git_discover::upwards_opts(        &dir,        Options {            ceiling_dirs: vec![work_dir.clone()],            ..Default::default()        },    )    .expect("ceiling dir should allow us to discover the repo");    assert_repo_is_current_workdir(repo_path, &work_dir);     Ok(())} #[test]fn ceiling_dir_limits_are_respected_and_prevent_discovery() -> crate::Result {    let work_dir = repo_path()?;    let dir = work_dir.join("some/very/deeply/nested/subdir");     let err = git_discover::upwards_opts(        &dir,        Options {            ceiling_dirs: vec![work_dir.join("some/../some")],            ..Default::default()        },    )    .expect_err("ceiling dir prevents discovery as it ends on level too early, and they are also absolutized");    assert!(matches!(        err,        git_discover::upwards::Error::NoGitRepositoryWithinCeiling { ceiling_height: 5, .. }    ));     Ok(())} #[test]fn no_matching_ceiling_dir_error_can_be_suppressed() -> crate::Result {    let work_dir = repo_path()?;    let dir = work_dir.join("some/very/deeply/nested/subdir");    let (repo_path, _trust) = git_discover::upwards_opts(        &dir,        Options {            match_ceiling_dir_or_error: false,            ceiling_dirs: vec![                work_dir.canonicalize()?,                work_dir.join("some/very/deeply/nested/subdir/too-deep"),                work_dir.join("some/very/deeply/nested/unrelated-dir"),                work_dir.join("a/completely/unrelated/dir"),            ],            ..Default::default()        },    )    .expect("ceiling dir should allow us to discover the repo");    assert_repo_is_current_workdir(repo_path, &work_dir);     Ok(())} #[test]fn more_restrictive_ceiling_dirs_overrule_less_restrictive_ones() -> crate::Result {    let work_dir = repo_path()?;    let dir = work_dir.join("some/very/deeply/nested/subdir");    let err = git_discover::upwards_opts(        &dir,        Options {            ceiling_dirs: vec![work_dir.clone(), work_dir.join("some")],            ..Default::default()        },    )    .expect_err("more restrictive ceiling dirs overrule less restrictive ones");    assert!(matches!(        err,        git_discover::upwards::Error::NoGitRepositoryWithinCeiling { ceiling_height: 5, .. }    ));     Ok(())} #[test]fn ceiling_dirs_are_not_processed_differently_than_the_git_dir_candidate() -> crate::Result {    let work_dir = repo_path()?;    let dir = work_dir.join("some/very/deeply/nested/subdir/../../../../../..");    let (repo_path, _trust) = git_discover::upwards_opts(        &dir,        Options {            match_ceiling_dir_or_error: false,            ceiling_dirs: vec![Path::new("./some").into()],            ..Default::default()        },    )    .expect("the repo can be discovered because the relative ceiling doesn't _look_ like it has something to do with the git dir candidate");     assert_ne!(        &repo_path.as_ref().canonicalize()?,        &work_dir,        "a relative path that climbs above the test repo should yield the gitoxide repo"    );     Ok(())} #[test]fn no_matching_ceiling_dirs_errors_by_default() -> crate::Result {    let relative_work_dir = repo_path()?;    let dir = relative_work_dir.join("some");    let res = git_discover::upwards_opts(        &dir,        Options {            ceiling_dirs: vec!["/something/somewhere".into()],            ..Default::default()        },    );     assert!(        matches!(res, Err(git_discover::upwards::Error::NoMatchingCeilingDir)),        "the canonicalized ceiling dir doesn't have the same root as the git dir candidate, and can never match."    );    Ok(())} #[test]fn ceilings_are_adjusted_to_match_search_dir() -> crate::Result {    let relative_work_dir = repo_path()?;    let cwd = std::env::current_dir()?;    let absolute_ceiling_dir = git_path::realpath_opts(&relative_work_dir, &cwd, 8)?;    let dir = relative_work_dir.join("some");    assert!(dir.is_relative());    let (repo_path, _trust) = git_discover::upwards_opts(        &dir,        Options {            ceiling_dirs: vec![absolute_ceiling_dir],            ..Default::default()        },    )?;    assert_repo_is_current_workdir(repo_path, &relative_work_dir);     assert!(relative_work_dir.is_relative());    let absolute_dir = git_path::realpath_opts(relative_work_dir.join("some"), cwd, 8)?;    let (repo_path, _trust) = git_discover::upwards_opts(        absolute_dir,        Options {            ceiling_dirs: vec![relative_work_dir.clone()],            ..Default::default()        },    )?;    assert_repo_is_current_workdir(repo_path, &relative_work_dir);    Ok(())}