hgext/convert/common.py
author Stefano Tortarolo <stefano.tortarolo@gmail.com>
Mon, 18 Jul 2011 22:58:21 +0200
branchstable
changeset 14897 b9daa5b7a3af
parent 14271 4030630fb59c
child 15606 2ad4e9b44d8b
child 15608 63ff8fe3a8f0
permissions -rw-r--r--
rebase: block collapse with keepbranches on multiple named branches (issue2112) Collapse and keepbranches should be blocked when there is more than one named branch on the branch that's going to be rebased.
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: 8155
diff changeset
     1
# common.py - common code for the convert extension
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8155
diff changeset
     2
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8155
diff changeset
     3
#  Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8155
diff changeset
     4
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8155
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9542
diff changeset
     6
# GNU General Public License version 2 or any later version.
8250
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8155
diff changeset
     7
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
     8
import base64, errno
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
     9
import os
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    10
import cPickle as pickle
8656
284fda4cd093 removed unused imports
Martin Geisler <mg@lazybytes.net>
parents: 8444
diff changeset
    11
from mercurial import util
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5512
diff changeset
    12
from mercurial.i18n import _
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    13
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    14
def encodeargs(args):
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    15
    def encodearg(s):
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    16
        lines = base64.encodestring(s)
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    17
        lines = [l.splitlines()[0] for l in lines]
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    18
        return ''.join(lines)
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5127
diff changeset
    19
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    20
    s = pickle.dumps(args)
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    21
    return encodearg(s)
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    22
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    23
def decodeargs(s):
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    24
    s = base64.decodestring(s)
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
    25
    return pickle.loads(s)
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
    26
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    27
class MissingTool(Exception):
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    28
    pass
6332
950e72fc7cf3 convert: allow missing tools not to stop source type detection
Patrick Mezard <pmezard@gmail.com>
parents: 6049
diff changeset
    29
950e72fc7cf3 convert: allow missing tools not to stop source type detection
Patrick Mezard <pmezard@gmail.com>
parents: 6049
diff changeset
    30
def checktool(exe, name=None, abort=True):
5497
f0a3918abd42 convert: fail if an external required tool is not found
Patrick Mezard <pmezard@gmail.com>
parents: 5441
diff changeset
    31
    name = name or exe
14271
4030630fb59c rename util.find_exe to findexe
Adrian Buehlmann <adrian@cadifra.com>
parents: 14234
diff changeset
    32
    if not util.findexe(exe):
6332
950e72fc7cf3 convert: allow missing tools not to stop source type detection
Patrick Mezard <pmezard@gmail.com>
parents: 6049
diff changeset
    33
        exc = abort and util.Abort or MissingTool
950e72fc7cf3 convert: allow missing tools not to stop source type detection
Patrick Mezard <pmezard@gmail.com>
parents: 6049
diff changeset
    34
        raise exc(_('cannot find required "%s" tool') % name)
5497
f0a3918abd42 convert: fail if an external required tool is not found
Patrick Mezard <pmezard@gmail.com>
parents: 5441
diff changeset
    35
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    36
class NoRepo(Exception):
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
    37
    pass
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
    38
5400
d9057f00d343 convert: change SKIPREV to 'SKIP'
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
    39
SKIPREV = 'SKIP'
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
    40
4448
af013ae3ca10 use documented convert-repo interface
Daniel Holth <dholth@fastmail.fm>
parents: 4447
diff changeset
    41
class commit(object):
5439
d0c67b52ac01 convert: make contents of "extra" dict available from sources, for sinks.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5400
diff changeset
    42
    def __init__(self, author, date, desc, parents, branch=None, rev=None,
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8656
diff changeset
    43
                 extra={}, sortkey=None):
5984
9451a941c536 convert: use 'unknown' and '0 0' if commit author or date weren't specified
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5934
diff changeset
    44
        self.author = author or 'unknown'
9451a941c536 convert: use 'unknown' and '0 0' if commit author or date weren't specified
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5934
diff changeset
    45
        self.date = date or '0 0'
5024
7963438881f5 convert: empty log messages are OK as of 7f5c3fb0a37d
Bryan O'Sullivan <bos@serpentine.com>
parents: 5012
diff changeset
    46
        self.desc = desc
5012
be25decfdb13 convert: make commit constructor clearer and less magical
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    47
        self.parents = parents
be25decfdb13 convert: make commit constructor clearer and less magical
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    48
        self.branch = branch
be25decfdb13 convert: make commit constructor clearer and less magical
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    49
        self.rev = rev
5439
d0c67b52ac01 convert: make contents of "extra" dict available from sources, for sinks.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5400
diff changeset
    50
        self.extra = extra
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8656
diff changeset
    51
        self.sortkey = sortkey
3954
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3953
diff changeset
    52
4448
af013ae3ca10 use documented convert-repo interface
Daniel Holth <dholth@fastmail.fm>
parents: 4447
diff changeset
    53
class converter_source(object):
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    54
    """Conversion source interface"""
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    55
5556
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
    56
    def __init__(self, ui, path=None, rev=None):
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    57
        """Initialize conversion source (or raise NoRepo("message")
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    58
        exception if path is not a valid repository)"""
4810
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
    59
        self.ui = ui
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
    60
        self.path = path
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
    61
        self.rev = rev
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
    62
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
    63
        self.encoding = 'utf-8'
4812
a5209b0487e0 convert: export revmap to source.
Brendan Cully <brendan@kublai.com>
parents: 4810
diff changeset
    64
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5287
diff changeset
    65
    def before(self):
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5287
diff changeset
    66
        pass
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5287
diff changeset
    67
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5287
diff changeset
    68
    def after(self):
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5287
diff changeset
    69
        pass
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5287
diff changeset
    70
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
    71
    def setrevmap(self, revmap):
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
    72
        """set the map of already-converted revisions"""
4813
1fcdf2fe3d7c convert: svn: use revmap to parse only new revisions in incremental conversions
Brendan Cully <brendan@kublai.com>
parents: 4812
diff changeset
    73
        pass
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    74
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    75
    def getheads(self):
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    76
        """Return a list of this repository's heads"""
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    77
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    78
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    79
    def getfile(self, name, rev):
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
    80
        """Return a pair (data, mode) where data is the file content
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
    81
        as a string and mode one of '', 'x' or 'l'. rev is the
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
    82
        identifier returned by a previous call to getchanges(). Raise
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
    83
        IOError to indicate that name was deleted in rev.
7055
0f4564b4cc2c convert: improve convert_source documentation
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
    84
        """
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    85
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    86
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    87
    def getchanges(self, version):
7186
f77c8d8331ca clean up trailing spaces, leading spaces in C
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7075
diff changeset
    88
        """Returns a tuple of (files, copies).
7055
0f4564b4cc2c convert: improve convert_source documentation
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
    89
0f4564b4cc2c convert: improve convert_source documentation
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
    90
        files is a sorted list of (filename, id) tuples for all files
8444
057e96fe2955 convert: improve docstrings, comments.
Greg Ward <greg-hg@gerg.ca>
parents: 8250
diff changeset
    91
        changed between version and its first parent returned by
7055
0f4564b4cc2c convert: improve convert_source documentation
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
    92
        getcommit(). id is the source revision id of the file.
4516
96d8a56d4ef9 Removed trailing whitespace and tabs from python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4515
diff changeset
    93
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5112
diff changeset
    94
        copies is a dictionary of dest: source
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5112
diff changeset
    95
        """
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    96
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    97
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    98
    def getcommit(self, version):
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
    99
        """Return the commit object for version"""
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   100
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   101
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   102
    def gettags(self):
8887
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   103
        """Return the tags as a dictionary of name: revision
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   104
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   105
        Tag names must be UTF-8 strings.
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   106
        """
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   107
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   108
4759
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   109
    def recode(self, s, encoding=None):
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   110
        if not encoding:
4810
c2d529f288a1 convert: move some code into common init function
Brendan Cully <brendan@kublai.com>
parents: 4807
diff changeset
   111
            encoding = self.encoding or 'utf-8'
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4873
diff changeset
   112
5287
c6f932d3e0f6 Don't decode unicode strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5173
diff changeset
   113
        if isinstance(s, unicode):
c6f932d3e0f6 Don't decode unicode strings.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5173
diff changeset
   114
            return s.encode("utf-8")
4759
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   115
        try:
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   116
            return s.decode(encoding).encode("utf-8")
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   117
        except:
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   118
            try:
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   119
                return s.decode("latin-1").encode("utf-8")
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   120
            except:
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   121
                return s.decode(encoding, "replace").encode("utf-8")
20ec5cc02f18 convert: ove recode method into converter_source
Brendan Cully <brendan@kublai.com>
parents: 4590
diff changeset
   122
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   123
    def getchangedfiles(self, rev, i):
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   124
        """Return the files changed by rev compared to parent[i].
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5556
diff changeset
   125
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   126
        i is an index selecting one of the parents of rev.  The return
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   127
        value should be the list of files that are different in rev and
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   128
        this parent.
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   129
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   130
        If rev has no parents, i is None.
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5556
diff changeset
   131
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   132
        This function is only needed to support --filemap
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   133
        """
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   134
        raise NotImplementedError()
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   135
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5529
diff changeset
   136
    def converted(self, rev, sinkrev):
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5529
diff changeset
   137
        '''Notify the source that a revision has been converted.'''
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5529
diff changeset
   138
        pass
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5529
diff changeset
   139
8691
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   140
    def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   141
        """Return true if this source has a meaningful, native revision
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   142
        order. For instance, Mercurial revisions are store sequentially
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   143
        while there is no such global ordering with Darcs.
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   144
        """
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   145
        return False
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   146
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   147
    def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   148
        """If rev is a meaningful revision reference in source, return
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   149
        the referenced identifier in the same format used by getcommit().
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   150
        return None otherwise.
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   151
        """
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   152
        return None
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5529
diff changeset
   153
13744
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   154
    def getbookmarks(self):
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   155
        """Return the bookmarks as a dictionary of name: revision
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   156
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   157
        Bookmark names are to be UTF-8 strings.
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   158
        """
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   159
        return {}
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   160
4448
af013ae3ca10 use documented convert-repo interface
Daniel Holth <dholth@fastmail.fm>
parents: 4447
diff changeset
   161
class converter_sink(object):
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   162
    """Conversion sink (target) interface"""
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   163
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
   164
    def __init__(self, ui, path):
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   165
        """Initialize conversion sink (or raise NoRepo("message")
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
   166
        exception if path is not a valid repository)
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
   167
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
   168
        created is a list of paths to remove if a fatal error occurs
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
   169
        later"""
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
   170
        self.ui = ui
5440
b4ae8535f834 convert: add default constructor for converter_sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5439
diff changeset
   171
        self.path = path
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
   172
        self.created = []
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   173
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   174
    def getheads(self):
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   175
        """Return a list of this repository's heads"""
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   176
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   177
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4957
diff changeset
   178
    def revmapfile(self):
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   179
        """Path to a file that will contain lines
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   180
        source_rev_id sink_rev_id
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   181
        mapping equivalent revision identifiers for each system."""
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   182
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   183
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   184
    def authorfile(self):
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   185
        """Path to a file that will contain lines
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   186
        srcauthor=dstauthor
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   187
        mapping equivalent authors identifiers for each system."""
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   188
        return None
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   189
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   190
    def putcommit(self, files, copies, parents, commit, source, revmap):
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   191
        """Create a revision with all changed files listed in 'files'
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   192
        and having listed parents. 'commit' is a commit object
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   193
        containing at a minimum the author, date, and message for this
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   194
        changeset.  'files' is a list of (path, version) tuples,
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   195
        'copies' is a dictionary mapping destinations to sources,
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   196
        'source' is the source repository, and 'revmap' is a mapfile
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
   197
        of source revisions to converted revisions. Only getfile() and
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10282
diff changeset
   198
        lookuprev() should be called on 'source'.
6716
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   199
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   200
        Note that the sink repository is not told to update itself to
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   201
        a particular revision (or even what that revision would be)
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   202
        before it receives the file data.
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   203
        """
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   204
        raise NotImplementedError()
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   205
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   206
    def puttags(self, tags):
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   207
        """Put tags into sink.
8887
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   208
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   209
        tags: {tagname: sink_rev_id, ...} where tagname is an UTF-8 string.
9431
d1b135f2f415 convert: fix history topology when using hg.tagsbranch
Patrick Mezard <pmezard@gmail.com>
parents: 8970
diff changeset
   210
        Return a pair (tag_revision, tag_parent_revision), or (None, None)
d1b135f2f415 convert: fix history topology when using hg.tagsbranch
Patrick Mezard <pmezard@gmail.com>
parents: 8970
diff changeset
   211
        if nothing was changed.
8887
0332f8b44e54 convert/svn: test svn tags encoding
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   212
        """
4447
1b75e0eff532 document conversion interface
Daniel Holth <dholth@fastmail.fm>
parents: 4114
diff changeset
   213
        raise NotImplementedError()
5127
39b6eaee6fd7 convert: replace fork with subprocess call.
Patrick Mezard <pmezard@gmail.com>
parents: 5121
diff changeset
   214
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5441
diff changeset
   215
    def setbranch(self, branch, pbranches):
6716
c9b8d2565b92 convert: reintegrate file retrieval code in sinks
Patrick Mezard <pmezard@gmail.com>
parents: 6332
diff changeset
   216
        """Set the current branch name. Called before the first putcommit
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   217
        on the branch.
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   218
        branch: branch name for subsequent commits
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5441
diff changeset
   219
        pbranches: (converted parent revision, parent branch) tuples"""
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   220
        pass
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   221
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   222
    def setfilemapmode(self, active):
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   223
        """Tell the destination that we're using a filemap
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   224
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   225
        Some converter_sources (svn in particular) can claim that a file
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   226
        was changed in a revision, even if there was no change.  This method
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   227
        tells the destination that we're using a filemap and that it should
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   228
        filter empty revisions.
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   229
        """
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   230
        pass
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   231
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   232
    def before(self):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   233
        pass
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   234
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   235
    def after(self):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   236
        pass
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   237
13744
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   238
    def putbookmarks(self, bookmarks):
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   239
        """Put bookmarks into sink.
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   240
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   241
        bookmarks: {bookmarkname: sink_rev_id, ...}
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   242
        where bookmarkname is an UTF-8 string.
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   243
        """
7e525d2f9a75 convert: add bookmark support to common sink/source implementation
Edouard Gomez <ed.gomez@free.fr>
parents: 11134
diff changeset
   244
        pass
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   245
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   246
class commandline(object):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   247
    def __init__(self, ui, command):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   248
        self.ui = ui
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   249
        self.command = command
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   250
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   251
    def prerun(self):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   252
        pass
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   253
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   254
    def postrun(self):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   255
        pass
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   256
13759
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   257
    def _cmdline(self, cmd, closestdin, *args, **kwargs):
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   258
        cmdline = [self.command, cmd] + list(args)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   259
        for k, v in kwargs.iteritems():
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   260
            if len(k) == 1:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   261
                cmdline.append('-' + k)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   262
            else:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   263
                cmdline.append('--' + k.replace('_', '-'))
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   264
            try:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   265
                if len(k) == 1:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   266
                    cmdline.append('' + v)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   267
                else:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   268
                    cmdline[-1] += '=' + v
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   269
            except TypeError:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   270
                pass
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   271
        cmdline = [util.shellquote(arg) for arg in cmdline]
7611
dafcc96c1285 convert: display child command output if --debug (fix 878466138b57)
Patrick Mezard <pmezard@gmail.com>
parents: 7610
diff changeset
   272
        if not self.ui.debugflag:
7610
878466138b57 convert: print darcs error messages iff --debug
Bryan O'Sullivan <bos@serpentine.com>
parents: 7186
diff changeset
   273
            cmdline += ['2>', util.nulldev]
13759
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   274
        if closestdin:
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   275
            cmdline += ['<', util.nulldev]
5529
5499dbb445de convert: fix util.popen regression in darcs converter
Patrick Mezard <pmezard@gmail.com>
parents: 5513
diff changeset
   276
        cmdline = ' '.join(cmdline)
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   277
        return cmdline
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   278
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   279
    def _run(self, cmd, *args, **kwargs):
13759
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   280
        return self._dorun(util.popen, cmd, True, *args, **kwargs)
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   281
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   282
    def _run2(self, cmd, *args, **kwargs):
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   283
        return self._dorun(util.popen2, cmd, False, *args, **kwargs)
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   284
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   285
    def _dorun(self, openfunc, cmd, closestdin, *args, **kwargs):
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   286
        cmdline = self._cmdline(cmd, closestdin, *args, **kwargs)
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9431
diff changeset
   287
        self.ui.debug('running: %s\n' % (cmdline,))
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   288
        self.prerun()
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   289
        try:
13759
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   290
            return openfunc(cmdline)
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   291
        finally:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   292
            self.postrun()
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   293
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   294
    def run(self, cmd, *args, **kwargs):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   295
        fp = self._run(cmd, *args, **kwargs)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   296
        output = fp.read()
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   297
        self.ui.debug(output)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   298
        return output, fp.close()
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   299
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   300
    def runlines(self, cmd, *args, **kwargs):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   301
        fp = self._run(cmd, *args, **kwargs)
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   302
        output = fp.readlines()
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6035
diff changeset
   303
        self.ui.debug(''.join(output))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   304
        return output, fp.close()
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   305
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   306
    def checkexit(self, status, output=''):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   307
        if status:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   308
            if output:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   309
                self.ui.warn(_('%s error:\n') % self.command)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   310
                self.ui.warn(output)
14234
600e64004eb5 rename explain_exit to explainexit
Adrian Buehlmann <adrian@cadifra.com>
parents: 13759
diff changeset
   311
            msg = util.explainexit(status)[0]
8970
eac360045ba4 convert: do not ask for translation of "%s %s"
Martin Geisler <mg@lazybytes.net>
parents: 8887
diff changeset
   312
            raise util.Abort('%s %s' % (self.command, msg))
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   313
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   314
    def run0(self, cmd, *args, **kwargs):
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   315
        output, status = self.run(cmd, *args, **kwargs)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   316
        self.checkexit(status, output)
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   317
        return output
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   318
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   319
    def runlines0(self, cmd, *args, **kwargs):
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   320
        output, status = self.runlines(cmd, *args, **kwargs)
6049
348132c112cf convert: improve gnu arch source performance and other fixes
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6035
diff changeset
   321
        self.checkexit(status, ''.join(output))
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   322
        return output
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 6001
diff changeset
   323
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   324
    def getargmax(self):
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   325
        if '_argmax' in self.__dict__:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   326
            return self._argmax
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   327
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   328
        # POSIX requires at least 4096 bytes for ARG_MAX
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   329
        self._argmax = 4096
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   330
        try:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   331
            self._argmax = os.sysconf("SC_ARG_MAX")
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   332
        except:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   333
            pass
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   334
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   335
        # Windows shells impose their own limits on command line length,
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   336
        # down to 2047 bytes for cmd.exe under Windows NT/2k and 2500 bytes
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   337
        # for older 4nt.exe. See http://support.microsoft.com/kb/830473 for
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   338
        # details about cmd.exe limitations.
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   339
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   340
        # Since ARG_MAX is for command line _and_ environment, lower our limit
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   341
        # (and make happy Windows shells while doing this).
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   342
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   343
        self._argmax = self._argmax / 2 - 1
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   344
        return self._argmax
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   345
13759
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   346
    def limit_arglist(self, arglist, cmd, closestdin, *args, **kwargs):
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   347
        cmdlen = len(self._cmdline(cmd, closestdin, *args, **kwargs))
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   348
        limit = self.getargmax() - cmdlen
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   349
        bytes = 0
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   350
        fl = []
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   351
        for fn in arglist:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   352
            b = len(fn) + 3
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   353
            if bytes + b < limit or len(fl) == 0:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   354
                fl.append(fn)
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   355
                bytes += b
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   356
            else:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   357
                yield fl
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   358
                fl = [fn]
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   359
                bytes = b
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   360
        if fl:
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   361
            yield fl
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   362
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   363
    def xargs(self, arglist, cmd, *args, **kwargs):
13759
49b818fd26d8 convert: add support to common commandline to access stdin of the process
Daniel Atallah <daniel.atallah@gmail.com>
parents: 13744
diff changeset
   364
        for l in self.limit_arglist(arglist, cmd, True, *args, **kwargs):
5832
2192ed187319 convert: add commandline.xargs(), use it in svn_sink class
Maxim Dounin <mdounin@mdounin.ru>
parents: 5760
diff changeset
   365
            self.run0(cmd, *(list(args) + l), **kwargs)
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   366
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   367
class mapfile(dict):
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   368
    def __init__(self, ui, path):
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   369
        super(mapfile, self).__init__()
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   370
        self.ui = ui
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   371
        self.path = path
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   372
        self.fp = None
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   373
        self.order = []
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   374
        self._read()
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   375
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   376
    def _read(self):
7774
3b8f2750efcf Handle when the slicemap option is an empty string
Stefan Rusek <stefan@rusek.org>
parents: 7611
diff changeset
   377
        if not self.path:
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   378
            return
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   379
        try:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   380
            fp = open(self.path, 'r')
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   381
        except IOError, err:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   382
            if err.errno != errno.ENOENT:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   383
                raise
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   384
            return
8047
04c62275cbc7 convert: better mapfile parsing errors (issue1581/1)
Patrick Mezard <pmezard@gmail.com>
parents: 7774
diff changeset
   385
        for i, line in enumerate(fp):
04c62275cbc7 convert: better mapfile parsing errors (issue1581/1)
Patrick Mezard <pmezard@gmail.com>
parents: 7774
diff changeset
   386
            try:
9528
314fc589b313 convert: make mapfile handle LF and CRLF shamap (issue1846)
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
   387
                key, value = line.splitlines()[0].rsplit(' ', 1)
8047
04c62275cbc7 convert: better mapfile parsing errors (issue1581/1)
Patrick Mezard <pmezard@gmail.com>
parents: 7774
diff changeset
   388
            except ValueError:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   389
                raise util.Abort(
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   390
                    _('syntax error in %s(%d): key/value pair expected')
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   391
                    % (self.path, i + 1))
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   392
            if key not in self:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   393
                self.order.append(key)
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   394
            super(mapfile, self).__setitem__(key, value)
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   395
        fp.close()
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5556
diff changeset
   396
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   397
    def __setitem__(self, key, value):
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   398
        if self.fp is None:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   399
            try:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   400
                self.fp = open(self.path, 'a')
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   401
            except IOError, err:
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   402
                raise util.Abort(_('could not open map file %r: %s') %
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   403
                                 (self.path, err.strerror))
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   404
        self.fp.write('%s %s\n' % (key, value))
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   405
        self.fp.flush()
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   406
        super(mapfile, self).__setitem__(key, value)
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   407
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5497
diff changeset
   408
    def close(self):
5512
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   409
        if self.fp:
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   410
            self.fp.close()
8cd26ccc68f8 convert: abstract darcs's commandline handling
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
   411
            self.fp = None