Kiln » Dependencies » Dulwich Read More
Clone URL:  
Pushed to one repository · View In Graph Contained in master

object_store: Include subtrees in iteration.

Changeset c0dcad78dd36

Parent 1d2133e1cffb

committed by Jelmer Vernooij

authored by Dave Borowitz

Changes to 3 files · Browse files at c0dcad78dd36 Showing diff from parent 1d2133e1cffb Diff from another changeset...

Change 1 of 1 Show Entire File NEWS Stacked
 
21
22
23
 
 
 
24
25
26
 
21
22
23
24
25
26
27
28
29
@@ -21,6 +21,9 @@
    * ObjectStore.iter_tree_contents now walks contents in depth-first, sorted   order. (Dave Borowitz) + + * ObjectStore.iter_tree_contents can optionally yield tree objects as well. + (Dave Borowitz).      0.6.1 2010-07-22
 
175
176
177
178
 
179
180
181
 
182
183
 
184
185
186
187
188
189
 
 
 
 
190
191
192
193
194
195
196
197
198
 
175
176
177
 
178
179
180
 
181
182
183
184
185
186
187
188
189
 
190
191
192
193
194
195
196
197
 
 
198
199
200
@@ -175,24 +175,26 @@
  else:   todo.add((None, newhexsha, childpath))   - def iter_tree_contents(self, tree_id): + def iter_tree_contents(self, tree_id, include_trees=False):   """Iterate the contents of a tree and all subtrees.   - Iteration is depth-first, as in e.g. os.walk. + Iteration is depth-first pre-order, as in e.g. os.walk.     :param tree_id: SHA1 of the tree. + :param include_trees: If True, include tree objects in the iteration.   :yield: Tuples of (path, mode, hexhsa) for objects in a tree.   """   todo = [('', stat.S_IFDIR, tree_id)]   while todo:   path, mode, hexsha = todo.pop() - if stat.S_ISDIR(mode): + is_subtree = stat.S_ISDIR(mode) + if not is_subtree or include_trees: + yield path, mode, hexsha + if is_subtree:   entries = reversed(self[hexsha].iteritems())   for name, entry_mode, entry_hexsha in entries:   entry_path = posixpath.join(path, name)   todo.append((entry_path, entry_mode, entry_hexsha)) - else: - yield path, mode, hexsha     def find_missing_objects(self, haves, wants, progress=None,   get_tagged=None):
 
96
97
98
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
100
101
 
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
@@ -96,6 +96,34 @@
  self.assertEquals([(p, m, h) for (p, h, m) in blobs],   list(self.store.iter_tree_contents(tree_id)))   + def test_iter_tree_contents_include_trees(self): + blob_a = make_object(Blob, data='a') + blob_b = make_object(Blob, data='b') + blob_c = make_object(Blob, data='c') + for blob in [blob_a, blob_b, blob_c]: + self.store.add_object(blob) + + blobs = [ + ('a', blob_a.id, 0100644), + ('ad/b', blob_b.id, 0100644), + ('ad/bd/c', blob_c.id, 0100755), + ] + tree_id = commit_tree(self.store, blobs) + tree = self.store[tree_id] + tree_ad = self.store[tree['ad'][1]] + tree_bd = self.store[tree_ad['bd'][1]] + + expected = [ + ('', 0040000, tree_id), + ('a', 0100644, blob_a.id), + ('ad', 0040000, tree_ad.id), + ('ad/b', 0100644, blob_b.id), + ('ad/bd', 0040000, tree_bd.id), + ('ad/bd/c', 0100755, blob_c.id), + ] + actual = self.store.iter_tree_contents(tree_id, include_trees=True) + self.assertEquals(expected, list(actual)) +    class MemoryObjectStoreTests(ObjectStoreTests, TestCase):