stash: annotate stashes with created directories

This commit is contained in:
Josh Holtrop 2013-03-15 16:15:48 -04:00
parent 77f1965113
commit b81aed66b6

41
jsvn
View File

@ -467,6 +467,8 @@ def get_unknowns(svn):
return unknowns
def descendant_path(child, parent):
if parent == '.':
parent = os.getcwd()
if child[0] != '/' and parent[0] == '/':
child = os.getcwd() + '/' + child
elif child[0] == '/' and parent[0] != '/':
@ -560,6 +562,12 @@ def filter_add_output(fh, out, svn, config):
out.write(line)
out.write('\n')
def relpath(path):
cwdprefix = os.getcwd() + '/'
if path.startswith(cwdprefix):
return path[len(cwdprefix):]
return path
###########################################################################
# Subcommand Handlers #
###########################################################################
@ -1243,13 +1251,25 @@ def get_svn_contents_to_stash(targets, svn, out, keep, patch, externals):
s_fh = open(s_fname, 'w')
r_fh = open(r_fname, 'w')
if externals and len(targets) == 0:
targets = ['.']
proc = Popen([svn, 'status'], stdout=PIPE)
for line in iter(proc.stdout.readline, ''):
external_list = []
directories_added = []
status_cmd = [svn, 'status']
if not externals:
status_cmd += ['--ignore-externals']
status_proc = Popen(status_cmd, stdout=PIPE)
for line in iter(status_proc.stdout.readline, ''):
m = re.match(r"Performing status on external item at '(.*)':", line)
if m is not None:
targets.append(m.group(1))
external_list.append(m.group(1))
m = re.match(STATUS_LINE_REGEX, line)
if m is not None:
path = m.group(1)
if line[0] == 'A':
if os.path.isdir(path):
directories_added.append(relpath(path))
if externals and len(targets) == 0:
targets = ['.'] + external_list
svars = {
'revert_list': [],
@ -1364,6 +1384,17 @@ q: quit and abort stash
if not svars['quit']:
flush_file('')
for da in directories_added:
stash_da = len(targets) == 0
for t in targets:
if descendant_path(da, t):
stash_da = True
break
if stash_da:
s_fh.write('#dir: %s\n' % da)
if not da in svars['revert_list']:
svars['revert_list'].append(da)
s_fh.close()
r_fh.close()
if svars['quit']: