summaryrefslogtreecommitdiff
path: root/src/Propellor
diff options
context:
space:
mode:
authorJoey Hess2017-07-13 11:04:14 -0400
committerJoey Hess2017-07-13 11:04:14 -0400
commit632137836b39462883483a621f9dd696ce1d73cc (patch)
treea3b875afa1d8609c5b4dcaad0dff459c7174d9f3 /src/Propellor
parent3aae9ad46742d3de514380647811ae495cb83a83 (diff)
disable buffering earlier
The "fatal: Couldn't find remote ref HEAD" persists, and is intermittent so hard to be sure but it seemed that disabling buffering earlier avoided it. Now done first thing on start. I was not able to find anything that reads from stdin other than getMarked, but perhaps there is something..
Diffstat (limited to 'src/Propellor')
-rw-r--r--src/Propellor/CmdLine.hs1
-rw-r--r--src/Propellor/Protocol.hs6
-rw-r--r--src/Propellor/Spin.hs13
3 files changed, 12 insertions, 8 deletions
diff --git a/src/Propellor/CmdLine.hs b/src/Propellor/CmdLine.hs
index a36ec7f5..70bb0bf8 100644
--- a/src/Propellor/CmdLine.hs
+++ b/src/Propellor/CmdLine.hs
@@ -111,6 +111,7 @@ data CanRebuild = CanRebuild | NoRebuild
defaultMain :: [Host] -> IO ()
defaultMain hostlist = withConcurrentOutput $ do
useFileSystemEncoding
+ updatePrepare
Shim.cleanEnv
checkDebugMode
cmdline <- processCmdLine
diff --git a/src/Propellor/Protocol.hs b/src/Propellor/Protocol.hs
index ae7e0404..bc8d9327 100644
--- a/src/Propellor/Protocol.hs
+++ b/src/Propellor/Protocol.hs
@@ -53,11 +53,7 @@ sendMarked' h marker s = do
hFlush h
getMarked :: Handle -> Marker -> IO (Maybe String)
-getMarked h marker = do
- -- Avoid buffering anything in Handle, so that the data after
- -- the marker will be available to be read from the underlying Fd.
- hSetBuffering stdin NoBuffering
- go =<< catchMaybeIO (hGetLine h)
+getMarked h marker = go =<< catchMaybeIO (hGetLine h)
where
go Nothing = return Nothing
go (Just l) = case fromMarked marker l of
diff --git a/src/Propellor/Spin.hs b/src/Propellor/Spin.hs
index 7146ad4c..732ec9b7 100644
--- a/src/Propellor/Spin.hs
+++ b/src/Propellor/Spin.hs
@@ -5,6 +5,7 @@ module Propellor.Spin (
spin,
spin',
update,
+ updatePrepare,
gitPushHelper,
mergeSpin,
) where
@@ -349,14 +350,20 @@ findLastNonSpinCommit = do
spinCommitMessage :: String
spinCommitMessage = "propellor spin"
+-- Avoid buffering anything read from stdin, so that
+-- when gitPullFromUpdateServer runs git fetch, it sees all the data
+-- it expects to.
+--
+-- Should be called very early in propellor start, before anything reads
+-- from stdin.
+updatePrepare :: IO ()
+updatePrepare = hSetBuffering stdin NoBuffering
+
-- Stdin and stdout are connected to the updateServer over ssh.
-- Request that it run git upload-pack, and connect that up to a git fetch
-- to receive the data.
gitPullFromUpdateServer :: IO ()
gitPullFromUpdateServer = reqMarked NeedGitPush gitPushMarker $ \_ -> do
- -- Note that this relies on data not being buffered in the stdin
- -- Handle, since such buffered data would not be available in the
- -- FD passed to git fetch.
hin <- dup stdInput
hout <- dup stdOutput
hClose stdin