Added annex.skipunknown git config, that can be set to false to change the behavior of commands like `git annex get foo*`, to not skip over files/dirs that are not checked into git and are explicitly listed in the command line. Significant complexity was needed to handle git-annex add, which uses some git ls-files calls, but needs to not use --error-unmatch because of course the files are not known to git. annex.skipunknown is planned to change to default to false in a git-annex release in early 2022. There's a todo for that.
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{- git-annex command
 | 
						|
 -
 | 
						|
 - Copyright 2010-2014 Joey Hess <id@joeyh.name>
 | 
						|
 -
 | 
						|
 - Licensed under the GNU AGPL version 3 or higher.
 | 
						|
 -}
 | 
						|
 | 
						|
{-# LANGUAGE CPP #-}
 | 
						|
 | 
						|
module Command.PreCommit where
 | 
						|
 | 
						|
import Command
 | 
						|
import qualified Command.Fix
 | 
						|
import qualified Command.Smudge
 | 
						|
import Annex.Hook
 | 
						|
import Annex.Link
 | 
						|
import Annex.View
 | 
						|
import Annex.View.ViewedFile
 | 
						|
import Logs.View
 | 
						|
import Logs.MetaData
 | 
						|
import Types.View
 | 
						|
import Types.MetaData
 | 
						|
 | 
						|
import qualified Data.Set as S
 | 
						|
import qualified Data.Text as T
 | 
						|
 | 
						|
cmd :: Command
 | 
						|
cmd = command "pre-commit" SectionPlumbing
 | 
						|
	"run by git pre-commit hook"
 | 
						|
	paramPaths
 | 
						|
	(withParams seek)
 | 
						|
 | 
						|
seek :: CmdParams -> CommandSeek
 | 
						|
seek ps = do
 | 
						|
	let ww = WarnUnmatchWorkTreeItems
 | 
						|
	l <- workTreeItems ww ps
 | 
						|
	-- fix symlinks to files being committed
 | 
						|
	flip withFilesToBeCommitted l $ \f -> commandAction $
 | 
						|
		maybe stop (Command.Fix.start Command.Fix.FixSymlinks f)
 | 
						|
			=<< isAnnexLink f
 | 
						|
	-- after a merge conflict or git cherry-pick or stash, pointer
 | 
						|
	-- files in the worktree won't be populated, so populate them here
 | 
						|
	Command.Smudge.updateSmudged (Restage False)
 | 
						|
	
 | 
						|
	runAnnexHook preCommitAnnexHook
 | 
						|
 | 
						|
	-- committing changes to a view updates metadata
 | 
						|
	mv <- currentView
 | 
						|
	case mv of
 | 
						|
		Nothing -> noop
 | 
						|
		Just v -> withViewChanges
 | 
						|
			(addViewMetaData v)
 | 
						|
			(removeViewMetaData v)
 | 
						|
 | 
						|
addViewMetaData :: View -> ViewedFile -> Key -> CommandStart
 | 
						|
addViewMetaData v f k = starting "metadata" (mkActionItem (k, toRawFilePath f)) $
 | 
						|
	next $ changeMetaData k $ fromView v f
 | 
						|
 | 
						|
removeViewMetaData :: View -> ViewedFile -> Key -> CommandStart
 | 
						|
removeViewMetaData v f k = starting "metadata" (mkActionItem (k, toRawFilePath f)) $
 | 
						|
	next $ changeMetaData k $ unsetMetaData $ fromView v f
 | 
						|
 | 
						|
changeMetaData :: Key -> MetaData -> CommandCleanup
 | 
						|
changeMetaData k metadata = do
 | 
						|
	showMetaDataChange metadata
 | 
						|
	addMetaData k metadata
 | 
						|
	return True
 | 
						|
 | 
						|
showMetaDataChange :: MetaData -> Annex ()
 | 
						|
showMetaDataChange = showLongNote . unlines . concatMap showmeta . fromMetaData
 | 
						|
  where
 | 
						|
	showmeta (f, vs) = map (showmetavalue f) $ S.toList vs
 | 
						|
	showmetavalue f v = T.unpack (fromMetaField f) <> showset v <> "=" <> decodeBS (fromMetaValue v)
 | 
						|
	showset v
 | 
						|
		| isSet v = "+"
 | 
						|
		| otherwise = "-"
 |