This commit is contained in:
Joey Hess 2015-08-04 14:45:16 -04:00
parent c812018cc5
commit 6e82584305

View file

@ -13,6 +13,7 @@ import Config
import Utility.Tmp
import Utility.Env
import Annex.Direct
import qualified Annex
import qualified Git
import qualified Git.Sha
import qualified Git.Ref
@ -44,29 +45,21 @@ start (c:ps) = liftIO . exitWith =<< ifM isDirect
<$> (inRepo . maybe Git.Ref.headSha Git.Ref.sha
=<< inRepo Git.Branch.currentUnsafe)
setuptmpworktree tmp
exitcode <- proxy tmp
cleanupproxy tmp oldref
return exitcode
proxy tmp = do
usetmp <- liftIO $ Just . addEntry "GIT_WORK_TREE" tmp <$> getEnvironment
-- Set up the tmp work tree, to contain both a checkout of all
-- staged files as well as hard links (or copies) of any
-- unstaged files.
unlessM (isNothing <$> inRepo Git.Branch.current) $
unlessM (liftIO $ boolSystemEnv "git" [Param "checkout", Param "--", Param "."] usetmp) $
error "Failed to set up proxy work tree."
liftIO $ safeSystemEnv c (map Param ps) usetmp
-- Commands like git revert will fail if there's a file
-- in the work tree, or index, that would be overwritten
-- by the revert. We want that to also happen when such a command
-- is proxied.
--
-- It suffices to find any files in the real work tree that
-- are not in the index, and hard link (or copy) them
-- into the tmp work tree. This assumes that files that are in the
-- index don't need to appear in the tmp work tree.
setuptmpworktree tmp = do
top <- fromRepo Git.repoPath
(fs, cleanup) <- inRepo $ Git.LsFiles.notInRepo True [top]
forM_ fs $ \f -> do
@ -76,6 +69,8 @@ start (c:ps) = liftIO . exitWith =<< ifM isDirect
createDirectoryIfMissing True (takeDirectory tmpf)
createLinkOrCopy f tmpf
liftIO $ void cleanup
liftIO $ safeSystemEnv c (map Param ps) usetmp
-- To merge the changes made by the proxied command into
-- the work tree is similar to cleaning up after a