##// END OF EJS Templates
git: a little pycompat.bytestring() love to make this code work in py3...
Augie Fackler -
r41516:1c894365 default draft
parent child Browse files
Show More
@@ -1,747 +1,748 b''
1 test-abort-checkin.t
1 test-abort-checkin.t
2 test-absorb-edit-lines.t
2 test-absorb-edit-lines.t
3 test-absorb-filefixupstate.py
3 test-absorb-filefixupstate.py
4 test-absorb-phase.t
4 test-absorb-phase.t
5 test-absorb-rename.t
5 test-absorb-rename.t
6 test-absorb-strip.t
6 test-absorb-strip.t
7 test-absorb.t
7 test-absorb.t
8 test-add.t
8 test-add.t
9 test-addremove-similar.t
9 test-addremove-similar.t
10 test-addremove.t
10 test-addremove.t
11 test-alias.t
11 test-alias.t
12 test-amend-subrepo.t
12 test-amend-subrepo.t
13 test-amend.t
13 test-amend.t
14 test-ancestor.py
14 test-ancestor.py
15 test-annotate.py
15 test-annotate.py
16 test-annotate.t
16 test-annotate.t
17 test-arbitraryfilectx.t
17 test-arbitraryfilectx.t
18 test-archive-symlinks.t
18 test-archive-symlinks.t
19 test-archive.t
19 test-archive.t
20 test-atomictempfile.py
20 test-atomictempfile.py
21 test-audit-path.t
21 test-audit-path.t
22 test-audit-subrepo.t
22 test-audit-subrepo.t
23 test-automv.t
23 test-automv.t
24 test-backout.t
24 test-backout.t
25 test-backwards-remove.t
25 test-backwards-remove.t
26 test-bad-extension.t
26 test-bad-extension.t
27 test-bad-pull.t
27 test-bad-pull.t
28 test-basic.t
28 test-basic.t
29 test-batching.py
29 test-batching.py
30 test-bdiff.py
30 test-bdiff.py
31 test-bheads.t
31 test-bheads.t
32 test-bisect.t
32 test-bisect.t
33 test-bisect2.t
33 test-bisect2.t
34 test-bisect3.t
34 test-bisect3.t
35 test-blackbox.t
35 test-blackbox.t
36 test-bookflow.t
36 test-bookflow.t
37 test-bookmarks-current.t
37 test-bookmarks-current.t
38 test-bookmarks-merge.t
38 test-bookmarks-merge.t
39 test-bookmarks-pushpull.t
39 test-bookmarks-pushpull.t
40 test-bookmarks-rebase.t
40 test-bookmarks-rebase.t
41 test-bookmarks-strip.t
41 test-bookmarks-strip.t
42 test-bookmarks.t
42 test-bookmarks.t
43 test-branch-change.t
43 test-branch-change.t
44 test-branch-option.t
44 test-branch-option.t
45 test-branch-tag-confict.t
45 test-branch-tag-confict.t
46 test-branches.t
46 test-branches.t
47 test-bugzilla.t
47 test-bugzilla.t
48 test-bundle-phases.t
48 test-bundle-phases.t
49 test-bundle-r.t
49 test-bundle-r.t
50 test-bundle-type.t
50 test-bundle-type.t
51 test-bundle-vs-outgoing.t
51 test-bundle-vs-outgoing.t
52 test-bundle.t
52 test-bundle.t
53 test-bundle2-exchange.t
53 test-bundle2-exchange.t
54 test-bundle2-format.t
54 test-bundle2-format.t
55 test-bundle2-multiple-changegroups.t
55 test-bundle2-multiple-changegroups.t
56 test-bundle2-pushback.t
56 test-bundle2-pushback.t
57 test-bundle2-remote-changegroup.t
57 test-bundle2-remote-changegroup.t
58 test-cache-abuse.t
58 test-cache-abuse.t
59 test-cappedreader.py
59 test-cappedreader.py
60 test-casecollision-merge.t
60 test-casecollision-merge.t
61 test-casecollision.t
61 test-casecollision.t
62 test-casefolding.t
62 test-casefolding.t
63 test-cat.t
63 test-cat.t
64 test-cbor.py
64 test-cbor.py
65 test-censor.t
65 test-censor.t
66 test-changelog-exec.t
66 test-changelog-exec.t
67 test-check-code.t
67 test-check-code.t
68 test-check-commit.t
68 test-check-commit.t
69 test-check-config.py
69 test-check-config.py
70 test-check-config.t
70 test-check-config.t
71 test-check-execute.t
71 test-check-execute.t
72 test-check-help.t
72 test-check-help.t
73 test-check-interfaces.py
73 test-check-interfaces.py
74 test-check-module-imports.t
74 test-check-module-imports.t
75 test-check-py3-compat.t
75 test-check-py3-compat.t
76 test-check-pyflakes.t
76 test-check-pyflakes.t
77 test-check-pylint.t
77 test-check-pylint.t
78 test-check-shbang.t
78 test-check-shbang.t
79 test-children.t
79 test-children.t
80 test-churn.t
80 test-churn.t
81 test-clone-cgi.t
81 test-clone-cgi.t
82 test-clone-pull-corruption.t
82 test-clone-pull-corruption.t
83 test-clone-r.t
83 test-clone-r.t
84 test-clone-uncompressed.t
84 test-clone-uncompressed.t
85 test-clone-update-order.t
85 test-clone-update-order.t
86 test-clone.t
86 test-clone.t
87 test-clonebundles.t
87 test-clonebundles.t
88 test-close-head.t
88 test-close-head.t
89 test-commandserver.t
89 test-commandserver.t
90 test-commit-amend.t
90 test-commit-amend.t
91 test-commit-interactive.t
91 test-commit-interactive.t
92 test-commit-multiple.t
92 test-commit-multiple.t
93 test-commit-unresolved.t
93 test-commit-unresolved.t
94 test-commit.t
94 test-commit.t
95 test-committer.t
95 test-committer.t
96 test-completion.t
96 test-completion.t
97 test-config-env.py
97 test-config-env.py
98 test-config.t
98 test-config.t
99 test-conflict.t
99 test-conflict.t
100 test-confused-revert.t
100 test-confused-revert.t
101 test-context-metadata.t
101 test-context-metadata.t
102 test-context.py
102 test-context.py
103 test-contrib-check-code.t
103 test-contrib-check-code.t
104 test-contrib-check-commit.t
104 test-contrib-check-commit.t
105 test-contrib-dumprevlog.t
105 test-contrib-dumprevlog.t
106 test-contrib-perf.t
106 test-contrib-perf.t
107 test-contrib-relnotes.t
107 test-contrib-relnotes.t
108 test-contrib-testparseutil.t
108 test-contrib-testparseutil.t
109 test-contrib.t
109 test-contrib.t
110 test-convert-authormap.t
110 test-convert-authormap.t
111 test-convert-clonebranches.t
111 test-convert-clonebranches.t
112 test-convert-cvs-branch.t
112 test-convert-cvs-branch.t
113 test-convert-cvs-detectmerge.t
113 test-convert-cvs-detectmerge.t
114 test-convert-cvs-synthetic.t
114 test-convert-cvs-synthetic.t
115 test-convert-cvs.t
115 test-convert-cvs.t
116 test-convert-cvsnt-mergepoints.t
116 test-convert-cvsnt-mergepoints.t
117 test-convert-datesort.t
117 test-convert-datesort.t
118 test-convert-filemap.t
118 test-convert-filemap.t
119 test-convert-git.t
119 test-convert-hg-sink.t
120 test-convert-hg-sink.t
120 test-convert-hg-source.t
121 test-convert-hg-source.t
121 test-convert-hg-startrev.t
122 test-convert-hg-startrev.t
122 test-convert-splicemap.t
123 test-convert-splicemap.t
123 test-convert-svn-sink.t
124 test-convert-svn-sink.t
124 test-convert-tagsbranch-topology.t
125 test-convert-tagsbranch-topology.t
125 test-convert.t
126 test-convert.t
126 test-copy-move-merge.t
127 test-copy-move-merge.t
127 test-copy.t
128 test-copy.t
128 test-copytrace-heuristics.t
129 test-copytrace-heuristics.t
129 test-custom-filters.t
130 test-custom-filters.t
130 test-debugbuilddag.t
131 test-debugbuilddag.t
131 test-debugbundle.t
132 test-debugbundle.t
132 test-debugcommands.t
133 test-debugcommands.t
133 test-debugextensions.t
134 test-debugextensions.t
134 test-debugindexdot.t
135 test-debugindexdot.t
135 test-debugrename.t
136 test-debugrename.t
136 test-default-push.t
137 test-default-push.t
137 test-diff-antipatience.t
138 test-diff-antipatience.t
138 test-diff-binary-file.t
139 test-diff-binary-file.t
139 test-diff-change.t
140 test-diff-change.t
140 test-diff-color.t
141 test-diff-color.t
141 test-diff-copy-depth.t
142 test-diff-copy-depth.t
142 test-diff-hashes.t
143 test-diff-hashes.t
143 test-diff-ignore-whitespace.t
144 test-diff-ignore-whitespace.t
144 test-diff-indent-heuristic.t
145 test-diff-indent-heuristic.t
145 test-diff-issue2761.t
146 test-diff-issue2761.t
146 test-diff-newlines.t
147 test-diff-newlines.t
147 test-diff-reverse.t
148 test-diff-reverse.t
148 test-diff-subdir.t
149 test-diff-subdir.t
149 test-diff-unified.t
150 test-diff-unified.t
150 test-diff-upgrade.t
151 test-diff-upgrade.t
151 test-diffdir.t
152 test-diffdir.t
152 test-diffstat.t
153 test-diffstat.t
153 test-directaccess.t
154 test-directaccess.t
154 test-dirstate-backup.t
155 test-dirstate-backup.t
155 test-dirstate-nonnormalset.t
156 test-dirstate-nonnormalset.t
156 test-dirstate-race.t
157 test-dirstate-race.t
157 test-dirstate.t
158 test-dirstate.t
158 test-dispatch.py
159 test-dispatch.py
159 test-dispatch.t
160 test-dispatch.t
160 test-doctest.py
161 test-doctest.py
161 test-double-merge.t
162 test-double-merge.t
162 test-drawdag.t
163 test-drawdag.t
163 test-duplicateoptions.py
164 test-duplicateoptions.py
164 test-editor-filename.t
165 test-editor-filename.t
165 test-empty-dir.t
166 test-empty-dir.t
166 test-empty-file.t
167 test-empty-file.t
167 test-empty-group.t
168 test-empty-group.t
168 test-empty.t
169 test-empty.t
169 test-encode.t
170 test-encode.t
170 test-encoding-align.t
171 test-encoding-align.t
171 test-encoding-func.py
172 test-encoding-func.py
172 test-encoding-textwrap.t
173 test-encoding-textwrap.t
173 test-encoding.t
174 test-encoding.t
174 test-eol-add.t
175 test-eol-add.t
175 test-eol-clone.t
176 test-eol-clone.t
176 test-eol-hook.t
177 test-eol-hook.t
177 test-eol-patch.t
178 test-eol-patch.t
178 test-eol-tag.t
179 test-eol-tag.t
179 test-eol-update.t
180 test-eol-update.t
180 test-eol.t
181 test-eol.t
181 test-eolfilename.t
182 test-eolfilename.t
182 test-excessive-merge.t
183 test-excessive-merge.t
183 test-exchange-obsmarkers-case-A1.t
184 test-exchange-obsmarkers-case-A1.t
184 test-exchange-obsmarkers-case-A2.t
185 test-exchange-obsmarkers-case-A2.t
185 test-exchange-obsmarkers-case-A3.t
186 test-exchange-obsmarkers-case-A3.t
186 test-exchange-obsmarkers-case-A4.t
187 test-exchange-obsmarkers-case-A4.t
187 test-exchange-obsmarkers-case-A5.t
188 test-exchange-obsmarkers-case-A5.t
188 test-exchange-obsmarkers-case-A6.t
189 test-exchange-obsmarkers-case-A6.t
189 test-exchange-obsmarkers-case-A7.t
190 test-exchange-obsmarkers-case-A7.t
190 test-exchange-obsmarkers-case-B1.t
191 test-exchange-obsmarkers-case-B1.t
191 test-exchange-obsmarkers-case-B2.t
192 test-exchange-obsmarkers-case-B2.t
192 test-exchange-obsmarkers-case-B3.t
193 test-exchange-obsmarkers-case-B3.t
193 test-exchange-obsmarkers-case-B4.t
194 test-exchange-obsmarkers-case-B4.t
194 test-exchange-obsmarkers-case-B5.t
195 test-exchange-obsmarkers-case-B5.t
195 test-exchange-obsmarkers-case-B6.t
196 test-exchange-obsmarkers-case-B6.t
196 test-exchange-obsmarkers-case-B7.t
197 test-exchange-obsmarkers-case-B7.t
197 test-exchange-obsmarkers-case-C1.t
198 test-exchange-obsmarkers-case-C1.t
198 test-exchange-obsmarkers-case-C2.t
199 test-exchange-obsmarkers-case-C2.t
199 test-exchange-obsmarkers-case-C3.t
200 test-exchange-obsmarkers-case-C3.t
200 test-exchange-obsmarkers-case-C4.t
201 test-exchange-obsmarkers-case-C4.t
201 test-exchange-obsmarkers-case-D1.t
202 test-exchange-obsmarkers-case-D1.t
202 test-exchange-obsmarkers-case-D2.t
203 test-exchange-obsmarkers-case-D2.t
203 test-exchange-obsmarkers-case-D3.t
204 test-exchange-obsmarkers-case-D3.t
204 test-exchange-obsmarkers-case-D4.t
205 test-exchange-obsmarkers-case-D4.t
205 test-execute-bit.t
206 test-execute-bit.t
206 test-export.t
207 test-export.t
207 test-extdata.t
208 test-extdata.t
208 test-extdiff.t
209 test-extdiff.t
209 test-extension-timing.t
210 test-extension-timing.t
210 test-extensions-afterloaded.t
211 test-extensions-afterloaded.t
211 test-extensions-wrapfunction.py
212 test-extensions-wrapfunction.py
212 test-extra-filelog-entry.t
213 test-extra-filelog-entry.t
213 test-fastannotate-corrupt.t
214 test-fastannotate-corrupt.t
214 test-fastannotate-diffopts.t
215 test-fastannotate-diffopts.t
215 test-fastannotate-hg.t
216 test-fastannotate-hg.t
216 test-fastannotate-perfhack.t
217 test-fastannotate-perfhack.t
217 test-fastannotate-protocol.t
218 test-fastannotate-protocol.t
218 test-fastannotate-renames.t
219 test-fastannotate-renames.t
219 test-fastannotate-revmap.py
220 test-fastannotate-revmap.py
220 test-fastannotate.t
221 test-fastannotate.t
221 test-fetch.t
222 test-fetch.t
222 test-filebranch.t
223 test-filebranch.t
223 test-filecache.py
224 test-filecache.py
224 test-filelog.py
225 test-filelog.py
225 test-fileset-generated.t
226 test-fileset-generated.t
226 test-fileset.t
227 test-fileset.t
227 test-fix-topology.t
228 test-fix-topology.t
228 test-fix.t
229 test-fix.t
229 test-flags.t
230 test-flags.t
230 test-fncache.t
231 test-fncache.t
231 test-gendoc-da.t
232 test-gendoc-da.t
232 test-gendoc-de.t
233 test-gendoc-de.t
233 test-gendoc-el.t
234 test-gendoc-el.t
234 test-gendoc-fr.t
235 test-gendoc-fr.t
235 test-gendoc-it.t
236 test-gendoc-it.t
236 test-gendoc-ja.t
237 test-gendoc-ja.t
237 test-gendoc-pt_BR.t
238 test-gendoc-pt_BR.t
238 test-gendoc-ro.t
239 test-gendoc-ro.t
239 test-gendoc-ru.t
240 test-gendoc-ru.t
240 test-gendoc-sv.t
241 test-gendoc-sv.t
241 test-gendoc-zh_CN.t
242 test-gendoc-zh_CN.t
242 test-gendoc-zh_TW.t
243 test-gendoc-zh_TW.t
243 test-gendoc.t
244 test-gendoc.t
244 test-generaldelta.t
245 test-generaldelta.t
245 test-getbundle.t
246 test-getbundle.t
246 test-git-export.t
247 test-git-export.t
247 test-githelp.t
248 test-githelp.t
248 test-globalopts.t
249 test-globalopts.t
249 test-glog-beautifygraph.t
250 test-glog-beautifygraph.t
250 test-glog-topological.t
251 test-glog-topological.t
251 test-glog.t
252 test-glog.t
252 test-gpg.t
253 test-gpg.t
253 test-graft.t
254 test-graft.t
254 test-grep.t
255 test-grep.t
255 test-hardlinks.t
256 test-hardlinks.t
256 test-help-hide.t
257 test-help-hide.t
257 test-help.t
258 test-help.t
258 test-hg-parseurl.py
259 test-hg-parseurl.py
259 test-hghave.t
260 test-hghave.t
260 test-hgignore.t
261 test-hgignore.t
261 test-hgk.t
262 test-hgk.t
262 test-hgrc.t
263 test-hgrc.t
263 test-hgweb-annotate-whitespace.t
264 test-hgweb-annotate-whitespace.t
264 test-hgweb-auth.py
265 test-hgweb-auth.py
265 test-hgweb-bundle.t
266 test-hgweb-bundle.t
266 test-hgweb-commands.t
267 test-hgweb-commands.t
267 test-hgweb-csp.t
268 test-hgweb-csp.t
268 test-hgweb-descend-empties.t
269 test-hgweb-descend-empties.t
269 test-hgweb-diffs.t
270 test-hgweb-diffs.t
270 test-hgweb-empty.t
271 test-hgweb-empty.t
271 test-hgweb-filelog.t
272 test-hgweb-filelog.t
272 test-hgweb-no-path-info.t
273 test-hgweb-no-path-info.t
273 test-hgweb-no-request-uri.t
274 test-hgweb-no-request-uri.t
274 test-hgweb-non-interactive.t
275 test-hgweb-non-interactive.t
275 test-hgweb-raw.t
276 test-hgweb-raw.t
276 test-hgweb-removed.t
277 test-hgweb-removed.t
277 test-hgweb-symrev.t
278 test-hgweb-symrev.t
278 test-hgweb.t
279 test-hgweb.t
279 test-hgwebdir-paths.py
280 test-hgwebdir-paths.py
280 test-hgwebdir.t
281 test-hgwebdir.t
281 test-hgwebdirsym.t
282 test-hgwebdirsym.t
282 test-histedit-arguments.t
283 test-histedit-arguments.t
283 test-histedit-base.t
284 test-histedit-base.t
284 test-histedit-bookmark-motion.t
285 test-histedit-bookmark-motion.t
285 test-histedit-commute.t
286 test-histedit-commute.t
286 test-histedit-drop.t
287 test-histedit-drop.t
287 test-histedit-edit.t
288 test-histedit-edit.t
288 test-histedit-fold-non-commute.t
289 test-histedit-fold-non-commute.t
289 test-histedit-fold.t
290 test-histedit-fold.t
290 test-histedit-no-backup.t
291 test-histedit-no-backup.t
291 test-histedit-no-change.t
292 test-histedit-no-change.t
292 test-histedit-non-commute-abort.t
293 test-histedit-non-commute-abort.t
293 test-histedit-non-commute.t
294 test-histedit-non-commute.t
294 test-histedit-obsolete.t
295 test-histedit-obsolete.t
295 test-histedit-outgoing.t
296 test-histedit-outgoing.t
296 test-histedit-templates.t
297 test-histedit-templates.t
297 test-http-api-httpv2.t
298 test-http-api-httpv2.t
298 test-http-api.t
299 test-http-api.t
299 test-http-bad-server.t
300 test-http-bad-server.t
300 test-http-branchmap.t
301 test-http-branchmap.t
301 test-http-bundle1.t
302 test-http-bundle1.t
302 test-http-clone-r.t
303 test-http-clone-r.t
303 test-http-permissions.t
304 test-http-permissions.t
304 test-http-protocol.t
305 test-http-protocol.t
305 test-http.t
306 test-http.t
306 test-hybridencode.py
307 test-hybridencode.py
307 test-i18n.t
308 test-i18n.t
308 test-identify.t
309 test-identify.t
309 test-impexp-branch.t
310 test-impexp-branch.t
310 test-import-bypass.t
311 test-import-bypass.t
311 test-import-context.t
312 test-import-context.t
312 test-import-eol.t
313 test-import-eol.t
313 test-import-merge.t
314 test-import-merge.t
314 test-import-unknown.t
315 test-import-unknown.t
315 test-import.t
316 test-import.t
316 test-imports-checker.t
317 test-imports-checker.t
317 test-incoming-outgoing.t
318 test-incoming-outgoing.t
318 test-infinitepush-bundlestore.t
319 test-infinitepush-bundlestore.t
319 test-infinitepush-ci.t
320 test-infinitepush-ci.t
320 test-infinitepush.t
321 test-infinitepush.t
321 test-inherit-mode.t
322 test-inherit-mode.t
322 test-init.t
323 test-init.t
323 test-install.t
324 test-install.t
324 test-issue1089.t
325 test-issue1089.t
325 test-issue1102.t
326 test-issue1102.t
326 test-issue1175.t
327 test-issue1175.t
327 test-issue1306.t
328 test-issue1306.t
328 test-issue1438.t
329 test-issue1438.t
329 test-issue1502.t
330 test-issue1502.t
330 test-issue1802.t
331 test-issue1802.t
331 test-issue1877.t
332 test-issue1877.t
332 test-issue1993.t
333 test-issue1993.t
333 test-issue2137.t
334 test-issue2137.t
334 test-issue3084.t
335 test-issue3084.t
335 test-issue4074.t
336 test-issue4074.t
336 test-issue522.t
337 test-issue522.t
337 test-issue586.t
338 test-issue586.t
338 test-issue5979.t
339 test-issue5979.t
339 test-issue612.t
340 test-issue612.t
340 test-issue619.t
341 test-issue619.t
341 test-issue660.t
342 test-issue660.t
342 test-issue672.t
343 test-issue672.t
343 test-issue842.t
344 test-issue842.t
344 test-journal-exists.t
345 test-journal-exists.t
345 test-journal-share.t
346 test-journal-share.t
346 test-journal.t
347 test-journal.t
347 test-keyword.t
348 test-keyword.t
348 test-known.t
349 test-known.t
349 test-largefiles-cache.t
350 test-largefiles-cache.t
350 test-largefiles-misc.t
351 test-largefiles-misc.t
351 test-largefiles-small-disk.t
352 test-largefiles-small-disk.t
352 test-largefiles-update.t
353 test-largefiles-update.t
353 test-largefiles-wireproto.t
354 test-largefiles-wireproto.t
354 test-largefiles.t
355 test-largefiles.t
355 test-lfconvert.t
356 test-lfconvert.t
356 test-lfs-bundle.t
357 test-lfs-bundle.t
357 test-lfs-largefiles.t
358 test-lfs-largefiles.t
358 test-lfs-pointer.py
359 test-lfs-pointer.py
359 test-lfs-test-server.t
360 test-lfs-test-server.t
360 test-lfs.t
361 test-lfs.t
361 test-linelog.py
362 test-linelog.py
362 test-linerange.py
363 test-linerange.py
363 test-locate.t
364 test-locate.t
364 test-lock-badness.t
365 test-lock-badness.t
365 test-log-exthook.t
366 test-log-exthook.t
366 test-log-linerange.t
367 test-log-linerange.t
367 test-log.t
368 test-log.t
368 test-logexchange.t
369 test-logexchange.t
369 test-logtoprocess.t
370 test-logtoprocess.t
370 test-lrucachedict.py
371 test-lrucachedict.py
371 test-mactext.t
372 test-mactext.t
372 test-mailmap.t
373 test-mailmap.t
373 test-manifest-merging.t
374 test-manifest-merging.t
374 test-manifest.py
375 test-manifest.py
375 test-manifest.t
376 test-manifest.t
376 test-match.py
377 test-match.py
377 test-mdiff.py
378 test-mdiff.py
378 test-merge-changedelete.t
379 test-merge-changedelete.t
379 test-merge-closedheads.t
380 test-merge-closedheads.t
380 test-merge-commit.t
381 test-merge-commit.t
381 test-merge-criss-cross.t
382 test-merge-criss-cross.t
382 test-merge-default.t
383 test-merge-default.t
383 test-merge-force.t
384 test-merge-force.t
384 test-merge-halt.t
385 test-merge-halt.t
385 test-merge-internal-tools-pattern.t
386 test-merge-internal-tools-pattern.t
386 test-merge-local.t
387 test-merge-local.t
387 test-merge-no-file-change.t
388 test-merge-no-file-change.t
388 test-merge-remove.t
389 test-merge-remove.t
389 test-merge-revert.t
390 test-merge-revert.t
390 test-merge-revert2.t
391 test-merge-revert2.t
391 test-merge-subrepos.t
392 test-merge-subrepos.t
392 test-merge-symlinks.t
393 test-merge-symlinks.t
393 test-merge-tools.t
394 test-merge-tools.t
394 test-merge-types.t
395 test-merge-types.t
395 test-merge1.t
396 test-merge1.t
396 test-merge10.t
397 test-merge10.t
397 test-merge2.t
398 test-merge2.t
398 test-merge4.t
399 test-merge4.t
399 test-merge5.t
400 test-merge5.t
400 test-merge6.t
401 test-merge6.t
401 test-merge7.t
402 test-merge7.t
402 test-merge8.t
403 test-merge8.t
403 test-merge9.t
404 test-merge9.t
404 test-minifileset.py
405 test-minifileset.py
405 test-minirst.py
406 test-minirst.py
406 test-missing-capability.t
407 test-missing-capability.t
407 test-mq-eol.t
408 test-mq-eol.t
408 test-mq-git.t
409 test-mq-git.t
409 test-mq-guards.t
410 test-mq-guards.t
410 test-mq-header-date.t
411 test-mq-header-date.t
411 test-mq-header-from.t
412 test-mq-header-from.t
412 test-mq-merge.t
413 test-mq-merge.t
413 test-mq-missingfiles.t
414 test-mq-missingfiles.t
414 test-mq-pull-from-bundle.t
415 test-mq-pull-from-bundle.t
415 test-mq-qclone-http.t
416 test-mq-qclone-http.t
416 test-mq-qdelete.t
417 test-mq-qdelete.t
417 test-mq-qdiff.t
418 test-mq-qdiff.t
418 test-mq-qfold.t
419 test-mq-qfold.t
419 test-mq-qgoto.t
420 test-mq-qgoto.t
420 test-mq-qimport-fail-cleanup.t
421 test-mq-qimport-fail-cleanup.t
421 test-mq-qimport.t
422 test-mq-qimport.t
422 test-mq-qnew.t
423 test-mq-qnew.t
423 test-mq-qpush-exact.t
424 test-mq-qpush-exact.t
424 test-mq-qpush-fail.t
425 test-mq-qpush-fail.t
425 test-mq-qqueue.t
426 test-mq-qqueue.t
426 test-mq-qrefresh-interactive.t
427 test-mq-qrefresh-interactive.t
427 test-mq-qrefresh-replace-log-message.t
428 test-mq-qrefresh-replace-log-message.t
428 test-mq-qrefresh.t
429 test-mq-qrefresh.t
429 test-mq-qrename.t
430 test-mq-qrename.t
430 test-mq-qsave.t
431 test-mq-qsave.t
431 test-mq-safety.t
432 test-mq-safety.t
432 test-mq-subrepo.t
433 test-mq-subrepo.t
433 test-mq-symlinks.t
434 test-mq-symlinks.t
434 test-mq.t
435 test-mq.t
435 test-mv-cp-st-diff.t
436 test-mv-cp-st-diff.t
436 test-narrow-acl.t
437 test-narrow-acl.t
437 test-narrow-archive.t
438 test-narrow-archive.t
438 test-narrow-clone-no-ellipsis.t
439 test-narrow-clone-no-ellipsis.t
439 test-narrow-clone-non-narrow-server.t
440 test-narrow-clone-non-narrow-server.t
440 test-narrow-clone-nonlinear.t
441 test-narrow-clone-nonlinear.t
441 test-narrow-clone-stream.t
442 test-narrow-clone-stream.t
442 test-narrow-clone.t
443 test-narrow-clone.t
443 test-narrow-commit.t
444 test-narrow-commit.t
444 test-narrow-copies.t
445 test-narrow-copies.t
445 test-narrow-debugcommands.t
446 test-narrow-debugcommands.t
446 test-narrow-debugrebuilddirstate.t
447 test-narrow-debugrebuilddirstate.t
447 test-narrow-exchange-merges.t
448 test-narrow-exchange-merges.t
448 test-narrow-exchange.t
449 test-narrow-exchange.t
449 test-narrow-expanddirstate.t
450 test-narrow-expanddirstate.t
450 test-narrow-merge.t
451 test-narrow-merge.t
451 test-narrow-patch.t
452 test-narrow-patch.t
452 test-narrow-patterns.t
453 test-narrow-patterns.t
453 test-narrow-pull.t
454 test-narrow-pull.t
454 test-narrow-rebase.t
455 test-narrow-rebase.t
455 test-narrow-shallow-merges.t
456 test-narrow-shallow-merges.t
456 test-narrow-shallow.t
457 test-narrow-shallow.t
457 test-narrow-share.t
458 test-narrow-share.t
458 test-narrow-sparse.t
459 test-narrow-sparse.t
459 test-narrow-strip.t
460 test-narrow-strip.t
460 test-narrow-trackedcmd.t
461 test-narrow-trackedcmd.t
461 test-narrow-update.t
462 test-narrow-update.t
462 test-narrow-widen-no-ellipsis.t
463 test-narrow-widen-no-ellipsis.t
463 test-narrow-widen.t
464 test-narrow-widen.t
464 test-narrow.t
465 test-narrow.t
465 test-nested-repo.t
466 test-nested-repo.t
466 test-newbranch.t
467 test-newbranch.t
467 test-newcgi.t
468 test-newcgi.t
468 test-newercgi.t
469 test-newercgi.t
469 test-nointerrupt.t
470 test-nointerrupt.t
470 test-notify-changegroup.t
471 test-notify-changegroup.t
471 test-obshistory.t
472 test-obshistory.t
472 test-obsmarker-template.t
473 test-obsmarker-template.t
473 test-obsmarkers-effectflag.t
474 test-obsmarkers-effectflag.t
474 test-obsolete-bounds-checking.t
475 test-obsolete-bounds-checking.t
475 test-obsolete-bundle-strip.t
476 test-obsolete-bundle-strip.t
476 test-obsolete-changeset-exchange.t
477 test-obsolete-changeset-exchange.t
477 test-obsolete-checkheads.t
478 test-obsolete-checkheads.t
478 test-obsolete-distributed.t
479 test-obsolete-distributed.t
479 test-obsolete-divergent.t
480 test-obsolete-divergent.t
480 test-obsolete-tag-cache.t
481 test-obsolete-tag-cache.t
481 test-obsolete.t
482 test-obsolete.t
482 test-oldcgi.t
483 test-oldcgi.t
483 test-origbackup-conflict.t
484 test-origbackup-conflict.t
484 test-pager-legacy.t
485 test-pager-legacy.t
485 test-pager.t
486 test-pager.t
486 test-parents.t
487 test-parents.t
487 test-parse-date.t
488 test-parse-date.t
488 test-parseindex.t
489 test-parseindex.t
489 test-parseindex2.py
490 test-parseindex2.py
490 test-patch-offset.t
491 test-patch-offset.t
491 test-patch.t
492 test-patch.t
492 test-patchbomb-bookmark.t
493 test-patchbomb-bookmark.t
493 test-patchbomb-tls.t
494 test-patchbomb-tls.t
494 test-patchbomb.t
495 test-patchbomb.t
495 test-pathconflicts-basic.t
496 test-pathconflicts-basic.t
496 test-pathconflicts-merge.t
497 test-pathconflicts-merge.t
497 test-pathconflicts-update.t
498 test-pathconflicts-update.t
498 test-pathencode.py
499 test-pathencode.py
499 test-pending.t
500 test-pending.t
500 test-permissions.t
501 test-permissions.t
501 test-phases-exchange.t
502 test-phases-exchange.t
502 test-phases.t
503 test-phases.t
503 test-profile.t
504 test-profile.t
504 test-progress.t
505 test-progress.t
505 test-propertycache.py
506 test-propertycache.py
506 test-pull-branch.t
507 test-pull-branch.t
507 test-pull-bundle.t
508 test-pull-bundle.t
508 test-pull-http.t
509 test-pull-http.t
509 test-pull-permission.t
510 test-pull-permission.t
510 test-pull-pull-corruption.t
511 test-pull-pull-corruption.t
511 test-pull-r.t
512 test-pull-r.t
512 test-pull-update.t
513 test-pull-update.t
513 test-pull.t
514 test-pull.t
514 test-purge.t
515 test-purge.t
515 test-push-cgi.t
516 test-push-cgi.t
516 test-push-checkheads-partial-C1.t
517 test-push-checkheads-partial-C1.t
517 test-push-checkheads-partial-C2.t
518 test-push-checkheads-partial-C2.t
518 test-push-checkheads-partial-C3.t
519 test-push-checkheads-partial-C3.t
519 test-push-checkheads-partial-C4.t
520 test-push-checkheads-partial-C4.t
520 test-push-checkheads-pruned-B1.t
521 test-push-checkheads-pruned-B1.t
521 test-push-checkheads-pruned-B2.t
522 test-push-checkheads-pruned-B2.t
522 test-push-checkheads-pruned-B3.t
523 test-push-checkheads-pruned-B3.t
523 test-push-checkheads-pruned-B4.t
524 test-push-checkheads-pruned-B4.t
524 test-push-checkheads-pruned-B5.t
525 test-push-checkheads-pruned-B5.t
525 test-push-checkheads-pruned-B6.t
526 test-push-checkheads-pruned-B6.t
526 test-push-checkheads-pruned-B7.t
527 test-push-checkheads-pruned-B7.t
527 test-push-checkheads-pruned-B8.t
528 test-push-checkheads-pruned-B8.t
528 test-push-checkheads-superceed-A1.t
529 test-push-checkheads-superceed-A1.t
529 test-push-checkheads-superceed-A2.t
530 test-push-checkheads-superceed-A2.t
530 test-push-checkheads-superceed-A3.t
531 test-push-checkheads-superceed-A3.t
531 test-push-checkheads-superceed-A4.t
532 test-push-checkheads-superceed-A4.t
532 test-push-checkheads-superceed-A5.t
533 test-push-checkheads-superceed-A5.t
533 test-push-checkheads-superceed-A6.t
534 test-push-checkheads-superceed-A6.t
534 test-push-checkheads-superceed-A7.t
535 test-push-checkheads-superceed-A7.t
535 test-push-checkheads-superceed-A8.t
536 test-push-checkheads-superceed-A8.t
536 test-push-checkheads-unpushed-D1.t
537 test-push-checkheads-unpushed-D1.t
537 test-push-checkheads-unpushed-D2.t
538 test-push-checkheads-unpushed-D2.t
538 test-push-checkheads-unpushed-D3.t
539 test-push-checkheads-unpushed-D3.t
539 test-push-checkheads-unpushed-D4.t
540 test-push-checkheads-unpushed-D4.t
540 test-push-checkheads-unpushed-D5.t
541 test-push-checkheads-unpushed-D5.t
541 test-push-checkheads-unpushed-D6.t
542 test-push-checkheads-unpushed-D6.t
542 test-push-checkheads-unpushed-D7.t
543 test-push-checkheads-unpushed-D7.t
543 test-push-http.t
544 test-push-http.t
544 test-push-race.t
545 test-push-race.t
545 test-push-warn.t
546 test-push-warn.t
546 test-push.t
547 test-push.t
547 test-pushvars.t
548 test-pushvars.t
548 test-qrecord.t
549 test-qrecord.t
549 test-rebase-abort.t
550 test-rebase-abort.t
550 test-rebase-backup.t
551 test-rebase-backup.t
551 test-rebase-base-flag.t
552 test-rebase-base-flag.t
552 test-rebase-bookmarks.t
553 test-rebase-bookmarks.t
553 test-rebase-brute-force.t
554 test-rebase-brute-force.t
554 test-rebase-cache.t
555 test-rebase-cache.t
555 test-rebase-check-restore.t
556 test-rebase-check-restore.t
556 test-rebase-collapse.t
557 test-rebase-collapse.t
557 test-rebase-conflicts.t
558 test-rebase-conflicts.t
558 test-rebase-dest.t
559 test-rebase-dest.t
559 test-rebase-detach.t
560 test-rebase-detach.t
560 test-rebase-emptycommit.t
561 test-rebase-emptycommit.t
561 test-rebase-inmemory.t
562 test-rebase-inmemory.t
562 test-rebase-interruptions.t
563 test-rebase-interruptions.t
563 test-rebase-issue-noparam-single-rev.t
564 test-rebase-issue-noparam-single-rev.t
564 test-rebase-legacy.t
565 test-rebase-legacy.t
565 test-rebase-mq-skip.t
566 test-rebase-mq-skip.t
566 test-rebase-mq.t
567 test-rebase-mq.t
567 test-rebase-named-branches.t
568 test-rebase-named-branches.t
568 test-rebase-newancestor.t
569 test-rebase-newancestor.t
569 test-rebase-obsolete.t
570 test-rebase-obsolete.t
570 test-rebase-parameters.t
571 test-rebase-parameters.t
571 test-rebase-partial.t
572 test-rebase-partial.t
572 test-rebase-pull.t
573 test-rebase-pull.t
573 test-rebase-rename.t
574 test-rebase-rename.t
574 test-rebase-scenario-global.t
575 test-rebase-scenario-global.t
575 test-rebase-templates.t
576 test-rebase-templates.t
576 test-rebase-transaction.t
577 test-rebase-transaction.t
577 test-rebuildstate.t
578 test-rebuildstate.t
578 test-record.t
579 test-record.t
579 test-releasenotes-formatting.t
580 test-releasenotes-formatting.t
580 test-releasenotes-merging.t
581 test-releasenotes-merging.t
581 test-releasenotes-parsing.t
582 test-releasenotes-parsing.t
582 test-relink.t
583 test-relink.t
583 test-remotefilelog-bad-configs.t
584 test-remotefilelog-bad-configs.t
584 test-remotefilelog-bgprefetch.t
585 test-remotefilelog-bgprefetch.t
585 test-remotefilelog-blame.t
586 test-remotefilelog-blame.t
586 test-remotefilelog-bundle2.t
587 test-remotefilelog-bundle2.t
587 test-remotefilelog-bundles.t
588 test-remotefilelog-bundles.t
588 test-remotefilelog-cacheprocess.t
589 test-remotefilelog-cacheprocess.t
589 test-remotefilelog-clone-tree.t
590 test-remotefilelog-clone-tree.t
590 test-remotefilelog-clone.t
591 test-remotefilelog-clone.t
591 test-remotefilelog-datapack.py
592 test-remotefilelog-datapack.py
592 test-remotefilelog-gcrepack.t
593 test-remotefilelog-gcrepack.t
593 test-remotefilelog-histpack.py
594 test-remotefilelog-histpack.py
594 test-remotefilelog-http.t
595 test-remotefilelog-http.t
595 test-remotefilelog-keepset.t
596 test-remotefilelog-keepset.t
596 test-remotefilelog-local.t
597 test-remotefilelog-local.t
597 test-remotefilelog-log.t
598 test-remotefilelog-log.t
598 test-remotefilelog-partial-shallow.t
599 test-remotefilelog-partial-shallow.t
599 test-remotefilelog-permissions.t
600 test-remotefilelog-permissions.t
600 test-remotefilelog-permisssions.t
601 test-remotefilelog-permisssions.t
601 test-remotefilelog-prefetch.t
602 test-remotefilelog-prefetch.t
602 test-remotefilelog-pull-noshallow.t
603 test-remotefilelog-pull-noshallow.t
603 test-remotefilelog-share.t
604 test-remotefilelog-share.t
604 test-remotefilelog-sparse.t
605 test-remotefilelog-sparse.t
605 test-remotefilelog-tags.t
606 test-remotefilelog-tags.t
606 test-remotefilelog-wireproto.t
607 test-remotefilelog-wireproto.t
607 test-remove.t
608 test-remove.t
608 test-removeemptydirs.t
609 test-removeemptydirs.t
609 test-rename-after-merge.t
610 test-rename-after-merge.t
610 test-rename-dir-merge.t
611 test-rename-dir-merge.t
611 test-rename-merge1.t
612 test-rename-merge1.t
612 test-rename-merge2.t
613 test-rename-merge2.t
613 test-rename.t
614 test-rename.t
614 test-repair-strip.t
615 test-repair-strip.t
615 test-repo-compengines.t
616 test-repo-compengines.t
616 test-requires.t
617 test-requires.t
617 test-resolve.t
618 test-resolve.t
618 test-revert-flags.t
619 test-revert-flags.t
619 test-revert-interactive.t
620 test-revert-interactive.t
620 test-revert-unknown.t
621 test-revert-unknown.t
621 test-revert.t
622 test-revert.t
622 test-revisions.t
623 test-revisions.t
623 test-revlog-ancestry.py
624 test-revlog-ancestry.py
624 test-revlog-group-emptyiter.t
625 test-revlog-group-emptyiter.t
625 test-revlog-mmapindex.t
626 test-revlog-mmapindex.t
626 test-revlog-packentry.t
627 test-revlog-packentry.t
627 test-revlog-raw.py
628 test-revlog-raw.py
628 test-revlog-v2.t
629 test-revlog-v2.t
629 test-revlog.t
630 test-revlog.t
630 test-revset-dirstate-parents.t
631 test-revset-dirstate-parents.t
631 test-revset-legacy-lookup.t
632 test-revset-legacy-lookup.t
632 test-revset-outgoing.t
633 test-revset-outgoing.t
633 test-revset2.t
634 test-revset2.t
634 test-rollback.t
635 test-rollback.t
635 test-run-tests.py
636 test-run-tests.py
636 test-run-tests.t
637 test-run-tests.t
637 test-rust-ancestor.py
638 test-rust-ancestor.py
638 test-schemes.t
639 test-schemes.t
639 test-serve.t
640 test-serve.t
640 test-setdiscovery.t
641 test-setdiscovery.t
641 test-share.t
642 test-share.t
642 test-shelve.t
643 test-shelve.t
643 test-shelve2.t
644 test-shelve2.t
644 test-show-stack.t
645 test-show-stack.t
645 test-show-work.t
646 test-show-work.t
646 test-show.t
647 test-show.t
647 test-simple-update.t
648 test-simple-update.t
648 test-simplekeyvaluefile.py
649 test-simplekeyvaluefile.py
649 test-simplemerge.py
650 test-simplemerge.py
650 test-single-head.t
651 test-single-head.t
651 test-sparse-clear.t
652 test-sparse-clear.t
652 test-sparse-clone.t
653 test-sparse-clone.t
653 test-sparse-import.t
654 test-sparse-import.t
654 test-sparse-merges.t
655 test-sparse-merges.t
655 test-sparse-profiles.t
656 test-sparse-profiles.t
656 test-sparse-requirement.t
657 test-sparse-requirement.t
657 test-sparse-verbose-json.t
658 test-sparse-verbose-json.t
658 test-sparse.t
659 test-sparse.t
659 test-split.t
660 test-split.t
660 test-ssh-bundle1.t
661 test-ssh-bundle1.t
661 test-ssh-clone-r.t
662 test-ssh-clone-r.t
662 test-ssh-proto-unbundle.t
663 test-ssh-proto-unbundle.t
663 test-ssh-proto.t
664 test-ssh-proto.t
664 test-ssh-repoerror.t
665 test-ssh-repoerror.t
665 test-ssh.t
666 test-ssh.t
666 test-sshserver.py
667 test-sshserver.py
667 test-stack.t
668 test-stack.t
668 test-static-http.t
669 test-static-http.t
669 test-status-color.t
670 test-status-color.t
670 test-status-inprocess.py
671 test-status-inprocess.py
671 test-status-rev.t
672 test-status-rev.t
672 test-status-terse.t
673 test-status-terse.t
673 test-status.t
674 test-status.t
674 test-storage.py
675 test-storage.py
675 test-stream-bundle-v2.t
676 test-stream-bundle-v2.t
676 test-strict.t
677 test-strict.t
677 test-strip-cross.t
678 test-strip-cross.t
678 test-strip.t
679 test-strip.t
679 test-subrepo-deep-nested-change.t
680 test-subrepo-deep-nested-change.t
680 test-subrepo-missing.t
681 test-subrepo-missing.t
681 test-subrepo-paths.t
682 test-subrepo-paths.t
682 test-subrepo-recursion.t
683 test-subrepo-recursion.t
683 test-subrepo-relative-path.t
684 test-subrepo-relative-path.t
684 test-subrepo.t
685 test-subrepo.t
685 test-symlink-os-yes-fs-no.py
686 test-symlink-os-yes-fs-no.py
686 test-symlink-placeholder.t
687 test-symlink-placeholder.t
687 test-symlinks.t
688 test-symlinks.t
688 test-tag.t
689 test-tag.t
689 test-tags.t
690 test-tags.t
690 test-template-basic.t
691 test-template-basic.t
691 test-template-functions.t
692 test-template-functions.t
692 test-template-keywords.t
693 test-template-keywords.t
693 test-template-map.t
694 test-template-map.t
694 test-tools.t
695 test-tools.t
695 test-transplant.t
696 test-transplant.t
696 test-treediscovery-legacy.t
697 test-treediscovery-legacy.t
697 test-treediscovery.t
698 test-treediscovery.t
698 test-treemanifest.t
699 test-treemanifest.t
699 test-ui-color.py
700 test-ui-color.py
700 test-ui-config.py
701 test-ui-config.py
701 test-ui-verbosity.py
702 test-ui-verbosity.py
702 test-unamend.t
703 test-unamend.t
703 test-unbundlehash.t
704 test-unbundlehash.t
704 test-uncommit.t
705 test-uncommit.t
705 test-unified-test.t
706 test-unified-test.t
706 test-unionrepo.t
707 test-unionrepo.t
707 test-unrelated-pull.t
708 test-unrelated-pull.t
708 test-up-local-change.t
709 test-up-local-change.t
709 test-update-atomic.t
710 test-update-atomic.t
710 test-update-branches.t
711 test-update-branches.t
711 test-update-dest.t
712 test-update-dest.t
712 test-update-issue1456.t
713 test-update-issue1456.t
713 test-update-names.t
714 test-update-names.t
714 test-update-reverse.t
715 test-update-reverse.t
715 test-upgrade-repo.t
716 test-upgrade-repo.t
716 test-url-download.t
717 test-url-download.t
717 test-url-rev.t
718 test-url-rev.t
718 test-url.py
719 test-url.py
719 test-username-newline.t
720 test-username-newline.t
720 test-util.py
721 test-util.py
721 test-verify.t
722 test-verify.t
722 test-walk.t
723 test-walk.t
723 test-walkrepo.py
724 test-walkrepo.py
724 test-websub.t
725 test-websub.t
725 test-win32text.t
726 test-win32text.t
726 test-wireproto-caching.t
727 test-wireproto-caching.t
727 test-wireproto-clientreactor.py
728 test-wireproto-clientreactor.py
728 test-wireproto-command-branchmap.t
729 test-wireproto-command-branchmap.t
729 test-wireproto-command-capabilities.t
730 test-wireproto-command-capabilities.t
730 test-wireproto-command-changesetdata.t
731 test-wireproto-command-changesetdata.t
731 test-wireproto-command-filedata.t
732 test-wireproto-command-filedata.t
732 test-wireproto-command-filesdata.t
733 test-wireproto-command-filesdata.t
733 test-wireproto-command-heads.t
734 test-wireproto-command-heads.t
734 test-wireproto-command-known.t
735 test-wireproto-command-known.t
735 test-wireproto-command-listkeys.t
736 test-wireproto-command-listkeys.t
736 test-wireproto-command-lookup.t
737 test-wireproto-command-lookup.t
737 test-wireproto-command-manifestdata.t
738 test-wireproto-command-manifestdata.t
738 test-wireproto-command-pushkey.t
739 test-wireproto-command-pushkey.t
739 test-wireproto-command-rawstorefiledata.t
740 test-wireproto-command-rawstorefiledata.t
740 test-wireproto-content-redirects.t
741 test-wireproto-content-redirects.t
741 test-wireproto-exchangev2.t
742 test-wireproto-exchangev2.t
742 test-wireproto-framing.py
743 test-wireproto-framing.py
743 test-wireproto-serverreactor.py
744 test-wireproto-serverreactor.py
744 test-wireproto.py
745 test-wireproto.py
745 test-wireproto.t
746 test-wireproto.t
746 test-wsgirequest.py
747 test-wsgirequest.py
747 test-xdg.t
748 test-xdg.t
@@ -1,478 +1,480 b''
1 # git.py - git support for the convert extension
1 # git.py - git support for the convert extension
2 #
2 #
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7 from __future__ import absolute_import
7 from __future__ import absolute_import
8
8
9 import os
9 import os
10
10
11 from mercurial.i18n import _
11 from mercurial.i18n import _
12 from mercurial import (
12 from mercurial import (
13 config,
13 config,
14 error,
14 error,
15 node as nodemod,
15 node as nodemod,
16 pycompat,
16 )
17 )
17
18
18 from . import (
19 from . import (
19 common,
20 common,
20 )
21 )
21
22
22 class submodule(object):
23 class submodule(object):
23 def __init__(self, path, node, url):
24 def __init__(self, path, node, url):
24 self.path = path
25 self.path = path
25 self.node = node
26 self.node = node
26 self.url = url
27 self.url = url
27
28
28 def hgsub(self):
29 def hgsub(self):
29 return "%s = [git]%s" % (self.path, self.url)
30 return "%s = [git]%s" % (self.path, self.url)
30
31
31 def hgsubstate(self):
32 def hgsubstate(self):
32 return "%s %s" % (self.node, self.path)
33 return "%s %s" % (self.node, self.path)
33
34
34 # Keys in extra fields that should not be copied if the user requests.
35 # Keys in extra fields that should not be copied if the user requests.
35 bannedextrakeys = {
36 bannedextrakeys = {
36 # Git commit object built-ins.
37 # Git commit object built-ins.
37 'tree',
38 'tree',
38 'parent',
39 'parent',
39 'author',
40 'author',
40 'committer',
41 'committer',
41 # Mercurial built-ins.
42 # Mercurial built-ins.
42 'branch',
43 'branch',
43 'close',
44 'close',
44 }
45 }
45
46
46 class convert_git(common.converter_source, common.commandline):
47 class convert_git(common.converter_source, common.commandline):
47 # Windows does not support GIT_DIR= construct while other systems
48 # Windows does not support GIT_DIR= construct while other systems
48 # cannot remove environment variable. Just assume none have
49 # cannot remove environment variable. Just assume none have
49 # both issues.
50 # both issues.
50
51
51 def _gitcmd(self, cmd, *args, **kwargs):
52 def _gitcmd(self, cmd, *args, **kwargs):
52 return cmd('--git-dir=%s' % self.path, *args, **kwargs)
53 return cmd('--git-dir=%s' % self.path, *args, **kwargs)
53
54
54 def gitrun0(self, *args, **kwargs):
55 def gitrun0(self, *args, **kwargs):
55 return self._gitcmd(self.run0, *args, **kwargs)
56 return self._gitcmd(self.run0, *args, **kwargs)
56
57
57 def gitrun(self, *args, **kwargs):
58 def gitrun(self, *args, **kwargs):
58 return self._gitcmd(self.run, *args, **kwargs)
59 return self._gitcmd(self.run, *args, **kwargs)
59
60
60 def gitrunlines0(self, *args, **kwargs):
61 def gitrunlines0(self, *args, **kwargs):
61 return self._gitcmd(self.runlines0, *args, **kwargs)
62 return self._gitcmd(self.runlines0, *args, **kwargs)
62
63
63 def gitrunlines(self, *args, **kwargs):
64 def gitrunlines(self, *args, **kwargs):
64 return self._gitcmd(self.runlines, *args, **kwargs)
65 return self._gitcmd(self.runlines, *args, **kwargs)
65
66
66 def gitpipe(self, *args, **kwargs):
67 def gitpipe(self, *args, **kwargs):
67 return self._gitcmd(self._run3, *args, **kwargs)
68 return self._gitcmd(self._run3, *args, **kwargs)
68
69
69 def __init__(self, ui, repotype, path, revs=None):
70 def __init__(self, ui, repotype, path, revs=None):
70 super(convert_git, self).__init__(ui, repotype, path, revs=revs)
71 super(convert_git, self).__init__(ui, repotype, path, revs=revs)
71 common.commandline.__init__(self, ui, 'git')
72 common.commandline.__init__(self, ui, 'git')
72
73
73 # Pass an absolute path to git to prevent from ever being interpreted
74 # Pass an absolute path to git to prevent from ever being interpreted
74 # as a URL
75 # as a URL
75 path = os.path.abspath(path)
76 path = os.path.abspath(path)
76
77
77 if os.path.isdir(path + "/.git"):
78 if os.path.isdir(path + "/.git"):
78 path += "/.git"
79 path += "/.git"
79 if not os.path.exists(path + "/objects"):
80 if not os.path.exists(path + "/objects"):
80 raise common.NoRepo(_("%s does not look like a Git repository") %
81 raise common.NoRepo(_("%s does not look like a Git repository") %
81 path)
82 path)
82
83
83 # The default value (50) is based on the default for 'git diff'.
84 # The default value (50) is based on the default for 'git diff'.
84 similarity = ui.configint('convert', 'git.similarity')
85 similarity = ui.configint('convert', 'git.similarity')
85 if similarity < 0 or similarity > 100:
86 if similarity < 0 or similarity > 100:
86 raise error.Abort(_('similarity must be between 0 and 100'))
87 raise error.Abort(_('similarity must be between 0 and 100'))
87 if similarity > 0:
88 if similarity > 0:
88 self.simopt = ['-C%d%%' % similarity]
89 self.simopt = ['-C%d%%' % similarity]
89 findcopiesharder = ui.configbool('convert', 'git.findcopiesharder')
90 findcopiesharder = ui.configbool('convert', 'git.findcopiesharder')
90 if findcopiesharder:
91 if findcopiesharder:
91 self.simopt.append('--find-copies-harder')
92 self.simopt.append('--find-copies-harder')
92
93
93 renamelimit = ui.configint('convert', 'git.renamelimit')
94 renamelimit = ui.configint('convert', 'git.renamelimit')
94 self.simopt.append('-l%d' % renamelimit)
95 self.simopt.append('-l%d' % renamelimit)
95 else:
96 else:
96 self.simopt = []
97 self.simopt = []
97
98
98 common.checktool('git', 'git')
99 common.checktool('git', 'git')
99
100
100 self.path = path
101 self.path = path
101 self.submodules = []
102 self.submodules = []
102
103
103 self.catfilepipe = self.gitpipe('cat-file', '--batch')
104 self.catfilepipe = self.gitpipe('cat-file', '--batch')
104
105
105 self.copyextrakeys = self.ui.configlist('convert', 'git.extrakeys')
106 self.copyextrakeys = self.ui.configlist('convert', 'git.extrakeys')
106 banned = set(self.copyextrakeys) & bannedextrakeys
107 banned = set(self.copyextrakeys) & bannedextrakeys
107 if banned:
108 if banned:
108 raise error.Abort(_('copying of extra key is forbidden: %s') %
109 raise error.Abort(_('copying of extra key is forbidden: %s') %
109 _(', ').join(sorted(banned)))
110 _(', ').join(sorted(banned)))
110
111
111 committeractions = self.ui.configlist('convert', 'git.committeractions')
112 committeractions = self.ui.configlist('convert', 'git.committeractions')
112
113
113 messagedifferent = None
114 messagedifferent = None
114 messagealways = None
115 messagealways = None
115 for a in committeractions:
116 for a in committeractions:
116 if a.startswith(('messagedifferent', 'messagealways')):
117 if a.startswith(('messagedifferent', 'messagealways')):
117 k = a
118 k = a
118 v = None
119 v = None
119 if '=' in a:
120 if '=' in a:
120 k, v = a.split('=', 1)
121 k, v = a.split('=', 1)
121
122
122 if k == 'messagedifferent':
123 if k == 'messagedifferent':
123 messagedifferent = v or 'committer:'
124 messagedifferent = v or 'committer:'
124 elif k == 'messagealways':
125 elif k == 'messagealways':
125 messagealways = v or 'committer:'
126 messagealways = v or 'committer:'
126
127
127 if messagedifferent and messagealways:
128 if messagedifferent and messagealways:
128 raise error.Abort(_('committeractions cannot define both '
129 raise error.Abort(_('committeractions cannot define both '
129 'messagedifferent and messagealways'))
130 'messagedifferent and messagealways'))
130
131
131 dropcommitter = 'dropcommitter' in committeractions
132 dropcommitter = 'dropcommitter' in committeractions
132 replaceauthor = 'replaceauthor' in committeractions
133 replaceauthor = 'replaceauthor' in committeractions
133
134
134 if dropcommitter and replaceauthor:
135 if dropcommitter and replaceauthor:
135 raise error.Abort(_('committeractions cannot define both '
136 raise error.Abort(_('committeractions cannot define both '
136 'dropcommitter and replaceauthor'))
137 'dropcommitter and replaceauthor'))
137
138
138 if dropcommitter and messagealways:
139 if dropcommitter and messagealways:
139 raise error.Abort(_('committeractions cannot define both '
140 raise error.Abort(_('committeractions cannot define both '
140 'dropcommitter and messagealways'))
141 'dropcommitter and messagealways'))
141
142
142 if not messagedifferent and not messagealways:
143 if not messagedifferent and not messagealways:
143 messagedifferent = 'committer:'
144 messagedifferent = 'committer:'
144
145
145 self.committeractions = {
146 self.committeractions = {
146 'dropcommitter': dropcommitter,
147 'dropcommitter': dropcommitter,
147 'replaceauthor': replaceauthor,
148 'replaceauthor': replaceauthor,
148 'messagedifferent': messagedifferent,
149 'messagedifferent': messagedifferent,
149 'messagealways': messagealways,
150 'messagealways': messagealways,
150 }
151 }
151
152
152 def after(self):
153 def after(self):
153 for f in self.catfilepipe:
154 for f in self.catfilepipe:
154 f.close()
155 f.close()
155
156
156 def getheads(self):
157 def getheads(self):
157 if not self.revs:
158 if not self.revs:
158 output, status = self.gitrun('rev-parse', '--branches', '--remotes')
159 output, status = self.gitrun('rev-parse', '--branches', '--remotes')
159 heads = output.splitlines()
160 heads = output.splitlines()
160 if status:
161 if status:
161 raise error.Abort(_('cannot retrieve git heads'))
162 raise error.Abort(_('cannot retrieve git heads'))
162 else:
163 else:
163 heads = []
164 heads = []
164 for rev in self.revs:
165 for rev in self.revs:
165 rawhead, ret = self.gitrun('rev-parse', '--verify', rev)
166 rawhead, ret = self.gitrun('rev-parse', '--verify', rev)
166 heads.append(rawhead[:-1])
167 heads.append(rawhead[:-1])
167 if ret:
168 if ret:
168 raise error.Abort(_('cannot retrieve git head "%s"') % rev)
169 raise error.Abort(_('cannot retrieve git head "%s"') % rev)
169 return heads
170 return heads
170
171
171 def catfile(self, rev, ftype):
172 def catfile(self, rev, ftype):
172 if rev == nodemod.nullhex:
173 if rev == nodemod.nullhex:
173 raise IOError
174 raise IOError
174 self.catfilepipe[0].write(rev+'\n')
175 self.catfilepipe[0].write(rev+'\n')
175 self.catfilepipe[0].flush()
176 self.catfilepipe[0].flush()
176 info = self.catfilepipe[1].readline().split()
177 info = self.catfilepipe[1].readline().split()
177 if info[1] != ftype:
178 if info[1] != ftype:
178 raise error.Abort(_('cannot read %r object at %s') % (ftype, rev))
179 raise error.Abort(_('cannot read %r object at %s') % (
180 pycompat.bytestr(ftype), rev))
179 size = int(info[2])
181 size = int(info[2])
180 data = self.catfilepipe[1].read(size)
182 data = self.catfilepipe[1].read(size)
181 if len(data) < size:
183 if len(data) < size:
182 raise error.Abort(_('cannot read %r object at %s: unexpected size')
184 raise error.Abort(_('cannot read %r object at %s: unexpected size')
183 % (ftype, rev))
185 % (ftype, rev))
184 # read the trailing newline
186 # read the trailing newline
185 self.catfilepipe[1].read(1)
187 self.catfilepipe[1].read(1)
186 return data
188 return data
187
189
188 def getfile(self, name, rev):
190 def getfile(self, name, rev):
189 if rev == nodemod.nullhex:
191 if rev == nodemod.nullhex:
190 return None, None
192 return None, None
191 if name == '.hgsub':
193 if name == '.hgsub':
192 data = '\n'.join([m.hgsub() for m in self.submoditer()])
194 data = '\n'.join([m.hgsub() for m in self.submoditer()])
193 mode = ''
195 mode = ''
194 elif name == '.hgsubstate':
196 elif name == '.hgsubstate':
195 data = '\n'.join([m.hgsubstate() for m in self.submoditer()])
197 data = '\n'.join([m.hgsubstate() for m in self.submoditer()])
196 mode = ''
198 mode = ''
197 else:
199 else:
198 data = self.catfile(rev, "blob")
200 data = self.catfile(rev, "blob")
199 mode = self.modecache[(name, rev)]
201 mode = self.modecache[(name, rev)]
200 return data, mode
202 return data, mode
201
203
202 def submoditer(self):
204 def submoditer(self):
203 null = nodemod.nullhex
205 null = nodemod.nullhex
204 for m in sorted(self.submodules, key=lambda p: p.path):
206 for m in sorted(self.submodules, key=lambda p: p.path):
205 if m.node != null:
207 if m.node != null:
206 yield m
208 yield m
207
209
208 def parsegitmodules(self, content):
210 def parsegitmodules(self, content):
209 """Parse the formatted .gitmodules file, example file format:
211 """Parse the formatted .gitmodules file, example file format:
210 [submodule "sub"]\n
212 [submodule "sub"]\n
211 \tpath = sub\n
213 \tpath = sub\n
212 \turl = git://giturl\n
214 \turl = git://giturl\n
213 """
215 """
214 self.submodules = []
216 self.submodules = []
215 c = config.config()
217 c = config.config()
216 # Each item in .gitmodules starts with whitespace that cant be parsed
218 # Each item in .gitmodules starts with whitespace that cant be parsed
217 c.parse('.gitmodules', '\n'.join(line.strip() for line in
219 c.parse('.gitmodules', '\n'.join(line.strip() for line in
218 content.split('\n')))
220 content.split('\n')))
219 for sec in c.sections():
221 for sec in c.sections():
220 s = c[sec]
222 s = c[sec]
221 if 'url' in s and 'path' in s:
223 if 'url' in s and 'path' in s:
222 self.submodules.append(submodule(s['path'], '', s['url']))
224 self.submodules.append(submodule(s['path'], '', s['url']))
223
225
224 def retrievegitmodules(self, version):
226 def retrievegitmodules(self, version):
225 modules, ret = self.gitrun('show', '%s:%s' % (version, '.gitmodules'))
227 modules, ret = self.gitrun('show', '%s:%s' % (version, '.gitmodules'))
226 if ret:
228 if ret:
227 # This can happen if a file is in the repo that has permissions
229 # This can happen if a file is in the repo that has permissions
228 # 160000, but there is no .gitmodules file.
230 # 160000, but there is no .gitmodules file.
229 self.ui.warn(_("warning: cannot read submodules config file in "
231 self.ui.warn(_("warning: cannot read submodules config file in "
230 "%s\n") % version)
232 "%s\n") % version)
231 return
233 return
232
234
233 try:
235 try:
234 self.parsegitmodules(modules)
236 self.parsegitmodules(modules)
235 except error.ParseError:
237 except error.ParseError:
236 self.ui.warn(_("warning: unable to parse .gitmodules in %s\n")
238 self.ui.warn(_("warning: unable to parse .gitmodules in %s\n")
237 % version)
239 % version)
238 return
240 return
239
241
240 for m in self.submodules:
242 for m in self.submodules:
241 node, ret = self.gitrun('rev-parse', '%s:%s' % (version, m.path))
243 node, ret = self.gitrun('rev-parse', '%s:%s' % (version, m.path))
242 if ret:
244 if ret:
243 continue
245 continue
244 m.node = node.strip()
246 m.node = node.strip()
245
247
246 def getchanges(self, version, full):
248 def getchanges(self, version, full):
247 if full:
249 if full:
248 raise error.Abort(_("convert from git does not support --full"))
250 raise error.Abort(_("convert from git does not support --full"))
249 self.modecache = {}
251 self.modecache = {}
250 cmd = ['diff-tree','-z', '--root', '-m', '-r'] + self.simopt + [version]
252 cmd = ['diff-tree','-z', '--root', '-m', '-r'] + self.simopt + [version]
251 output, status = self.gitrun(*cmd)
253 output, status = self.gitrun(*cmd)
252 if status:
254 if status:
253 raise error.Abort(_('cannot read changes in %s') % version)
255 raise error.Abort(_('cannot read changes in %s') % version)
254 changes = []
256 changes = []
255 copies = {}
257 copies = {}
256 seen = set()
258 seen = set()
257 entry = None
259 entry = None
258 subexists = [False]
260 subexists = [False]
259 subdeleted = [False]
261 subdeleted = [False]
260 difftree = output.split('\x00')
262 difftree = output.split('\x00')
261 lcount = len(difftree)
263 lcount = len(difftree)
262 i = 0
264 i = 0
263
265
264 skipsubmodules = self.ui.configbool('convert', 'git.skipsubmodules')
266 skipsubmodules = self.ui.configbool('convert', 'git.skipsubmodules')
265 def add(entry, f, isdest):
267 def add(entry, f, isdest):
266 seen.add(f)
268 seen.add(f)
267 h = entry[3]
269 h = entry[3]
268 p = (entry[1] == "100755")
270 p = (entry[1] == "100755")
269 s = (entry[1] == "120000")
271 s = (entry[1] == "120000")
270 renamesource = (not isdest and entry[4][0] == 'R')
272 renamesource = (not isdest and entry[4][0] == 'R')
271
273
272 if f == '.gitmodules':
274 if f == '.gitmodules':
273 if skipsubmodules:
275 if skipsubmodules:
274 return
276 return
275
277
276 subexists[0] = True
278 subexists[0] = True
277 if entry[4] == 'D' or renamesource:
279 if entry[4] == 'D' or renamesource:
278 subdeleted[0] = True
280 subdeleted[0] = True
279 changes.append(('.hgsub', nodemod.nullhex))
281 changes.append(('.hgsub', nodemod.nullhex))
280 else:
282 else:
281 changes.append(('.hgsub', ''))
283 changes.append(('.hgsub', ''))
282 elif entry[1] == '160000' or entry[0] == ':160000':
284 elif entry[1] == '160000' or entry[0] == ':160000':
283 if not skipsubmodules:
285 if not skipsubmodules:
284 subexists[0] = True
286 subexists[0] = True
285 else:
287 else:
286 if renamesource:
288 if renamesource:
287 h = nodemod.nullhex
289 h = nodemod.nullhex
288 self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
290 self.modecache[(f, h)] = (p and "x") or (s and "l") or ""
289 changes.append((f, h))
291 changes.append((f, h))
290
292
291 while i < lcount:
293 while i < lcount:
292 l = difftree[i]
294 l = difftree[i]
293 i += 1
295 i += 1
294 if not entry:
296 if not entry:
295 if not l.startswith(':'):
297 if not l.startswith(':'):
296 continue
298 continue
297 entry = l.split()
299 entry = tuple(pycompat.bytestr(p) for p in l.split())
298 continue
300 continue
299 f = l
301 f = l
300 if entry[4][0] == 'C':
302 if entry[4][0] == 'C':
301 copysrc = f
303 copysrc = f
302 copydest = difftree[i]
304 copydest = difftree[i]
303 i += 1
305 i += 1
304 f = copydest
306 f = copydest
305 copies[copydest] = copysrc
307 copies[copydest] = copysrc
306 if f not in seen:
308 if f not in seen:
307 add(entry, f, False)
309 add(entry, f, False)
308 # A file can be copied multiple times, or modified and copied
310 # A file can be copied multiple times, or modified and copied
309 # simultaneously. So f can be repeated even if fdest isn't.
311 # simultaneously. So f can be repeated even if fdest isn't.
310 if entry[4][0] == 'R':
312 if entry[4][0] == 'R':
311 # rename: next line is the destination
313 # rename: next line is the destination
312 fdest = difftree[i]
314 fdest = difftree[i]
313 i += 1
315 i += 1
314 if fdest not in seen:
316 if fdest not in seen:
315 add(entry, fdest, True)
317 add(entry, fdest, True)
316 # .gitmodules isn't imported at all, so it being copied to
318 # .gitmodules isn't imported at all, so it being copied to
317 # and fro doesn't really make sense
319 # and fro doesn't really make sense
318 if f != '.gitmodules' and fdest != '.gitmodules':
320 if f != '.gitmodules' and fdest != '.gitmodules':
319 copies[fdest] = f
321 copies[fdest] = f
320 entry = None
322 entry = None
321
323
322 if subexists[0]:
324 if subexists[0]:
323 if subdeleted[0]:
325 if subdeleted[0]:
324 changes.append(('.hgsubstate', nodemod.nullhex))
326 changes.append(('.hgsubstate', nodemod.nullhex))
325 else:
327 else:
326 self.retrievegitmodules(version)
328 self.retrievegitmodules(version)
327 changes.append(('.hgsubstate', ''))
329 changes.append(('.hgsubstate', ''))
328 return (changes, copies, set())
330 return (changes, copies, set())
329
331
330 def getcommit(self, version):
332 def getcommit(self, version):
331 c = self.catfile(version, "commit") # read the commit hash
333 c = self.catfile(version, "commit") # read the commit hash
332 end = c.find("\n\n")
334 end = c.find("\n\n")
333 message = c[end + 2:]
335 message = c[end + 2:]
334 message = self.recode(message)
336 message = self.recode(message)
335 l = c[:end].splitlines()
337 l = c[:end].splitlines()
336 parents = []
338 parents = []
337 author = committer = None
339 author = committer = None
338 extra = {}
340 extra = {}
339 for e in l[1:]:
341 for e in l[1:]:
340 n, v = e.split(" ", 1)
342 n, v = e.split(" ", 1)
341 if n == "author":
343 if n == "author":
342 p = v.split()
344 p = v.split()
343 tm, tz = p[-2:]
345 tm, tz = p[-2:]
344 author = " ".join(p[:-2])
346 author = " ".join(p[:-2])
345 if author[0] == "<":
347 if author[0] == "<":
346 author = author[1:-1]
348 author = author[1:-1]
347 author = self.recode(author)
349 author = self.recode(author)
348 if n == "committer":
350 if n == "committer":
349 p = v.split()
351 p = v.split()
350 tm, tz = p[-2:]
352 tm, tz = p[-2:]
351 committer = " ".join(p[:-2])
353 committer = " ".join(p[:-2])
352 if committer[0] == "<":
354 if committer[0] == "<":
353 committer = committer[1:-1]
355 committer = committer[1:-1]
354 committer = self.recode(committer)
356 committer = self.recode(committer)
355 if n == "parent":
357 if n == "parent":
356 parents.append(v)
358 parents.append(v)
357 if n in self.copyextrakeys:
359 if n in self.copyextrakeys:
358 extra[n] = v
360 extra[n] = v
359
361
360 if self.committeractions['dropcommitter']:
362 if self.committeractions['dropcommitter']:
361 committer = None
363 committer = None
362 elif self.committeractions['replaceauthor']:
364 elif self.committeractions['replaceauthor']:
363 author = committer
365 author = committer
364
366
365 if committer:
367 if committer:
366 messagealways = self.committeractions['messagealways']
368 messagealways = self.committeractions['messagealways']
367 messagedifferent = self.committeractions['messagedifferent']
369 messagedifferent = self.committeractions['messagedifferent']
368 if messagealways:
370 if messagealways:
369 message += '\n%s %s\n' % (messagealways, committer)
371 message += '\n%s %s\n' % (messagealways, committer)
370 elif messagedifferent and author != committer:
372 elif messagedifferent and author != committer:
371 message += '\n%s %s\n' % (messagedifferent, committer)
373 message += '\n%s %s\n' % (messagedifferent, committer)
372
374
373 tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
375 tzs, tzh, tzm = tz[-5:-4] + "1", tz[-4:-2], tz[-2:]
374 tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
376 tz = -int(tzs) * (int(tzh) * 3600 + int(tzm))
375 date = tm + " " + (b"%d" % tz)
377 date = tm + " " + (b"%d" % tz)
376 saverev = self.ui.configbool('convert', 'git.saverev')
378 saverev = self.ui.configbool('convert', 'git.saverev')
377
379
378 c = common.commit(parents=parents, date=date, author=author,
380 c = common.commit(parents=parents, date=date, author=author,
379 desc=message,
381 desc=message,
380 rev=version,
382 rev=version,
381 extra=extra,
383 extra=extra,
382 saverev=saverev)
384 saverev=saverev)
383 return c
385 return c
384
386
385 def numcommits(self):
387 def numcommits(self):
386 output, ret = self.gitrunlines('rev-list', '--all')
388 output, ret = self.gitrunlines('rev-list', '--all')
387 if ret:
389 if ret:
388 raise error.Abort(_('cannot retrieve number of commits in %s') \
390 raise error.Abort(_('cannot retrieve number of commits in %s') \
389 % self.path)
391 % self.path)
390 return len(output)
392 return len(output)
391
393
392 def gettags(self):
394 def gettags(self):
393 tags = {}
395 tags = {}
394 alltags = {}
396 alltags = {}
395 output, status = self.gitrunlines('ls-remote', '--tags', self.path)
397 output, status = self.gitrunlines('ls-remote', '--tags', self.path)
396
398
397 if status:
399 if status:
398 raise error.Abort(_('cannot read tags from %s') % self.path)
400 raise error.Abort(_('cannot read tags from %s') % self.path)
399 prefix = 'refs/tags/'
401 prefix = 'refs/tags/'
400
402
401 # Build complete list of tags, both annotated and bare ones
403 # Build complete list of tags, both annotated and bare ones
402 for line in output:
404 for line in output:
403 line = line.strip()
405 line = line.strip()
404 if line.startswith("error:") or line.startswith("fatal:"):
406 if line.startswith("error:") or line.startswith("fatal:"):
405 raise error.Abort(_('cannot read tags from %s') % self.path)
407 raise error.Abort(_('cannot read tags from %s') % self.path)
406 node, tag = line.split(None, 1)
408 node, tag = line.split(None, 1)
407 if not tag.startswith(prefix):
409 if not tag.startswith(prefix):
408 continue
410 continue
409 alltags[tag[len(prefix):]] = node
411 alltags[tag[len(prefix):]] = node
410
412
411 # Filter out tag objects for annotated tag refs
413 # Filter out tag objects for annotated tag refs
412 for tag in alltags:
414 for tag in alltags:
413 if tag.endswith('^{}'):
415 if tag.endswith('^{}'):
414 tags[tag[:-3]] = alltags[tag]
416 tags[tag[:-3]] = alltags[tag]
415 else:
417 else:
416 if tag + '^{}' in alltags:
418 if tag + '^{}' in alltags:
417 continue
419 continue
418 else:
420 else:
419 tags[tag] = alltags[tag]
421 tags[tag] = alltags[tag]
420
422
421 return tags
423 return tags
422
424
423 def getchangedfiles(self, version, i):
425 def getchangedfiles(self, version, i):
424 changes = []
426 changes = []
425 if i is None:
427 if i is None:
426 output, status = self.gitrunlines('diff-tree', '--root', '-m',
428 output, status = self.gitrunlines('diff-tree', '--root', '-m',
427 '-r', version)
429 '-r', version)
428 if status:
430 if status:
429 raise error.Abort(_('cannot read changes in %s') % version)
431 raise error.Abort(_('cannot read changes in %s') % version)
430 for l in output:
432 for l in output:
431 if "\t" not in l:
433 if "\t" not in l:
432 continue
434 continue
433 m, f = l[:-1].split("\t")
435 m, f = l[:-1].split("\t")
434 changes.append(f)
436 changes.append(f)
435 else:
437 else:
436 output, status = self.gitrunlines('diff-tree', '--name-only',
438 output, status = self.gitrunlines('diff-tree', '--name-only',
437 '--root', '-r', version,
439 '--root', '-r', version,
438 '%s^%d' % (version, i + 1), '--')
440 '%s^%d' % (version, i + 1), '--')
439 if status:
441 if status:
440 raise error.Abort(_('cannot read changes in %s') % version)
442 raise error.Abort(_('cannot read changes in %s') % version)
441 changes = [f.rstrip('\n') for f in output]
443 changes = [f.rstrip('\n') for f in output]
442
444
443 return changes
445 return changes
444
446
445 def getbookmarks(self):
447 def getbookmarks(self):
446 bookmarks = {}
448 bookmarks = {}
447
449
448 # Handle local and remote branches
450 # Handle local and remote branches
449 remoteprefix = self.ui.config('convert', 'git.remoteprefix')
451 remoteprefix = self.ui.config('convert', 'git.remoteprefix')
450 reftypes = [
452 reftypes = [
451 # (git prefix, hg prefix)
453 # (git prefix, hg prefix)
452 ('refs/remotes/origin/', remoteprefix + '/'),
454 ('refs/remotes/origin/', remoteprefix + '/'),
453 ('refs/heads/', '')
455 ('refs/heads/', '')
454 ]
456 ]
455
457
456 exclude = {
458 exclude = {
457 'refs/remotes/origin/HEAD',
459 'refs/remotes/origin/HEAD',
458 }
460 }
459
461
460 try:
462 try:
461 output, status = self.gitrunlines('show-ref')
463 output, status = self.gitrunlines('show-ref')
462 for line in output:
464 for line in output:
463 line = line.strip()
465 line = line.strip()
464 rev, name = line.split(None, 1)
466 rev, name = line.split(None, 1)
465 # Process each type of branch
467 # Process each type of branch
466 for gitprefix, hgprefix in reftypes:
468 for gitprefix, hgprefix in reftypes:
467 if not name.startswith(gitprefix) or name in exclude:
469 if not name.startswith(gitprefix) or name in exclude:
468 continue
470 continue
469 name = '%s%s' % (hgprefix, name[len(gitprefix):])
471 name = '%s%s' % (hgprefix, name[len(gitprefix):])
470 bookmarks[name] = rev
472 bookmarks[name] = rev
471 except Exception:
473 except Exception:
472 pass
474 pass
473
475
474 return bookmarks
476 return bookmarks
475
477
476 def checkrevformat(self, revstr, mapname='splicemap'):
478 def checkrevformat(self, revstr, mapname='splicemap'):
477 """ git revision string is a 40 byte hex """
479 """ git revision string is a 40 byte hex """
478 self.checkhexformat(revstr, mapname)
480 self.checkhexformat(revstr, mapname)
General Comments 0
You need to be logged in to leave comments. Login now