diff --git a/xmanager/xm_local/packaging/bazel_tools.py b/xmanager/xm_local/packaging/bazel_tools.py index 694f001..c7f128f 100644 --- a/xmanager/xm_local/packaging/bazel_tools.py +++ b/xmanager/xm_local/packaging/bazel_tools.py @@ -147,7 +147,7 @@ def _build_multiple_targets( # Expansions (`...`, `*`) are not allowed. -_NAME_RE = '[^:/.*]+' +_NAME_RE = r'(?:[^.*:/]|\.(?!\.\.))+' _LABEL_LEXER = re.compile( f'^//(?P{_NAME_RE}(/{_NAME_RE})*)?(?P:{_NAME_RE})?$') _LexedLabel = Tuple[List[str], str] @@ -161,8 +161,10 @@ def _lex_label(label: str) -> _LexedLabel: groups = match.groupdict() packages: Optional[str] = groups['packages'] target: Optional[str] = groups['target'] - if packages is None and target is None: + if not packages and not target: raise ValueError(f'{label} cannot be empty') + if target == ':all': + raise ValueError('`:all` is not a valid target') init = packages.split('/') if packages else [] last = target[1:] if target else init[-1] return init, last diff --git a/xmanager/xm_local/packaging/bazel_tools_test.py b/xmanager/xm_local/packaging/bazel_tools_test.py index 8fdb127..cdf2ad4 100644 --- a/xmanager/xm_local/packaging/bazel_tools_test.py +++ b/xmanager/xm_local/packaging/bazel_tools_test.py @@ -55,6 +55,23 @@ def test_label_kind_lines_to_dict(self): }, ) + def test_absolute_label_with_extension_dot(self): + self.assertEqual( + bazel_tools._lex_label('//project/directory:image.tar'), + (['project', 'directory'], 'image.tar')) + + def test_label_with_three_dots(self): + with self.assertRaisesRegex(ValueError, 'is not an absolute Bazel label'): + bazel_tools._lex_label('//project/directory/...') + + def test_label_with_star_target(self): + with self.assertRaisesRegex(ValueError, 'is not an absolute Bazel label'): + bazel_tools._lex_label('//project/directory:*') + + def test_label_with_all_target(self): + with self.assertRaisesRegex(ValueError, '`:all` is not a valid target'): + bazel_tools._lex_label('//project/directory:all') + if __name__ == '__main__': unittest.main()