comparison contrib/convert-repo @ 1335:bea6356b8bca

git -> hg conversion script contrib/convert-repo changes: - do not print verbose output so that error messages are seen more easily - Output the date as integer and not as floating point number. - Do not require a ".git" subdirectory to work on, but use the GIT_DIR environment var to specify the git repository. Change is otherwise compatible to the current version and I have tested it by converting the kernel and several git respositories from kernel.org. (Btw, the udev test dir contains a /sys dir with entries which should not be normal dirs and not be normal files. ;-) Thanks again for mercurial, Florian La Roche --- a/contrib/convert-repo +++ b/contrib/convert-repo @@ -28,26 +28,18 @@ self.path = path def getheads(self): - h = file(self.path + "/.git/HEAD").read()[:-1] - return [h] + return [file(self.path + "/HEAD").read()[:-1]] def catfile(self, rev, type): if rev == "0" * 40: raise IOError() - path = os.getcwd() - os.chdir(self.path) - fh = os.popen("git-cat-file %s %s 2>/dev/null" % (type, rev)) - os.chdir(path) + fh = os.popen("GIT_DIR=%s git-cat-file %s %s 2>/dev/null" % (self.path, type, rev)) return fh.read() def getfile(self, name, rev): return self.catfile(rev, "blob") def getchanges(self, version): - path = os.getcwd() - os.chdir(self.path) - fh = os.popen("git-diff-tree --root -m -r %s" % (version)) - os.chdir(path) - + fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s" % (self.path, version)) changes = [] for l in fh: if "\t" not in l: continue @@ -83,9 +75,9 @@ def gettags(self): tags = {} - for f in os.listdir(self.path + "/.git/refs/tags"): + for f in os.listdir(self.path + "/refs/tags"): try: - h = file(self.path + "/.git/refs/tags/" + f).read().strip() + h = file(self.path + "/refs/tags/" + f).read().strip() tags[f] = h except: pass @@ -99,8 +91,7 @@ def getheads(self): h = self.repo.changelog.heads() - h = [ hg.hex(x) for x in h ] - return h + return [ hg.hex(x) for x in h ] def putfile(self, f, e, data): self.repo.wfile(f, "w").write(data) @@ -155,12 +146,12 @@ newlines.sort() if newlines != oldlines: - print "updating tags" + #print "updating tags" f = self.repo.wfile(".hgtags", "w") f.write("".join(newlines)) f.close() if not oldlines: self.repo.add([".hgtags"]) - date = "%s 0" % time.mktime(time.gmtime()) + date = "%s 0" % int(time.mktime(time.gmtime())) self.repo.rawcommit([".hgtags"], "update tags", "convert-repo", date, self.repo.changelog.tip(), hg.nullid) @@ -262,7 +253,7 @@ num -= 1 if c in self.map: continue desc = self.commitcache[c][3].splitlines()[0] - print num, desc + #print num, desc self.copy(c) tags = self.source.gettags() @@ -275,6 +266,8 @@ self.dest.puttags(ctags) gitpath, hgpath, mapfile = sys.argv[1:] +if os.path.isdir(gitpath + "/.git"): + gitpath += "/.git" c = convert(convert_git(gitpath), convert_mercurial(hgpath), mapfile) c.convert() _______________________________________________ Mercurial mailing list Mercurial@selenic.com http://selenic.com/mailman/listinfo/mercurial
author Florian La Roche <laroche@redhat.com>
date Fri, 23 Sep 2005 17:15:36 -0700
parents 227cfbe34109
children adb3de56635b
comparison
equal deleted inserted replaced
1334:0843e1bf2b97 1335:bea6356b8bca
26 class convert_git: 26 class convert_git:
27 def __init__(self, path): 27 def __init__(self, path):
28 self.path = path 28 self.path = path
29 29
30 def getheads(self): 30 def getheads(self):
31 h = file(self.path + "/.git/HEAD").read()[:-1] 31 return [file(self.path + "/HEAD").read()[:-1]]
32 return [h]
33 32
34 def catfile(self, rev, type): 33 def catfile(self, rev, type):
35 if rev == "0" * 40: raise IOError() 34 if rev == "0" * 40: raise IOError()
36 path = os.getcwd() 35 fh = os.popen("GIT_DIR=%s git-cat-file %s %s 2>/dev/null" % (self.path, type, rev))
37 os.chdir(self.path)
38 fh = os.popen("git-cat-file %s %s 2>/dev/null" % (type, rev))
39 os.chdir(path)
40 return fh.read() 36 return fh.read()
41 37
42 def getfile(self, name, rev): 38 def getfile(self, name, rev):
43 return self.catfile(rev, "blob") 39 return self.catfile(rev, "blob")
44 40
45 def getchanges(self, version): 41 def getchanges(self, version):
46 path = os.getcwd() 42 fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s" % (self.path, version))
47 os.chdir(self.path)
48 fh = os.popen("git-diff-tree --root -m -r %s" % (version))
49 os.chdir(path)
50
51 changes = [] 43 changes = []
52 for l in fh: 44 for l in fh:
53 if "\t" not in l: continue 45 if "\t" not in l: continue
54 m, f = l[:-1].split("\t") 46 m, f = l[:-1].split("\t")
55 m = m.split() 47 m = m.split()
81 if n == "parent": parents.append(v) 73 if n == "parent": parents.append(v)
82 return (parents, author, date, message) 74 return (parents, author, date, message)
83 75
84 def gettags(self): 76 def gettags(self):
85 tags = {} 77 tags = {}
86 for f in os.listdir(self.path + "/.git/refs/tags"): 78 for f in os.listdir(self.path + "/refs/tags"):
87 try: 79 try:
88 h = file(self.path + "/.git/refs/tags/" + f).read().strip() 80 h = file(self.path + "/refs/tags/" + f).read().strip()
89 tags[f] = h 81 tags[f] = h
90 except: 82 except:
91 pass 83 pass
92 return tags 84 return tags
93 85
97 u = ui.ui() 89 u = ui.ui()
98 self.repo = hg.repository(u, path) 90 self.repo = hg.repository(u, path)
99 91
100 def getheads(self): 92 def getheads(self):
101 h = self.repo.changelog.heads() 93 h = self.repo.changelog.heads()
102 h = [ hg.hex(x) for x in h ] 94 return [ hg.hex(x) for x in h ]
103 return h
104 95
105 def putfile(self, f, e, data): 96 def putfile(self, f, e, data):
106 self.repo.wfile(f, "w").write(data) 97 self.repo.wfile(f, "w").write(data)
107 if self.repo.dirstate.state(f) == '?': 98 if self.repo.dirstate.state(f) == '?':
108 self.repo.dirstate.update([f], "a") 99 self.repo.dirstate.update([f], "a")
153 newlines.append("%s %s\n" % (tags[tag], tag)) 144 newlines.append("%s %s\n" % (tags[tag], tag))
154 145
155 newlines.sort() 146 newlines.sort()
156 147
157 if newlines != oldlines: 148 if newlines != oldlines:
158 print "updating tags" 149 #print "updating tags"
159 f = self.repo.wfile(".hgtags", "w") 150 f = self.repo.wfile(".hgtags", "w")
160 f.write("".join(newlines)) 151 f.write("".join(newlines))
161 f.close() 152 f.close()
162 if not oldlines: self.repo.add([".hgtags"]) 153 if not oldlines: self.repo.add([".hgtags"])
163 date = "%s 0" % time.mktime(time.gmtime()) 154 date = "%s 0" % int(time.mktime(time.gmtime()))
164 self.repo.rawcommit([".hgtags"], "update tags", "convert-repo", 155 self.repo.rawcommit([".hgtags"], "update tags", "convert-repo",
165 date, self.repo.changelog.tip(), hg.nullid) 156 date, self.repo.changelog.tip(), hg.nullid)
166 157
167 class convert: 158 class convert:
168 def __init__(self, source, dest, mapfile): 159 def __init__(self, source, dest, mapfile):
260 251
261 for c in t: 252 for c in t:
262 num -= 1 253 num -= 1
263 if c in self.map: continue 254 if c in self.map: continue
264 desc = self.commitcache[c][3].splitlines()[0] 255 desc = self.commitcache[c][3].splitlines()[0]
265 print num, desc 256 #print num, desc
266 self.copy(c) 257 self.copy(c)
267 258
268 tags = self.source.gettags() 259 tags = self.source.gettags()
269 ctags = {} 260 ctags = {}
270 for k in tags: 261 for k in tags:
273 ctags[k] = self.map[v] 264 ctags[k] = self.map[v]
274 265
275 self.dest.puttags(ctags) 266 self.dest.puttags(ctags)
276 267
277 gitpath, hgpath, mapfile = sys.argv[1:] 268 gitpath, hgpath, mapfile = sys.argv[1:]
269 if os.path.isdir(gitpath + "/.git"):
270 gitpath += "/.git"
278 271
279 c = convert(convert_git(gitpath), convert_mercurial(hgpath), mapfile) 272 c = convert(convert_git(gitpath), convert_mercurial(hgpath), mapfile)
280 c.convert() 273 c.convert()