##// END OF EJS Templates
Merge with crew-stable
Patrick Mezard -
r10988:f2340d69 merge default
parent child Browse files
Show More
@@ -16,7 +16,7 b' class convert_git(converter_source):'
16 # cannot remove environment variable. Just assume none have
16 # cannot remove environment variable. Just assume none have
17 # both issues.
17 # both issues.
18 if hasattr(os, 'unsetenv'):
18 if hasattr(os, 'unsetenv'):
19 def gitcmd(self, s):
19 def gitopen(self, s):
20 prevgitdir = os.environ.get('GIT_DIR')
20 prevgitdir = os.environ.get('GIT_DIR')
21 os.environ['GIT_DIR'] = self.path
21 os.environ['GIT_DIR'] = self.path
22 try:
22 try:
@@ -27,9 +27,14 b' class convert_git(converter_source):'
27 else:
27 else:
28 os.environ['GIT_DIR'] = prevgitdir
28 os.environ['GIT_DIR'] = prevgitdir
29 else:
29 else:
30 def gitcmd(self, s):
30 def gitopen(self, s):
31 return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb')
31 return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb')
32
32
33 def gitread(self, s):
34 fh = self.gitopen(s)
35 data = fh.read()
36 return data, fh.close()
37
33 def __init__(self, ui, path, rev=None):
38 def __init__(self, ui, path, rev=None):
34 super(convert_git, self).__init__(ui, path, rev=rev)
39 super(convert_git, self).__init__(ui, path, rev=rev)
35
40
@@ -44,17 +49,22 b' class convert_git(converter_source):'
44
49
45 def getheads(self):
50 def getheads(self):
46 if not self.rev:
51 if not self.rev:
47 fh = self.gitcmd('git rev-parse --branches --remotes')
52 heads, ret = self.gitread('git rev-parse --branches --remotes')
48 return fh.read().splitlines()
53 heads = heads.splitlines()
49 else:
54 else:
50 fh = self.gitcmd("git rev-parse --verify %s" % self.rev)
55 heads, ret = self.gitread("git rev-parse --verify %s" % self.rev)
51 return [fh.read()[:-1]]
56 heads = [heads[:-1]]
57 if ret:
58 raise util.Abort(_('cannot retrieve git heads'))
59 return heads
52
60
53 def catfile(self, rev, type):
61 def catfile(self, rev, type):
54 if rev == "0" * 40:
62 if rev == "0" * 40:
55 raise IOError()
63 raise IOError()
56 fh = self.gitcmd("git cat-file %s %s" % (type, rev))
64 data, ret = self.gitread("git cat-file %s %s" % (type, rev))
57 return fh.read()
65 if ret:
66 raise util.Abort(_('cannot read %r object at %s') % (type, rev))
67 return data
58
68
59 def getfile(self, name, rev):
69 def getfile(self, name, rev):
60 return self.catfile(rev, "blob")
70 return self.catfile(rev, "blob")
@@ -64,7 +74,7 b' class convert_git(converter_source):'
64
74
65 def getchanges(self, version):
75 def getchanges(self, version):
66 self.modecache = {}
76 self.modecache = {}
67 fh = self.gitcmd("git diff-tree -z --root -m -r %s" % version)
77 fh = self.gitopen("git diff-tree -z --root -m -r %s" % version)
68 changes = []
78 changes = []
69 seen = set()
79 seen = set()
70 entry = None
80 entry = None
@@ -84,6 +94,8 b' class convert_git(converter_source):'
84 self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
94 self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
85 changes.append((f, h))
95 changes.append((f, h))
86 entry = None
96 entry = None
97 if fh.close():
98 raise util.Abort(_('cannot read changes in %s') % version)
87 return (changes, {})
99 return (changes, {})
88
100
89 def getcommit(self, version):
101 def getcommit(self, version):
@@ -123,7 +135,7 b' class convert_git(converter_source):'
123
135
124 def gettags(self):
136 def gettags(self):
125 tags = {}
137 tags = {}
126 fh = self.gitcmd('git ls-remote --tags "%s"' % self.path)
138 fh = self.gitopen('git ls-remote --tags "%s"' % self.path)
127 prefix = 'refs/tags/'
139 prefix = 'refs/tags/'
128 for line in fh:
140 for line in fh:
129 line = line.strip()
141 line = line.strip()
@@ -134,23 +146,25 b' class convert_git(converter_source):'
134 continue
146 continue
135 tag = tag[len(prefix):-3]
147 tag = tag[len(prefix):-3]
136 tags[tag] = node
148 tags[tag] = node
149 if fh.close():
150 raise util.Abort(_('cannot read tags from %s') % self.path)
137
151
138 return tags
152 return tags
139
153
140 def getchangedfiles(self, version, i):
154 def getchangedfiles(self, version, i):
141 changes = []
155 changes = []
142 if i is None:
156 if i is None:
143 fh = self.gitcmd("git diff-tree --root -m -r %s" % version)
157 fh = self.gitopen("git diff-tree --root -m -r %s" % version)
144 for l in fh:
158 for l in fh:
145 if "\t" not in l:
159 if "\t" not in l:
146 continue
160 continue
147 m, f = l[:-1].split("\t")
161 m, f = l[:-1].split("\t")
148 changes.append(f)
162 changes.append(f)
149 fh.close()
150 else:
163 else:
151 fh = self.gitcmd('git diff-tree --name-only --root -r %s "%s^%s" --'
164 fh = self.gitopen('git diff-tree --name-only --root -r %s "%s^%s" --'
152 % (version, version, i + 1))
165 % (version, version, i + 1))
153 changes = [f.rstrip('\n') for f in fh]
166 changes = [f.rstrip('\n') for f in fh]
154 fh.close()
167 if fh.close():
168 raise util.Abort(_('cannot read changes in %s') % version)
155
169
156 return changes
170 return changes
@@ -170,4 +170,17 b' hg -R git-repo4-hg log -v'
170 echo '% --sourceorder should fail'
170 echo '% --sourceorder should fail'
171 hg convert --sourcesort git-repo4 git-repo4-sourcesort-hg
171 hg convert --sourcesort git-repo4 git-repo4-sourcesort-hg
172
172
173 echo '% damage git repository and convert again'
174 cat > damage.py <<EOF
175 import os
176 for root, dirs, files in os.walk('git-repo4/.git/objects'):
177 if files:
178 path = os.path.join(root, files[0])
179 os.remove(path)
180 break
181 EOF
182 python damage.py
183 hg convert git-repo4 git-repo4-broken-hg 2>&1 | \
184 sed 's/fatal:.*/fatal: git error/g'
185
173 true
186 true
@@ -127,3 +127,11 b' addfoo'
127 % --sourceorder should fail
127 % --sourceorder should fail
128 initializing destination git-repo4-sourcesort-hg repository
128 initializing destination git-repo4-sourcesort-hg repository
129 abort: --sourcesort is not supported by this data source
129 abort: --sourcesort is not supported by this data source
130 % damage git repository and convert again
131 fatal: git error
132 initializing destination git-repo4-broken-hg repository
133 scanning source...
134 sorting...
135 converting...
136 1 addfoo
137 abort: cannot read changes in 6a101ac3f6d8b2524a64295ffd9be87ed927bfeb
General Comments 0
You need to be logged in to leave comments. Login now