From 97ae01a31a4ee335aca4440acfa15e0a49e41034 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 17 Jan 2011 10:46:13 -0500 Subject: [PATCH] implement branch[es], tags, switch subcommands --- jsvn | 121 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 102 insertions(+), 19 deletions(-) diff --git a/jsvn b/jsvn index c4ef76e..dec805e 100755 --- a/jsvn +++ b/jsvn @@ -1,8 +1,23 @@ #!/usr/bin/env python # Josh's SVN wrapper script +# # Recommend putting in path as 'jsvn' or something other than 'svn' and # making an alias svn='jsvn' +# +# The script detects if you have colorsvn and colordiff and uses them for +# appropriate subcommands if so. +# +# Implemented subcommands: +# branch[es] +# - with no arguments, list branches with '*' by the current one +# - with an argument, create a new branch from the current one +# tags +# - list tags +# switch +# - switch to 'trunk', branch name, or tag name without having to specify +# the full URL +# - falls back to Subversion "switch" if doesn't exist import sys import os @@ -30,9 +45,17 @@ def getSVNRoot(svn): parts = url.split('/') for i in range(0, len(parts)): if parts[i] in ('trunk', 'tags', 'branches'): - return '/'.join(parts[:i-1]) + return '/'.join(parts[:i]) return '' +def getSVNRelPath(svn): + url = getSVNURL(svn) + parts = url.split('/') + for i in range(0, len(parts) - 1): + if parts[i] == 'trunk' or i > 0 and parts[i-1] in ('tags', 'branches'): + return '/' + '/'.join(parts[i+1:]) + return '/' + def getSVNTopLevel(svn): url = getSVNURL(svn) parts = url.split('/') @@ -41,6 +64,69 @@ def getSVNTopLevel(svn): return '/'.join(parts[:i+1]) return '' +def getSVNBranchList(svn): + colist = [] + root = getSVNRoot(svn) + lines = Popen([svn, 'ls', root + '/branches'], + stdout=PIPE).communicate()[0].split('\n') + for line in lines: + if re.match(r'^\s*$', line) is None: + colist.append(re.sub(r'/$', '', line)) + return colist + +def getSVNTagList(svn): + colist = [] + root = getSVNRoot(svn) + lines = Popen([svn, 'ls', root + '/tags'], + stdout=PIPE).communicate()[0].split('\n') + for line in lines: + if re.match(r'^\s*$', line) is None: + colist.append(re.sub(r'/$', '', line)) + return colist + +def branch(argv, svn): + if len(argv) < 2: + bl = ['trunk'] + getSVNBranchList(svn) + current = getSVNTopLevel(svn).split('/')[-1] + for b in bl: + sys.stdout.write('*' if b == current else ' ') + sys.stdout.write(b + '\n') + return 0 + branch_name = argv[1] + origin = getSVNTopLevel(svn) + root = getSVNRoot(svn) + if origin == '' or root == '': + sys.stderr.write("Could not determine origin/root URL\n") + return 1 + comment = "Created '%s' branch" % branch_name + branch_path = root + '/branches/' + branch_name + Popen([svn, 'copy', origin, branch_path, '-m', comment]).wait() + return 0 + +def tags(argv, svn): + tl = getSVNTagList(svn) + for t in tl: + sys.stdout.write(t + '\n') + return 0 + +def switch(argv, svn, colorsvn): + if len(argv) < 2: + return -1 + root = getSVNRoot(svn) + path = getSVNRelPath(svn) + if argv[1] == 'trunk': + Popen([svn, 'switch', root + '/trunk' + path]).wait() + return 0 + bl = getSVNBranchList(svn) + if argv[1] in bl: + Popen([svn, 'switch', root + '/branches/' + argv[1] + path]).wait() + return 0 + tl = getSVNTagList(svn) + if argv[1] in tl: + Popen([svn, 'switch', root + '/tags/' + argv[1] + path]).wait() + return 0 + return -2 + def main(argv): realsvn = findInPath('svn') colorsvn = findInPath('colorsvn') @@ -50,25 +136,22 @@ def main(argv): sys.stderr.write("Error: 'svn' not found in path\n") return 1 - if len(argv) >= 1 and argv[0] == "branch": - if len(argv) < 2: - sys.stderr.write("Must supply branch name\n") - return 2 - branch_name = argv[1] - origin = getSVNTopLevel(realsvn) - root = getSVNRoot(realsvn) - if origin == '' or root == '': - sys.stderr.write("Could not determine origin/root URL\n") - return 1 - comment = "Created '%s' branch" % branch_name - branch_path = root + '/branches/' + branch_name - Popen([realsvn, 'copy', origin, branch_path, '-m', comment]).wait() - return 0 + if len(argv) >= 1: + if argv[0] == "branch" or argv[0] == "branches": + return branch(argv, realsvn) - if len(argv) >= 1 and argv[0] == "diff" and colordiff != '': - diff_out = Popen([realsvn] + argv, stdout=PIPE).stdout - Popen([colordiff], stdin=diff_out).wait() - return 0 + if argv[0] == "switch": + r = switch(argv, realsvn, colorsvn) + if r >= 0: + return r + + if argv[0] == "tags": + return tags(argv, realsvn) + + if argv[0] == "diff" and colordiff != '': + diff_out = Popen([realsvn] + argv, stdout=PIPE).stdout + Popen([colordiff], stdin=diff_out).wait() + return 0 if colorsvn != '': Popen([colorsvn] + argv).wait()