hgext/convert/hg.py
author Martin von Zweigbergk <martinvonz@google.com>
Mon, 20 Apr 2020 14:37:10 -0700
changeset 44733 c6d31e659a28
parent 44452 9d2b2df2c2ba
child 45274 0e18861f96ab
permissions -rw-r--r--
commit: tell user what to do with .hg/last-message.txt I have always assumed that the message will be reused by the next `hg commit`, but it seems it's just silently dropped on the next commit. Let's try to be more helpful by telling the user that they have to manually tell hg to reuse it. The file will still be lost if the user runs some other operation in between (like a non-in-memory rebase). That will be fixed once we've switched all operations to be in-memory :) I didn't include `$(hg root)/` in the path in the message to the user because that would have made the message too long. Hopefully the user will figure that part out themselves. Differential Revision: https://phab.mercurial-scm.org/D8463
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.
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    19
from __future__ import absolute_import
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    20
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    21
import os
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    22
import re
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    23
import time
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
    24
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 28900
diff changeset
    25
from mercurial.i18n import _
43085
eef9a2d67051 py3: manually import pycompat.open into files that need it
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    26
from mercurial.pycompat import open
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    27
from mercurial import (
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    28
    bookmarks,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    29
    context,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    30
    error,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    31
    exchange,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    32
    hg,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    33
    lock as lockmod,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    34
    merge as mergemod,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    35
    node as nodemod,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    36
    phases,
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
    37
    pycompat,
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    38
    scmutil,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    39
    util,
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    40
)
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36340
diff changeset
    41
from mercurial.utils import dateutil
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    42
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
    43
stringio = util.stringio
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
    44
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    45
from . import common
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    46
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    47
mapfile = common.mapfile
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    48
NoRepo = common.NoRepo
3953
fad134931327 convert-repo: add basic CVS import support
Matt Mackall <mpm@selenic.com>
parents: 3939
diff changeset
    49
36134
2a28bdb63f05 convert: make hg sha1 regex consistently be a bytes
Augie Fackler <augie@google.com>
parents: 36132
diff changeset
    50
sha1re = re.compile(br'\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
    51
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    52
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
    53
class mercurial_sink(common.converter_sink):
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
    54
    def __init__(self, ui, repotype, path):
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
    55
        common.converter_sink.__init__(self, ui, repotype, path)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    56
        self.branchnames = ui.configbool(b'convert', b'hg.usebranchnames')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    57
        self.clonebranches = ui.configbool(b'convert', b'hg.clonebranches')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    58
        self.tagsbranch = ui.config(b'convert', b'hg.tagsbranch')
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
    59
        self.lastbranch = None
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    60
        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
    61
            try:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    62
                self.repo = hg.repository(self.ui, path)
5918
1716c8a0bd09 convert: mercurial sink must be local
Patrick Mezard <pmezard@gmail.com>
parents: 5522
diff changeset
    63
                if not self.repo.local():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    64
                    raise NoRepo(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    65
                        _(b'%s is not a local Mercurial repository') % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    66
                    )
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
    67
            except error.RepoError as err:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
    68
                ui.traceback()
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    69
                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
    70
        else:
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    71
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    72
                ui.status(_(b'initializing destination %s repository\n') % path)
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    73
                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
    74
                if not self.repo.local():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    75
                    raise NoRepo(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    76
                        _(b'%s is not a local Mercurial repository') % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    77
                    )
5441
71e7c86adcb7 convert: refactor sink initialisation, to remove hardcoding of hg
Bryan O'Sullivan <bos@serpentine.com>
parents: 5440
diff changeset
    78
                self.created.append(path)
7875
553aa0cbeab6 cleanup: drop unused assignments
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7874
diff changeset
    79
            except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
    80
                ui.traceback()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    81
                raise NoRepo(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    82
                    _(b"could not create hg repository %s as sink") % path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
    83
                )
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    84
        self.lock = None
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    85
        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
    86
        self.filemapmode = False
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
    87
        self.subrevmaps = {}
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    88
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    89
    def before(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    90
        self.ui.debug(b'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
    91
        self.wlock = self.repo.wlock()
5014
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    92
        self.lock = self.repo.lock()
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    93
914054ca532e convert: acquire/release locks periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 5013
diff changeset
    94
    def after(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    95
        self.ui.debug(b'run hg sink post-conversion action\n')
10086
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    96
        if self.lock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    97
            self.lock.release()
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    98
        if self.wlock:
e388f5ee7bf5 convert: make hg sink cleanup safer
Matt Mackall <mpm@selenic.com>
parents: 9546
diff changeset
    99
            self.wlock.release()
3938
0fab73b3f453 convert-repo: add some smarts
Matt Mackall <mpm@selenic.com>
parents: 3917
diff changeset
   100
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
   101
    def revmapfile(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   102
        return self.repo.vfs.join(b"shamap")
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   103
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   104
    def authorfile(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   105
        return self.repo.vfs.join(b"authormap")
4589
451e91ed535e convert extension: Add support for username mapping
Edouard Gomez <ed.gomez@free.fr>
parents: 4536
diff changeset
   106
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   107
    def setbranch(self, branch, pbranches):
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   108
        if not self.clonebranches:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   109
            return
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   110
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   111
        setbranch = branch != self.lastbranch
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   112
        self.lastbranch = branch
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   113
        if not branch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   114
            branch = b'default'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   115
        pbranches = [(b[0], b[1] and b[1] or b'default') for b in pbranches]
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   116
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   117
        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
   118
        if setbranch:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   119
            self.after()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   120
            try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   121
                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
   122
            except Exception:
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   123
                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
   124
            self.before()
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   125
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   126
        # 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
   127
        # 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
   128
        missings = {}
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   129
        for b in pbranches:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   130
            try:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   131
                self.repo.lookup(b[0])
16689
f366d4c2ff34 cleanup: replace naked excepts with except Exception: ...
Brodie Rao <brodie@sf.io>
parents: 16687
diff changeset
   132
            except Exception:
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   133
                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
   134
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   135
        if missings:
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   136
            self.after()
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
   137
            for pbranch, heads in sorted(pycompat.iteritems(missings)):
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   138
                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
   139
                prepo = hg.peer(self.ui, {}, pbranchpath)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
                self.ui.note(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   141
                    _(b'pulling from %s into %s\n') % (pbranch, branch)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   142
                )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   143
                exchange.pull(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   144
                    self.repo, prepo, [prepo.lookup(h) for h in heads]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   145
                )
5934
e495f3f35b2d convert: hg.clonebranches must pull missing parents (issue941)
Patrick Mezard <pmezard@gmail.com>
parents: 5918
diff changeset
   146
            self.before()
5173
6b4c332f241b convert: hg: optionally create branches as clones
Brendan Cully <brendan@kublai.com>
parents: 5143
diff changeset
   147
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
   148
    def _rewritetags(self, source, revmap, data):
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
   149
        fp = stringio()
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   150
        for line in data.splitlines():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   151
            s = line.split(b' ', 1)
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   152
            if len(s) != 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   153
                self.ui.warn(_(b'invalid tag entry: "%s"\n') % line)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   154
                fp.write(b'%s\n' % line)  # Bogus, but keep for hash stability
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   155
                continue
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   156
            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
   157
            if not revid:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   158
                if s[0] == nodemod.nullhex:
25305
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   159
                    revid = s[0]
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   160
                else:
39021
7e023ce26c7f convert: don't drop missing or corrupt tag entries
Matt Harbison <matt_harbison@yahoo.com>
parents: 37579
diff changeset
   161
                    # missing, but keep for hash stability
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   162
                    self.ui.warn(_(b'missing tag entry: "%s"\n') % line)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   163
                    fp.write(b'%s\n' % line)
25305
884ef09cf658 convert: properly pass null ids through .hgtags (issue4678)
Matt Mackall <mpm@selenic.com>
parents: 24395
diff changeset
   164
                    continue
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   165
            fp.write(b'%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
   166
        return fp.getvalue()
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   167
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   168
    def _rewritesubstate(self, source, data):
28861
86db5cb55d46 pycompat: switch to util.stringio for py3 compat
timeless <timeless@mozdev.org>
parents: 28370
diff changeset
   169
        fp = stringio()
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   170
        for line in data.splitlines():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   171
            s = line.split(b' ', 1)
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   172
            if len(s) != 2:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   173
                continue
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   174
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   175
            revid = s[0]
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   176
            subpath = s[1]
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   177
            if revid != nodemod.nullhex:
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   178
                revmap = self.subrevmaps.get(subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   179
                if revmap is None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   180
                    revmap = mapfile(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
                        self.ui, self.repo.wjoin(subpath, b'.hg/shamap')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   182
                    )
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   183
                    self.subrevmaps[subpath] = revmap
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   184
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   185
                    # 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
   186
                    # 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
   187
                    # 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
   188
                    # once.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   189
                    msg = _(b'no ".hgsubstate" updates will be made for "%s"\n')
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   190
                    if len(revmap) == 0:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   191
                        sub = self.repo.wvfs.reljoin(subpath, b'.hg')
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   192
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   193
                        if self.repo.wvfs.exists(sub):
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   194
                            self.ui.warn(msg % subpath)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   195
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   196
                newid = revmap.get(revid)
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   197
                if not newid:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   198
                    if len(revmap) > 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   199
                        self.ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   200
                            _(b"%s is missing from %s/.hg/shamap\n")
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   201
                            % (revid, subpath)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   202
                        )
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   203
                else:
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   204
                    revid = newid
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   205
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   206
            fp.write(b'%s %s\n' % (revid, subpath))
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   207
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   208
        return fp.getvalue()
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   209
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   210
    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
   211
        """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
   212
        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
   213
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   214
        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
   215
        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
   216
        repositories together).
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   217
        """
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   218
        anc = [p1ctx.ancestor(p2ctx)]
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   219
        # 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
   220
        actions, diverge, rename = mergemod.calculateupdates(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   221
            self.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   222
            p1ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   223
            p2ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   224
            anc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   225
            branchmerge=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   226
            force=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   227
            acceptremote=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   228
            followcopies=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   229
        )
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   230
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
   231
        for file, (action, info, msg) in pycompat.iteritems(actions):
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   232
            if source.targetfilebelongstosource(file):
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   233
                # 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
   234
                # 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
   235
                continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   236
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   237
            # 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
   238
            # context to resolve merges correctly.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
            if action in [b'm', b'dm', b'cd', b'dc']:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   240
                raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   241
                    _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
                        b"unable to convert merge commit "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   243
                        b"since target parents do not merge cleanly (file "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   244
                        b"%s, parents %s and %s)"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   245
                    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   246
                    % (file, p1ctx, p2ctx)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   247
                )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
            elif action == b'k':
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   249
                # '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
   250
                continue
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   251
            else:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   252
                # 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
   253
                yield file
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   254
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   255
    def putcommit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   256
        self, files, copies, parents, commit, source, revmap, full, cleanp2
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   257
    ):
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   258
        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
   259
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   260
        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
   261
            if p2ctx and f in p2files and f not in copies:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   262
                self.ui.debug(b'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
   263
                try:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   264
                    return p2ctx[f]
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   265
                except error.ManifestLookupError:
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   266
                    # 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
   267
                    # delete, so just return None.
5ca587348875 convert: fix syncing deletes from p2 merge commit
Durham Goode <durham@fb.com>
parents: 26037
diff changeset
   268
                    return None
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   269
            try:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   270
                v = files[f]
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   271
            except KeyError:
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   272
                return None
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
   273
            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
   274
            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
   275
                return None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   276
            if f == b'.hgtags':
21076
5236c7a72a2d convert: backout b75a04502ced and 9616b03113ce - tagmap
Mads Kiilerich <madski@unity3d.com>
parents: 20397
diff changeset
   277
                data = self._rewritetags(source, revmap, data)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   278
            if f == b'.hgsubstate':
25558
daf9f7ee2a5c convert: support incremental conversion with hg subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25305
diff changeset
   279
                data = self._rewritesubstate(source, data)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   280
            return context.memfilectx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   281
                self.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   282
                memctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   283
                f,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   284
                data,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   285
                b'l' in mode,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
                b'x' in mode,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   287
                copies.get(f),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   288
            )
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   289
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   290
        pl = []
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   291
        for p in parents:
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   292
            if p not in pl:
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   293
                pl.append(p)
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   294
        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
   295
        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
   296
        if self.filemapmode and nparents == 1:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   297
            m1node = self.repo.changelog.read(nodemod.bin(parents[0]))[0]
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   298
            parent = parents[0]
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   299
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   300
        if len(parents) < 2:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   301
            parents.append(nodemod.nullid)
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10263
diff changeset
   302
        if len(parents) < 2:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   303
            parents.append(nodemod.nullid)
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   304
        p2 = parents.pop(0)
692
695dd9a491da convert-repo: deal with packed git and other fixes
mpm@selenic.com
parents: 450
diff changeset
   305
3954
9af4b853ed4d convert-repo: add CVS branch support
Matt Mackall <mpm@selenic.com>
parents: 3953
diff changeset
   306
        text = commit.desc
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   307
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   308
        sha1s = re.findall(sha1re, text)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   309
        for sha1 in sha1s:
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   310
            oldrev = source.lookuprev(sha1)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   311
            newrev = revmap.get(oldrev)
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   312
            if newrev is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   313
                text = text.replace(sha1, newrev[: len(sha1)])
20372
45562379ce4e convert: replace old sha1s in the description
Sean Farley <sean.michael.farley@gmail.com>
parents: 19891
diff changeset
   314
5439
d0c67b52ac01 convert: make contents of "extra" dict available from sources, for sinks.
Bryan O'Sullivan <bos@serpentine.com>
parents: 5437
diff changeset
   315
        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
   316
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   317
        sourcename = self.repo.ui.config(b'convert', b'hg.sourcename')
25750
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
   318
        if sourcename:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   319
            extra[b'convert_source'] = sourcename
25750
c9093d4d1ff6 convert: add config for recording the source name
Durham Goode <durham@fb.com>
parents: 25748
diff changeset
   320
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   321
        for label in (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   322
            b'source',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
            b'transplant_source',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   324
            b'rebase_source',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
            b'intermediate-source',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   326
        ):
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   327
            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
   328
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   329
            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
   330
                continue
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   331
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   332
            # Only transplant stores its reference in binary
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
            if label == b'transplant_source':
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   334
                node = nodemod.hex(node)
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   335
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   336
            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
   337
            if newrev is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   338
                if label == b'transplant_source':
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   339
                    newrev = nodemod.bin(newrev)
21765
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   340
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   341
                extra[label] = newrev
44255f7ce886 convert: update the transplant, rebase and graft references in 'extra'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21689
diff changeset
   342
5038
8f157190075e convert: add config option to turn off use of branch names
Bryan O'Sullivan <bos@serpentine.com>
parents: 5017
diff changeset
   343
        if self.branchnames and commit.branch:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   344
            extra[b'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
   345
        if commit.rev and commit.saverev:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   346
            extra[b'convert_revision'] = commit.rev
4957
cdd33a048289 removed trailing whitespace
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4873
diff changeset
   347
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   348
        while parents:
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   349
            p1 = p2
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   350
            p2 = parents.pop(0)
26037
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   351
            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
   352
            p2ctx = None
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   353
            if p2 != nodemod.nullid:
24395
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   354
                p2ctx = self.repo[p2]
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   355
            fileset = set(files)
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   356
            if full:
22360
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
   357
                fileset.update(self.repo[p1])
3e483253213e convert: don't use multi-argument set.update
Mads Kiilerich <madski@unity3d.com>
parents: 22300
diff changeset
   358
                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
   359
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   360
            if p2ctx:
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   361
                p2files = set(cleanp2)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   362
                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
   363
                    p2files.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   364
                    fileset.add(file)
a75d24539aba convert: fix convert dropping p2 contents during filemap merge
Durham Goode <durham@fb.com>
parents: 25750
diff changeset
   365
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   366
            ctx = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   367
                self.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   368
                (p1, p2),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   369
                text,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   370
                fileset,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   371
                getfilectx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   372
                commit.author,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   373
                commit.date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   374
                extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   375
            )
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   376
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   377
            # 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
   378
            # commit, so copy the source's phase for now.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   379
            self.repo.ui.setconfig(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   380
                b'phases',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   381
                b'new-commit',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   382
                phases.phasenames[commit.phase],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   383
                b'convert',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   384
            )
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   385
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   386
            with self.repo.transaction(b"convert") as tr:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
                if self.repo.ui.config(b'convert', b'hg.preserve-hash'):
42620
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41771
diff changeset
   388
                    origctx = commit.ctx
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41771
diff changeset
   389
                else:
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41771
diff changeset
   390
                    origctx = None
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 41771
diff changeset
   391
                node = nodemod.hex(self.repo.commitctx(ctx, origctx=origctx))
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   392
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   393
                # 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
   394
                # 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
   395
                # anywhere.
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   396
                if commit.rev != node:
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   397
                    ctx = self.repo[node]
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   398
                    if ctx.phase() < phases.draft:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   399
                        phases.registernew(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   400
                            self.repo, tr, phases.draft, [ctx.node()]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   401
                        )
25571
1abfe639a70c convert: apply the appropriate phases to the destination (issue4165)
Matt Harbison <matt_harbison@yahoo.com>
parents: 25570
diff changeset
   402
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   403
            text = b"(octopus merge fixup)\n"
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
   404
            p2 = node
431
dfc44f3f587c convert-repo fixups
mpm@selenic.com
parents: 316
diff changeset
   405
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   406
        if self.filemapmode and nparents == 1:
39244
73cf21b2e8a6 manifest: add getstorage() to manifestlog and use it globally
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39021
diff changeset
   407
            man = self.repo.manifestlog.getstorage(b'')
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   408
            mnode = self.repo.changelog.read(nodemod.bin(p2))[0]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   409
            closed = b'close' in commit.extra
11673
a2f11188e2d2 convert: handle closed branch heads in hg-hg conversion (issue2185)
Matt Mackall <mpm@selenic.com>
parents: 11134
diff changeset
   410
            if not closed and not man.cmp(m1node, man.revision(mnode)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   411
                self.ui.status(_(b"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
   412
                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
   413
                return parent
1389
9b3ef6f3cef5 convert-repo: fix up octopus merge conversion
Matt Mackall <mpm@selenic.com>
parents: 1388
diff changeset
   414
        return p2
316
c48d069163d6 Add new convert-repo script
mpm@selenic.com
parents:
diff changeset
   415
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   416
    def puttags(self, tags):
37395
810413b745ff convert: look up branch only among branches
Martin von Zweigbergk <martinvonz@google.com>
parents: 37394
diff changeset
   417
        tagparent = self.repo.branchtip(self.tagsbranch, ignoremissing=True)
810413b745ff convert: look up branch only among branches
Martin von Zweigbergk <martinvonz@google.com>
parents: 37394
diff changeset
   418
        tagparent = tagparent or nodemod.nullid
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   419
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   420
        oldlines = set()
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
   421
        for branch, heads in pycompat.iteritems(self.repo.branchmap()):
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   422
            for h in heads:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   423
                if b'.hgtags' in self.repo[h]:
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   424
                    oldlines.update(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   425
                        set(self.repo[h][b'.hgtags'].data().splitlines(True))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   426
                    )
20376
7a4797910205 convert: compare tags from all heads instead of just one
Sean Farley <sean.michael.farley@gmail.com>
parents: 20373
diff changeset
   427
        oldlines = sorted(list(oldlines))
694
51eb248d3348 Teach convert-repo about tags
mpm@selenic.com
parents: 692
diff changeset
   428
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   429
        newlines = sorted([(b"%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
   430
        if newlines == oldlines:
9431
d1b135f2f415 convert: fix history topology when using hg.tagsbranch
Patrick Mezard <pmezard@gmail.com>
parents: 8693
diff changeset
   431
            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
   432
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   433
        # 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
   434
        oldtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   435
        newtags = set()
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   436
        for line in oldlines:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   437
            s = line.strip().split(b' ', 1)
20377
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   438
            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
   439
                continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   440
            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
   441
        for line in newlines:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   442
            s = line.strip().split(b' ', 1)
20377
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   443
            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
   444
                continue
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   445
            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
   446
                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
   447
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   448
        if not newtags:
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   449
            return None, None
5842d63cfe56 convert: avoid updating tags when there is nothing new
Sean Farley <sean.michael.farley@gmail.com>
parents: 20376
diff changeset
   450
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   451
        data = b"".join(newlines)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   452
7877
eba7f12b0c51 cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 7875
diff changeset
   453
        def getfilectx(repo, memctx, f):
35400
8a0cac20a1ad memfilectx: make changectx argument mandatory in constructor (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 35176
diff changeset
   454
            return context.memfilectx(repo, memctx, f, data, False, False, None)
6717
2011bb8ada9a convert: hg sink commits without working dir
Patrick Mezard <pmezard@gmail.com>
parents: 6716
diff changeset
   455
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   456
        self.ui.status(_(b"updating tags\n"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   457
        date = b"%d 0" % int(time.mktime(time.gmtime()))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   458
        extra = {b'branch': self.tagsbranch}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   459
        ctx = context.memctx(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   460
            self.repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   461
            (tagparent, None),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   462
            b"update tags",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   463
            [b".hgtags"],
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   464
            getfilectx,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   465
            b"convert-repo",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   466
            date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   467
            extra,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   468
        )
25697
1538e72209fd convert: fix bug with converting the same commit twice
Durham Goode <durham@fb.com>
parents: 25660
diff changeset
   469
        node = self.repo.commitctx(ctx)
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   470
        return nodemod.hex(node), nodemod.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
   471
5378
8a2915f57dfc convert: add a mode where mercurial_sink skips empty revisions.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5360
diff changeset
   472
    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
   473
        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
   474
13746
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   475
    def putbookmarks(self, updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   476
        if not len(updatedbookmark):
d80b768545cb convert: add bookmark support to the hg sink
Edouard Gomez <ed.gomez@free.fr>
parents: 11673
diff changeset
   477
            return
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   478
        wlock = lock = tr = None
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   479
        try:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   480
            wlock = self.repo.wlock()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   481
            lock = self.repo.lock()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   482
            tr = self.repo.transaction(b'bookmark')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   483
            self.ui.status(_(b"updating bookmarks\n"))
26973
fdd63acf3215 convert: indentation change to make the next patch more legible
Laurent Charignon <lcharignon@fb.com>
parents: 26587
diff changeset
   484
            destmarks = self.repo._bookmarks
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   485
            changes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   486
                (bookmark, nodemod.bin(updatedbookmark[bookmark]))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   487
                for bookmark in updatedbookmark
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   488
            ]
33487
a050d37c2c70 bookmark: use 'applychanges' in the convert extension
Boris Feld <boris.feld@octobus.net>
parents: 33455
diff changeset
   489
            destmarks.applychanges(self.repo, tr, changes)
26974
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   490
            tr.close()
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   491
        finally:
4b5dc0d9e899 convert: use repo._bookmarks.recordchange instead of repo._bookmarks.write
Laurent Charignon <lcharignon@fb.com>
parents: 26973
diff changeset
   492
            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
   493
21635
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   494
    def hascommitfrommap(self, rev):
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   495
        # 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
   496
        return rev in self.repo or self.clonebranches
5f2cc464e502 convert: introduce hascommitfrommap sink method
Mads Kiilerich <madski@unity3d.com>
parents: 21634
diff changeset
   497
21634
23b24d6a70c8 convert: rename sink hascommit to hascommitforsplicemap
Mads Kiilerich <madski@unity3d.com>
parents: 21498
diff changeset
   498
    def hascommitforsplicemap(self, rev):
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
   499
        if rev not in self.repo and self.clonebranches:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   500
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   501
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   502
                    b'revision %s not found in destination '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   503
                    b'repository (lookups with clonebranches=true '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   504
                    b'are not implemented)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   505
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   506
                % rev
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   507
            )
16106
d75aa756149b convert: use splicemap entries when sorting revisions (issue1748)
Patrick Mezard <patrick@mezard.eu>
parents: 15193
diff changeset
   508
        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
   509
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   510
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   511
class mercurial_source(common.converter_source):
35176
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
   512
    def __init__(self, ui, repotype, path, revs=None):
671aba341d90 convert: save an indicator of the repo type for sources and sinks
Matt Harbison <matt_harbison@yahoo.com>
parents: 34172
diff changeset
   513
        common.converter_source.__init__(self, ui, repotype, path, revs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   514
        self.ignoreerrors = ui.configbool(b'convert', b'hg.ignoreerrors')
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
   515
        self.ignored = set()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   516
        self.saverev = ui.configbool(b'convert', b'hg.saverev')
5358
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
   517
        try:
4fbd27bf04b1 convert: fail properly if we can't read a source hg repository
Bryan O'Sullivan <bos@serpentine.com>
parents: 5352
diff changeset
   518
            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
   519
            # 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
   520
            # 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
   521
            if not self.repo.local():
16687
e34106fa0dc3 cleanup: "raise SomeException()" -> "raise SomeException"
Brodie Rao <brodie@sf.io>
parents: 16686
diff changeset
   522
                raise error.RepoError
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
   523
        except error.RepoError:
8206
cce63ef1045b ui: print_exc() -> traceback()
Matt Mackall <mpm@selenic.com>
parents: 8112
diff changeset
   524
            ui.traceback()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   525
            raise NoRepo(_(b"%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
   526
        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
   527
        self.lastctx = None
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   528
        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
   529
        self.convertfp = None
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   530
        # Restrict converted revisions to startrev descendants
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   531
        startnode = ui.config(b'convert', b'hg.startrev')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   532
        hgrevs = ui.config(b'convert', b'hg.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
   533
        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
   534
            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
   535
                try:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   536
                    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
   537
                except error.RepoError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   538
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   539
                        _(b'%s is not a valid start revision') % startnode
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   540
                    )
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   541
                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
   542
                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
   543
                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
   544
                    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
   545
                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
   546
            else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   547
                self.keep = util.always
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
   548
            if revs:
37361
e45545f7895e convert: use repo.lookup() for converting to nodeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 36607
diff changeset
   549
                self._heads = [self.repo.lookup(r) 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
   550
            else:
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   551
                self._heads = self.repo.heads()
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   552
        else:
25748
baea47cafe75 convert: add support for specifying multiple revs
Durham Goode <durham@fb.com>
parents: 25697
diff changeset
   553
            if revs or startnode is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   554
                raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   555
                    _(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   556
                        b'hg.revs cannot be combined with '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   557
                        b'hg.startrev or --rev'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   558
                    )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   559
                )
19891
e271970b9821 convert: introduce hg.revs to replace hg.startrev and --rev with a revset
Mads Kiilerich <madski@unity3d.com>
parents: 19890
diff changeset
   560
            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
   561
            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
   562
            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
   563
                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
   564
                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
   565
                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
   566
            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
   567
            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
   568
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   569
    def _changectx(self, rev):
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   570
        if self.lastrev != rev:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6717
diff changeset
   571
            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
   572
            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
   573
        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
   574
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   575
    def _parents(self, ctx):
9531
a2f36a082449 convert/hg: make parents() return changectx, not nodes
Patrick Mezard <pmezard@gmail.com>
parents: 9431
diff changeset
   576
        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
   577
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   578
    def getheads(self):
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   579
        return [nodemod.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
   580
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   581
    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
   582
        try:
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   583
            fctx = self._changectx(rev)[name]
11134
33010ff1fd6f convert: merge sources getmode() into getfile()
Patrick Mezard <pmezard@gmail.com>
parents: 10939
diff changeset
   584
            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
   585
        except error.LookupError:
650b5b6e75ed convert: use None value for missing files instead of overloading IOError
Mads Kiilerich <madski@unity3d.com>
parents: 21765
diff changeset
   586
            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
   587
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   588
    def _changedfiles(self, ctx1, ctx2):
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   589
        ma, r = [], []
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   590
        maappend = ma.append
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   591
        rappend = r.append
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   592
        d = ctx1.manifest().diff(ctx2.manifest())
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
   593
        for f, ((node1, flag1), (node2, flag2)) in pycompat.iteritems(d):
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   594
            if node2 is None:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   595
                rappend(f)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   596
            else:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   597
                maappend(f)
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   598
        return ma, r
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   599
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   600
    def getchanges(self, rev, full):
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   601
        ctx = self._changectx(rev)
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   602
        parents = self._parents(ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   603
        if full or not parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   604
            files = copyfiles = ctx.manifest()
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   605
        if parents:
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   606
            if self._changescache[0] == rev:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   607
                ma, r = self._changescache[1]
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   608
            else:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   609
                ma, r = self._changedfiles(parents[0], ctx)
22300
35ab037de989 convert: introduce --full for converting all files
Mads Kiilerich <madski@unity3d.com>
parents: 22299
diff changeset
   610
            if not full:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   611
                files = ma + r
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   612
            copyfiles = ma
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   613
        # _getcopies() is also run for roots and before filtering so missing
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   614
        # revlogs are detected early
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   615
        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
   616
        cleanp2 = set()
216fa1ba9993 convert: optimize convert of files that are unmodified from p2 in merges
Mads Kiilerich <madski@unity3d.com>
parents: 24306
diff changeset
   617
        if len(parents) == 2:
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   618
            d = parents[1].manifest().diff(ctx.manifest(), clean=True)
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43085
diff changeset
   619
            for f, value in pycompat.iteritems(d):
27719
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   620
                if value is None:
7ce8a13b8d77 convert: use manifest.diff() instead of ctx.status()
Martin von Zweigbergk <martinvonz@google.com>
parents: 27718
diff changeset
   621
                    cleanp2.add(f)
22299
98aafdf4cbf6 convert: refactor hg getchanges and caching
Mads Kiilerich <madski@unity3d.com>
parents: 22296
diff changeset
   622
        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
   623
        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
   624
        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
   625
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   626
    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
   627
        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
   628
        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
   629
            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
   630
                continue
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   631
            try:
41771
1312afae2d51 convert: migrate to new method for getting copy source
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
   632
                copysource = ctx.filectx(name).copysource()
19457
948df0f10ec1 convert: fix bad conversion of copies when hg.startrev is specified
Mads Kiilerich <madski@unity3d.com>
parents: 19120
diff changeset
   633
                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
   634
                    continue
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   635
                # Ignore copy sources not in parent revisions
36340
06464d1ce6cd convert: don't reimplement any()
Martin von Zweigbergk <martinvonz@google.com>
parents: 36148
diff changeset
   636
                if not any(copysource in p for p in parents):
9532
989cb39d1df4 convert/hg: handle bogus copy records (issue1843)
Patrick Mezard <pmezard@gmail.com>
parents: 9531
diff changeset
   637
                    continue
7231
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   638
                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
   639
            except TypeError:
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   640
                pass
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25589
diff changeset
   641
            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
   642
                if not self.ignoreerrors:
8e7130a10f3b convert: ignore hg source errors with hg.ignoreerrors (issue 1357)
Patrick Mezard <pmezard@gmail.com>
parents: 6956
diff changeset
   643
                    raise
8456
e9e2a2c9b294 convert: use set instead of dict
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8250
diff changeset
   644
                self.ignored.add(name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   645
                self.ui.warn(_(b'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
   646
        return copies
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5131
diff changeset
   647
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   648
    def getcommit(self, rev):
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   649
        ctx = self._changectx(rev)
28900
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
   650
        _parents = self._parents(ctx)
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
   651
        parents = [p.hex() for p in _parents]
b65966f50058 convert: keep converted hg parents that are outside convert.hg.revs (BC)
Mads Kiilerich <madski@unity3d.com>
parents: 28861
diff changeset
   652
        optparents = [p.hex() for p in ctx.parents() if p and p not in _parents]
25570
7cc1d33f0ba6 convert: always track the hg source revision in the internal commit object
Matt Harbison <matt_harbison@yahoo.com>
parents: 25558
diff changeset
   653
        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
   654
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   655
        return common.commit(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   656
            author=ctx.user(),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   657
            date=dateutil.datestr(ctx.date(), b'%Y-%m-%d %H:%M:%S %1%2'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   658
            desc=ctx.description(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   659
            rev=crev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   660
            parents=parents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   661
            optparents=optparents,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   662
            branch=ctx.branch(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   663
            extra=ctx.extra(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   664
            sortkey=ctx.rev(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   665
            saverev=self.saverev,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   666
            phase=ctx.phase(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   667
            ctx=ctx,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   668
        )
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   669
41179
77088fa862df convert: add missing numcommits() override to hg sources
Matt Harbison <matt_harbison@yahoo.com>
parents: 39244
diff changeset
   670
    def numcommits(self):
77088fa862df convert: add missing numcommits() override to hg sources
Matt Harbison <matt_harbison@yahoo.com>
parents: 39244
diff changeset
   671
        return len(self.repo)
77088fa862df convert: add missing numcommits() override to hg sources
Matt Harbison <matt_harbison@yahoo.com>
parents: 39244
diff changeset
   672
5013
6c1029aacc9a convert: Support Mercurial as a source, as well as a sink
Bryan O'Sullivan <bos@serpentine.com>
parents: 5011
diff changeset
   673
    def gettags(self):
21498
6b8daeea638a convert: mercurial source: convert global tags only - not local tags
Mads Kiilerich <madski@unity3d.com>
parents: 21076
diff changeset
   674
        # This will get written to .hgtags, filter non global tags out.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   675
        tags = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   676
            t
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   677
            for t in self.repo.tagslist()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   678
            if self.repo.tagtype(t[0]) == b'global'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42979
diff changeset
   679
        ]
44452
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   680
        return {
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   681
            name: nodemod.hex(node) for name, node in tags if self.keep(node)
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   682
        }
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   683
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   684
    def getchangedfiles(self, rev, i):
27717
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   685
        ctx = self._changectx(rev)
5deff127286f convert: use _ prefix for private methods in hg sink
Martin von Zweigbergk <martinvonz@google.com>
parents: 27345
diff changeset
   686
        parents = self._parents(ctx)
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   687
        if not parents and i is None:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   688
            i = 0
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   689
            ma, r = ctx.manifest().keys(), []
6885
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   690
        else:
6e253aa04ff7 convert: implement startrev for hg source
Patrick Mezard <pmezard@gmail.com>
parents: 6762
diff changeset
   691
            i = i or 0
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   692
            ma, r = self._changedfiles(parents[i], ctx)
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   693
        ma, r = [[f for f in l if f not in self.ignored] for l in (ma, r)]
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   694
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   695
        if i == 0:
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   696
            self._changescache = (rev, (ma, r))
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   697
27718
6e1fba0fe453 convert: replace cache of (m,a,r) by (ma,r)
Martin von Zweigbergk <martinvonz@google.com>
parents: 27717
diff changeset
   698
        return ma + r
5379
d3e51dc804f8 mercurial_source: add --filemap support
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 5378
diff changeset
   699
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   700
    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
   701
        if self.convertfp is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   702
            self.convertfp = open(self.repo.vfs.join(b'shamap'), b'ab')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   703
        self.convertfp.write(util.tonativeeol(b'%s %s\n' % (destrev, rev)))
5554
2147a734dcf9 convert: tell the source repository when a rev has been converted
Bryan O'Sullivan <bos@serpentine.com>
parents: 5553
diff changeset
   704
        self.convertfp.flush()
5805
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   705
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   706
    def before(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   707
        self.ui.debug(b'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
   708
e422305e0853 test-convert: test before() and after() conversion actions
Patrick Mezard <pmezard@gmail.com>
parents: 5556
diff changeset
   709
    def after(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   710
        self.ui.debug(b'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
   711
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   712
    def hasnativeorder(self):
a0a541d6fed6 convert: fail fast if source does not support --sourcesort
Patrick Mezard <pmezard@gmail.com>
parents: 8690
diff changeset
   713
        return True
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   714
18819
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
   715
    def hasnativeclose(self):
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
   716
        return True
05acdf8e1f23 convert: add closesort algorithm to mercurial sources
Constantine Linnick <theaspect@gmail.com>
parents: 18373
diff changeset
   717
8693
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   718
    def lookuprev(self, rev):
68e0a55eee6e convert: rewrite tags when converting from hg to hg
Patrick Mezard <pmezard@gmail.com>
parents: 8691
diff changeset
   719
        try:
28370
c1878afb063a convert: hg use absolute_import
timeless <timeless@mozdev.org>
parents: 27863
diff changeset
   720
            return nodemod.hex(self.repo.lookup(rev))
23926
fea3416f2440 convert: handle LookupError in mercurial_source.lookuprev()
Matt Harbison <matt_harbison@yahoo.com>
parents: 22698
diff changeset
   721
        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
   722
            return None
13757
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
   723
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
   724
    def getbookmarks(self):
043238abda94 convert: add bookmark support to hg source
Edouard Gomez <ed.gomez@free.fr>
parents: 13746
diff changeset
   725
        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
   726
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   727
    def checkrevformat(self, revstr, mapname=b'splicemap'):
19120
58e782f076e7 splicemap: improve error handling when source is hg (issue2084)
Ben Goswami <bengoswami@fb.com>
parents: 18819
diff changeset
   728
        """ 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
   729
        self.checkhexformat(revstr, mapname)