giveup changed to filter out control characters. (It is too low level to make it use StringContainingQuotedPath.) error still does not, but it should only be used for internal errors, where the message is not attacker-controlled. Changed a lot of existing error to giveup when it is not strictly an internal error. Of course, other exceptions can still be thrown, either by code in git-annex, or a library, that include some attacker-controlled value. This does not guard against those. Sponsored-by: Noam Kremen on Patreon
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.1 KiB
			
		
	
	
	
		
			Haskell
		
	
	
	
	
	
{- git-annex command
 | 
						|
 -
 | 
						|
 - Copyright 2014 Joey Hess <id@joeyh.name>
 | 
						|
 -
 | 
						|
 - Licensed under the GNU AGPL version 3 or higher.
 | 
						|
 -}
 | 
						|
 | 
						|
module Command.ResolveMerge where
 | 
						|
 | 
						|
import Command
 | 
						|
import qualified Git
 | 
						|
import Git.Sha
 | 
						|
import qualified Git.Branch
 | 
						|
import Annex.AutoMerge
 | 
						|
 | 
						|
import qualified Data.ByteString as S
 | 
						|
 | 
						|
cmd :: Command
 | 
						|
cmd = command "resolvemerge" SectionPlumbing
 | 
						|
	"resolve merge conflicts"
 | 
						|
	paramNothing (withParams seek)
 | 
						|
 | 
						|
seek :: CmdParams -> CommandSeek
 | 
						|
seek = withNothing (commandAction start)
 | 
						|
 | 
						|
start :: CommandStart
 | 
						|
start = starting "resolvemerge" (ActionItemOther Nothing) (SeekInput []) $ do
 | 
						|
	us <- fromMaybe nobranch <$> inRepo Git.Branch.current
 | 
						|
	d <- fromRawFilePath <$> fromRepo Git.localGitDir
 | 
						|
	let merge_head = d </> "MERGE_HEAD"
 | 
						|
	them <- fromMaybe (giveup nomergehead) . extractSha
 | 
						|
		<$> liftIO (S.readFile merge_head)
 | 
						|
	ifM (resolveMerge (Just us) them False)
 | 
						|
		( do
 | 
						|
			void $ commitResolvedMerge Git.Branch.ManualCommit
 | 
						|
			next $ return True
 | 
						|
		, giveup "Merge conflict could not be automatically resolved."
 | 
						|
		)
 | 
						|
  where
 | 
						|
	nobranch = giveup "No branch is currently checked out."
 | 
						|
	nomergehead = giveup "No SHA found in .git/merge_head"
 |