diff --git a/crate_universe/src/utils/starlark/label.rs b/crate_universe/src/utils/starlark/label.rs index 7c754c472d..be692e2dcb 100644 --- a/crate_universe/src/utils/starlark/label.rs +++ b/crate_universe/src/utils/starlark/label.rs @@ -20,7 +20,7 @@ impl FromStr for Label { type Err = anyhow::Error; fn from_str(s: &str) -> Result { - let re = Regex::new(r"^(@[\w\d\-_\.]*)?/{0,2}([\w\d\-_\./+]+)?(:([\+\w\d\-_\./]+))?$")?; + let re = Regex::new(r"^(@@?[\w\d\-_\.]*)?/{0,2}([\w\d\-_\./+]+)?(:([\+\w\d\-_\./]+))?$")?; let cap = re .captures(s) .with_context(|| format!("Failed to parse label from string: {}", s))?; @@ -192,6 +192,15 @@ mod test { use std::fs::{create_dir_all, File}; use tempfile::tempdir; + #[test] + fn full_label_bzlmod() { + let label = Label::from_str("@@repo//package/sub_package:target").unwrap(); + assert_eq!(label.to_string(), "@repo//package/sub_package:target"); + assert_eq!(label.repository.unwrap(), "repo"); + assert_eq!(label.package.unwrap(), "package/sub_package"); + assert_eq!(label.target, "target"); + } + #[test] fn full_label() { let label = Label::from_str("@repo//package/sub_package:target").unwrap(); @@ -276,8 +285,8 @@ mod test { } #[test] - fn invalid_double_at() { - assert!(Label::from_str("@@repo//pkg:target").is_err()); + fn invalid_triple_at() { + assert!(Label::from_str("@@@repo//pkg:target").is_err()); } #[test]