Use --rebase instead of --no-edit in gitPull

git pull --no-edit fails with exit 128 on divergent branches because
fast-forward is impossible.  Using --rebase handles divergent histories
by rebasing local commits on top of fetched remote commits, producing
a linear history without merge commits.

- src/Converge.hs: Change gitPull from --no-edit to --rebase
- test/GitPullSpec.hs: Update rebase test to expect success and
  verify linear history (3 commits, no merge parents)
- test/*.hs: Clean up unused imports
This commit is contained in:
2026-05-13 21:48:49 -04:00
parent 65bf75cdf2
commit 4bc23b5d7c
4 changed files with 12 additions and 14 deletions
+1 -1
View File
@@ -305,7 +305,7 @@ gitPull :: RepoConfig -> IO (ExitCode, Text, Text)
gitPull repo =
runGitIn
(rcPath repo)
["pull", "--no-edit", T.unpack (rcRemote repo), T.unpack (rcBranch repo)]
["pull", "--rebase", T.unpack (rcRemote repo), T.unpack (rcBranch repo)]
-- | Check if the repository currently has merge conflicts.
hasConflicts :: FilePath -> IO Bool
-2
View File
@@ -1,11 +1,9 @@
module GitCommitSpec (spec) where
import Converge (gitCommitAll)
import Data.Text (Text)
import qualified Data.Text as T
import System.Exit (ExitCode (..))
import System.FilePath ((</>))
import System.IO (writeFile)
import Test.Hspec
import TestHelper
+11 -10
View File
@@ -5,7 +5,6 @@ import qualified Data.Text as T
import System.Directory (createDirectory)
import System.Exit (ExitCode (..))
import System.FilePath ((</>))
import System.IO (writeFile)
import System.IO.Temp (withSystemTempDirectory)
import Test.Hspec
import TestHelper
@@ -72,13 +71,15 @@ spec = do
_ <- runGitIn otherDir ["commit", "-m", "remote commit"]
_ <- runGitIn otherDir ["push", "origin", "main"]
-- Pull into local with divergent history.
-- CURRENT BEHAVIOR: git pull --no-edit fails on divergent
-- branches (exit 128). The spec requires rebase instead.
-- When --rebase is implemented, expect ExitSuccess and
-- linear history (commit count = 3).
-- Pull with --rebase: local commits are rebased on top
-- of the fetched remote commit, yielding a linear history.
let cfg = defaultRepoConfig {rcPath = localDir}
(code, _, err) <- gitPull cfg
-- Document current gap: divergent pull fails
code `shouldSatisfy` (/= ExitSuccess)
err `shouldSatisfy` ("fast-forward" `T.isInfixOf`)
(code, _, _) <- gitPull cfg
code `shouldBe` ExitSuccess
-- Rebase produces linear history: 3 commits, no merge commit
c <- commitCount localDir
c `shouldBe` 3
-- Verify no merge commits exist (each commit has exactly 1 parent)
(_, logOut, _) <- runGitIn localDir ["log", "--format=%P", "--all"]
let parentCounts = map (length . words) (lines (T.unpack logOut))
parentCounts `shouldSatisfy` all (<= 1)
-1
View File
@@ -22,7 +22,6 @@ import qualified Data.Text as T
import System.Directory (createDirectory)
import System.Exit (ExitCode)
import System.FilePath ((</>))
import System.IO (writeFile)
import System.IO.Temp (withSystemTempDirectory)
import System.Process (readProcessWithExitCode)