Merge lp:~jelmer/brz/find-related-paths-git-directories into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: 7648
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/find-related-paths-git-directories
Merge into: lp:brz
Diff against target: 124 lines (+69/-5)
2 files modified
breezy/git/tests/test_tree.py (+53/-3)
breezy/git/tree.py (+16/-2)
To merge this branch: bzr merge lp:~jelmer/brz/find-related-paths-git-directories
Reviewer Review Type Date Requested Status
Jelmer Vernooij Approve
Review via email: mp+430853@code.launchpad.net

Commit message

Fix handling of empty directories in iter_changes

Description of the change

Fix handling of empty directories in iter_changes.

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 :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'breezy/git/tests/test_tree.py'
2--- breezy/git/tests/test_tree.py 2022-01-21 17:19:24 +0000
3+++ breezy/git/tests/test_tree.py 2022-10-02 17:03:24 +0000
4@@ -17,10 +17,9 @@
5
6 """Tests for breezy.git.tests."""
7
8-from __future__ import absolute_import
9-
10 import stat
11-from unittest import TestCase
12+from breezy.errors import PathsNotVersionedError
13+from breezy.tests import TestCase, TestCaseWithTransport
14
15 from dulwich.objects import Tree, Blob
16
17@@ -32,6 +31,7 @@
18 )
19
20 from breezy.git.mapping import default_mapping
21+from breezy.workingtree import WorkingTree
22
23
24 REG_MODE = stat.S_IFREG | 0o644
25@@ -340,3 +340,53 @@
26 (b'TREE_ROOT', b'TREE_ROOT'), ('a', 'a'), ('file', 'symlink'),
27 (False, False), False))
28 self.assertEqual(expected_delta, delta)
29+
30+
31+class FindRelatedPathsAcrossTrees(TestCaseWithTransport):
32+
33+ def test_none(self):
34+ self.make_branch_and_tree('t1', format='git')
35+ wt = WorkingTree.open('t1')
36+ self.assertIs(None, wt.find_related_paths_across_trees(None))
37+
38+ def test_empty(self):
39+ self.make_branch_and_tree('t1', format='git')
40+ wt = WorkingTree.open('t1')
41+ self.assertEqual([], list(wt.find_related_paths_across_trees([])))
42+
43+ def test_directory(self):
44+ self.make_branch_and_tree('t1', format='git')
45+ wt = WorkingTree.open('t1')
46+ self.build_tree(['t1/dir/', 't1/dir/file'])
47+ wt.add(['dir', 'dir/file'])
48+ self.assertEqual(['dir/file'], list(wt.find_related_paths_across_trees(['dir/file'])))
49+ self.assertEqual(['dir'], list(wt.find_related_paths_across_trees(['dir'])))
50+
51+ def test_empty_directory(self):
52+ self.make_branch_and_tree('t1', format='git')
53+ wt = WorkingTree.open('t1')
54+ self.build_tree(['t1/dir/'])
55+ wt.add(['dir'])
56+ self.assertEqual(['dir'], list(wt.find_related_paths_across_trees(['dir'])))
57+ self.assertRaises(PathsNotVersionedError, wt.find_related_paths_across_trees, ['dir/file'])
58+
59+ def test_missing(self):
60+ self.make_branch_and_tree('t1', format='git')
61+ wt = WorkingTree.open('t1')
62+ self.assertRaises(PathsNotVersionedError, wt.find_related_paths_across_trees, ['file'])
63+
64+ def test_not_versioned(self):
65+ self.make_branch_and_tree('t1', format='git')
66+ self.make_branch_and_tree('t2', format='git')
67+ wt1 = WorkingTree.open('t1')
68+ wt2 = WorkingTree.open('t2')
69+ self.build_tree(['t1/file'])
70+ self.build_tree(['t2/file'])
71+ self.assertRaises(PathsNotVersionedError, wt1.find_related_paths_across_trees, ['file'], [wt2])
72+
73+ def test_single(self):
74+ self.make_branch_and_tree('t1', format='git')
75+ wt = WorkingTree.open('t1')
76+ self.build_tree(['t1/file'])
77+ wt.add('file')
78+ self.assertEqual(['file'], list(wt.find_related_paths_across_trees(['file'])))
79
80=== modified file 'breezy/git/tree.py'
81--- breezy/git/tree.py 2022-08-22 18:19:46 +0000
82+++ breezy/git/tree.py 2022-10-02 17:03:24 +0000
83@@ -19,6 +19,7 @@
84
85 from collections import deque
86 import errno
87+from functools import partial
88 from io import BytesIO
89 import os
90
91@@ -282,18 +283,31 @@
92 require_versioned=True):
93 if paths is None:
94 return None
95+
96+ def include(t, p):
97+ if t.is_versioned(p):
98+ return True
99+ # Include directories, since they may exist but just be
100+ # empty
101+ try:
102+ if t.kind(p) == 'directory':
103+ return True
104+ except _mod_transport.NoSuchFile:
105+ return False
106+ return False
107+
108 if require_versioned:
109 trees = [self] + (trees if trees is not None else [])
110 unversioned = set()
111 for p in paths:
112 for t in trees:
113- if t.is_versioned(p):
114+ if include(t, p):
115 break
116 else:
117 unversioned.add(p)
118 if unversioned:
119 raise errors.PathsNotVersionedError(unversioned)
120- return filter(self.is_versioned, paths)
121+ return filter(partial(include, self), paths)
122
123 def _submodule_config(self):
124 if self._submodules is None:

Subscribers

People subscribed via source and target branches