| 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 |