From 7543e3f19e51ec22ada8d2fea3a1d31cd7355bdb Mon Sep 17 00:00:00 2001 From: moculus Date: Mon, 17 Mar 2008 06:17:51 +0000 Subject: [PATCH] splitting the method package --HG-- branch : pmacs2 --- application.py | 11 +- method/__init__.py | 393 --------------------------------------------- method/cvs.py | 223 +++++++++++++++++++++++++ method/svn.py | 184 +++++++++++++++++++++ 4 files changed, 414 insertions(+), 397 deletions(-) create mode 100644 method/cvs.py create mode 100644 method/svn.py diff --git a/application.py b/application.py index 7292d18..671aba5 100755 --- a/application.py +++ b/application.py @@ -118,10 +118,13 @@ class Application(object): # initialize our methods self.methods = {} - for name in dir(method): - cls = eval("method.%s" % name) - if hasattr(cls, '_is_method') and cls._is_method: - self.methods[cls._name()] = cls() + for name in ('method', 'method.svn', 'method.cvs'): + exec("import %s" % name) + mod = eval(name) + for mname in dir(mod): + cls = eval("%s.%s" % (name, mname)) + if hasattr(cls, '_is_method') and cls._is_method: + self.methods[cls._name()] = cls() # create all the insert methods for the character ranges we like for c in string.letters + string.digits + string.punctuation: diff --git a/method/__init__.py b/method/__init__.py index 6116055..51bf1d7 100644 --- a/method/__init__.py +++ b/method/__init__.py @@ -1105,399 +1105,6 @@ class FileDiff(Method): w.application.data_buffer("*Diff*", errdata, switch_to=True) w.set_error("There was an error: %d exited with status %s" % (pid, status)) -class SvnCommit(Method): - '''diff the current file with the version in SVN''' - args = [Argument("msg", type=type(""), prompt="Commit Message: ")] - regex = re.compile(r'^Committed revision ([0-9]+)\.$') - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "svn ci -m %r %r" % (vargs['msg'], path) - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - lines = data.split('\n') - - if status == 0: - try: - for line in lines: - m = self.regex.match(line) - if m: - w.set_error("Committed [%s]" % (m.group(1))) - return - except: - pass - w.set_error("Problems with SVN commit: %d" % status) - w.application.data_buffer("*Commit*", repr(lines), switch_to=True) - -class SvnStatus(Method): - column = { - ' ': 'Unmodified', - 'A': 'Added', - 'C': 'Conflicted', - 'D': 'Deleted', - 'I': 'Ignored', - 'M': 'Modified', - 'R': 'Replaced', - 'X': 'External', - '?': 'Unknown', - '!': 'Missing', - '~': 'Obstructed', - } - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - cmd = "svn status -v %r" % path - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if status != 0: - w.set_error("Problems with 'svn status': %d" % status) - return - - c = data[0] - status = self.column.get(c, 'Error (%s)' % c) - fields = data[6:].split() - try: - (rrev, lrev, lauthor, filename) = fields - except: - raise Exception, '%r %r' % (fields, data[6:]) - - w.set_error('%s %s %s/%s [%s]' % (filename, status, rrev, lrev, lauthor)) -class SvnDiff(Method): - '''diff the current file with the version in SVN''' - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cmd = "svn diff %r" % w.buffer.path - (status, data) = commands.getstatusoutput(cmd) - - if status == 0: - if data: - w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') - w.set_error("Differences were found") - else: - w.set_error("No difference found") - else: - w.set_error("There was an error (%s)" % (status)) -class SvnDiff2(Method): - '''diff the current file with the version in SVN''' - rev_regex = re.compile('^[0-9]+$') - args = [Argument("revision", type=type(""), prompt="Old Revision: ")] - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - rev = vargs['revision'] - if not self.rev_regex.match(rev): - w.set_error("Could not parse revision: %r" % rev) - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "svn diff -r %s %r" % (rev, path) - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if data: - w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') - w.set_error("Differences were found") - else: - w.set_error("No difference found") -class SvnDiff3(Method): - '''diff the current file with the version in SVN''' - rev_regex = re.compile('^[0-9]+$') - args = [Argument("revision1", type=type(""), prompt="Old Revision: "), - Argument("revision2", type=type(""), prompt="New Revision: ")] - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - rev1 = vargs['revision1'] - if not self.rev_regex.match(rev1): - w.set_error("Could not parse revision1: %r" % rev) - return - - rev2 = vargs['revision2'] - if not self.rev_regex.match(rev2): - w.set_error("Could not parse revision2: %r" % rev) - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "svn diff -r %s -r %s %r" % (rev1, rev2, path) - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if data: - w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') - w.set_error("Differences were found") - else: - w.set_error("No difference found") -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}) *\(([^\)]+)\) (.*)$') - 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) - - lines = [] - 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() - lines.append("%-4s %-10s %10s %s\n" % (rev, user, date, content)) - data = ''.join(lines) - - status = pipe.wait() >> 8 - if status == 0: - w.application.data_buffer("*Blame*", data, switch_to=True, modename='blame') - else: - w.set_error("There was an error (%s)" % (status)) - -class CvsCommit(Method): - '''diff the current file with the version in CVS''' - args = [Argument("msg", type=type(""), prompt="Commit Message: ")] - regex = re.compile('^new revision: ([0-9.]+); previous revision: ([0-9.]+)$') - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "cvs ci -m %r %r" % (vargs['msg'], path) - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - lines = data.split('\n') - - if status == 0: - for line in lines: - m = self.regex.match(line) - if m: - w.set_error("Committed [%s -> %s]" % (m.group(2), m.group(1))) - return - w.set_error("Up-to-date") - else: - w.set_error("Problems with CVS commit: %d" % status) - w.application.data_buffer("*Commit*", data, switch_to=True) - -class CvsStatus(Method): - regex1 = re.compile('^File: (.+?) *\tStatus: (.*?)$') - regex2 = re.compile('^ Working revision:\t([0-9\.]+)$') - regex3 = re.compile('^ Repository revision:\t([0-9\.]+)\t(.*)$') - regex4 = re.compile('^ Sticky Tag:\t\t\((.*)\)$') - regex5 = re.compile('^ Sticky Date:\t\t\((.*)\)$') - regex6 = re.compile('^ Sticky Options:\t\((.*)\)$') - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "cvs status %r" % path - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if status != 0: - w.set_error("Problems with CVS status: %d" % status) - return - - lines = data.split('\n') - - if lines[0].startswith('cvs status: nothing known about '): - w.set_error('File is not under CVS control') - return - - m = self.regex1.match(lines[1]) - assert m, "regex1 %r" % lines[1] - ffile = m.group(1) - fstatus = m.group(2) - - m = self.regex2.match(lines[3]) - assert m, "regex2 %r" % lines[3] - wrev = m.group(1) - - m = self.regex3.match(lines[4]) - assert m, "regex3 %r" % lines[4] - rrev = m.group(1) - rpath = m.group(2) - - m = self.regex4.match(lines[5]) - assert m, "regex4 %r" % lines[5] - stag = m.group(1) - - m = self.regex5.match(lines[6]) - assert m, "regex5 %r" % lines[6] - sdate = m.group(1) - - m = self.regex6.match(lines[7]) - assert m, "regex6 %r" % lines[7] - soptions = m.group(1) - - w.set_error('%s %s %s/%s [%s|%s|%s]' % (ffile, fstatus, - wrev, rrev, stag, - sdate, soptions)) - -class CvsDiff(Method): - '''diff the current file with the version in CVS''' - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "cvs diff -u %r" % path - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if status == 0: - w.set_error("No difference found") - else: - w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') - w.set_error("Differences were found") -class CvsDiff2(Method): - '''diff the current file with the version in CVS''' - rev_regex = re.compile('^[0-9]+\.[0-9]+$') - args = [Argument("revision", type=type(""), prompt="Old Revision: ")] - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - rev = vargs['revision'] - if not self.rev_regex.match(rev): - w.set_error("Could not parse revision: %r" % rev) - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "cvs diff -r %s -u %r" % (rev, path) - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if status == 0: - w.set_error("No difference found") - else: - w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') - w.set_error("Differences were found") -class CvsDiff3(Method): - '''diff the current file with the version in CVS''' - rev_regex = re.compile('^[0-9]+\.[0-9]+$') - args = [Argument("revision1", type=type(""), prompt="Old Revision: "), - Argument("revision2", type=type(""), prompt="New Revision: ")] - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - rev1 = vargs['revision1'] - if not self.rev_regex.match(rev1): - w.set_error("Could not parse revision1: %r" % rev) - return - - rev2 = vargs['revision2'] - if not self.rev_regex.match(rev2): - w.set_error("Could not parse revision2: %r" % rev) - return - - - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = "cvs diff -r %s -r %s -u %r" % (rev1, rev2, path) - (status, data) = commands.getstatusoutput(cmd) - status = status >> 8 - - if status == 0: - w.set_error("No difference found") - else: - w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') - w.set_error("Differences were found") -class CvsBlame(Method): - '''show blame output for the current version in SVN''' - line_re = re.compile('^([0-9.]+) +\(*([a-zA-Z0-9_]+) +([-0-9A-Za-z]+)\): (.*)$') - def _execute(self, w, **vargs): - if not hasattr(w.buffer, 'path'): - w.set_error("Buffer has no corresponding file") - return - - cwd = os.getcwd() + os.path.sep - path = w.buffer.path - if path.startswith(cwd): - path = path[len(cwd):] - - cmd = ("/usr/bin/cvs", 'annotate', path) - pipe = Popen(cmd, stdout=PIPE) - - tokens = [] - max_rev = 0 - max_user = 0 - for line in pipe.stdout: - m = self.line_re.match(line) - if not m: - raise Exception, line - (rev, user, date, content) = m.groups() - max_rev = max(max_rev, len(rev)) - max_user = max(max_user, len(user)) - tokens.append((rev, user, date, content)) - - lines = [] - fmt = "%%-%ds %%-%ds %%9s %%s\n" % (max_rev, max_user) - for (rev, user, date, content) in tokens: - lines.append(fmt % (rev, user, date, content)) - data = ''.join(lines) - - status = pipe.wait() >> 8 - if status == 0: - w.application.data_buffer("*Blame*", data, switch_to=True, modename='blame') - else: - w.set_error("There was an error (%s)" % (status)) - class ShowBindingsBuffer(Method): '''Dump all keybindings for current mode into a new buffer''' def _execute(self, w, **vargs): diff --git a/method/cvs.py b/method/cvs.py new file mode 100644 index 0000000..9dc085f --- /dev/null +++ b/method/cvs.py @@ -0,0 +1,223 @@ +import os, commands, re, sets, tempfile +from subprocess import Popen, PIPE, STDOUT + +import buffer, default, dirutil, regex, util, window +from point import Point + +from method import DATATYPES, Method, Argument + +class CvsCommit(Method): + '''diff the current file with the version in CVS''' + args = [Argument("msg", type=type(""), prompt="Commit Message: ")] + regex = re.compile('^new revision: ([0-9.]+); previous revision: ([0-9.]+)$') + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs ci -m %r %r" % (vargs['msg'], path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + lines = data.split('\n') + + if status == 0: + for line in lines: + m = self.regex.match(line) + if m: + w.set_error("Committed [%s -> %s]" % (m.group(2), m.group(1))) + return + w.set_error("Up-to-date") + else: + w.set_error("Problems with CVS commit: %d" % status) + w.application.data_buffer("*Commit*", data, switch_to=True) + +class CvsStatus(Method): + regex1 = re.compile('^File: (.+?) *\tStatus: (.*?)$') + regex2 = re.compile('^ Working revision:\t([0-9\.]+)$') + regex3 = re.compile('^ Repository revision:\t([0-9\.]+)\t(.*)$') + regex4 = re.compile('^ Sticky Tag:\t\t\((.*)\)$') + regex5 = re.compile('^ Sticky Date:\t\t\((.*)\)$') + regex6 = re.compile('^ Sticky Options:\t\((.*)\)$') + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs status %r" % path + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status != 0: + w.set_error("Problems with CVS status: %d" % status) + return + + lines = data.split('\n') + + if lines[0].startswith('cvs status: nothing known about '): + w.set_error('File is not under CVS control') + return + + m = self.regex1.match(lines[1]) + assert m, "regex1 %r" % lines[1] + ffile = m.group(1) + fstatus = m.group(2) + + m = self.regex2.match(lines[3]) + assert m, "regex2 %r" % lines[3] + wrev = m.group(1) + + m = self.regex3.match(lines[4]) + assert m, "regex3 %r" % lines[4] + rrev = m.group(1) + rpath = m.group(2) + + m = self.regex4.match(lines[5]) + assert m, "regex4 %r" % lines[5] + stag = m.group(1) + + m = self.regex5.match(lines[6]) + assert m, "regex5 %r" % lines[6] + sdate = m.group(1) + + m = self.regex6.match(lines[7]) + assert m, "regex6 %r" % lines[7] + soptions = m.group(1) + + w.set_error('%s %s %s/%s [%s|%s|%s]' % (ffile, fstatus, + wrev, rrev, stag, + sdate, soptions)) + +class CvsDiff(Method): + '''diff the current file with the version in CVS''' + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs diff -u %r" % path + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status == 0: + w.set_error("No difference found") + else: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.set_error("Differences were found") +class CvsDiff2(Method): + '''diff the current file with the version in CVS''' + rev_regex = re.compile('^[0-9]+\.[0-9]+$') + args = [Argument("revision", type=type(""), prompt="Old Revision: ")] + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + rev = vargs['revision'] + if not self.rev_regex.match(rev): + w.set_error("Could not parse revision: %r" % rev) + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs diff -r %s -u %r" % (rev, path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status == 0: + w.set_error("No difference found") + else: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.set_error("Differences were found") +class CvsDiff3(Method): + '''diff the current file with the version in CVS''' + rev_regex = re.compile('^[0-9]+\.[0-9]+$') + args = [Argument("revision1", type=type(""), prompt="Old Revision: "), + Argument("revision2", type=type(""), prompt="New Revision: ")] + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + rev1 = vargs['revision1'] + if not self.rev_regex.match(rev1): + w.set_error("Could not parse revision1: %r" % rev) + return + + rev2 = vargs['revision2'] + if not self.rev_regex.match(rev2): + w.set_error("Could not parse revision2: %r" % rev) + return + + + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "cvs diff -r %s -r %s -u %r" % (rev1, rev2, path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status == 0: + w.set_error("No difference found") + else: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.set_error("Differences were found") +class CvsBlame(Method): + '''show blame output for the current version in SVN''' + line_re = re.compile('^([0-9.]+) +\(*([a-zA-Z0-9_]+) +([-0-9A-Za-z]+)\): (.*)$') + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = ("/usr/bin/cvs", 'annotate', path) + pipe = Popen(cmd, stdout=PIPE) + + tokens = [] + max_rev = 0 + max_user = 0 + for line in pipe.stdout: + m = self.line_re.match(line) + if not m: + raise Exception, line + (rev, user, date, content) = m.groups() + max_rev = max(max_rev, len(rev)) + max_user = max(max_user, len(user)) + tokens.append((rev, user, date, content)) + + lines = [] + fmt = "%%-%ds %%-%ds %%9s %%s\n" % (max_rev, max_user) + for (rev, user, date, content) in tokens: + lines.append(fmt % (rev, user, date, content)) + data = ''.join(lines) + + status = pipe.wait() >> 8 + if status == 0: + w.application.data_buffer("*Blame*", data, switch_to=True, modename='blame') + else: + w.set_error("There was an error (%s)" % (status)) diff --git a/method/svn.py b/method/svn.py new file mode 100644 index 0000000..96df1c2 --- /dev/null +++ b/method/svn.py @@ -0,0 +1,184 @@ +import os, commands, re, sets, tempfile +from subprocess import Popen, PIPE, STDOUT + +import buffer, default, dirutil, regex, util, window +from point import Point + +from method import DATATYPES, Method, Argument + +class SvnCommit(Method): + '''diff the current file with the version in SVN''' + args = [Argument("msg", type=type(""), prompt="Commit Message: ")] + regex = re.compile(r'^Committed revision ([0-9]+)\.$') + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "svn ci -m %r %r" % (vargs['msg'], path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + lines = data.split('\n') + + if status == 0: + try: + for line in lines: + m = self.regex.match(line) + if m: + w.set_error("Committed [%s]" % (m.group(1))) + return + except: + pass + w.set_error("Problems with SVN commit: %d" % status) + w.application.data_buffer("*Commit*", repr(lines), switch_to=True) + +class SvnStatus(Method): + column = { + ' ': 'Unmodified', + 'A': 'Added', + 'C': 'Conflicted', + 'D': 'Deleted', + 'I': 'Ignored', + 'M': 'Modified', + 'R': 'Replaced', + 'X': 'External', + '?': 'Unknown', + '!': 'Missing', + '~': 'Obstructed', + } + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + cmd = "svn status -v %r" % path + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if status != 0: + w.set_error("Problems with 'svn status': %d" % status) + return + + c = data[0] + status = self.column.get(c, 'Error (%s)' % c) + fields = data[6:].split() + try: + (rrev, lrev, lauthor, filename) = fields + except: + raise Exception, '%r %r' % (fields, data[6:]) + + w.set_error('%s %s %s/%s [%s]' % (filename, status, rrev, lrev, lauthor)) +class SvnDiff(Method): + '''diff the current file with the version in SVN''' + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + cmd = "svn diff %r" % w.buffer.path + (status, data) = commands.getstatusoutput(cmd) + + if status == 0: + if data: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.set_error("Differences were found") + else: + w.set_error("No difference found") + else: + w.set_error("There was an error (%s)" % (status)) +class SvnDiff2(Method): + '''diff the current file with the version in SVN''' + rev_regex = re.compile('^[0-9]+$') + args = [Argument("revision", type=type(""), prompt="Old Revision: ")] + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + rev = vargs['revision'] + if not self.rev_regex.match(rev): + w.set_error("Could not parse revision: %r" % rev) + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "svn diff -r %s %r" % (rev, path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if data: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.set_error("Differences were found") + else: + w.set_error("No difference found") +class SvnDiff3(Method): + '''diff the current file with the version in SVN''' + rev_regex = re.compile('^[0-9]+$') + args = [Argument("revision1", type=type(""), prompt="Old Revision: "), + Argument("revision2", type=type(""), prompt="New Revision: ")] + def _execute(self, w, **vargs): + if not hasattr(w.buffer, 'path'): + w.set_error("Buffer has no corresponding file") + return + + rev1 = vargs['revision1'] + if not self.rev_regex.match(rev1): + w.set_error("Could not parse revision1: %r" % rev) + return + + rev2 = vargs['revision2'] + if not self.rev_regex.match(rev2): + w.set_error("Could not parse revision2: %r" % rev) + return + + cwd = os.getcwd() + os.path.sep + path = w.buffer.path + if path.startswith(cwd): + path = path[len(cwd):] + + cmd = "svn diff -r %s -r %s %r" % (rev1, rev2, path) + (status, data) = commands.getstatusoutput(cmd) + status = status >> 8 + + if data: + w.application.data_buffer("*Diff*", data, switch_to=True, modename='diff') + w.set_error("Differences were found") + else: + w.set_error("No difference found") +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}) *\(([^\)]+)\) (.*)$') + 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) + + lines = [] + 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() + lines.append("%-4s %-10s %10s %s\n" % (rev, user, date, content)) + data = ''.join(lines) + + status = pipe.wait() >> 8 + if status == 0: + w.application.data_buffer("*Blame*", data, switch_to=True, modename='blame') + else: + w.set_error("There was an error (%s)" % (status))