import os import re from subprocess import Popen, PIPE, STDOUT from method import Method, Argument from method.vc import VcBlame try: from mercurial import hg, ui from mercurial import commands as hgc has_hg = True except ImportError: has_hg = False class HgBase(object): def _hg_check(self, w): if not has_hg: w.set_error("Mercurial is not installed") return False elif not hasattr(w.buffer, 'path'): w.set_error("Buffer has no corresponding file") return False else: return True def _hg_init(self, **kwargs): ui_imp = ui.ui(**kwargs) ui_imp.pushbuffer() repo = hg.repository(ui=ui_imp, path='.') return ui_imp, repo class HgBlame(VcBlame, HgBase): """Show buffer annotated with hg metadata""" num_fields = 3 # user, rev, [changeset], date, content line_re = re.compile(r'^ *([^ ]+) +(\d+) +[^ ]+ +(\d{4}-\d{2}-\d{2}): (.*)\n$') prefix_fmt = '[g:d:*]%*s [c:d:*]%*s [b:d:*]%*s[d:d:*]' _is_method = True def _open_pipe(self, w, **vargs): cmd = ("hg", 'blame', '-cnudq', w.buffer.path) return Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE) class HgLog(Method, HgBase): """Show hg log for this buffer""" def _execute(self, w, **vargs): if not self._hg_check(w): return ui_imp, repo = self._hg_init() hgc.log(ui_imp, repo, user=None, rev=None, date=None) s = ''.join(ui_imp.popbuffer()) w.application.data_buffer('*Log*', s, switch_to=True) class HgDiff(Method, HgBase): """Diff the current file with the version in Mercurial""" def _execute(self, w, **vargs): if not self._hg_check(w): return ui_imp, repo = self._hg_init() hgc.diff(ui_imp, repo, w.buffer.path) s = ''.join(ui_imp.popbuffer()) w.application.data_buffer("*Diff*", s, switch_to=True, modename='diff')