view hgext/share.py @ 16851:c739227b5eea

test-revset: enable for Windows In MSYS, the test fails like this if the hghave exit at the beginning is removed: --- C:\Users\adi\hgrepos\hg-main\tests\test-revset.t +++ C:\Users\adi\hgrepos\hg-main\tests\test-revset.t.err @@ -58,7 +58,7 @@ $ hg co 3 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg branch /a/b/c/ - marked working directory as branch /a/b/c/ + marked working directory as branch a:/b/c/ (branches are permanent and global, did you want a bookmark?) $ hg ci -Aqm"5 bug" @@ -252,7 +252,7 @@ 2 a-b-c- 3 +a+b+c+ 4 -a-b-c- - 5 /a/b/c/ + 5 a:/b/c/ 6 _a_b_c_ 7 .a.b.c. $ log 'children(ancestor(4,5))' due to the posix path conversion done by MSYS globally, as explained here http://www.mingw.org/wiki/Posix_path_conversion The solution is a bit lame, but it is simple and works: don't use strings that look like '/a/b', in order not to trigger the path magic done by MSYS. So, if we can agree not to insist on testing branch names starting with '/', then this relatively simple patch makes the test pass both on Windows with MSYS and Linux.
author Adrian Buehlmann <adrian@cadifra.com>
date Sun, 03 Jun 2012 09:06:15 +0200
parents 38caf405d010
children f0564402d059
line wrap: on
line source

# 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 mercurial.i18n import _
from mercurial import hg, commands, util

testedwith = 'internal'

def share(ui, source, dest=None, noupdate=False):
    """create a new shared repository

    Initialize a new repository and working directory that shares its
    history 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
       (e.g. tip).
    """

    return hg.share(ui, source, dest, not noupdate)

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 repo.sharedpath == repo.path:
        raise util.Abort(_("this is not a shared repo"))

    destlock = lock = None
    lock = repo.lock()
    try:
        # we use locks here because if we race with commit, we
        # can end up with extra data in the cloned revlogs that's
        # not pointed to by changesets, thus causing verify to
        # fail

        destlock = hg.copystore(ui, repo, repo.path)

        sharefile = repo.join('sharedpath')
        util.rename(sharefile, sharefile + '.old')

        repo.requirements.discard('sharedpath')
        repo._writerequirements()
    finally:
        destlock and destlock.release()
        lock and lock.release()

    # update store, spath, sopener and sjoin of repo
    repo.__init__(ui, repo.root)

cmdtable = {
    "share":
    (share,
     [('U', 'noupdate', None, _('do not create a working copy'))],
     _('[-U] SOURCE [DEST]')),
    "unshare":
    (unshare,
    [],
    ''),
}

commands.norepo += " share"