From dc672863c36fcbc9512809f056d564f7ce996629 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 13 Aug 2019 15:14:17 -0400 Subject: [PATCH] init: Install working hook scripts when run on a crippled filesystem and on Windows --- Annex/Hook.hs | 8 +--- CHANGELOG | 4 ++ Git/Hook.hs | 15 ++++++- .../windows_fails_import_export_tests.mdwn | 45 ++++++++++--------- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/Annex/Hook.hs b/Annex/Hook.hs index 3bd958b8e5..b56b3bf6cc 100644 --- a/Annex/Hook.hs +++ b/Annex/Hook.hs @@ -13,7 +13,6 @@ module Annex.Hook where import Annex.Common import qualified Git.Hook as Git -import Config import qualified Annex import Utility.Shell @@ -57,11 +56,8 @@ mkHookScript s = unlines ] hookWrite :: Git.Hook -> Annex () -hookWrite h = - -- cannot have git hooks in a crippled filesystem (no execute bit) - unlessM crippledFileSystem $ - unlessM (inRepo $ Git.hookWrite h) $ - hookWarning h "already exists, not configuring" +hookWrite h = unlessM (inRepo $ Git.hookWrite h) $ + hookWarning h "already exists, not configuring" hookUnWrite :: Git.Hook -> Annex () hookUnWrite h = unlessM (inRepo $ Git.hookUnWrite h) $ diff --git a/CHANGELOG b/CHANGELOG index 24e9bde411..49a85bde43 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -23,6 +23,10 @@ git-annex (7.20190731) UNRELEASED; urgency=medium it applies the same adjustment to the branch before merging it. * test: Add pass using adjusted unlocked branch. * Fix some test suite failures on Windows. + * init: Install working hook scripts when run on a crippled filesystem + and on Windows. If your repository was set up by an old version + of git-annex that omitted the hooks, you can simply re-run git-annex init + to install them. -- Joey Hess Thu, 01 Aug 2019 00:11:56 -0400 diff --git a/Git/Hook.hs b/Git/Hook.hs index 411a52ea45..9fcc0c66d5 100644 --- a/Git/Hook.hs +++ b/Git/Hook.hs @@ -31,7 +31,18 @@ hookFile :: Hook -> Repo -> FilePath hookFile h r = localGitDir r "hooks" hookName h {- Writes a hook. Returns False if the hook already exists with a different - - content. Upgrades old scripts. -} + - content. Upgrades old scripts. + - + - This can install hooks on both filesystem like FAT that do not support + - execute bits, and on Windows. + - + - If the filesystem does not support execute bits, it's typically mounted + - such that all files have the execute bit set. So just write the hook + - and ignore failure to make it executable. + - + - On Windows, git will run hooks that are not executable. The hook + - is run with a bundled bash, so should start with #!/bin/sh + -} hookWrite :: Hook -> Repo -> IO Bool hookWrite h r = ifM (doesFileExist f) ( expectedContent h r >>= \case @@ -45,7 +56,7 @@ hookWrite h r = ifM (doesFileExist f) go = do viaTmp writeFile f (hookScript h) p <- getPermissions f - setPermissions f $ p {executable = True} + void $ tryIO $ setPermissions f $ p {executable = True} return True {- Removes a hook. Returns False if the hook contained something else, and diff --git a/doc/bugs/windows_fails_import_export_tests.mdwn b/doc/bugs/windows_fails_import_export_tests.mdwn index 51b1ef2330..f502f9c96b 100644 --- a/doc/bugs/windows_fails_import_export_tests.mdwn +++ b/doc/bugs/windows_fails_import_export_tests.mdwn @@ -1,27 +1,30 @@ -Two test failures on windows in the import/export tests. The tests fail on -a v7 adjusted unlocked branch, but pass a direct mode. It may be that -there's a problem with the tests outside of windows on an adjusted branch. +Windows test suite fails the import/export tests. -The first test fails to export all annexed files to a directory special -remote. +It imports a file, but the worktree file remains a unlocked pointer +file. So the test fails. Running `git annex smudge--update` fixed the +file content. - export foo sha1foo failed +Reproduced outside the test suite, and tried with GIT_TRACE=1. +When `git-annex merge remote/master``runs git merge, it does then smudge +--clean the imported files. But smudge --update does not get run. The +post-merge hook should run it. -No indication of why it failed. +Ahh -- on windows, hooks are not written, because the code skips that +for a crippled filesystem, assuming it has no execute bit. -> Update: Now it shows the problem, which is that the exported file is -> locked so statting it fails. --[[Joey]] +So, this is both a problem on windows and on crippled filesystems. +The user needs to run smudge --update themselves, or maybe git-annex +can do it sometimes. Eg, `git annex merge` (and sync) could certianly +smudge --update when on a crippled filesystem. And that would be +enough to fix the test suite. -The second test fails in an import. It gets as far as updating foo/master, -but then when it tries to merge that branch, there's a merge conflict. -That merge conflict seems very likely due to being on an adjusted branch; -foo/master will have the non-adjusted version of the file and merging it -into a branch where it's been adjusted does sound like there could be a -legitimate merge conflict. +But if a user is on a crippled filesystem with an adjusted branch, and +they do some other operation that would be covered by post-merge or +post-checkout hook, they will be surprised to find unpopulated pointer +files in the working tree. -If so, note that the git-annex-import man page suggests doing just such a -merge, so perhaps the docs will need to be updated, if some git-annex -command is instead used to do the merge. --[[Joey]] - -> Probably down to only one test failure now after some fixes. Have not -> checked. --[[Joey]] +I think this can be avoided. On eg fat on linux, all files are executable, +so the hook can be installed and will work. On Windows, a hook can start +with #!/bin/sh and not be executable, and will be run by the bash bundled +with git for windows. +--[[Joey]]