# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
-import os
+import os, stat
from commit import Commit
from errors import (
sha_done = set()
ref = graph_walker.next()
while ref:
- sha_done.add(ref)
if ref in self.object_store:
graph_walker.ack(ref)
ref = graph_walker.next()
while commits_to_send:
- sha = commits_to_send.pop()
+ sha = (commits_to_send.pop(), None)
if sha in sha_done:
continue
c = self.commit(sha)
assert isinstance(c, Commit)
- sha_done.add(sha)
+ sha_done.add((sha, None))
commits_to_send.update([p for p in c.parents if not p in sha_done])
def parse_tree(tree, sha_done):
- for mode, name, x in tree.entries():
- if not x in sha_done:
- try:
- t = self.tree(x)
- sha_done.add(x)
- parse_tree(t, sha_done)
- except:
- sha_done.add(x)
+ for mode, name, sha in tree.entries():
+ if (sha, name) in sha_done:
+ continue
+ if mode & stat.S_IFDIR:
+ parse_tree(self.tree(sha), sha_done)
+ sha_done.add((sha, name))
treesha = c.tree
- if treesha not in sha_done:
- t = self.tree(treesha)
- sha_done.add(treesha)
- parse_tree(t, sha_done)
+ if c.tree not in sha_done:
+ parse_tree(self.tree(c.tree), sha_done)
+ sha_done.add((c.tree, None))
progress("counting objects: %d\r" % len(sha_done))
return sha_done
that a revision is present.
:param progress: Simple progress function that will be called with
updated progress strings.
+ :return: tuple with number of objects, iterator over objects
"""
shas = self.find_missing_objects(determine_wants, graph_walker, progress)
- for sha in shas:
- yield self.get_object(sha)
+ return (len(shas), ((self.get_object(sha), path) for sha, path in shas))
def object_dir(self):
return os.path.join(self.controldir(), OBJECTDIR)