- # Do something here - we must at least merge the entry in
- # the cache, instead of leaving it in U(nmerged) state. In
- # fact, stg resolved does not handle that.
-
- # Do the same thing cogito does - remove the file in any case.
- os.system('git update-index --remove -- %s' % path)
-
- #if file1_hash:
- ## file deleted upstream and changed in the patch. The
- ## patch is probably going to move the changes
- ## elsewhere.
-
- #os.system('git update-index --remove -- %s' % path)
- #else:
- ## file deleted in the patch and changed upstream. We
- ## could re-delete it, but for now leave it there -
- ## and let the user check if he still wants to remove
- ## the file.
-
- ## reset the cache to the first branch
- #os.system('git update-index --cacheinfo %s %s %s'
- # % (file1_mode, file1_hash, path))
- __conflict(path)
- return 1
-
- # file does not exist in origin
- else:
- # file added in both
- if file1_hash and file2_hash:
- # files are the same
- if file1_hash == file2_hash:
- if os.system('git update-index --add --cacheinfo %s %s %s'
- % (file1_mode, file1_hash, path)) != 0:
- out.error('git update-index failed')
- __conflict(path)
- return 1
- if os.system('git checkout-index -u -f -- %s' % path):
- out.error('git checkout-index failed')
- __conflict(path)
- return 1
- if file1_mode != file2_mode:
- out.error('File "s" added in both, permissions conflict'
- % path)
- __conflict(path)
- return 1
- # files added in both but different
- else:
- out.error('File "%s" added in branches but different' % path)
- # reset the cache to the first branch
- os.system('git update-index --cacheinfo %s %s %s'
- % (file1_mode, file1_hash, path))
-
- if config.get('stgit.autoimerge') == 'yes':
- try:
- interactive_merge(path)
- except GitMergeException, ex:
- # interactive merge failed
- out.error(str(ex))
- if str(keeporig) != 'yes':
- __remove_files(orig_hash, file1_hash,
- file2_hash)
- __conflict(path)
- return 1
- # successful interactive merge
- os.system('git update-index -- %s' % path)
- __remove_files(orig_hash, file1_hash, file2_hash)
- return 0
- else:
- # no interactive merge, just mark it as conflict
- if str(keeporig) != 'yes':
- __remove_files(orig_hash, file1_hash, file2_hash)
- __conflict(path)
- return 1
- # file added in one
- elif file1_hash or file2_hash:
- if file1_hash:
- mode = file1_mode
- obj = file1_hash
- else:
- mode = file2_mode
- obj = file2_hash
- if os.system('git update-index --add --cacheinfo %s %s %s'
- % (mode, obj, path)) != 0:
- out.error('git update-index failed')
- __conflict(path)
- return 1
- __remove_files(orig_hash, file1_hash, file2_hash)
- return os.system('git checkout-index -u -f -- %s' % path)
+ three_way = False
+ files_dict = {'branch1': stages['current'],
+ 'branch2': stages['patched'],
+ 'output': filename}
+ imerger = config.get('stgit.i2merge')
+
+ if not imerger:
+ raise GitMergeException, 'No interactive merge command configured'
+
+ mtime = os.path.getmtime(filename)
+
+ out.start('Trying the interactive %s merge'
+ % (three_way and 'three-way' or 'two-way'))
+ err = os.system(imerger % files_dict)
+ out.done()
+ if err != 0:
+ raise GitMergeException, 'The interactive merge failed'
+ if not os.path.isfile(filename):
+ raise GitMergeException, 'The "%s" file is missing' % filename
+ if mtime == os.path.getmtime(filename):
+ raise GitMergeException, 'The "%s" file was not modified' % filename
+ finally:
+ # keep the merge stages?
+ if str(keeporig) != 'yes':
+ __remove_stages(filename)
+
+def clean_up(filename):
+ """Remove merge conflict stages if they were generated.
+ """
+ if str(keeporig) == 'yes':
+ __remove_stages(filename)