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 git |
|
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 git |
|
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 |
|
|
52 | heads, ret = self.gitread('git rev-parse --branches --remotes') | |
48 |
|
|
53 | heads = heads.splitlines() | |
49 | else: |
|
54 | else: | |
50 |
|
|
55 | heads, ret = self.gitread("git rev-parse --verify %s" % self.rev) | |
51 |
|
|
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 |
|
|
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.git |
|
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.git |
|
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.git |
|
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.git |
|
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 |
|
|
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