[PATCH] Provide access to git_dir through get_git_dir().
[git.git] / git-merge-recursive.py
index eeb3d24..689f914 100755 (executable)
@@ -10,6 +10,22 @@ from gitMergeCommon import *
 # The actual merge code
 # ---------------------
 
+originalIndexFile = os.environ.get('GIT_INDEX_FILE',
+                                   os.environ.get('GIT_DIR', '.git') + '/index')
+temporaryIndexFile = os.environ.get('GIT_DIR', '.git') + \
+                     '/merge-recursive-tmp-index'
+def setupIndex(temporary):
+    try:
+        os.unlink(temporaryIndexFile)
+    except OSError:
+        pass
+    if temporary:
+        newIndex = temporaryIndexFile
+        os.environ
+    else:
+        newIndex = originalIndexFile
+    os.environ['GIT_INDEX_FILE'] = newIndex
+
 def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
     '''Merge the commits h1 and h2, return the resulting virtual
     commit object and a flag indicating the cleaness of the merge.'''
@@ -39,13 +55,10 @@ def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
         assert(isinstance(Ms, Commit))
 
     if callDepth == 0:
-        if len(ca) > 1:
-            runProgram(['git-read-tree', h1.tree()])
-            runProgram(['git-update-cache', '-q', '--refresh'])
-        # Use the original index if we only have one common ancestor
-        
+        setupIndex(False)
         cleanCache = False
     else:
+        setupIndex(True)
         runProgram(['git-read-tree', h1.tree()])
         cleanCache = True
 
@@ -61,7 +74,7 @@ def merge(h1, h2, branch1Name, branch2Name, graph, callDepth=0):
 
     return [res, clean]
 
-getFilesRE = re.compile('([0-9]+) ([a-z0-9]+) ([0-9a-f]{40})\t(.*)')
+getFilesRE = re.compile(r'^([0-7]+) (\S+) ([0-9a-f]{40})\t(.*)$', re.S)
 def getFilesAndDirs(tree):
     files = Set()
     dirs = Set()
@@ -86,7 +99,7 @@ class CacheEntry:
         self.stages = [Stage(), Stage(), Stage()]
         self.path = path
 
-unmergedRE = re.compile('^([0-9]+) ([0-9a-f]{40}) ([1-3])\t(.*)$')
+unmergedRE = re.compile(r'^([0-7]+) ([0-9a-f]{40}) ([1-3])\t(.*)$', re.S)
 def unmergedCacheEntries():
     '''Create a dictionary mapping file names to CacheEntry
     objects. The dictionary contains one entry for every path with a
@@ -136,7 +149,10 @@ def mergeTrees(head, merge, common, branch1Name, branch2Name,
     else:
         updateArg = '-u'
 
-    runProgram(['git-read-tree', updateArg, '-m', common, head, merge])
+    [out, code] = runProgram(['git-read-tree', updateArg, '-m', common, head, merge], returnCode = True)
+    if code != 0:
+        die('git-read-tree:', out)
+
     cleanMerge = True
 
     [tree, code] = runProgram('git-write-tree', returnCode=True)
@@ -205,14 +221,14 @@ def processEntry(entry, branch1Name, branch2Name, files, dirs, cleanCache):
                 assert(False)
 
         if updateWd and updateCache:
-            runProgram(['git-update-cache', '--add', '--', path])
+            runProgram(['git-update-index', '--add', '--', path])
         elif updateCache:
-            runProgram(['git-update-cache', '--add', '--cacheinfo',
+            runProgram(['git-update-index', '--add', '--cacheinfo',
                         '0%o' % mode, sha, path])
 
     def removeFile(clean, path):
         if cleanCache or (not cleanCache and clean):
-            runProgram(['git-update-cache', '--force-remove', '--', path])
+            runProgram(['git-update-index', '--force-remove', '--', path])
 
         if not cleanCache and clean:
             try:
@@ -417,8 +433,11 @@ try:
 
     print ''
 except:
-    traceback.print_exc(None, sys.stderr)
-    sys.exit(2)
+    if isinstance(sys.exc_info()[1], SystemExit):
+        raise
+    else:
+        traceback.print_exc(None, sys.stderr)
+        sys.exit(2)
 
 if clean:
     sys.exit(0)