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 3e2f1f73cb.)
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.
 | 
			
		||||
    (Introduced in version 8.20200720)
 | 
			
		||||
  * 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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -390,10 +390,24 @@ mkContentIdentifier (IgnoreInodes ii) f st =
 | 
			
		|||
			then toInodeCache' noTSDelta f st 0
 | 
			
		||||
			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 cont old new
 | 
			
		||||
	| new == Just old = cont
 | 
			
		||||
guardSameContentIdentifiers _ _ Nothing = giveup "file not found"
 | 
			
		||||
guardSameContentIdentifiers cont old (Just new)
 | 
			
		||||
	| new == old = cont
 | 
			
		||||
	| ignoreinode new == old = cont
 | 
			
		||||
	| new == ignoreinode old = cont
 | 
			
		||||
	| 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 ii dir loc cid sz p = do
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ module Utility.InodeCache (
 | 
			
		|||
	inodeCacheToMtime,
 | 
			
		||||
	inodeCacheToEpochTime,
 | 
			
		||||
	inodeCacheEpochTimeRange,
 | 
			
		||||
	replaceInode,
 | 
			
		||||
 | 
			
		||||
	SentinalFile(..),
 | 
			
		||||
	SentinalStatus(..),
 | 
			
		||||
| 
						 | 
				
			
			@ -125,6 +126,10 @@ inodeCacheEpochTimeRange i =
 | 
			
		|||
	let t = inodeCacheToEpochTime i
 | 
			
		||||
	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
 | 
			
		||||
 - fractional seconds. -}
 | 
			
		||||
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…
	
	Add table
		Add a link
		
	
		Reference in a new issue