changeset 3461:ad4b5ef8a051

Build git trees in a recursive manner - not just one flat tree per repo
author Josef "Jeff" Sipek <jeffpc@josefsipek.net>
date Sat, 21 Oct 2006 16:19:11 -0400
parents afb106e08cda
children 1a6856093e4c
files hgext/gitserve.py
diffstat 1 files changed, 30 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/gitserve.py	Sat Oct 21 15:22:08 2006 -0400
+++ b/hgext/gitserve.py	Sat Oct 21 16:19:11 2006 -0400
@@ -283,6 +283,25 @@
             f.write("%s %s\n" % (k, node.hex(g2h[k])))
         f.close()
 
+    def buildtrees(dirs):
+	print dirs
+
+	tree = ""
+	for name in dirs.keys():
+		if dirs[name].__class__ == dict:
+			# a directory
+			hash = node.bin(buildtrees(dirs[name]))
+			mode = "40000"
+		else:
+			hash = dirs[name]
+			mode = "100644"
+
+		print "%s %s\0%s"%(mode,name,node.hex(hash))
+
+		tree+="%s %s\0%s"%(mode,name,hash)
+
+	return make_tree_object(tree)
+
     ##
 
     if usemap:
@@ -301,15 +320,23 @@
     if not h2g.has_key(pars[1]) and pars[1] != node.nullid:
         gitobject(ui, repo, pars[1], False)
 
-    (hgmanifest, user, t, files, hgmsg) = repo.changelog.read(r)
+    (hgmanifest, user, t, files, hgmsg, extra) = repo.changelog.read(r)
 
     tree = ""
+    dirs = {}
     mmap = repo.manifest.read(hgmanifest)
     for name in mmap.keys():
         githash = make_file_object(repo, name, mmap[name])
-        tree += "%s %s\0%s" % ("100644", name, node.bin(githash))
 
-    gittree = make_tree_object(tree)
+        pn = name.split("/")
+	d = dirs
+	for p in pn[:-1]:
+		if not d.has_key(p):
+			d[p] = {}
+		d = d[p]
+	d[pn[-1]] = node.bin(githash)
+
+    gittree = buildtrees(dirs)
 
     try:
         lastline = hgmsg.split("\n")[-2]