return cache_files
-def local_changes():
+def local_changes(verbose = True):
"""Return true if there are local changes in the tree
"""
- return len(__tree_status(verbose = True)) != 0
+ return len(__tree_status(verbose = verbose)) != 0
# HEAD value cached
__head = None
return True
-def merge(base, head1, head2):
+def merge(base, head1, head2, recursive = False):
"""Perform a 3-way merge between base, head1 and head2 into the
local tree
"""
refresh_index()
- try:
- # use _output() to mask the verbose prints of the tool
- _output('git-merge-recursive %s -- %s %s' % (base, head1, head2))
- except GitException:
- pass
+ if recursive:
+ # this operation tracks renames but it is slower (used in
+ # general when pushing or picking patches)
+ try:
+ # use _output() to mask the verbose prints of the tool
+ _output('git-merge-recursive %s -- %s %s' % (base, head1, head2))
+ except GitException:
+ pass
+ else:
+ # the fast case where we don't track renames (used when the
+ # distance between base and heads is small, i.e. folding or
+ # synchronising patches)
+ if __run('git-read-tree -u -m --aggressive',
+ [base, head1, head2]) != 0:
+ raise GitException, 'git-read-tree failed (local changes maybe?)'
# check the index for unmerged entries
files = {}
# merge the unmerged files
errors = False
for path in files:
+ # remove additional files that might be generated for some
+ # newer versions of GIT
+ for suffix in [base, head1, head2]:
+ if not suffix:
+ continue
+ fname = path + '~' + suffix
+ if os.path.exists(fname):
+ os.remove(fname)
+
stages = files[path]
if gitmergeonefile.merge(stages['1'][1], stages['2'][1],
stages['3'][1], path, stages['1'][0],
"""Apply a patch onto the current or given index. There must not
be any local changes in the tree, otherwise the command fails
"""
- if base:
- orig_head = get_head()
- switch(base)
- else:
- refresh_index()
-
if diff is None:
if filename:
f = file(filename)
if filename:
f.close()
+ if base:
+ orig_head = get_head()
+ switch(base)
+ else:
+ refresh_index()
+
try:
_input_str('git-apply --index', diff)
except GitException:
f = file('.stgit-failed.patch', 'w+')
f.write(diff)
f.close()
+ print >> sys.stderr, 'Diff written to the .stgit-failed.patch file'
raise