.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.
This commit is contained in:
Joey Hess 2017-12-13 14:34:32 -04:00
parent 95ec530324
commit 3cc94c1667
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38
10 changed files with 41 additions and 12 deletions

View file

@ -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"
)

View file

@ -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

View file

@ -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

View file

@ -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
)

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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]]