From b27760aa68d8c4cf1a1b0be3c3a5582539f857b5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 12 Mar 2012 22:53:43 -0400 Subject: Work around a bug in rsync (IMHO) introduced by openSUSE's SIP patch. openSUSE patches rsync with a patch adding SIP protocol support. https://gist.github.com/2026167 With this patch, running rsync with no hostname parameter is apparently supposed to list SIP hosts on the network. Practically, it does nothing and exits 0. git-annex uses rsync in a very special way to allow git-annex-shell to be run on the remote host, and so did not need to specify a hostname, or a file to transfer as a rsync parameter. So it sent ":", a degenerate case of "host:file". But the patch cannot differentiate ":" with no host parameter (a bug in the SIP patch surely). Results were that getting files failed, as rsync seemed to succeed, but the requested file failed to arrive. Also I think that sending files will make git-annex think a file has been transferred to the remote when really rsync does nothing. The workaround for this buggy rsync patch is to use "dummy:" as the hostname. --- debian/changelog | 1 + 1 file changed, 1 insertion(+) (limited to 'debian') diff --git a/debian/changelog b/debian/changelog index 8fc2cc330..63797f2ad 100644 --- a/debian/changelog +++ b/debian/changelog @@ -8,6 +8,7 @@ git-annex (3.20120310) UNRELEASED; urgency=low are present in the annex in memory. * status: Fixed to run in constant space. * status: More accurate display of sizes of tmp and bad keys. + * Work around a bug in rsync (IMHO) introduced by openSUSE's SIP patch. -- Joey Hess Sat, 10 Mar 2012 14:03:22 -0400 -- cgit v1.2.3 From 5b869eef911d36627174ed5a02452011effc2a14 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 14 Mar 2012 12:01:56 -0400 Subject: git-annex-shell: Runs hooks/annex-content after content is received or dropped. --- Command/Commit.hs | 7 ++++++- Git.hs | 14 ++++++++++++-- debian/changelog | 2 ++ doc/git-annex-shell.mdwn | 8 ++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) (limited to 'debian') diff --git a/Command/Commit.hs b/Command/Commit.hs index 2bb016ea0..19b0bc250 100644 --- a/Command/Commit.hs +++ b/Command/Commit.hs @@ -7,8 +7,10 @@ module Command.Commit where +import Common.Annex import Command import qualified Annex.Branch +import qualified Git def :: [Command] def = [command "commit" paramNothing seek @@ -20,4 +22,7 @@ seek = [withNothing start] start :: CommandStart start = next $ next $ do Annex.Branch.commit "update" - return True + runhook =<< (inRepo $ Git.hookPath "annex-content") + where + runhook (Just hook) = liftIO $ boolSystem hook [] + runhook Nothing = return True diff --git a/Git.hs b/Git.hs index 284bf331c..043cda5ea 100644 --- a/Git.hs +++ b/Git.hs @@ -24,12 +24,14 @@ module Git ( gitDir, configTrue, attributes, + hookPath, assertLocal, ) where import qualified Data.Map as M import Data.Char import Network.URI (uriPath, uriScheme, unEscapeString) +import System.Directory import Common import Git.Types @@ -93,17 +95,25 @@ configBare repo = maybe unknown (fromMaybe False . configTrue) $ " is a bare repository; config not read" {- Path to a repository's gitattributes file. -} -attributes :: Repo -> String +attributes :: Repo -> FilePath attributes repo | configBare repo = workTree repo ++ "/info/.gitattributes" | otherwise = workTree repo ++ "/.gitattributes" {- Path to a repository's .git directory. -} -gitDir :: Repo -> String +gitDir :: Repo -> FilePath gitDir repo | configBare repo = workTree repo | otherwise = workTree repo ".git" +{- Path to a given hook script in a repository, only if the hook exists + - and is executable. -} +hookPath :: String -> Repo -> IO (Maybe FilePath) +hookPath script repo = do + let hook = gitDir repo "hooks" script + ok <- doesFileExist hook + return $ if ok then Just hook else Nothing + {- Path to a repository's --work-tree, that is, its top. - - Note that for URL repositories, this is the path on the remote host. -} diff --git a/debian/changelog b/debian/changelog index 63797f2ad..b6b62708e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,6 +9,8 @@ git-annex (3.20120310) UNRELEASED; urgency=low * status: Fixed to run in constant space. * status: More accurate display of sizes of tmp and bad keys. * Work around a bug in rsync (IMHO) introduced by openSUSE's SIP patch. + * git-annex-shell: Runs hooks/annex-content after content is received + or dropped. -- Joey Hess Sat, 10 Mar 2012 14:03:22 -0400 diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn index 0fd77a811..89a05b1d6 100644 --- a/doc/git-annex-shell.mdwn +++ b/doc/git-annex-shell.mdwn @@ -49,6 +49,7 @@ first "/~/" or "/~user/" is expanded to the specified home directory. * commit This commits any staged changes to the git-annex branch. + It also runs the annex-content hook. # OPTIONS @@ -60,6 +61,13 @@ to git-annex-shell are: git-annex uses this to specify the UUID of the repository it was expecting git-annex-shell to access, as a sanity check. +# HOOK + +After content is received or dropped from the repository by git-annex-shell, +it runs a hook, `.git/hooks/annex-content` (or `hooks/annex-content` on a bare +repository). The hook is not currently passed any information about what +changed. + # ENVIRONMENT * GIT_ANNEX_SHELL_READONLY -- cgit v1.2.3