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.Tmp
import Utility.Env import Utility.Env
import Annex.Direct import Annex.Direct
import qualified Annex
import qualified Git import qualified Git
import qualified Git.Sha import qualified Git.Sha
import qualified Git.Ref import qualified Git.Ref
@ -44,29 +45,21 @@ start (c:ps) = liftIO . exitWith =<< ifM isDirect
<$> (inRepo . maybe Git.Ref.headSha Git.Ref.sha <$> (inRepo . maybe Git.Ref.headSha Git.Ref.sha
=<< inRepo Git.Branch.currentUnsafe) =<< inRepo Git.Branch.currentUnsafe)
setuptmpworktree tmp
exitcode <- proxy tmp exitcode <- proxy tmp
cleanupproxy tmp oldref cleanupproxy tmp oldref
return exitcode return exitcode
proxy tmp = do proxy tmp = do
usetmp <- liftIO $ Just . addEntry "GIT_WORK_TREE" tmp <$> getEnvironment 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 (isNothing <$> inRepo Git.Branch.current) $
unlessM (liftIO $ boolSystemEnv "git" [Param "checkout", Param "--", Param "."] usetmp) $ unlessM (liftIO $ boolSystemEnv "git" [Param "checkout", Param "--", Param "."] usetmp) $
error "Failed to set up proxy work tree." 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 top <- fromRepo Git.repoPath
(fs, cleanup) <- inRepo $ Git.LsFiles.notInRepo True [top] (fs, cleanup) <- inRepo $ Git.LsFiles.notInRepo True [top]
forM_ fs $ \f -> do forM_ fs $ \f -> do
@ -77,6 +70,8 @@ start (c:ps) = liftIO . exitWith =<< ifM isDirect
createLinkOrCopy f tmpf createLinkOrCopy f tmpf
liftIO $ void cleanup liftIO $ void cleanup
liftIO $ safeSystemEnv c (map Param ps) usetmp
-- To merge the changes made by the proxied command into -- To merge the changes made by the proxied command into
-- the work tree is similar to cleaning up after a -- the work tree is similar to cleaning up after a
-- direct mode merge. But, here we force updates of any -- direct mode merge. But, here we force updates of any