diff: allow "..." syntax for specifying references
This commit is contained in:
parent
e2ccd9c7cb
commit
ac52eabb09
30
jsvn
30
jsvn
@ -340,6 +340,19 @@ def resolve_reference(svn, ref):
|
|||||||
# ref was not an actual file, 'trunk', a tag name, or a branch name
|
# ref was not an actual file, 'trunk', a tag name, or a branch name
|
||||||
return ('', ref)
|
return ('', ref)
|
||||||
|
|
||||||
|
def find_branched_revision(svn, branch_url, branch_path, base_path):
|
||||||
|
p = Popen([svn, 'log', '-v', branch_url], stdout=PIPE)
|
||||||
|
search_path = branch_path
|
||||||
|
for line in iter(p.stdout.readline, ''):
|
||||||
|
m = re.match('\s+A\s+(.*?)\s+\(from\s+(.*?):(\d+)\)\s*$', line)
|
||||||
|
if m is not None:
|
||||||
|
new_path, old_path, rev = m.group(1, 2, 3)
|
||||||
|
if new_path == search_path:
|
||||||
|
if old_path == base_path:
|
||||||
|
return int(rev)
|
||||||
|
search_path = old_path
|
||||||
|
return -1
|
||||||
|
|
||||||
###########################################################################
|
###########################################################################
|
||||||
# Subcommand Handlers #
|
# Subcommand Handlers #
|
||||||
###########################################################################
|
###########################################################################
|
||||||
@ -710,7 +723,7 @@ def lockable(argv, svn, out):
|
|||||||
|
|
||||||
def diff(argv, svn, out):
|
def diff(argv, svn, out):
|
||||||
for i, v in enumerate(argv):
|
for i, v in enumerate(argv):
|
||||||
m = re.match('(.*)(\.\.\.?)(.*)$', v)
|
m = re.match('(.*?)(\.\.\.?)(.*)$', v)
|
||||||
if m is not None:
|
if m is not None:
|
||||||
ref1, operator, ref2 = m.group(1, 2, 3)
|
ref1, operator, ref2 = m.group(1, 2, 3)
|
||||||
url1, path1 = resolve_reference(svn, ref1)
|
url1, path1 = resolve_reference(svn, ref1)
|
||||||
@ -721,10 +734,17 @@ def diff(argv, svn, out):
|
|||||||
if url2 == '':
|
if url2 == '':
|
||||||
sys.stderr.write('Could not resolve reference "%s"\n' % ref2)
|
sys.stderr.write('Could not resolve reference "%s"\n' % ref2)
|
||||||
return RET_ERR
|
return RET_ERR
|
||||||
if operator == '..':
|
if operator == '...':
|
||||||
# show the direct difference between the two refs
|
# amend url1 to include the pegged revision from where ref2
|
||||||
argv = argv[:i] + [url1, url2] + argv[i + 1:]
|
# originally branched from it
|
||||||
break
|
r = find_branched_revision(svn, url2, path2, path1)
|
||||||
|
if r < 0:
|
||||||
|
sys.stderr.write(('Could not find revision where "%s" ' +
|
||||||
|
'branched from "%s"\n') % (ref2, ref1))
|
||||||
|
return RET_ERR
|
||||||
|
url1 += '@%d' % r
|
||||||
|
argv = argv[:i] + [url1, url2] + argv[i + 1:]
|
||||||
|
break
|
||||||
pout = Popen([svn] + argv, stdout=PIPE).stdout
|
pout = Popen([svn] + argv, stdout=PIPE).stdout
|
||||||
for line in iter(pout.readline, ''):
|
for line in iter(pout.readline, ''):
|
||||||
colordiff(out, line)
|
colordiff(out, line)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user