hgext/convert/convcmd.py
author Patrick Mezard <pmezard@gmail.com>
Sat, 16 Feb 2008 12:46:28 +0100
changeset 6130 516d8ffede7c
parent 6054 e2cbdd931341
parent 6100 49c69e1e4aa2
child 6131 fddeeb00f8d1
permissions -rw-r--r--
Merge with crew-stable
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5621
badbefa55972 convert: move commands definition to ease demandload job (issue 860)
Patrick Mezard <pmezard@gmail.com>
parents: 5521
diff changeset
     1
# convcmd - convert extension commands definition
3917
645e1dd4b8ae convert-repo: update usage information
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 3911
diff changeset
     2
#
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4591
diff changeset
     3
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
     4
#
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
     5
# This software may be used and distributed according to the terms
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
     7
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
     8
from common import NoRepo, SKIPREV, converter_source, converter_sink, mapfile
4536
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
     9
from cvs import convert_cvs
5359
6b6104430964 convert: support darcs as a source repo
Bryan O'Sullivan <bos@serpentine.com>
parents: 5356
diff changeset
    10
from darcs import darcs_source
4536
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
    11
from git import convert_git
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5012
diff changeset
    12
from hg import mercurial_source, mercurial_sink
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
    13
from subversion import debugsvnlog, svn_source, svn_sink
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 5996
diff changeset
    14
from gnuarch import gnuarch_source
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
    15
import filemap
4536
cc9b79216a76 Split convert extension into common and repository type modules
Brendan Cully <brendan@kublai.com>
parents: 4532
diff changeset
    16
5376
d60a067227a5 convert: move filemapper class to a separate file
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5375
diff changeset
    17
import os, shutil
5621
badbefa55972 convert: move commands definition to ease demandload job (issue 860)
Patrick Mezard <pmezard@gmail.com>
parents: 5521
diff changeset
    18
from mercurial import hg, util
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
    19
from mercurial.i18n import _
3821
158fce02dc40 Teach convert-repo to deal with mixed charsets in git
Matt Mackall <mpm@selenic.com>
parents: 2657
diff changeset
    20
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    21
source_converters = [
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    22
    ('cvs', convert_cvs),
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    23
    ('git', convert_git),
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    24
    ('svn', svn_source),
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    25
    ('hg', mercurial_source),
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    26
    ('darcs', darcs_source),
6035
df659eb23360 convert: added GNU Arch source converter
Aleix Conchillo Flaque <aleix@member.fsf.org>
parents: 5996
diff changeset
    27
    ('gnuarch', gnuarch_source),
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    28
    ]
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    29
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    30
sink_converters = [
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    31
    ('hg', mercurial_sink),
5513
f0c58fd4b798 convert: add support for Subversion as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5510
diff changeset
    32
    ('svn', svn_sink),
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    33
    ]
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    34
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    35
def convertsource(ui, path, type, rev):
5521
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
    36
    exceptions = []
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    37
    for name, source in source_converters:
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
    38
        try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    39
            if not type or name == type:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    40
                return source(ui, path, rev)
5415
1d53a75ea0fc convert: do not output when trying to load svn bindings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5414
diff changeset
    41
        except NoRepo, inst:
5521
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
    42
            exceptions.append(inst)
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
    43
    if not ui.quiet:
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
    44
        for inst in exceptions:
03496d4fa509 convert: display all errors if we couldn't open the source repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5488
diff changeset
    45
            ui.write(_("%s\n") % inst)
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
    46
    raise util.Abort('%s: unknown repository type' % path)
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
    47
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    48
def convertsink(ui, path, type):
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    49
    for name, sink in sink_converters:
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
    50
        try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    51
            if not type or name == type:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
    52
                return sink(ui, path)
5415
1d53a75ea0fc convert: do not output when trying to load svn bindings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5414
diff changeset
    53
        except NoRepo, inst:
1d53a75ea0fc convert: do not output when trying to load svn bindings
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5414
diff changeset
    54
            ui.note(_("convert: %s\n") % inst)
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4761
diff changeset
    55
    raise util.Abort('%s: unknown repository type' % path)
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
    56
5281
a176f9c8b26e convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5256
diff changeset
    57
class converter(object):
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
    58
    def __init__(self, ui, source, dest, revmapfile, opts):
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
    59
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    60
        self.source = source
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    61
        self.dest = dest
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
    62
        self.ui = ui
3957
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3956
diff changeset
    63
        self.opts = opts
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    64
        self.commitcache = {}
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
    65
        self.authors = {}
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
    66
        self.authorfile = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    67
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
    68
        self.map = mapfile(ui, revmapfile)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    69
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
    70
        # Read first the dst author map if any
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
    71
        authorfile = self.dest.authorfile()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
    72
        if authorfile and os.path.exists(authorfile):
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
    73
            self.readauthormap(authorfile)
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
    74
        # Extend/Override with new author map if necessary
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
    75
        if opts.get('authors'):
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
    76
            self.readauthormap(opts.get('authors'))
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
    77
            self.authorfile = self.dest.authorfile()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
    78
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
    79
        self.splicemap = mapfile(ui, ui.config('convert', 'splicemap'))
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
    80
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    81
    def walktree(self, heads):
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
    82
        '''Return a mapping that identifies the uncommitted parents of every
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
    83
        uncommitted changeset.'''
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    84
        visit = heads
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    85
        known = {}
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    86
        parents = {}
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    87
        while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    88
            n = visit.pop(0)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    89
            if n in known or n in self.map: continue
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    90
            known[n] = 1
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
    91
            commit = self.cachecommit(n)
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
    92
            parents[n] = []
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
    93
            for p in commit.parents:
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
    94
                parents[n].append(p)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    95
                visit.append(p)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    96
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    97
        return parents
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    98
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    99
    def toposort(self, parents):
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   100
        '''Return an ordering such that every uncommitted changeset is
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   101
        preceeded by all its uncommitted ancestors.'''
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   102
        visit = parents.keys()
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   103
        seen = {}
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   104
        children = {}
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   105
        actives = []
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
   106
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   107
        while visit:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   108
            n = visit.pop(0)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   109
            if n in seen: continue
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   110
            seen[n] = 1
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   111
            # Ensure that nodes without parents are present in the 'children'
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   112
            # mapping.
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   113
            children.setdefault(n, [])
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   114
            hasparent = False
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   115
            for p in parents[n]:
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   116
                if not p in self.map:
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   117
                    visit.append(p)
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   118
                    hasparent = True
4719
1069205a8894 fix 'convert' with single commit repositories
Hollis Blanchard <hollisb@us.ibm.com>
parents: 4635
diff changeset
   119
                children.setdefault(p, []).append(n)
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   120
            if not hasparent:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   121
                actives.append(n)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   122
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   123
        del seen
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   124
        del visit
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   125
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   126
        if self.opts.get('datesort'):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   127
            dates = {}
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   128
            def getdate(n):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   129
                if n not in dates:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   130
                    dates[n] = util.parsedate(self.commitcache[n].date)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   131
                return dates[n]
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   132
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   133
            def picknext(nodes):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   134
                return min([(getdate(n), n) for n in nodes])[1]
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   135
        else:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   136
            prev = [None]
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   137
            def picknext(nodes):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   138
                # Return the first eligible child of the previously converted
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   139
                # revision, or any of them.
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   140
                next = nodes[0]
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   141
                for n in nodes:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   142
                    if prev[0] in parents[n]:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   143
                        next = n
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   144
                        break
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   145
                prev[0] = next
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   146
                return next
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   147
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   148
        s = []
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   149
        pendings = {}
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   150
        while actives:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   151
            n = picknext(actives)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   152
            actives.remove(n)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   153
            s.append(n)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   154
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   155
            # Update dependents list
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   156
            for c in children.get(n, []):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   157
                if c not in pendings:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   158
                    pendings[c] = [p for p in parents[c] if p not in self.map]
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   159
                pendings[c].remove(n)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   160
                if not pendings[c]:
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   161
                    # Parents are converted, node is eligible
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   162
                    actives.insert(0, c)
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   163
                    pendings[c] = None
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   164
6100
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   165
        if len(s) != len(parents):
49c69e1e4aa2 convert: fix --datesort ordering
Patrick Mezard <pmezard@gmail.com>
parents: 6099
diff changeset
   166
            raise util.Abort(_("not all revisions were sorted"))
3957
2b87d3c5ab8e convert-repo: add option to attempt to sort by date
Matt Mackall <mpm@selenic.com>
parents: 3956
diff changeset
   167
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   168
        return s
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   169
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   170
    def writeauthormap(self):
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   171
        authorfile = self.authorfile
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   172
        if authorfile:
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   173
           self.ui.status('Writing author map file %s\n' % authorfile)
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   174
           ofile = open(authorfile, 'w+')
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   175
           for author in self.authors:
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   176
               ofile.write("%s=%s\n" % (author, self.authors[author]))
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   177
           ofile.close()
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   178
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   179
    def readauthormap(self, authorfile):
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   180
        afile = open(authorfile, 'r')
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   181
        for line in afile:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   182
            try:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   183
                srcauthor = line.split('=')[0].strip()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   184
                dstauthor = line.split('=')[1].strip()
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   185
                if srcauthor in self.authors and dstauthor != self.authors[srcauthor]:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   186
                    self.ui.status(
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   187
                        'Overriding mapping for author %s, was %s, will be %s\n'
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   188
                        % (srcauthor, self.authors[srcauthor], dstauthor))
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   189
                else:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   190
                    self.ui.debug('Mapping author %s to %s\n'
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   191
                                  % (srcauthor, dstauthor))
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   192
                    self.authors[srcauthor] = dstauthor
4590
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   193
            except IndexError:
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   194
                self.ui.warn(
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   195
                    'Ignoring bad line in author file map %s: %s\n'
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   196
                    % (authorfile, line))
80fb4ec512b5 convert: fix various authormap handling bugs
Brendan Cully <brendan@kublai.com>
parents: 4589
diff changeset
   197
        afile.close()
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   198
5203
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
   199
    def cachecommit(self, rev):
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
   200
        commit = self.source.getcommit(rev)
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
   201
        commit.author = self.authors.get(commit.author, commit.author)
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
   202
        self.commitcache[rev] = commit
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
   203
        return commit
653790c2fa52 convert: wrap cached commits author remapping
Patrick Mezard <pmezard@gmail.com>
parents: 5195
diff changeset
   204
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   205
    def copy(self, rev):
5016
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
   206
        commit = self.commitcache[rev]
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
   207
        do_copies = hasattr(self.dest, 'copyfile')
4ebc8693ce72 convert: add filename filtering and renaming support
Bryan O'Sullivan <bos@serpentine.com>
parents: 5014
diff changeset
   208
        filenames = []
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4924
diff changeset
   209
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   210
        changes = self.source.getchanges(rev)
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   211
        if isinstance(changes, basestring):
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   212
            if changes == SKIPREV:
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   213
                dest = SKIPREV
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   214
            else:
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   215
                dest = self.map[changes]
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
   216
            self.map[rev] = dest
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   217
            return
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   218
        files, copies = changes
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   219
        pbranches = []
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   220
        if commit.parents:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   221
            for prev in commit.parents:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   222
                if prev not in self.commitcache:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   223
                    self.cachecommit(prev)
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   224
                pbranches.append((self.map[prev], 
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   225
                                  self.commitcache[prev].branch))
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5621
diff changeset
   226
        self.dest.setbranch(commit.branch, pbranches)
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5018
diff changeset
   227
        for f, v in files:
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   228
            filenames.append(f)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   229
            try:
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   230
                data = self.source.getfile(f, v)
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   231
            except IOError, inst:
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   232
                self.dest.delfile(f)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   233
            else:
3956
558f52943cd2 convert-repo: add CVS exec bit support
Matt Mackall <mpm@selenic.com>
parents: 3954
diff changeset
   234
                e = self.source.getmode(f, v)
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   235
                self.dest.putfile(f, e, data)
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4763
diff changeset
   236
                if do_copies:
5121
ef338e34a906 convert: look up copies in getchanges instead of getcommit
Brendan Cully <brendan@kublai.com>
parents: 5018
diff changeset
   237
                    if f in copies:
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   238
                        copyf = copies[f]
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   239
                        # Merely marks that a copy happened.
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   240
                        self.dest.copyfile(copyf, f)
4765
b6a1f2c46c6c convert extension: Add SVN converter
Daniel Holth <dholth@fastmail.fm>
parents: 4763
diff changeset
   241
5996
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   242
        try:
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   243
            parents = [self.splicemap[rev]]
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   244
            self.ui.debug('spliced in %s as parents of %s\n' %
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   245
                          (parents, rev))
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   246
        except KeyError:
3f9ce63da18c convert: allow synthetic history to be spliced in.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5959
diff changeset
   247
            parents = [b[0] for b in pbranches]
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   248
        newnode = self.dest.putcommit(filenames, parents, commit)
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5528
diff changeset
   249
        self.source.converted(rev, newnode)
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
   250
        self.map[rev] = newnode
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   251
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   252
    def convert(self):
5954
851402e53337 convert: display source revision id with --verbose
Patrick Mezard <pmezard@gmail.com>
parents: 5794
diff changeset
   253
851402e53337 convert: display source revision id with --verbose
Patrick Mezard <pmezard@gmail.com>
parents: 5794
diff changeset
   254
        def recode(s):
6054
e2cbdd931341 convert: Don't decode unicode strings
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6035
diff changeset
   255
            if isinstance(s, unicode):
e2cbdd931341 convert: Don't decode unicode strings
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6035
diff changeset
   256
                return s.encode(orig_encoding, 'replace')
e2cbdd931341 convert: Don't decode unicode strings
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6035
diff changeset
   257
            else:
e2cbdd931341 convert: Don't decode unicode strings
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6035
diff changeset
   258
                return s.decode('utf-8').encode(orig_encoding, 'replace')
5954
851402e53337 convert: display source revision id with --verbose
Patrick Mezard <pmezard@gmail.com>
parents: 5794
diff changeset
   259
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   260
        try:
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
   261
            self.source.before()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
   262
            self.dest.before()
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
   263
            self.source.setrevmap(self.map)
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   264
            self.ui.status("scanning source...\n")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   265
            heads = self.source.getheads()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   266
            parents = self.walktree(heads)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   267
            self.ui.status("sorting...\n")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   268
            t = self.toposort(parents)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   269
            num = len(t)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   270
            c = None
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   271
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   272
            self.ui.status("converting...\n")
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   273
            for c in t:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   274
                num -= 1
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   275
                desc = self.commitcache[c].desc
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   276
                if "\n" in desc:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   277
                    desc = desc.splitlines()[0]
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
   278
                # convert log message to local encoding without using
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
   279
                # tolocal() because util._encoding conver() use it as
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
   280
                # 'utf-8'
5954
851402e53337 convert: display source revision id with --verbose
Patrick Mezard <pmezard@gmail.com>
parents: 5794
diff changeset
   281
                self.ui.status("%d %s\n" % (num, recode(desc)))
851402e53337 convert: display source revision id with --verbose
Patrick Mezard <pmezard@gmail.com>
parents: 5794
diff changeset
   282
                self.ui.note(_("source: %s\n" % recode(c)))
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   283
                self.copy(c)
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   284
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   285
            tags = self.source.gettags()
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   286
            ctags = {}
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   287
            for k in tags:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   288
                v = tags[k]
5374
e710874247d1 convert: allow the converter_source to say "skip this revision"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5373
diff changeset
   289
                if self.map.get(v, SKIPREV) != SKIPREV:
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   290
                    ctags[k] = self.map[v]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   291
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   292
            if c and ctags:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   293
                nrev = self.dest.puttags(ctags)
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   294
                # write another hash correspondence to override the previous
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   295
                # one so we don't end up with extra tag heads
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   296
                if nrev:
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
   297
                    self.map[c] = nrev
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   298
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4588
diff changeset
   299
            self.writeauthormap()
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   300
        finally:
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   301
            self.cleanup()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   302
4588
9855939d0c82 convert extension: Save a few opens on the map file
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   303
    def cleanup(self):
5356
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
   304
        try:
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
   305
            self.dest.after()
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
   306
        finally:
f0931c0240b4 convert: add before/after hooks for converter sources
Bryan O'Sullivan <bos@serpentine.com>
parents: 5281
diff changeset
   307
            self.source.after()
5510
11d7908a3ea8 convert: abstract map files into a class
Bryan O'Sullivan <bos@serpentine.com>
parents: 5488
diff changeset
   308
        self.map.close()
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   309
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
   310
orig_encoding = 'ascii'
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   311
5281
a176f9c8b26e convert: rename a class and a function
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5256
diff changeset
   312
def convert(ui, src, dest=None, revmapfile=None, **opts):
5794
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
   313
    global orig_encoding
4c16020d1172 convert: print commit log message with local encoding correctly.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents: 5656
diff changeset
   314
    orig_encoding = util._encoding
4895
fa6c9381d053 convert: manually set encoding to UTF-8
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4883
diff changeset
   315
    util._encoding = 'UTF-8'
fa6c9381d053 convert: manually set encoding to UTF-8
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 4883
diff changeset
   316
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   317
    if not dest:
4883
72ac66e88c43 convert: Use clone's behaviour for the default destionation name.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4719
diff changeset
   318
        dest = hg.defaultdest(src) + "-hg"
4513
ac2fe196ac9b Turns convert.py into a real extension
Edouard Gomez <ed.gomez@free.fr>
parents: 4512
diff changeset
   319
        ui.status("assuming destination %s\n" % dest)
4521
d634b61e9cec Add some more smart when initializing destination repository
Edouard Gomez <ed.gomez@free.fr>
parents: 4520
diff changeset
   320
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
   321
    destc = convertsink(ui, dest, opts.get('dest_type'))
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   322
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
   323
    try:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
   324
        srcc = convertsource(ui, src, opts.get('source_type'),
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
   325
                             opts.get('rev'))
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
   326
    except Exception:
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
   327
        for path in destc.created:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5438
diff changeset
   328
            shutil.rmtree(path, True)
4761
7c8cd400e86a convert: initialize source after destination, cleaning up if source is unusable
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
   329
        raise
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   330
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
   331
    fmap = opts.get('filemap')
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
   332
    if fmap:
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
   333
        srcc = filemap.filemap_source(ui, srcc, fmap)
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5377
diff changeset
   334
        destc.setfilemapmode(True)
5377
756a43a30e34 convert: readd --filemap
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5376
diff changeset
   335
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4958
diff changeset
   336
    if not revmapfile:
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   337
        try:
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4958
diff changeset
   338
            revmapfile = destc.revmapfile()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   339
        except:
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4958
diff changeset
   340
            revmapfile = os.path.join(destc, "map")
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   341
5375
dae323e453aa convert: disable current --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5374
diff changeset
   342
    c = converter(ui, srcc, destc, revmapfile, opts)
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   343
    c.convert()
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   344