| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- # copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
- # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
- #
- # This file is part of logilab-common.
- #
- # logilab-common is free software: you can redistribute it and/or modify it under
- # the terms of the GNU Lesser General Public License as published by the Free
- # Software Foundation, either version 2.1 of the License, or (at your option) any
- # later version.
- #
- # logilab-common is distributed in the hope that it will be useful, but WITHOUT
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- # details.
- #
- # You should have received a copy of the GNU Lesser General Public License along
- # with logilab-common. If not, see <http://www.gnu.org/licenses/>.
- """mercurial utilities (mercurial should be installed)"""
- __docformat__ = "restructuredtext en"
- import os
- import sys
- import os.path as osp
- try:
- from mercurial.error import RepoError
- from mercurial.__version__ import version as hg_version
- except ImportError:
- from mercurial.repo import RepoError
- from mercurial.version import get_version
- hg_version = get_version()
- from mercurial.hg import repository as Repository
- from mercurial.ui import ui as Ui
- from mercurial.node import short
- try:
- # mercurial >= 1.2 (?)
- from mercurial.cmdutil import walkchangerevs
- except ImportError, ex:
- from mercurial.commands import walkchangerevs
- try:
- # mercurial >= 1.1 (.1?)
- from mercurial.util import cachefunc
- except ImportError, ex:
- def cachefunc(func):
- return func
- try:
- # mercurial >= 1.3.1
- from mercurial import encoding
- _encoding = encoding.encoding
- except ImportError:
- try:
- from mercurial.util import _encoding
- except ImportError:
- import locale
- # stay compatible with mercurial 0.9.1 (etch debian release)
- # (borrowed from mercurial.util 1.1.2)
- try:
- _encoding = os.environ.get("HGENCODING")
- if sys.platform == 'darwin' and not _encoding:
- # On darwin, getpreferredencoding ignores the locale environment and
- # always returns mac-roman. We override this if the environment is
- # not C (has been customized by the user).
- locale.setlocale(locale.LC_CTYPE, '')
- _encoding = locale.getlocale()[1]
- if not _encoding:
- _encoding = locale.getpreferredencoding() or 'ascii'
- except locale.Error:
- _encoding = 'ascii'
- try:
- # demandimport causes problems when activated, ensure it isn't
- # XXX put this in apycot where the pb has been noticed?
- from mercurial import demandimport
- demandimport.disable()
- except:
- pass
- Ui.warn = lambda *args, **kwargs: 0 # make it quiet
- def find_repository(path):
- """returns <path>'s mercurial repository
- None if <path> is not under hg control
- """
- path = osp.realpath(osp.abspath(path))
- while not osp.isdir(osp.join(path, ".hg")):
- oldpath = path
- path = osp.dirname(path)
- if path == oldpath:
- return None
- return path
- def get_repository(path):
- """Simple function that open a hg repository"""
- repopath = find_repository(path)
- if repopath is None:
- raise RuntimeError('no repository found in %s' % osp.abspath(path))
- return Repository(Ui(), path=repopath)
- def incoming(wdrepo, masterrepo):
- try:
- return wdrepo.findincoming(masterrepo)
- except AttributeError:
- from mercurial import hg, discovery
- revs, checkout = hg.addbranchrevs(wdrepo, masterrepo, ('', []), None)
- common, incoming, rheads = discovery.findcommonincoming(
- wdrepo, masterrepo, heads=revs)
- if not masterrepo.local():
- from mercurial import bundlerepo, changegroup
- if revs is None and masterrepo.capable('changegroupsubset'):
- revs = rheads
- if revs is None:
- cg = masterrepo.changegroup(incoming, "incoming")
- else:
- cg = masterrepo.changegroupsubset(incoming, revs, 'incoming')
- fname = changegroup.writebundle(cg, None, "HG10UN")
- # use the created uncompressed bundlerepo
- masterrepo = bundlerepo.bundlerepository(wdrepo.ui, wdrepo.root, fname)
- return masterrepo.changelog.nodesbetween(incoming, revs)[0]
- def outgoing(wdrepo, masterrepo):
- try:
- return wdrepo.findoutgoing(masterrepo)
- except AttributeError:
- from mercurial import hg, discovery
- revs, checkout = hg.addbranchrevs(wdrepo, wdrepo, ('', []), None)
- o = discovery.findoutgoing(wdrepo, masterrepo)
- return wdrepo.changelog.nodesbetween(o, revs)[0]
|