annotate hgext/convert/hg.py @ 41753:3158cb74fbca

copies: make _backwardrenames() filter out copies by destination As shown by the test case, _backwardrenames() doesn't filter by the matcher. It doesn't show up in `hg status --copies` because that only prints files changed between the two commits. I wouldn't be surprised if some other command that replies on pathcopies() was broken before this patch, but I haven't bothered to check other commands. Differential Revision: https://phab.mercurial-scm.org/D5988
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 19 Feb 2019 10:45:22 -0800
parents 876494fd967d
children 1312afae2d51
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 )
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36340
diff changeset
39 from mercurial.utils import dateutil
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
40 stringio = util.stringio
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
41
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
42 from . import common
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
43 mapfile = common.mapfile
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
44 NoRepo = common.NoRepo
3953
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3939
diff changeset
45
36134
2a28bdb63f05 convert: make hg sha1 regex consistently be a bytes
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
46 sha1re = re.compile(br'\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
47
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
48 class mercurial_sink(common.converter_sink):
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
49 def __init__(self, ui, repotype, path):
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
50 common.converter_sink.__init__(self, ui, repotype, path)
34172
c72af5a4f997 configitems: register the 'convert.hg.usebranchnames' config
Boris Feld <boris.feld@octobus.net>
parents: 34171
diff changeset
51 self.branchnames = ui.configbool('convert', 'hg.usebranchnames')
34165
5b8cb63c130c configitems: register the 'convert.hg.clonebranches' config
Boris Feld <boris.feld@octobus.net>
parents: 33487
diff changeset
52 self.clonebranches = ui.configbool('convert', 'hg.clonebranches')
34171
84044b904c6a configitems: register the 'convert.hg.tagsbranch' config
Boris Feld <boris.feld@octobus.net>
parents: 34168
diff changeset
53 self.tagsbranch = ui.config('convert', 'hg.tagsbranch')
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
54 self.lastbranch = None
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
55 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
56 try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
57 self.repo = hg.repository(self.ui, path)
5918
1716c8a0bd09 convert: mercurial sink must be local
Patrick Mezard <pmezard@gmail.com>
parents: 5522
diff changeset
58 if not self.repo.local():
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
59 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
60 % path)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
61 except error.RepoError as err:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
62 ui.traceback()
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
63 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
64 else:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
65 try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
66 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
67 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
68 if not self.repo.local():
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
69 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
70 % path)
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
71 self.created.append(path)
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7874
diff changeset
72 except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
73 ui.traceback()
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
74 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
75 % path)
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
76 self.lock = None
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
77 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
78 self.filemapmode = False
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
79 self.subrevmaps = {}
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
80
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
81 def before(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
82 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
83 self.wlock = self.repo.wlock()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
84 self.lock = self.repo.lock()
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
85
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
86 def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
87 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
88 if self.lock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
89 self.lock.release()
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
90 if self.wlock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
91 self.wlock.release()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
92
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
93 def revmapfile(self):
31327
e59960ea8dcc convert: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30375
diff changeset
94 return self.repo.vfs.join("shamap")
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
95
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
96 def authorfile(self):
31327
e59960ea8dcc convert: directly use repo.vfs.join
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 30375
diff changeset
97 return self.repo.vfs.join("authormap")
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
98
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
99 def setbranch(self, branch, pbranches):
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
100 if not self.clonebranches:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
101 return
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
102
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
103 setbranch = (branch != self.lastbranch)
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
104 self.lastbranch = branch
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
105 if not branch:
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
106 branch = 'default'
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
107 pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches]
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
108
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
109 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
110 if setbranch:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
111 self.after()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
112 try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
113 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
114 except Exception:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
115 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
116 self.before()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
117
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
118 # 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
119 # 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
120 missings = {}
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
121 for b in pbranches:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
122 try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
123 self.repo.lookup(b[0])
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
124 except Exception:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
125 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
126
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
127 if missings:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
128 self.after()
18373
687ed69f6fdf convert: process missing branches in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 17922
diff changeset
129 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
130 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
131 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
132 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
133 exchange.pull(self.repo, prepo,
32a8ad782260 convert-hg: use localrepo.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22360
diff changeset
134 [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
135 self.before()
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
136
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
137 def _rewritetags(self, source, revmap, data):
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
138 fp = stringio()
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
139 for line in data.splitlines():
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
140 s = line.split(' ', 1)
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
141 if len(s) != 2:
39021
7e023ce26c7f convert: don't drop missing or corrupt tag entries
Matt Harbison <matt_harbison@yahoo.com>
parents: 37579
diff changeset
142 self.ui.warn(_('invalid tag entry: "%s"\n') % line)
7e023ce26c7f convert: don't drop missing or corrupt tag entries
Matt Harbison <matt_harbison@yahoo.com>
parents: 37579
diff changeset
143 fp.write('%s\n' % line) # Bogus, but keep for hash stability
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
144 continue
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
145 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
146 if not revid:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
147 if s[0] == nodemod.nullhex:
25305
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
148 revid = s[0]
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
149 else:
39021
7e023ce26c7f convert: don't drop missing or corrupt tag entries
Matt Harbison <matt_harbison@yahoo.com>
parents: 37579
diff changeset
150 # missing, but keep for hash stability
7e023ce26c7f convert: don't drop missing or corrupt tag entries
Matt Harbison <matt_harbison@yahoo.com>
parents: 37579
diff changeset
151 self.ui.warn(_('missing tag entry: "%s"\n') % line)
7e023ce26c7f convert: don't drop missing or corrupt tag entries
Matt Harbison <matt_harbison@yahoo.com>
parents: 37579
diff changeset
152 fp.write('%s\n' % line)
25305
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
153 continue
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
154 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
155 return fp.getvalue()
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
156
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
157 def _rewritesubstate(self, source, data):
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
158 fp = stringio()
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
159 for line in data.splitlines():
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
160 s = line.split(' ', 1)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
161 if len(s) != 2:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
162 continue
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
163
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
164 revid = s[0]
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
165 subpath = s[1]
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
166 if revid != nodemod.nullhex:
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
167 revmap = self.subrevmaps.get(subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
168 if revmap is None:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
169 revmap = mapfile(self.ui,
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
170 self.repo.wjoin(subpath, '.hg/shamap'))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
171 self.subrevmaps[subpath] = revmap
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
172
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
173 # 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
174 # 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
175 # 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
176 # once.
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
177 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
178 if len(revmap) == 0:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
179 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
180
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
181 if self.repo.wvfs.exists(sub):
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
182 self.ui.warn(msg % subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
183
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
184 newid = revmap.get(revid)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
185 if not newid:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
186 if len(revmap) > 0:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
187 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
188 (revid, subpath))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
189 else:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
190 revid = newid
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 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
193
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
194 return fp.getvalue()
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
195
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
196 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
197 """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
198 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
199
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
200 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
201 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
202 repositories together).
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
203 """
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
204 anc = [p1ctx.ancestor(p2ctx)]
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
205 # 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
206 actions, diverge, rename = mergemod.calculateupdates(
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
207 self.repo, p1ctx, p2ctx, anc,
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
208 True, # branchmerge
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
209 True, # force
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
210 False, # acceptremote
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
211 False, # followcopies
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
212 )
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
213
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
214 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
215 if source.targetfilebelongstosource(file):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
216 # 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
217 # 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
218 continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
219
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
220 # 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
221 # context to resolve merges correctly.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
222 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
223 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
224 "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
225 "%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
226 p2ctx))
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
227 elif action == 'k':
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
228 # '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
229 continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
230 else:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
231 # 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
232 yield file
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
233
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
234 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
235 cleanp2):
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
236 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
237
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
238 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
239 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
240 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
241 try:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
242 return p2ctx[f]
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
243 except error.ManifestLookupError:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
244 # 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
245 # delete, so just return None.
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
246 return None
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
247 try:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
248 v = files[f]
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
249 except KeyError:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
250 return None
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
251 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
252 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
253 return None
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
254 if f == '.hgtags':
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
255 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
256 if f == '.hgsubstate':
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
257 data = self._rewritesubstate(source, data)
35400
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35176
diff changeset
258 return context.memfilectx(self.repo, memctx, f, data, 'l' in mode,
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
259 'x' in mode, copies.get(f))
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
260
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
261 pl = []
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
262 for p in parents:
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
263 if p not in pl:
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
264 pl.append(p)
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
265 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
266 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
267 if self.filemapmode and nparents == 1:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
268 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
269 parent = parents[0]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
270
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)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
273 if len(parents) < 2:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
274 parents.append(nodemod.nullid)
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
275 p2 = parents.pop(0)
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
276
3954
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3953
diff changeset
277 text = commit.desc
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
278
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
279 sha1s = re.findall(sha1re, text)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
280 for sha1 in sha1s:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
281 oldrev = source.lookuprev(sha1)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
282 newrev = revmap.get(oldrev)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
283 if newrev is not None:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
284 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
285
5439
d0c67b52ac01 convert: make contents of "extra" dict available from sources, for sinks.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5437
diff changeset
286 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
287
25750
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
288 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
289 if sourcename:
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
290 extra['convert_source'] = sourcename
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
291
25589
273d94255e1e convert: update 'intermediate-source' in the destination's extras dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 25571
diff changeset
292 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
293 'intermediate-source'):
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
294 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
295
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
296 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
297 continue
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
298
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
299 # 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
300 if label == 'transplant_source':
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
301 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
302
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
303 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
304 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
305 if label == 'transplant_source':
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
306 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
307
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
308 extra[label] = newrev
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
309
5038
8f157190075e convert: add config option to turn off use of branch names
Bryan O'Sullivan <bos@serpentine.com>
parents: 5017
diff changeset
310 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
311 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
312 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
313 extra['convert_revision'] = commit.rev
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4873
diff changeset
314
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
315 while parents:
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
316 p1 = p2
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
317 p2 = parents.pop(0)
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
318 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
319 p2ctx = None
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
320 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
321 p2ctx = self.repo[p2]
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
322 fileset = set(files)
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
323 if full:
22360
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
324 fileset.update(self.repo[p1])
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
325 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
326
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
327 if p2ctx:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
328 p2files = set(cleanp2)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
329 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
330 p2files.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
331 fileset.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
332
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
333 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
334 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
335
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
336 # 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
337 # 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
338 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
339 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
340
27863
ed59ae8b025e with: use context manager for transaction in mercurial_sink
Bryan O'Sullivan <bryano@fb.com>
parents: 27719
diff changeset
341 with self.repo.transaction("convert") as tr:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
342 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
343
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
344 # 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
345 # 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
346 # anywhere.
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
347 if commit.rev != node:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
348 ctx = self.repo[node]
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
349 if ctx.phase() < phases.draft:
33455
b1bc8cf3fea8 convert: use the new 'phase.registernew' function
Boris Feld <boris.feld@octobus.net>
parents: 31327
diff changeset
350 phases.registernew(self.repo, tr, phases.draft,
b1bc8cf3fea8 convert: use the new 'phase.registernew' function
Boris Feld <boris.feld@octobus.net>
parents: 31327
diff changeset
351 [ctx.node()])
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
352
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
353 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
354 p2 = node
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
355
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
356 if self.filemapmode and nparents == 1:
39244
73cf21b2e8a6 manifest: add getstorage() to manifestlog and use it globally
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39021
diff changeset
357 man = self.repo.manifestlog.getstorage(b'')
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
358 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
359 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
360 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
361 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
362 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
363 return parent
1389
9b3ef6f3cef5 convert-repo: fix up octopus merge conversion
Matt Mackall <mpm@selenic.com>
parents: 1388
diff changeset
364 return p2
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
365
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
366 def puttags(self, tags):
37395
810413b745ff convert: look up branch only among branches
Martin von Zweigbergk <martinvonz@google.com>
parents: 37394
diff changeset
367 tagparent = self.repo.branchtip(self.tagsbranch, ignoremissing=True)
810413b745ff convert: look up branch only among branches
Martin von Zweigbergk <martinvonz@google.com>
parents: 37394
diff changeset
368 tagparent = tagparent or nodemod.nullid
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
369
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
370 oldlines = set()
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
371 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
372 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
373 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
374 oldlines.update(
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
375 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
376 oldlines = sorted(list(oldlines))
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
377
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
378 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
379 if newlines == oldlines:
9431
d1b135f2f415 convert: fix history topology when using hg.tagsbranch
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
380 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
381
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
382 # 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
383 oldtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
384 newtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
385 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
386 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
387 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
388 continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
389 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
390 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
391 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
392 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
393 continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
394 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
395 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
396
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
397 if not newtags:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
398 return None, None
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
399
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
400 data = "".join(newlines)
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
401 def getfilectx(repo, memctx, f):
35400
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35176
diff changeset
402 return context.memfilectx(repo, memctx, f, data, False, False, None)
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
403
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
404 self.ui.status(_("updating tags\n"))
37579
ce566e0f73d0 py3: use '%d' for integers instead of '%s'
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37395
diff changeset
405 date = "%d 0" % int(time.mktime(time.gmtime()))
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
406 extra = {'branch': self.tagsbranch}
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
407 ctx = context.memctx(self.repo, (tagparent, None), "update tags",
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
408 [".hgtags"], getfilectx, "convert-repo", date,
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
409 extra)
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
410 node = self.repo.commitctx(ctx)
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
411 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
412
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
413 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
414 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
415
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
416 def putbookmarks(self, updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
417 if not len(updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
418 return
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
419 wlock = lock = tr = None
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
420 try:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
421 wlock = self.repo.wlock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
422 lock = self.repo.lock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
423 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
424 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
425 destmarks = self.repo._bookmarks
33487
a050d37c2c70 bookmark: use 'applychanges' in the convert extension
Boris Feld <boris.feld@octobus.net>
parents: 33455
diff changeset
426 changes = [(bookmark, nodemod.bin(updatedbookmark[bookmark]))
a050d37c2c70 bookmark: use 'applychanges' in the convert extension
Boris Feld <boris.feld@octobus.net>
parents: 33455
diff changeset
427 for bookmark in updatedbookmark]
a050d37c2c70 bookmark: use 'applychanges' in the convert extension
Boris Feld <boris.feld@octobus.net>
parents: 33455
diff changeset
428 destmarks.applychanges(self.repo, tr, changes)
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
429 tr.close()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
430 finally:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
431 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
432
21635
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
433 def hascommitfrommap(self, rev):
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
434 # 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
435 return rev in self.repo or self.clonebranches
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
436
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21498
diff changeset
437 def hascommitforsplicemap(self, rev):
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
438 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
439 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
440 'repository (lookups with clonebranches=true '
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
441 'are not implemented)') % rev)
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
442 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
443
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
444 class mercurial_source(common.converter_source):
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
445 def __init__(self, ui, repotype, path, revs=None):
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
446 common.converter_source.__init__(self, ui, repotype, path, revs)
34166
79c01348ef34 configitems: register the 'convert.hg.ignoreerrors' config
Boris Feld <boris.feld@octobus.net>
parents: 34165
diff changeset
447 self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors')
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
448 self.ignored = set()
34168
9bda5ce97be3 configitems: register the 'convert.hg.saverev' config
Boris Feld <boris.feld@octobus.net>
parents: 34166
diff changeset
449 self.saverev = ui.configbool('convert', 'hg.saverev')
5358
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
450 try:
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
451 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
452 # 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
453 # 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
454 if not self.repo.local():
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
455 raise error.RepoError
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
456 except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
457 ui.traceback()
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
458 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
459 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
460 self.lastctx = None
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
461 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
462 self.convertfp = None
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
463 # Restrict converted revisions to startrev descendants
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
464 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
465 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
466 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
467 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
468 try:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
469 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
470 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
471 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
472 % startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
473 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
474 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
475 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
476 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
477 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
478 else:
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 = util.always
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
480 if revs:
37361
e45545f7895e convert: use repo.lookup() for converting to nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 36607
diff changeset
481 self._heads = [self.repo.lookup(r) 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
482 else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
483 self._heads = self.repo.heads()
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
484 else:
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
485 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
486 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
487 '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
488 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
489 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
490 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
491 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
492 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
493 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
494 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
495 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
496
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
497 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
498 if self.lastrev != rev:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6717
diff changeset
499 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
500 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
501 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
502
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
503 def _parents(self, ctx):
9531
a2f36a082449 convert/hg: make parents() return changectx, not nodes
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
504 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
505
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
506 def getheads(self):
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
507 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
508
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
509 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
510 try:
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
511 fctx = self._changectx(rev)[name]
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
512 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
513 except error.LookupError:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
514 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
515
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
516 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
517 ma, r = [], []
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
518 maappend = ma.append
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
519 rappend = r.append
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
520 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
521 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
522 if node2 is None:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
523 rappend(f)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
524 else:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
525 maappend(f)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
526 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
527
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
528 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
529 ctx = self._changectx(rev)
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
530 parents = self._parents(ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
531 if full or not parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
532 files = copyfiles = ctx.manifest()
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
533 if parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
534 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
535 ma, r = self._changescache[1]
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
536 else:
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._changedfiles(parents[0], ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
538 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
539 files = ma + r
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
540 copyfiles = ma
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
541 # _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
542 # 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
543 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
544 cleanp2 = set()
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
545 if len(parents) == 2:
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
546 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
547 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
548 if value is None:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
549 cleanp2.add(f)
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
550 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
551 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
552 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
553
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
554 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
555 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
556 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
557 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
558 continue
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
559 try:
19457
948df0f10ec1 convert: fix bad conversion of copies when hg.startrev is specified
Mads Kiilerich <madski@unity3d.com>
parents: 19120
diff changeset
560 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
561 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
562 continue
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
563 # Ignore copy sources not in parent revisions
36340
06464d1ce6cd convert: don't reimplement any()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36148
diff changeset
564 if not any(copysource in p for p in parents):
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
565 continue
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
566 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
567 except TypeError:
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
568 pass
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
569 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
570 if not self.ignoreerrors:
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
571 raise
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
572 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
573 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
574 return copies
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5131
diff changeset
575
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
576 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
577 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
578 _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
579 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
580 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
581 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
582
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
583 return common.commit(author=ctx.user(),
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36340
diff changeset
584 date=dateutil.datestr(ctx.date(),
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
585 '%Y-%m-%d %H:%M:%S %1%2'),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
586 desc=ctx.description(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
587 rev=crev,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
588 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
589 optparents=optparents,
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
590 branch=ctx.branch(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
591 extra=ctx.extra(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
592 sortkey=ctx.rev(),
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
593 saverev=self.saverev,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
594 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
595
41179
77088fa862df convert: add missing numcommits() override to hg sources
Matt Harbison <matt_harbison@yahoo.com>
parents: 39244
diff changeset
596 def numcommits(self):
77088fa862df convert: add missing numcommits() override to hg sources
Matt Harbison <matt_harbison@yahoo.com>
parents: 39244
diff changeset
597 return len(self.repo)
77088fa862df convert: add missing numcommits() override to hg sources
Matt Harbison <matt_harbison@yahoo.com>
parents: 39244
diff changeset
598
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
599 def gettags(self):
21498
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
600 # 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
601 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
602 if self.repo.tagtype(t[0]) == 'global']
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
603 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
604 if self.keep(node)])
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
605
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
606 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
607 ctx = self._changectx(rev)
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
608 parents = self._parents(ctx)
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
609 if not parents and i is None:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
610 i = 0
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
611 ma, r = ctx.manifest().keys(), []
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
612 else:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
613 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
614 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
615 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
616
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
617 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
618 self._changescache = (rev, (ma, r))
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
619
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
620 return ma + r
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
621
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
622 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
623 if self.convertfp is None:
36132
42a393ea56d2 convert: open all files in binary mode
Augie Fackler <augie@google.com>
parents: 35400
diff changeset
624 self.convertfp = open(self.repo.vfs.join('shamap'), 'ab')
36148
0f9e52f900c4 convert: fix line ending of mapfile and commit.desc file
Yuya Nishihara <yuya@tcha.org>
parents: 36134
diff changeset
625 self.convertfp.write(util.tonativeeol('%s %s\n' % (destrev, rev)))
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
626 self.convertfp.flush()
5805
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
627
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
628 def before(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
629 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
630
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
631 def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
632 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
633
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
634 def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
635 return True
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
636
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
637 def hasnativeclose(self):
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
638 return True
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
639
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
640 def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
641 try:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
642 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
643 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
644 return None
13757
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
645
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
646 def getbookmarks(self):
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
647 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
648
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20372
diff changeset
649 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
650 """ 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
651 self.checkhexformat(revstr, mapname)