OLD | NEW |
| (Empty) |
1 # copyright 2003-2011 LOGILAB S.A. (Paris, FRANCE), all rights reserved. | |
2 # contact http://www.logilab.fr/ -- mailto:contact@logilab.fr | |
3 # | |
4 # This file is part of logilab-common. | |
5 # | |
6 # logilab-common is free software: you can redistribute it and/or modify it unde
r | |
7 # the terms of the GNU Lesser General Public License as published by the Free | |
8 # Software Foundation, either version 2.1 of the License, or (at your option) an
y | |
9 # later version. | |
10 # | |
11 # logilab-common is distributed in the hope that it will be useful, but WITHOUT | |
12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
13 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more | |
14 # details. | |
15 # | |
16 # You should have received a copy of the GNU Lesser General Public License along | |
17 # with logilab-common. If not, see <http://www.gnu.org/licenses/>. | |
18 """mercurial utilities (mercurial should be installed)""" | |
19 | |
20 __docformat__ = "restructuredtext en" | |
21 | |
22 import os | |
23 import sys | |
24 import os.path as osp | |
25 | |
26 try: | |
27 from mercurial.error import RepoError | |
28 from mercurial.__version__ import version as hg_version | |
29 except ImportError: | |
30 from mercurial.repo import RepoError | |
31 from mercurial.version import get_version | |
32 hg_version = get_version() | |
33 | |
34 from mercurial.hg import repository as Repository | |
35 from mercurial.ui import ui as Ui | |
36 from mercurial.node import short | |
37 try: | |
38 # mercurial >= 1.2 (?) | |
39 from mercurial.cmdutil import walkchangerevs | |
40 except ImportError, ex: | |
41 from mercurial.commands import walkchangerevs | |
42 try: | |
43 # mercurial >= 1.1 (.1?) | |
44 from mercurial.util import cachefunc | |
45 except ImportError, ex: | |
46 def cachefunc(func): | |
47 return func | |
48 try: | |
49 # mercurial >= 1.3.1 | |
50 from mercurial import encoding | |
51 _encoding = encoding.encoding | |
52 except ImportError: | |
53 try: | |
54 from mercurial.util import _encoding | |
55 except ImportError: | |
56 import locale | |
57 # stay compatible with mercurial 0.9.1 (etch debian release) | |
58 # (borrowed from mercurial.util 1.1.2) | |
59 try: | |
60 _encoding = os.environ.get("HGENCODING") | |
61 if sys.platform == 'darwin' and not _encoding: | |
62 # On darwin, getpreferredencoding ignores the locale environment
and | |
63 # always returns mac-roman. We override this if the environment
is | |
64 # not C (has been customized by the user). | |
65 locale.setlocale(locale.LC_CTYPE, '') | |
66 _encoding = locale.getlocale()[1] | |
67 if not _encoding: | |
68 _encoding = locale.getpreferredencoding() or 'ascii' | |
69 except locale.Error: | |
70 _encoding = 'ascii' | |
71 try: | |
72 # demandimport causes problems when activated, ensure it isn't | |
73 # XXX put this in apycot where the pb has been noticed? | |
74 from mercurial import demandimport | |
75 demandimport.disable() | |
76 except: | |
77 pass | |
78 | |
79 Ui.warn = lambda *args, **kwargs: 0 # make it quiet | |
80 | |
81 def find_repository(path): | |
82 """returns <path>'s mercurial repository | |
83 | |
84 None if <path> is not under hg control | |
85 """ | |
86 path = osp.realpath(osp.abspath(path)) | |
87 while not osp.isdir(osp.join(path, ".hg")): | |
88 oldpath = path | |
89 path = osp.dirname(path) | |
90 if path == oldpath: | |
91 return None | |
92 return path | |
93 | |
94 | |
95 def get_repository(path): | |
96 """Simple function that open a hg repository""" | |
97 repopath = find_repository(path) | |
98 if repopath is None: | |
99 raise RuntimeError('no repository found in %s' % osp.abspath(path)) | |
100 return Repository(Ui(), path=repopath) | |
101 | |
102 def incoming(wdrepo, masterrepo): | |
103 try: | |
104 return wdrepo.findincoming(masterrepo) | |
105 except AttributeError: | |
106 from mercurial import hg, discovery | |
107 revs, checkout = hg.addbranchrevs(wdrepo, masterrepo, ('', []), None) | |
108 common, incoming, rheads = discovery.findcommonincoming( | |
109 wdrepo, masterrepo, heads=revs) | |
110 if not masterrepo.local(): | |
111 from mercurial import bundlerepo, changegroup | |
112 if revs is None and masterrepo.capable('changegroupsubset'): | |
113 revs = rheads | |
114 if revs is None: | |
115 cg = masterrepo.changegroup(incoming, "incoming") | |
116 else: | |
117 cg = masterrepo.changegroupsubset(incoming, revs, 'incoming') | |
118 fname = changegroup.writebundle(cg, None, "HG10UN") | |
119 # use the created uncompressed bundlerepo | |
120 masterrepo = bundlerepo.bundlerepository(wdrepo.ui, wdrepo.root, fna
me) | |
121 return masterrepo.changelog.nodesbetween(incoming, revs)[0] | |
122 | |
123 def outgoing(wdrepo, masterrepo): | |
124 try: | |
125 return wdrepo.findoutgoing(masterrepo) | |
126 except AttributeError: | |
127 from mercurial import hg, discovery | |
128 revs, checkout = hg.addbranchrevs(wdrepo, wdrepo, ('', []), None) | |
129 o = discovery.findoutgoing(wdrepo, masterrepo) | |
130 return wdrepo.changelog.nodesbetween(o, revs)[0] | |
OLD | NEW |