hgext/convert/p4.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 07 Aug 2021 12:39:01 +0200
branchstable
changeset 47819 c02ce6def30c
parent 47068 3af293735d0f
child 48875 6000f5b25c9b
permissions -rw-r--r--
issue6528: implement _is_revision_affected_fast using callback The delta comming from a bundle/stream does not exists in the revlog yet, so we will need other way to retrieve the same information. To prepare for this we split the function to use callbacks in the core logic. Differential Revision: https://phab.mercurial-scm.org/D11268
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    17
from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    18
    dateutil,
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
    19
    procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    20
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    21
)
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    22
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    23
from . import common
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    24
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    25
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    26
def loaditer(f):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
    27
    """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
    28
    try:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    29
        while True:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    30
            d = marshal.load(f)
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    31
            if not d:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    32
                break
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    33
            yield d
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    34
    except EOFError:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    35
        pass
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    36
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    37
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    38
def decodefilename(filename):
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    39
    """Perforce escapes special characters @, #, *, or %
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    40
    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
    41
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 31590
diff changeset
    42
    >>> 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
    43
    '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
    44
    >>> 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
    45
    '//Depot/Directory/%25/%23/#@.*'
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    46
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    47
    replacements = [
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    48
        (b'%2A', b'*'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    49
        (b'%23', b'#'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    50
        (b'%40', b'@'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    51
        (b'%25', b'%'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    52
    ]
25788
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    53
    for k, v in replacements:
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    54
        filename = filename.replace(k, v)
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    55
    return filename
a36fd0993522 convert: unescape Perforce-escaped special characters in filenames
Eugene Baranov <eug.baranov@gmail.com>
parents: 25776
diff changeset
    56
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    57
28371
630f5f04bc74 convert: p4 use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    58
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
    59
    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
    60
        # avoid import cycle
281214150561 convert: avoid wrong lfconvert defaults by moving configitems to core
Matt Harbison <matt_harbison@yahoo.com>
parents: 34503
diff changeset
    61
        from . import convcmd
281214150561 convert: avoid wrong lfconvert defaults by moving configitems to core
Matt Harbison <matt_harbison@yahoo.com>
parents: 34503
diff changeset
    62
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 35036
diff changeset
    63
        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
    64
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    65
        if b"/" in path and not path.startswith(b'//'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    66
            raise common.NoRepo(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    67
                _(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
    68
            )
7973
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7905
diff changeset
    69
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    70
        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
    71
30601
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
    72
        self.revmap = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    73
        self.encoding = self.ui.config(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    74
            b'convert', b'p4.encoding', convcmd.orig_encoding
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    75
        )
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    76
        self.re_type = re.compile(
41537
fc09aafd3c36 convert: use raw string for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
    77
            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
    78
            br"(\+\w+)?$"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    79
        )
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    80
        self.re_keywords = re.compile(
41537
fc09aafd3c36 convert: use raw string for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
    81
            br"\$(Id|Header|Date|DateTime|Change|File|Revision|Author)"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    82
            br":[^$\n]*\$"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    83
        )
41537
fc09aafd3c36 convert: use raw string for regular expressions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37120
diff changeset
    84
        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
    85
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 24395
diff changeset
    86
        if revs and len(revs) > 1:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    87
            raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    88
                _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    89
                    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
    90
                    b"multiple revisions"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    91
                )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
    92
            )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
    93
30601
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
    94
    def setrevmap(self, revmap):
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
    95
        """Sets the parsed revmap dictionary.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
    96
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
    97
        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
    98
        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
    99
        on the commandline.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   100
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   101
        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
   102
        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
   103
        imports if a revmap is provided.
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   104
        """
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   105
        self.revmap = revmap
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   106
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   107
    def _parse_view(self, path):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
   108
        """Read changes affecting the path"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   109
        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
   110
        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
   111
        p4changes = {}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   112
        for d in loaditer(stdout):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
            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
   114
            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
   115
                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
   116
        return p4changes
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   117
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   118
    def _parse(self, ui, path):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43077
diff changeset
   119
        """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
   120
        p4changes = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   121
        changeset = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   122
        files_map = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   123
        copies_map = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   124
        localname = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   125
        depotname = {}
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   126
        heads = []
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   127
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   128
        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
   129
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   130
        # read client spec or view
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
        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
   132
            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
   133
            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
   134
                views = {path[:-3]: b""}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   135
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
                views = {b"//": b""}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   137
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   138
            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
   139
            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
   140
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   141
            views = {}
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   142
            for client in clientspec:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   143
                if client.startswith(b"View"):
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   144
                    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
   145
                    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
   146
                    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
   147
                        sview = sview[:-3]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   148
                        cview = cview[:-3]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   149
                    cview = cview[2:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   150
                    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
   151
                    views[sview] = cview
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   152
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   153
        # 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
   154
        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
   155
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   156
        # list with depot pathnames, longest first
47068
3af293735d0f convert: update p4 for Python 3
Nate Skulic <nate.skulic@gmail.com>
parents: 43787
diff changeset
   157
        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
   158
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   159
        # handle revision limiting
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   160
        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
   161
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   162
        # 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
   163
        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
   164
        lastid = None
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   165
        for change in p4changes:
30597
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
   166
            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
   167
                continue
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
   168
            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
   169
                continue
30601
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   170
            if change in self.revmap:
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   171
                # 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
   172
                lastid = change
d47a01bf0059 convert: allow passing in a revmap
David Soria Parra <davidsp@fb.com>
parents: 30600
diff changeset
   173
                continue
30597
fa2d2c8ac398 convert: don't use long list comprehensions
David Soria Parra <davidsp@fb.com>
parents: 29205
diff changeset
   174
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   175
            if lastid:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   176
                parents = [lastid]
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   177
            else:
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   178
                parents = []
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
   179
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   180
            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
   181
            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
   182
31590
78ac8acfc4bd convert: fix the handling of empty changlist descriptions in P4
David Soria Parra <davidsp@fb.com>
parents: 30632
diff changeset
   183
            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
   184
            if len(descarr) > 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   185
                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
   186
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   187
                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
   188
47068
3af293735d0f convert: update p4 for Python 3
Nate Skulic <nate.skulic@gmail.com>
parents: 43787
diff changeset
   189
            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
   190
            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
   191
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   192
            files = []
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   193
            copies = {}
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   194
            copiedfiles = []
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   195
            i = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   196
            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
   197
                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
   198
                filename = None
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   199
                for v in vieworder:
25776
809c3e4a9e31 convert: ignore case changes in vieworder for Perforce
Eugene Baranov <eug.baranov@gmail.com>
parents: 25775
diff changeset
   200
                    if oldname.lower().startswith(v.lower()):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   201
                        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
   202
                        break
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   203
                if filename:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   204
                    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
   205
                    depotname[filename] = oldname
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   206
                    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
   207
                        copiedfiles.append(filename)
30630
3830f8806094 convert: move localname state to function scope
David Soria Parra <davidsp@fb.com>
parents: 30629
diff changeset
   208
                    localname[oldname] = filename
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   209
                i += 1
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   210
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   211
            # Collect information about copied files
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   212
            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
   213
                oldname = depotname[filename]
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   214
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
                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
   216
                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
   217
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   218
                copiedfilename = None
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   219
                for d in loaditer(flstdout):
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   220
                    copiedoldname = None
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   221
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   222
                    i = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   223
                    while (b"change%d" % i) in d:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   224
                        if (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   225
                            d[b"change%d" % i] == change
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   226
                            and d[b"action%d" % i] == b"move/add"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   227
                        ):
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   228
                            j = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
                            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
   230
                                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
   231
                                    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
   232
                                    break
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   233
                                j += 1
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   234
                        i += 1
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   235
30630
3830f8806094 convert: move localname state to function scope
David Soria Parra <davidsp@fb.com>
parents: 30629
diff changeset
   236
                    if copiedoldname and copiedoldname in localname:
3830f8806094 convert: move localname state to function scope
David Soria Parra <davidsp@fb.com>
parents: 30629
diff changeset
   237
                        copiedfilename = localname[copiedoldname]
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   238
                        break
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   239
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   240
                if copiedfilename:
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   241
                    copies[filename] = copiedfilename
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   242
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   243
                    ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
                        _(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
   245
                        % (filename, change)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   246
                    )
25751
17a9da909186 convert: handle copies when converting from Perforce (issue4744)
Eugene Baranov <eug.baranov@gmail.com>
parents: 25748
diff changeset
   247
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   248
            changeset[change] = c
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   249
            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
   250
            copies_map[change] = copies
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   251
            lastid = change
7869
bc027d72c289 cleanup: remove all trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7823
diff changeset
   252
30631
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   253
        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
   254
            heads = [lastid]
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   255
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   256
        return {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   257
            b'changeset': changeset,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   258
            b'files': files_map,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
            b'copies': copies_map,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   260
            b'heads': heads,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   261
            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
   262
        }
c2be48e56d59 convert: return calculated values from parse() instead of manpulating state
David Soria Parra <davidsp@fb.com>
parents: 30630
diff changeset
   263
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   264
    @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   265
    def _parse_once(self):
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   266
        return self._parse(self.ui, self.path)
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   267
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   268
    @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   269
    def copies(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   270
        return self._parse_once[b'copies']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   271
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   272
    @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   273
    def files(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   274
        return self._parse_once[b'files']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   275
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   276
    @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   277
    def changeset(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
        return self._parse_once[b'changeset']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   279
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   280
    @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   281
    def heads(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   282
        return self._parse_once[b'heads']
30632
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   283
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   284
    @util.propertycache
1d0e4832e616 convert: parse perforce data on-demand
David Soria Parra <davidsp@fb.com>
parents: 30631
diff changeset
   285
    def depotname(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
        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
   287
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   288
    def getheads(self):
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   289
        return self.heads
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 getfile(self, name, rev):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
        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
   293
            b"%s#%s" % (self.depotname[name], rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   294
        )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   295
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
   296
        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
   297
        while True:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   298
            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
   299
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
            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
   301
            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
   302
            keywords = None
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   303
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
   304
            for d in loaditer(stdout):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
                code = d[b"code"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   306
                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
   307
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   308
                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
   309
                    # 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
   310
                    # 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
   311
                    if not lasterror:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   312
                        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
   313
                        # 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
   314
                        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
   315
                    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
   316
                        raise lasterror
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8829
diff changeset
   317
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   318
                elif code == b"stat":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
                    action = d.get(b"action")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
                    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
   321
                        return None, None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
                    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
   323
                    if p4type:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   324
                        mode = b""
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
                        flags = (p4type.group(1) or b"") + (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   326
                            p4type.group(3) or b""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   327
                        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   328
                        if b"x" in flags:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   329
                            mode = b"x"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   330
                        if p4type.group(2) == b"symlink":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   331
                            mode = b"l"
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   332
                        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
   333
                            keywords = self.re_keywords_old
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   334
                        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
   335
                            keywords = self.re_keywords
8843
eb7b247a98ea kill trailing whitespace
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8829
diff changeset
   336
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   337
                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
   338
                    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
   339
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
                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
   341
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
            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
   343
                break
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   344
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   345
        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
   346
            return None, None
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   347
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   348
        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
   349
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
   350
        if keywords:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   351
            contents = keywords.sub(b"$\\1$", contents)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   352
        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
   353
            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
   354
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
   355
        return contents, mode
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   356
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   357
    def getchanges(self, rev, full):
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   358
        if full:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
            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
   360
        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
   361
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   362
    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
   363
        """
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   364
        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
   365
        `p4 describe` output
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   366
        """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   367
        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
   368
        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
   369
        if parents is None:
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   370
            parents = []
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   371
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   372
        return common.commit(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   373
            author=self.recode(obj[b"user"]),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   374
            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
   375
            parents=parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   376
            desc=desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41759
diff changeset
   377
            branch=None,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   378
            rev=obj[b'change'],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   379
            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
   380
        )
30603
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   381
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   382
    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
   383
        """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
   384
        a dictionary."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   385
        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
   386
        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
   387
        return marshal.load(stdout)
db9e883566e8 convert: encapsulate commit data fetching and commit object creation
David Soria Parra <davidsp@fb.com>
parents: 30602
diff changeset
   388
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   389
    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
   390
        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
   391
            return self.changeset[rev]
b654112a0119 convert: return commit objects for revisions in the revmap
David Soria Parra <davidsp@fb.com>
parents: 30603
diff changeset
   392
        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
   393
            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
   394
            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
   395
        raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
            _(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
   397
        )
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   398
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   399
    def gettags(self):
30599
902c89df94e3 convert: remove unused dictionaries
David Soria Parra <davidsp@fb.com>
parents: 30598
diff changeset
   400
        return {}
7823
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   401
11efa41037e2 convert: Perforce source for conversion to Mercurial
Frank Kingswood <frank@kingswood-consulting.co.uk>
parents:
diff changeset
   402
    def getchangedfiles(self, rev, i):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8066
diff changeset
   403
        return sorted([x[0] for x in self.files[rev]])