740 lines · 24.4 KB · Rust
RawDownload
use std::borrow::Cow; use git_object::bstr::BStr; fn bcow(input: &str) -> Cow<'_, BStr> {    Cow::Borrowed(input.into())} mod keys {    use std::borrow::Cow;     use git_object::bstr::ByteSlice;    use git_repository as git;    use git_repository::config::tree::{Key, Section};     use crate::config::tree::bcow;     #[test]    fn string() -> crate::Result {        assert_eq!(            git::config::tree::Http::USER_AGENT.try_into_string(bcow("agent"))?,            "agent"        );        assert!(git::config::tree::Http::USER_AGENT.validate("agent".into()).is_ok());         let invalid = b"\xF0\x80\x80".as_bstr();        assert_eq!(            git::config::tree::Http::USER_AGENT                .try_into_string(Cow::Borrowed(invalid))                .unwrap_err()                .to_string(),            "The utf-8 string at \"http.userAgent=���\" could not be decoded"        );        assert!(git::config::tree::Http::USER_AGENT.validate(invalid).is_err());         Ok(())    }     #[test]    fn any() {        assert!(            !git::config::Tree.sections().is_empty(),            "the root has at least one section"        );        assert_eq!(git::config::Tree::AUTHOR.name(), "author");        assert_eq!(git::config::tree::Author.keys().len(), 2);        assert_eq!(git::config::tree::Author::NAME.name(), "name");        assert_eq!(git::config::tree::Author::EMAIL.name(), "email");        assert_eq!(            git::config::tree::Author::NAME                .validated_assignment("user".into())                .unwrap(),            "author.name=user"        );        assert_eq!(            git::config::tree::Author::NAME                .validated_assignment("user".into())                .unwrap(),            "author.name=user"        );    }     #[test]    fn remote_name() {        assert!(git::config::tree::Remote::PUSH_DEFAULT            .validate("origin".into())            .is_ok());        assert!(git::config::tree::Remote::PUSH_DEFAULT            .validate("https://github.com/byron/gitoxide".into())            .is_ok());    }} mod branch {    use git_repository::config::tree::{branch, Branch, Key};     use crate::config::tree::bcow;     #[test]    fn merge() {        assert!(branch::Merge::try_into_fullrefname(bcow("refs/heads/main")).is_ok());        assert!(branch::Merge::try_into_fullrefname(bcow("main")).is_err());         assert!(Branch::MERGE.full_name(None).is_err());        assert_eq!(            Branch::MERGE.full_name(Some("name".into())).expect("valid"),            "branch.name.merge"        );    }} mod ssh {     #[test]    #[cfg(feature = "blocking-network-client")]    fn variant() -> crate::Result {        use git_protocol::transport::client::ssh::ProgramKind;        use git_repository::config::tree::Ssh;         use crate::config::tree::bcow;        for (actual, expected) in [            ("auto", None),            ("ssh", Some(ProgramKind::Ssh)),            ("simple", Some(ProgramKind::Simple)),            ("plink", Some(ProgramKind::Plink)),            ("putty", Some(ProgramKind::Putty)),            ("tortoiseplink", Some(ProgramKind::TortoisePlink)),        ] {            assert_eq!(Ssh::VARIANT.try_into_variant(bcow(actual))?, expected);        }         assert_eq!(            Ssh::VARIANT.try_into_variant(bcow("SSH")).unwrap_err().to_string(),            "The key \"ssh.variant=SSH\" (possibly from GIT_SSH_VARIANT) was invalid",            "case-sensitive comparisons"        );        Ok(())    }} mod diff {    use git_diff::blob::Algorithm;    use git_repository::config::tree::{Diff, Key};     use crate::config::tree::bcow;     #[test]    fn algorithm() -> crate::Result {        for (actual, expected) in [            ("myers", Algorithm::Myers),            ("Myers", Algorithm::Myers),            ("default", Algorithm::Myers),            ("Default", Algorithm::Myers),            ("minimal", Algorithm::MyersMinimal),            ("histogram", Algorithm::Histogram),        ] {            assert_eq!(Diff::ALGORITHM.try_into_algorithm(bcow(actual))?, expected);            assert!(Diff::ALGORITHM.validate(actual.into()).is_ok());        }        assert_eq!(            Diff::ALGORITHM                .try_into_algorithm(bcow("patience"))                .unwrap_err()                .to_string(),            "The 'patience' algorithm is not yet implemented"        );        assert_eq!(            Diff::ALGORITHM.try_into_algorithm(bcow("foo")).unwrap_err().to_string(),            "Unknown diff algorithm named 'foo'"        );        Ok(())    }} mod core {    use std::time::Duration;     use git_lock::acquire::Fail;    use git_repository::{        config::tree::{Core, Key},        revision::spec::parse::ObjectKindHint,    };     use crate::config::tree::bcow;     fn signed(value: i64) -> Result<i64, git_config::value::Error> {        Ok(value)    }     #[test]    fn timeouts() -> crate::Result {        assert_eq!(            Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(0))?,            Fail::Immediately        );        assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("0".into()).is_ok());        assert_eq!(            Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(-5))?,            Fail::AfterDurationWithBackoff(Duration::from_secs(u64::MAX))        );        assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("-1".into()).is_ok());         assert_eq!(            Core::FILES_REF_LOCK_TIMEOUT.try_into_lock_timeout(Ok(2500))?,            Fail::AfterDurationWithBackoff(Duration::from_millis(2500))        );        assert!(Core::FILES_REF_LOCK_TIMEOUT.validate("2500".into()).is_ok());        assert_eq!(            Core::FILES_REF_LOCK_TIMEOUT                .try_into_lock_timeout(Err(git_config::value::Error::new("err", "bogus")))                .unwrap_err()                .to_string(),            "The timeout at key \"core.filesRefLockTimeout\" was invalid"        );        Ok(())    }     #[test]    fn disambiguate() -> crate::Result {        for (value, expected) in [            ("none", None),            ("commit", Some(ObjectKindHint::Commit)),            ("committish", Some(ObjectKindHint::Committish)),            ("tree", Some(ObjectKindHint::Tree)),            ("treeish", Some(ObjectKindHint::Treeish)),            ("blob", Some(ObjectKindHint::Blob)),        ] {            assert_eq!(                Core::DISAMBIGUATE.try_into_object_kind_hint(bcow(value)).unwrap(),                expected            );            assert!(Core::DISAMBIGUATE.validate(value.into()).is_ok());        }        assert_eq!(            Core::DISAMBIGUATE                .try_into_object_kind_hint(bcow("CommiT"))                .unwrap_err()                .to_string(),            "The key \"core.disambiguate=CommiT\" was invalid"        );        Ok(())    }     #[test]    fn log_all_ref_updates() -> crate::Result {        assert_eq!(            Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(Some(Ok(true)), || None)?,            Some(git_ref::store::WriteReflog::Normal)        );        assert!(Core::LOG_ALL_REF_UPDATES.validate("true".into()).is_ok());        assert_eq!(            Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(Some(Ok(false)), || None)?,            Some(git_ref::store::WriteReflog::Disable)        );        assert!(Core::LOG_ALL_REF_UPDATES.validate("0".into()).is_ok());        assert_eq!(            Core::LOG_ALL_REF_UPDATES.try_into_ref_updates(None, || Some(bcow("always")))?,            Some(git_ref::store::WriteReflog::Always)        );        assert!(Core::LOG_ALL_REF_UPDATES.validate("always".into()).is_ok());        assert_eq!(            Core::LOG_ALL_REF_UPDATES                .try_into_ref_updates(None, || Some(bcow("invalid")))                .unwrap_err()                .to_string(),            "The key \"core.logAllRefUpdates=invalid\" was invalid"        );        assert!(Core::LOG_ALL_REF_UPDATES.validate("invalid".into()).is_err());        Ok(())    }     #[test]    fn abbrev() -> crate::Result {        let object_hash = git_hash::Kind::Sha1;        assert_eq!(Core::ABBREV.try_into_abbreviation(bcow("4"), object_hash)?, Some(4));        assert_eq!(Core::ABBREV.try_into_abbreviation(bcow("auto"), object_hash)?, None);        assert_eq!(            Core::ABBREV.try_into_abbreviation(bcow("AUto"), object_hash)?,            None,            "case-insensitive"        );        assert_eq!(            Core::ABBREV.try_into_abbreviation(bcow("false"), object_hash)?,            Some(object_hash.len_in_hex()),            "turns abbreviations off entirely"        );         assert_eq!(            Core::ABBREV                .try_into_abbreviation(bcow("   "), object_hash)                .unwrap_err()                .to_string(),            "Invalid value for 'core.abbrev' = '   '. It must be between 4 and 40"        );        for invalid in ["foo", "3", "41"] {            assert!(Core::ABBREV.try_into_abbreviation(bcow(invalid), object_hash).is_err());        }        Ok(())    }     #[test]    fn delta_base_cache_limit() -> crate::Result {        assert_eq!(Core::DELTA_BASE_CACHE_LIMIT.try_into_usize(signed(1))?, 1);        assert_eq!(Core::DELTA_BASE_CACHE_LIMIT.try_into_usize(signed(0))?, 0);        assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("0".into()).is_ok());        assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("1".into()).is_ok());        assert_eq!(            Core::DELTA_BASE_CACHE_LIMIT                .try_into_usize(signed(-1))                .unwrap_err()                .to_string(),            "The value of key \"core.deltaBaseCacheLimit\" (possibly from GITOXIDE_PACK_CACHE_MEMORY) could not be parsed as unsigned integer"        );        assert!(Core::DELTA_BASE_CACHE_LIMIT.validate("-1".into()).is_err());        Ok(())    }     #[test]    fn check_stat() -> crate::Result {        assert!(Core::CHECK_STAT.try_into_checkstat(bcow("default"))?);        assert!(!Core::CHECK_STAT.try_into_checkstat(bcow("minimal"))?);        assert_eq!(            Core::CHECK_STAT                .try_into_checkstat(bcow("normal"))                .unwrap_err()                .to_string(),            "The key \"core.checkStat=normal\" was invalid"        );         assert!(Core::CHECK_STAT.validate("default".into()).is_ok());        assert!(Core::CHECK_STAT.validate("minimal".into()).is_ok());        assert!(Core::CHECK_STAT.validate("foo".into()).is_err());        Ok(())    }} mod extensions {    use git_repository::config::tree::{Extensions, Key};     use crate::config::tree::bcow;     #[test]    fn object_format() -> crate::Result {        assert_eq!(            Extensions::OBJECT_FORMAT.try_into_object_format(bcow("sha1"))?,            git_hash::Kind::Sha1        );        assert_eq!(            Extensions::OBJECT_FORMAT.try_into_object_format(bcow("SHA1"))?,            git_hash::Kind::Sha1,            "case-insensitive"        );        assert_eq!(            Extensions::OBJECT_FORMAT                .try_into_object_format(bcow("invalid"))                .unwrap_err()                .to_string(),            "The key \"extensions.objectFormat=invalid\" was invalid"        );        assert!(Extensions::OBJECT_FORMAT.validate("sha1".into()).is_ok());        assert!(Extensions::OBJECT_FORMAT.validate("invalid".into()).is_err());        Ok(())    }} mod checkout {    use git_repository::config::tree::{Checkout, Key};     fn int(value: i64) -> Result<i64, git_config::value::Error> {        Ok(value)    }     #[test]    fn workers() -> crate::Result {        assert!(Checkout::WORKERS.validate("0".into()).is_ok());        assert_eq!(Checkout::WORKERS.try_from_workers(int(0))?, 0);        assert!(Checkout::WORKERS.validate("-1".into()).is_ok());        assert_eq!(Checkout::WORKERS.try_from_workers(int(-1))?, 0);        assert!(Checkout::WORKERS.validate("-2".into()).is_ok());        assert!(Checkout::WORKERS.validate("3".into()).is_ok());        assert_eq!(Checkout::WORKERS.try_from_workers(int(2))?, 2);        Ok(())    }} mod pack {    use git_repository::config::tree::{Key, Pack};     #[test]    fn index_version() -> crate::Result {        assert_eq!(            Pack::INDEX_VERSION.try_into_index_version(Ok(1))?,            git_pack::index::Version::V1        );        assert!(Pack::INDEX_VERSION.validate("1".into()).is_ok());        assert_eq!(            Pack::INDEX_VERSION.try_into_index_version(Ok(2))?,            git_pack::index::Version::V2        );        assert!(Pack::INDEX_VERSION.validate("2".into()).is_ok());        assert_eq!(            Pack::INDEX_VERSION                .try_into_index_version(Ok(3))                .unwrap_err()                .to_string(),            "The value of key \"pack.indexVersion\" was invalid"        );        assert!(Pack::INDEX_VERSION.validate("3".into()).is_err());        assert!(Pack::INDEX_VERSION.validate("-1".into()).is_err());        Ok(())    }} #[cfg(any(feature = "blocking-network-client", feature = "async-network-client"))]mod protocol {    use git_repository::{        config::tree::{protocol, Key, Protocol},        remote::url::scheme_permission::Allow,    };     use crate::config::tree::bcow;     #[test]    fn allow() -> crate::Result {        for (key, protocol_name_parameter) in [            (&Protocol::ALLOW, None),            (&protocol::NameParameter::ALLOW, Some("http")),        ] {            for (input, expected) in [                ("always", Allow::Always),                ("never", Allow::Never),                ("user", Allow::User),            ] {                assert_eq!(key.try_into_allow(bcow(input), protocol_name_parameter)?, expected);                assert!(key.validate(input.into()).is_ok());            }            assert_eq!(                key.try_into_allow(bcow("User"), protocol_name_parameter)                    .unwrap_err()                    .to_string(),                format!(                    "The value \"User\" must be allow|deny|user in configuration key {}",                    protocol_name_parameter                        .map(|key| format!("protocol.{key}.allow"))                        .unwrap_or_else(|| "protocol.allow".into())                )            );        }        Ok(())    }} mod gitoxide {    mod http {        use git_repository::config::tree::{gitoxide, Key};        use std::time::Duration;         #[test]        fn connect_timeout() -> crate::Result {            assert_eq!(                gitoxide::Http::CONNECT_TIMEOUT.validated_assignment_fmt(&Duration::from_millis(1000).as_millis())?,                "gitoxide.http.connectTimeout=1000"            );            Ok(())        }    }    mod allow {        use git_repository::config::tree::{gitoxide, Key};         #[test]        fn protocol_from_user() {            assert!(                gitoxide::Allow::PROTOCOL_FROM_USER.validate("1".into()).is_ok(),                "this really is the only valid value"            );            assert!(gitoxide::Allow::PROTOCOL_FROM_USER.validate("true".into()).is_err());            assert!(gitoxide::Allow::PROTOCOL_FROM_USER.validate("0".into()).is_err());        }    }    mod commit {        use git_repository::config::tree::{gitoxide, Key};         #[test]        fn author_and_committer_date() {            assert_eq!(                gitoxide::Commit::AUTHOR_DATE                    .validated_assignment("Thu, 1 Aug 2022 12:45:06 +0800".into())                    .expect("valid"),                "gitoxide.commit.authorDate=Thu, 1 Aug 2022 12:45:06 +0800"            );            assert_eq!(                gitoxide::Commit::COMMITTER_DATE                    .validated_assignment("Thu, 1 Aug 2022 12:45:06 +0800".into())                    .expect("valid"),                "gitoxide.commit.committerDate=Thu, 1 Aug 2022 12:45:06 +0800"            );        }    }    mod author {        use git_repository::config::tree::{gitoxide, Key};         #[test]        fn name_and_email_fallback() {            assert_eq!(                gitoxide::Author::NAME_FALLBACK                    .validated_assignment("name".into())                    .expect("valid"),                "gitoxide.author.nameFallback=name"            );            assert_eq!(                gitoxide::Author::EMAIL_FALLBACK                    .validated_assignment("email".into())                    .expect("valid"),                "gitoxide.author.emailFallback=email"            );        }    }    mod committer {        use git_repository::config::tree::{gitoxide, Key}; 

Lines 1–500 of 740.