Merge lp:~jelmer/brz/empty-dir-changed into lp:brz

Proposed by Jelmer Vernooij
Status: Merged
Approved by: Jelmer Vernooij
Approved revision: no longer in the source branch.
Merge reported by: The Breezy Bot
Merged at revision: not available
Proposed branch: lp:~jelmer/brz/empty-dir-changed
Merge into: lp:brz
Diff against target: 211 lines (+52/-45)
6 files modified
breezy/git/workingtree.py (+6/-8)
breezy/tests/per_intertree/test_compare.py (+20/-17)
breezy/tests/per_tree/test_test_trees.py (+3/-14)
breezy/tests/per_workingtree/test_remove.py (+11/-3)
breezy/tests/per_workingtree/test_workingtree.py (+8/-0)
breezy/workingtree.py (+4/-3)
To merge this branch: bzr merge lp:~jelmer/brz/empty-dir-changed
Reviewer Review Type Date Requested Status
Martin Packman Approve
Review via email: mp+359025@code.launchpad.net

Commit message

Don't report empty directories in git repositories as pending changes.

Description of the change

Don't report empty directories in git repositories as pending changes.

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Okay, testing changes for the logic look sane here.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'breezy/git/workingtree.py'
2--- breezy/git/workingtree.py 2018-11-16 23:21:31 +0000
3+++ breezy/git/workingtree.py 2018-11-20 00:38:59 +0000
4@@ -535,8 +535,8 @@
5 except UnicodeDecodeError:
6 raise errors.BadFilenameEncoding(
7 relpath, osutils._fs_enc)
8- if not self._has_dir(relpath):
9- dirnames.remove(name)
10+ if not self._has_dir(relpath):
11+ dirnames.remove(name)
12 for name in filenames:
13 if not self.mapping.is_special_file(name):
14 yp = os.path.join(dir_relpath, name)
15@@ -550,12 +550,10 @@
16 """Yield all unversioned files in this WorkingTree.
17 """
18 with self.lock_read():
19- index_paths = set([p.decode('utf-8')
20- for p, i in self._recurse_index_entries()])
21- all_paths = set(self._iter_files_recursive(include_dirs=True))
22- for p in (all_paths - index_paths):
23- if not self._has_dir(p.encode('utf-8')):
24- yield p
25+ index_paths = set(
26+ [p.decode('utf-8') for p, i in self._recurse_index_entries()])
27+ all_paths = set(self._iter_files_recursive(include_dirs=False))
28+ return iter(all_paths - index_paths)
29
30 def _gather_kinds(self, files, kinds):
31 """See MutableTree._gather_kinds."""
32
33=== modified file 'breezy/tests/per_intertree/test_compare.py'
34--- breezy/tests/per_intertree/test_compare.py 2018-11-11 04:08:32 +0000
35+++ breezy/tests/per_intertree/test_compare.py 2018-11-20 00:38:59 +0000
36@@ -477,15 +477,8 @@
37 else:
38 # Neither tree can be used
39 return
40- tree1.lock_read()
41- try:
42- tree2.lock_read()
43- try:
44- return tree2.has_changes(tree1)
45- finally:
46- tree2.unlock()
47- finally:
48- tree1.unlock()
49+ with tree1.lock_read(), tree2.lock_read():
50+ return tree2.has_changes(tree1)
51
52 def mutable_trees_to_locked_test_trees(self, tree1, tree2):
53 """Convert the working trees into test trees.
54@@ -1761,14 +1754,24 @@
55 tree1, tree2 = self.mutable_trees_to_locked_test_trees(tree1, tree2)
56 self.not_applicable_if_cannot_represent_unversioned(tree2)
57
58- expected = self.sorted([
59- self.unversioned(tree2, u'a/file'),
60- self.unversioned(tree2, u'a/dir'),
61- ])
62- self.assertEqual(expected,
63- self.do_iter_changes(tree1, tree2,
64- require_versioned=False,
65- want_unversioned=True))
66+ if tree2.has_versioned_directories():
67+ expected = self.sorted([
68+ self.unversioned(tree2, u'a/file'),
69+ self.unversioned(tree2, u'a/dir'),
70+ ])
71+ self.assertEqual(expected,
72+ self.do_iter_changes(tree1, tree2,
73+ require_versioned=False,
74+ want_unversioned=True))
75+ else:
76+ expected = self.sorted([
77+ self.unversioned(tree2, u'a/file'),
78+ self.unversioned(tree2, u'a/dir/subfile'),
79+ ])
80+ self.assertEqual(expected,
81+ self.do_iter_changes(tree1, tree2,
82+ require_versioned=False,
83+ want_unversioned=True))
84
85 def test_rename_over_deleted(self):
86 tree1 = self.make_branch_and_tree('tree1')
87
88=== modified file 'breezy/tests/per_tree/test_test_trees.py'
89--- breezy/tests/per_tree/test_test_trees.py 2018-11-16 23:21:31 +0000
90+++ breezy/tests/per_tree/test_test_trees.py 2018-11-20 00:38:59 +0000
91@@ -141,10 +141,7 @@
92 self.addCleanup(tree.unlock)
93 self.assertEqual([], tree.get_parent_ids())
94 self.assertEqual([], tree.conflicts())
95- if tree.has_versioned_directories() or not tree.has_filename('b'):
96- self.assertEqual([], list(tree.unknowns()))
97- else:
98- self.assertEqual(['b'], list(tree.unknowns()))
99+ self.assertEqual([], list(tree.unknowns()))
100 # __iter__ has no strongly defined order
101 expected_paths = (
102 ['', 'a']
103@@ -169,11 +166,7 @@
104 self.addCleanup(tree.unlock)
105 self.assertEqual([], tree.get_parent_ids())
106 self.assertEqual([], tree.conflicts())
107- if tree.has_versioned_directories() or not tree.has_filename('1top-dir/1dir-in-1topdir'):
108- self.assertEqual([], list(tree.unknowns()))
109- else:
110- self.assertEqual(['1top-dir/1dir-in-1topdir'],
111- list(tree.unknowns()))
112+ self.assertEqual([], list(tree.unknowns()))
113 # __iter__ has no strongly defined order
114 tree_root = tree.path2id('')
115 try:
116@@ -227,11 +220,7 @@
117 self.addCleanup(tree.unlock)
118 self.assertEqual([], tree.get_parent_ids())
119 self.assertEqual([], tree.conflicts())
120- if tree.has_versioned_directories() or not tree.has_filename('1top-dir/1dir-in-1topdir'):
121- self.assertEqual([], list(tree.unknowns()))
122- else:
123- self.assertEqual(['1top-dir/1dir-in-1topdir'],
124- list(tree.unknowns()))
125+ self.assertEqual([], list(tree.unknowns()))
126 # __iter__ has no strongly defined order
127 tree_root = tree.path2id('')
128 if tree.has_versioned_directories():
129
130=== modified file 'breezy/tests/per_workingtree/test_remove.py'
131--- breezy/tests/per_workingtree/test_remove.py 2018-11-11 04:08:32 +0000
132+++ breezy/tests/per_workingtree/test_remove.py 2018-11-20 00:38:59 +0000
133@@ -26,6 +26,7 @@
134 files = ['a', 'b/', 'b/c', 'd/']
135 rfiles = ['b/c', 'b', 'a', 'd']
136 backup_files = ['a.~1~', 'b.~1~/', 'b.~1~/c.~1~', 'd.~1~/']
137+ backup_files_no_version_dirs = ['a.~1~', 'b.~1~/', 'b.~1~/c.~1~']
138
139 def get_tree(self, files):
140 tree = self.make_branch_and_tree('.')
141@@ -84,7 +85,10 @@
142 tree.add(TestRemove.files)
143 tree.remove(TestRemove.files, keep_files=False)
144 self.assertNotInWorkingTree(TestRemove.files)
145- self.assertPathExists(TestRemove.backup_files)
146+ if tree.has_versioned_directories():
147+ self.assertPathExists(TestRemove.backup_files)
148+ else:
149+ self.assertPathExists(TestRemove.backup_files_no_version_dirs)
150 tree._validate()
151
152 def test_remove_changed_file(self):
153@@ -134,7 +138,8 @@
154 tree.remove(rfilesx, keep_files=False)
155 self.assertNotInWorkingTree(rfilesx)
156 self.assertPathExists(['bx.~1~/cx.~1~', 'bx.~1~', 'ax.~1~'])
157- if tree.supports_rename_tracking():
158+ if (tree.supports_rename_tracking() or
159+ not tree.has_versioned_directories()):
160 self.assertPathDoesNotExist('dx.~1~') # unchanged file
161 else:
162 self.assertPathExists('dx.~1~') # renamed, so appears changed
163@@ -155,7 +160,10 @@
164 tree = self.get_tree(TestRemove.files)
165 tree.remove(TestRemove.files, keep_files=False)
166 self.assertRemovedAndDeleted(TestRemove.files)
167- self.assertPathExists(TestRemove.backup_files)
168+ if tree.has_versioned_directories():
169+ self.assertPathExists(TestRemove.backup_files)
170+ else:
171+ self.assertPathExists(TestRemove.backup_files_no_version_dirs)
172 tree._validate()
173
174 def test_remove_nonexisting_files(self):
175
176=== modified file 'breezy/tests/per_workingtree/test_workingtree.py'
177--- breezy/tests/per_workingtree/test_workingtree.py 2018-11-17 16:19:11 +0000
178+++ breezy/tests/per_workingtree/test_workingtree.py 2018-11-20 00:38:59 +0000
179@@ -284,6 +284,14 @@
180 self.assertEqual(list(tree.unknowns()),
181 ['hello.txt'])
182
183+ def test_unknowns_empty_dir(self):
184+ tree = self.make_branch_and_tree('.')
185+ self.build_tree(['subdir/', 'subdir/somefile'])
186+ if tree.has_versioned_directories():
187+ self.assertEqual(list(tree.unknowns()), ['subdir'])
188+ else:
189+ self.assertEqual(list(tree.unknowns()), ['subdir/somefile'])
190+
191 def test_initialize(self):
192 # initialize should create a working tree and branch in an existing dir
193 t = self.make_branch_and_tree('.')
194
195=== modified file 'breezy/workingtree.py'
196--- breezy/workingtree.py 2018-11-16 18:33:17 +0000
197+++ breezy/workingtree.py 2018-11-20 00:38:59 +0000
198@@ -908,9 +908,10 @@
199 def extras(self):
200 """Yield all unversioned files in this WorkingTree.
201
202- If there are any unversioned directories then only the directory is
203- returned, not all its children. But if there are unversioned files
204- under a versioned subdirectory, they are returned.
205+ If there are any unversioned directories and the file format
206+ supports versioning directories, then only the directory is returned,
207+ not all its children. But if there are unversioned files under a
208+ versioned subdirectory, they are returned.
209
210 Currently returned depth-first, sorted by name within directories.
211 This is the same order used by 'osutils.walkdirs'.

Subscribers

People subscribed via source and target branches