Leave working dir and index alone after failed (conflicting) push
authorDavid Kågedal <david@virtutech.com>
Wed, 19 Dec 2007 18:00:11 +0000 (18:00 +0000)
committerCatalin Marinas <catalin.marinas@gmail.com>
Wed, 19 Dec 2007 23:13:30 +0000 (23:13 +0000)
This leaves the index and working tree in the state that merge-recursive
left it, with unmerged files in different stages, and the non-conflicting
changes in the index.

Signed-off-by: David Kågedal <davidk@lysator.liu.se>
Signed-off-by: Karl Hasselström <kha@treskal.com>
stgit/git.py
stgit/stack.py
t/t0002-status.sh
t/t1205-push-subdir.sh

index 70c2d91..4bd17b1 100644 (file)
@@ -736,25 +736,7 @@ def merge_recursive(base, head1, head2):
         # error and we have to abort the merge
         raise GitException, err_output
 
-    # 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],
-                                 stages['2'][0], stages['3'][0]) != 0:
-            errors = True
-
-    if errors:
+    if files:
         raise GitException, 'GIT index merging failed (possible conflicts)'
 
 def merge(base, head1, head2):
index 26a2b58..d4ea802 100644 (file)
@@ -754,6 +754,7 @@ class Series(PatchSet):
         config.remove_section('branch.%s.stgit' % self.get_name())
 
     def refresh_patch(self, files = None, message = None, edit = False,
+                      empty = False,
                       show_patch = False,
                       cache_update = True,
                       author_name = None, author_email = None,
@@ -797,9 +798,16 @@ class Series(PatchSet):
         if not bottom:
             bottom = patch.get_bottom()
 
+        if empty:
+            tree_id = git.get_commit(bottom).get_tree()
+        else:
+            tree_id = None
+
         commit_id = git.commit(files = files,
                                message = descr, parents = [bottom],
                                cache_update = cache_update,
+                               tree_id = tree_id,
+                               set_head = True,
                                allowempty = True,
                                author_name = author_name,
                                author_email = author_email,
@@ -1116,12 +1124,10 @@ class Series(PatchSet):
                 log = 'push'
             self.refresh_patch(bottom = head, cache_update = False, log = log)
         else:
-            # we store the correctly merged files only for
-            # tracking the conflict history. Note that the
-            # git.merge() operations should always leave the index
-            # in a valid state (i.e. only stage 0 files)
+            # we make the patch empty, with the merged state in the
+            # working tree.
             self.refresh_patch(bottom = head, cache_update = False,
-                               log = 'push(c)')
+                               empty = True, log = 'push(c)')
             raise StackException, str(ex)
 
         return modified
index 43e1ca0..24f42cc 100755 (executable)
@@ -107,12 +107,10 @@ test_expect_success 'Make a conflicting patch' '
 '
 
 cat > expected.txt <<EOF
-? foo/bar.ancestor
-? foo/bar.current
-? foo/bar.patched
+A fie
 C foo/bar
 EOF
-test_expect_success 'Status after conflicting push' '
+test_expect_failure 'Status after conflicting push' '
     ! stg push &&
     stg status > output.txt &&
     diff -u expected.txt output.txt
@@ -121,7 +119,7 @@ test_expect_success 'Status after conflicting push' '
 cat > expected.txt <<EOF
 C foo/bar
 EOF
-test_expect_success 'Status of file' '
+test_expect_failure 'Status of file' '
     stg status foo/bar > output.txt &&
     diff -u expected.txt output.txt
 '
@@ -129,12 +127,13 @@ test_expect_success 'Status of file' '
 cat > expected.txt <<EOF
 C foo/bar
 EOF
-test_expect_success 'Status of dir' '
+test_expect_failure 'Status of dir' '
     stg status foo > output.txt &&
     diff -u expected.txt output.txt
 '
 
 cat > expected.txt <<EOF
+A fie
 EOF
 test_expect_success 'Status of other file' '
     stg status fie > output.txt &&
@@ -142,6 +141,7 @@ test_expect_success 'Status of other file' '
 '
 
 cat > expected.txt <<EOF
+A fie
 M foo/bar
 EOF
 test_expect_success 'Status after resolving the push' '
@@ -151,9 +151,10 @@ test_expect_success 'Status after resolving the push' '
 '
 
 cat > expected.txt <<EOF
+A fie
 D foo/bar
 EOF
-test_expect_success 'Status after deleting a file' '
+test_expect_failure 'Status after deleting a file' '
     rm foo/bar &&
     stg status > output.txt &&
     diff -u expected.txt output.txt
@@ -162,7 +163,7 @@ test_expect_success 'Status after deleting a file' '
 cat > expected.txt <<EOF
 D foo/bar
 EOF
-test_expect_success 'Status of disappeared newborn' '
+test_expect_failure 'Status of disappeared newborn' '
     stg refresh &&
     touch foo/bar &&
     stg add foo/bar &&
index 54a5b89..88b23c4 100755 (executable)
@@ -42,7 +42,7 @@ test_expect_success 'Modifying push from a subdir' '
     [ "$(echo $(cat foo/y.txt))" = "y0 y1 y2" ]
 '
 
-test_expect_success 'Conflicting push from subdir' '
+test_expect_failure 'Conflicting push from subdir' '
     stg pop p1 p2 &&
     [ "$(echo $(cat x.txt))" = "x0" ] &&
     [ "$(echo $(cat foo/y.txt))" = "y0" ] &&