Mercurial > hg > mercurial-crew-with-dirclash
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() |