annotate hgext/convert/filemap.py @ 28367:58b176240df6

convert: filemap use absolute_import
author timeless <timeless@mozdev.org>
date Wed, 02 Mar 2016 09:00:58 +0000
parents 56b2bcea2529
children a0939666b836
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.
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
6 from __future__ import absolute_import
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
7
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
8 import posixpath
5376
d60a067227a5 convert: move filemapper class to a separate file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5375
diff changeset
9 import shlex
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
10 from mercurial import (
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
11 error,
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
12 )
5376
d60a067227a5 convert: move filemapper class to a separate file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5375
diff changeset
13 from mercurial.i18n import _
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
14 from . import common
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
15 SKIPREV = common.SKIPREV
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
16
20048
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
17 def rpairs(path):
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
18 '''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
19 No leading, trailing or double '/', please.
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
20 >>> for x in rpairs('foo/bar/baz'): print x
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
21 ('foo/bar/baz', '')
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
22 ('foo/bar', 'baz')
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 '''
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
26 i = len(path)
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
27 while i != -1:
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
28 yield path[:i], path[i + 1:]
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
29 i = path.rfind('/', 0, i)
da99ebd35f00 convert: readability and test of rpairs function
Mads Kiilerich <madski@unity3d.com>
parents: 19892
diff changeset
30 yield '.', path
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
31
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
32 def normalize(path):
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
33 ''' 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
34 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
35 if path is None:
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
36 return None
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
37 return posixpath.normpath(path)
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
38
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
39 class filemapper(object):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
40 '''Map and filter filenames when importing.
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
41 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
42 repository).'''
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
43
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
44 def __init__(self, ui, path=None):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
45 self.ui = ui
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
46 self.include = {}
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
47 self.exclude = {}
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
48 self.rename = {}
26036
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
49 self.targetprefixes = None
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
50 if path:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
51 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
52 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
53
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
54 def parse(self, path):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
55 errs = 0
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
56 def check(name, mapping, listname):
11680
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
57 if not name:
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
58 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
59 (lex.infile, lex.lineno, listname))
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
60 return 1
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
61 if name in mapping:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
62 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
63 (lex.infile, lex.lineno, name, listname))
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
64 return 1
11680
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
65 if (name.startswith('/') or
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
66 name.endswith('/') or
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
67 '//' in name):
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
68 self.ui.warn(_('%s:%d: superfluous / in %s %r\n') %
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
69 (lex.infile, lex.lineno, listname, name))
7fefef3ce791 convert: warn on superfluous / in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11673
diff changeset
70 return 1
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
71 return 0
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
72 lex = shlex.shlex(open(path), path, True)
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
73 lex.wordchars += '!@#$%^&*()-=+[]{}|;:,./<>?'
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
74 cmd = lex.get_token()
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
75 while cmd:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
76 if cmd == 'include':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
77 name = normalize(lex.get_token())
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
78 errs += check(name, self.exclude, 'exclude')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
79 self.include[name] = name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
80 elif cmd == 'exclude':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
81 name = normalize(lex.get_token())
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
82 errs += check(name, self.include, 'include')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
83 errs += check(name, self.rename, 'rename')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
84 self.exclude[name] = name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
85 elif cmd == 'rename':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
86 src = normalize(lex.get_token())
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
87 dest = normalize(lex.get_token())
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
88 errs += check(src, self.exclude, 'exclude')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
89 self.rename[src] = dest
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
90 elif cmd == 'source':
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
91 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
92 else:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
93 self.ui.warn(_('%s:%d: unknown directive %r\n') %
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
94 (lex.infile, lex.lineno, cmd))
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
95 errs += 1
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
96 cmd = lex.get_token()
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
97 return errs
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
98
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
99 def lookup(self, name, mapping):
17797
e4da793998bf convert: normalize paths in filemaps (issue3612)
Huayang <huayang@fb.com>
parents: 17184
diff changeset
100 name = normalize(name)
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
101 for pre, suf in rpairs(name):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
102 try:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
103 return mapping[pre], pre, suf
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 5803
diff changeset
104 except KeyError:
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
105 pass
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
106 return '', name, ''
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5139
diff changeset
107
26036
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
108 def istargetfile(self, filename):
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
109 """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
110 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
111 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
112 if self.targetprefixes is None:
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
113 self.targetprefixes = set()
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
114 for before, after in self.rename.iteritems():
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
115 self.targetprefixes.add(after)
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
116
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
117 # 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
118 # source.
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
119 if not self.targetprefixes or '.' in self.targetprefixes:
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
120 return True
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
121
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
122 filename = normalize(filename)
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
123 for pre, suf in rpairs(filename):
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
124 # 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
125 # 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
126 # 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
127 # renaming.
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
128 if pre in self.targetprefixes:
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
129 return True
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
130 return False
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
131
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
132 def __call__(self, name):
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
133 if self.include:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
134 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
135 else:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
136 inc = name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
137 if self.exclude:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
138 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
139 else:
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
140 exc = ''
9884
2dd700a35fd1 convert: make filemap favor most specific filtering rule
Stefan Simek <simek@triaxis.sk>
parents: 8693
diff changeset
141 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
142 return None
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
143 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
144 if newpre:
5133
745cffe59ca8 convert: use '.' as destination name if renaming subdir into root
Bryan O'Sullivan <bos@serpentine.com>
parents: 5127
diff changeset
145 if newpre == '.':
745cffe59ca8 convert: use '.' as destination name if renaming subdir into root
Bryan O'Sullivan <bos@serpentine.com>
parents: 5127
diff changeset
146 return suf
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
147 if suf:
15565
3992c7df85f2 convert: handle trailing slashes in filemap better (issue3124)
Matt Mackall <mpm@selenic.com>
parents: 15107
diff changeset
148 if newpre.endswith('/'):
3992c7df85f2 convert: handle trailing slashes in filemap better (issue3124)
Matt Mackall <mpm@selenic.com>
parents: 15107
diff changeset
149 return newpre + suf
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
150 return newpre + '/' + suf
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
151 return newpre
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
152 return name
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
153
5195
33015dac5df5 convert: fix mercurial_sink.putcommit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5173
diff changeset
154 def active(self):
33015dac5df5 convert: fix mercurial_sink.putcommit
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5173
diff changeset
155 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
156
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
157 # 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
158 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
159 # - 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
160 # 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
161 # 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
162 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
163 # - 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
164 # 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
165 # 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
166 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
167 # 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
168 # 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
169 # or more interesting revisions.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
170
28367
58b176240df6 convert: filemap use absolute_import
timeless <timeless@mozdev.org>
parents: 26587
diff changeset
171 class filemap_source(common.converter_source):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
172 def __init__(self, ui, baseconverter, filemap):
5556
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
173 super(filemap_source, self).__init__(ui)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
174 self.base = baseconverter
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
175 self.filemapper = filemapper(ui, filemap)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
176 self.commits = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
177 # 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
178 # 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
179 self.parentmap = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
180 # 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
181 # are in the restricted graph.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
182 self.wantedancestors = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
183 self.convertedorder = None
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
184 self._rebuilt = False
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
185 self.origparents = {}
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
186 self.children = {}
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
187 self.seenchildren = {}
25742
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
188 # experimental config: convert.ignoreancestorcheck
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
189 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
190 'ignoreancestorcheck')
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
191
5799
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
192 def before(self):
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
193 self.base.before()
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
194
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
195 def after(self):
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
196 self.base.after()
4b82d1a84db8 convert: filemap must call base converter before()/after() actions
Patrick Mezard <pmezard@gmail.com>
parents: 5401
diff changeset
197
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5401
diff changeset
198 def setrevmap(self, revmap):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
199 # rebuild our state to make things restartable
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
200 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
201 # 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
202 # 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
203 # 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
204 # merge).
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
205 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
206 # 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
207 # 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
208 # wanted by previous runs.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
209 self._rebuilt = not revmap
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
210 seen = {SKIPREV: SKIPREV}
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 7875
diff changeset
211 dummyset = set()
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
212 converted = []
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5401
diff changeset
213 for rev in revmap.order:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
214 mapped = revmap[rev]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
215 wanted = mapped not in seen
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
216 if wanted:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
217 seen[mapped] = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
218 self.parentmap[rev] = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
219 else:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
220 self.parentmap[rev] = seen[mapped]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
221 self.wantedancestors[rev] = dummyset
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
222 arg = seen[mapped]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
223 if arg == SKIPREV:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
224 arg = None
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
225 converted.append((rev, wanted, arg))
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
226 self.convertedorder = converted
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5401
diff changeset
227 return self.base.setrevmap(revmap)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
228
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
229 def rebuild(self):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
230 if self._rebuilt:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
231 return True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
232 self._rebuilt = True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
233 self.parentmap.clear()
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
234 self.wantedancestors.clear()
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
235 self.seenchildren.clear()
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
236 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
237 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
238 try:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
239 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
240 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
241 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
242 continue
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
243 if arg is not None:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
244 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
245
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
246 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
247 try:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
248 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
249 except KeyError:
daeab82fa644 convert: fix crash when existing converted revision didn't come from source
Mads Kiilerich <madski@unity3d.com>
parents: 19862
diff changeset
250 continue # unknown revmap source
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
251 if wanted:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
252 self.mark_wanted(rev, parents)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
253 else:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
254 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
255 self._discard(arg, *parents)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
256
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
257 return True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
258
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
259 def getheads(self):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
260 return self.base.getheads()
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 getcommit(self, rev):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
263 # 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
264 # 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
265 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
266 for p in c.parents:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
267 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
268 return c
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
269
13968
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
270 def _cachedcommit(self, rev):
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
271 if rev in self.commits:
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
272 return self.commits[rev]
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
273 return self.base.getcommit(rev)
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
274
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
275 def _discard(self, *revs):
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
276 for r in revs:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
277 if r is None:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
278 continue
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
279 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
280 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
281 self.wantedancestors.pop(r, None)
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
282 self.parentmap.pop(r, None)
5401
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
283 del self.seenchildren[r]
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
284 if self._rebuilt:
4c555dd167dd convert --filemap: reduce memory usage
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
285 del self.children[r]
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
286
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
287 def wanted(self, rev, i):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
288 # 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
289 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
290 # 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
291 # 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
292 # 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
293 # 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
294 # we're interested in rev.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
295 try:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
296 files = self.base.getchangedfiles(rev, i)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
297 except NotImplementedError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26036
diff changeset
298 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
299 for f in files:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
300 if self.filemapper(f):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
301 return True
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
302 return False
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
303
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
304 def mark_not_wanted(self, rev, p):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
305 # 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
306
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
307 if p is None:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
308 # 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
309 # 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
310 # 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
311 self.parentmap[rev] = SKIPREV
8150
bbc24c0753a0 util: use built-in set and frozenset
Martin Geisler <mg@lazybytes.net>
parents: 7875
diff changeset
312 self.wantedancestors[rev] = set((SKIPREV,))
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
313 return
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
314
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
315 # Reuse the data from our parent.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
316 self.parentmap[rev] = self.parentmap[p]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
317 self.wantedancestors[rev] = self.wantedancestors[p]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
318
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
319 def mark_wanted(self, rev, parents):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
320 # Mark rev ss wanted and update data structures.
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 # 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
323 # 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
324 # restricted graph.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
325 self.parentmap[rev] = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
326
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
327 # 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
328 # 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
329 wrev = set()
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
330 for p in parents:
19862
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
331 if p in self.wantedancestors:
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
332 wrev.update(self.wantedancestors[p])
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
333 else:
42455ebbab9f convert: fix crash when filemap filtering is changed
Mads Kiilerich <madski@unity3d.com>
parents: 17797
diff changeset
334 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
335 (rev, p))
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
336 wrev.add(rev)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
337 self.wantedancestors[rev] = wrev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
338
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 20048
diff changeset
339 def getchanges(self, rev, full):
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
340 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
341 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
342 self.rebuild()
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
343
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
344 # 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
345 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
346 # - 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
347 # 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
348 # we're interested in it.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
349 #
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
350 # - 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
351 # 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
352 # the two revisions, we're interested in rev.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
353
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
354 # 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
355 # - is not SKIPREV
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
356 # - 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
357 # - 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
358 # 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
359 mparents = []
17103
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
360 knownparents = set()
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
361 branch = self.commits[rev].branch
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
362 hasbranchparent = False
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
363 for i, p1 in enumerate(parents):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
364 mp1 = self.parentmap[p1]
17103
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
365 if mp1 == SKIPREV or mp1 in knownparents:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
366 continue
25742
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
367
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
368 isancestor = (not self.ignoreancestorcheck and
d859123e0f47 convert: add config option for disabling ancestor parent checks
Durham Goode <durham@fb.com>
parents: 25149
diff changeset
369 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
370 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
371 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
372 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
373 # 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
374 if self._cachedcommit(p1).branch == branch:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
375 hasbranchparent = True
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
376 mparents.append((p1, mp1, i, isancestor))
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
377 knownparents.add(mp1)
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
378 # 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
379 # 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
380 if hasbranchparent:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
381 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
382 wp = None
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
383 if mparents:
5146de7bce96 convert: keep branch switching merges with ancestors (issue3340)
Patrick Mezard <patrick@mezard.eu>
parents: 15565
diff changeset
384 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
385 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
386 elif parents:
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
387 wp = 0
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
388
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
389 self.origparents[rev] = parents
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
390
13968
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
391 closed = False
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
392 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
393 # 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
394 # 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
395 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
396 if branch in pbranches:
82845434e974 convert: make filemap prune useless branch closing revs (issue2774)
Patrick Mezard <pmezard@gmail.com>
parents: 11680
diff changeset
397 closed = True
11673
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
398
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
399 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
400 # We don't want this revision.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
401 # 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
402 # 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
403 p = None
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
404 if parents:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
405 p = parents[wp]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
406 self.mark_not_wanted(rev, p)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
407 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
408 self._discard(*parents)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
409 return self.parentmap[rev]
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
410
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
411 # We want this revision.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
412 # Rewrite the parents of the commit object
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
413 self.commits[rev].parents = mparents
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
414 self.mark_wanted(rev, parents)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
415 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
416 self._discard(*parents)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
417
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
418 # 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
419 # 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
420 # 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
421 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
422 files = {}
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
423 ncleanp2 = set(cleanp2)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
424 for f, r in changes:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
425 newf = self.filemapper(f)
17174
32b2e6d641e4 convert: make filemap renames consistently override revision renames
Wagner Bruna <wbruna@yahoo.com>
parents: 15565
diff changeset
426 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
427 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
428 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
429 ncleanp2.discard(f)
17174
32b2e6d641e4 convert: make filemap renames consistently override revision renames
Wagner Bruna <wbruna@yahoo.com>
parents: 15565
diff changeset
430 files = sorted(files.items())
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
431
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
432 ncopies = {}
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
433 for c in copies:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
434 newc = self.filemapper(c)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
435 if newc:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
436 newsource = self.filemapper(copies[c])
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
437 if newsource:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
438 ncopies[newc] = newsource
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
439
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
440 return files, ncopies, ncleanp2
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
441
26036
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
442 def targetfilebelongstosource(self, targetfilename):
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
443 return self.filemapper.istargetfile(targetfilename)
db677b70a298 convert: implements targetfilebelongstosource for filemap source
Durham Goode <durham@fb.com>
parents: 25742
diff changeset
444
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
445 def getfile(self, name, rev):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
446 realname, realrev = rev
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
447 return self.base.getfile(realname, realrev)
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
448
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
449 def gettags(self):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
450 return self.base.gettags()
8691
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
451
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
452 def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8225
diff changeset
453 return self.base.hasnativeorder()
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
454
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
455 def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
456 return self.base.lookuprev(rev)
15107
2433525a9e1e convert: added bookmarks support in filemap
etienne <etienne.desautels@gmail.com>
parents: 13968
diff changeset
457
2433525a9e1e convert: added bookmarks support in filemap
etienne <etienne.desautels@gmail.com>
parents: 13968
diff changeset
458 def getbookmarks(self):
2433525a9e1e convert: added bookmarks support in filemap
etienne <etienne.desautels@gmail.com>
parents: 13968
diff changeset
459 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
460
77872b002e73 convert: update source shamap when using filemap, just as when not using filemap
Mads Kiilerich <madski@unity3d.com>
parents: 19863
diff changeset
461 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
462 self.base.converted(rev, sinkrev)