hgext/convert/gnuarch.py
author Mads Kiilerich <madski@unity3d.com>
Tue, 26 Aug 2014 22:03:32 +0200
changeset 22300 35ab037de989
parent 22296 650b5b6e75ed
child 24306 6ddc86eedc3b
permissions -rw-r--r--
convert: introduce --full for converting all files Convert will normally only process files that were changed in a source revision, apply the filemap, and record it has a change in the target repository. (If it ends up not really changing anything, nothing changes.) That means that _if_ the filemap is changed before continuing an incremental convert, the change will only kick in when the files it affects are modified in a source revision and thus processed. With --full, convert will make a full conversion every time and process all files in the source repo and remove target repo files that shouldn't be there. Filemap changes will thus kick in on the first converted revision, no matter what is changed. This flag should in most cases not make any difference but will make convert significantly slower. Other names has been considered for this feature, such as "resync", "sync", "checkunmodified", "all" or "allfiles", but I found that they were less obvious and required more explanation than "full" and were harder to describe consistently.
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.
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
     8
6212
e75aab656f46 Remove unused imports
Joel Rosdahl <joel@rosdahl.net>
parents: 6083
diff changeset
     9
from common import NoRepo, commandline, commit, converter_source
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    10
from mercurial.i18n import _
11987
3145951e50fe convert: use encoding.encoding instead of locale.getpreferredencoding()
Brodie Rao <brodie@bitheap.org>
parents: 11986
diff changeset
    11
from mercurial import encoding, util
3145951e50fe convert: use encoding.encoding instead of locale.getpreferredencoding()
Brodie Rao <brodie@bitheap.org>
parents: 11986
diff changeset
    12
import os, shutil, tempfile, stat
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
    13
from email.Parser import Parser
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    14
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    15
class gnuarch_source(converter_source, commandline):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    16
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8668
diff changeset
    17
    class gnuarch_rev(object):
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    18
        def __init__(self, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    19
            self.rev = rev
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    20
            self.summary = ''
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    21
            self.date = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    22
            self.author = ''
7583
77fec2d270ae convert/gnuarch: parse continuation-of revisions in gnuarch source
Edouard Gomez <ed.gomez@free.fr>
parents: 7582
diff changeset
    23
            self.continuationof = None
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    24
            self.add_files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    25
            self.mod_files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    26
            self.del_files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    27
            self.ren_files = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    28
            self.ren_dirs = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    29
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    30
    def __init__(self, ui, path, rev=None):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    31
        super(gnuarch_source, self).__init__(ui, path, rev=rev)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    32
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    33
        if not os.path.exists(os.path.join(path, '{arch}')):
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10394
diff changeset
    34
            raise NoRepo(_("%s does not look like a GNU Arch repository")
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10394
diff changeset
    35
                         % path)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    36
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    37
        # 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
    38
        self.execmd = None
14271
4030630fb59c rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents: 12344
diff changeset
    39
        if util.findexe('baz'):
6083
81a8667331e8 convert: detect baz before tla
Patrick Mezard <pmezard@gmail.com>
parents: 6079
diff changeset
    40
            self.execmd = 'baz'
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    41
        else:
14271
4030630fb59c rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents: 12344
diff changeset
    42
            if util.findexe('tla'):
6083
81a8667331e8 convert: detect baz before tla
Patrick Mezard <pmezard@gmail.com>
parents: 6079
diff changeset
    43
                self.execmd = 'tla'
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    44
            else:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    45
                raise util.Abort(_('cannot find a GNU Arch tool'))
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
        commandline.__init__(self, ui, self.execmd)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    48
15381
c519cd8f0169 backout dbdb777502dc (issue3077) (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15355
diff changeset
    49
        self.path = os.path.realpath(path)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    50
        self.tmppath = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    51
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    52
        self.treeversion = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    53
        self.lastrev = None
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    54
        self.changes = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    55
        self.parents = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    56
        self.tags = {}
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
    57
        self.catlogparser = Parser()
11987
3145951e50fe convert: use encoding.encoding instead of locale.getpreferredencoding()
Brodie Rao <brodie@bitheap.org>
parents: 11986
diff changeset
    58
        self.encoding = encoding.encoding
7584
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    59
        self.archives = []
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    60
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    61
    def before(self):
7584
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    62
        # Get registered archives
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    63
        self.archives = [i.rstrip('\n')
28563e94c471 convert/gnuarch: retrieve known archive names list
Edouard Gomez <ed.gomez@free.fr>
parents: 7583
diff changeset
    64
                         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
    65
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    66
        if self.execmd == 'tla':
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    67
            output = self.run0('tree-version', self.path)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    68
        else:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    69
            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
    70
        self.treeversion = output.strip()
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    71
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    72
        # Get name of temporary directory
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    73
        version = self.treeversion.split('/')
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    74
        self.tmppath = os.path.join(tempfile.gettempdir(),
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    75
                                    'hg-%s' % version[1])
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    76
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
    77
        # Generate parents dictionary
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    78
        self.parents[None] = []
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    79
        treeversion = self.treeversion
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    80
        child = None
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    81
        while treeversion:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    82
            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
    83
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    84
            archive = treeversion.split('/')[0]
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    85
            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
    86
                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
    87
                                 'an unregistered archive %s...\n') % archive)
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    88
                break
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    89
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    90
            # 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
    91
            output, status = self.runlines('revisions', '-r', '-f', treeversion)
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17391
diff changeset
    92
            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
    93
                           % treeversion)
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    94
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    95
            # 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
    96
            treeversion = None
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
            for l in output:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
    99
                rev = l.strip()
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   100
                self.changes[rev] = self.gnuarch_rev(rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   101
                self.parents[rev] = []
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   102
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   103
                # Read author, date and summary
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   104
                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
   105
                if status:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   106
                    catlog  = self.run0('cat-archive-log', rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   107
                self._parsecatlog(catlog, rev)
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
                # Populate the parents map
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   110
                self.parents[child].append(rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   111
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   112
                # 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
   113
                # revision scanned
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   114
                child = rev
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   115
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   116
                # 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
   117
                # 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
   118
                # by the continuation-of header.
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   119
                if self.changes[rev].continuationof:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   120
                    treeversion = '--'.join(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   121
                        self.changes[rev].continuationof.split('--')[:-1])
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   122
                    break
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   123
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   124
                # 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
   125
                # 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
   126
                if rev[-6:] == 'base-0':
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   127
                    break
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   128
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   129
    def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   130
        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
   131
        shutil.rmtree(self.tmppath, ignore_errors=True)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   132
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   133
    def getheads(self):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   134
        return self.parents[None]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   135
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   136
    def getfile(self, name, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   137
        if rev != self.lastrev:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   138
            raise util.Abort(_('internal calling inconsistency'))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   139
12344
b6173aee4a47 Use lexists() instead of exists() where appropriate
Patrick Mezard <pmezard@gmail.com>
parents: 11987
diff changeset
   140
        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
   141
            return None, None
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   142
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10938
diff changeset
   143
        return self._getfile(name, rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   144
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   145
    def getchanges(self, rev, full):
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   146
        if full:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   147
            raise util.Abort(_("convert from arch do not support --full"))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   148
        self._update(rev)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   149
        changes = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   150
        copies = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   151
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   152
        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
   153
            changes.append((f, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   154
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   155
        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
   156
            changes.append((f, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   157
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   158
        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
   159
            changes.append((f, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   160
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   161
        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
   162
            to = self.changes[rev].ren_files[src]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   163
            changes.append((src, rev))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   164
            changes.append((to, rev))
7567
0946294d1f32 convert/gnuarch: fix switched copy source and destination
Patrick Mezard <pmezard@gmail.com>
parents: 6913
diff changeset
   165
            copies[to] = src
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   166
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   167
        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
   168
            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
   169
            chgs, cps = self._rendirchanges(src, to)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   170
            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
   171
            copies.update(cps)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   172
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   173
        self.lastrev = rev
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8151
diff changeset
   174
        return sorted(set(changes)), copies
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   175
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   176
    def getcommit(self, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   177
        changes = self.changes[rev]
8662
eaee3491ce11 convert/gnuarch: wrap long line, format kwargs without spaces
Martin Geisler <mg@lazybytes.net>
parents: 8250
diff changeset
   178
        return commit(author=changes.author, date=changes.date,
eaee3491ce11 convert/gnuarch: wrap long line, format kwargs without spaces
Martin Geisler <mg@lazybytes.net>
parents: 8250
diff changeset
   179
                      desc=changes.summary, parents=self.parents[rev], rev=rev)
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
    def gettags(self):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   182
        return self.tags
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   183
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   184
    def _execute(self, cmd, *args, **kwargs):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   185
        cmdline = [self.execmd, cmd]
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   186
        cmdline += args
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   187
        cmdline = [util.shellquote(arg) for arg in cmdline]
17391
fc24c10424d2 util: replace util.nulldev with os.devnull
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 15381
diff changeset
   188
        cmdline += ['>', os.devnull, '2>', os.devnull]
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   189
        cmdline = util.quotecommand(' '.join(cmdline))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   190
        self.ui.debug(cmdline, '\n')
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   191
        return os.system(cmdline)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   192
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   193
    def _update(self, rev):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   194
        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
   195
        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
   196
                                              rev)
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   197
        if status:
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   198
            # 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
   199
            # 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
   200
            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
   201
            self._obtainrevision(rev)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   202
        else:
7585
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   203
            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
   204
            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
   205
                          % (old_rev, rev))
075b7ef0f84d convert/gnuarch: follow continuation-of revisions
Edouard Gomez <ed.gomez@free.fr>
parents: 7584
diff changeset
   206
            self._parsechangeset(changeset, rev)
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 _getfile(self, name, rev):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   209
        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
   210
        if stat.S_ISLNK(mode):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   211
            data = os.readlink(os.path.join(self.tmppath, name))
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   212
            mode = mode and 'l' or ''
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   213
        else:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   214
            data = open(os.path.join(self.tmppath, name), 'rb').read()
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   215
            mode = (mode & 0111) and 'x' or ''
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   216
        return data, mode
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   217
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   218
    def _exclude(self, name):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   219
        exclude = ['{arch}', '.arch-ids', '.arch-inventory']
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   220
        for exc in exclude:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   221
            if name.find(exc) != -1:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   222
                return True
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   223
        return False
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   224
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   225
    def _readcontents(self, path):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   226
        files = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   227
        contents = os.listdir(path)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   228
        while len(contents) > 0:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   229
            c = contents.pop()
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   230
            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
   231
            # 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
   232
            # 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
   233
            if not self._exclude(p):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   234
                if os.path.isdir(p):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   235
                    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
   236
                else:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   237
                    files.append(c)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   238
        return files
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   239
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   240
    def _rendirchanges(self, src, dest):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   241
        changes = []
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   242
        copies = {}
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   243
        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
   244
        for f in files:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   245
            s = os.path.join(src, f)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   246
            d = os.path.join(dest, f)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   247
            changes.append(s)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   248
            changes.append(d)
7567
0946294d1f32 convert/gnuarch: fix switched copy source and destination
Patrick Mezard <pmezard@gmail.com>
parents: 6913
diff changeset
   249
            copies[d] = s
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   250
        return changes, copies
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   251
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   252
    def _obtainrevision(self, rev):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   253
        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
   254
        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
   255
        self.checkexit(output)
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9391
diff changeset
   256
        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
   257
        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
   258
        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
   259
6079
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   260
    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
   261
        if path.startswith('./'):
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   262
            return path[2:]
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   263
        return path
ea34059b89de convert: added GNU Arch (tla) tests and related fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6078
diff changeset
   264
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   265
    def _parsecatlog(self, data, rev):
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   266
        try:
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   267
            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
   268
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
   269
            # Commit date
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   270
            self.changes[rev].date = util.datestr(
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   271
                util.strdate(catlog['Standard-date'],
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   272
                             '%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
   273
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
   274
            # 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
   275
            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
   276
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
   277
            # 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
   278
            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
   279
                                                    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
   280
            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
   281
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
   282
            # 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
   283
            if 'Continuation-of' in catlog:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   284
                self.changes[rev].continuationof = self.recode(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   285
                    catlog['Continuation-of'])
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7603
diff changeset
   286
        except Exception:
7578
7971650bdc73 convert/gnuarch: fix cat-log parsing
Edouard Gomez <ed.gomez@free.fr>
parents: 7577
diff changeset
   287
            raise util.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
   288
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6044
diff changeset
   289
    def _parsechangeset(self, data, rev):
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   290
        for l in data:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   291
            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
   292
            # Added file (ignore added directory)
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   293
            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
   294
                file = self._stripbasepath(l[1:].strip())
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   295
                if not self._exclude(file):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   296
                    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
   297
            # 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
   298
            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
   299
                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
   300
                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
   301
                    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
   302
            # 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
   303
            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
   304
                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
   305
                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
   306
                    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
   307
            # 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
   308
            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
   309
                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
   310
                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
   311
                    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
   312
            # 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
   313
            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
   314
                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
   315
                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
   316
                    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
   317
            # 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
   318
            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
   319
                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
   320
                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
   321
                    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
   322
                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
   323
                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
   324
                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
   325
                    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
   326
            # 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
   327
            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
   328
                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
   329
                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
   330
                    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
   331
            # Renamed directory
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   332
            elif l.startswith('/>'):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   333
                dirs = l[2:].strip().split(' ')
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   334
                if len(dirs) == 1:
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents:
diff changeset
   335
                    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
   336
                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
   337
                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
   338
                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
   339
                    self.changes[rev].ren_dirs[src] = dst