diff options
author | Joey Hess <joeyh@joeyh.name> | 2017-12-13 14:34:32 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2017-12-13 14:34:32 -0400 |
commit | 667617a1f2c39f338cbbcb7cab861472b5d7e438 (patch) | |
tree | 98acb4bc30370126c803936f7d374fa8093d84e8 | |
parent | 859c133f46931fc0f8e2d2b5a027d33dab2cec75 (diff) |
.noannex file
A top-level .noannex file will prevent git-annex init from being used in a
repository. This is useful for repositories that have a policy reason not
to use git-annex. The content of the file will be displayed to the user who
tries to run git-annex init.
This also affects git annex reinit and initialization via the webapp.
It does not affect automatic inits, when there's a sibling git-annex branch
already.
This commit was supported by the NSF-funded DataLad project.
-rw-r--r-- | Annex/Init.hs | 30 | ||||
-rw-r--r-- | Annex/MakeRepo.hs | 2 | ||||
-rw-r--r-- | CHANGELOG | 4 | ||||
-rw-r--r-- | Command/ConfigList.hs | 2 | ||||
-rw-r--r-- | Command/Init.hs | 2 | ||||
-rw-r--r-- | Command/Reinit.hs | 2 | ||||
-rw-r--r-- | Command/Upgrade.hs | 2 | ||||
-rw-r--r-- | Test.hs | 2 | ||||
-rw-r--r-- | doc/git-annex-init.mdwn | 5 | ||||
-rw-r--r-- | doc/todo/prevent_unwanted_init.mdwn | 2 |
10 files changed, 41 insertions, 12 deletions
diff --git a/Annex/Init.hs b/Annex/Init.hs index 0754d1f96..1d4093ff5 100644 --- a/Annex/Init.hs +++ b/Annex/Init.hs @@ -8,6 +8,7 @@ {-# LANGUAGE CPP #-} module Annex.Init ( + AutoInit(..), ensureInitialized, isInitialized, initialize, @@ -48,6 +49,23 @@ import System.Posix.User import qualified Utility.LockFile.Posix as Posix #endif +newtype AutoInit = AutoInit Bool + +checkCanInitialize :: AutoInit -> Annex a -> Annex a +checkCanInitialize (AutoInit True) a = a +checkCanInitialize (AutoInit False) a = fromRepo Git.repoWorkTree >>= \case + Nothing -> a + Just wt -> liftIO (catchMaybeIO (readFile (wt </> ".noannex"))) >>= \case + Nothing -> a + Just noannexmsg -> ifM (Annex.getState Annex.force) + ( a + , do + warning "Initialization prevented by .noannex file (use --force to override)" + unless (null noannexmsg) $ + warning noannexmsg + giveup "Not initialized." + ) + genDescription :: Maybe String -> Annex String genDescription (Just d) = return d genDescription Nothing = do @@ -59,8 +77,8 @@ genDescription Nothing = do Right username -> [username, at, hostname, ":", reldir] Left _ -> [hostname, ":", reldir] -initialize :: Maybe String -> Maybe Version -> Annex () -initialize mdescription mversion = do +initialize :: AutoInit -> Maybe String -> Maybe Version -> Annex () +initialize ai mdescription mversion = checkCanInitialize ai $ do {- Has to come before any commits are made as the shared - clone heuristic expects no local objects. -} sharedclone <- checkSharedClone @@ -70,7 +88,7 @@ initialize mdescription mversion = do ensureCommit $ Annex.Branch.create prepUUID - initialize' mversion + initialize' (AutoInit True) mversion initSharedClone sharedclone @@ -79,8 +97,8 @@ initialize mdescription mversion = do -- Everything except for uuid setup, shared clone setup, and initial -- description. -initialize' :: Maybe Version -> Annex () -initialize' mversion = do +initialize' :: AutoInit -> Maybe Version -> Annex () +initialize' ai mversion = checkCanInitialize ai $ do checkLockSupport checkFifoSupport checkCrippledFileSystem @@ -131,7 +149,7 @@ ensureInitialized :: Annex () ensureInitialized = getVersion >>= maybe needsinit checkUpgrade where needsinit = ifM Annex.Branch.hasSibling - ( initialize Nothing Nothing + ( initialize (AutoInit True) Nothing Nothing , giveup "First run: git-annex init" ) diff --git a/Annex/MakeRepo.hs b/Annex/MakeRepo.hs index e03196664..ac25c013d 100644 --- a/Annex/MakeRepo.hs +++ b/Annex/MakeRepo.hs @@ -76,7 +76,7 @@ initRepo False _ dir desc mgroup = inDir dir $ do initRepo' :: Maybe String -> Maybe StandardGroup -> Annex () initRepo' desc mgroup = unlessM isInitialized $ do - initialize desc Nothing + initialize (AutoInit False) desc Nothing u <- getUUID maybe noop (defaultStandardGroup u) mgroup {- Ensure branch gets committed right away so it is @@ -16,6 +16,10 @@ git-annex (6.20171125) UNRELEASED; urgency=medium (Previous try had a bug.) * lookupkey: Support being given an absolute filename to a file within the current git repository. + * A top-level .noannex file will prevent git-annex init from being used + in a repository. This is useful for repositories that have a policy + reason not to use git-annex. The content of the file will be displayed + to the user who tries to run git-annex init. -- Joey Hess <id@joeyh.name> Tue, 28 Nov 2017 13:48:44 -0400 diff --git a/Command/ConfigList.hs b/Command/ConfigList.hs index 383117e52..9fa4e5a44 100644 --- a/Command/ConfigList.hs +++ b/Command/ConfigList.hs @@ -45,7 +45,7 @@ findOrGenUUID = do else ifM (Annex.Branch.hasSibling <||> (isJust <$> Fields.getField Fields.autoInit)) ( do liftIO checkNotReadOnly - initialize Nothing Nothing + initialize (AutoInit True) Nothing Nothing getUUID , return NoUUID ) diff --git a/Command/Init.hs b/Command/Init.hs index e7f57c29c..8ce82a75e 100644 --- a/Command/Init.hs +++ b/Command/Init.hs @@ -45,7 +45,7 @@ start os = do perform :: InitOptions -> CommandPerform perform os = do - initialize + initialize (AutoInit False) (if null (initDesc os) then Nothing else Just (initDesc os)) (initVersion os) Annex.SpecialRemote.autoEnable diff --git a/Command/Reinit.hs b/Command/Reinit.hs index 6defa4e95..d47e83573 100644 --- a/Command/Reinit.hs +++ b/Command/Reinit.hs @@ -36,6 +36,6 @@ perform s = do then return $ toUUID s else Remote.nameToUUID s storeUUID u - initialize' Nothing + initialize' (AutoInit False) Nothing Annex.SpecialRemote.autoEnable next $ return True diff --git a/Command/Upgrade.hs b/Command/Upgrade.hs index 1c3e62695..ab245c29e 100644 --- a/Command/Upgrade.hs +++ b/Command/Upgrade.hs @@ -25,6 +25,6 @@ start :: CommandStart start = do showStart' "upgrade" Nothing whenM (isNothing <$> getVersion) $ do - initialize Nothing Nothing + initialize (AutoInit False) Nothing Nothing r <- upgrade False latestVersion next $ next $ return r @@ -1810,7 +1810,7 @@ intmpclonerepoInDirect a = intmpclonerepo $ ) where isdirect = annexeval $ do - Annex.Init.initialize Nothing Nothing + Annex.Init.initialize (Annex.Init.AutoInit False) Nothing Nothing Config.isDirect checkRepo :: Types.Annex a -> FilePath -> IO a diff --git a/doc/git-annex-init.mdwn b/doc/git-annex-init.mdwn index 29522181d..4538f54e5 100644 --- a/doc/git-annex-init.mdwn +++ b/doc/git-annex-init.mdwn @@ -23,6 +23,11 @@ mark it as dead (see [[git-annex-dead]](1)). This command is entirely safe, although usually pointless, to run inside an already initialized git-annex repository. + +A top-level `.noannex` file will prevent git-annex init from being used +in a repository. This is useful for repositories that have a policy +reason not to use git-annex. The content of the file will be displayed +to the user who tries to run git-annex init. # OPTIONS diff --git a/doc/todo/prevent_unwanted_init.mdwn b/doc/todo/prevent_unwanted_init.mdwn index 6481ce6be..b452a4735 100644 --- a/doc/todo/prevent_unwanted_init.mdwn +++ b/doc/todo/prevent_unwanted_init.mdwn @@ -6,3 +6,5 @@ annoying. --[[Joey]] This could be a git configuration setting, or it could be something checked into the repo. Either might make sense depending on the scope in which one wants to prevent the accidental init. + +> [[done]] using .noannex file. --[[Joey]] |