"""
import sys, os
+
+# Try to detect where it is run from and set prefix and the search path.
+# It is assumed that the user installed StGIT using the --prefix= option
+prefix, bin = os.path.split(sys.path[0])
+
+if bin == 'bin' and prefix != sys.prefix:
+ major, minor = sys.version_info[0:2]
+ local_path = [os.path.join(prefix, 'lib', 'python'),
+ os.path.join(prefix, 'lib', 'python%s.%s' % (major, minor)),
+ os.path.join(prefix, 'lib', 'python%s.%s' % (major, minor),
+ 'site-packages')]
+ sys.path = local_path + sys.path
+
from stgit.config import config
from stgit.utils import append_string
+from stgit.git import get_base_dir
#
keeporig = 'yes'
-#
-# Global variables
-#
-if 'GIT_DIR' in os.environ:
- base_dir = os.environ['GIT_DIR']
-else:
- base_dir = '.git'
-
-
#
# Utility functions
#
orig = '%s.older' % path
tmp = __output('git-unpack-file %s' % orig_hash)
os.chmod(tmp, int(orig_mode, 8))
- os.rename(tmp, orig)
+ os.renames(tmp, orig)
if file1_hash:
src1 = '%s.local' % path
tmp = __output('git-unpack-file %s' % file1_hash)
os.chmod(tmp, int(file1_mode, 8))
- os.rename(tmp, src1)
+ os.renames(tmp, src1)
if file2_hash:
src2 = '%s.remote' % path
tmp = __output('git-unpack-file %s' % file2_hash)
os.chmod(tmp, int(file2_mode, 8))
- os.rename(tmp, src2)
+ os.renames(tmp, src2)
def __remove_files():
"""Remove any temporary files
def __conflict():
"""Write the conflict file for the 'path' variable and exit
"""
- append_string(os.path.join(base_dir, 'conflicts'), path)
+ append_string(os.path.join(get_base_dir(), 'conflicts'), path)
sys.exit(1)
# $2 - file in branch1 SHA1 (or empty)
# $3 - file in branch2 SHA1 (or empty)
# $4 - pathname in repository
-# $5 - orignal file mode (or empty)
+# $5 - original file mode (or empty)
# $6 - file in branch1 mode (or empty)
# $7 - file in branch2 mode (or empty)
-#print 'gitmerge.py "%s" "%s" "%s" "%s" "%s" "%s" "%s"' % tuple(sys.argv[1:8])
+#
+#print 'gitmergeonefile.py "%s" "%s" "%s" "%s" "%s" "%s" "%s"' \
+# % tuple(sys.argv[1:8])
orig_hash, file1_hash, file2_hash, path, orig_mode, file1_mode, file2_mode = \
[__str2none(x) for x in sys.argv[1:8]]
if orig_hash:
# modified in both
if file1_hash and file2_hash:
- # if modes are the same (git-read-tree probably dealed with it)
+ # if modes are the same (git-read-tree probably dealt with it)
if file1_hash == file2_hash:
- if os.system('git-update-cache --cacheinfo %s %s %s'
+ if os.system('git-update-index --cacheinfo %s %s %s'
% (file1_mode, file1_hash, path)) != 0:
- print >> sys.stderr, 'Error: git-update-cache failed'
+ print >> sys.stderr, 'Error: git-update-index failed'
__conflict()
- if os.system('git-checkout-cache -u -f -- %s' % path):
- print >> sys.stderr, 'Error: git-checkout-cache failed'
+ if os.system('git-checkout-index -u -f -- %s' % path):
+ print >> sys.stderr, 'Error: git-checkout-index failed'
__conflict()
if file1_mode != file2_mode:
print >> sys.stderr, \
'output': path }) == 0
if merge_ok:
- os.system('git-update-cache %s' % path)
+ os.system('git-update-index -- %s' % path)
__remove_files()
sys.exit(0)
else:
print >> sys.stderr, \
'Error: three-way merge tool failed for file "%s"' % path
# reset the cache to the first branch
- os.system('git-update-cache --cacheinfo %s %s %s'
+ os.system('git-update-index --cacheinfo %s %s %s'
% (file1_mode, file1_hash, path))
if keeporig != 'yes':
__remove_files()
if os.path.exists(path):
os.remove(path)
__remove_files()
- sys.exit(os.system('git-update-cache --remove %s' % path))
+ sys.exit(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()
+
# 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-cache --add --cacheinfo %s %s %s'
+ if os.system('git-update-index --add --cacheinfo %s %s %s'
% (file1_mode, file1_hash, path)) != 0:
- print >> sys.stderr, 'Error: git-update-cache failed'
+ print >> sys.stderr, 'Error: git-update-index failed'
__conflict()
- if os.system('git-checkout-cache -u -f -- %s' % path):
- print >> sys.stderr, 'Error: git-checkout-cache failed'
+ if os.system('git-checkout-index -u -f -- %s' % path):
+ print >> sys.stderr, 'Error: git-checkout-index failed'
__conflict()
if file1_mode != file2_mode:
print >> sys.stderr, \
else:
mode = file2_mode
obj = file2_hash
- if os.system('git-update-cache --add --cacheinfo %s %s %s'
+ if os.system('git-update-index --add --cacheinfo %s %s %s'
% (mode, obj, path)) != 0:
- print >> sys.stderr, 'Error: git-update-cache failed'
+ print >> sys.stderr, 'Error: git-update-index failed'
__conflict()
__remove_files()
- sys.exit(os.system('git-checkout-cache -u -f -- %s' % path))
+ sys.exit(os.system('git-checkout-index -u -f -- %s' % path))
-# Un-handled case
-print >> sys.stderr, 'Error: Un-handled merge conflict'
-print >> sys.stderr, 'gitmerge.py "%s" "%s" "%s" "%s" "%s" "%s" "%s"' \
+# Unhandled case
+print >> sys.stderr, 'Error: Unhandled merge conflict'
+print >> sys.stderr, 'gitmergeonefile.py "%s" "%s" "%s" "%s" "%s" "%s" "%s"' \
% tuple(sys.argv[1:8])
__conflict()