mirror of
https://github.com/facebook/sapling.git
synced 2025-01-08 14:46:47 +03:00
9dc21f8d0b
Summary: D13853115 adds `edenscm/` to `sys.path` and code still uses `import mercurial`. That has nasty problems if both `import mercurial` and `import edenscm.mercurial` are used, because Python would think `mercurial.foo` and `edenscm.mercurial.foo` are different modules so code like `try: ... except mercurial.error.Foo: ...`, or `isinstance(x, mercurial.foo.Bar)` would fail to handle the `edenscm.mercurial` version. There are also some module-level states (ex. `extensions._extensions`) that would cause trouble if they have multiple versions in a single process. Change imports to use the `edenscm` so ideally the `mercurial` is no longer imported at all. Add checks in extensions.py to catch unexpected extensions importing modules from the old (wrong) locations when running tests. Reviewed By: phillco Differential Revision: D13868981 fbshipit-source-id: f4e2513766957fd81d85407994f7521a08e4de48
80 lines
2.4 KiB
Python
80 lines
2.4 KiB
Python
# Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
|
|
#
|
|
# This software may be used and distributed according to the terms of the
|
|
# GNU General Public License version 2 or any later version.
|
|
|
|
"""share a common history between several working directories"""
|
|
|
|
from __future__ import absolute_import
|
|
|
|
from edenscm.mercurial import error, hg, registrar
|
|
from edenscm.mercurial.i18n import _
|
|
|
|
|
|
repository = hg.repository
|
|
|
|
cmdtable = {}
|
|
command = registrar.command(cmdtable)
|
|
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
|
|
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
|
|
# be specifying the version(s) of Mercurial they are tested with, or
|
|
# leave the attribute unspecified.
|
|
testedwith = "ships-with-hg-core"
|
|
|
|
|
|
@command(
|
|
"share",
|
|
[
|
|
("U", "noupdate", None, _("do not create a working directory")),
|
|
("B", "bookmarks", None, _("also share bookmarks")),
|
|
(
|
|
"",
|
|
"relative",
|
|
None,
|
|
_("point to source using a relative path " "(EXPERIMENTAL)"),
|
|
),
|
|
],
|
|
_("[-U] [-B] SOURCE [DEST]"),
|
|
norepo=True,
|
|
)
|
|
def share(ui, source, dest=None, noupdate=False, bookmarks=False, relative=False):
|
|
"""create a new shared repository
|
|
|
|
Initialize a new repository and working directory that shares its
|
|
history (and optionally bookmarks) with another repository.
|
|
|
|
.. note::
|
|
|
|
using rollback or extensions that destroy/modify history (mq,
|
|
rebase, etc.) can cause considerable confusion with shared
|
|
clones. In particular, if two shared clones are both updated to
|
|
the same changeset, and one of them destroys that changeset
|
|
with rollback, the other clone will suddenly stop working: all
|
|
operations will fail with "abort: working directory has unknown
|
|
parent". The only known workaround is to use debugsetparents on
|
|
the broken clone to reset it to a changeset that still exists.
|
|
"""
|
|
|
|
hg.share(
|
|
ui,
|
|
source,
|
|
dest=dest,
|
|
update=not noupdate,
|
|
bookmarks=bookmarks,
|
|
relative=relative,
|
|
)
|
|
return 0
|
|
|
|
|
|
@command("unshare", [], "")
|
|
def unshare(ui, repo):
|
|
"""convert a shared repository to a normal one
|
|
|
|
Copy the store data to the repo and remove the sharedpath data.
|
|
"""
|
|
|
|
if not repo.shared():
|
|
raise error.Abort(_("this is not a shared repo"))
|
|
|
|
hg.unshare(ui, repo)
|