hgext/convert/monotone.py
author Pierre-Yves David <pierre-yves.david@fb.com>
Tue, 25 Feb 2014 18:45:01 -0800
branchstable
changeset 20594 ba619c50a355
parent 17426 9724f8f8850b
child 22296 650b5b6e75ed
permissions -rw-r--r--
resolve: use "other" changeset from merge state (issue4163) We can use the "other" data from the recorded merge state instead of inferring what the other could be from working copy parent. This will allow resolve to fulfil its duty even when the second parent have been dropped. Most direct benefit is fixing a regression in backout.
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: 8127
diff changeset
     1
# monotone.py - monotone support for the convert extension
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8127
diff changeset
     2
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8127
diff changeset
     3
#  Copyright 2008, 2009 Mikkel Fahnoe Jorgensen <mikkel@dvide.com> and
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8127
diff changeset
     4
#  others
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8127
diff changeset
     5
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8127
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: 9823
diff changeset
     7
# GNU General Public License version 2 or any later version.
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
     8
7873
4a4c7f6a5912 cleanup: drop unused imports
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6632
diff changeset
     9
import os, re
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    10
from mercurial import util
7873
4a4c7f6a5912 cleanup: drop unused imports
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 6632
diff changeset
    11
from common import NoRepo, commit, converter_source, checktool
6332
950e72fc7cf3 convert: allow missing tools not to stop source type detection
Patrick Mezard <pmezard@gmail.com>
parents: 6307
diff changeset
    12
from common import commandline
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    13
from mercurial.i18n import _
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    14
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    15
class monotone_source(converter_source, commandline):
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    16
    def __init__(self, ui, path=None, rev=None):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    17
        converter_source.__init__(self, ui, path, rev)
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    18
        commandline.__init__(self, ui, 'mtn')
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    19
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    20
        self.ui = ui
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    21
        self.path = path
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    22
        self.automatestdio = False
13761
aeb41f0048e7 convert/mtn: avoid unnecessary initial test of mtn repo
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13760
diff changeset
    23
        self.rev = rev
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    24
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    25
        norepo = NoRepo(_("%s does not look like a monotone repository")
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    26
                        % path)
7973
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7957
diff changeset
    27
        if not os.path.exists(os.path.join(path, '_MTN')):
8052
fe2a87a3d344 convert/mtn: allow monotone database files as sources
Patrick Mezard <pmezard@gmail.com>
parents: 8051
diff changeset
    28
            # Could be a monotone repository (SQLite db file)
fe2a87a3d344 convert/mtn: allow monotone database files as sources
Patrick Mezard <pmezard@gmail.com>
parents: 8051
diff changeset
    29
            try:
14179
64481eee6215 hgext: fixup a couple missed file().read() instances
Matt Mackall <mpm@selenic.com>
parents: 13792
diff changeset
    30
                f = file(path, 'rb')
64481eee6215 hgext: fixup a couple missed file().read() instances
Matt Mackall <mpm@selenic.com>
parents: 13792
diff changeset
    31
                header = f.read(16)
64481eee6215 hgext: fixup a couple missed file().read() instances
Matt Mackall <mpm@selenic.com>
parents: 13792
diff changeset
    32
                f.close()
16688
cfb6682961b8 cleanup: replace naked excepts with more specific ones
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
    33
            except IOError:
8052
fe2a87a3d344 convert/mtn: allow monotone database files as sources
Patrick Mezard <pmezard@gmail.com>
parents: 8051
diff changeset
    34
                header = ''
fe2a87a3d344 convert/mtn: allow monotone database files as sources
Patrick Mezard <pmezard@gmail.com>
parents: 8051
diff changeset
    35
            if header != 'SQLite format 3\x00':
fe2a87a3d344 convert/mtn: allow monotone database files as sources
Patrick Mezard <pmezard@gmail.com>
parents: 8051
diff changeset
    36
                raise norepo
7973
db3a68fd9387 convert: attempt to check repo type before checking for tool
Matt Mackall <mpm@selenic.com>
parents: 7957
diff changeset
    37
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    38
        # regular expressions for parsing monotone output
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    39
        space    = r'\s*'
6632
aa3f61884a48 convert.monotone: fix quotes and backslashes in change descriptions.
David Reiss <davidn@gmail.com>
parents: 6376
diff changeset
    40
        name     = r'\s+"((?:\\"|[^"])*)"\s*'
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    41
        value    = name
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    42
        revision = r'\s+\[(\w+)\]\s*'
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    43
        lines    = r'(?:.|\n)+'
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    44
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    45
        self.dir_re      = re.compile(space + "dir" + name)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    46
        self.file_re     = re.compile(space + "file" + name +
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    47
                                      "content" + revision)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    48
        self.add_file_re = re.compile(space + "add_file" + name +
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    49
                                      "content" + revision)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    50
        self.patch_re    = re.compile(space + "patch" + name +
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    51
                                      "from" + revision + "to" + revision)
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    52
        self.rename_re   = re.compile(space + "rename" + name + "to" + name)
6376
b40e90341ae2 convert: record deleted files in monotone source
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
    53
        self.delete_re   = re.compile(space + "delete" + name)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    54
        self.tag_re      = re.compile(space + "tag" + name + "revision" +
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    55
                                      revision)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    56
        self.cert_re     = re.compile(lines + space + "name" + name +
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    57
                                      "value" + value)
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    58
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    59
        attr = space + "file" + lines + space + "attr" + space
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    60
        self.attr_execute_re = re.compile(attr  + '"mtn:execute"' +
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    61
                                          space + '"true"')
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    62
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    63
        # cached data
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    64
        self.manifest_rev = None
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
    65
        self.manifest = None
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    66
        self.files = None
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    67
        self.dirs  = None
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    68
6332
950e72fc7cf3 convert: allow missing tools not to stop source type detection
Patrick Mezard <pmezard@gmail.com>
parents: 6307
diff changeset
    69
        checktool('mtn', abort=False)
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    70
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    71
    def mtnrun(self, *args, **kwargs):
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    72
        if self.automatestdio:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    73
            return self.mtnrunstdio(*args, **kwargs)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    74
        else:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    75
            return self.mtnrunsingle(*args, **kwargs)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    76
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    77
    def mtnrunsingle(self, *args, **kwargs):
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    78
        kwargs['d'] = self.path
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    79
        return self.run0('automate', *args, **kwargs)
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
    80
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    81
    def mtnrunstdio(self, *args, **kwargs):
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    82
        # Prepare the command in automate stdio format
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    83
        command = []
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    84
        for k, v in kwargs.iteritems():
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    85
            command.append("%s:%s" % (len(k), k))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    86
            if v:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    87
                command.append("%s:%s" % (len(v), v))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    88
        if command:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    89
            command.insert(0, 'o')
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    90
            command.append('e')
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    91
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    92
        command.append('l')
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    93
        for arg in args:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    94
            command += "%s:%s" % (len(arg), arg)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    95
        command.append('e')
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    96
        command = ''.join(command)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    97
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    98
        self.ui.debug("mtn: sending '%s'\n" % command)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
    99
        self.mtnwritefp.write(command)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   100
        self.mtnwritefp.flush()
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   101
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   102
        return self.mtnstdioreadcommandoutput(command)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   103
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   104
    def mtnstdioreadpacket(self):
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   105
        read = None
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   106
        commandnbr = ''
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   107
        while read != ':':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   108
            read = self.mtnreadfp.read(1)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   109
            if not read:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   110
                raise util.Abort(_('bad mtn packet - no end of commandnbr'))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   111
            commandnbr += read
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   112
        commandnbr = commandnbr[:-1]
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   113
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   114
        stream = self.mtnreadfp.read(1)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   115
        if stream not in 'mewptl':
16231
ce292f1379ba i18n: fix all remaining uses of % inside _()
Matt Mackall <mpm@selenic.com>
parents: 14179
diff changeset
   116
            raise util.Abort(_('bad mtn packet - bad stream type %s') % stream)
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   117
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   118
        read = self.mtnreadfp.read(1)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   119
        if read != ':':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   120
            raise util.Abort(_('bad mtn packet - no divider before size'))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   121
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   122
        read = None
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   123
        lengthstr = ''
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   124
        while read != ':':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   125
            read = self.mtnreadfp.read(1)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   126
            if not read:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   127
                raise util.Abort(_('bad mtn packet - no end of packet size'))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   128
            lengthstr += read
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   129
        try:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   130
            length = long(lengthstr[:-1])
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   131
        except TypeError:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   132
            raise util.Abort(_('bad mtn packet - bad packet size %s')
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   133
                % lengthstr)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   134
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   135
        read = self.mtnreadfp.read(length)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   136
        if len(read) != length:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   137
            raise util.Abort(_("bad mtn packet - unable to read full packet "
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   138
                "read %s of %s") % (len(read), length))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   139
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   140
        return (commandnbr, stream, length, read)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   141
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   142
    def mtnstdioreadcommandoutput(self, command):
13792
a916e8de4313 convert/mtn: Fix conversion of large files from mtn (broken in ed97955e0c04)
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13779
diff changeset
   143
        retval = []
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   144
        while True:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   145
            commandnbr, stream, length, output = self.mtnstdioreadpacket()
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   146
            self.ui.debug('mtn: read packet %s:%s:%s\n' %
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   147
                (commandnbr, stream, length))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   148
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   149
            if stream == 'l':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   150
                # End of command
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   151
                if output != '0':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   152
                    raise util.Abort(_("mtn command '%s' returned %s") %
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   153
                        (command, output))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   154
                break
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   155
            elif stream in 'ew':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   156
                # Error, warning output
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   157
                self.ui.warn(_('%s error:\n') % self.command)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   158
                self.ui.warn(output)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   159
            elif stream == 'p':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   160
                # Progress messages
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   161
                self.ui.debug('mtn: ' + output)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   162
            elif stream == 'm':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   163
                # Main stream - command output
13792
a916e8de4313 convert/mtn: Fix conversion of large files from mtn (broken in ed97955e0c04)
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13779
diff changeset
   164
                retval.append(output)
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   165
13792
a916e8de4313 convert/mtn: Fix conversion of large files from mtn (broken in ed97955e0c04)
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13779
diff changeset
   166
        return ''.join(retval)
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   167
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   168
    def mtnloadmanifest(self, rev):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   169
        if self.manifest_rev == rev:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   170
            return
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   171
        self.manifest = self.mtnrun("get_manifest_of", rev).split("\n\n")
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   172
        self.manifest_rev = rev
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   173
        self.files = {}
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   174
        self.dirs = {}
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   175
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   176
        for e in self.manifest:
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   177
            m = self.file_re.match(e)
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   178
            if m:
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   179
                attr = ""
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   180
                name = m.group(1)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   181
                node = m.group(2)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   182
                if self.attr_execute_re.match(e):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   183
                    attr += "x"
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   184
                self.files[name] = (node, attr)
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   185
            m = self.dir_re.match(e)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   186
            if m:
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   187
                self.dirs[m.group(1)] = True
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   188
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   189
    def mtnisfile(self, name, rev):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   190
        # a non-file could be a directory or a deleted or renamed file
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   191
        self.mtnloadmanifest(rev)
8458
f6c99b1628d7 convert: cleanups in monotone converter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
   192
        return name in self.files
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   193
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   194
    def mtnisdir(self, name, rev):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   195
        self.mtnloadmanifest(rev)
8458
f6c99b1628d7 convert: cleanups in monotone converter
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
   196
        return name in self.dirs
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   197
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   198
    def mtngetcerts(self, rev):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   199
        certs = {"author":"<missing>", "date":"<missing>",
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   200
            "changelog":"<missing>", "branch":"<missing>"}
9823
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   201
        certlist = self.mtnrun("certs", rev)
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   202
        # mtn < 0.45:
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   203
        #   key "test@selenic.com"
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   204
        # mtn >= 0.45:
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   205
        #   key [ff58a7ffb771907c4ff68995eada1c4da068d328]
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   206
        certlist = re.split('\n\n      key ["\[]', certlist)
11d7bb5e0df2 convert/mtn: handle change in mtn 0.45 certs output
Patrick Mezard <pmezard@gmail.com>
parents: 8458
diff changeset
   207
        for e in certlist:
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   208
            m = self.cert_re.match(e)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   209
            if m:
6632
aa3f61884a48 convert.monotone: fix quotes and backslashes in change descriptions.
David Reiss <davidn@gmail.com>
parents: 6376
diff changeset
   210
                name, value = m.groups()
aa3f61884a48 convert.monotone: fix quotes and backslashes in change descriptions.
David Reiss <davidn@gmail.com>
parents: 6376
diff changeset
   211
                value = value.replace(r'\"', '"')
aa3f61884a48 convert.monotone: fix quotes and backslashes in change descriptions.
David Reiss <davidn@gmail.com>
parents: 6376
diff changeset
   212
                value = value.replace(r'\\', '\\')
aa3f61884a48 convert.monotone: fix quotes and backslashes in change descriptions.
David Reiss <davidn@gmail.com>
parents: 6376
diff changeset
   213
                certs[name] = value
8101
d8229670710f convert/mtn: handle subsecond commit dates (issue1616)
Paul Aurich <paul@darkrain42.org>
parents: 8099
diff changeset
   214
        # Monotone may have subsecond dates: 2005-02-05T09:39:12.364306
8125
da9f3866c637 convert/mtn: mtn does not record timezones, mark dates as UTC (issue1624)
Paul Aurich <paul@darkrain42.org>
parents: 8124
diff changeset
   215
        # and all times are stored in UTC
da9f3866c637 convert/mtn: mtn does not record timezones, mark dates as UTC (issue1624)
Paul Aurich <paul@darkrain42.org>
parents: 8124
diff changeset
   216
        certs["date"] = certs["date"].split('.')[0] + " UTC"
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   217
        return certs
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   218
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   219
    # implement the converter_source interface:
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   220
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   221
    def getheads(self):
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   222
        if not self.rev:
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   223
            return self.mtnrun("leaves").splitlines()
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   224
        else:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   225
            return [self.rev]
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   226
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   227
    def getchanges(self, rev):
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   228
        revision = self.mtnrun("get_revision", rev).split("\n\n")
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   229
        files = {}
8123
933b874e402f convert/mtn: handle files moved in a moved directory (issue1619/2)
Patrick Mezard <pmezard@gmail.com>
parents: 8101
diff changeset
   230
        ignoremove = {}
8099
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   231
        renameddirs = []
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   232
        copies = {}
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   233
        for e in revision:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   234
            m = self.add_file_re.match(e)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   235
            if m:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   236
                files[m.group(1)] = rev
8123
933b874e402f convert/mtn: handle files moved in a moved directory (issue1619/2)
Patrick Mezard <pmezard@gmail.com>
parents: 8101
diff changeset
   237
                ignoremove[m.group(1)] = rev
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   238
            m = self.patch_re.match(e)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   239
            if m:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   240
                files[m.group(1)] = rev
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   241
            # Delete/rename is handled later when the convert engine
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   242
            # discovers an IOError exception from getfile,
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   243
            # but only if we add the "from" file to the list of changes.
6376
b40e90341ae2 convert: record deleted files in monotone source
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   244
            m = self.delete_re.match(e)
b40e90341ae2 convert: record deleted files in monotone source
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   245
            if m:
b40e90341ae2 convert: record deleted files in monotone source
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   246
                files[m.group(1)] = rev
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   247
            m = self.rename_re.match(e)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   248
            if m:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   249
                toname = m.group(2)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   250
                fromname = m.group(1)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   251
                if self.mtnisfile(toname, rev):
8123
933b874e402f convert/mtn: handle files moved in a moved directory (issue1619/2)
Patrick Mezard <pmezard@gmail.com>
parents: 8101
diff changeset
   252
                    ignoremove[toname] = 1
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   253
                    copies[toname] = fromname
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   254
                    files[toname] = rev
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   255
                    files[fromname] = rev
8099
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   256
                elif self.mtnisdir(toname, rev):
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   257
                    renameddirs.append((fromname, toname))
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   258
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   259
        # Directory renames can be handled only once we have recorded
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   260
        # all new files
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   261
        for fromdir, todir in renameddirs:
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   262
            renamed = {}
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   263
            for tofile in self.files:
8123
933b874e402f convert/mtn: handle files moved in a moved directory (issue1619/2)
Patrick Mezard <pmezard@gmail.com>
parents: 8101
diff changeset
   264
                if tofile in ignoremove:
8099
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   265
                    continue
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   266
                if tofile.startswith(todir + '/'):
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   267
                    renamed[tofile] = fromdir + tofile[len(todir):]
8124
d883bfbd2e60 convert/mtn: handle directory move into moved directory (issue1619/3)
Patrick Mezard <pmezard@gmail.com>
parents: 8123
diff changeset
   268
                    # Avoid chained moves like:
d883bfbd2e60 convert/mtn: handle directory move into moved directory (issue1619/3)
Patrick Mezard <pmezard@gmail.com>
parents: 8123
diff changeset
   269
                    # d1(/a) => d3/d1(/a)
d883bfbd2e60 convert/mtn: handle directory move into moved directory (issue1619/3)
Patrick Mezard <pmezard@gmail.com>
parents: 8123
diff changeset
   270
                    # d2 => d3
d883bfbd2e60 convert/mtn: handle directory move into moved directory (issue1619/3)
Patrick Mezard <pmezard@gmail.com>
parents: 8123
diff changeset
   271
                    ignoremove[tofile] = 1
8099
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   272
            for tofile, fromfile in renamed.items():
8100
233f11b544f5 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 8052 8099
diff changeset
   273
                self.ui.debug (_("copying file in renamed directory "
233f11b544f5 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 8052 8099
diff changeset
   274
                                 "from '%s' to '%s'")
8099
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   275
                               % (fromfile, tofile), '\n')
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   276
                files[tofile] = rev
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   277
                copies[tofile] = fromfile
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   278
            for fromfile in renamed.values():
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   279
                files[fromfile] = rev
3cdf4872941a convert/mtn: handle new files in moved directories (issue1619)
Patrick Mezard <pmezard@gmail.com>
parents: 8050
diff changeset
   280
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   281
        return (files.items(), copies)
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   282
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   283
    def getfile(self, name, rev):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   284
        if not self.mtnisfile(name, rev):
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16231
diff changeset
   285
            raise IOError # file was deleted or renamed
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   286
        try:
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10938
diff changeset
   287
            data = self.mtnrun("get_file_of", name, r=rev)
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16688
diff changeset
   288
        except Exception:
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16231
diff changeset
   289
            raise IOError # file was deleted or renamed
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10938
diff changeset
   290
        self.mtnloadmanifest(rev)
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10938
diff changeset
   291
        node, attr = self.files.get(name, (None, ""))
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10938
diff changeset
   292
        return data, attr
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   293
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   294
    def getcommit(self, rev):
13779
c13bfa451656 convert/mtn: convert suspended branches as closed branches
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13761
diff changeset
   295
        extra = {}
c13bfa451656 convert/mtn: convert suspended branches as closed branches
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13761
diff changeset
   296
        certs = self.mtngetcerts(rev)
c13bfa451656 convert/mtn: convert suspended branches as closed branches
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13761
diff changeset
   297
        if certs.get('suspend') == certs["branch"]:
c13bfa451656 convert/mtn: convert suspended branches as closed branches
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13761
diff changeset
   298
            extra['close'] = '1'
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   299
        return commit(
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   300
            author=certs["author"],
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   301
            date=util.datestr(util.strdate(certs["date"], "%Y-%m-%dT%H:%M:%S")),
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   302
            desc=certs["changelog"],
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   303
            rev=rev,
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   304
            parents=self.mtnrun("parents", rev).splitlines(),
13779
c13bfa451656 convert/mtn: convert suspended branches as closed branches
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13761
diff changeset
   305
            branch=certs["branch"],
c13bfa451656 convert/mtn: convert suspended branches as closed branches
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13761
diff changeset
   306
            extra=extra)
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   307
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   308
    def gettags(self):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   309
        tags = {}
6307
6840668e3bf6 cleanup monotone conversion and use commandline class
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents: 6306
diff changeset
   310
        for e in self.mtnrun("tags").split("\n\n"):
6306
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   311
            m = self.tag_re.match(e)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   312
            if m:
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   313
                tags[m.group(1)] = m.group(2)
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   314
        return tags
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   315
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   316
    def getchangedfiles(self, rev, i):
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   317
        # This function is only needed to support --filemap
2f9de4aaea9e initial version of monotone source for convert extension
Mikkel Fahnøe Jørgensen <mikkel@dvide.com>
parents:
diff changeset
   318
        # ... and we don't support that
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16231
diff changeset
   319
        raise NotImplementedError
13760
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   320
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   321
    def before(self):
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   322
        # Check if we have a new enough version to use automate stdio
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   323
        version = 0.0
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   324
        try:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   325
            versionstr = self.mtnrunsingle("interface_version")
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   326
            version = float(versionstr)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   327
        except Exception:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   328
            raise util.Abort(_("unable to determine mtn automate interface "
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   329
                "version"))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   330
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   331
        if version >= 12.0:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   332
            self.automatestdio = True
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   333
            self.ui.debug("mtn automate version %s - using automate stdio\n" %
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   334
                version)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   335
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   336
            # launch the long-running automate stdio process
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   337
            self.mtnwritefp, self.mtnreadfp = self._run2('automate', 'stdio',
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   338
                '-d', self.path)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   339
            # read the headers
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   340
            read = self.mtnreadfp.readline()
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   341
            if read != 'format-version: 2\n':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   342
                raise util.Abort(_('mtn automate stdio header unexpected: %s')
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   343
                    % read)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   344
            while read != '\n':
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   345
                read = self.mtnreadfp.readline()
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   346
                if not read:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   347
                    raise util.Abort(_("failed to reach end of mtn automate "
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   348
                        "stdio headers"))
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   349
        else:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   350
            self.ui.debug("mtn automate version %s - not using automate stdio "
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   351
                "(automate >= 12.0 - mtn >= 0.46 is needed)\n" % version)
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   352
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   353
    def after(self):
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   354
        if self.automatestdio:
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   355
            self.mtnwritefp.close()
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   356
            self.mtnwritefp = None
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   357
            self.mtnreadfp.close()
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   358
            self.mtnreadfp = None
ed97955e0c04 convert/mtn: add support for using monotone's "automate stdio" when available
Daniel Atallah <daniel.atallah@gmail.com>
parents: 11134
diff changeset
   359