Skip to content
Snippets Groups Projects
Commit b7c163b8 authored by Antoine R. Dumont's avatar Antoine R. Dumont
Browse files

Update upstream source from tag 'debian/upstream/0.0.11'

Update to upstream version '0.0.11'
with Debian dir a108f7c4dbea9105ec578d819bf6d8c357e6501c
parents 291b3459 b682f27f
No related branches found
No related tags found
No related merge requests found
Metadata-Version: 1.0
Name: swh.model
Version: 0.0.10
Version: 0.0.11
Summary: Software Heritage data model
Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
Author: Software Heritage developers
......
Metadata-Version: 1.0
Name: swh.model
Version: 0.0.10
Version: 0.0.11
Summary: Software Heritage data model
Home-page: https://forge.softwareheritage.org/diffusion/DMOD/
Author: Software Heritage developers
......
......@@ -339,7 +339,7 @@ def walk_and_compute_sha1_from_directory(rootdir,
with_root_tree=True,
remove_empty_folder=False):
"""(Deprecated) TODO migrate the code to
walk_and_compute_sha1_from_directory_2.
compute_hashes_from_directory.
Compute git sha1 from directory rootdir.
......@@ -420,9 +420,9 @@ def walk_and_compute_sha1_from_directory(rootdir,
return ls_hashes
def walk_and_compute_sha1_from_directory_2(rootdir,
dir_ok_fn=default_validation_dir,
remove_empty_folder=False):
def compute_hashes_from_directory(rootdir,
dir_ok_fn=default_validation_dir,
remove_empty_folder=False):
"""Compute git sha1 from directory rootdir.
Args:
......@@ -530,240 +530,29 @@ def walk_and_compute_sha1_from_directory_2(rootdir,
return ls_hashes
def recompute_sha1_in_memory(root, deeper_rootdir, objects):
"""TODO: Use git.walk_and_compute_sha1_from_directory_2
Recompute git sha1 from directory deeper_rootdir to root.
This function relies exclusively on `objects` for hashes. It
expects the deeper_rootdir and every key below that path to be
already updated.
Args:
- root: Upper root directory (so same as
objects[ROOT_TREE_KEY][0]['path'])
- deeper_rootdir: Upper root directory from which the git hash
computation has alredy been updated.
- objects: objects dictionary as per returned by
`walk_and_compute_sha1_from_directory`
Returns:
Dictionary of entries with keys <path-name> and as values a list of
directory entries.
Those are list of dictionary with keys:
- 'perms'
- 'type'
- 'name'
- 'sha1_git'
- and specifically content: 'sha1', 'sha256', ...
Note:
One special key is ROOT_TREE_KEY to indicate the upper root of the
directory (this is the revision's target directory).
Raises:
Nothing
If something is raised, this is a programmatic error.
"""
# list of paths to update from bottom to top
upper_root = os.path.dirname(root)
rootdir = os.path.dirname(deeper_rootdir)
while rootdir != upper_root:
files = objects[rootdir]
ls_hashes = []
for hashfile in files:
fulldirname = hashfile['path']
if hashfile['type'] == GitType.TREE:
tree_hash = compute_tree_metadata(fulldirname, objects)
ls_hashes.append(tree_hash)
else:
ls_hashes.append(hashfile)
objects[rootdir] = ls_hashes
parent = os.path.dirname(rootdir)
rootdir = parent
# update root
root_tree_hash = compute_directory_git_sha1(root, objects)
objects[ROOT_TREE_KEY][0]['sha1_git'] = root_tree_hash
return objects
def commonpath(paths):
"""Given a sequence of path names, returns the longest common sub-path.
Copied from Python3.5
"""
if not paths:
raise ValueError('commonpath() arg is an empty sequence')
if isinstance(paths[0], bytes):
sep = b'/'
curdir = b'.'
else:
sep = '/'
curdir = '.'
try:
split_paths = [path.split(sep) for path in paths]
try:
isabs, = set(p[:1] == sep for p in paths)
except ValueError:
raise ValueError("Can't mix absolute and relative paths")
split_paths = [
[c for c in s if c and c != curdir] for s in split_paths]
s1 = min(split_paths)
s2 = max(split_paths)
common = s1
for i, c in enumerate(s1):
if c != s2[i]:
common = s1[:i]
break
prefix = sep if isabs else sep[:0]
return prefix + sep.join(common)
except (TypeError, AttributeError):
raise
def __remove_paths_from_objects(objects, rootpaths,
dir_ok_fn=default_validation_dir):
"""Given top paths to remove, remove all paths and descendants from
objects.
def children_hashes(children, objects):
"""Given a collection of children path, yield the corresponding
hashes.
Args:
objects: The dictionary of paths to clean up.
rootpaths: The rootpaths to remove from objects.
- dir_ok_fn: Validation function on folder/file names.
Default to accept all.
Returns:
Objects dictionary without the rootpaths and their descendants.
"""
dirpaths_to_clean = set()
for path in rootpaths:
path_list = objects.pop(path, None)
if path_list: # need to remove the children directories too
for child in path_list:
if child['type'] == GitType.TREE:
dirpaths_to_clean.add(child['path'])
parent = os.path.dirname(path)
# Is the parent still ok? (e.g. not an empty dir for example)
parent_check = dir_ok_fn(parent)
if not parent_check and parent not in dirpaths_to_clean:
dirpaths_to_clean.add(parent)
else:
# we need to pop the reference to path in the parent list
if objects.get(parent):
objects[parent] = filter(
lambda p: p != path,
objects.get(parent, []))
if dirpaths_to_clean:
objects = __remove_paths_from_objects(objects,
dirpaths_to_clean,
dir_ok_fn)
return objects
def update_checksums_from(changed_paths, objects,
dir_ok_fn=default_validation_dir,
remove_empty_folder=False):
"""Given a list of changed paths, recompute the checksums only where
needed.
objects: objects hash as returned by git.compute_hashes_from_directory.
children: collection of bytes path
Args:
changed_paths: Dictionary list representing path changes.
A dictionary has the form:
- path: the full path to the file Added, Modified or Deleted
- action: A, M or D
objects: dictionary returned by `walk_and_compute_sha1_from_directory`.
- dir_ok_fn: Validation function on folder/file names.
Default to accept all.
Returns:
Dictionary returned by `walk_and_compute_sha1_from_directory`
updated (mutated) according to latest filesystem modifications.
Yields:
Dictionary hashes
"""
root = objects[ROOT_TREE_KEY][0]['path']
if root.endswith(b'/'):
root = root.rstrip(b'/')
paths = set() # contain the list of impacted paths (A, D, M)
paths_to_remove = set() # will contain the list of deletion paths (only D)
# a first round-trip to ensure we don't need to...
for changed_path in changed_paths:
path = changed_path['path']
parent = os.path.dirname(path)
if parent == root: # ... recompute everything anyway
return walk_and_compute_sha1_from_directory(
root,
dir_ok_fn=dir_ok_fn,
remove_empty_folder=remove_empty_folder)
if changed_path['action'] == 'D': # (D)elete
paths_to_remove.add(path)
paths.add(parent)
# no modification on paths (paths also contain deletion paths if any)
if not paths:
return objects
rootdir = commonpath(list(paths))
if paths_to_remove:
# Now we can remove the deleted directories from objects dictionary
objects = __remove_paths_from_objects(objects,
paths_to_remove,
dir_ok_fn)
# Recompute from disk the checksums from impacted common ancestor
# rootdir changes.
while not objects.get(rootdir, None):
# it could happened that the path is not found.
# In the case of an ignored folder for example.
# So we'll find the next existing parent
rootdir = os.path.dirname(rootdir)
if rootdir == root: # fallback, if we hit root, walk
# everything anyway
return walk_and_compute_sha1_from_directory(
root,
dir_ok_fn=dir_ok_fn,
remove_empty_folder=remove_empty_folder)
hashes = walk_and_compute_sha1_from_directory(
rootdir,
dir_ok_fn=dir_ok_fn,
with_root_tree=False,
remove_empty_folder=remove_empty_folder)
# Then update the original objects with new
# checksums for the arborescence tree below rootdir
objects.update(hashes)
# Recompute hashes in memory from rootdir to root
return recompute_sha1_in_memory(root, rootdir, objects)
for p in children:
c = objects.get(p)
if c:
h = c.get('checksums')
if h:
yield h
def objects_per_type(filter_type, objects_per_path):
"""Given an object dictionary returned by
`swh.model.git.walk_and_compute_sha1_from_directory_2`, yields
`swh.model.git.compute_hashes_from_directory`, yields
corresponding element type's hashes
Args:
......@@ -774,21 +563,13 @@ def objects_per_type(filter_type, objects_per_path):
Elements of type filter_type's hashes
"""
def __children_hash(objects, children):
for p in children:
c = objects.get(p, None)
if c:
h = c.get('checksums', None)
if h:
yield h
for path, obj in objects_per_path.items():
o = obj['checksums']
if o['type'] == filter_type:
if 'children' in obj: # for trees
if obj['children']:
o['children'] = __children_hash(objects_per_path,
obj['children'])
o['children'] = children_hashes(obj['children'],
objects_per_path)
else:
o['children'] = []
yield o
......@@ -243,486 +243,3 @@ class GitHashFromScratch(GitHashWalkArborescenceTree):
# should give us the same checksums as the second round
self.assertEquals(actual_hashes, expected_hashes)
class GitHashUpdate(GitHashWalkArborescenceTree):
"""Test `walk and git hash only on modified fs` functions.
"""
@istest
def update_checksums_from_add_new_file(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way (add a new file)
# update the actual git checksums from the deeper tree modified
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# update the existing file
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo/new')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# walk1 (this will be our expectation)
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_from_add_new_file_with_validation(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way (add a new file)
# update the actual git checksums from the deeper tree modified
# + Add some validation on some file to ignore
def dir_ok_fn(dirpath):
return b'empty-folder' not in dirpath
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path, dir_ok_fn=dir_ok_fn)
# update the existing file
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo/new')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# walk1 (this will be our expectation)
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path, dir_ok_fn=dir_ok_fn)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_from_add_new_file_remove_empty_folder(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way (add a new file)
# update the actual git checksums from the deeper tree modified
# + Add some validation on some file to ignore
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path, remove_empty_folder=True)
# update the existing file
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo/new')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# walk1 (this will be our expectation)
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path, remove_empty_folder=True)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_new_file_with_validation_and_ignore_empty_dir(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way (add a new file)
# update the actual git checksums from the deeper tree modified
# + Add some validation on some file to ignore
# + ignore empty folder
def dir_ok_fn(dirpath):
return b'some-binary' not in dirpath
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path, dir_ok_fn=dir_ok_fn, remove_empty_folder=True)
# update the existing file
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo/new')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# walk1 (this will be our expectation)
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path, dir_ok_fn=dir_ok_fn, remove_empty_folder=True)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_from_modify_existing_file(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way ()
# update the actual git checksums where only the modification is needed
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# update existing file
changed_path = os.path.join(
self.tmp_root_path,
b'sample-folder/bar/barfoo/another-quote.org')
with open(changed_path, 'wb+') as f:
f.write(b'I have a dream')
# walk1 (this will be our expectation)
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'M'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_no_change(self):
# when
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# nothing changes on disk
# then
actual_dict = git.update_checksums_from([], expected_dict)
self.assertEquals(actual_dict, expected_dict)
@istest
def update_checksums_delete_existing_file(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way (delete a file)
# update the actual git checksums from the deeper tree modified
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# Remove folder
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo')
shutil.rmtree(changed_path)
# Actually walking the fs will be the resulting expectation
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'D'}],
objects)
self.assertEquals(actual_dict, expected_dict)
@istest
def update_checksums_from_multiple_fs_modifications(self):
# make a temporary arborescence tree to hash without ignoring anything
# update the disk in some way (modify a file, add a new, delete one)
# update the actual git checksums from the deeper tree modified
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# Actions on disk (imagine a checkout of some form)
# 1. Create a new file
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo/new')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# 2. update the existing file
changed_path1 = os.path.join(
self.tmp_root_path,
b'sample-folder/bar/barfoo/another-quote.org')
with open(changed_path1, 'wb') as f:
f.write(b'new line')
# 3. Remove some folder
changed_path2 = os.path.join(self.tmp_root_path,
b'sample-folder/foo')
shutil.rmtree(changed_path2)
# Actually walking the fs will be the resulting expectation
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'},
{'path': changed_path1, 'action': 'M'},
{'path': changed_path2, 'action': 'D'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_from_common_ancestor(self):
# when
# Add some new arborescence below a folder destined to be removed
# want to check that old keys does not remain
future_folder_to_remove = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo')
# add .../barfoo/hello/world under (.../barfoo which will be destroyed)
new_folder = os.path.join(future_folder_to_remove, b'hello')
os.makedirs(new_folder, exist_ok=True)
with open(os.path.join(future_folder_to_remove, b'world'), 'wb') as f:
f.write(b"i'm sad 'cause i'm destined to be removed...")
# now we scan the disk
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
assert objects[future_folder_to_remove]
# Actions on disk (to simulate a checkout of some sort)
# 1. Create a new file
changed_path = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo/new')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# 2. update the existing file
changed_path1 = os.path.join(
self.tmp_root_path,
b'sample-folder/bar/barfoo/another-quote.org')
with open(changed_path1, 'wb') as f:
f.write(b'new line')
# 3. Remove folder
shutil.rmtree(future_folder_to_remove)
# Actually walking the fs will be the resulting expectation
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'},
{'path': changed_path1, 'action': 'M'},
{'path': future_folder_to_remove, 'action': 'D'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def update_checksums_detects_recomputation_from_all_is_needed(self):
# when
objects = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# Actions on disk (imagine a checkout of some form)
# 1. Create a new file
changed_path = os.path.join(self.tmp_root_path,
b'new-file-at-root')
with open(changed_path, 'wb') as f:
f.write(b'new line')
# 2. update the existing file
changed_path1 = os.path.join(
self.tmp_root_path,
b'sample-folder/bar/barfoo/another-quote.org')
with open(changed_path1, 'wb') as f:
f.write(b'new line')
# 3. Remove some folder
changed_path2 = os.path.join(self.tmp_root_path,
b'sample-folder/foo')
# 3. Remove some folder
changed_path2 = os.path.join(self.tmp_root_path,
b'sample-folder/bar/barfoo')
shutil.rmtree(changed_path2)
# Actually walking the fs will be the resulting expectation
expected_dict = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path)
# then
actual_dict = git.update_checksums_from(
[{'path': changed_path, 'action': 'A'},
{'path': changed_path1, 'action': 'M'},
{'path': changed_path2, 'action': 'D'}],
objects)
self.assertEquals(expected_dict, actual_dict)
@istest
def commonpath(self):
paths = ['r/0/h',
'r/1/d', 'r/1/i/a', 'r/1/i/b', 'r/1/i/c',
'r/2/e', 'r/2/f', 'r/2/g']
self.assertEquals(git.commonpath(paths), 'r')
paths = ['r/1/d', 'r/1/i/a', 'r/1/i/b', 'r/1/i/c']
self.assertEquals(git.commonpath(paths), 'r/1')
paths = ['/a/r/2/g', '/a/r/1/i/c', '/a/r/0/h']
self.assertEquals(git.commonpath(paths), '/a/r')
paths = [b'/a/r/2/g', b'/b/r/1/i/c', b'/c/r/0/h']
self.assertEquals(git.commonpath(paths), b'/')
paths = ['a/z', 'a/z', 'a/z']
self.assertEquals(git.commonpath(paths), 'a/z')
paths = ['0']
self.assertEquals(git.commonpath(paths), '0')
def untar(archive, dest):
# cleanup
shutil.rmtree(dest)
os.mkdir(dest)
# untar
cmd = [b'tar', b'xf', archive, b'-C', dest]
subprocess.check_output(cmd)
def ignore_svn_folder(dirpath):
return b'.svn' not in dirpath
@attr('fs')
class GitHashUpdateRealUseCase(unittest.TestCase):
"""Test `walk and git hash only on modified fs` functions.
"""
def setUp(self):
self.tmp_root_path = tempfile.mkdtemp().encode('utf-8')
archives_folder = os.path.join(
os.path.dirname(__file__).encode('utf-8'),
b'../../../..',
b'swh-storage-testdata',
b'svn-folders')
self.pkg_doc_linux_r10 = os.path.join(archives_folder,
b'pkg-doc-linux-r10.tgz')
self.pkg_doc_linux_r11 = os.path.join(archives_folder,
b'pkg-doc-linux-r11.tgz')
self.pkg_doc_linux_r12 = os.path.join(archives_folder,
b'pkg-doc-linux-r12.tgz')
def tearDown(self):
if os.path.exists(self.tmp_root_path):
shutil.rmtree(self.tmp_root_path)
@istest
def use_case_1_r10_r11(self):
# given
# untar the svn revision 10
untar(self.pkg_doc_linux_r10, self.tmp_root_path)
objects_r10 = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path,
ignore_svn_folder)
# untar the svn revision 11
untar(self.pkg_doc_linux_r11, self.tmp_root_path)
objects_r11 = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path,
ignore_svn_folder)
assert objects_r10 != objects_r11
changes = [
{'action': 'D', 'path': os.path.join(self.tmp_root_path, b'copyrights/non-free/Kiosk')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'copyrights/undistributable/Kiosk')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'copyrights/undistributable')}, # noqa
{'action': 'D', 'path': os.path.join(self.tmp_root_path, b'copyrights/non-free/UPS')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'copyrights/undistributable/UPS')} # noqa
]
# when
# update from objects from previous revision (r10) with
# actual changes from r10 to r11
actual_objects = git.update_checksums_from(changes,
objects_r10,
ignore_svn_folder)
# then
self.assertEquals(actual_objects, objects_r11)
@istest
def use_case_2_r11_r12(self):
# given
# untar the svn revision 11
untar(self.pkg_doc_linux_r11, self.tmp_root_path)
objects_r11 = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path,
ignore_svn_folder)
# untar the svn revision 12
untar(self.pkg_doc_linux_r12, self.tmp_root_path)
objects_r12 = git.walk_and_compute_sha1_from_directory(
self.tmp_root_path,
ignore_svn_folder)
assert objects_r11 != objects_r12
changes = [
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk')}, # noqa
{'action': 'D', 'path': os.path.join(self.tmp_root_path, b'copyrights')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/copyright.head')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/split-package')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-base.faq')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/make-copyright')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.menu')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/redirect.patch')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.overrides')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.prerm')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/README.updating')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.preinst')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.dirs')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/changelog')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-text.README.Debian')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/html2docs')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/rules')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.postrm')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/make-omf')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-text.preinst')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.postinst')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/copyrights')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/control')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-text.dirs')}, # noqa
{'action': 'A', 'path': os.path.join(self.tmp_root_path, b'trunk/doc-linux/debian/doc-linux-html.README.Debian')} # noqa
]
# when
# update from objects from previous revision (r11) with
# actual changes from r11 to r12
actual_objects = git.update_checksums_from(changes,
objects_r11,
ignore_svn_folder)
# then
self.assertEquals(actual_objects, objects_r12)
v0.0.10-0-g87fcced
\ No newline at end of file
v0.0.11-0-g1a2b969
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment