annotate hgext/convert/filemap.py @ 40910:4bb6195755b1

test: enable sparse-revlog for test-ssh-proto-unbundle.t We are about to enable sparse-revlog globally. To help with reviewing the tests change, we isolate them in individual changesets. Differential Revision: https://phab.mercurial-scm.org/D5337
author Boris Feld <boris.feld@octobus.net>
date Mon, 12 Nov 2018 01:17:05 +0100
parents 41c0e7b7869c
children 77088fa862df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5376
d60a067227a5 convert: move filemapper class to a separate file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5375
diff changeset
1 # Copyright 2007 Bryan O'Sullivan <bos@serpentine.com>
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
2 # Copyright 2007 Alexis S. L. Carvalho <alexis@cecm.usp.br>
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
3 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8150
diff changeset
4 # 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: 8693
diff changeset
5 # GNU General Public License version 2 or any later version.
34137
a8994d08e4a2 doctest: use print_function and convert bytes to unicode where needed
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
6
a8994d08e4a2 doctest: use print_function and convert bytes to unicode where needed
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
7 from __future__ import absolute_import, print_function
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
8
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
9 import posixpath
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28367
diff changeset
10
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28367
diff changeset
11 from mercurial.i18n import _
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
12 from mercurial import (
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
13 error,
36560
41c0e7b7869c convert: fix two %r output formats with pycompat.bytestr() wrapping
Augie Fackler <augie@google.com>
parents: 36559
diff changeset
14 pycompat,
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
15 )
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
16 from . import common
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
17 SKIPREV = common.SKIPREV
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
18
20048
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
19 def rpairs(path):
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
20 '''Yield tuples with path split at '/', starting with the full path.
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
21 No leading, trailing or double '/', please.
34137
a8994d08e4a2 doctest: use print_function and convert bytes to unicode where needed
Yuya Nishihara <yuya@tcha.org>
parents: 34131
diff changeset
22 >>> for x in rpairs(b'foo/bar/baz'): print(x)
20048
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
23 ('foo/bar/baz', '')
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
24 ('foo/bar', 'baz')
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
25 ('foo', 'bar/baz')
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
26 ('.', 'foo/bar/baz')
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
27 '''
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
28 i = len(path)
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
29 while i != -1:
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
30 yield path[:i], path[i + 1:]
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
31 i = path.rfind('/', 0, i)
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
32 yield '.', path
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
33
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
34 def normalize(path):
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
35 ''' We use posixpath.normpath to support cross-platform path format.
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
36 However, it doesn't handle None input. So we wrap it up. '''
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
37 if path is None:
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
38 return None
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
39 return posixpath.normpath(path)
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
40
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
41 class filemapper(object):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
42 '''Map and filter filenames when importing.
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
43 A name can be mapped to itself, a new name, or None (omit from new
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
44 repository).'''
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
45
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
46 def __init__(self, ui, path=None):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
47 self.ui = ui
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
48 self.include = {}
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
49 self.exclude = {}
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
50 self.rename = {}
26036
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
51 self.targetprefixes = None
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
52 if path:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
53 if self.parse(path):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26036
diff changeset
54 raise error.Abort(_('errors in filemap'))
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
55
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
56 def parse(self, path):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
57 errs = 0
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
58 def check(name, mapping, listname):
11680
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
59 if not name:
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
60 self.ui.warn(_('%s:%d: path to %s is missing\n') %
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
61 (lex.infile, lex.lineno, listname))
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
62 return 1
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
63 if name in mapping:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
64 self.ui.warn(_('%s:%d: %r already in %s list\n') %
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
65 (lex.infile, lex.lineno, name, listname))
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
66 return 1
11680
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
67 if (name.startswith('/') or
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
68 name.endswith('/') or
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
69 '//' in name):
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
70 self.ui.warn(_('%s:%d: superfluous / in %s %r\n') %
36560
41c0e7b7869c convert: fix two %r output formats with pycompat.bytestr() wrapping
Augie Fackler <augie@google.com>
parents: 36559
diff changeset
71 (lex.infile, lex.lineno, listname,
41c0e7b7869c convert: fix two %r output formats with pycompat.bytestr() wrapping
Augie Fackler <augie@google.com>
parents: 36559
diff changeset
72 pycompat.bytestr(name)))
11680
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
73 return 1
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
74 return 0
36559
5374a22d014a convert: use our shlex wrapper in filemap to avoid Python 3 tracebacks
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
75 lex = common.shlexer(
5374a22d014a convert: use our shlex wrapper in filemap to avoid Python 3 tracebacks
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
76 filepath=path, wordchars='!@#$%^&*()-=+[]{}|;:,./<>?')
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
77 cmd = lex.get_token()
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
78 while cmd:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
79 if cmd == 'include':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
80 name = normalize(lex.get_token())
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
81 errs += check(name, self.exclude, 'exclude')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
82 self.include[name] = name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
83 elif cmd == 'exclude':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
84 name = normalize(lex.get_token())
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
85 errs += check(name, self.include, 'include')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
86 errs += check(name, self.rename, 'rename')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
87 self.exclude[name] = name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
88 elif cmd == 'rename':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
89 src = normalize(lex.get_token())
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
90 dest = normalize(lex.get_token())
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
91 errs += check(src, self.exclude, 'exclude')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
92 self.rename[src] = dest
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
93 elif cmd == 'source':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
94 errs += self.parse(normalize(lex.get_token()))
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
95 else:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
96 self.ui.warn(_('%s:%d: unknown directive %r\n') %
36560
41c0e7b7869c convert: fix two %r output formats with pycompat.bytestr() wrapping
Augie Fackler <augie@google.com>
parents: 36559
diff changeset
97 (lex.infile, lex.lineno, pycompat.bytestr(cmd)))
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
98 errs += 1
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
99 cmd = lex.get_token()
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
100 return errs
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
101
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
102 def lookup(self, name, mapping):
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
103 name = normalize(name)
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
104 for pre, suf in rpairs(name):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
105 try:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
106 return mapping[pre], pre, suf
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5803
diff changeset
107 except KeyError:
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
108 pass
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
109 return '', name, ''
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5139
diff changeset
110
26036
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
111 def istargetfile(self, filename):
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
112 """Return true if the given target filename is covered as a destination
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
113 of the filemap. This is useful for identifying what parts of the target
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
114 repo belong to the source repo and what parts don't."""
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
115 if self.targetprefixes is None:
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
116 self.targetprefixes = set()
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
117 for before, after in self.rename.iteritems():
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
118 self.targetprefixes.add(after)
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
119
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
120 # If "." is a target, then all target files are considered from the
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
121 # source.
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
122 if not self.targetprefixes or '.' in self.targetprefixes:
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
123 return True
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
124
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
125 filename = normalize(filename)
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
126 for pre, suf in rpairs(filename):
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
127 # This check is imperfect since it doesn't account for the
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
128 # include/exclude list, but it should work in filemaps that don't
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
129 # apply include/exclude to the same source directories they are
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
130 # renaming.
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
131 if pre in self.targetprefixes:
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
132 return True
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
133 return False
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
134
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
135 def __call__(self, name):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
136 if self.include:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
137 inc = self.lookup(name, self.include)[0]
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
138 else:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
139 inc = name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
140 if self.exclude:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
141 exc = self.lookup(name, self.exclude)[0]
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
142 else:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
143 exc = ''
9884
2dd700a35fd1 convert: make filemap favor most specific filtering rule
Stefan Simek <simek@triaxis.sk>
parents: 8693
diff changeset
144 if (not self.include and exc) or (len(inc) <= len(exc)):
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
145 return None
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
146 newpre, pre, suf = self.lookup(name, self.rename)
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
147 if newpre:
5133
745cffe59ca8 convert: use '.' as destination name if renaming subdir into root
Bryan O'Sullivan <bos@serpentine.com>
parents: 5127
diff changeset
148 if newpre == '.':
745cffe59ca8 convert: use '.' as destination name if renaming subdir into root
Bryan O'Sullivan <bos@serpentine.com>
parents: 5127
diff changeset
149 return suf
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
150 if suf:
15565
3992c7df85f2 convert: handle trailing slashes in filemap better (issue3124)
Matt Mackall <mpm@selenic.com>
parents: 15107
diff changeset
151 if newpre.endswith('/'):
3992c7df85f2 convert: handle trailing slashes in filemap better (issue3124)
Matt Mackall <mpm@selenic.com>
parents: 15107
diff changeset
152 return newpre + suf
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
153 return newpre + '/' + suf
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
154 return newpre
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
155 return name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
156
5195
33015dac5df5 convert: fix mercurial_sink.putcommit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5173
diff changeset
157 def active(self):
33015dac5df5 convert: fix mercurial_sink.putcommit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5173
diff changeset
158 return bool(self.include or self.exclude or self.rename)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
159
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
160 # This class does two additional things compared to a regular source:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
161 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
162 # - Filter and rename files. This is mostly wrapped by the filemapper
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
163 # class above. We hide the original filename in the revision that is
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
164 # returned by getchanges to be able to find things later in getfile.
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
165 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
166 # - Return only revisions that matter for the files we're interested in.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
167 # This involves rewriting the parents of the original revision to
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
168 # create a graph that is restricted to those revisions.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
169 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
170 # This set of revisions includes not only revisions that directly
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
171 # touch files we're interested in, but also merges that merge two
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
172 # or more interesting revisions.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
173
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
174 class filemap_source(common.converter_source):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
175 def __init__(self, ui, baseconverter, filemap):
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34137
diff changeset
176 super(filemap_source, self).__init__(ui, baseconverter.repotype)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
177 self.base = baseconverter
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
178 self.filemapper = filemapper(ui, filemap)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
179 self.commits = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
180 # if a revision rev has parent p in the original revision graph, then
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
181 # rev will have parent self.parentmap[p] in the restricted graph.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
182 self.parentmap = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
183 # self.wantedancestors[rev] is the set of all ancestors of rev that
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
184 # are in the restricted graph.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
185 self.wantedancestors = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
186 self.convertedorder = None
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
187 self._rebuilt = False
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
188 self.origparents = {}
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
189 self.children = {}
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
190 self.seenchildren = {}
25742
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
191 # experimental config: convert.ignoreancestorcheck
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
192 self.ignoreancestorcheck = self.ui.configbool('convert',
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
193 'ignoreancestorcheck')
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
194
5799
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
195 def before(self):
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
196 self.base.before()
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
197
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
198 def after(self):
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
199 self.base.after()
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
200
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5401
diff changeset
201 def setrevmap(self, revmap):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
202 # rebuild our state to make things restartable
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
203 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
204 # To avoid calling getcommit for every revision that has already
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
205 # been converted, we rebuild only the parentmap, delaying the
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
206 # rebuild of wantedancestors until we need it (i.e. until a
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
207 # merge).
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
208 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
209 # We assume the order argument lists the revisions in
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
210 # topological order, so that we can infer which revisions were
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
211 # wanted by previous runs.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
212 self._rebuilt = not revmap
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
213 seen = {SKIPREV: SKIPREV}
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 7875
diff changeset
214 dummyset = set()
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
215 converted = []
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5401
diff changeset
216 for rev in revmap.order:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
217 mapped = revmap[rev]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
218 wanted = mapped not in seen
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
219 if wanted:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
220 seen[mapped] = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
221 self.parentmap[rev] = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
222 else:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
223 self.parentmap[rev] = seen[mapped]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
224 self.wantedancestors[rev] = dummyset
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
225 arg = seen[mapped]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
226 if arg == SKIPREV:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
227 arg = None
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
228 converted.append((rev, wanted, arg))
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
229 self.convertedorder = converted
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5401
diff changeset
230 return self.base.setrevmap(revmap)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
231
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
232 def rebuild(self):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
233 if self._rebuilt:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
234 return True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
235 self._rebuilt = True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
236 self.parentmap.clear()
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
237 self.wantedancestors.clear()
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
238 self.seenchildren.clear()
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
239 for rev, wanted, arg in self.convertedorder:
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
240 if rev not in self.origparents:
19863
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
241 try:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
242 self.origparents[rev] = self.getcommit(rev).parents
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
243 except error.RepoLookupError:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
244 self.ui.debug("unknown revmap source: %s\n" % rev)
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
245 continue
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
246 if arg is not None:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
247 self.children[arg] = self.children.get(arg, 0) + 1
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
248
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
249 for rev, wanted, arg in self.convertedorder:
19863
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
250 try:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
251 parents = self.origparents[rev]
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
252 except KeyError:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
253 continue # unknown revmap source
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
254 if wanted:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
255 self.mark_wanted(rev, parents)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
256 else:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
257 self.mark_not_wanted(rev, arg)
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
258 self._discard(arg, *parents)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
259
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
260 return True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
261
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
262 def getheads(self):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
263 return self.base.getheads()
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
264
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
265 def getcommit(self, rev):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
266 # We want to save a reference to the commit objects to be able
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
267 # to rewrite their parents later on.
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
268 c = self.commits[rev] = self.base.getcommit(rev)
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
269 for p in c.parents:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
270 self.children[p] = self.children.get(p, 0) + 1
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
271 return c
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
272
13968
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
273 def _cachedcommit(self, rev):
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
274 if rev in self.commits:
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
275 return self.commits[rev]
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
276 return self.base.getcommit(rev)
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
277
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
278 def _discard(self, *revs):
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
279 for r in revs:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
280 if r is None:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
281 continue
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
282 self.seenchildren[r] = self.seenchildren.get(r, 0) + 1
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
283 if self.seenchildren[r] == self.children[r]:
19862
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
284 self.wantedancestors.pop(r, None)
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
285 self.parentmap.pop(r, None)
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
286 del self.seenchildren[r]
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
287 if self._rebuilt:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
288 del self.children[r]
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
289
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
290 def wanted(self, rev, i):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
291 # Return True if we're directly interested in rev.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
292 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
293 # i is an index selecting one of the parents of rev (if rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
294 # has no parents, i is None). getchangedfiles will give us
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
295 # the list of files that are different in rev and in the parent
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
296 # indicated by i. If we're interested in any of these files,
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
297 # we're interested in rev.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
298 try:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
299 files = self.base.getchangedfiles(rev, i)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
300 except NotImplementedError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26036
diff changeset
301 raise error.Abort(_("source repository doesn't support --filemap"))
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
302 for f in files:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
303 if self.filemapper(f):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
304 return True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
305 return False
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
306
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
307 def mark_not_wanted(self, rev, p):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
308 # Mark rev as not interesting and update data structures.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
309
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
310 if p is None:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
311 # A root revision. Use SKIPREV to indicate that it doesn't
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
312 # map to any revision in the restricted graph. Put SKIPREV
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
313 # in the set of wanted ancestors to simplify code elsewhere
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
314 self.parentmap[rev] = SKIPREV
32291
bd872f64a8ba cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents: 29205
diff changeset
315 self.wantedancestors[rev] = {SKIPREV}
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
316 return
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
317
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
318 # Reuse the data from our parent.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
319 self.parentmap[rev] = self.parentmap[p]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
320 self.wantedancestors[rev] = self.wantedancestors[p]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
321
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
322 def mark_wanted(self, rev, parents):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
323 # Mark rev ss wanted and update data structures.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
324
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
325 # rev will be in the restricted graph, so children of rev in
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
326 # the original graph should still have rev as a parent in the
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
327 # restricted graph.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
328 self.parentmap[rev] = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
329
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
330 # The set of wanted ancestors of rev is the union of the sets
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
331 # of wanted ancestors of its parents. Plus rev itself.
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 7875
diff changeset
332 wrev = set()
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
333 for p in parents:
19862
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
334 if p in self.wantedancestors:
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
335 wrev.update(self.wantedancestors[p])
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
336 else:
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
337 self.ui.warn(_('warning: %s parent %s is missing\n') %
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
338 (rev, p))
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
339 wrev.add(rev)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
340 self.wantedancestors[rev] = wrev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
341
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 20048
diff changeset
342 def getchanges(self, rev, full):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
343 parents = self.commits[rev].parents
25742
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
344 if len(parents) > 1 and not self.ignoreancestorcheck:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
345 self.rebuild()
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
346
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
347 # To decide whether we're interested in rev we:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
348 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
349 # - calculate what parents rev will have if it turns out we're
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
350 # interested in it. If it's going to have more than 1 parent,
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
351 # we're interested in it.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
352 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
353 # - otherwise, we'll compare it with the single parent we found.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
354 # If any of the files we're interested in is different in the
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
355 # the two revisions, we're interested in rev.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
356
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
357 # A parent p is interesting if its mapped version (self.parentmap[p]):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
358 # - is not SKIPREV
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
359 # - is still not in the list of parents (we don't want duplicates)
17103
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
360 # - is not an ancestor of the mapped versions of the other parents or
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
361 # there is no parent in the same branch than the current revision.
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
362 mparents = []
17103
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
363 knownparents = set()
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
364 branch = self.commits[rev].branch
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
365 hasbranchparent = False
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
366 for i, p1 in enumerate(parents):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
367 mp1 = self.parentmap[p1]
17103
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
368 if mp1 == SKIPREV or mp1 in knownparents:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
369 continue
25742
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
370
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
371 isancestor = (not self.ignoreancestorcheck and
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
372 any(p2 for p2 in parents
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
373 if p1 != p2 and mp1 != self.parentmap[p2]
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
374 and mp1 in self.wantedancestors[p2]))
17103
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
375 if not isancestor and not hasbranchparent and len(parents) > 1:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
376 # This could be expensive, avoid unnecessary calls.
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
377 if self._cachedcommit(p1).branch == branch:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
378 hasbranchparent = True
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
379 mparents.append((p1, mp1, i, isancestor))
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
380 knownparents.add(mp1)
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
381 # Discard parents ancestors of other parents if there is a
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
382 # non-ancestor one on the same branch than current revision.
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
383 if hasbranchparent:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
384 mparents = [p for p in mparents if not p[3]]
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
385 wp = None
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
386 if mparents:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
387 wp = max(p[2] for p in mparents)
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
388 mparents = [p[1] for p in mparents]
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
389 elif parents:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
390 wp = 0
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
391
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
392 self.origparents[rev] = parents
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
393
13968
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
394 closed = False
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
395 if 'close' in self.commits[rev].extra:
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
396 # A branch closing revision is only useful if one of its
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
397 # parents belong to the branch being closed
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
398 pbranches = [self._cachedcommit(p).branch for p in mparents]
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
399 if branch in pbranches:
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
400 closed = True
11673
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
401
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
402 if len(mparents) < 2 and not closed and not self.wanted(rev, wp):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
403 # We don't want this revision.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
404 # Update our state and tell the convert process to map this
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
405 # revision to the same revision its parent as mapped to.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
406 p = None
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
407 if parents:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
408 p = parents[wp]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
409 self.mark_not_wanted(rev, p)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
410 self.convertedorder.append((rev, False, p))
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
411 self._discard(*parents)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
412 return self.parentmap[rev]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
413
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
414 # We want this revision.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
415 # Rewrite the parents of the commit object
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
416 self.commits[rev].parents = mparents
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
417 self.mark_wanted(rev, parents)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
418 self.convertedorder.append((rev, True, None))
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
419 self._discard(*parents)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
420
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
421 # Get the real changes and do the filtering/mapping. To be
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
422 # able to get the files later on in getfile, we hide the
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
423 # original filename in the rev part of the return value.
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
424 changes, copies, cleanp2 = self.base.getchanges(rev, full)
17174
32b2e6d641e4 convert: make filemap renames consistently override revision renames
Wagner Bruna <wbruna@yahoo.com>
parents: 15565
diff changeset
425 files = {}
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
426 ncleanp2 = set(cleanp2)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
427 for f, r in changes:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
428 newf = self.filemapper(f)
17174
32b2e6d641e4 convert: make filemap renames consistently override revision renames
Wagner Bruna <wbruna@yahoo.com>
parents: 15565
diff changeset
429 if newf and (newf != f or newf not in files):
32b2e6d641e4 convert: make filemap renames consistently override revision renames
Wagner Bruna <wbruna@yahoo.com>
parents: 15565
diff changeset
430 files[newf] = (f, r)
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
431 if newf != f:
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
432 ncleanp2.discard(f)
17174
32b2e6d641e4 convert: make filemap renames consistently override revision renames
Wagner Bruna <wbruna@yahoo.com>
parents: 15565
diff changeset
433 files = sorted(files.items())
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
434
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
435 ncopies = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
436 for c in copies:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
437 newc = self.filemapper(c)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
438 if newc:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
439 newsource = self.filemapper(copies[c])
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
440 if newsource:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
441 ncopies[newc] = newsource
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
442
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
443 return files, ncopies, ncleanp2
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
444
26036
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
445 def targetfilebelongstosource(self, targetfilename):
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
446 return self.filemapper.istargetfile(targetfilename)
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
447
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
448 def getfile(self, name, rev):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
449 realname, realrev = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
450 return self.base.getfile(realname, realrev)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
451
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
452 def gettags(self):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
453 return self.base.gettags()
8691
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
454
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
455 def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
456 return self.base.hasnativeorder()
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
457
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
458 def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
459 return self.base.lookuprev(rev)
15107
2433525a9e1e convert: added bookmarks support in filemap
etienne <etienne.desautels@gmail.com>
parents: 13968
diff changeset
460
2433525a9e1e convert: added bookmarks support in filemap
etienne <etienne.desautels@gmail.com>
parents: 13968
diff changeset
461 def getbookmarks(self):
2433525a9e1e convert: added bookmarks support in filemap
etienne <etienne.desautels@gmail.com>
parents: 13968
diff changeset
462 return self.base.getbookmarks()
19892
77872b002e73 convert: update source shamap when using filemap, just as when not using filemap
Mads Kiilerich <madski@unity3d.com>
parents: 19863
diff changeset
463
77872b002e73 convert: update source shamap when using filemap, just as when not using filemap
Mads Kiilerich <madski@unity3d.com>
parents: 19863
diff changeset
464 def converted(self, rev, sinkrev):
77872b002e73 convert: update source shamap when using filemap, just as when not using filemap
Mads Kiilerich <madski@unity3d.com>
parents: 19863
diff changeset
465 self.base.converted(rev, sinkrev)