view hgfastimport/__init__.py @ 73:a99e5c6c8e1c

Fix compatibility with 4.6+ Update to work with hg 4.5+ Switch to modern @command decorator API Adds compatiblility with hg 4.2 Clean up formatting and add description Update to work with hg 3.4+ Update to work with hg 3.2+ This breaks compatibility with <3.2. Merged from patches from github:danielj7/hg-fastimport
author Daniel Johnson <daniel@daniel-johnson.org>
date Sun, 12 Aug 2018 07:54:35 -0400
parents 6b716ecb1cf3
children a4f13dc5e3f7
line wrap: on
line source

''' import Git fast-import streams '''
from __future__ import absolute_import

from mercurial import (
    cmdutil,
    encoding,
    util,
)

from mercurial.i18n import _

from hgext.convert import (
    convcmd,
    hg,
)

from .hgimport import fastimport_source

cmdtable = {}
try:
    from mercurial import registrar
    command = registrar.command(cmdtable)
except (ImportError, AttributeError):
    command = cmdutil.command(cmdtable)

testedwith = '4.7'

@command("fastimport",
         [('', 'branchsort', None, _('try to sort changesets by branches')),
          ('', 'datesort', None, _('try to sort changesets by date')),
          ('', 'sourcesort', None, _('preserve source changesets order'))],
         _('hg fastimport SOURCE ...'),
         norepo=False)

def fastimport(ui, repo, *sources, **opts):
    """Convert a git fastimport dump into Mercurial changesets.

    Reads a series of SOURCE fastimport dumps and adds the resulting
    changes to the current Mercurial repository.
    """
    # Would be nice to just call hgext.convert.convcmd.convert() and let
    # it take care of things.  But syntax and semantics are just a
    # little mismatched:
    #   - fastimport takes multiple source paths (mainly because cvs2git
    #     produces 2 dump files)
    #   - fastimport's dest is implicitly the current repo
    #
    # So for the time being, I have copied bits of convert() over here.
    # Boo, hiss.

    if not sources:
        sources = ("-")

    # assume fastimport metadata (usernames, commit messages) are
    # encoded UTF-8
    convcmd.orig_encoding = encoding.encoding
    encoding.encoding = 'UTF-8'

    # sink is the current repo, src is the list of fastimport streams
    destc = hg.mercurial_sink(ui, 'hg', repo.root)
    srcc = fastimport_source(ui, 'fastimport', repo, sources)

    # XXX figuring out sortmode copied straight from hgext/convert/convcmd.py
    defaultsort = 'branchsort'          # for efficiency and consistency
    sortmodes = ('branchsort', 'datesort', 'sourcesort')
    sortmode = [m for m in sortmodes if opts.get(m)]
    if len(sortmode) > 1:
        raise util.Abort(_('more than one sort mode specified'))
    sortmode = sortmode and sortmode[0] or defaultsort

    # not implemented: filemap, revmapfile
    revmapfile = destc.revmapfile()
    c = convcmd.converter(ui, srcc, destc, revmapfile, opts)
    c.convert(sortmode)