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

[StGit PATCH 06/13] Refactor Series.push_patch

From
David Kågedal <davidk@lysator.liu.se>
Date
Sep 14, 2007, 22:31 UTC
Message-ID
<20070914223139.7001.14801.stgit@morpheus.local>
In-Reply-To
<20070914222819.7001.55921.stgit@morpheus.local>

Refactor the Series.push_patch function to make the code flow simpler. It identifies the simple case and handles it early, and reduces the number of if statements.

Most changes are simply indentation changes.
Signed-off-by: David Kågedal <davidk@lysator.liu.se>
---
 stgit/stack.py |   87 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 46 insertions(+), 41 deletions(-)
diff --git a/stgit/stack.py b/stgit/stack.py
index f31f308..9b8ed6e 100644
--- a/stgit/stack.py
+++ b/stgit/stack.py
@@ -1054,60 +1054,65 @@ class Series(PatchSet):
         head = git.get_head()
         bottom = patch.get_bottom()
         top = patch.get_top()
-
-        ex = None
-        modified = False
-
         # top != bottom always since we have a commit for each patch
+
         if head == bottom:
-            # reset the backup information. No need for logging
+            # A fast-forward push. Just reset the backup
+            # information. No need for logging
             patch.set_bottom(bottom, backup = True)
             patch.set_top(top, backup = True)
 
             git.switch(top)
-        else:
-            # new patch needs to be refreshed.
-            # The current patch is empty after merge.
-            patch.set_bottom(head, backup = True)
-            patch.set_top(head, backup = True)
-
-            # Try the fast applying first. If this fails, fall back to the
-            # three-way merge
-            if not git.apply_diff(bottom, top):
-                # if git.apply_diff() fails, the patch requires a diff3
-                # merge and can be reported as modified
-                modified = True
-
-                # merge can fail but the patch needs to be pushed
-                try:
-                    git.merge(bottom, head, top, recursive = True)
-                except git.GitException, ex:
-                    out.error('The merge failed during "push".',
-                              'Use "refresh" after fixing the conflicts or'
-                              ' revert the operation with "push --undo".')
+            append_string(self.__applied_file, name)
+
+            unapplied.remove(name)
+            write_strings(self.__unapplied_file, unapplied)
+            return False
+
+        # Need to create a new commit an merge in the old patch
+        ex = None
+        modified = False
+
+        # new patch needs to be refreshed.
+        # The current patch is empty after merge.
+        patch.set_bottom(head, backup = True)
+        patch.set_top(head, backup = True)
+
+        # Try the fast applying first. If this fails, fall back to the
+        # three-way merge
+        if not git.apply_diff(bottom, top):
+            # if git.apply_diff() fails, the patch requires a diff3
+            # merge and can be reported as modified
+            modified = True
+
+            # merge can fail but the patch needs to be pushed
+            try:
+                git.merge(bottom, head, top, recursive = True)
+            except git.GitException, ex:
+                out.error('The merge failed during "push".',
+                          'Use "refresh" after fixing the conflicts or'
+                          ' revert the operation with "push --undo".')
 
         append_string(self.__applied_file, name)
 
         unapplied.remove(name)
         write_strings(self.__unapplied_file, unapplied)
 
-        # head == bottom case doesn't need to refresh the patch
-        if head != bottom:
-            if not ex:
-                # if the merge was OK and no conflicts, just refresh the patch
-                # The GIT cache was already updated by the merge operation
-                if modified:
-                    log = 'push(m)'
-                else:
-                    log = 'push'
-                self.refresh_patch(cache_update = False, log = log)
+        if not ex:
+            # if the merge was OK and no conflicts, just refresh the patch
+            # The GIT cache was already updated by the merge operation
+            if modified:
+                log = 'push(m)'
             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)')
-                raise StackException, str(ex)
+                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)')
+            raise StackException, str(ex)
 
         return modified
 
Previous: David KågedalNext: David Kågedal
Message 8 of 30 in “Eliminate 'top' and 'bottom' files”
  1. 00/13 Eliminate 'top' and 'bottom' filesDavid Kågedal, Sep 14, 2007
  2. 01/13 Add some more tests of "stg status" outputDavid Kågedal, Sep 14, 2007
  3. 02/13 Clear up semantics of tree_statusDavid Kågedal, Sep 14, 2007
  4. 03/13 Moved that status function to the status command fileDavid Kågedal, Sep 14, 2007
  5. David KågedalSep 14, 2007
  6. 04/13 Split Series.push_patch in twoDavid Kågedal, Sep 14, 2007
  7. 05/13 Remove dead code from push_empty_patchDavid Kågedal, Sep 14, 2007
  8. 06/13 Refactor Series.push_patchDavid Kågedal, Sep 14, 2007
  9. 07/13 Clean up Series.refresh_patchDavid Kågedal, Sep 14, 2007
  10. 08/13 Add a 'bottom' parameter to Series.refresh_patch and use itDavid Kågedal, Sep 14, 2007
  11. 09/13 Clear up the semantics of Series.new_patchDavid Kågedal, Sep 14, 2007
  12. Catalin MarinasOct 8, 2007
  13. Karl HasselströmOct 8, 2007
  14. Catalin MarinasOct 9, 2007
  15. David KågedalOct 10, 2007
  16. Catalin MarinasOct 11, 2007
  17. Karl HasselströmOct 10, 2007
  18. Karl HasselströmOct 10, 2007
  19. 10/13 Refactor Series.new_patchDavid Kågedal, Sep 14, 2007
  20. 11/13 Check bottom and invariantsDavid Kågedal, Sep 14, 2007
  21. 12/13 Remove the 'bottom' fieldDavid Kågedal, Sep 14, 2007
  22. 13/13 Remove the 'top' fieldDavid Kågedal, Sep 14, 2007
  23. Karl HasselströmSep 15, 2007
  24. David KågedalSep 16, 2007
  25. Karl HasselströmSep 17, 2007
  26. Karl HasselströmSep 15, 2007
  27. Catalin MarinasSep 16, 2007
  28. David KågedalSep 16, 2007
  29. Karl HasselströmSep 17, 2007
  30. David KågedalSep 16, 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.