annotate hgext/convert/p4.py @ 52097:ff1872e8c0bf default tip

tests: stabilize `test-clonebundles-autogen.t` on Windows The problem was that the commands are spun up with `shell=True`, which uses `cmd.exe`, which doesn't understand `$foo` style variables. The HGCB variable expansion has to be delayed, because it's figured out right before launching the command. We could probably add a conditional for Windows, and rewrite the config to use `%foo%` style variables, but it's more maintainable to just wrap the command in a bash shell invocation. The forward style slashes in the path are needed to avoid accruing double backslashes (when switching between shells- the url template seems fine). Also need to strong quote the command so that the double quotes don't get stripped off of `$HGCB_BUNDLE_PATH`, which results in: sh: 1: Syntax error: Unterminated quoted string abort: command returned status 2: sh -c "cp $HGCB_BUNDLE_PATH $TESTTMP/final-upload/"
author Matt Harbison <matt_harbison@yahoo.com>
date Tue, 15 Oct 2024 22:30:10 -0400
parents f4733654f144
children
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.
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
7
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
8 from __future__ import annotations
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
9
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
10 import marshal
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
11 import re
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
12
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28371
diff changeset
13 from mercurial.i18n import _
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
14 from mercurial import (
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
15 error,
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
16 util,
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
17 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
18 from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
19 dateutil,
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
20 procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
21 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
22 )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
23
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
24 from . import common
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
25
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
26
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
27 def loaditer(f):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
28 """Yield the dictionary objects generated by p4"""
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
29 try:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
30 while True:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
31 d = marshal.load(f)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
32 if not d:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
33 break
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
34 yield d
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
35 except EOFError:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
36 pass
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
37
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
38
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
39 def decodefilename(filename):
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
40 """Perforce escapes special characters @, #, *, or %
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
41 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
42
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 31590
diff changeset
43 >>> decodefilename(b'portable-net45%252Bnetcore45%252Bwp8%252BMonoAndroid')
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
44 'portable-net45%2Bnetcore45%2Bwp8%2BMonoAndroid'
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 31590
diff changeset
45 >>> decodefilename(b'//Depot/Directory/%2525/%2523/%23%40.%2A')
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
46 '//Depot/Directory/%25/%23/#@.*'
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
47 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
48 replacements = [
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
49 (b'%2A', b'*'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
50 (b'%23', b'#'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
51 (b'%40', b'@'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
52 (b'%25', b'%'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
53 ]
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
54 for k, v in replacements:
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
55 filename = filename.replace(k, v)
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
56 return filename
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
57
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
58
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
59 class p4_source(common.converter_source):
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 35036
diff changeset
60 def __init__(self, ui, repotype, path, revs=None):
35036
281214150561 convert: avoid wrong lfconvert defaults by moving configitems to core
Matt Harbison <matt_harbison@yahoo.com>
parents: 34503
diff changeset
61 # avoid import cycle
281214150561 convert: avoid wrong lfconvert defaults by moving configitems to core
Matt Harbison <matt_harbison@yahoo.com>
parents: 34503
diff changeset
62 from . import convcmd
281214150561 convert: avoid wrong lfconvert defaults by moving configitems to core
Matt Harbison <matt_harbison@yahoo.com>
parents: 34503
diff changeset
63
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 35036
diff changeset
64 super(p4_source, self).__init__(ui, repotype, path, revs=revs)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
65
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
66 if b"/" in path and not path.startswith(b'//'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
67 raise common.NoRepo(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
68 _(b'%s does not look like a P4 repository') % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
69 )
7973
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7905
diff changeset
70
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
71 common.checktool(b'p4', abort=False)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
72
30601
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
73 self.revmap = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
74 self.encoding = self.ui.config(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
75 b'convert', b'p4.encoding', convcmd.orig_encoding
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
76 )
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
77 self.re_type = re.compile(
41537
fc09aafd3c36 convert: use raw string for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
78 br"([a-z]+)?(text|binary|symlink|apple|resource|unicode|utf\d+)"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
79 br"(\+\w+)?$"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
80 )
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
81 self.re_keywords = re.compile(
41537
fc09aafd3c36 convert: use raw string for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
82 br"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
83 br":[^$\n]*\$"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
84 )
41537
fc09aafd3c36 convert: use raw string for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
85 self.re_keywords_old = re.compile(br"\$(Id|Header):[^$\n]*\$")
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
86
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 24395
diff changeset
87 if revs and len(revs) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
88 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
89 _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
90 b"p4 source does not support specifying "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
91 b"multiple revisions"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
92 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
93 )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
94
30601
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
95 def setrevmap(self, revmap):
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
96 """Sets the parsed revmap dictionary.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
97
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
98 Revmap stores mappings from a source revision to a target revision.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
99 It is set in convertcmd.convert and provided by the user as a file
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
100 on the commandline.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
101
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
102 Revisions in the map are considered beeing present in the
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
103 repository and ignored during _parse(). This allows for incremental
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
104 imports if a revmap is provided.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
105 """
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
106 self.revmap = revmap
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
107
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
108 def _parse_view(self, path):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
109 """Read changes affecting the path"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
110 cmd = b'p4 -G changes -s submitted %s' % procutil.shellquote(path)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
111 stdout = procutil.popen(cmd, mode=b'rb')
30629
e92776c00ffd convert: use return value in parse_view() instead of manipulating state
David Soria Parra <davidsp@fb.com>
parents: 30617
diff changeset
112 p4changes = {}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
113 for d in loaditer(stdout):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
114 c = d.get(b"change", None)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
115 if c:
30629
e92776c00ffd convert: use return value in parse_view() instead of manipulating state
David Soria Parra <davidsp@fb.com>
parents: 30617
diff changeset
116 p4changes[c] = True
e92776c00ffd convert: use return value in parse_view() instead of manipulating state
David Soria Parra <davidsp@fb.com>
parents: 30617
diff changeset
117 return p4changes
7823
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 def _parse(self, ui, path):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
120 """Prepare list of P4 filenames and revisions to import"""
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
121 p4changes = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
122 changeset = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
123 files_map = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
124 copies_map = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
125 localname = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
126 depotname = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
127 heads = []
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
128
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
129 ui.status(_(b'reading p4 views\n'))
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
130
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
131 # read client spec or view
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
132 if b"/" in path:
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
133 p4changes.update(self._parse_view(path))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
134 if path.startswith(b"//") and path.endswith(b"/..."):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
135 views = {path[:-3]: b""}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
136 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
137 views = {b"//": b""}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
138 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
139 cmd = b'p4 -G client -o %s' % procutil.shellquote(path)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
140 clientspec = marshal.load(procutil.popen(cmd, mode=b'rb'))
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
141
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
142 views = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
143 for client in clientspec:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
144 if client.startswith(b"View"):
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
145 sview, cview = clientspec[client].split()
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
146 p4changes.update(self._parse_view(sview))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
147 if sview.endswith(b"...") and cview.endswith(b"..."):
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
148 sview = sview[:-3]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
149 cview = cview[:-3]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
150 cview = cview[2:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
151 cview = cview[cview.find(b"/") + 1 :]
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
152 views[sview] = cview
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
153
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
154 # list of changes that affect our source files
47068
3af293735d0f convert: update p4 for Python 3
Nate Skulic <nate.skulic@gmail.com>
parents: 43787
diff changeset
155 p4changes = sorted(p4changes.keys(), key=int)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
156
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
157 # list with depot pathnames, longest first
47068
3af293735d0f convert: update p4 for Python 3
Nate Skulic <nate.skulic@gmail.com>
parents: 43787
diff changeset
158 vieworder = sorted(views.keys(), key=len, reverse=True)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
159
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
160 # handle revision limiting
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
161 startrev = self.ui.config(b'convert', b'p4.startrev')
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
162
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
163 # now read the full changelists to get the list of file revisions
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
164 ui.status(_(b'collecting p4 changelists\n'))
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
165 lastid = None
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
166 for change in p4changes:
30597
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
167 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
168 continue
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
169 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
170 continue
30601
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
171 if change in self.revmap:
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
172 # Ignore already present revisions, but set the parent pointer.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
173 lastid = change
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
174 continue
30597
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
175
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
176 if lastid:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
177 parents = [lastid]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
178 else:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
179 parents = []
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
180
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
181 d = self._fetch_revision(change)
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
182 c = self._construct_commit(d, parents)
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
183
31590
78ac8acfc4bd convert: fix the handling of empty changlist descriptions in P4
David Soria Parra <davidsp@fb.com>
parents: 30632
diff changeset
184 descarr = c.desc.splitlines(True)
78ac8acfc4bd convert: fix the handling of empty changlist descriptions in P4
David Soria Parra <davidsp@fb.com>
parents: 30632
diff changeset
185 if len(descarr) > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
186 shortdesc = descarr[0].rstrip(b'\r\n')
31590
78ac8acfc4bd convert: fix the handling of empty changlist descriptions in P4
David Soria Parra <davidsp@fb.com>
parents: 30632
diff changeset
187 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
188 shortdesc = b'**empty changelist description**'
31590
78ac8acfc4bd convert: fix the handling of empty changlist descriptions in P4
David Soria Parra <davidsp@fb.com>
parents: 30632
diff changeset
189
47068
3af293735d0f convert: update p4 for Python 3
Nate Skulic <nate.skulic@gmail.com>
parents: 43787
diff changeset
190 t = b'%s %s' % (c.rev, shortdesc)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
191 ui.status(stringutil.ellipsis(t, 80) + b'\n')
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
192
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
193 files = []
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
194 copies = {}
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
195 copiedfiles = []
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
196 i = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
197 while (b"depotFile%d" % i) in d and (b"rev%d" % i) in d:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
198 oldname = d[b"depotFile%d" % i]
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
199 filename = None
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
200 for v in vieworder:
25776
809c3e4a9e31 convert: ignore case changes in vieworder for Perforce
Eugene Baranov <eug.baranov@gmail.com>
parents: 25775
diff changeset
201 if oldname.lower().startswith(v.lower()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
202 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
203 break
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
204 if filename:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
205 files.append((filename, d[b"rev%d" % i]))
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
206 depotname[filename] = oldname
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
207 if d.get(b"action%d" % i) == b"move/add":
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
208 copiedfiles.append(filename)
30630
3830f8806094 convert: move localname state to function scope
David Soria Parra <davidsp@fb.com>
parents: 30629
diff changeset
209 localname[oldname] = filename
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
210 i += 1
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
211
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
212 # Collect information about copied files
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
213 for filename in copiedfiles:
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
214 oldname = depotname[filename]
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
215
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
216 flcmd = b'p4 -G filelog %s' % procutil.shellquote(oldname)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
217 flstdout = procutil.popen(flcmd, mode=b'rb')
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
218
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
219 copiedfilename = None
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
220 for d in loaditer(flstdout):
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
221 copiedoldname = None
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
222
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
223 i = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
224 while (b"change%d" % i) in d:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
225 if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
226 d[b"change%d" % i] == change
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
227 and d[b"action%d" % i] == b"move/add"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
228 ):
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
229 j = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
230 while (b"file%d,%d" % (i, j)) in d:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
231 if d[b"how%d,%d" % (i, j)] == b"moved from":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
232 copiedoldname = d[b"file%d,%d" % (i, j)]
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
233 break
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
234 j += 1
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
235 i += 1
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
236
30630
3830f8806094 convert: move localname state to function scope
David Soria Parra <davidsp@fb.com>
parents: 30629
diff changeset
237 if copiedoldname and copiedoldname in localname:
3830f8806094 convert: move localname state to function scope
David Soria Parra <davidsp@fb.com>
parents: 30629
diff changeset
238 copiedfilename = localname[copiedoldname]
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
239 break
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
240
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
241 if copiedfilename:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
242 copies[filename] = copiedfilename
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
243 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
244 ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
245 _(b"cannot find source for copied file: %s@%s\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
246 % (filename, change)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
247 )
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
248
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
249 changeset[change] = c
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
250 files_map[change] = files
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
251 copies_map[change] = copies
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
252 lastid = change
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
253
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
254 if lastid and len(changeset) > 0:
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
255 heads = [lastid]
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
256
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
257 return {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
258 b'changeset': changeset,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
259 b'files': files_map,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
260 b'copies': copies_map,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
261 b'heads': heads,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
262 b'depotname': depotname,
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
263 }
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
264
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
265 @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
266 def _parse_once(self):
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
267 return self._parse(self.ui, self.path)
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
268
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
269 @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
270 def copies(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
271 return self._parse_once[b'copies']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
272
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
273 @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
274 def files(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
275 return self._parse_once[b'files']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
276
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
277 @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
278 def changeset(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
279 return self._parse_once[b'changeset']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
280
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
281 @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
282 def heads(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
283 return self._parse_once[b'heads']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
284
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
285 @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
286 def depotname(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
287 return self._parse_once[b'depotname']
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
288
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
289 def getheads(self):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
290 return self.heads
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
291
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
292 def getfile(self, name, rev):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
293 cmd = b'p4 -G print %s' % procutil.shellquote(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
294 b"%s#%s" % (self.depotname[name], rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
295 )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
296
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
297 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
298 while True:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
299 stdout = procutil.popen(cmd, mode=b'rb')
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
300
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
301 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
302 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
303 keywords = None
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
304
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
305 for d in loaditer(stdout):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
306 code = d[b"code"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
307 data = d.get(b"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
308
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
309 if code == b"error":
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
310 # 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
311 # 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
312 if not lasterror:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
313 lasterror = IOError(d[b"generic"], 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
314 # 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
315 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
316 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
317 raise lasterror
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8829
diff changeset
318
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
319 elif code == b"stat":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
320 action = d.get(b"action")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
321 if action in [b"purge", b"delete", b"move/delete"]:
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
322 return None, None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
323 p4type = self.re_type.match(d[b"type"])
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
324 if p4type:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
325 mode = b""
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
326 flags = (p4type.group(1) or b"") + (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
327 p4type.group(3) or b""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
328 )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
329 if b"x" in flags:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
330 mode = b"x"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
331 if p4type.group(2) == b"symlink":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
332 mode = b"l"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
333 if b"ko" in flags:
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
334 keywords = self.re_keywords_old
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
335 elif b"k" in flags:
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
336 keywords = self.re_keywords
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8829
diff changeset
337
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
338 elif code == b"text" or code == b"binary":
25882
97a9f7602014 convert: when getting file from Perforce concatenate data at the end
Eugene Baranov <eug.baranov@gmail.com>
parents: 25805
diff changeset
339 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
340
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
341 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
342
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
343 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
344 break
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
345
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
346 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
347 return None, None
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
348
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
349 contents = b''.join(contents)
25882
97a9f7602014 convert: when getting file from Perforce concatenate data at the end
Eugene Baranov <eug.baranov@gmail.com>
parents: 25805
diff changeset
350
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
351 if keywords:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
352 contents = keywords.sub(b"$\\1$", contents)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
353 if mode == b"l" and contents.endswith(b"\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
354 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
355
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
356 return contents, mode
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
357
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
358 def getchanges(self, rev, full):
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
359 if full:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
360 raise error.Abort(_(b"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
361 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
362
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
363 def _construct_commit(self, obj, parents=None):
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
364 """
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
365 Constructs a common.commit object from an unmarshalled
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
366 `p4 describe` output
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
367 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
368 desc = self.recode(obj.get(b"desc", b""))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
369 date = (int(obj[b"time"]), 0) # timezone not set
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
370 if parents is None:
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
371 parents = []
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
372
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
373 return common.commit(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
374 author=self.recode(obj[b"user"]),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
375 date=dateutil.datestr(date, b'%Y-%m-%d %H:%M:%S %1%2'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
376 parents=parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
377 desc=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
378 branch=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
379 rev=obj[b'change'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
380 extra={b"p4": obj[b'change'], b"convert_revision": obj[b'change']},
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
381 )
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
382
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
383 def _fetch_revision(self, rev):
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
384 """Return an output of `p4 describe` including author, commit date as
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
385 a dictionary."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
386 cmd = b"p4 -G describe -s %s" % rev
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
387 stdout = procutil.popen(cmd, mode=b'rb')
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
388 return marshal.load(stdout)
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
389
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
390 def getcommit(self, rev):
30604
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
391 if rev in self.changeset:
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
392 return self.changeset[rev]
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
393 elif rev in self.revmap:
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
394 d = self._fetch_revision(rev)
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
395 return self._construct_commit(d, parents=None)
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
396 raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
397 _(b"cannot find %s in the revmap or parsed changesets") % rev
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
398 )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
399
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
400 def gettags(self):
30599
902c89df94e3 convert: remove unused dictionaries
David Soria Parra <davidsp@fb.com>
parents: 30598
diff changeset
401 return {}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
402
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
403 def getchangedfiles(self, rev, i):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8066
diff changeset
404 return sorted([x[0] for x in self.files[rev]])