From 9c04d1e523dc513c64adf251046e13c4e7f7b5dc Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 11 Oct 2011 22:52:55 -0400 Subject: fix git 1.7.7 breakage * This version of git-annex only works with git 1.7.7 and newer. The breakage with old versions is subtle, and affects annex.numcopies .gitattributes settings, so be sure to upgrade git to 1.7.7. (Debian package now depends on that version.) * Don't pass absolute paths to git show-attr, as it started following symlinks when that's done in 1.7.7. Instead, use relative paths, which show-attr only handles 100% correctly in 1.7.7. Closes: #645046 Unfortunatly I can find no way to work with the old and new gits, as the old had bugs that require absolute paths, while the new doesn't like them at all. And the behavior of git show-attr in 1.7.7. is the same as eg, git add of an absolute path to a symlink, so seems entirely intentional and not likely to change. --- Git.hs | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) (limited to 'Git.hs') diff --git a/Git.hs b/Git.hs index b87f2a265..173deba6e 100644 --- a/Git.hs +++ b/Git.hs @@ -547,36 +547,23 @@ configMap = config {- Efficiently looks up a gitattributes value for each file in a list. -} checkAttr :: Repo -> String -> [FilePath] -> IO [(FilePath, String)] checkAttr repo attr files = do - -- git check-attr wants files that are absolute (or relative to the - -- top of the repo). But we're passed files relative to the current - -- directory. Convert to absolute, and then convert the filenames - -- in its output back to relative. - cwd <- getCurrentDirectory - let top = workTree repo - let absfiles = map (absPathFrom cwd) files (_, fromh, toh) <- hPipeBoth "git" (toCommand params) _ <- forkProcess $ do hClose fromh - hPutStr toh $ join "\0" absfiles + hPutStr toh $ join "\0" files hClose toh exitSuccess hClose toh - s <- hGetContents fromh - return $ map (topair cwd top) $ lines s + (map topair . lines) <$> hGetContents fromh where params = gitCommandLine repo [Param "check-attr", Param attr, Params "-z --stdin"] - topair cwd top l = (relfile, value) + topair l = (file, value) where - relfile - | startswith cwd' file = drop (length cwd') file - | otherwise = relPathDirToFile top' file file = decodeGitFile $ join sep $ take end bits value = bits !! end end = length bits - 1 bits = split sep l sep = ": " ++ attr ++ ": " - cwd' = cwd ++ "/" - top' = top ++ "/" {- Some git commands output encoded filenames. Decode that (annoyingly - complex) encoding. -} -- cgit v1.2.3