packages feed

git-annex-10.20261026: Remote/Helper/ReadOnly.hs

{- Adds readonly support to remotes.
 -
 - Copyright 2013-2026 Joey Hess <id@joeyh.name>
 -
 - Licensed under the GNU AGPL version 3 or higher.
 -}

module Remote.Helper.ReadOnly
	( adjustReadOnly
	, forceReadOnly
	, readonlyStoreKey
	, readonlyStorer
	, readonlyRemoveKey
	, readonlyWarning
	) where

import Annex.Common
import Types.Remote
import Types.StoreRetrieve
import Types.Import
import Types.Export
import Utility.Metered

{- Adds support for read-only remotes, by replacing the
 - methods that write to a remote with dummies that fail.
 -
 - Note that disabling git pushes to remotes is not handled here.
 -}
adjustReadOnly :: Remote -> Remote
adjustReadOnly r
	| remoteAnnexReadOnly (gitconfig r) = makeReadOnly readonlyWarning r
	| otherwise = r

{- Force a remote that would not usually be read-only to be read-only,
 - with a message explaining why. -}
forceReadOnly :: String -> Remote -> Remote
forceReadOnly msg r
	| remoteAnnexReadOnly (gitconfig r) = makeReadOnly readonlyWarning r
	| otherwise = makeReadOnly msg r

makeReadOnly :: String -> Remote -> Remote
makeReadOnly msg r = r
	{ storeKey = readonlyStoreKey msg
	, removeKey = readonlyRemoveKey msg
	, repairRepo = Nothing
	, exportActions = (exportActions r)
		{ storeExport = readonlyStoreExport msg
		, removeExport = readonlyRemoveExport msg
		, removeExportDirectory = Just (readonlyRemoveExportDirectory msg)
		, renameExport = Nothing
		}
	, exportImportActions = (exportImportActions r)
		{ storeExportWithContentIdentifier = readonlyStoreExportWithContentIdentifier msg
		, removeExportWithContentIdentifier = readonlyRemoveExportWithContentIdentifier msg
		, removeExportDirectoryWhenEmpty = Just (readonlyRemoveExportDirectory msg)
		}
	}

readonlyStoreKey :: String -> Key -> AssociatedFile -> Maybe OsPath -> MeterUpdate -> Annex ()
readonlyStoreKey msg _ _ _ _ = readonlyFail msg

readonlyRemoveKey :: String -> Maybe SafeDropProof -> Key -> Annex ()
readonlyRemoveKey msg _ _ = readonlyFail msg

readonlyStorer :: String -> Storer
readonlyStorer msg _ _ _ = readonlyFail msg

readonlyStoreExport :: String -> OsPath -> Key -> ExportLocation -> MeterUpdate -> Annex ()
readonlyStoreExport msg _ _ _ _ = readonlyFail msg

readonlyRemoveExport :: String -> Key -> ExportLocation -> Annex ()
readonlyRemoveExport msg _ _ = readonlyFail msg

readonlyRemoveExportDirectory :: String -> ExportDirectory -> Annex ()
readonlyRemoveExportDirectory msg _ = readonlyFail msg

readonlyStoreExportWithContentIdentifier :: String -> OsPath -> Key -> ExportLocation -> [ContentIdentifier] -> MeterUpdate -> Annex ContentIdentifier
readonlyStoreExportWithContentIdentifier msg _ _ _ _ _ = readonlyFail msg

readonlyRemoveExportWithContentIdentifier :: String -> Key -> ExportLocation -> [ContentIdentifier] -> Annex ()
readonlyRemoveExportWithContentIdentifier msg _ _ _ = readonlyFail msg

readonlyFail :: String -> Annex a
readonlyFail = giveup

readonlyWarning :: String
readonlyWarning = "this remote is readonly"