annotate hgext/convert/convcmd.py @ 45095:8e04607023e5

procutil: ensure that procutil.std{out,err}.write() writes all bytes Python 3 offers different kind of streams and it’s not guaranteed for all of them that calling write() writes all bytes. When Python is started in unbuffered mode, sys.std{out,err}.buffer are instances of io.FileIO, whose write() can write less bytes for platform-specific reasons (e.g. Linux has a 0x7ffff000 bytes maximum and could write less if interrupted by a signal; when writing to Windows consoles, it’s limited to 32767 bytes to avoid the "not enough space" error). This can lead to silent loss of data, both when using sys.std{out,err}.buffer (which may in fact not be a buffered stream) and when using the text streams sys.std{out,err} (I’ve created a CPython bug report for that: https://bugs.python.org/issue41221). Python may fix the problem at some point. For now, we implement our own wrapper for procutil.std{out,err} that calls the raw stream’s write() method until all bytes have been written. We don’t use sys.std{out,err} for larger writes, so I think it’s not worth the effort to patch them.
author Manuel Jacob <me@manueljacob.de>
date Fri, 10 Jul 2020 12:27:58 +0200
parents fdaa4233dc18
children 89a2afe31e82
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5621
badbefa55972 convert: move commands definition to ease demandload job (issue 860)
Patrick Mezard <pmezard@gmail.com>
parents: 5521
diff changeset
1 # convcmd - convert extension commands definition
3917
645e1dd4b8ae convert-repo: update usage information
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3911
diff changeset
2 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4591
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7968
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: 9431
diff changeset
6 # GNU General Public License version 2 or any later version.
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
7 from __future__ import absolute_import
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
8
35779
eefabd9ed3e1 convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35197
diff changeset
9 import collections
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
10 import os
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
11 import shutil
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
12
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28900
diff changeset
13 from mercurial.i18n import _
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
14 from mercurial.pycompat import open
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
15 from mercurial import (
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
16 encoding,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
17 error,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
18 hg,
36133
6df206ef4b10 convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
19 pycompat,
35177
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35176
diff changeset
20 scmutil,
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
21 util,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
22 )
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36558
diff changeset
23 from mercurial.utils import dateutil
4536
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
24
28409
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
25 from . import (
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
26 bzr,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
27 common,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
28 cvs,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
29 darcs,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
30 filemap,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
31 git,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
32 gnuarch,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
33 hg as hgconvert,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
34 monotone,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
35 p4,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
36 subversion,
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
37 )
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
38
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
39 mapfile = common.mapfile
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
40 MissingTool = common.MissingTool
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
41 NoRepo = common.NoRepo
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
42 SKIPREV = common.SKIPREV
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
43
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
44 bzr_source = bzr.bzr_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
45 convert_cvs = cvs.convert_cvs
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
46 convert_git = git.convert_git
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
47 darcs_source = darcs.darcs_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
48 gnuarch_source = gnuarch.gnuarch_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
49 mercurial_sink = hgconvert.mercurial_sink
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
50 mercurial_source = hgconvert.mercurial_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
51 monotone_source = monotone.monotone_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
52 p4_source = p4.p4_source
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
53 svn_sink = subversion.svn_sink
c43c5e7167a2 convert: convcmd use absolute_import
timeless <timeless@mozdev.org>
parents: 26812
diff changeset
54 svn_source = subversion.svn_source
3821
158fce02dc40 Teach convert-repo to deal with mixed charsets in git
Matt Mackall <mpm@selenic.com>
parents: 2657
diff changeset
55
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
56 orig_encoding = b'ascii'
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
57
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
58
44102
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
59 def readauthormap(ui, authorfile, authors=None):
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
60 if authors is None:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
61 authors = {}
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
62 with open(authorfile, b'rb') as afile:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
63 for line in afile:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
64
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
65 line = line.strip()
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
66 if not line or line.startswith(b'#'):
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
67 continue
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
68
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
69 try:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
70 srcauthor, dstauthor = line.split(b'=', 1)
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
71 except ValueError:
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
72 msg = _(b'ignoring bad line in author map file %s: %s\n')
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
73 ui.warn(msg % (authorfile, line.rstrip()))
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
74 continue
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
75
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
76 srcauthor = srcauthor.strip()
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
77 dstauthor = dstauthor.strip()
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
78 if authors.get(srcauthor) in (None, dstauthor):
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
79 msg = _(b'mapping author %s to %s\n')
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
80 ui.debug(msg % (srcauthor, dstauthor))
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
81 authors[srcauthor] = dstauthor
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
82 continue
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
83
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
84 m = _(b'overriding mapping for author %s, was %s, will be %s\n')
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
85 ui.status(m % (srcauthor, authors[srcauthor], dstauthor))
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
86 return authors
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
87
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
88
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
89 def recode(s):
38312
79dd61a4554f py3: replace `unicode` with pycompat.unicode
Pulkit Goyal <7895pulkit@gmail.com>
parents: 37888
diff changeset
90 if isinstance(s, pycompat.unicode):
36133
6df206ef4b10 convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
91 return s.encode(pycompat.sysstr(orig_encoding), 'replace')
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
92 else:
36133
6df206ef4b10 convcmd: pass encoding name as a sysstr
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
93 return s.decode('utf-8').encode(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
94 pycompat.sysstr(orig_encoding), 'replace'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
95 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
96
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
97
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
98 def mapbranch(branch, branchmap):
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
99 '''
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
100 >>> bmap = {b'default': b'branch1'}
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
101 >>> for i in [b'', None]:
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
102 ... mapbranch(i, bmap)
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
103 'branch1'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
104 'branch1'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
105 >>> bmap = {b'None': b'branch2'}
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
106 >>> for i in [b'', None]:
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
107 ... mapbranch(i, bmap)
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
108 'branch2'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
109 'branch2'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
110 >>> bmap = {b'None': b'branch3', b'default': b'branch4'}
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 30400
diff changeset
111 >>> for i in [b'None', b'', None, b'default', b'branch5']:
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
112 ... mapbranch(i, bmap)
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
113 'branch3'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
114 'branch4'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
115 'branch4'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
116 'branch4'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
117 'branch5'
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
118 '''
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
119 # If branch is None or empty, this commit is coming from the source
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
120 # repository's default branch and destined for the default branch in the
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
121 # destination repository. For such commits, using a literal "default"
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
122 # in branchmap below allows the user to map "default" to an alternate
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
123 # default branch in the destination repository.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
124 branch = branchmap.get(branch or b'default', branch)
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
125 # At some point we used "None" literal to denote the default branch,
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
126 # attempt to use that for backward compatibility.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
127 if not branch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
128 branch = branchmap.get(b'None', branch)
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
129 return branch
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
130
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
131
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
132 source_converters = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
133 (b'cvs', convert_cvs, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
134 (b'git', convert_git, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
135 (b'svn', svn_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
136 (b'hg', mercurial_source, b'sourcesort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
137 (b'darcs', darcs_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
138 (b'mtn', monotone_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
139 (b'gnuarch', gnuarch_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
140 (b'bzr', bzr_source, b'branchsort'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
141 (b'p4', p4_source, b'branchsort'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
142 ]
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
143
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
144 sink_converters = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
145 (b'hg', mercurial_sink),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
146 (b'svn', svn_sink),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
147 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
148
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
149
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25741
diff changeset
150 def convertsource(ui, path, type, revs):
5521
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
151 exceptions = []
9962
a7178eccf2dc convert: better error on invalid repository type
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
152 if type and type not in [s[0] for s in source_converters]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
153 raise error.Abort(_(b'%s: invalid source repository type') % type)
8692
827d4e807d57 convert: default revisions order depends on source
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
154 for name, source, sortmode in source_converters:
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
155 try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
156 if not type or name == type:
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34359
diff changeset
157 return source(ui, name, path, revs), sortmode
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
158 except (NoRepo, MissingTool) as inst:
5521
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
159 exceptions.append(inst)
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
160 if not ui.quiet:
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
161 for inst in exceptions:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
162 ui.write(b"%s\n" % pycompat.bytestr(inst.args[0]))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
163 raise error.Abort(_(b'%s: missing or unsupported repository') % path)
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
164
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
165
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
166 def convertsink(ui, path, type):
9962
a7178eccf2dc convert: better error on invalid repository type
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
167 if type and type not in [s[0] for s in sink_converters]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
168 raise error.Abort(_(b'%s: invalid destination repository type') % type)
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
169 for name, sink in sink_converters:
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
170 try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
171 if not type or name == type:
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34359
diff changeset
172 return sink(ui, name, path)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
173 except NoRepo as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
174 ui.note(_(b"convert: %s\n") % inst)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
175 except MissingTool as inst:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
176 raise error.Abort(b'%s\n' % inst)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
177 raise error.Abort(_(b'%s: unknown repository type') % path)
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
178
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
179
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
180 class progresssource(object):
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
181 def __init__(self, ui, source, filecount):
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
182 self.ui = ui
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
183 self.source = source
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
184 self.progress = ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
185 _(b'getting files'), unit=_(b'files'), total=filecount
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
186 )
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
187
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
188 def getfile(self, file, rev):
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
189 self.progress.increment(item=file)
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
190 return self.source.getfile(file, rev)
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
191
26035
86598f4fe1cf convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents: 25805
diff changeset
192 def targetfilebelongstosource(self, targetfilename):
86598f4fe1cf convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents: 25805
diff changeset
193 return self.source.targetfilebelongstosource(targetfilename)
86598f4fe1cf convert: add function to test if file is from source
Durham Goode <durham@fb.com>
parents: 25805
diff changeset
194
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
195 def lookuprev(self, rev):
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
196 return self.source.lookuprev(rev)
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
197
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
198 def close(self):
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
199 self.progress.complete()
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
200
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
201
5281
a176f9c8b26e convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5256
diff changeset
202 class converter(object):
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
203 def __init__(self, ui, source, dest, revmapfile, opts):
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
204
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
205 self.source = source
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
206 self.dest = dest
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
207 self.ui = ui
3957
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3956
diff changeset
208 self.opts = opts
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
209 self.commitcache = {}
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
210 self.authors = {}
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
211 self.authorfile = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
212
8444
057e96fe2955 convert: improve docstrings, comments.
Greg Ward <greg-hg@gerg.ca>
parents: 8377
diff changeset
213 # Record converted revisions persistently: maps source revision
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8693
diff changeset
214 # ID to target revision ID (both strings). (This is how
8444
057e96fe2955 convert: improve docstrings, comments.
Greg Ward <greg-hg@gerg.ca>
parents: 8377
diff changeset
215 # incremental conversions work.)
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
216 self.map = mapfile(ui, revmapfile)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
217
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
218 # Read first the dst author map if any
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
219 authorfile = self.dest.authorfile()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
220 if authorfile and os.path.exists(authorfile):
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
221 self.readauthormap(authorfile)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
222 # Extend/Override with new author map if necessary
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
223 if opts.get(b'authormap'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 self.readauthormap(opts.get(b'authormap'))
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
225 self.authorfile = self.dest.authorfile()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
226
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
227 self.splicemap = self.parsesplicemap(opts.get(b'splicemap'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
228 self.branchmap = mapfile(ui, opts.get(b'branchmap'))
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
229
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
230 def parsesplicemap(self, path):
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
231 """ check and validate the splicemap format and
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
232 return a child/parents dictionary.
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
233 Format checking has two parts.
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
234 1. generic format which is same across all source types
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
235 2. specific format checking which may be different for
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
236 different source type. This logic is implemented in
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
237 checkrevformat function in source files like
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
238 hg.py, subversion.py etc.
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
239 """
19119
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
240
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
241 if not path:
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
242 return {}
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
243 m = {}
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
244 try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
245 fp = open(path, b'rb')
30400
d1a0a64f6e16 convert: migrate to util.iterfile
Jun Wu <quark@fb.com>
parents: 29205
diff changeset
246 for i, line in enumerate(util.iterfile(fp)):
19119
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
247 line = line.splitlines()[0].rstrip()
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
248 if not line:
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
249 # Ignore blank lines
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
250 continue
19181
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
251 # split line
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
252 lex = common.shlexer(data=line, whitespace=b',')
19181
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
253 line = list(lex)
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
254 # check number of parents
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
255 if not (2 <= len(line) <= 3):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
256 raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
257 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
258 b'syntax error in %s(%d): child parent1'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
259 b'[,parent2] expected'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
260 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
261 % (path, i + 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
262 )
19181
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
263 for part in line:
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
264 self.source.checkrevformat(part)
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
265 child, p1, p2 = line[0], line[1:2], line[2:]
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
266 if p1 == p2:
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
267 m[child] = p1
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
268 else:
8c2fdf7d5645 splicemap: support paths with spaces in splicemap (issue3844)
Szymon Wroblewski <bluex0@gmail.com>
parents: 19120
diff changeset
269 m[child] = p1 + p2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
270 # if file does not exist or error reading, exit
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 19119
diff changeset
271 except IOError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
272 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
273 _(b'splicemap file not found or error reading %s:') % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
274 )
19119
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
275 return m
61f1223ab358 splicemap: move parsesplicemap to convcmd.py (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
276
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
277 def walktree(self, heads):
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
278 '''Return a mapping that identifies the uncommitted parents of every
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
279 uncommitted changeset.'''
37888
73ca1c5e65f8 convcmd: make a copy of heads before mutating it
Augie Fackler <augie@google.com>
parents: 36607
diff changeset
280 visit = list(heads)
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8444
diff changeset
281 known = set()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
282 parents = {}
22411
c497e39d81a3 convert: add support for deterministic progress bar on scanning phase
Augie Fackler <raf@durin42.com>
parents: 22300
diff changeset
283 numcommits = self.source.numcommits()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
284 progress = self.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
285 _(b'scanning'), unit=_(b'revisions'), total=numcommits
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
286 )
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
287 while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
288 n = visit.pop(0)
21636
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
289 if n in known:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
290 continue
21636
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
291 if n in self.map:
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
292 m = self.map[n]
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
293 if m == SKIPREV or self.dest.hascommitfrommap(m):
3de9f2c4900c convert: only consider shamap revisions converted if they still exists
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
294 continue
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8444
diff changeset
295 known.add(n)
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
296 progress.update(len(known))
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
297 commit = self.cachecommit(n)
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
298 parents[n] = []
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
299 for p in commit.parents:
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
300 parents[n].append(p)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
301 visit.append(p)
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
302 progress.complete()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
303
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
304 return parents
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
305
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
306 def mergesplicemap(self, parents, splicemap):
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
307 """A splicemap redefines child/parent relationships. Check the
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
308 map contains valid revision identifiers and merge the new
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
309 links in the source graph.
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
310 """
18372
5965997b7023 convert: process splicemap in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 17424
diff changeset
311 for c in sorted(splicemap):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
312 if c not in parents:
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21077
diff changeset
313 if not self.dest.hascommitforsplicemap(self.map.get(c, c)):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
314 # Could be in source but not converted during this run
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
315 self.ui.warn(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
316 _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
317 b'splice map revision %s is not being '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
318 b'converted, ignoring\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
319 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
320 % c
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
321 )
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
322 continue
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
323 pc = []
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
324 for p in splicemap[c]:
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
325 # We do not have to wait for nodes already in dest.
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21077
diff changeset
326 if self.dest.hascommitforsplicemap(self.map.get(p, p)):
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
327 continue
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
328 # Parent is not in dest and not being converted, not good
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
329 if p not in parents:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
330 raise error.Abort(_(b'unknown splice map parent: %s') % p)
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
331 pc.append(p)
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
332 parents[c] = pc
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
333
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
334 def toposort(self, parents, sortmode):
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
335 '''Return an ordering such that every uncommitted changeset is
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 16925
diff changeset
336 preceded by all its uncommitted ancestors.'''
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
337
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
338 def mapchildren(parents):
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
339 """Return a (children, roots) tuple where 'children' maps parent
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
340 revision identifiers to children ones, and 'roots' is the list of
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
341 revisions without parents. 'parents' must be a mapping of revision
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
342 identifier to its parents ones.
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
343 """
35779
eefabd9ed3e1 convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35197
diff changeset
344 visit = collections.deque(sorted(parents))
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
345 seen = set()
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
346 children = {}
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
347 roots = []
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
348
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
349 while visit:
35779
eefabd9ed3e1 convert: use a collections.deque
Gregory Szorc <gregory.szorc@gmail.com>
parents: 35197
diff changeset
350 n = visit.popleft()
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
351 if n in seen:
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
352 continue
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
353 seen.add(n)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
354 # Ensure that nodes without parents are present in the
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
355 # 'children' mapping.
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
356 children.setdefault(n, [])
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
357 hasparent = False
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
358 for p in parents[n]:
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16106
diff changeset
359 if p not in self.map:
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
360 visit.append(p)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
361 hasparent = True
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
362 children.setdefault(p, []).append(n)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
363 if not hasparent:
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
364 roots.append(n)
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
365
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
366 return children, roots
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
367
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
368 # Sort functions are supposed to take a list of revisions which
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
369 # can be converted immediately and pick one
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
370
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
371 def makebranchsorter():
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
372 """If the previously converted revision has a child in the
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
373 eligible revisions list, pick it. Return the list head
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
374 otherwise. Branch sort attempts to minimize branch
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
375 switching, which is harmful for Mercurial backend
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
376 compression.
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
377 """
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
378 prev = [None]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
379
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
380 def picknext(nodes):
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
381 next = nodes[0]
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
382 for n in nodes:
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
383 if prev[0] in parents[n]:
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
384 next = n
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
385 break
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
386 prev[0] = next
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
387 return next
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
388
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
389 return picknext
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
390
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
391 def makesourcesorter():
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
392 """Source specific sort."""
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
393 keyfn = lambda n: self.commitcache[n].sortkey
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
394
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
395 def picknext(nodes):
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
396 return sorted(nodes, key=keyfn)[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
397
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
398 return picknext
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
399
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
400 def makeclosesorter():
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
401 """Close order sort."""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
402 keyfn = lambda n: (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
403 b'close' not in self.commitcache[n].extra,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
404 self.commitcache[n].sortkey,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
405 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
406
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
407 def picknext(nodes):
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
408 return sorted(nodes, key=keyfn)[0]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
409
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
410 return picknext
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
411
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
412 def makedatesorter():
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
413 """Sort revisions by date."""
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
414 dates = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
415
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
416 def getdate(n):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
417 if n not in dates:
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36558
diff changeset
418 dates[n] = dateutil.parsedate(self.commitcache[n].date)
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
419 return dates[n]
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
420
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
421 def picknext(nodes):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
422 return min([(getdate(n), n) for n in nodes])[1]
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
423
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
424 return picknext
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
425
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 if sortmode == b'branchsort':
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
427 picknext = makebranchsorter()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
428 elif sortmode == b'datesort':
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
429 picknext = makedatesorter()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
430 elif sortmode == b'sourcesort':
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
431 picknext = makesourcesorter()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
432 elif sortmode == b'closesort':
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18376
diff changeset
433 picknext = makeclosesorter()
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
434 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
435 raise error.Abort(_(b'unknown sort mode: %s') % sortmode)
8688
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
436
31e613a89750 convert: split toposort() into subfunctions for readability
Patrick Mezard <pmezard@gmail.com>
parents: 8456
diff changeset
437 children, actives = mapchildren(parents)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
438
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
439 s = []
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
440 pendings = {}
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
441 while actives:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
442 n = picknext(actives)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
443 actives.remove(n)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
444 s.append(n)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
445
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
446 # Update dependents list
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
447 for c in children.get(n, []):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
448 if c not in pendings:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
449 pendings[c] = [p for p in parents[c] if p not in self.map]
6131
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
450 try:
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
451 pendings[c].remove(n)
fddeeb00f8d1 convert: improve cycles detection message
Patrick Mezard <pmezard@gmail.com>
parents: 6130
diff changeset
452 except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
453 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
454 _(b'cycle detected between %s and %s')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
455 % (recode(c), recode(n))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
456 )
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
457 if not pendings[c]:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
458 # Parents are converted, node is eligible
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
459 actives.insert(0, c)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
460 pendings[c] = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
461
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
462 if len(s) != len(parents):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
463 raise error.Abort(_(b"not all revisions were sorted"))
3957
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3956
diff changeset
464
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
465 return s
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
466
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
467 def writeauthormap(self):
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
468 authorfile = self.authorfile
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
469 if authorfile:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
470 self.ui.status(_(b'writing author map file %s\n') % authorfile)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
471 ofile = open(authorfile, b'wb+')
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
472 for author in self.authors:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
473 ofile.write(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
474 util.tonativeeol(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
475 b"%s=%s\n" % (author, self.authors[author])
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
476 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
477 )
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7873
diff changeset
478 ofile.close()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
479
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
480 def readauthormap(self, authorfile):
44102
fdaa4233dc18 convert: refactor authormap into separate function for outside use
Joerg Sonnenberger <joerg@bec.de>
parents: 43105
diff changeset
481 self.authors = readauthormap(self.ui, authorfile, self.authors)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
482
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
483 def cachecommit(self, rev):
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
484 commit = self.source.getcommit(rev)
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
485 commit.author = self.authors.get(commit.author, commit.author)
25805
584044e5ad57 convert: use 'default' for specifying branch name in branchmap (issue4753)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
486 commit.branch = mapbranch(commit.branch, self.branchmap)
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
487 self.commitcache[rev] = commit
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
488 return commit
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
489
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
490 def copy(self, rev):
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
491 commit = self.commitcache[rev]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
492 full = self.opts.get(b'full')
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 21636
diff changeset
493 changes = self.source.getchanges(rev, full)
35197
bfd072c52e03 py3: use bytes in place of basestring
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35177
diff changeset
494 if isinstance(changes, bytes):
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
495 if changes == SKIPREV:
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
496 dest = SKIPREV
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
497 else:
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
498 dest = self.map[changes]
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
499 self.map[rev] = dest
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
500 return
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24328
diff changeset
501 files, copies, cleanp2 = changes
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
502 pbranches = []
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
503 if commit.parents:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
504 for prev in commit.parents:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
505 if prev not in self.commitcache:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
506 self.cachecommit(prev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
507 pbranches.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
508 (self.map[prev], self.commitcache[prev].branch)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
509 )
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
510 self.dest.setbranch(commit.branch, pbranches)
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
511 try:
16105
ebaa0aa749e2 convert: turn splicemap into a simple dictionary
Patrick Mezard <patrick@mezard.eu>
parents: 13745
diff changeset
512 parents = self.splicemap[rev]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
513 self.ui.status(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
514 _(b'spliced in %s as parents of %s\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
515 % (_(b' and ').join(parents), rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
516 )
6143
5b159ebb19cf convert: document splicemap, allow setting of multiple parents
Bryan O'Sullivan <bos@serpentine.com>
parents: 6131
diff changeset
517 parents = [self.map.get(p, p) for p in parents]
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
518 except KeyError:
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
519 parents = [b[0] for b in pbranches]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
520 parents.extend(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
521 self.map[x] for x in commit.optparents if x in self.map
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
522 )
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24328
diff changeset
523 if len(pbranches) != 2:
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24328
diff changeset
524 cleanp2 = set()
24328
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
525 if len(parents) < 3:
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
526 source = progresssource(self.ui, self.source, len(files))
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
527 else:
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
528 # For an octopus merge, we end up traversing the list of
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
529 # changed files N-1 times. This tweak to the number of
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
530 # files makes it so the progress bar doesn't overflow
603a8d09e12d convert: adjust progress bar for octopus merges (issue4169)
Augie Fackler <augie@google.com>
parents: 24306
diff changeset
531 # itself.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
532 source = progresssource(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
533 self.ui, self.source, len(files) * (len(parents) - 1)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
534 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
535 newnode = self.dest.putcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
536 files, copies, parents, commit, source, self.map, full, cleanp2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
537 )
11136
ecc8b18736da convert: display files data retrieval progress
Patrick Mezard <pmezard@gmail.com>
parents: 11135
diff changeset
538 source.close()
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5528
diff changeset
539 self.source.converted(rev, newnode)
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
540 self.map[rev] = newnode
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
541
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
542 def convert(self, sortmode):
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
543 try:
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
544 self.source.before()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
545 self.dest.before()
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
546 self.source.setrevmap(self.map)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
547 self.ui.status(_(b"scanning source...\n"))
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
548 heads = self.source.getheads()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
549 parents = self.walktree(heads)
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 16105
diff changeset
550 self.mergesplicemap(parents, self.splicemap)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
551 self.ui.status(_(b"sorting...\n"))
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
552 t = self.toposort(parents, sortmode)
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
553 num = len(t)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
554 c = None
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
555
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
556 self.ui.status(_(b"converting...\n"))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
557 progress = self.ui.makeprogress(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
558 _(b'converting'), unit=_(b'revisions'), total=len(t)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
559 )
12769
daa8dc6e1f66 convert: kill trailing whitespace
timeless <timeless@gmail.com>
parents: 12768
diff changeset
560 for i, c in enumerate(t):
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
561 num -= 1
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
562 desc = self.commitcache[c].desc
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
563 if b"\n" in desc:
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
564 desc = desc.splitlines()[0]
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
565 # convert log message to local encoding without using
12768
c6b55be14461 convert: fix typo in comment
timeless <timeless@gmail.com>
parents: 12198
diff changeset
566 # tolocal() because the encoding.encoding convert()
c6b55be14461 convert: fix typo in comment
timeless <timeless@gmail.com>
parents: 12198
diff changeset
567 # uses is 'utf-8'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
568 self.ui.status(b"%d %s\n" % (num, recode(desc)))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
569 self.ui.note(_(b"source: %s\n") % recode(c))
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
570 progress.update(i)
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
571 self.copy(c)
38406
65d1d7da63d1 convert: use progress helper
Martin von Zweigbergk <martinvonz@google.com>
parents: 38366
diff changeset
572 progress.complete()
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
573
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
574 if not self.ui.configbool(b'convert', b'skiptags'):
25741
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
575 tags = self.source.gettags()
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
576 ctags = {}
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
577 for k in tags:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
578 v = tags[k]
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
579 if self.map.get(v, SKIPREV) != SKIPREV:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
580 ctags[k] = self.map[v]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
581
25741
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
582 if c and ctags:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
583 nrev, tagsparent = self.dest.puttags(ctags)
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
584 if nrev and tagsparent:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
585 # write another hash correspondence to override the
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
586 # previous one so we don't end up with extra tag heads
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
587 tagsparents = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
588 e
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
589 for e in pycompat.iteritems(self.map)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
590 if e[1] == tagsparent
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
591 ]
25741
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
592 if tagsparents:
86fe3c404c1e convert: add config to not convert tags
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
593 self.map[tagsparents[0][0]] = nrev
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
594
13745
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
595 bookmarks = self.source.getbookmarks()
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
596 cbookmarks = {}
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
597 for k in bookmarks:
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
598 v = bookmarks[k]
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
599 if self.map.get(v, SKIPREV) != SKIPREV:
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
600 cbookmarks[k] = self.map[v]
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
601
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
602 if c and cbookmarks:
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
603 self.dest.putbookmarks(cbookmarks)
9ff22f600c6c convert: add bookmark support to main command
Edouard Gomez <ed.gomez@free.fr>
parents: 13685
diff changeset
604
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
605 self.writeauthormap()
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
606 finally:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
607 self.cleanup()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
608
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
609 def cleanup(self):
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
610 try:
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
611 self.dest.after()
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
612 finally:
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
613 self.source.after()
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
614 self.map.close()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
615
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
616
5281
a176f9c8b26e convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5256
diff changeset
617 def convert(ui, src, dest=None, revmapfile=None, **opts):
36329
93943eef696f py3: use pycompat.byteskwargs in hgext/convert/
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36148
diff changeset
618 opts = pycompat.byteskwargs(opts)
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
619 global orig_encoding
7948
de377b1a9a84 move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents: 7877
diff changeset
620 orig_encoding = encoding.encoding
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
621 encoding.encoding = b'UTF-8'
4895
fa6c9381d053 convert: manually set encoding to UTF-8
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4883
diff changeset
622
12198
0c67a58f0580 convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents: 11731
diff changeset
623 # support --authors as an alias for --authormap
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
624 if not opts.get(b'authormap'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
625 opts[b'authormap'] = opts.get(b'authors')
12198
0c67a58f0580 convert: deprecate --authors in preference for --authormap
Martin Geisler <mg@lazybytes.net>
parents: 11731
diff changeset
626
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
627 if not dest:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
628 dest = hg.defaultdest(src) + b"-hg"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
629 ui.status(_(b"assuming destination %s\n") % dest)
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
630
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
631 destc = convertsink(ui, dest, opts.get(b'dest_type'))
35177
9700cb9df140 convert: allow the sink object to be wrapped when the extension isn't loaded
Matt Harbison <matt_harbison@yahoo.com>
parents: 35176
diff changeset
632 destc = scmutil.wrapconvertsink(destc)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
633
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
634 try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
635 srcc, defaultsort = convertsource(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
636 ui, src, opts.get(b'source_type'), opts.get(b'rev')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
637 )
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
638 except Exception:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
639 for path in destc.created:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
640 shutil.rmtree(path, True)
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
641 raise
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
642
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
643 sortmodes = (b'branchsort', b'datesort', b'sourcesort', b'closesort')
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
644 sortmode = [m for m in sortmodes if opts.get(m)]
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8689
diff changeset
645 if len(sortmode) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
646 raise error.Abort(_(b'more than one sort mode specified'))
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
647 if sortmode:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
648 sortmode = sortmode[0]
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
649 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
650 sortmode = defaultsort
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22411
diff changeset
651
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
652 if sortmode == b'sourcesort' and not srcc.hasnativeorder():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
653 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
654 _(b'--sourcesort is not supported by this data source')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41418
diff changeset
655 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
656 if sortmode == b'closesort' and not srcc.hasnativeclose():
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
657 raise error.Abort(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
658 _(b'--closesort is not supported by this data source')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
659 )
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
660
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
661 fmap = opts.get(b'filemap')
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
662 if fmap:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
663 srcc = filemap.filemap_source(ui, srcc, fmap)
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
664 destc.setfilemapmode(True)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
665
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4958
diff changeset
666 if not revmapfile:
19889
3828b3e09462 convert: remove unused and incorrect default handling for revmapfile
Mads Kiilerich <madski@unity3d.com>
parents: 19181
diff changeset
667 revmapfile = destc.revmapfile()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
668
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
669 c = converter(ui, srcc, destc, revmapfile, opts)
8689
9bc95f8eb018 convert: parse sort mode sooner
Patrick Mezard <pmezard@gmail.com>
parents: 8688
diff changeset
670 c.convert(sortmode)