hgext/convert/hg.py
author Gregory Szorc <gregory.szorc@gmail.com>
Sat, 05 Dec 2015 23:37:46 -0800
changeset 27263 4efb36ecaaec
parent 26974 4b5dc0d9e899
child 27345 98266b1d144d
permissions -rw-r--r--
commands: add debugdeltachain command We have debug commands for displaying overall revlog statistics (debugrevlog) and for dumping a revlog index (debugindex). As part of investigating various aspects of revlog behavior and performance, I found it important to have an understanding of how revlog delta chains behave in practice. This patch implements a "debugdeltachain" command. For each revision in a revlog, it dumps information about the delta chain. Which delta chain it is part of, length of the delta chain, distance since base revision, info about base revision, size of the delta chain, etc. The generic formatting facility is used, which means we can templatize output and get machine readable output like JSON. This command has already uncovered some weird history in mozilla-central I didn't know about. So I think it's valuable.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8250
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     1
# hg.py - hg backend for convert extension
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     2
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     3
#  Copyright 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: 8209
diff changeset
     4
#
1b60efdb8bc5 convert: add copyright and license headers to back-ends
Martin Geisler <mg@lazybytes.net>
parents: 8209
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: 10086
diff changeset
     6
# GNU General Public License version 2 or any later version.
3953
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3939
diff changeset
     7
5556
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
     8
# Notes for hg->hg conversion:
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
     9
#
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
    10
# * Old versions of Mercurial didn't trim the whitespace from the ends
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
    11
#   of commit messages, but new versions do.  Changesets created by
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
    12
#   those older versions, then converted, may thus have different
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
    13
#   hashes for changesets that are otherwise identical.
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
    14
#
8596
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
    15
# * Using "--config convert.hg.saverev=true" will make the source
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
    16
#   identifier to be stored in the converted revision. This will cause
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
    17
#   the converted revision to have a different identity than the
a58a95e523aa convert/hg: update documentation
Patrick Mezard <pmezard@gmail.com>
parents: 8495
diff changeset
    18
#   source.
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    19
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    20
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
    21
import os, time, cStringIO
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    22
from mercurial.i18n import _
6211
f89fd07fc51d Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents: 6210
diff changeset
    23
from mercurial.node import bin, hex, nullid
22698
32a8ad782260 convert-hg: use localrepo.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22360
diff changeset
    24
from mercurial import hg, util, context, bookmarks, error, scmutil, exchange
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
    25
from mercurial import phases
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
    26
from mercurial import lock as lockmod
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
    27
from mercurial import merge as mergemod
3953
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3939
diff changeset
    28
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
    29
from common import NoRepo, commit, converter_source, converter_sink, mapfile
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
    30
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
    31
import re
23972
c408bf3b32f8 convert: replace revision references in messages if they are >= short hashes
Mads Kiilerich <madski@unity3d.com>
parents: 23926
diff changeset
    32
sha1re = re.compile(r'\b[0-9a-f]{12,40}\b')
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
    33
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    34
class mercurial_sink(converter_sink):
4763
8e9d3faec270 convert: split converter into convertsource and convertsink
Brendan Cully <brendan@kublai.com>
parents: 4760
diff changeset
    35
    def __init__(self, ui, path):
5440
b4ae8535f834 convert: add default constructor for converter_sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5439
diff changeset
    36
        converter_sink.__init__(self, ui, path)
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    37
        self.branchnames = ui.configbool('convert', 'hg.usebranchnames', True)
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    38
        self.clonebranches = ui.configbool('convert', 'hg.clonebranches', False)
5260
be4835ad9a85 convert: new config variable hg.tagsbranch controls which branch tags are committed to
Brendan Cully <brendan@kublai.com>
parents: 5195
diff changeset
    39
        self.tagsbranch = ui.config('convert', 'hg.tagsbranch', 'default')
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    40
        self.lastbranch = None
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    41
        if os.path.isdir(path) and len(os.listdir(path)) > 0:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    42
            try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    43
                self.repo = hg.repository(self.ui, path)
5918
1716c8a0bd09 convert: mercurial sink must be local
Patrick Mezard <pmezard@gmail.com>
parents: 5522
diff changeset
    44
                if not self.repo.local():
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    45
                    raise NoRepo(_('%s is not a local Mercurial repository')
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    46
                                 % path)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
    47
            except error.RepoError as err:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
    48
                ui.traceback()
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    49
                raise NoRepo(err.args[0])
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    50
        else:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    51
            try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    52
                ui.status(_('initializing destination %s repository\n') % path)
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    53
                self.repo = hg.repository(self.ui, path, create=True)
5918
1716c8a0bd09 convert: mercurial sink must be local
Patrick Mezard <pmezard@gmail.com>
parents: 5522
diff changeset
    54
                if not self.repo.local():
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    55
                    raise NoRepo(_('%s is not a local Mercurial repository')
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    56
                                 % path)
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    57
                self.created.append(path)
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7874
diff changeset
    58
            except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
    59
                ui.traceback()
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
    60
                raise NoRepo(_("could not create hg repository %s as sink")
10938
02d6149a480b convert: write "repository" instead of "repo"
Martin Geisler <mg@lazybytes.net>
parents: 10282
diff changeset
    61
                             % path)
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    62
        self.lock = None
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    63
        self.wlock = None
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
    64
        self.filemapmode = False
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
    65
        self.subrevmaps = {}
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    66
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    67
    def before(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
    68
        self.ui.debug('run hg sink pre-conversion action\n')
5052
a11e8a181bd5 convert: fix locking order
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5038
diff changeset
    69
        self.wlock = self.repo.wlock()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    70
        self.lock = self.repo.lock()
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    71
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    72
    def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
    73
        self.ui.debug('run hg sink post-conversion action\n')
10086
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    74
        if self.lock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    75
            self.lock.release()
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    76
        if self.wlock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    77
            self.wlock.release()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
    78
5011
89fbb0a5e8e3 convert: rename mapfile to revmapfile, so we can map more than just revs
Bryan O'Sullivan <bos@serpentine.com>
parents: 4965
diff changeset
    79
    def revmapfile(self):
15069
650d81a313cb convert: use repo.join instead of referencing ".hg" directly
Martin Geisler <mg@aragost.com>
parents: 14556
diff changeset
    80
        return self.repo.join("shamap")
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
    81
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
    82
    def authorfile(self):
15069
650d81a313cb convert: use repo.join instead of referencing ".hg" directly
Martin Geisler <mg@aragost.com>
parents: 14556
diff changeset
    83
        return self.repo.join("authormap")
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
    84
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
    85
    def setbranch(self, branch, pbranches):
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
    86
        if not self.clonebranches:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    87
            return
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    88
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
    89
        setbranch = (branch != self.lastbranch)
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    90
        self.lastbranch = branch
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    91
        if not branch:
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    92
            branch = 'default'
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
    93
        pbranches = [(b[0], b[1] and b[1] or 'default') for b in pbranches]
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
    94
        if pbranches:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
    95
            pbranch = pbranches[0][1]
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
    96
        else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23972
diff changeset
    97
            pbranch = 'default'
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    98
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    99
        branchpath = os.path.join(self.path, branch)
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   100
        if setbranch:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   101
            self.after()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   102
            try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   103
                self.repo = hg.repository(self.ui, branchpath)
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
   104
            except Exception:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   105
                self.repo = hg.repository(self.ui, branchpath, create=True)
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   106
            self.before()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   107
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   108
        # pbranches may bring revisions from other branches (merge parents)
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   109
        # Make sure we have them, or pull them.
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   110
        missings = {}
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   111
        for b in pbranches:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   112
            try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   113
                self.repo.lookup(b[0])
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
   114
            except Exception:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   115
                missings.setdefault(b[1], []).append(b[0])
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5959
diff changeset
   116
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   117
        if missings:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   118
            self.after()
18373
687ed69f6fdf convert: process missing branches in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents: 17922
diff changeset
   119
            for pbranch, heads in sorted(missings.iteritems()):
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   120
                pbranchpath = os.path.join(self.path, pbranch)
14556
517e1d88bf7e hg: change various repository() users to use peer() where appropriate
Matt Mackall <mpm@selenic.com>
parents: 14151
diff changeset
   121
                prepo = hg.peer(self.ui, {}, pbranchpath)
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   122
                self.ui.note(_('pulling from %s into %s\n') % (pbranch, branch))
22698
32a8ad782260 convert-hg: use localrepo.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22360
diff changeset
   123
                exchange.pull(self.repo, prepo,
32a8ad782260 convert-hg: use localrepo.pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22360
diff changeset
   124
                              [prepo.lookup(h) for h in heads])
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   125
            self.before()
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   126
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
   127
    def _rewritetags(self, source, revmap, data):
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   128
        fp = cStringIO.StringIO()
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   129
        for line in data.splitlines():
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   130
            s = line.split(' ', 1)
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   131
            if len(s) != 2:
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   132
                continue
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   133
            revid = revmap.get(source.lookuprev(s[0]))
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   134
            if not revid:
25305
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   135
                if s[0] == hex(nullid):
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   136
                    revid = s[0]
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   137
                else:
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   138
                    continue
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
   139
            fp.write('%s %s\n' % (revid, s[1]))
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   140
        return fp.getvalue()
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   141
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   142
    def _rewritesubstate(self, source, data):
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   143
        fp = cStringIO.StringIO()
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   144
        for line in data.splitlines():
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   145
            s = line.split(' ', 1)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   146
            if len(s) != 2:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   147
                continue
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   148
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   149
            revid = s[0]
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   150
            subpath = s[1]
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   151
            if revid != hex(nullid):
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   152
                revmap = self.subrevmaps.get(subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   153
                if revmap is None:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   154
                    revmap = mapfile(self.ui,
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   155
                                     self.repo.wjoin(subpath, '.hg/shamap'))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   156
                    self.subrevmaps[subpath] = revmap
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   157
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   158
                    # It is reasonable that one or more of the subrepos don't
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   159
                    # need to be converted, in which case they can be cloned
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   160
                    # into place instead of converted.  Therefore, only warn
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   161
                    # once.
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   162
                    msg = _('no ".hgsubstate" updates will be made for "%s"\n')
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   163
                    if len(revmap) == 0:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   164
                        sub = self.repo.wvfs.reljoin(subpath, '.hg')
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   165
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   166
                        if self.repo.wvfs.exists(sub):
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   167
                            self.ui.warn(msg % subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   168
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   169
                newid = revmap.get(revid)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   170
                if not newid:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   171
                    if len(revmap) > 0:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   172
                        self.ui.warn(_("%s is missing from %s/.hg/shamap\n") %
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   173
                                     (revid, subpath))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   174
                else:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   175
                    revid = newid
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   176
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   177
            fp.write('%s %s\n' % (revid, subpath))
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   178
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   179
        return fp.getvalue()
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   180
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   181
    def _calculatemergedfiles(self, source, p1ctx, p2ctx):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   182
        """Calculates the files from p2 that we need to pull in when merging p1
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   183
        and p2, given that the merge is coming from the given source.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   184
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   185
        This prevents us from losing files that only exist in the target p2 and
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   186
        that don't come from the source repo (like if you're merging multiple
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   187
        repositories together).
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   188
        """
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   189
        anc = [p1ctx.ancestor(p2ctx)]
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   190
        # Calculate what files are coming from p2
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   191
        actions, diverge, rename = mergemod.calculateupdates(
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   192
            self.repo, p1ctx, p2ctx, anc,
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   193
            True,  # branchmerge
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   194
            True,  # force
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   195
            False, # partial
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   196
            False, # acceptremote
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   197
            False, # followcopies
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   198
        )
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   199
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   200
        for file, (action, info, msg) in actions.iteritems():
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   201
            if source.targetfilebelongstosource(file):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   202
                # If the file belongs to the source repo, ignore the p2
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   203
                # since it will be covered by the existing fileset.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   204
                continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   205
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   206
            # If the file requires actual merging, abort. We don't have enough
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   207
            # context to resolve merges correctly.
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   208
            if action in ['m', 'dm', 'cd', 'dc']:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
   209
                raise error.Abort(_("unable to convert merge commit "
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   210
                    "since target parents do not merge cleanly (file "
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   211
                    "%s, parents %s and %s)") % (file, p1ctx,
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   212
                                                 p2ctx))
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   213
            elif action == 'k':
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   214
                # 'keep' means nothing changed from p1
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   215
                continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   216
            else:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   217
                # Any other change means we want to take the p2 version
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   218
                yield file
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   219
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   220
    def putcommit(self, files, copies, parents, commit, source, revmap, full,
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   221
                  cleanp2):
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   222
        files = dict(files)
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   223
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   224
        def getfilectx(repo, memctx, f):
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   225
            if p2ctx and f in p2files and f not in copies:
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   226
                self.ui.debug('reusing %s from p2\n' % f)
26078
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   227
                try:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   228
                    return p2ctx[f]
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   229
                except error.ManifestLookupError:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   230
                    # If the file doesn't exist in p2, then we're syncing a
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   231
                    # delete, so just return None.
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   232
                    return None
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   233
            try:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   234
                v = files[f]
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   235
            except KeyError:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   236
                return None
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
   237
            data, mode = source.getfile(f, v)
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
   238
            if data is None:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
   239
                return None
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   240
            if f == '.hgtags':
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
   241
                data = self._rewritetags(source, revmap, data)
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   242
            if f == '.hgsubstate':
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   243
                data = self._rewritesubstate(source, data)
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
   244
            return context.memfilectx(self.repo, f, data, 'l' in mode,
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
   245
                                      'x' in mode, copies.get(f))
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   246
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   247
        pl = []
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   248
        for p in parents:
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   249
            if p not in pl:
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   250
                pl.append(p)
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   251
        parents = pl
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   252
        nparents = len(parents)
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   253
        if self.filemapmode and nparents == 1:
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   254
            m1node = self.repo.changelog.read(bin(parents[0]))[0]
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   255
            parent = parents[0]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   256
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   257
        if len(parents) < 2:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   258
            parents.append(nullid)
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   259
        if len(parents) < 2:
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   260
            parents.append(nullid)
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   261
        p2 = parents.pop(0)
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
   262
3954
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3953
diff changeset
   263
        text = commit.desc
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   264
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   265
        sha1s = re.findall(sha1re, text)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   266
        for sha1 in sha1s:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   267
            oldrev = source.lookuprev(sha1)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   268
            newrev = revmap.get(oldrev)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   269
            if newrev is not None:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   270
                text = text.replace(sha1, newrev[:len(sha1)])
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   271
5439
d0c67b52ac01 convert: make contents of "extra" dict available from sources, for sinks.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5437
diff changeset
   272
        extra = commit.extra.copy()
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   273
25750
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
   274
        sourcename = self.repo.ui.config('convert', 'hg.sourcename')
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
   275
        if sourcename:
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
   276
            extra['convert_source'] = sourcename
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
   277
25589
273d94255e1e convert: update 'intermediate-source' in the destination's extras dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 25571
diff changeset
   278
        for label in ('source', 'transplant_source', 'rebase_source',
273d94255e1e convert: update 'intermediate-source' in the destination's extras dictionary
Matt Harbison <matt_harbison@yahoo.com>
parents: 25571
diff changeset
   279
                      'intermediate-source'):
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   280
            node = extra.get(label)
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   281
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   282
            if node is None:
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   283
                continue
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   284
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   285
            # Only transplant stores its reference in binary
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   286
            if label == 'transplant_source':
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   287
                node = hex(node)
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   288
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   289
            newrev = revmap.get(node)
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   290
            if newrev is not None:
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   291
                if label == 'transplant_source':
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   292
                    newrev = bin(newrev)
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   293
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   294
                extra[label] = newrev
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   295
5038
8f157190075e convert: add config option to turn off use of branch names
Bryan O'Sullivan <bos@serpentine.com>
parents: 5017
diff changeset
   296
        if self.branchnames and commit.branch:
4873
28b23b9073a8 convert: record the source revision in the changelog
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
   297
            extra['branch'] = commit.branch
25570
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
   298
        if commit.rev and commit.saverev:
4873
28b23b9073a8 convert: record the source revision in the changelog
Brendan Cully <brendan@kublai.com>
parents: 4765
diff changeset
   299
            extra['convert_revision'] = commit.rev
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4873
diff changeset
   300
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   301
        while parents:
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   302
            p1 = p2
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   303
            p2 = parents.pop(0)
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   304
            p1ctx = self.repo[p1]
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   305
            p2ctx = None
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   306
            if p2 != nullid:
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   307
                p2ctx = self.repo[p2]
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   308
            fileset = set(files)
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   309
            if full:
22360
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
   310
                fileset.update(self.repo[p1])
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
   311
                fileset.update(self.repo[p2])
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   312
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   313
            if p2ctx:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   314
                p2files = set(cleanp2)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   315
                for file in self._calculatemergedfiles(source, p1ctx, p2ctx):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   316
                    p2files.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   317
                    fileset.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   318
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   319
            ctx = context.memctx(self.repo, (p1, p2), text, fileset,
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   320
                                 getfilectx, commit.author, commit.date, extra)
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   321
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   322
            # We won't know if the conversion changes the node until after the
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   323
            # commit, so copy the source's phase for now.
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   324
            self.repo.ui.setconfig('phases', 'new-commit',
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   325
                                   phases.phasenames[commit.phase], 'convert')
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   326
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   327
            tr = self.repo.transaction("convert")
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   328
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   329
            try:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   330
                node = hex(self.repo.commitctx(ctx))
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   331
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   332
                # If the node value has changed, but the phase is lower than
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   333
                # draft, set it back to draft since it hasn't been exposed
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   334
                # anywhere.
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   335
                if commit.rev != node:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   336
                    ctx = self.repo[node]
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   337
                    if ctx.phase() < phases.draft:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   338
                        phases.retractboundary(self.repo, tr, phases.draft,
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   339
                                               [ctx.node()])
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   340
                tr.close()
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   341
            finally:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   342
                tr.release()
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   343
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   344
            text = "(octopus merge fixup)\n"
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
   345
            p2 = node
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   346
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   347
        if self.filemapmode and nparents == 1:
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   348
            man = self.repo.manifest
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   349
            mnode = self.repo.changelog.read(bin(p2))[0]
11673
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
   350
            closed = 'close' in commit.extra
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
   351
            if not closed and not man.cmp(m1node, man.revision(mnode)):
8611
ba42e3c6e602 convert: better feedback when filtering out empty revisions
Patrick Mezard <pmezard@gmail.com>
parents: 8596
diff changeset
   352
                self.ui.status(_("filtering out empty revision\n"))
15193
a84e3ed661cb convert: fix crazy rollback call, broken by recent rollback safety checks
Matt Mackall <mpm@selenic.com>
parents: 15069
diff changeset
   353
                self.repo.rollback(force=True)
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   354
                return parent
1389
9b3ef6f3cef5 convert-repo: fix up octopus merge conversion
Matt Mackall <mpm@selenic.com>
parents: 1388
diff changeset
   355
        return p2
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   356
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   357
    def puttags(self, tags):
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   358
        try:
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   359
            parentctx = self.repo[self.tagsbranch]
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   360
            tagparent = parentctx.node()
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   361
        except error.RepoError:
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   362
            parentctx = None
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   363
            tagparent = nullid
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   364
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   365
        oldlines = set()
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   366
        for branch, heads in self.repo.branchmap().iteritems():
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   367
            for h in heads:
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   368
                if '.hgtags' in self.repo[h]:
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   369
                    oldlines.update(
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   370
                        set(self.repo[h]['.hgtags'].data().splitlines(True)))
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   371
        oldlines = sorted(list(oldlines))
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   372
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 8206
diff changeset
   373
        newlines = sorted([("%s %s\n" % (tags[tag], tag)) for tag in tags])
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   374
        if newlines == oldlines:
9431
d1b135f2f415 convert: fix history topology when using hg.tagsbranch
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   375
            return None, None
20377
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   376
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   377
        # if the old and new tags match, then there is nothing to update
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   378
        oldtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   379
        newtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   380
        for line in oldlines:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   381
            s = line.strip().split(' ', 1)
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   382
            if len(s) != 2:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   383
                continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   384
            oldtags.add(s[1])
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   385
        for line in newlines:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   386
            s = line.strip().split(' ', 1)
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   387
            if len(s) != 2:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   388
                continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   389
            if s[1] not in oldtags:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   390
                newtags.add(s[1].strip())
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   391
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   392
        if not newtags:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   393
            return None, None
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   394
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   395
        data = "".join(newlines)
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   396
        def getfilectx(repo, memctx, f):
21689
503bb3af70fe memfilectx: call super.__init__ instead of duplicating code
Sean Farley <sean.michael.farley@gmail.com>
parents: 21635
diff changeset
   397
            return context.memfilectx(repo, f, data, False, False, None)
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   398
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   399
        self.ui.status(_("updating tags\n"))
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   400
        date = "%s 0" % int(time.mktime(time.gmtime()))
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   401
        extra = {'branch': self.tagsbranch}
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   402
        ctx = context.memctx(self.repo, (tagparent, None), "update tags",
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   403
                             [".hgtags"], getfilectx, "convert-repo", date,
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   404
                             extra)
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
   405
        node = self.repo.commitctx(ctx)
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
   406
        return hex(node), hex(tagparent)
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   407
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   408
    def setfilemapmode(self, active):
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   409
        self.filemapmode = active
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   410
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   411
    def putbookmarks(self, updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   412
        if not len(updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   413
            return
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   414
        wlock = lock = tr = None
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   415
        try:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   416
            wlock = self.repo.wlock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   417
            lock = self.repo.lock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   418
            tr = self.repo.transaction('bookmark')
26973
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
   419
            self.ui.status(_("updating bookmarks\n"))
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
   420
            destmarks = self.repo._bookmarks
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
   421
            for bookmark in updatedbookmark:
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
   422
                destmarks[bookmark] = bin(updatedbookmark[bookmark])
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   423
            destmarks.recordchange(tr)
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   424
            tr.close()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   425
        finally:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   426
            lockmod.release(lock, wlock, tr)
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   427
21635
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   428
    def hascommitfrommap(self, rev):
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   429
        # the exact semantics of clonebranches is unclear so we can't say no
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   430
        return rev in self.repo or self.clonebranches
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   431
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21498
diff changeset
   432
    def hascommitforsplicemap(self, rev):
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   433
        if rev not in self.repo and self.clonebranches:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
   434
            raise error.Abort(_('revision %s not found in destination '
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
   435
                               'repository (lookups with clonebranches=true '
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
   436
                               'are not implemented)') % rev)
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
   437
        return rev in self.repo
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   438
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   439
class mercurial_source(converter_source):
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
   440
    def __init__(self, ui, path, revs=None):
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
   441
        converter_source.__init__(self, ui, path, revs)
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   442
        self.ignoreerrors = ui.configbool('convert', 'hg.ignoreerrors', False)
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
   443
        self.ignored = set()
7815
bcd364b247ba convert: change hg.saverev default to False
Matt Mackall <mpm@selenic.com>
parents: 7637
diff changeset
   444
        self.saverev = ui.configbool('convert', 'hg.saverev', False)
5358
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
   445
        try:
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
   446
            self.repo = hg.repository(self.ui, path)
5437
4d34f8b12a9e convert: report errors more meaningfully if run with --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 5402
diff changeset
   447
            # try to provoke an exception if this isn't really a hg
4d34f8b12a9e convert: report errors more meaningfully if run with --traceback
Bryan O'Sullivan <bos@serpentine.com>
parents: 5402
diff changeset
   448
            # repo, but some other bogus compatible-looking url
5522
f5345a2d2391 convert: make sure mercurial_source has a local hg repo
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5521
diff changeset
   449
            if not self.repo.local():
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
   450
                raise error.RepoError
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
   451
        except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
   452
            ui.traceback()
10939
9f6731b03906 convert: mark strings for translation
Martin Geisler <mg@lazybytes.net>
parents: 10938
diff changeset
   453
            raise NoRepo(_("%s is not a local Mercurial repository") % path)
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   454
        self.lastrev = None
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   455
        self.lastctx = None
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   456
        self._changescache = None, None
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   457
        self.convertfp = None
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   458
        # Restrict converted revisions to startrev descendants
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   459
        startnode = ui.config('convert', 'hg.startrev')
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   460
        hgrevs = ui.config('convert', 'hg.revs')
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   461
        if hgrevs is None:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   462
            if startnode is not None:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   463
                try:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   464
                    startnode = self.repo.lookup(startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   465
                except error.RepoError:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
   466
                    raise error.Abort(_('%s is not a valid start revision')
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   467
                                     % startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   468
                startrev = self.repo.changelog.rev(startnode)
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   469
                children = {startnode: 1}
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   470
                for r in self.repo.changelog.descendants([startrev]):
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   471
                    children[self.repo.changelog.node(r)] = 1
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   472
                self.keep = children.__contains__
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   473
            else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   474
                self.keep = util.always
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
   475
            if revs:
26154
242853e14804 convert: remove restriction on multiple --rev in hg source
Durham Goode <durham@fb.com>
parents: 26078
diff changeset
   476
                self._heads = [self.repo[r].node() for r in revs]
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   477
            else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   478
                self._heads = self.repo.heads()
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   479
        else:
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
   480
            if revs or startnode is not None:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26154
diff changeset
   481
                raise error.Abort(_('hg.revs cannot be combined with '
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   482
                                   'hg.startrev or --rev'))
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   483
            nodes = set()
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   484
            parents = set()
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   485
            for r in scmutil.revrange(self.repo, [hgrevs]):
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   486
                ctx = self.repo[r]
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   487
                nodes.add(ctx.node())
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   488
                parents.update(p.node() for p in ctx.parents())
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   489
            self.keep = nodes.__contains__
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   490
            self._heads = nodes - parents
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   491
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   492
    def changectx(self, rev):
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   493
        if self.lastrev != rev:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6717
diff changeset
   494
            self.lastctx = self.repo[rev]
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   495
            self.lastrev = rev
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   496
        return self.lastctx
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   497
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   498
    def parents(self, ctx):
9531
a2f36a082449 convert/hg: make parents() return changectx, not nodes
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
   499
        return [p for p in ctx.parents() if p and self.keep(p.node())]
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   500
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   501
    def getheads(self):
19890
9057855d8749 convert: refactor head calculation for hg sources
Mads Kiilerich <madski@unity3d.com>
parents: 19457
diff changeset
   502
        return [hex(h) for h in self._heads if self.keep(h)]
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   503
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   504
    def getfile(self, name, rev):
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   505
        try:
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
   506
            fctx = self.changectx(rev)[name]
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
   507
            return fctx.data(), fctx.flags()
22296
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
   508
        except error.LookupError:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
   509
            return None, None
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   510
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   511
    def getchanges(self, rev, full):
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   512
        ctx = self.changectx(rev)
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   513
        parents = self.parents(ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   514
        if full or not parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   515
            files = copyfiles = ctx.manifest()
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   516
        if parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   517
            if self._changescache[0] == rev:
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   518
                m, a, r = self._changescache[1]
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   519
            else:
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   520
                m, a, r = self.repo.status(parents[0].node(), ctx.node())[:3]
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   521
            if not full:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   522
                files = m + a + r
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   523
            copyfiles = m + a
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   524
        # getcopies() is also run for roots and before filtering so missing
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   525
        # revlogs are detected early
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   526
        copies = self.getcopies(ctx, parents, copyfiles)
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   527
        cleanp2 = set()
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   528
        if len(parents) == 2:
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   529
            cleanp2.update(self.repo.status(parents[1].node(), ctx.node(),
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   530
                                            clean=True).clean)
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   531
        changes = [(f, rev) for f in files if f not in self.ignored]
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   532
        changes.sort()
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   533
        return changes, copies, cleanp2
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   534
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   535
    def getcopies(self, ctx, parents, files):
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   536
        copies = {}
5280
11e1e574da02 convert: mercurial_source: also search for copies in modified files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5279
diff changeset
   537
        for name in files:
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   538
            if name in self.ignored:
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   539
                continue
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   540
            try:
19457
948df0f10ec1 convert: fix bad conversion of copies when hg.startrev is specified
Mads Kiilerich <madski@unity3d.com>
parents: 19120
diff changeset
   541
                copysource, _copynode = ctx.filectx(name).renamed()
948df0f10ec1 convert: fix bad conversion of copies when hg.startrev is specified
Mads Kiilerich <madski@unity3d.com>
parents: 19120
diff changeset
   542
                if copysource in self.ignored:
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   543
                    continue
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   544
                # Ignore copy sources not in parent revisions
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   545
                found = False
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   546
                for p in parents:
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   547
                    if copysource in p:
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   548
                        found = True
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   549
                        break
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   550
                if not found:
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   551
                    continue
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   552
                copies[name] = copysource
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   553
            except TypeError:
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   554
                pass
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
   555
            except error.LookupError as e:
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   556
                if not self.ignoreerrors:
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   557
                    raise
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
   558
                self.ignored.add(name)
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   559
                self.ui.warn(_('ignoring: %s\n') % e)
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   560
        return copies
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5131
diff changeset
   561
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   562
    def getcommit(self, rev):
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   563
        ctx = self.changectx(rev)
9531
a2f36a082449 convert/hg: make parents() return changectx, not nodes
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
   564
        parents = [p.hex() for p in self.parents(ctx)]
25570
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
   565
        crev = rev
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
   566
16514
363e808de349 i18n: use locale insensitive format for datetimes as intermediate representation (issue3398)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16162
diff changeset
   567
        return commit(author=ctx.user(),
363e808de349 i18n: use locale insensitive format for datetimes as intermediate representation (issue3398)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16162
diff changeset
   568
                      date=util.datestr(ctx.date(), '%Y-%m-%d %H:%M:%S %1%2'),
5556
61fdf2558c0a convert: some tidyups, doc improvements, and test fixes
Bryan O'Sullivan <bos@serpentine.com>
parents: 5554
diff changeset
   569
                      desc=ctx.description(), rev=crev, parents=parents,
8690
c5b4f662109f convert: add --sourcesort option for source specific sort
Patrick Mezard <pmezard@gmail.com>
parents: 8611
diff changeset
   570
                      branch=ctx.branch(), extra=ctx.extra(),
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   571
                      sortkey=ctx.rev(), saverev=self.saverev,
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   572
                      phase=ctx.phase())
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   573
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   574
    def gettags(self):
21498
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
   575
        # This will get written to .hgtags, filter non global tags out.
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
   576
        tags = [t for t in self.repo.tagslist()
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
   577
                if self.repo.tagtype(t[0]) == 'global']
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   578
        return dict([(name, hex(node)) for name, node in tags
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   579
                     if self.keep(node)])
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   580
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   581
    def getchangedfiles(self, rev, i):
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   582
        ctx = self.changectx(rev)
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   583
        parents = self.parents(ctx)
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   584
        if not parents and i is None:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   585
            i = 0
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   586
            changes = [], ctx.manifest().keys(), []
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   587
        else:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   588
            i = i or 0
9531
a2f36a082449 convert/hg: make parents() return changectx, not nodes
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
   589
            changes = self.repo.status(parents[i].node(), ctx.node())[:3]
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   590
        changes = [[f for f in l if f not in self.ignored] for l in changes]
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   591
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   592
        if i == 0:
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   593
            self._changescache = (rev, changes)
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   594
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   595
        return changes[0] + changes[1] + changes[2]
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   596
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   597
    def converted(self, rev, destrev):
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   598
        if self.convertfp is None:
15069
650d81a313cb convert: use repo.join instead of referencing ".hg" directly
Martin Geisler <mg@aragost.com>
parents: 14556
diff changeset
   599
            self.convertfp = open(self.repo.join('shamap'), 'a')
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   600
        self.convertfp.write('%s %s\n' % (destrev, rev))
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   601
        self.convertfp.flush()
5805
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   602
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   603
    def before(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
   604
        self.ui.debug('run hg source pre-conversion action\n')
5805
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   605
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   606
    def after(self):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9432
diff changeset
   607
        self.ui.debug('run hg source post-conversion action\n')
8691
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   608
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   609
    def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   610
        return True
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   611
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
   612
    def hasnativeclose(self):
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
   613
        return True
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
   614
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   615
    def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   616
        try:
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   617
            return hex(self.repo.lookup(rev))
23926
fea3416f2440 convert: handle LookupError in mercurial_source.lookuprev()
Matt Harbison <matt_harbison@yahoo.com>
parents: 22698
diff changeset
   618
        except (error.RepoError, error.LookupError):
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   619
            return None
13757
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
   620
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
   621
    def getbookmarks(self):
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
   622
        return bookmarks.listbookmarks(self.repo)
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
   623
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20372
diff changeset
   624
    def checkrevformat(self, revstr, mapname='splicemap'):
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
   625
        """ Mercurial, revision string is a 40 byte hex """
20373
e8203629371b convert: add mapname parameter to checkrevformat
Sean Farley <sean.michael.farley@gmail.com>
parents: 20372
diff changeset
   626
        self.checkhexformat(revstr, mapname)