- 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 deleted in both or deleted in one and unchanged in the other
- elif not (file1_hash or file2_hash) \
- or file1_hash == orig_hash or file2_hash == orig_hash:
- if os.path.exists(path):
- os.remove(path)
- __remove_files(orig_hash, file1_hash, file2_hash)
- return os.system('git update-index --remove -- %s' % path)
- # file deleted in one and changed in the other
- else:
- # 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)
-
- # Unhandled case
- out.error('Unhandled merge conflict: "%s" "%s" "%s" "%s" "%s" "%s" "%s"'
- % (orig_hash, file1_hash, file2_hash,
- path,
- orig_mode, file1_mode, file2_mode))
- __conflict(path)
- return 1