aboutsummaryrefslogtreecommitdiff
path: root/Command/Proxy.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2015-08-04 14:45:16 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2015-08-04 14:45:16 -0400
commit75e322339a4f302d22d7e736b199ab9f24cbdf17 (patch)
tree424994bca4d1f90c5be0bd773986f28fdbb2b326 /Command/Proxy.hs
parenta9c156e7e70e6ec259a66e5d1f5a029ab9d17b3b (diff)
reorg
Diffstat (limited to 'Command/Proxy.hs')
-rw-r--r--Command/Proxy.hs21
1 files changed, 8 insertions, 13 deletions
diff --git a/Command/Proxy.hs b/Command/Proxy.hs
index d38a94b46..98804ef67 100644
--- a/Command/Proxy.hs
+++ b/Command/Proxy.hs
@@ -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