Support newlines in filenames.
Work around git cat-file --batch's protocol not supporting newlines by running git cat-file not batched and passing the filename as a parameter. Of course this is quite a lot less efficient, especially because it currently runs it multiple times to query for different pieces of information. Also, it has subtly different behavior when the batch process was started and then some changes were made, in which case the batch process sees the old index but this workaround sees the current index. Since that batch behavior is mostly a problem that affects the assistant and has to be worked around in it, I think I can get away with this difference. I don't know of any other problems with newlines in filenames, everything else in git I can think of supports -z. And git-annex's json output supports newlines in filenames so downstream parsers from git-annex will be ok. git-annex commands that use --batch themselves don't support newlines in input filenames; using --json --batch is currently a way around that problem. This commit was sponsored by Ewen McNeill on Patreon.
This commit is contained in:
parent
f22289e90f
commit
2aae6e84af
5 changed files with 88 additions and 15 deletions
|
@ -63,9 +63,13 @@ pipeReadLazy params repo = assertLocal repo $ do
|
|||
- Nonzero exit status is ignored.
|
||||
-}
|
||||
pipeReadStrict :: [CommandParam] -> Repo -> IO String
|
||||
pipeReadStrict params repo = assertLocal repo $
|
||||
pipeReadStrict = pipeReadStrict' hGetContentsStrict
|
||||
|
||||
{- The reader action must be strict. -}
|
||||
pipeReadStrict' :: (Handle -> IO a) -> [CommandParam] -> Repo -> IO a
|
||||
pipeReadStrict' reader params repo = assertLocal repo $
|
||||
withHandle StdoutHandle (createProcessChecked ignoreFailureProcess) p $ \h -> do
|
||||
output <- hGetContentsStrict h
|
||||
output <- reader h
|
||||
hClose h
|
||||
return output
|
||||
where
|
||||
|
@ -83,8 +87,9 @@ pipeWriteRead params writer repo = assertLocal repo $
|
|||
|
||||
{- Runs a git command, feeding it input on a handle with an action. -}
|
||||
pipeWrite :: [CommandParam] -> Repo -> (Handle -> IO ()) -> IO ()
|
||||
pipeWrite params repo = withHandle StdinHandle createProcessSuccess $
|
||||
gitCreateProcess params repo
|
||||
pipeWrite params repo = assertLocal repo $
|
||||
withHandle StdinHandle createProcessSuccess $
|
||||
gitCreateProcess params repo
|
||||
|
||||
{- Reads null terminated output of a git command (as enabled by the -z
|
||||
- parameter), and splits it. -}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue