parent
e1296dcbae
commit
c05127348e
11
method/hg.py
11
method/hg.py
|
@ -1,16 +1,15 @@
|
||||||
from method import Method, Argument
|
from method import Method, Argument
|
||||||
|
|
||||||
class HgCommit(Method):
|
|
||||||
"""Commit the current file """
|
|
||||||
w.set_error("unimplemented")
|
|
||||||
|
|
||||||
class HgBlame(Method):
|
class HgBlame(Method):
|
||||||
"""Show buffer annotated with hg metadata"""
|
"""Show buffer annotated with hg metadata"""
|
||||||
w.set_error("unimplemented")
|
# use hg blame -udq FILE
|
||||||
|
def _execute(self, w, **vargs):
|
||||||
|
w.set_error("unimplemented")
|
||||||
|
|
||||||
class HgLog(Method):
|
class HgLog(Method):
|
||||||
"""Show hg log for this buffer"""
|
"""Show hg log for this buffer"""
|
||||||
w.set_error("unimplemented")
|
def _execute(self, w, **vargs):
|
||||||
|
w.set_error("unimplemented")
|
||||||
|
|
||||||
class HgDiff(Method):
|
class HgDiff(Method):
|
||||||
"""Diff the current file with the version in Mercurial"""
|
"""Diff the current file with the version in Mercurial"""
|
||||||
|
|
102
method/svn.py
102
method/svn.py
|
@ -3,6 +3,7 @@ from subprocess import Popen, PIPE, STDOUT
|
||||||
|
|
||||||
import buffer, default, dirutil, lex, regex, util, window
|
import buffer, default, dirutil, lex, regex, util, window
|
||||||
from point import Point
|
from point import Point
|
||||||
|
import buffer.color
|
||||||
|
|
||||||
from method import Method, Argument
|
from method import Method, Argument
|
||||||
|
|
||||||
|
@ -257,48 +258,89 @@ class SvnDiff3(Method):
|
||||||
|
|
||||||
class SvnBlame(Method):
|
class SvnBlame(Method):
|
||||||
'''show blame output for the current version in SVN'''
|
'''show blame output for the current version in SVN'''
|
||||||
line_re = re.compile('^ *(\d+) *([a-zA-Z0-9_]+) *([-0-9]+) *([:0-9]+) *(-\d{4}) *\(([^\)]+)\) (.*)\n$')
|
line_re = re.compile('^ *(?P<rev>\d+) *(?P<user>[a-zA-Z0-9_]+) *(?P<date>[-0-9]+) *(?P<time>[:0-9]+) *(?P<tz>-\d{4}) *\((?P<vdate>[^\)]+)\) (?P<content>.*)\n$')
|
||||||
|
prefix_fmt = '[b:d:*]%-4(rev)s [c:d:*]%-10(user)s [b:d:*]%10(date)s[d:d:*]'
|
||||||
|
def _filter(self, line):
|
||||||
|
m = self.line_re.match(line)
|
||||||
|
if not m:
|
||||||
|
raise SvnException("couldn't parse %r" % line)
|
||||||
|
return m.groupdict()
|
||||||
|
def _open_pipe(self, w, **vargs):
|
||||||
|
cmd = ("/usr/bin/svn", 'blame', '-v', w.buffer.path)
|
||||||
|
return Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
||||||
def _execute(self, w, **vargs):
|
def _execute(self, w, **vargs):
|
||||||
if not hasattr(w.buffer, 'path'):
|
if not hasattr(w.buffer, 'path'):
|
||||||
w.set_error("Buffer has no corresponding file")
|
w.set_error("Buffer has no corresponding file")
|
||||||
return
|
return
|
||||||
|
|
||||||
cmd = ("/usr/bin/svn", 'blame', '-v', w.buffer.path)
|
pipe = self._open_pipe(w, **vargs)
|
||||||
pipe = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
groups = [self._filter(line) for line in pipe.stdout]
|
||||||
|
|
||||||
linetokens = []
|
|
||||||
for line in pipe.stdout:
|
|
||||||
m = self.line_re.match(line)
|
|
||||||
if not m:
|
|
||||||
raise Exception, line
|
|
||||||
(rev, user, date, t, tz, vdate, content) = m.groups()
|
|
||||||
linetokens.append([rev, user, date, content, []])
|
|
||||||
status = pipe.wait() >> 8
|
status = pipe.wait() >> 8
|
||||||
|
|
||||||
lines = [x[3] for x in linetokens]
|
|
||||||
if w.mode.grammar:
|
if w.mode.grammar:
|
||||||
lexer = lex.Lexer(w.mode, w.mode.grammar)
|
lexer = lex.Lexer(w.mode, w.mode.grammar)
|
||||||
lextokens = [[] for l in lines]
|
tokens = list(lexer.lex([d['content'] for d in groups]))
|
||||||
for t in lexer.lex(lines):
|
groups[t.y]['tokens'] = tokens
|
||||||
linetokens[t.y][4].append(t)
|
|
||||||
|
|
||||||
lines = []
|
data = ''
|
||||||
for linetoken in linetokens:
|
for d in groups:
|
||||||
(rev, user, date, content, lextokens) = linetoken
|
if d['tokens']:
|
||||||
prefix = '[b:d:*]%-4s [c:d:*]%-10s [b:d:*]%10s[d:d:*]' % (rev, user, date)
|
suffix = ''
|
||||||
if lextokens:
|
for t in d['tokens']:
|
||||||
suffixes = []
|
code = buffer.color.get_cbuf_code(t.color)
|
||||||
for lt in lextokens:
|
suffix += code + util.cbuf_escape(t.string)
|
||||||
s = lt.string.replace('\\', '\\\\')
|
|
||||||
s = s.replace('[', '\\[').replace(']', '\\]')
|
|
||||||
suffixes.append('[%s:%s:*]%s' % (lt.color[0], lt.color[1], s))
|
|
||||||
suffix = ''.join(suffixes)
|
|
||||||
else:
|
else:
|
||||||
suffix = content + '\n'
|
suffix = d['content'] + '\n'
|
||||||
lines.append('%s %s' % (prefix, suffix))
|
data += self.prefix_fmt % d + ' ' + suffix
|
||||||
data = ''.join(lines)
|
|
||||||
|
|
||||||
if status == 0:
|
if status == 0:
|
||||||
w.application.color_data_buffer("*Blame*", data, switch_to=True)
|
w.application.color_data_buffer("*Blame*", data, switch_to=True)
|
||||||
else:
|
else:
|
||||||
w.set_error("There was an error (%s)" % (status))
|
w.set_error("There was an error (%s)" % (status))
|
||||||
|
#class SvnBlame(Method):
|
||||||
|
# '''show blame output for the current version in SVN'''
|
||||||
|
# line_re = re.compile('^ *(\d+) *([a-zA-Z0-9_]+) *([-0-9]+) *([:0-9]+) *(-\d{4}) *\(([^\)]+)\) (.*)\n$')
|
||||||
|
# def _execute(self, w, **vargs):
|
||||||
|
# if not hasattr(w.buffer, 'path'):
|
||||||
|
# w.set_error("Buffer has no corresponding file")
|
||||||
|
# return
|
||||||
|
#
|
||||||
|
# cmd = ("/usr/bin/svn", 'blame', '-v', w.buffer.path)
|
||||||
|
# pipe = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)
|
||||||
|
#
|
||||||
|
# linetokens = []
|
||||||
|
# for line in pipe.stdout:
|
||||||
|
# m = self.line_re.match(line)
|
||||||
|
# if not m:
|
||||||
|
# raise Exception, line
|
||||||
|
# (rev, user, date, t, tz, vdate, content) = m.groups()
|
||||||
|
# linetokens.append([rev, user, date, content, []])
|
||||||
|
# status = pipe.wait() >> 8
|
||||||
|
#
|
||||||
|
# lines = [x[3] for x in linetokens]
|
||||||
|
# if w.mode.grammar:
|
||||||
|
# lexer = lex.Lexer(w.mode, w.mode.grammar)
|
||||||
|
# lextokens = [[] for l in lines]
|
||||||
|
# for t in lexer.lex(lines):
|
||||||
|
# linetokens[t.y][4].append(t)
|
||||||
|
#
|
||||||
|
# lines = []
|
||||||
|
# for linetoken in linetokens:
|
||||||
|
# (rev, user, date, content, lextokens) = linetoken
|
||||||
|
# prefix = '[b:d:*]%-4s [c:d:*]%-10s [b:d:*]%10s[d:d:*]' % (rev, user, date)
|
||||||
|
# if lextokens:
|
||||||
|
# suffixes = []
|
||||||
|
# for lt in lextokens:
|
||||||
|
# s = lt.string.replace('\\', '\\\\')
|
||||||
|
# s = s.replace('[', '\\[').replace(']', '\\]')
|
||||||
|
# suffixes.append('[%s:%s:*]%s' % (lt.color[0], lt.color[1], s))
|
||||||
|
# suffix = ''.join(suffixes)
|
||||||
|
# else:
|
||||||
|
# suffix = content + '\n'
|
||||||
|
# lines.append('%s %s' % (prefix, suffix))
|
||||||
|
# data = ''.join(lines)
|
||||||
|
#
|
||||||
|
# if status == 0:
|
||||||
|
# w.application.color_data_buffer("*Blame*", data, switch_to=True)
|
||||||
|
# else:
|
||||||
|
# w.set_error("There was an error (%s)" % (status))
|
||||||
|
|
9
util.py
9
util.py
|
@ -1,4 +1,11 @@
|
||||||
import os, pwd, regex
|
import os
|
||||||
|
import pwd
|
||||||
|
import re
|
||||||
|
import regex
|
||||||
|
|
||||||
|
cbuf_re = re.compile(r'[\[\]\\]')
|
||||||
|
def cbuf_escape(s):
|
||||||
|
return cbuf_re.sub(lambda m: '\\' + m.group(0), s)
|
||||||
|
|
||||||
def normal_path(path):
|
def normal_path(path):
|
||||||
#path = os.path.realpath(path)
|
#path = os.path.realpath(path)
|
||||||
|
|
Loading…
Reference in New Issue