@@ -20,7 +20,7 @@ impl FromStr for Label {
2020 type Err = anyhow:: Error ;
2121
2222 fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
23- let re = Regex :: new ( r"^(@[\w\d\-_\.]*)?/{0,2}([\w\d\-_\./+]+)?(:([\+\w\d\-_\./]+))?$" ) ?;
23+ let re = Regex :: new ( r"^(@@? [\w\d\-_\.]*)?/{0,2}([\w\d\-_\./+]+)?(:([\+\w\d\-_\./]+))?$" ) ?;
2424 let cap = re
2525 . captures ( s)
2626 . with_context ( || format ! ( "Failed to parse label from string: {}" , s) ) ?;
@@ -192,6 +192,15 @@ mod test {
192192 use std:: fs:: { create_dir_all, File } ;
193193 use tempfile:: tempdir;
194194
195+ #[ test]
196+ fn full_label_bzlmod ( ) {
197+ let label = Label :: from_str ( "@@repo//package/sub_package:target" ) . unwrap ( ) ;
198+ assert_eq ! ( label. to_string( ) , "@repo//package/sub_package:target" ) ;
199+ assert_eq ! ( label. repository. unwrap( ) , "repo" ) ;
200+ assert_eq ! ( label. package. unwrap( ) , "package/sub_package" ) ;
201+ assert_eq ! ( label. target, "target" ) ;
202+ }
203+
195204 #[ test]
196205 fn full_label ( ) {
197206 let label = Label :: from_str ( "@repo//package/sub_package:target" ) . unwrap ( ) ;
@@ -276,8 +285,8 @@ mod test {
276285 }
277286
278287 #[ test]
279- fn invalid_double_at ( ) {
280- assert ! ( Label :: from_str( "@@repo//pkg:target" ) . is_err( ) ) ;
288+ fn invalid_triple_at ( ) {
289+ assert ! ( Label :: from_str( "@@@ repo//pkg:target" ) . is_err( ) ) ;
281290 }
282291
283292 #[ test]
0 commit comments