reverse slug and uuid order in filenames
Change-Id: I7346f6bd9965db3680143c0f5bdd0448d12e05eb
This commit is contained in:
parent
64763db3f6
commit
d1aaff7bc7
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
Change the order of the slug and UUID value in the note filename so
|
||||||
|
the slug comes before the UUIUD to make tab completion easier to
|
||||||
|
use.
|
||||||
|
|
||||||
|
Older files are still supported, and can be renamed to use
|
||||||
|
the new style.
|
@ -43,7 +43,7 @@ def _pick_note_file_name(notesdir, slug):
|
|||||||
"Pick a unique name in notesdir."
|
"Pick a unique name in notesdir."
|
||||||
for i in range(50):
|
for i in range(50):
|
||||||
newid = utils.get_random_string()
|
newid = utils.get_random_string()
|
||||||
notefilename = os.path.join(notesdir, '%s-%s.yaml' % (newid, slug))
|
notefilename = os.path.join(notesdir, '%s-%s.yaml' % (slug, newid))
|
||||||
if not os.path.exists(notefilename):
|
if not os.path.exists(notefilename):
|
||||||
return notefilename
|
return notefilename
|
||||||
else:
|
else:
|
||||||
|
@ -62,6 +62,17 @@ def _file_exists_at_commit(reporoot, filename, sha):
|
|||||||
return bool(get_file_at_commit(reporoot, filename, sha))
|
return bool(get_file_at_commit(reporoot, filename, sha))
|
||||||
|
|
||||||
|
|
||||||
|
def _get_unique_id(filename):
|
||||||
|
base = os.path.basename(filename)
|
||||||
|
root, ext = os.path.splitext(base)
|
||||||
|
uniqueid = root[-16:]
|
||||||
|
if '-' in uniqueid:
|
||||||
|
# This is an older file with the UUID at the beginning
|
||||||
|
# of the name.
|
||||||
|
uniqueid = root[:16]
|
||||||
|
return uniqueid
|
||||||
|
|
||||||
|
|
||||||
# TODO(dhellmann): Add branch arg?
|
# TODO(dhellmann): Add branch arg?
|
||||||
def get_notes_by_version(reporoot, notesdir, branch=None):
|
def get_notes_by_version(reporoot, notesdir, branch=None):
|
||||||
|
|
||||||
@ -81,9 +92,9 @@ def get_notes_by_version(reporoot, notesdir, branch=None):
|
|||||||
current_version = _get_current_version(reporoot, branch)
|
current_version = _get_current_version(reporoot, branch)
|
||||||
# print('current_version = %s' % current_version)
|
# print('current_version = %s' % current_version)
|
||||||
|
|
||||||
# Remember the most current filename for each prefix, to allow for
|
# Remember the most current filename for each id, to allow for
|
||||||
# renames.
|
# renames.
|
||||||
last_name_by_prefix = {}
|
last_name_by_id = {}
|
||||||
|
|
||||||
# FIXME(dhellmann): This might need to be more line-oriented for
|
# FIXME(dhellmann): This might need to be more line-oriented for
|
||||||
# longer histories.
|
# longer histories.
|
||||||
@ -119,23 +130,22 @@ def get_notes_by_version(reporoot, notesdir, branch=None):
|
|||||||
if current_version not in versions:
|
if current_version not in versions:
|
||||||
versions.append(current_version)
|
versions.append(current_version)
|
||||||
|
|
||||||
# Remember the files seen, using their prefix as a unique id.
|
# Remember the files seen, using their UUID suffix as a unique id.
|
||||||
for f in filenames:
|
for f in filenames:
|
||||||
# Updated as older tags are found, handling edits to release
|
# Updated as older tags are found, handling edits to release
|
||||||
# notes.
|
# notes.
|
||||||
prefix = os.path.basename(f)[:16]
|
uniqueid = _get_unique_id(f)
|
||||||
earliest_seen[prefix] = tags[0]
|
earliest_seen[uniqueid] = tags[0]
|
||||||
if prefix in last_name_by_prefix:
|
if uniqueid in last_name_by_id:
|
||||||
# We already have a filename for this prefix from a
|
# We already have a filename for this id from a
|
||||||
# new commit, so use that one in case the name has
|
# new commit, so use that one in case the name has
|
||||||
# changed.
|
# changed.
|
||||||
continue
|
continue
|
||||||
if _file_exists_at_commit(reporoot, f, sha):
|
if _file_exists_at_commit(reporoot, f, sha):
|
||||||
# Remember this filename as the most recent version of
|
# Remember this filename as the most recent version of
|
||||||
# the unique prefix we have seen, in case the name
|
# the unique id we have seen, in case the name
|
||||||
# changed from an older commit.
|
# changed from an older commit.
|
||||||
last_name_by_prefix[prefix] = (f, sha)
|
last_name_by_id[uniqueid] = (f, sha)
|
||||||
# print('remembering %s as last name for %s' % (f, prefix))
|
|
||||||
|
|
||||||
# Invert earliest_seen to make a list of notes files for each
|
# Invert earliest_seen to make a list of notes files for each
|
||||||
# version.
|
# version.
|
||||||
@ -144,8 +154,8 @@ def get_notes_by_version(reporoot, notesdir, branch=None):
|
|||||||
files_and_tags[v] = []
|
files_and_tags[v] = []
|
||||||
# Produce a list of the actual files present in the repository. If
|
# Produce a list of the actual files present in the repository. If
|
||||||
# a note is removed, this step should let us ignore it.
|
# a note is removed, this step should let us ignore it.
|
||||||
for prefix, version in earliest_seen.items():
|
for uniqueid, version in earliest_seen.items():
|
||||||
base, sha = last_name_by_prefix[prefix]
|
base, sha = last_name_by_id[uniqueid]
|
||||||
files_and_tags[version].append((base, sha))
|
files_and_tags[version].append((base, sha))
|
||||||
for version, filenames in files_and_tags.items():
|
for version, filenames in files_and_tags.items():
|
||||||
files_and_tags[version] = list(reversed(filenames))
|
files_and_tags[version] = list(reversed(filenames))
|
||||||
|
@ -128,9 +128,12 @@ class Base(base.TestCase):
|
|||||||
self._run_git('add', '.')
|
self._run_git('add', '.')
|
||||||
self._run_git('commit', '-m', message)
|
self._run_git('commit', '-m', message)
|
||||||
|
|
||||||
def _add_notes_file(self, slug='slug', commit=True):
|
def _add_notes_file(self, slug='slug', commit=True, legacy=False):
|
||||||
n = self.get_note_num()
|
n = self.get_note_num()
|
||||||
basename = '%016x-%s.yaml' % (n, slug)
|
if legacy:
|
||||||
|
basename = '%016x-%s.yaml' % (n, slug)
|
||||||
|
else:
|
||||||
|
basename = '%s-%016x.yaml' % (slug, n)
|
||||||
filename = os.path.join(self.reporoot, 'releasenotes', 'notes',
|
filename = os.path.join(self.reporoot, 'releasenotes', 'notes',
|
||||||
basename)
|
basename)
|
||||||
create._make_note_file(filename)
|
create._make_note_file(filename)
|
||||||
@ -362,6 +365,70 @@ class BasicTest(Base):
|
|||||||
results,
|
results,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_legacy_file(self):
|
||||||
|
self._make_python_package()
|
||||||
|
self._run_git('tag', '-s', '-m', 'first tag', '1.0.0')
|
||||||
|
f1 = self._add_notes_file('slug1', legacy=True)
|
||||||
|
self._run_git('tag', '-s', '-m', 'first tag', '2.0.0')
|
||||||
|
f2 = f1.replace('slug1', 'slug2')
|
||||||
|
self._run_git('mv', f1, f2)
|
||||||
|
self._git_commit('rename note file')
|
||||||
|
raw_results = scanner.get_notes_by_version(
|
||||||
|
self.reporoot,
|
||||||
|
'releasenotes/notes',
|
||||||
|
)
|
||||||
|
results = {
|
||||||
|
k: [f for (f, n) in v]
|
||||||
|
for (k, v) in raw_results.items()
|
||||||
|
}
|
||||||
|
self.assertEqual(
|
||||||
|
{'2.0.0': [f2],
|
||||||
|
'2.0.0-1': [],
|
||||||
|
},
|
||||||
|
results,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_rename_legacy_file_to_new(self):
|
||||||
|
self._make_python_package()
|
||||||
|
self._run_git('tag', '-s', '-m', 'first tag', '1.0.0')
|
||||||
|
f1 = self._add_notes_file('slug1', legacy=True)
|
||||||
|
self._run_git('tag', '-s', '-m', 'first tag', '2.0.0')
|
||||||
|
# Rename the file with the new convention of placing the UUID
|
||||||
|
# after the slug instead of before.
|
||||||
|
f2 = f1.replace('0000000000000001-slug1',
|
||||||
|
'slug1-0000000000000001')
|
||||||
|
self._run_git('mv', f1, f2)
|
||||||
|
self._git_commit('rename note file')
|
||||||
|
raw_results = scanner.get_notes_by_version(
|
||||||
|
self.reporoot,
|
||||||
|
'releasenotes/notes',
|
||||||
|
)
|
||||||
|
results = {
|
||||||
|
k: [f for (f, n) in v]
|
||||||
|
for (k, v) in raw_results.items()
|
||||||
|
}
|
||||||
|
self.assertEqual(
|
||||||
|
{'2.0.0': [f2],
|
||||||
|
'2.0.0-1': [],
|
||||||
|
},
|
||||||
|
results,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UniqueIdTest(Base):
|
||||||
|
|
||||||
|
def test_legacy(self):
|
||||||
|
uid = scanner._get_unique_id(
|
||||||
|
'releasenotes/notes/0000000000000001-slug1.yaml'
|
||||||
|
)
|
||||||
|
self.assertEqual('0000000000000001', uid)
|
||||||
|
|
||||||
|
def test_modern(self):
|
||||||
|
uid = scanner._get_unique_id(
|
||||||
|
'releasenotes/notes/slug1-0000000000000001.yaml'
|
||||||
|
)
|
||||||
|
self.assertEqual('0000000000000001', uid)
|
||||||
|
|
||||||
|
|
||||||
class BranchTest(Base):
|
class BranchTest(Base):
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user