annotate hgext/convert/p4.py @ 30597:fa2d2c8ac398

convert: don't use long list comprehensions We are iterating over p4changes. Make the continue condition more clear and easier to add new conditions in future patches, by removing the list comprehension and move the condition into the existing for-loop.
author David Soria Parra <davidsp@fb.com>
date Tue, 13 Dec 2016 21:49:58 -0800
parents a0939666b836
children 364e14885cea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
1 # Perforce source for convert extension.
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
2 #
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
3 # Copyright 2009, Frank Kingswood <frank@kingswood-consulting.co.uk>
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
5 # This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9476
diff changeset
6 # GNU General Public License version 2 or any later version.
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
7 from __future__ import absolute_import
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
8
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
9 import marshal
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
10 import re
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
11
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28371
diff changeset
12 from mercurial.i18n import _
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
13 from mercurial import (
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
14 error,
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
15 util,
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
16 )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
17
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
18 from . import common
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
19
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
20 def loaditer(f):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
21 "Yield the dictionary objects generated by p4"
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
22 try:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
23 while True:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
24 d = marshal.load(f)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
25 if not d:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
26 break
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
27 yield d
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
28 except EOFError:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
29 pass
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
30
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
31 def decodefilename(filename):
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
32 """Perforce escapes special characters @, #, *, or %
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
33 with %40, %23, %2A, or %25 respectively
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
34
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
35 >>> decodefilename('portable-net45%252Bnetcore45%252Bwp8%252BMonoAndroid')
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
36 'portable-net45%2Bnetcore45%2Bwp8%2BMonoAndroid'
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
37 >>> decodefilename('//Depot/Directory/%2525/%2523/%23%40.%2A')
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
38 '//Depot/Directory/%25/%23/#@.*'
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
39 """
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
40 replacements = [('%2A', '*'), ('%23', '#'), ('%40', '@'), ('%25', '%')]
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
41 for k, v in replacements:
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
42 filename = filename.replace(k, v)
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
43 return filename
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
44
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
45 class p4_source(common.converter_source):
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 24395
diff changeset
46 def __init__(self, ui, path, revs=None):
25884
b810b59eca62 convert: when converting from Perforce use original local encoding by default
Eugene Baranov <eug.baranov@gmail.com>
parents: 25882
diff changeset
47 # avoid import cycle
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
48 from . import convcmd
25884
b810b59eca62 convert: when converting from Perforce use original local encoding by default
Eugene Baranov <eug.baranov@gmail.com>
parents: 25882
diff changeset
49
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 24395
diff changeset
50 super(p4_source, self).__init__(ui, path, revs=revs)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
51
8829
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
52 if "/" in path and not path.startswith('//'):
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
53 raise common.NoRepo(_('%s does not look like a P4 repository') %
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
54 path)
7973
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7905
diff changeset
55
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
56 common.checktool('p4', abort=False)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
57
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
58 self.p4changes = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
59 self.heads = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
60 self.changeset = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
61 self.files = {}
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
62 self.copies = {}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
63 self.tags = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
64 self.lastbranch = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
65 self.parent = {}
25884
b810b59eca62 convert: when converting from Perforce use original local encoding by default
Eugene Baranov <eug.baranov@gmail.com>
parents: 25882
diff changeset
66 self.encoding = self.ui.config('convert', 'p4.encoding',
b810b59eca62 convert: when converting from Perforce use original local encoding by default
Eugene Baranov <eug.baranov@gmail.com>
parents: 25882
diff changeset
67 default=convcmd.orig_encoding)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
68 self.depotname = {} # mapping from local name to depot name
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
69 self.localname = {} # mapping from depot name to local name
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
70 self.re_type = re.compile(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
71 "([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
72 "(\+\w+)?$")
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
73 self.re_keywords = re.compile(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
74 r"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
75 r":[^$\n]*\$")
8829
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
76 self.re_keywords_old = re.compile("\$(Id|Header):[^$\n]*\$")
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
77
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 24395
diff changeset
78 if revs and len(revs) > 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25884
diff changeset
79 raise error.Abort(_("p4 source does not support specifying "
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 24395
diff changeset
80 "multiple revisions"))
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
81 self._parse(ui, path)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
82
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
83 def _parse_view(self, path):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
84 "Read changes affecting the path"
11347
18680b0e20a7 Fix shell quoting on p4 conversion
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 11134
diff changeset
85 cmd = 'p4 -G changes -s submitted %s' % util.shellquote(path)
9474
6ea653272c09 convert: fix marshalling in P4 convert extension to use a binary stream
Peter Ingebretson <pingebre@yahoo.com>
parents: 8843
diff changeset
86 stdout = util.popen(cmd, mode='rb')
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
87 for d in loaditer(stdout):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
88 c = d.get("change", None)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
89 if c:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
90 self.p4changes[c] = True
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
91
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
92 def _parse(self, ui, path):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
93 "Prepare list of P4 filenames and revisions to import"
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
94 ui.status(_('reading p4 views\n'))
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
95
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
96 # read client spec or view
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
97 if "/" in path:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
98 self._parse_view(path)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
99 if path.startswith("//") and path.endswith("/..."):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
100 views = {path[:-3]:""}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
101 else:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
102 views = {"//": ""}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
103 else:
11347
18680b0e20a7 Fix shell quoting on p4 conversion
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 11134
diff changeset
104 cmd = 'p4 -G client -o %s' % util.shellquote(path)
9474
6ea653272c09 convert: fix marshalling in P4 convert extension to use a binary stream
Peter Ingebretson <pingebre@yahoo.com>
parents: 8843
diff changeset
105 clientspec = marshal.load(util.popen(cmd, mode='rb'))
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
106
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
107 views = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
108 for client in clientspec:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
109 if client.startswith("View"):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
110 sview, cview = clientspec[client].split()
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
111 self._parse_view(sview)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
112 if sview.endswith("...") and cview.endswith("..."):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
113 sview = sview[:-3]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
114 cview = cview[:-3]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
115 cview = cview[2:]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
116 cview = cview[cview.find("/") + 1:]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
117 views[sview] = cview
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
118
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
119 # list of changes that affect our source files
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
120 self.p4changes = self.p4changes.keys()
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
121 self.p4changes.sort(key=int)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
122
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
123 # list with depot pathnames, longest first
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
124 vieworder = views.keys()
9039
8761863c3118 p4: simplify sort key
Martin Geisler <mg@lazybytes.net>
parents: 8843
diff changeset
125 vieworder.sort(key=len, reverse=True)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
126
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
127 # handle revision limiting
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
128 startrev = self.ui.config('convert', 'p4.startrev', default=0)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
129
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
130 # now read the full changelists to get the list of file revisions
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
131 ui.status(_('collecting p4 changelists\n'))
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
132 lastid = None
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
133 for change in self.p4changes:
30597
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
134 if startrev and int(change) < int(startrev):
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
135 continue
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
136 if self.revs and int(change) > int(self.revs[0]):
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
137 continue
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
138
12891
b69fd38a034e convert: Work around p4 instability (issue2465)
Mike Sperber <sperber@deinprogramm.de>
parents: 12401
diff changeset
139 cmd = "p4 -G describe -s %s" % change
9474
6ea653272c09 convert: fix marshalling in P4 convert extension to use a binary stream
Peter Ingebretson <pingebre@yahoo.com>
parents: 8843
diff changeset
140 stdout = util.popen(cmd, mode='rb')
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
141 d = marshal.load(stdout)
21758
c27a37678508 p4: accept changesets with no description (issue4282)
Matt Mackall <mpm@selenic.com>
parents: 16514
diff changeset
142 desc = self.recode(d.get("desc", ""))
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
143 shortdesc = desc.split("\n", 1)[0]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
144 t = '%s %s' % (d["change"], repr(shortdesc)[1:-1])
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
145 ui.status(util.ellipsis(t, 80) + '\n')
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
146
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
147 if lastid:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
148 parents = [lastid]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
149 else:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
150 parents = []
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
151
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
152 date = (int(d["time"]), 0) # timezone not set
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
153 c = common.commit(author=self.recode(d["user"]),
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
154 date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'),
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
155 parents=parents, desc=desc, branch=None,
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
156 extra={"p4": change})
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
157
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
158 files = []
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
159 copies = {}
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
160 copiedfiles = []
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
161 i = 0
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
162 while ("depotFile%d" % i) in d and ("rev%d" % i) in d:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
163 oldname = d["depotFile%d" % i]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
164 filename = None
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
165 for v in vieworder:
25776
809c3e4a9e31 convert: ignore case changes in vieworder for Perforce
Eugene Baranov <eug.baranov@gmail.com>
parents: 25775
diff changeset
166 if oldname.lower().startswith(v.lower()):
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
167 filename = decodefilename(views[v] + oldname[len(v):])
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
168 break
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
169 if filename:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
170 files.append((filename, d["rev%d" % i]))
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
171 self.depotname[filename] = oldname
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
172 if (d.get("action%d" % i) == "move/add"):
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
173 copiedfiles.append(filename)
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
174 self.localname[oldname] = filename
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
175 i += 1
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
176
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
177 # Collect information about copied files
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
178 for filename in copiedfiles:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
179 oldname = self.depotname[filename]
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
180
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
181 flcmd = 'p4 -G filelog %s' \
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
182 % util.shellquote(oldname)
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
183 flstdout = util.popen(flcmd, mode='rb')
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
184
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
185 copiedfilename = None
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
186 for d in loaditer(flstdout):
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
187 copiedoldname = None
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
188
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
189 i = 0
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
190 while ("change%d" % i) in d:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
191 if (d["change%d" % i] == change and
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
192 d["action%d" % i] == "move/add"):
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
193 j = 0
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
194 while ("file%d,%d" % (i, j)) in d:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
195 if d["how%d,%d" % (i, j)] == "moved from":
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
196 copiedoldname = d["file%d,%d" % (i, j)]
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
197 break
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
198 j += 1
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
199 i += 1
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
200
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
201 if copiedoldname and copiedoldname in self.localname:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
202 copiedfilename = self.localname[copiedoldname]
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
203 break
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
204
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
205 if copiedfilename:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
206 copies[filename] = copiedfilename
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
207 else:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
208 ui.warn(_("cannot find source for copied file: %s@%s\n")
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
209 % (filename, change))
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
210
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
211 self.changeset[change] = c
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
212 self.files[change] = files
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
213 self.copies[change] = copies
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
214 lastid = change
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
215
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
216 if lastid:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
217 self.heads = [lastid]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
218
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
219 def getheads(self):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
220 return self.heads
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
221
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
222 def getfile(self, name, rev):
11348
ad0a334eef16 p4: fix long line and bad spacing around %
Martin Geisler <mg@aragost.com>
parents: 11347
diff changeset
223 cmd = 'p4 -G print %s' \
ad0a334eef16 p4: fix long line and bad spacing around %
Martin Geisler <mg@aragost.com>
parents: 11347
diff changeset
224 % util.shellquote("%s#%s" % (self.depotname[name], rev))
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
225
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
226 lasterror = None
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
227 while True:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
228 stdout = util.popen(cmd, mode='rb')
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
229
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
230 mode = None
25882
97a9f7602014 convert: when getting file from Perforce concatenate data at the end
Eugene Baranov <eug.baranov@gmail.com>
parents: 25805
diff changeset
231 contents = []
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
232 keywords = None
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
233
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
234 for d in loaditer(stdout):
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
235 code = d["code"]
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
236 data = d.get("data")
8829
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
237
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
238 if code == "error":
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
239 # if this is the first time error happened
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
240 # re-attempt getting the file
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
241 if not lasterror:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
242 lasterror = IOError(d["generic"], data)
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
243 # this will exit inner-most for-loop
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
244 break
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
245 else:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
246 raise lasterror
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8829
diff changeset
247
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
248 elif code == "stat":
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
249 action = d.get("action")
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
250 if action in ["purge", "delete", "move/delete"]:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
251 return None, None
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
252 p4type = self.re_type.match(d["type"])
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
253 if p4type:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
254 mode = ""
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
255 flags = ((p4type.group(1) or "")
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
256 + (p4type.group(3) or ""))
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
257 if "x" in flags:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
258 mode = "x"
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
259 if p4type.group(2) == "symlink":
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
260 mode = "l"
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
261 if "ko" in flags:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
262 keywords = self.re_keywords_old
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
263 elif "k" in flags:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
264 keywords = self.re_keywords
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8829
diff changeset
265
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
266 elif code == "text" or code == "binary":
25882
97a9f7602014 convert: when getting file from Perforce concatenate data at the end
Eugene Baranov <eug.baranov@gmail.com>
parents: 25805
diff changeset
267 contents.append(data)
25775
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
268
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
269 lasterror = None
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
270
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
271 if not lasterror:
220d9ae6a9a8 convert: if getting a file from Perforce fails try to get it one more time
Eugene Baranov <eug.baranov@gmail.com>
parents: 25760
diff changeset
272 break
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
273
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
274 if mode is None:
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 22294
diff changeset
275 return None, None
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
276
25882
97a9f7602014 convert: when getting file from Perforce concatenate data at the end
Eugene Baranov <eug.baranov@gmail.com>
parents: 25805
diff changeset
277 contents = ''.join(contents)
97a9f7602014 convert: when getting file from Perforce concatenate data at the end
Eugene Baranov <eug.baranov@gmail.com>
parents: 25805
diff changeset
278
8829
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
279 if keywords:
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
280 contents = keywords.sub("$\\1$", contents)
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
281 if mode == "l" and contents.endswith("\n"):
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
282 contents = contents[:-1]
ce4b92f5cea7 convert: Make P4 conversion cope with keywords, binary files and symbolic links.
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents: 8225
diff changeset
283
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
284 return contents, mode
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
285
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
286 def getchanges(self, rev, full):
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
287 if full:
26779
aaa33ec3c951 grammar: use does instead of do where appropriate
timeless@mozdev.org
parents: 26587
diff changeset
288 raise error.Abort(_("convert from p4 does not support --full"))
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
289 return self.files[rev], self.copies[rev], set()
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
290
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
291 def getcommit(self, rev):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
292 return self.changeset[rev]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
293
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
294 def gettags(self):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
295 return self.tags
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
296
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
297 def getchangedfiles(self, rev, i):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8066
diff changeset
298 return sorted([x[0] for x in self.files[rev]])