view hgext3rd/fastimport/__init__.py @ 99:a90da62aa705 0.1.1

Build as version 0.1.1
author Roy Marples <roy@marples.name>
date Mon, 15 Feb 2021 11:49:46 +0000
parents cde0e1d24e58
children
line wrap: on
line source

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

from mercurial import (
    commands,
    encoding,
    error,
    pycompat,
)

from mercurial.i18n import _

from hgext.convert import (
    convcmd,
    hg,
)

from .hgimport import fastimport_source

__version__ = b"0.1.1"
testedwith = b"5.6.1"
minimumhgversion = b"4.1"

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

@command(b"fastimport",
         [(b"", b"branchsort", None, _(b"try to sort changesets by branches")),
          (b"", b"datesort", None, _(b"try to sort changesets by date")),
          (b"", b"sourcesort", None, _(b"preserve source changesets order")),
          (b"", b"blobpath", b"", _(b"path for persistent blob data"))],
         _(b"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 = (b"-")

    opts = pycompat.byteskwargs(opts)

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

    # sink is the current repo, src is the list of fastimport streams
    destc = hg.mercurial_sink(ui, b"hg", repo.root)
    srcc = fastimport_source(ui, b"fastimport", repo, sources,
                             opts[b"blobpath"])

    defaultsort = b"branchsort"          # for efficiency and consistency
    sortmodes = (b"branchsort", b"datesort", b"sourcesort")
    sortmode = [m for m in sortmodes if opts.get(m)]
    if len(sortmode) > 1:
        raise error.Abort(_(b"more than one sort mode specified"))
    if sortmode:
        sortmode = sortmode[0]
    else:
        sortmode = defaultsort

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