git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[StGIT PATCH] Leave working dir and index alone after failed (conflicting) push

From
Karl Hasselström <kha@treskal.com>
Date
Aug 22, 2007, 10:29 UTC
Message-ID
<20070822102902.30714.47437.stgit@yoghurt>
In-Reply-To
<20070822095954.GE30748@diana.vm.bytemark.co.uk>
From: David Kågedal <davidk@lysator.liu.se>

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>
---

This is David's patch 2 and 3 clumped together, so that there is no intermediate stage where the test suite fails.

 stgit/git.py   |   20 +-------------------
 stgit/stack.py |   18 +++++++++++++-----
 2 files changed, 14 insertions(+), 24 deletions(-)
diff --git a/stgit/git.py b/stgit/git.py
index 170c5d1..676314a 100644
--- a/stgit/git.py
+++ b/stgit/git.py
@@ -723,25 +723,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):
diff --git a/stgit/stack.py b/stgit/stack.py
index 95f20f1..123efac 100644
--- a/stgit/stack.py
+++ b/stgit/stack.py
@@ -732,6 +732,7 @@ class Series(PatchSet):
         config.unset(self.format_version_key())
 
     def refresh_patch(self, files = None, message = None, edit = False,
+                      empty = False,
                       show_patch = False,
                       cache_update = True,
                       author_name = None, author_email = None,
@@ -781,9 +782,16 @@ class Series(PatchSet):
 
         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,
@@ -1086,11 +1094,11 @@ class Series(PatchSet):
                     log = 'push'
                 self.refresh_patch(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)
-                self.refresh_patch(cache_update = False, log = 'push(c)')
+                # We make the patch empty, with the merged state in
+                # the working tree and index just like after a failed
+                # git merge.
+                self.refresh_patch(cache_update = False, empty = True,
+                                   log = 'push(c)')
                 raise StackException, str(ex)
 
         return modified
Previous: Karl HasselströmNext: David Kågedal
Message 12 of 18 in “Use git conflict handling on push”
  1. 0/6 Use git conflict handling on pushDavid Kågedal, Aug 20, 2007
  2. 1/6 Split git.merge into two functionsDavid Kågedal, Aug 20, 2007
  3. 2/6 Don't try to merge files that merge-recursive already mergedDavid Kågedal, Aug 20, 2007
  4. 3/6 Don't touch state after conflict in pushDavid Kågedal, Aug 20, 2007
  5. 4/6 Added a test case to check what happens when push finds a conflictDavid Kågedal, Aug 20, 2007
  6. 5/6 Simplify merge_recursiveDavid Kågedal, Aug 20, 2007
  7. 6/6 Use the output from merge-recursive to list conflictsDavid Kågedal, Aug 20, 2007
  8. Karl HasselströmAug 22, 2007
  9. David KågedalAug 22, 2007
  10. Karl HasselströmAug 22, 2007
  11. Karl HasselströmAug 22, 2007
  12. Leave working dir and index alone after failed (conflicting) pushKarl Hasselström, Aug 22, 2007
  13. David KågedalAug 20, 2007
  14. Junio C HamanoAug 20, 2007
  15. Uwe Kleine-KönigAug 21, 2007
  16. Junio C HamanoAug 22, 2007
  17. Karl HasselströmAug 22, 2007
  18. Catalin MarinasAug 23, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.