#!/usr/bin/env python2.6
"""
srcer (a.k.a. Mapper)
srcer is a command-line wrapper for svn. If you've ever found yourself typing
long svn URL's to perform server-side operations, you can use srcer to simplify
your life.
srcer maps kewords to SVN urls, so that instead of typing:
$ svn lock svn://svn.chromium.org/chrome/trunk/src/chrome/app/nibs/Preferences.xib
You can type:
$ srcer lock //chrome/chrome/app/nibs/Preferences.xib
To add a keyword, type:
$ srcer -add chrome svn://svn.chromium.org/chrome/trunk/src
To remove:
$ srcer -rm chrome
To list:
$ srcer -ls
It's that simple.
"""
import json
import os
import re
import sys
MAP_PATH = os.path.expanduser("~/.src_mapper")
def ReplaceArgs(name_map, args):
"""Iterates over the name map and replaces any keywords."""
for name in name_map:
args = map(lambda a: re.sub(r'^//' + name + '(/|$)', name_map[name] + '/', a), args)
return args
# srcer always takes at least 2 args.
if len(sys.argv) < 2:
print "srcer -ls, -add name url, -rm name, svn_command //keyword/url"
sys.exit()
# Try loading the map into memory.
if os.path.exists(MAP_PATH):
map_fp = open(MAP_PATH, 'r')
MAP = json.load(map_fp)
map_fp.close()
else:
MAP = {}
# srcer -add name url
if sys.argv[1] == "-add":
if len(sys.argv) != 4:
print "add <name> <url>"
sys.exit(1)
MAP[sys.argv[2]] = sys.argv[3]
map_fp = open(MAP_PATH, 'w')
json.dump(MAP, map_fp, indent=2)
map_fp.close()
# srcer -rm name
elif sys.argv[1] == "-rm":
if len(sys.argv) != 3:
print "rm <name>"
sys.exit(1)
del MAP[sys.argv[2]]
map_fp = open(MAP_PATH, 'w')
json.dump(MAP, map_fp, indent=2)
map_fp.close()
# srcer -ls
elif sys.argv[1] == "-ls":
max_len = 0
for name in MAP:
if len(name) > max_len:
max_len = len(name)
print 'SOURCE MAPPINGS:'
for name in MAP:
print ' ' + name.rjust(max_len) + ' : ' + MAP[name]
# Execute command
else:
args = ['svn']
args.extend(ReplaceArgs(MAP, sys.argv[1:]))
os.execvp('svn', args)