1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# 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]
|