Skip to content

Commit

Permalink
validate and try automatically correct tag names
Browse files Browse the repository at this point in the history
  • Loading branch information
jizhilong committed Jul 15, 2017
1 parent de68bf5 commit f7d963a
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 1 deletion.
38 changes: 37 additions & 1 deletion dmake/template_args.py
@@ -1,3 +1,4 @@
import re
import datetime
import logging
import subprocess
Expand All @@ -6,6 +7,9 @@


LOG = logging.getLogger(__name__)
TAG_NAME_PATTERN = re.compile(r'^[a-zA-Z0-9_][]a-zA-Z0-9_\.\-]{0,127}$')
TAG_NAME_LEAD_PATTERN = re.compile(r'^[a-zA-Z0-9_]$')
TAG_NAME_ELEMENT_PATTERN = re.compile(r'^[a-zA-Z0-9_\.\-]$')
_tag_template_args = None
_label_template_args = None

Expand Down Expand Up @@ -87,7 +91,39 @@ class GitDescribeGenerator(ExternalCmdGenerator):


def _template_args(generators):
return dict((k, v) for g in generators for k, v in g.gen_args())
result = {}
for g in generators:
for k, v in g.gen_args():
if not validate_tag_name(v):
result[k] = correct_tag_name(v)
LOG.warn("%s is not a valid docker tag name,"
"will be automatically corrected to %s",
v, result[k])
else:
result[k] = v
return result


def validate_tag_name(name):
return TAG_NAME_PATTERN.match(name) is not None


def correct_tag_name(name):
if not name:
return "null"
tmp_lst = []
lead, suffix = name[0], name[1:]
if TAG_NAME_LEAD_PATTERN.match(lead) is None:
tmp_lst.append('_')
else:
tmp_lst.append(lead)

for c in suffix:
if TAG_NAME_ELEMENT_PATTERN.match(c) is None:
tmp_lst.append('_')
else:
tmp_lst.append(c)
return ''.join(tmp_lst)[:128]


def tag_template_args(extra_generators=None):
Expand Down
18 changes: 18 additions & 0 deletions tests/test_template_args.py
Expand Up @@ -29,6 +29,24 @@ def test_datetime_generator(self, mocked_datetime):
self.assertEqual(v, '201607211223')
mocked_datetime.now.assert_called_once()

def test_validate_tag_name(self):
self.assertTrue(template_args.validate_tag_name('v1.0.0'))
self.assertTrue(template_args.validate_tag_name('latest'))
self.assertFalse(template_args.validate_tag_name('feature/123'))
self.assertFalse(template_args.validate_tag_name('-master'))
self.assertFalse(template_args.validate_tag_name('.test'))

def test_correct_tag_name(self):
self.assertEqual(template_args.correct_tag_name('feature/123'),
'feature_123')
self.assertEqual(template_args.correct_tag_name('-master'),
'_master')
self.assertEqual(template_args.correct_tag_name('.test'),
'_test')
long_tag_name = ''.join(str(i) for i in xrange(128))
self.assertEqual(len(template_args.correct_tag_name(long_tag_name)),
128)


class ExternalCmdGeneratorTests(unittest2.TestCase):

Expand Down

0 comments on commit f7d963a

Please sign in to comment.