annotate hgext/convert/hg.py @ 30387:ca74c076710e

color: avoid shadowing a variable inside a list comprehension
author Augie Fackler <augie@google.com>
date Thu, 10 Nov 2016 16:32:51 -0500
parents 11b8b740d54a
children e59960ea8dcc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8250
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
1 # hg.py - hg backend for convert extension
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
2 #
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
4 #
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10086
diff changeset
6 # GNU General Public License version 2 or any later version.
3953
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3939
diff changeset
7
5556
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
8 # Notes for hg->hg conversion:
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
9 #
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
10 # * Old versions of Mercurial didn't trim the whitespace from the ends
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
11 # of commit messages, but new versions do. Changesets created by
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
12 # those older versions, then converted, may thus have different
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
13 # hashes for changesets that are otherwise identical.
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
14 #
8596
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
15 # * Using "--config convert.hg.saverev=true" will make the source
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
16 # identifier to be stored in the converted revision. This will cause
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
17 # the converted revision to have a different identity than the
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
18 # source.
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
19 from __future__ import absolute_import
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
20
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
21 import os
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
22 import re
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
23 import time
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
24
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28900
diff changeset
25 from mercurial.i18n import _
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
26 from mercurial import (
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
27 bookmarks,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
28 context,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
29 error,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
30 exchange,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
31 hg,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
32 lock as lockmod,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
33 merge as mergemod,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
34 node as nodemod,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
35 phases,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
36 scmutil,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
37 util,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
38 )
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
39 stringio = util.stringio
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
40
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
41 from . import common
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
42 mapfile = common.mapfile
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
43 NoRepo = common.NoRepo
3953
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3939
diff changeset
44
23972
c408bf3b32f8 convert: replace revision references in messages if they are >= short hashes
Mads Kiilerich <madski@unity3d.com>
parents: 23926
diff changeset
45 sha1re = re.compile(r'\b[0-9a-f]{12,40}\b')
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
46
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
47 class mercurial_sink(common.converter_sink):
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
48 def __init__(self, ui, path):
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
49 common.converter_sink.__init__(self, ui, path)
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
50 self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
51 self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
5260
be4835ad9a85 convert: new config variable hg.tagsbranch controls which branch tags are committed to
Brendan Cully <brendan@kublai.com>
parents: 5195
diff changeset
52 self.tagsbranch = ui.config('convert', 'hg.tagsbranch', 'default')
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
53 self.lastbranch = None
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
54 if os.path.isdir(path) and len(os.listdir(path)) > 0:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
55 try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
56 self.repo = hg.repository(self.ui, path)
5918
1716c8a0bd09 convert: mercurial sink must be local
Patrick Mezard <pmezard@gmail.com>
parents: 5522
diff changeset
57 if not self.repo.local():
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
58 raise NoRepo(_('%s is not a local Mercurial repository')
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
59 % path)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
60 except error.RepoError as err:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
61 ui.traceback()
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
62 raise NoRepo(err.args[0])
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
63 else:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
64 try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
65 ui.status(_('initializing destination %s repository\n') % path)
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
66 self.repo = hg.repository(self.ui, path, create=True)
5918
1716c8a0bd09 convert: mercurial sink must be local
Patrick Mezard <pmezard@gmail.com>
parents: 5522
diff changeset
67 if not self.repo.local():
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
68 raise NoRepo(_('%s is not a local Mercurial repository')
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
69 % path)
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
70 self.created.append(path)
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7874
diff changeset
71 except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
72 ui.traceback()
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
73 raise NoRepo(_("could not create hg repository %s as sink")
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
74 % path)
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
75 self.lock = None
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
76 self.wlock = None
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
77 self.filemapmode = False
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
78 self.subrevmaps = {}
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
79
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
80 def before(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
81 self.ui.debug('run hg sink pre-conversion action\n')
5052
a11e8a181bd5 convert: fix locking order
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5038
diff changeset
82 self.wlock = self.repo.wlock()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
83 self.lock = self.repo.lock()
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
84
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
85 def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
86 self.ui.debug('run hg sink post-conversion action\n')
10086
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
87 if self.lock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
88 self.lock.release()
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
89 if self.wlock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
90 self.wlock.release()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
91
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
92 def revmapfile(self):
15069
650d81a313cb convert: use repo.join instead of referencing ".hg" directly
Martin Geisler <mg@aragost.com>
parents: 14556
diff changeset
93 return self.repo.join("shamap")
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
94
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
95 def authorfile(self):
15069
650d81a313cb convert: use repo.join instead of referencing ".hg" directly
Martin Geisler <mg@aragost.com>
parents: 14556
diff changeset
96 return self.repo.join("authormap")
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
97
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
98 def setbranch(self, branch, pbranches):
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
99 if not self.clonebranches:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
100 return
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
101
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
102 setbranch = (branch != self.lastbranch)
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
103 self.lastbranch = branch
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
104 if not branch:
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
105 branch = 'default'
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
106 pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches]
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
107 if pbranches:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
108 pbranch = pbranches[0][1]
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
109 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
110 pbranch = 'default'
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
111
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
112 branchpath = os.path.join(self.path, branch)
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
113 if setbranch:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
114 self.after()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
115 try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
116 self.repo = hg.repository(self.ui, branchpath)
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
117 except Exception:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
118 self.repo = hg.repository(self.ui, branchpath, create=True)
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
119 self.before()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
120
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
121 # pbranches may bring revisions from other branches (merge parents)
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
122 # Make sure we have them, or pull them.
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
123 missings = {}
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
124 for b in pbranches:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
125 try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
126 self.repo.lookup(b[0])
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
127 except Exception:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
128 missings.setdefault(b[1], []).append(b[0])
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5959
diff changeset
129
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
130 if missings:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
131 self.after()
18373
687ed69f6fdf convert: process missing branches in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 17922
diff changeset
132 for pbranch, heads in sorted(missings.iteritems()):
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
133 pbranchpath = os.path.join(self.path, pbranch)
14556
517e1d88bf7e hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents: 14151
diff changeset
134 prepo = hg.peer(self.ui, {}, pbranchpath)
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
135 self.ui.note(_('pulling from %s into %s\n') % (pbranch, branch))
22698
32a8ad782260 convert-hg: use localrepo.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22360
diff changeset
136 exchange.pull(self.repo, prepo,
32a8ad782260 convert-hg: use localrepo.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22360
diff changeset
137 [prepo.lookup(h) for h in heads])
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
138 self.before()
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
139
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
140 def _rewritetags(self, source, revmap, data):
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
141 fp = stringio()
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
142 for line in data.splitlines():
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
143 s = line.split(' ', 1)
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
144 if len(s) != 2:
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
145 continue
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
146 revid = revmap.get(source.lookuprev(s[0]))
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
147 if not revid:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
148 if s[0] == nodemod.nullhex:
25305
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
149 revid = s[0]
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
150 else:
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
151 continue
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
152 fp.write('%s %s\n' % (revid, s[1]))
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
153 return fp.getvalue()
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
154
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
155 def _rewritesubstate(self, source, data):
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
156 fp = stringio()
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
157 for line in data.splitlines():
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
158 s = line.split(' ', 1)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
159 if len(s) != 2:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
160 continue
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
161
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
162 revid = s[0]
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
163 subpath = s[1]
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
164 if revid != nodemod.nullhex:
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
165 revmap = self.subrevmaps.get(subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
166 if revmap is None:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
167 revmap = mapfile(self.ui,
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
168 self.repo.wjoin(subpath, '.hg/shamap'))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
169 self.subrevmaps[subpath] = revmap
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
170
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
171 # It is reasonable that one or more of the subrepos don't
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
172 # need to be converted, in which case they can be cloned
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
173 # into place instead of converted. Therefore, only warn
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
174 # once.
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
175 msg = _('no ".hgsubstate" updates will be made for "%s"\n')
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
176 if len(revmap) == 0:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
177 sub = self.repo.wvfs.reljoin(subpath, '.hg')
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
178
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
179 if self.repo.wvfs.exists(sub):
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
180 self.ui.warn(msg % subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
181
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
182 newid = revmap.get(revid)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
183 if not newid:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
184 if len(revmap) > 0:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
185 self.ui.warn(_("%s is missing from %s/.hg/shamap\n") %
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
186 (revid, subpath))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
187 else:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
188 revid = newid
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
189
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
190 fp.write('%s %s\n' % (revid, subpath))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
191
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
192 return fp.getvalue()
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
193
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
194 def _calculatemergedfiles(self, source, p1ctx, p2ctx):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
195 """Calculates the files from p2 that we need to pull in when merging p1
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
196 and p2, given that the merge is coming from the given source.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
197
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
198 This prevents us from losing files that only exist in the target p2 and
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
199 that don't come from the source repo (like if you're merging multiple
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
200 repositories together).
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
201 """
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
202 anc = [p1ctx.ancestor(p2ctx)]
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
203 # Calculate what files are coming from p2
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
204 actions, diverge, rename = mergemod.calculateupdates(
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
205 self.repo, p1ctx, p2ctx, anc,
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
206 True, # branchmerge
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
207 True, # force
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
208 False, # acceptremote
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
209 False, # followcopies
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
210 )
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
211
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
212 for file, (action, info, msg) in actions.iteritems():
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
213 if source.targetfilebelongstosource(file):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
214 # If the file belongs to the source repo, ignore the p2
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
215 # since it will be covered by the existing fileset.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
216 continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
217
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
218 # If the file requires actual merging, abort. We don't have enough
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
219 # context to resolve merges correctly.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
220 if action in ['m', 'dm', 'cd', 'dc']:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
221 raise error.Abort(_("unable to convert merge commit "
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
222 "since target parents do not merge cleanly (file "
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
223 "%s, parents %s and %s)") % (file, p1ctx,
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
224 p2ctx))
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
225 elif action == 'k':
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
226 # 'keep' means nothing changed from p1
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
227 continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
228 else:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
229 # Any other change means we want to take the p2 version
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
230 yield file
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
231
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
232 def putcommit(self, files, copies, parents, commit, source, revmap, full,
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
233 cleanp2):
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
234 files = dict(files)
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
235
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
236 def getfilectx(repo, memctx, f):
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
237 if p2ctx and f in p2files and f not in copies:
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
238 self.ui.debug('reusing %s from p2\n' % f)
26078
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
239 try:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
240 return p2ctx[f]
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
241 except error.ManifestLookupError:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
242 # If the file doesn't exist in p2, then we're syncing a
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
243 # delete, so just return None.
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
244 return None
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
245 try:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
246 v = files[f]
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
247 except KeyError:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
248 return None
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
249 data, mode = source.getfile(f, v)
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
250 if data is None:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
251 return None
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
252 if f == '.hgtags':
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
253 data = self._rewritetags(source, revmap, data)
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
254 if f == '.hgsubstate':
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
255 data = self._rewritesubstate(source, data)
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
256 return context.memfilectx(self.repo, f, data, 'l' in mode,
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
257 'x' in mode, copies.get(f))
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
258
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
259 pl = []
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
260 for p in parents:
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
261 if p not in pl:
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
262 pl.append(p)
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
263 parents = pl
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
264 nparents = len(parents)
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
265 if self.filemapmode and nparents == 1:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
266 m1node = self.repo.changelog.read(nodemod.bin(parents[0]))[0]
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
267 parent = parents[0]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
268
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
269 if len(parents) < 2:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
270 parents.append(nodemod.nullid)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
271 if len(parents) < 2:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
272 parents.append(nodemod.nullid)
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
273 p2 = parents.pop(0)
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
274
3954
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3953
diff changeset
275 text = commit.desc
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
276
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
277 sha1s = re.findall(sha1re, text)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
278 for sha1 in sha1s:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
279 oldrev = source.lookuprev(sha1)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
280 newrev = revmap.get(oldrev)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
281 if newrev is not None:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
282 text = text.replace(sha1, newrev[:len(sha1)])
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
283
5439
d0c67b52ac01 convert: make contents of "extra" dict available from sources, for sinks.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5437
diff changeset
284 extra = commit.extra.copy()
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
285
25750
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
286 sourcename = self.repo.ui.config('convert', 'hg.sourcename')
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
287 if sourcename:
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
288 extra['convert_source'] = sourcename
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
289
25589
273d94255e1e convert: update 'intermediate-source' in the destination's extras dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 25571
diff changeset
290 for label in ('source', 'transplant_source', 'rebase_source',
273d94255e1e convert: update 'intermediate-source' in the destination's extras dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 25571
diff changeset
291 'intermediate-source'):
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
292 node = extra.get(label)
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
293
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
294 if node is None:
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
295 continue
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
296
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
297 # Only transplant stores its reference in binary
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
298 if label == 'transplant_source':
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
299 node = nodemod.hex(node)
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
300
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
301 newrev = revmap.get(node)
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
302 if newrev is not None:
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
303 if label == 'transplant_source':
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
304 newrev = nodemod.bin(newrev)
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
305
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
306 extra[label] = newrev
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
307
5038
8f157190075e convert: add config option to turn off use of branch names
Bryan O'Sullivan <bos@serpentine.com>
parents: 5017
diff changeset
308 if self.branchnames and commit.branch:
4873
28b23b9073a8 convert: record the source revision in the changelog
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
309 extra['branch'] = commit.branch
25570
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
310 if commit.rev and commit.saverev:
4873
28b23b9073a8 convert: record the source revision in the changelog
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
311 extra['convert_revision'] = commit.rev
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4873
diff changeset
312
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
313 while parents:
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
314 p1 = p2
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
315 p2 = parents.pop(0)
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
316 p1ctx = self.repo[p1]
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
317 p2ctx = None
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
318 if p2 != nodemod.nullid:
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
319 p2ctx = self.repo[p2]
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
320 fileset = set(files)
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
321 if full:
22360
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
322 fileset.update(self.repo[p1])
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
323 fileset.update(self.repo[p2])
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
324
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
325 if p2ctx:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
326 p2files = set(cleanp2)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
327 for file in self._calculatemergedfiles(source, p1ctx, p2ctx):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
328 p2files.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
329 fileset.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
330
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
331 ctx = context.memctx(self.repo, (p1, p2), text, fileset,
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
332 getfilectx, commit.author, commit.date, extra)
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
333
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
334 # We won't know if the conversion changes the node until after the
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
335 # commit, so copy the source's phase for now.
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
336 self.repo.ui.setconfig('phases', 'new-commit',
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
337 phases.phasenames[commit.phase], 'convert')
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
338
27863
ed59ae8b025e with: use context manager for transaction in mercurial_sink
Bryan O'Sullivan <bryano@fb.com>
parents: 27719
diff changeset
339 with self.repo.transaction("convert") as tr:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
340 node = nodemod.hex(self.repo.commitctx(ctx))
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
341
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
342 # If the node value has changed, but the phase is lower than
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
343 # draft, set it back to draft since it hasn't been exposed
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
344 # anywhere.
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
345 if commit.rev != node:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
346 ctx = self.repo[node]
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
347 if ctx.phase() < phases.draft:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
348 phases.retractboundary(self.repo, tr, phases.draft,
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
349 [ctx.node()])
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
350
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
351 text = "(octopus merge fixup)\n"
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
352 p2 = node
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
353
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
354 if self.filemapmode and nparents == 1:
30375
11b8b740d54a manifest: remove last uses of repo.manifest
Durham Goode <durham@fb.com>
parents: 29205
diff changeset
355 man = self.repo.manifestlog._revlog
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
356 mnode = self.repo.changelog.read(nodemod.bin(p2))[0]
11673
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
357 closed = 'close' in commit.extra
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
358 if not closed and not man.cmp(m1node, man.revision(mnode)):
8611
ba42e3c6e602 convert: better feedback when filtering out empty revisions
Patrick Mezard <pmezard@gmail.com>
parents: 8596
diff changeset
359 self.ui.status(_("filtering out empty revision\n"))
15193
a84e3ed661cb convert: fix crazy rollback call, broken by recent rollback safety checks
Matt Mackall <mpm@selenic.com>
parents: 15069
diff changeset
360 self.repo.rollback(force=True)
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
361 return parent
1389
9b3ef6f3cef5 convert-repo: fix up octopus merge conversion
Matt Mackall <mpm@selenic.com>
parents: 1388
diff changeset
362 return p2
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
363
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
364 def puttags(self, tags):
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
365 try:
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
366 parentctx = self.repo[self.tagsbranch]
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
367 tagparent = parentctx.node()
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
368 except error.RepoError:
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
369 parentctx = None
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
370 tagparent = nodemod.nullid
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
371
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
372 oldlines = set()
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
373 for branch, heads in self.repo.branchmap().iteritems():
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
374 for h in heads:
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
375 if '.hgtags' in self.repo[h]:
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
376 oldlines.update(
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
377 set(self.repo[h]['.hgtags'].data().splitlines(True)))
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
378 oldlines = sorted(list(oldlines))
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
379
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
380 newlines = sorted([("%s %s\n" % (tags[tag], tag)) for tag in tags])
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
381 if newlines == oldlines:
9431
d1b135f2f415 convert: fix history topology when using hg.tagsbranch
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
382 return None, None
20377
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
383
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
384 # if the old and new tags match, then there is nothing to update
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
385 oldtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
386 newtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
387 for line in oldlines:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
388 s = line.strip().split(' ', 1)
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
389 if len(s) != 2:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
390 continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
391 oldtags.add(s[1])
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
392 for line in newlines:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
393 s = line.strip().split(' ', 1)
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
394 if len(s) != 2:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
395 continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
396 if s[1] not in oldtags:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
397 newtags.add(s[1].strip())
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
398
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
399 if not newtags:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
400 return None, None
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
401
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
402 data = "".join(newlines)
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
403 def getfilectx(repo, memctx, f):
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
404 return context.memfilectx(repo, f, data, False, False, None)
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
405
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
406 self.ui.status(_("updating tags\n"))
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
407 date = "%s 0" % int(time.mktime(time.gmtime()))
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
408 extra = {'branch': self.tagsbranch}
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
409 ctx = context.memctx(self.repo, (tagparent, None), "update tags",
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
410 [".hgtags"], getfilectx, "convert-repo", date,
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
411 extra)
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
412 node = self.repo.commitctx(ctx)
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
413 return nodemod.hex(node), nodemod.hex(tagparent)
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
414
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
415 def setfilemapmode(self, active):
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
416 self.filemapmode = active
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
417
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
418 def putbookmarks(self, updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
419 if not len(updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
420 return
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
421 wlock = lock = tr = None
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
422 try:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
423 wlock = self.repo.wlock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
424 lock = self.repo.lock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
425 tr = self.repo.transaction('bookmark')
26973
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
426 self.ui.status(_("updating bookmarks\n"))
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
427 destmarks = self.repo._bookmarks
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
428 for bookmark in updatedbookmark:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
429 destmarks[bookmark] = nodemod.bin(updatedbookmark[bookmark])
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
430 destmarks.recordchange(tr)
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
431 tr.close()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
432 finally:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
433 lockmod.release(lock, wlock, tr)
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
434
21635
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
435 def hascommitfrommap(self, rev):
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
436 # the exact semantics of clonebranches is unclear so we can't say no
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
437 return rev in self.repo or self.clonebranches
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
438
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21498
diff changeset
439 def hascommitforsplicemap(self, rev):
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
440 if rev not in self.repo and self.clonebranches:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
441 raise error.Abort(_('revision %s not found in destination '
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
442 'repository (lookups with clonebranches=true '
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
443 'are not implemented)') % rev)
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
444 return rev in self.repo
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
445
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
446 class mercurial_source(common.converter_source):
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
447 def __init__(self, ui, path, revs=None):
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
448 common.converter_source.__init__(self, ui, path, revs)
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
449 self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors', False)
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
450 self.ignored = set()
7815
bcd364b247ba convert: change hg.saverev default to False
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
451 self.saverev = ui.configbool('convert', 'hg.saverev', False)
5358
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
452 try:
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
453 self.repo = hg.repository(self.ui, path)
5437
4d34f8b12a9e convert: report errors more meaningfully if run with --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 5402
diff changeset
454 # try to provoke an exception if this isn't really a hg
4d34f8b12a9e convert: report errors more meaningfully if run with --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 5402
diff changeset
455 # repo, but some other bogus compatible-looking url
5522
f5345a2d2391 convert: make sure mercurial_source has a local hg repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5521
diff changeset
456 if not self.repo.local():
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
457 raise error.RepoError
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
458 except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
459 ui.traceback()
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
460 raise NoRepo(_("%s is not a local Mercurial repository") % path)
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
461 self.lastrev = None
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
462 self.lastctx = None
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
463 self._changescache = None, None
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
464 self.convertfp = None
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
465 # Restrict converted revisions to startrev descendants
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
466 startnode = ui.config('convert', 'hg.startrev')
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
467 hgrevs = ui.config('convert', 'hg.revs')
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
468 if hgrevs is None:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
469 if startnode is not None:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
470 try:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
471 startnode = self.repo.lookup(startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
472 except error.RepoError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
473 raise error.Abort(_('%s is not a valid start revision')
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
474 % startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
475 startrev = self.repo.changelog.rev(startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
476 children = {startnode: 1}
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
477 for r in self.repo.changelog.descendants([startrev]):
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
478 children[self.repo.changelog.node(r)] = 1
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
479 self.keep = children.__contains__
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
480 else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
481 self.keep = util.always
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
482 if revs:
26154
242853e14804 convert: remove restriction on multiple --rev in hg source
Durham Goode <durham@fb.com>
parents: 26078
diff changeset
483 self._heads = [self.repo[r].node() for r in revs]
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
484 else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
485 self._heads = self.repo.heads()
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
486 else:
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
487 if revs or startnode is not None:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
488 raise error.Abort(_('hg.revs cannot be combined with '
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
489 'hg.startrev or --rev'))
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
490 nodes = set()
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
491 parents = set()
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
492 for r in scmutil.revrange(self.repo, [hgrevs]):
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
493 ctx = self.repo[r]
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
494 nodes.add(ctx.node())
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
495 parents.update(p.node() for p in ctx.parents())
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
496 self.keep = nodes.__contains__
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
497 self._heads = nodes - parents
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
498
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
499 def _changectx(self, rev):
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
500 if self.lastrev != rev:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6717
diff changeset
501 self.lastctx = self.repo[rev]
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
502 self.lastrev = rev
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
503 return self.lastctx
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
504
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
505 def _parents(self, ctx):
9531
a2f36a082449 convert/hg: make parents() return changectx, not nodes
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
506 return [p for p in ctx.parents() if p and self.keep(p.node())]
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
507
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
508 def getheads(self):
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
509 return [nodemod.hex(h) for h in self._heads if self.keep(h)]
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
510
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
511 def getfile(self, name, rev):
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
512 try:
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
513 fctx = self._changectx(rev)[name]
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
514 return fctx.data(), fctx.flags()
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
515 except error.LookupError:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
516 return None, None
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
517
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
518 def _changedfiles(self, ctx1, ctx2):
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
519 ma, r = [], []
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
520 maappend = ma.append
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
521 rappend = r.append
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
522 d = ctx1.manifest().diff(ctx2.manifest())
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
523 for f, ((node1, flag1), (node2, flag2)) in d.iteritems():
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
524 if node2 is None:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
525 rappend(f)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
526 else:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
527 maappend(f)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
528 return ma, r
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
529
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
530 def getchanges(self, rev, full):
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
531 ctx = self._changectx(rev)
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
532 parents = self._parents(ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
533 if full or not parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
534 files = copyfiles = ctx.manifest()
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
535 if parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
536 if self._changescache[0] == rev:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
537 ma, r = self._changescache[1]
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
538 else:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
539 ma, r = self._changedfiles(parents[0], ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
540 if not full:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
541 files = ma + r
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
542 copyfiles = ma
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
543 # _getcopies() is also run for roots and before filtering so missing
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
544 # revlogs are detected early
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
545 copies = self._getcopies(ctx, parents, copyfiles)
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
546 cleanp2 = set()
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
547 if len(parents) == 2:
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
548 d = parents[1].manifest().diff(ctx.manifest(), clean=True)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
549 for f, value in d.iteritems():
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
550 if value is None:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
551 cleanp2.add(f)
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
552 changes = [(f, rev) for f in files if f not in self.ignored]
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
553 changes.sort()
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
554 return changes, copies, cleanp2
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
555
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
556 def _getcopies(self, ctx, parents, files):
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
557 copies = {}
5280
11e1e574da02 convert: mercurial_source: also search for copies in modified files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5279
diff changeset
558 for name in files:
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
559 if name in self.ignored:
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
560 continue
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
561 try:
19457
948df0f10ec1 convert: fix bad conversion of copies when hg.startrev is specified
Mads Kiilerich <madski@unity3d.com>
parents: 19120
diff changeset
562 copysource, _copynode = ctx.filectx(name).renamed()
948df0f10ec1 convert: fix bad conversion of copies when hg.startrev is specified
Mads Kiilerich <madski@unity3d.com>
parents: 19120
diff changeset
563 if copysource in self.ignored:
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
564 continue
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
565 # Ignore copy sources not in parent revisions
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
566 found = False
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
567 for p in parents:
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
568 if copysource in p:
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
569 found = True
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
570 break
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
571 if not found:
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
572 continue
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
573 copies[name] = copysource
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
574 except TypeError:
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
575 pass
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
576 except error.LookupError as e:
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
577 if not self.ignoreerrors:
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
578 raise
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
579 self.ignored.add(name)
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
580 self.ui.warn(_('ignoring: %s\n') % e)
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
581 return copies
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5131
diff changeset
582
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
583 def getcommit(self, rev):
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
584 ctx = self._changectx(rev)
28900
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
585 _parents = self._parents(ctx)
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
586 parents = [p.hex() for p in _parents]
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
587 optparents = [p.hex() for p in ctx.parents() if p and p not in _parents]
25570
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
588 crev = rev
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
589
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
590 return common.commit(author=ctx.user(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
591 date=util.datestr(ctx.date(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
592 '%Y-%m-%d %H:%M:%S %1%2'),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
593 desc=ctx.description(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
594 rev=crev,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
595 parents=parents,
28900
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
596 optparents=optparents,
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
597 branch=ctx.branch(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
598 extra=ctx.extra(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
599 sortkey=ctx.rev(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
600 saverev=self.saverev,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
601 phase=ctx.phase())
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
602
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
603 def gettags(self):
21498
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
604 # This will get written to .hgtags, filter non global tags out.
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
605 tags = [t for t in self.repo.tagslist()
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
606 if self.repo.tagtype(t[0]) == 'global']
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
607 return dict([(name, nodemod.hex(node)) for name, node in tags
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
608 if self.keep(node)])
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
609
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
610 def getchangedfiles(self, rev, i):
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
611 ctx = self._changectx(rev)
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
612 parents = self._parents(ctx)
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
613 if not parents and i is None:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
614 i = 0
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
615 ma, r = ctx.manifest().keys(), []
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
616 else:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
617 i = i or 0
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
618 ma, r = self._changedfiles(parents[i], ctx)
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
619 ma, r = [[f for f in l if f not in self.ignored] for l in (ma, r)]
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
620
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
621 if i == 0:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
622 self._changescache = (rev, (ma, r))
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
623
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
624 return ma + r
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
625
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
626 def converted(self, rev, destrev):
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
627 if self.convertfp is None:
15069
650d81a313cb convert: use repo.join instead of referencing ".hg" directly
Martin Geisler <mg@aragost.com>
parents: 14556
diff changeset
628 self.convertfp = open(self.repo.join('shamap'), 'a')
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
629 self.convertfp.write('%s %s\n' % (destrev, rev))
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
630 self.convertfp.flush()
5805
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
631
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
632 def before(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
633 self.ui.debug('run hg source pre-conversion action\n')
5805
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
634
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
635 def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
636 self.ui.debug('run hg source post-conversion action\n')
8691
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
637
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
638 def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
639 return True
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
640
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
641 def hasnativeclose(self):
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
642 return True
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
643
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
644 def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
645 try:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
646 return nodemod.hex(self.repo.lookup(rev))
23926
fea3416f2440 convert: handle LookupError in mercurial_source.lookuprev()
Matt Harbison <matt_harbison@yahoo.com>
parents: 22698
diff changeset
647 except (error.RepoError, error.LookupError):
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
648 return None
13757
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
649
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
650 def getbookmarks(self):
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
651 return bookmarks.listbookmarks(self.repo)
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
652
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20372
diff changeset
653 def checkrevformat(self, revstr, mapname='splicemap'):
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
654 """ Mercurial, revision string is a 40 byte hex """
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20372
diff changeset
655 self.checkhexformat(revstr, mapname)