Radish alpha
r
rad:zwTxygwuz5LDGBq255RA2CbNGrz8
Radicle CI broker
Radicle
Git
fix: match tag name pattern on entire tag name
Lars Wirzenius committed 9 months ago
commit d8aaa03624c8b3d310cad1bb8194872318adf803
parent 6909e46
2 files changed +73 -2
modified src/filter.rs
@@ -160,7 +160,14 @@ impl EventFilter {
                Ok(re) => {
                    let actual = event.tag();
                    let allowed = match &actual {
-
                        Some(actual) => re.is_match_at(actual.as_str(), 0),
+
                        Some(actual) => {
+
                            let actual = actual.as_str();
+
                            if let Some(m) = re.find(actual) {
+
                                m.start() == 0 && m.end() == actual.len()
+
                            } else {
+
                                false
+
                            }
+
                        }
                        _ => false,
                    };
                    Decision::string(
@@ -390,7 +397,7 @@ mod test {
    use qcheck_macros::quickcheck;
    use radicle::prelude::{Did, RepoId};

-
    use crate::refs::branch_from_str;
+
    use crate::refs::{branch_from_str, TagName};

    use super::*;

@@ -438,6 +445,15 @@ mod test {
        CiEvent::V1(CiEventV1::Shutdown)
    }

+
    fn tag_created(name: &str, did: Did, repo: RepoId, tip: Oid) -> CiEvent {
+
        CiEvent::V1(CiEventV1::TagCreated {
+
            from_node: did.into(),
+
            repo,
+
            tag: TagName::try_from(name).unwrap(),
+
            tip,
+
        })
+
    }
+

    fn all_events(
        did: Did,
        repo: RepoId,
@@ -478,6 +494,12 @@ mod test {
                patch,
                new_tip: tip,
            }),
+
            CiEvent::V1(CiEventV1::TagCreated {
+
                from_node: did.into(),
+
                repo,
+
                tag: TagName::try_from("test-tag").unwrap(),
+
                tip,
+
            }),
        ]
    }

@@ -982,6 +1004,46 @@ mod test {
        let de = serde_yml::from_str(&ser)?;
        Ok(filter == de)
    }
+

+
    #[test]
+
    fn allows_wanted_tag() {
+
        let filter = EventFilter::Tag("test-tag".to_string());
+
        eprintln!("filter: {filter:#?}");
+

+
        let e = tag_created("test-tag", did(), rid(), oid());
+
        eprintln!("{:#?} → {}", e, filter.allows(&e));
+
        assert!(filter.allows(&e));
+
    }
+

+
    #[test]
+
    fn doesnt_allow_unexpected_tag() {
+
        let filter = EventFilter::Tag("test-tag".to_string());
+
        eprintln!("filter: {filter:#?}");
+

+
        let e = tag_created("xyzzy", did(), rid(), oid());
+
        eprintln!("{:#?} → {}", e, filter.allows(&e));
+
        assert!(!filter.allows(&e));
+
    }
+

+
    #[test]
+
    fn doesnt_allow_unexpected_tag_even_if_wanted_is_prefix() {
+
        let filter = EventFilter::Tag("test-tag".to_string());
+
        eprintln!("filter: {filter:#?}");
+

+
        let e = tag_created("test-tag-with-junk", did(), rid(), oid());
+
        eprintln!("{:#?} → {}", e, filter.allows(&e));
+
        assert!(!filter.allows(&e));
+
    }
+

+
    #[test]
+
    fn doesnt_allow_unexpected_tag_even_if_wanted_is_suffix() {
+
        let filter = EventFilter::Tag("test-tag".to_string());
+
        eprintln!("filter: {filter:#?}");
+

+
        let e = tag_created("junk-test-tag", did(), rid(), oid());
+
        eprintln!("{:#?} → {}", e, filter.allows(&e));
+
        assert!(!filter.allows(&e));
+
    }
}

#[derive(Debug, thiserror::Error)]
modified src/refs.rs
@@ -26,6 +26,15 @@ impl TagName {
    }
}

+
impl TryFrom<&str> for TagName {
+
    type Error = RefError;
+
    fn try_from(from: &str) -> Result<Self, RefError> {
+
        Ok(Self(RefString::try_from(from).map_err(|err| {
+
            RefError::RefStrCreate(from.to_string(), err)
+
        })?))
+
    }
+
}
+

impl From<RefString> for TagName {
    fn from(from: RefString) -> Self {
        Self(from)