Merge lp:~jelmer/brz/nested-tree-filetimes into lp:brz/3.2

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: 7572
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/nested-tree-filetimes
Merge into: lp:brz/3.2
Diff against target: 290 lines (+67/-31)
10 files modified
breezy/archive/tar.py (+1/-2)
breezy/bzr/workingtree_4.py (+3/-0)
breezy/git/annotate.py (+1/-1)
breezy/git/filegraph.py (+25/-8)
breezy/git/repository.py (+2/-4)
breezy/git/tree.py (+9/-10)
breezy/git/workingtree.py (+3/-4)
breezy/tests/per_workingtree/test_get_file_mtime.py (+21/-0)
byov.conf (+1/-1)
setup.py (+1/-1)
To merge this branch: bzr merge lp:~jelmer/brz/nested-tree-filetimes
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+413630@code.launchpad.net

Commit message

Support nested trees in Tree.get_file_mtime.

Description of the change

Support nested trees in Tree.get_file_mtime.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) :
review: Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote :
lp:~jelmer/brz/nested-tree-filetimes updated
7573. By Jelmer Vernooij

install dulwich from pip.

7574. By Jelmer Vernooij

Bump dulwich.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'breezy/archive/tar.py'
--- breezy/archive/tar.py 2020-02-18 01:57:45 +0000
+++ breezy/archive/tar.py 2022-01-04 23:27:18 +0000
@@ -41,7 +41,6 @@
4141
42 Returns a (tarinfo, fileobj) tuple42 Returns a (tarinfo, fileobj) tuple
43 """43 """
44 file_id = getattr(entry, 'file_id', None)
45 filename = osutils.pathjoin(root, final_path)44 filename = osutils.pathjoin(root, final_path)
46 item = tarfile.TarInfo(filename)45 item = tarfile.TarInfo(filename)
47 if force_mtime is not None:46 if force_mtime is not None:
@@ -75,7 +74,7 @@
75 fileobj = None74 fileobj = None
76 else:75 else:
77 raise errors.BzrError("don't know how to export {%s} of kind %r"76 raise errors.BzrError("don't know how to export {%s} of kind %r"
78 % (file_id, entry.kind))77 % (final_path, entry.kind))
79 return (item, fileobj)78 return (item, fileobj)
8079
8180
8281
=== modified file 'breezy/bzr/workingtree_4.py'
--- breezy/bzr/workingtree_4.py 2020-11-18 02:15:43 +0000
+++ breezy/bzr/workingtree_4.py 2022-01-04 23:27:18 +0000
@@ -1928,6 +1928,9 @@
1928 # Make sure the file exists1928 # Make sure the file exists
1929 entry = self._get_entry(path=path)1929 entry = self._get_entry(path=path)
1930 if entry == (None, None): # do we raise?1930 if entry == (None, None): # do we raise?
1931 nested_tree, subpath = self.get_containing_nested_tree(path)
1932 if nested_tree is not None:
1933 return nested_tree.get_file_mtime(subpath)
1931 raise errors.NoSuchFile(path)1934 raise errors.NoSuchFile(path)
1932 parent_index = self._get_parent_index()1935 parent_index = self._get_parent_index()
1933 last_changed_revision = entry[1][parent_index][4]1936 last_changed_revision = entry[1][parent_index][4]
19341937
=== modified file 'breezy/git/annotate.py'
--- breezy/git/annotate.py 2020-07-18 23:14:00 +0000
+++ breezy/git/annotate.py 2022-01-04 23:27:18 +0000
@@ -122,7 +122,7 @@
122 path = encode_git_path(path)122 path = encode_git_path(path)
123 for commit_parent in self.store[commit_id].parents:123 for commit_parent in self.store[commit_id].parents:
124 try:124 try:
125 (path, text_parent) = (125 (store, path, text_parent) = (
126 self.change_scanner.find_last_change_revision(126 self.change_scanner.find_last_change_revision(
127 path, commit_parent))127 path, commit_parent))
128 except KeyError:128 except KeyError:
129129
=== modified file 'breezy/git/filegraph.py'
--- breezy/git/filegraph.py 2020-07-18 23:14:00 +0000
+++ breezy/git/filegraph.py 2022-01-04 23:27:18 +0000
@@ -17,11 +17,17 @@
1717
18"""File graph access."""18"""File graph access."""
1919
20import posixpath
20import stat21import stat
2122
22from dulwich.errors import (23from dulwich.errors import (
23 NotTreeError,24 NotTreeError,
24 )25 )
26try:
27 from dulwich.objects import SubmoduleEncountered
28except ImportError:
29 class SubmoduleEncountered(Exception):
30 pass
25from dulwich.object_store import (31from dulwich.object_store import (
26 tree_lookup_path,32 tree_lookup_path,
27 )33 )
@@ -44,9 +50,20 @@
44 def find_last_change_revision(self, path, commit_id):50 def find_last_change_revision(self, path, commit_id):
45 if not isinstance(path, bytes):51 if not isinstance(path, bytes):
46 raise TypeError(path)52 raise TypeError(path)
47 commit = self.store[commit_id]53 store = self.store
48 target_mode, target_sha = tree_lookup_path(self.store.__getitem__,54 while True:
49 commit.tree, path)55 commit = store[commit_id]
56 try:
57 target_mode, target_sha = tree_lookup_path(
58 store.__getitem__, commit.tree, path)
59 except SubmoduleEncountered as e:
60 revid = self.repository.lookup_foreign_revision_id(commit_id)
61 revtree = self.repository.revision_tree(revid)
62 store = revtree._get_submodule_store(e.path)
63 commit_id = e.sha
64 path = posixpath.relpath(path, e.path)
65 else:
66 break
50 if path == b'':67 if path == b'':
51 target_mode = stat.S_IFDIR68 target_mode = stat.S_IFDIR
52 if target_mode is None:69 if target_mode is None:
@@ -54,9 +71,9 @@
54 (target_sha, path, commit_id))71 (target_sha, path, commit_id))
55 while True:72 while True:
56 parent_commits = []73 parent_commits = []
57 for parent_commit in [self.store[c] for c in commit.parents]:74 for parent_commit in [store[c] for c in commit.parents]:
58 try:75 try:
59 mode, sha = tree_lookup_path(self.store.__getitem__,76 mode, sha = tree_lookup_path(store.__getitem__,
60 parent_commit.tree, path)77 parent_commit.tree, path)
61 except (NotTreeError, KeyError):78 except (NotTreeError, KeyError):
62 continue79 continue
@@ -68,11 +85,11 @@
68 # or is a directory that didn't previously exist.85 # or is a directory that didn't previously exist.
69 if mode != target_mode or (86 if mode != target_mode or (
70 not stat.S_ISDIR(target_mode) and sha != target_sha):87 not stat.S_ISDIR(target_mode) and sha != target_sha):
71 return (path, commit.id)88 return (store, path, commit.id)
72 if parent_commits == []:89 if parent_commits == []:
73 break90 break
74 commit = parent_commits[0]91 commit = parent_commits[0]
75 return (path, commit.id)92 return (store, path, commit.id)
7693
7794
78class GitFileParentProvider(object):95class GitFileParentProvider(object):
@@ -92,7 +109,7 @@
92 text_parents = []109 text_parents = []
93 for commit_parent in self.store[commit_id].parents:110 for commit_parent in self.store[commit_id].parents:
94 try:111 try:
95 (path, text_parent) = (112 (store, path, text_parent) = (
96 self.change_scanner.find_last_change_revision(113 self.change_scanner.find_last_change_revision(
97 path, commit_parent))114 path, commit_parent))
98 except KeyError:115 except KeyError:
99116
=== modified file 'breezy/git/repository.py'
--- breezy/git/repository.py 2021-04-03 12:58:34 +0000
+++ breezy/git/repository.py 2022-01-04 23:27:18 +0000
@@ -308,12 +308,10 @@
308 except ValueError:308 except ValueError:
309 raise errors.RevisionNotPresent((fileid, revid), self)309 raise errors.RevisionNotPresent((fileid, revid), self)
310 try:310 try:
311 obj = tree_lookup_path(311 mode, item_id = tree_lookup_path(
312 self._git.object_store.__getitem__, root_tree,312 self._git.object_store.__getitem__, root_tree,
313 encode_git_path(path))313 encode_git_path(path))
314 if isinstance(obj, tuple):314 obj = self._git.object_store[item_id]
315 (mode, item_id) = obj
316 obj = self._git.object_store[item_id]
317 except KeyError:315 except KeyError:
318 raise errors.RevisionNotPresent((fileid, revid), self)316 raise errors.RevisionNotPresent((fileid, revid), self)
319 else:317 else:
320318
=== modified file 'breezy/git/tree.py'
--- breezy/git/tree.py 2021-12-09 20:50:25 +0000
+++ breezy/git/tree.py 2022-01-04 23:27:18 +0000
@@ -37,7 +37,6 @@
37 IndexEntry,37 IndexEntry,
38 )38 )
39from dulwich.object_store import (39from dulwich.object_store import (
40 tree_lookup_path,
41 OverlayObjectStore,40 OverlayObjectStore,
42 )41 )
43from dulwich.objects import (42from dulwich.objects import (
@@ -369,21 +368,21 @@
369 change_scanner = self._repository._file_change_scanner368 change_scanner = self._repository._file_change_scanner
370 if self.commit_id == ZERO_SHA:369 if self.commit_id == ZERO_SHA:
371 return NULL_REVISION370 return NULL_REVISION
372 (unused_path, commit_id) = change_scanner.find_last_change_revision(371 (store, unused_path, commit_id) = change_scanner.find_last_change_revision(
373 encode_git_path(path), self.commit_id)372 encode_git_path(path), self.commit_id)
374 return self._repository.lookup_foreign_revision_id(373 return self.mapping.revision_id_foreign_to_bzr(commit_id)
375 commit_id, self.mapping)
376374
377 def get_file_mtime(self, path):375 def get_file_mtime(self, path):
376 change_scanner = self._repository._file_change_scanner
377 if self.commit_id == ZERO_SHA:
378 return NULL_REVISION
378 try:379 try:
379 revid = self.get_file_revision(path)380 (store, unused_path, commit_id) = change_scanner.find_last_change_revision(
381 encode_git_path(path), self.commit_id)
380 except KeyError:382 except KeyError:
381 raise errors.NoSuchFile(path)383 raise errors.NoSuchFile(path)
382 try:384 commit = store[commit_id]
383 rev = self._repository.get_revision(revid)385 return commit.commit_time
384 except errors.NoSuchRevision:
385 raise _mod_tree.FileTimestampUnavailable(path)
386 return rev.timestamp
387386
388 def id2path(self, file_id, recurse='down'):387 def id2path(self, file_id, recurse='down'):
389 try:388 try:
390389
=== modified file 'breezy/git/workingtree.py'
--- breezy/git/workingtree.py 2021-05-30 17:12:41 +0000
+++ breezy/git/workingtree.py 2022-01-04 23:27:18 +0000
@@ -37,9 +37,6 @@
37 validate_path,37 validate_path,
38 write_index_dict,38 write_index_dict,
39 )39 )
40from dulwich.object_store import (
41 tree_lookup_path,
42 )
43from dulwich.objects import (40from dulwich.objects import (
44 S_ISGITLINK,41 S_ISGITLINK,
45 )42 )
@@ -75,6 +72,7 @@
7572
76from .dir import (73from .dir import (
77 LocalGitDir,74 LocalGitDir,
75 BareLocalGitControlDirFormat,
78 )76 )
79from .tree import (77from .tree import (
80 MutableGitIndexTree,78 MutableGitIndexTree,
@@ -219,10 +217,11 @@
219 info = self._submodule_info()[relpath]217 info = self._submodule_info()[relpath]
220 except KeyError:218 except KeyError:
221 submodule_transport = self.user_transport.clone(decode_git_path(relpath))219 submodule_transport = self.user_transport.clone(decode_git_path(relpath))
220 submodule_dir = self._format._matchingcontroldir.open(submodule_transport)
222 else:221 else:
223 submodule_transport = self.control_transport.clone(222 submodule_transport = self.control_transport.clone(
224 posixpath.join('modules', decode_git_path(info[1])))223 posixpath.join('modules', decode_git_path(info[1])))
225 submodule_dir = self._format._matchingcontroldir.open(submodule_transport)224 submodule_dir = BareLocalGitControlDirFormat().open(submodule_transport)
226 return Index(submodule_dir.control_transport.local_abspath('index'))225 return Index(submodule_dir.control_transport.local_abspath('index'))
227226
228 def lock_read(self):227 def lock_read(self):
229228
=== modified file 'breezy/tests/per_workingtree/test_get_file_mtime.py'
--- breezy/tests/per_workingtree/test_get_file_mtime.py 2018-11-16 18:33:17 +0000
+++ breezy/tests/per_workingtree/test_get_file_mtime.py 2022-01-04 23:27:18 +0000
@@ -20,6 +20,7 @@
2020
21from breezy import errors21from breezy import errors
22from breezy.tree import FileTimestampUnavailable22from breezy.tree import FileTimestampUnavailable
23from breezy.tests import TestNotApplicable
23from breezy.tests.per_workingtree import TestCaseWithWorkingTree24from breezy.tests.per_workingtree import TestCaseWithWorkingTree
2425
2526
@@ -36,6 +37,26 @@
36 tree.add(['one'])37 tree.add(['one'])
37 return tree38 return tree
3839
40 def test_get_file_mtime_nested(self):
41 tree = self.make_basic_tree()
42 subtree = self.make_branch_and_tree('tree/sub')
43 self.build_tree(['tree/sub/one'])
44 subtree.add(['one'])
45 subtree.commit('one')
46 try:
47 tree.add_reference(subtree)
48 except errors.UnsupportedOperation:
49 raise TestNotApplicable('subtrees not supported')
50 tree.commit('sub')
51
52 with tree.lock_read(), subtree.lock_read():
53 self.assertEqual(
54 tree.get_file_mtime('sub/one'),
55 subtree.get_file_mtime('one'))
56 self.assertEqual(
57 tree.basis_tree().get_file_mtime('sub/one'),
58 subtree.basis_tree().get_file_mtime('one'))
59
39 def test_get_file_mtime(self):60 def test_get_file_mtime(self):
40 tree = self.make_basic_tree()61 tree = self.make_basic_tree()
4162
4263
=== modified file 'byov.conf'
--- byov.conf 2021-08-19 18:07:03 +0000
+++ byov.conf 2022-01-04 23:27:18 +0000
@@ -5,7 +5,7 @@
5subunit.clone = (git clone https://github.com/testing-cabal/subunit.git ../subunit)5subunit.clone = (git clone https://github.com/testing-cabal/subunit.git ../subunit)
6sphinx_epytext.install = (pip3 install sphinx_epytext)6sphinx_epytext.install = (pip3 install sphinx_epytext)
7flake8.install3 = (pip3 install flake8)7flake8.install3 = (pip3 install flake8)
8brz.extras = fastimport,launchpad,workspace,git,cext,doc8brz.extras = fastimport,launchpad,workspace,git,cext,doc,dulwich
99
10[brz]10[brz]
11# because paramiko 2.0.0 is broken:11# because paramiko 2.0.0 is broken:
1212
=== modified file 'setup.py'
--- setup.py 2021-11-16 11:09:01 +0000
+++ setup.py 2022-01-04 23:27:18 +0000
@@ -63,7 +63,7 @@
63 'patiencediff',63 'patiencediff',
64 # Technically, Breezy works without these two dependencies too. But there's64 # Technically, Breezy works without these two dependencies too. But there's
65 # no way to enable them by default and let users opt out.65 # no way to enable them by default and let users opt out.
66 'dulwich>=0.20.23',66 'dulwich>=0.20.27',
67 ],67 ],
68 'extras_require': {68 'extras_require': {
69 'cext': ['cython>=0.29'],69 'cext': ['cython>=0.29'],

Subscribers

People subscribed via source and target branches