deal with ignoreinode config setting
Improve handling of directory special remotes with importtree=yes whose ignoreinode setting has been changed. (By either enableremote or by upgrading to commit 3e2f1f73cbc5fc10475745b3c3133267bd1850a7.) When getting a file from such a remote, accept the content that would have been accepted with the previous ignoreinode setting. After a change to ignoreinode, importing a tree from the remote will re-import and generate new content identifiers using the new config. So when ignoreinode has changed to no, the inodes will be learned, and after that point, a change in an inode will be detected as a change. Before re-importing, a change in an inode will be ignored, as it was before the ignoreinode change. This seems acceptble, because the user can re-import immediately if they urgently need to add inodes. And if not, they'll do it sometime, presumably, and the change will take effect then. Sponsored-by: Erik Bjäreholt on Patreon
This commit is contained in:
parent
4a1030d51d
commit
1fe9cf7043
4 changed files with 34 additions and 2 deletions
|
@ -13,6 +13,10 @@ git-annex (10.20220823) UNRELEASED; urgency=medium
|
||||||
all keys via --all or in a bare repo.
|
all keys via --all or in a bare repo.
|
||||||
(Introduced in version 8.20200720)
|
(Introduced in version 8.20200720)
|
||||||
* vicfg: Include mincopies configuration.
|
* vicfg: Include mincopies configuration.
|
||||||
|
* Improve handling of directory special remotes with importtree=yes whose
|
||||||
|
ignoreinode setting has been changed. When getting a file from such a
|
||||||
|
remote, accept the content that would have been accepted with the
|
||||||
|
previous ignoreinode setting.
|
||||||
|
|
||||||
-- Joey Hess <id@joeyh.name> Mon, 29 Aug 2022 15:03:04 -0400
|
-- Joey Hess <id@joeyh.name> Mon, 29 Aug 2022 15:03:04 -0400
|
||||||
|
|
||||||
|
|
|
@ -390,10 +390,24 @@ mkContentIdentifier (IgnoreInodes ii) f st =
|
||||||
then toInodeCache' noTSDelta f st 0
|
then toInodeCache' noTSDelta f st 0
|
||||||
else toInodeCache noTSDelta f st
|
else toInodeCache noTSDelta f st
|
||||||
|
|
||||||
|
-- Since ignoreinodes can be changed by enableremote, and since previous
|
||||||
|
-- versions of git-annex ignored inodes by default, treat two content
|
||||||
|
-- idenfiers as the same if they differ only by one having the inode
|
||||||
|
-- ignored.
|
||||||
guardSameContentIdentifiers :: a -> ContentIdentifier -> Maybe ContentIdentifier -> a
|
guardSameContentIdentifiers :: a -> ContentIdentifier -> Maybe ContentIdentifier -> a
|
||||||
guardSameContentIdentifiers cont old new
|
guardSameContentIdentifiers _ _ Nothing = giveup "file not found"
|
||||||
| new == Just old = cont
|
guardSameContentIdentifiers cont old (Just new)
|
||||||
|
| new == old = cont
|
||||||
|
| ignoreinode new == old = cont
|
||||||
|
| new == ignoreinode old = cont
|
||||||
| otherwise = giveup "file content has changed"
|
| otherwise = giveup "file content has changed"
|
||||||
|
where
|
||||||
|
ignoreinode cid@(ContentIdentifier b) =
|
||||||
|
case readInodeCache (decodeBS b) of
|
||||||
|
Nothing -> cid
|
||||||
|
Just ic ->
|
||||||
|
let ic' = replaceInode 0 ic
|
||||||
|
in ContentIdentifier (encodeBS (showInodeCache ic'))
|
||||||
|
|
||||||
importKeyM :: IgnoreInodes -> RawFilePath -> ExportLocation -> ContentIdentifier -> ByteSize -> MeterUpdate -> Annex (Maybe Key)
|
importKeyM :: IgnoreInodes -> RawFilePath -> ExportLocation -> ContentIdentifier -> ByteSize -> MeterUpdate -> Annex (Maybe Key)
|
||||||
importKeyM ii dir loc cid sz p = do
|
importKeyM ii dir loc cid sz p = do
|
||||||
|
|
|
@ -32,6 +32,7 @@ module Utility.InodeCache (
|
||||||
inodeCacheToMtime,
|
inodeCacheToMtime,
|
||||||
inodeCacheToEpochTime,
|
inodeCacheToEpochTime,
|
||||||
inodeCacheEpochTimeRange,
|
inodeCacheEpochTimeRange,
|
||||||
|
replaceInode,
|
||||||
|
|
||||||
SentinalFile(..),
|
SentinalFile(..),
|
||||||
SentinalStatus(..),
|
SentinalStatus(..),
|
||||||
|
@ -125,6 +126,10 @@ inodeCacheEpochTimeRange i =
|
||||||
let t = inodeCacheToEpochTime i
|
let t = inodeCacheToEpochTime i
|
||||||
in (t-1, t+1)
|
in (t-1, t+1)
|
||||||
|
|
||||||
|
replaceInode :: FileID -> InodeCache -> InodeCache
|
||||||
|
replaceInode inode (InodeCache (InodeCachePrim _ sz mtime)) =
|
||||||
|
InodeCache (InodeCachePrim inode sz mtime)
|
||||||
|
|
||||||
{- For backwards compatability, support low-res mtime with no
|
{- For backwards compatability, support low-res mtime with no
|
||||||
- fractional seconds. -}
|
- fractional seconds. -}
|
||||||
data MTime = MTimeLowRes EpochTime | MTimeHighRes POSIXTime
|
data MTime = MTimeLowRes EpochTime | MTimeHighRes POSIXTime
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
[[!comment format=mdwn
|
||||||
|
username="joey"
|
||||||
|
subject="""comment 3"""
|
||||||
|
date="2022-09-16T17:43:38Z"
|
||||||
|
content="""
|
||||||
|
I've made the directory special remote treat content identifiers
|
||||||
|
that differ only in one having the inode set to 0. Which will avoid it
|
||||||
|
failing in the situation I showed.
|
||||||
|
"""]]
|
Loading…
Reference in a new issue