hgext/convert/gnuarch.py
author Gregory Szorc <gregory.szorc@gmail.com>
Fri, 04 Oct 2019 16:07:32 -0400
changeset 43072 058c2468b2f5
parent 39904 5fe0b880200e
child 43076 2372284d9457
permissions -rw-r--r--
convert: use pycompat.fsencode() This avoids a `TypeError: Can't mix strings and bytes in path components`. Differential Revision: https://phab.mercurial-scm.org/D6965
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8250
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     1
# gnuarch.py - GNU Arch support for the convert extension
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     2
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     3
#  Copyright 2008, 2009 Aleix Conchillo Flaque <aleix@member.fsf.org>
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     4
#  and others
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     5
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     6
# 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: 9467
diff changeset
     7
# GNU General Public License version 2 or any later version.
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
     8
from __future__ import absolute_import
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
     9
35633
a981ab2a1b4c py3: use email.parser module to parse email messages
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35176
diff changeset
    10
import email.parser as emailparser
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    11
import os
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    12
import shutil
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    13
import stat
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    14
import tempfile
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28366
diff changeset
    15
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28366
diff changeset
    16
from mercurial.i18n import _
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    17
from mercurial import (
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    18
    encoding,
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    19
    error,
39826
c31ce080eb75 py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
    20
    pycompat,
39833
28626957395a convert: fix a file descriptor leak
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
    21
    util,
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    22
)
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    23
from mercurial.utils import (
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    24
    dateutil,
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    25
    procutil,
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    26
)
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    27
from . import common
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    28
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    29
class gnuarch_source(common.converter_source, common.commandline):
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    30
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8668
diff changeset
    31
    class gnuarch_rev(object):
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    32
        def __init__(self, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    33
            self.rev = rev
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    34
            self.summary = ''
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    35
            self.date = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    36
            self.author = ''
7583
77fec2d270ae convert/gnuarch: parse continuation-of revisions in gnuarch source
Edouard Gomez <ed.gomez@free.fr>
parents: 7582
diff changeset
    37
            self.continuationof = None
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    38
            self.add_files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    39
            self.mod_files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    40
            self.del_files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    41
            self.ren_files = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    42
            self.ren_dirs = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    43
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 29205
diff changeset
    44
    def __init__(self, ui, repotype, path, revs=None):
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 29205
diff changeset
    45
        super(gnuarch_source, self).__init__(ui, repotype, path, revs=revs)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    46
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    47
        if not os.path.exists(os.path.join(path, '{arch}')):
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    48
            raise common.NoRepo(_("%s does not look like a GNU Arch repository")
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10394
diff changeset
    49
                         % path)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    50
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    51
        # Could use checktool, but we want to check for baz or tla.
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    52
        self.execmd = None
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    53
        if procutil.findexe('baz'):
6083
81a8667331e8 convert: detect baz before tla
Patrick Mezard <pmezard@gmail.com>
parents: 6079
diff changeset
    54
            self.execmd = 'baz'
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    55
        else:
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
    56
            if procutil.findexe('tla'):
6083
81a8667331e8 convert: detect baz before tla
Patrick Mezard <pmezard@gmail.com>
parents: 6079
diff changeset
    57
                self.execmd = 'tla'
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    58
            else:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
    59
                raise error.Abort(_('cannot find a GNU Arch tool'))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    60
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
    61
        common.commandline.__init__(self, ui, self.execmd)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    62
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
    63
        self.path = os.path.realpath(path)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    64
        self.tmppath = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    65
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    66
        self.treeversion = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    67
        self.lastrev = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    68
        self.changes = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    69
        self.parents = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    70
        self.tags = {}
35633
a981ab2a1b4c py3: use email.parser module to parse email messages
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35176
diff changeset
    71
        self.catlogparser = emailparser.Parser()
11987
3145951e50fe convert: use encoding.encoding instead of locale.getpreferredencoding()
Brodie Rao <brodie@bitheap.org>
parents: 11986
diff changeset
    72
        self.encoding = encoding.encoding
7584
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    73
        self.archives = []
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    74
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    75
    def before(self):
7584
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    76
        # Get registered archives
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    77
        self.archives = [i.rstrip('\n')
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    78
                         for i in self.runlines0('archives', '-n')]
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    79
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    80
        if self.execmd == 'tla':
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    81
            output = self.run0('tree-version', self.path)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    82
        else:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    83
            output = self.run0('tree-version', '-d', self.path)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    84
        self.treeversion = output.strip()
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    85
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    86
        # Get name of temporary directory
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    87
        version = self.treeversion.split('/')
43072
058c2468b2f5 convert: use pycompat.fsencode()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39904
diff changeset
    88
        self.tmppath = os.path.join(pycompat.fsencode(tempfile.gettempdir()),
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    89
                                    'hg-%s' % version[1])
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    90
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    91
        # Generate parents dictionary
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    92
        self.parents[None] = []
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    93
        treeversion = self.treeversion
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    94
        child = None
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    95
        while treeversion:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    96
            self.ui.status(_('analyzing tree version %s...\n') % treeversion)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    97
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    98
            archive = treeversion.split('/')[0]
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    99
            if archive not in self.archives:
8662
eaee3491ce11 convert/gnuarch: wrap long line, format kwargs without spaces
Martin Geisler <mg@lazybytes.net>
parents: 8250
diff changeset
   100
                self.ui.status(_('tree analysis stopped because it points to '
eaee3491ce11 convert/gnuarch: wrap long line, format kwargs without spaces
Martin Geisler <mg@lazybytes.net>
parents: 8250
diff changeset
   101
                                 'an unregistered archive %s...\n') % archive)
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   102
                break
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   103
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   104
            # Get the complete list of revisions for that tree version
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   105
            output, status = self.runlines('revisions', '-r', '-f', treeversion)
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17391
diff changeset
   106
            self.checkexit(status, 'failed retrieving revisions for %s'
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   107
                           % treeversion)
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   108
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   109
            # No new iteration unless a revision has a continuation-of header
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   110
            treeversion = None
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   111
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   112
            for l in output:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   113
                rev = l.strip()
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   114
                self.changes[rev] = self.gnuarch_rev(rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   115
                self.parents[rev] = []
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   116
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   117
                # Read author, date and summary
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   118
                catlog, status = self.run('cat-log', '-d', self.path, rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   119
                if status:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   120
                    catlog  = self.run0('cat-archive-log', rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   121
                self._parsecatlog(catlog, rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   122
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   123
                # Populate the parents map
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   124
                self.parents[child].append(rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   125
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   126
                # Keep track of the current revision as the child of the next
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   127
                # revision scanned
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   128
                child = rev
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   129
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   130
                # Check if we have to follow the usual incremental history
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   131
                # or if we have to 'jump' to a different treeversion given
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   132
                # by the continuation-of header.
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   133
                if self.changes[rev].continuationof:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   134
                    treeversion = '--'.join(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   135
                        self.changes[rev].continuationof.split('--')[:-1])
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   136
                    break
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   137
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   138
                # If we reached a base-0 revision w/o any continuation-of
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   139
                # header, it means the tree history ends here.
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   140
                if rev[-6:] == 'base-0':
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   141
                    break
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   142
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   143
    def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   144
        self.ui.debug('cleaning up %s\n' % self.tmppath)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   145
        shutil.rmtree(self.tmppath, ignore_errors=True)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   146
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   147
    def getheads(self):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   148
        return self.parents[None]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   149
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   150
    def getfile(self, name, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   151
        if rev != self.lastrev:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
   152
            raise error.Abort(_('internal calling inconsistency'))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   153
12344
b6173aee4a47 Use lexists() instead of exists() where appropriate
Patrick Mezard <pmezard@gmail.com>
parents: 11987
diff changeset
   154
        if not os.path.lexists(os.path.join(self.tmppath, name)):
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 17424
diff changeset
   155
            return None, None
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   156
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10938
diff changeset
   157
        return self._getfile(name, rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   158
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   159
    def getchanges(self, rev, full):
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   160
        if full:
26779
aaa33ec3c951 grammar: use does instead of do where appropriate
timeless@mozdev.org
parents: 26587
diff changeset
   161
            raise error.Abort(_("convert from arch does not support --full"))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   162
        self._update(rev)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   163
        changes = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   164
        copies = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   165
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   166
        for f in self.changes[rev].add_files:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   167
            changes.append((f, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   168
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   169
        for f in self.changes[rev].mod_files:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   170
            changes.append((f, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   171
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   172
        for f in self.changes[rev].del_files:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   173
            changes.append((f, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   174
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   175
        for src in self.changes[rev].ren_files:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   176
            to = self.changes[rev].ren_files[src]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   177
            changes.append((src, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   178
            changes.append((to, rev))
7567
0946294d1f32 convert/gnuarch: fix switched copy source and destination
Patrick Mezard <pmezard@gmail.com>
parents: 6913
diff changeset
   179
            copies[to] = src
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   180
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   181
        for src in self.changes[rev].ren_dirs:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   182
            to = self.changes[rev].ren_dirs[src]
10394
4612cded5176 fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 10282
diff changeset
   183
            chgs, cps = self._rendirchanges(src, to)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   184
            changes += [(f, rev) for f in chgs]
7567
0946294d1f32 convert/gnuarch: fix switched copy source and destination
Patrick Mezard <pmezard@gmail.com>
parents: 6913
diff changeset
   185
            copies.update(cps)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   186
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   187
        self.lastrev = rev
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   188
        return sorted(set(changes)), copies, set()
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   189
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   190
    def getcommit(self, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   191
        changes = self.changes[rev]
28366
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
   192
        return common.commit(author=changes.author, date=changes.date,
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
   193
                             desc=changes.summary, parents=self.parents[rev],
4e08b91a483f convert: gnuarch use absolute_import
timeless <timeless@mozdev.org>
parents: 26779
diff changeset
   194
                             rev=rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   195
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   196
    def gettags(self):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   197
        return self.tags
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   198
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   199
    def _execute(self, cmd, *args, **kwargs):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   200
        cmdline = [self.execmd, cmd]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   201
        cmdline += args
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
   202
        cmdline = [procutil.shellquote(arg) for arg in cmdline]
17391
fc24c10424d2 util: replace util.nulldev with os.devnull
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 15381
diff changeset
   203
        cmdline += ['>', os.devnull, '2>', os.devnull]
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
   204
        cmdline = procutil.quotecommand(' '.join(cmdline))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   205
        self.ui.debug(cmdline, '\n')
39826
c31ce080eb75 py3: convert arguments, cwd and env to native strings when spawning subprocess
Matt Harbison <matt_harbison@yahoo.com>
parents: 37120
diff changeset
   206
        return os.system(pycompat.rapply(procutil.tonativestr, cmdline))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   207
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   208
    def _update(self, rev):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   209
        self.ui.debug('applying revision %s...\n' % rev)
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   210
        changeset, status = self.runlines('replay', '-d', self.tmppath,
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   211
                                              rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   212
        if status:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   213
            # Something went wrong while merging (baz or tla
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   214
            # issue?), get latest revision and try from there
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   215
            shutil.rmtree(self.tmppath, ignore_errors=True)
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   216
            self._obtainrevision(rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   217
        else:
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   218
            old_rev = self.parents[rev][0]
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   219
            self.ui.debug('computing changeset between %s and %s...\n'
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   220
                          % (old_rev, rev))
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   221
            self._parsechangeset(changeset, rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   222
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   223
    def _getfile(self, name, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   224
        mode = os.lstat(os.path.join(self.tmppath, name)).st_mode
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   225
        if stat.S_ISLNK(mode):
39904
5fe0b880200e py3: convert os.readlink() path to native strings on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39833
diff changeset
   226
            data = util.readlink(os.path.join(self.tmppath, name))
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22300
diff changeset
   227
            if mode:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22300
diff changeset
   228
                mode = 'l'
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22300
diff changeset
   229
            else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 22300
diff changeset
   230
                mode = ''
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   231
        else:
39833
28626957395a convert: fix a file descriptor leak
Matt Harbison <matt_harbison@yahoo.com>
parents: 39826
diff changeset
   232
            data = util.readfile(os.path.join(self.tmppath, name))
25658
e93036747902 global: mass rewrite to use modern octal syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24395
diff changeset
   233
            mode = (mode & 0o111) and 'x' or ''
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   234
        return data, mode
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   235
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   236
    def _exclude(self, name):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   237
        exclude = ['{arch}', '.arch-ids', '.arch-inventory']
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   238
        for exc in exclude:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   239
            if name.find(exc) != -1:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   240
                return True
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   241
        return False
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   242
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   243
    def _readcontents(self, path):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   244
        files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   245
        contents = os.listdir(path)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   246
        while len(contents) > 0:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   247
            c = contents.pop()
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   248
            p = os.path.join(path, c)
6044
9360a58a09e6 convert: do not skip some lines in gnu arch summaries
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6037
diff changeset
   249
            # os.walk could be used, but here we avoid internal GNU
9360a58a09e6 convert: do not skip some lines in gnu arch summaries
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6037
diff changeset
   250
            # Arch files and directories, thus saving a lot time.
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   251
            if not self._exclude(p):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   252
                if os.path.isdir(p):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   253
                    contents += [os.path.join(c, f) for f in os.listdir(p)]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   254
                else:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   255
                    files.append(c)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   256
        return files
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   257
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   258
    def _rendirchanges(self, src, dest):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   259
        changes = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   260
        copies = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   261
        files = self._readcontents(os.path.join(self.tmppath, dest))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   262
        for f in files:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   263
            s = os.path.join(src, f)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   264
            d = os.path.join(dest, f)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   265
            changes.append(s)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   266
            changes.append(d)
7567
0946294d1f32 convert/gnuarch: fix switched copy source and destination
Patrick Mezard <pmezard@gmail.com>
parents: 6913
diff changeset
   267
            copies[d] = s
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   268
        return changes, copies
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   269
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   270
    def _obtainrevision(self, rev):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   271
        self.ui.debug('obtaining revision %s...\n' % rev)
7582
3b2383c90034 convert/gnuarch: use fully qualified revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7581
diff changeset
   272
        output = self._execute('get', rev, self.tmppath)
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   273
        self.checkexit(output)
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   274
        self.ui.debug('analyzing revision %s...\n' % rev)
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   275
        files = self._readcontents(self.tmppath)
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   276
        self.changes[rev].add_files += files
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   277
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   278
    def _stripbasepath(self, path):
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   279
        if path.startswith('./'):
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   280
            return path[2:]
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   281
        return path
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   282
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   283
    def _parsecatlog(self, data, rev):
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   284
        try:
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   285
            catlog = self.catlogparser.parsestr(data)
7592
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   286
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   287
            # Commit date
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 35633
diff changeset
   288
            self.changes[rev].date = dateutil.datestr(
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 35633
diff changeset
   289
                dateutil.strdate(catlog['Standard-date'],
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   290
                             '%Y-%m-%d %H:%M:%S'))
7592
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   291
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   292
            # Commit author
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   293
            self.changes[rev].author = self.recode(catlog['Creator'])
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   294
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   295
            # Commit description
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   296
            self.changes[rev].summary = '\n\n'.join((catlog['Summary'],
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   297
                                                    catlog.get_payload()))
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   298
            self.changes[rev].summary = self.recode(self.changes[rev].summary)
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   299
75ad51257c82 convert/gnuarch: recode cat-log parts to utf-8 to be hg.description friendly
Edouard Gomez <ed.gomez@free.fr>
parents: 7591
diff changeset
   300
            # Commit revision origin when dealing with a branch or tag
9391
2705e6816d33 use 'x in dict' instead of 'dict.has_key(x)'
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8778
diff changeset
   301
            if 'Continuation-of' in catlog:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   302
                self.changes[rev].continuationof = self.recode(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   303
                    catlog['Continuation-of'])
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7603
diff changeset
   304
        except Exception:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25748
diff changeset
   305
            raise error.Abort(_('could not parse cat-log of %s') % rev)
6037
dd3267698d84 convert: add full description for gnu arch revisions
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6035
diff changeset
   306
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   307
    def _parsechangeset(self, data, rev):
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   308
        for l in data:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   309
            l = l.strip()
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   310
            # Added file (ignore added directory)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   311
            if l.startswith('A') and not l.startswith('A/'):
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   312
                file = self._stripbasepath(l[1:].strip())
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   313
                if not self._exclude(file):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   314
                    self.changes[rev].add_files.append(file)
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   315
            # Deleted file (ignore deleted directory)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   316
            elif l.startswith('D') and not l.startswith('D/'):
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   317
                file = self._stripbasepath(l[1:].strip())
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   318
                if not self._exclude(file):
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   319
                    self.changes[rev].del_files.append(file)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   320
            # Modified binary file
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   321
            elif l.startswith('Mb'):
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   322
                file = self._stripbasepath(l[2:].strip())
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   323
                if not self._exclude(file):
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   324
                    self.changes[rev].mod_files.append(file)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   325
            # Modified link
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   326
            elif l.startswith('M->'):
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   327
                file = self._stripbasepath(l[3:].strip())
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   328
                if not self._exclude(file):
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   329
                    self.changes[rev].mod_files.append(file)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   330
            # Modified file
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   331
            elif l.startswith('M'):
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   332
                file = self._stripbasepath(l[1:].strip())
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   333
                if not self._exclude(file):
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   334
                    self.changes[rev].mod_files.append(file)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   335
            # Renamed file (or link)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   336
            elif l.startswith('=>'):
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   337
                files = l[2:].strip().split(' ')
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   338
                if len(files) == 1:
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   339
                    files = l[2:].strip().split('\t')
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   340
                src = self._stripbasepath(files[0])
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   341
                dst = self._stripbasepath(files[1])
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   342
                if not self._exclude(src) and not self._exclude(dst):
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   343
                    self.changes[rev].ren_files[src] = dst
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   344
            # Conversion from file to link or from link to file (modified)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   345
            elif l.startswith('ch'):
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   346
                file = self._stripbasepath(l[2:].strip())
6055
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   347
                if not self._exclude(file):
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   348
                    self.changes[rev].mod_files.append(file)
a3d8b1f8721d convert: support binary files, link to files (viceversa) in gnu arch
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6049
diff changeset
   349
            # Renamed directory
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   350
            elif l.startswith('/>'):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   351
                dirs = l[2:].strip().split(' ')
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   352
                if len(dirs) == 1:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   353
                    dirs = l[2:].strip().split('\t')
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   354
                src = self._stripbasepath(dirs[0])
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   355
                dst = self._stripbasepath(dirs[1])
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   356
                if not self._exclude(src) and not self._exclude(dst):
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   357
                    self.changes[rev].ren_dirs[src] = dst