Browse Source

Add convenience functions for fetching objects.

Jelmer Vernooij 15 years ago
parent
commit
d997d74fe7
3 changed files with 145 additions and 119 deletions
  1. 114 119
      bin/dulwich
  2. 19 0
      dulwich/client.py
  3. 12 0
      dulwich/repo.py

+ 114 - 119
bin/dulwich

@@ -31,156 +31,151 @@ def get_transport_and_path(uri):
 
 
 def cmd_fetch_pack(args):
-	from dulwich.repo import Repo
-	opts, args = getopt(args, "", ["all"])
-	opts = dict(opts)
-        client, path = get_transport_and_path(args.pop(0))
-	if "--all" in opts:
-		determine_wants = r.object_store.determine_wants_all
-	else:
-		determine_wants = lambda x: [y for y in args if not y in r.object_store]
-	r = Repo(".")
-	graphwalker = r.get_graph_walker()
-	f, commit = r.object_store.add_pack()
-	try:
-            client.fetch_pack(path, determine_wants, graphwalker, f.write, sys.stdout.write)
-        finally:
-		commit()
+    from dulwich.repo import Repo
+    opts, args = getopt(args, "", ["all"])
+    opts = dict(opts)
+    client, path = get_transport_and_path(args.pop(0))
+    r = Repo(".")
+    if "--all" in opts:
+        determine_wants = r.object_store.determine_wants_all
+    else:
+        determine_wants = lambda x: [y for y in args if not y in r.object_store]
+    graphwalker = r.get_graph_walker()
+    client.fetch(path, r.object_store, determine_wants)
 
 
 def cmd_log(args):
-	from dulwich.repo import Repo
-	opts, args = getopt(args, "", [])
-	r = Repo(".")
-	todo = [r.head()]
-	done = set()
-	while todo:
-		sha = todo.pop()
-		assert isinstance(sha, str)
-		if sha in done:
-			continue
-		done.add(sha)
-		commit = r.commit(sha)
-		print "-" * 50
-		print "commit: %s" % sha
-		if len(commit.parents) > 1:
-			print "merge: %s" % "...".join(commit.parents[1:])
-		print "author: %s" % commit.author
-		print "committer: %s" % commit.committer
-		print ""
-		print commit.message
-		print ""
-		todo.extend([p for p in commit.parents if p not in done])
+    from dulwich.repo import Repo
+    opts, args = getopt(args, "", [])
+    r = Repo(".")
+    todo = [r.head()]
+    done = set()
+    while todo:
+        sha = todo.pop()
+        assert isinstance(sha, str)
+        if sha in done:
+            continue
+        done.add(sha)
+        commit = r.commit(sha)
+        print "-" * 50
+        print "commit: %s" % sha
+        if len(commit.parents) > 1:
+            print "merge: %s" % "...".join(commit.parents[1:])
+        print "author: %s" % commit.author
+        print "committer: %s" % commit.committer
+        print ""
+        print commit.message
+        print ""
+        todo.extend([p for p in commit.parents if p not in done])
 
 
 def cmd_dump_pack(args):
-	from dulwich.errors import ApplyDeltaError
-	from dulwich.pack import Pack, sha_to_hex
-	import os
-	import sys
-
-	opts, args = getopt(args, "", [])
-
-	if args == []:
-		print "Usage: dulwich dump-pack FILENAME"
-		sys.exit(1)
-
-	basename, _ = os.path.splitext(args[0])
-	x = Pack(basename)
-	print "Object names checksum: %s" % x.name()
-	print "Checksum: %s" % sha_to_hex(x.get_stored_checksum())
-	if not x.check():
-		print "CHECKSUM DOES NOT MATCH"
-	print "Length: %d" % len(x)
-	for name in x:
-		try:
-			print "\t%s" % x[name]
-		except KeyError, k:
-			print "\t%s: Unable to resolve base %s" % (name, k)
-		except ApplyDeltaError, e:
-			print "\t%s: Unable to apply delta: %r" % (name, e)
+    from dulwich.errors import ApplyDeltaError
+    from dulwich.pack import Pack, sha_to_hex
+    import os
+    import sys
+
+    opts, args = getopt(args, "", [])
+
+    if args == []:
+        print "Usage: dulwich dump-pack FILENAME"
+        sys.exit(1)
+
+    basename, _ = os.path.splitext(args[0])
+    x = Pack(basename)
+    print "Object names checksum: %s" % x.name()
+    print "Checksum: %s" % sha_to_hex(x.get_stored_checksum())
+    if not x.check():
+        print "CHECKSUM DOES NOT MATCH"
+    print "Length: %d" % len(x)
+    for name in x:
+        try:
+            print "\t%s" % x[name]
+        except KeyError, k:
+            print "\t%s: Unable to resolve base %s" % (name, k)
+        except ApplyDeltaError, e:
+            print "\t%s: Unable to apply delta: %r" % (name, e)
 
 
 def cmd_dump_index(args):
-	from dulwich.index import Index
+    from dulwich.index import Index
 
-	opts, args = getopt(args, "", [])
+    opts, args = getopt(args, "", [])
 
-	if args == []:
-		print "Usage: dulwich dump-index FILENAME"
-		sys.exit(1)
+    if args == []:
+        print "Usage: dulwich dump-index FILENAME"
+        sys.exit(1)
 
-	filename = args[0]
-	idx = Index(filename)
+    filename = args[0]
+    idx = Index(filename)
 
-	for o in idx:
-		print o, idx[o]
+    for o in idx:
+        print o, idx[o]
 
 
 def cmd_init(args):
-	from dulwich.repo import Repo
-	import os
-	import sys
-	opts, args = getopt(args, "", ["--bare"])
-	opts = dict(opts)
+    from dulwich.repo import Repo
+    import os
+    opts, args = getopt(args, "", ["--bare"])
+    opts = dict(opts)
 
-	if args == []:
-		path = os.getcwd()
-	else:
-		path = args[0]
+    if args == []:
+        path = os.getcwd()
+    else:
+        path = args[0]
 
-	if not os.path.exists(path):
-		os.mkdir(path)
+    if not os.path.exists(path):
+        os.mkdir(path)
 
-	if "--bare" in opts:
-		Repo.init_bare(path)
-	else:
-		Repo.init(path)
+    if "--bare" in opts:
+        Repo.init_bare(path)
+    else:
+        Repo.init(path)
 
 
 def cmd_clone(args):
-	from dulwich.repo import Repo
-	import os
-	import sys
-	opts, args = getopt(args, "", [])
-	opts = dict(opts)
-
-	if args == []:
-		print "usage: dulwich clone host:path [PATH]"
-		sys.exit(1)
+    from dulwich.repo import Repo
+    import os
+    import sys
+    opts, args = getopt(args, "", [])
+    opts = dict(opts)
+
+    if args == []:
+        print "usage: dulwich clone host:path [PATH]"
+        sys.exit(1)
         client, host_path = get_transport_and_path(args.pop(0))
 
-	if len(args) > 0:
-		path = args.pop(0)
-	else:
-		path = host_path.split("/")[-1]
+    if len(args) > 0:
+        path = args.pop(0)
+    else:
+        path = host_path.split("/")[-1]
 
-	if not os.path.exists(path):
-		os.mkdir(path)
-	Repo.init(path)
-	r = Repo(path)
-	graphwalker = r.get_graph_walker()
-	f, commit = r.object_store.add_pack()
-	client.fetch_pack(host_path, r.object_store.determine_wants_all, 
-			          graphwalker, f.write, sys.stdout.write)
-	commit()
+    if not os.path.exists(path):
+        os.mkdir(path)
+    Repo.init(path)
+    r = Repo(path)
+    graphwalker = r.get_graph_walker()
+    f, commit = r.object_store.add_pack()
+    client.fetch_pack(host_path, r.object_store.determine_wants_all, 
+                      graphwalker, f.write, sys.stdout.write)
+    commit()
 
 
 commands = {
-	"fetch-pack": cmd_fetch_pack,
-	"dump-pack": cmd_dump_pack,
-	"dump-index": cmd_dump_index,
-	"init": cmd_init,
-	"log": cmd_log,
-	"clone": cmd_clone,
-	}
+    "fetch-pack": cmd_fetch_pack,
+    "dump-pack": cmd_dump_pack,
+    "dump-index": cmd_dump_index,
+    "init": cmd_init,
+    "log": cmd_log,
+    "clone": cmd_clone,
+    }
 
 if len(sys.argv) < 2:
-	print "Usage: %s <%s> [OPTIONS...]" % (sys.argv[0], "|".join(commands.keys()))
-	sys.exit(1)
+    print "Usage: %s <%s> [OPTIONS...]" % (sys.argv[0], "|".join(commands.keys()))
+    sys.exit(1)
 
 cmd = sys.argv[1]
 if not cmd in commands:
-	print "No such subcommand: %s" % cmd
-	sys.exit(1)
+    print "No such subcommand: %s" % cmd
+    sys.exit(1)
 commands[cmd](sys.argv[2:])

+ 19 - 0
dulwich/client.py

@@ -124,6 +124,25 @@ class GitClient(object):
             
         return new_refs
 
+    def fetch(self, path, target, determine_wants=None, progress=None):
+        """Fetch into a target repository.
+
+        :param path: Path to fetch from
+        :param target: Target repository to fetch into
+        :param determine_wants: Optional function to determine what refs 
+            to fetch
+        :param progress: Optional progress function
+        :return: remote refs
+        """
+        if determine_wants is None:
+            determine_wants = target.object_store.determine_wants_all
+        f, commit = target.object_store.add_pack()
+        try:
+            return self.fetch_pack(path, determine_wants, target.graph_walker, 
+                                   f.write, progress)
+        finally:
+            commit()
+
     def fetch_pack(self, path, determine_wants, graph_walker, pack_data,
                    progress):
         """Retrieve a pack from a git smart server.

+ 12 - 0
dulwich/repo.py

@@ -242,6 +242,18 @@ class Repo(object):
         """Check if an index is present."""
         return os.path.exists(self.index_path())
 
+    def fetch(self, target, determine_wants=None, progress=None):
+        """Fetch objects into another repository.
+
+        :param target: The target repository
+        :param determine_wants: Optional function to determine what refs to 
+            fetch.
+        :param progress: Optional progress function
+        """
+        target.object_store.add_objects(
+            self.fetch_objects(determine_wants, target.graph_walker, progress))
+        return self.get_refs()
+
     def fetch_objects(self, determine_wants, graph_walker, progress):
         """Fetch the missing objects required for a set of revisions.