packages feed

git-annex 5.20151116 → 5.20151208

raw patch · 79 files changed

+2983/−235 lines, 79 files

Files

Annex/Content.hs view
@@ -56,6 +56,7 @@ import Types.Key import Utility.DataUnits import Utility.CopyFile+import Utility.Metered import Config import Git.SharedRepository import Annex.Perms@@ -658,8 +659,9 @@ 			Annex.Branch.commit "update"  {- Downloads content from any of a list of urls. -}-downloadUrl :: [Url.URLString] -> FilePath -> Annex Bool-downloadUrl urls file = go =<< annexWebDownloadCommand <$> Annex.getGitConfig+downloadUrl :: Key -> MeterUpdate -> [Url.URLString] -> FilePath -> Annex Bool+downloadUrl k p urls file = concurrentMeteredFile file (Just p) k $+	go =<< annexWebDownloadCommand <$> Annex.getGitConfig   where 	go Nothing = do 		a <- ifM commandProgressDisabled@@ -697,18 +699,21 @@ 				) 		) -{- Blocks writing to an annexed file, and modifies file permissions to- - allow reading it, per core.sharedRepository setting. -}+{- Normally, blocks writing to an annexed file, and modifies file+ - permissions to allow reading it.+ -+ - When core.sharedRepository is set, the write bits are not removed from+ - the file, but instead the appropriate group write bits are set. This is+ - necessary to let other users in the group lock the file.+ -} freezeContent :: FilePath -> Annex () freezeContent file = unlessM crippledFileSystem $ 	withShared go   where 	go GroupShared = liftIO $ modifyFileMode file $-		removeModes writeModes .-		addModes [ownerReadMode, groupReadMode]+		addModes [ownerReadMode, groupReadMode, ownerWriteMode, groupWriteMode] 	go AllShared = liftIO $ modifyFileMode file $-		removeModes writeModes .-		addModes readModes+		addModes (readModes ++ writeModes) 	go _ = liftIO $ modifyFileMode file $ 		removeModes writeModes . 		addModes [ownerReadMode]
Annex/ReplaceFile.hs view
@@ -27,9 +27,10 @@ replaceFile file action = do 	misctmpdir <- fromRepo gitAnnexTmpMiscDir 	void $ createAnnexDirectory misctmpdir-	let basetmp = takeFileName file+	filemax <- liftIO $ fileNameLengthLimit misctmpdir+	let basetmp = take (filemax `div` 2) (takeFileName file) 	withTmpDirIn misctmpdir basetmp $ \tmpdir -> do-		let tmpfile = tmpdir <> basetmp+		let tmpfile = tmpdir </> basetmp 		action tmpfile 		liftIO $ replaceFileFrom tmpfile file 
Assistant/Threads/XMPPClient.hs view
@@ -7,7 +7,7 @@  module Assistant.Threads.XMPPClient where -import Assistant.Common+import Assistant.Common hiding (ProtocolError) import Assistant.XMPP import Assistant.XMPP.Client import Assistant.NetMessager
Assistant/WebApp/Common.hs view
@@ -13,5 +13,5 @@ import Assistant.WebApp.Form as X import Assistant.WebApp.Types as X import Assistant.WebApp.RepoId as X-import Utility.Yesod as X hiding (textField, passwordField, insertBy, replace, joinPath, deleteBy, delete, insert, Key, Option)+import Utility.Yesod as X hiding (textField, passwordField, insertBy, replace, joinPath, deleteBy, delete, insert, Key, Option, PermissionDenied) import Data.Text as X (Text)
Assistant/WebApp/Configurators/Preferences.hs view
@@ -118,5 +118,5 @@  inAutoStartFile :: Annex Bool inAutoStartFile = do-	here <- fromRepo Git.repoPath+	here <- liftIO . absPath =<< fromRepo Git.repoPath 	any (`equalFilePath` here) <$> liftIO readAutoStartFile
Backend/Hash.hs view
@@ -108,17 +108,16 @@  {- A key's checksum is checked during fsck. -} checkKeyChecksum :: Hash -> Key -> FilePath -> Annex Bool-checkKeyChecksum hash key file = go `catchHardwareFault` hwfault+checkKeyChecksum hash key file = catchIOErrorType HardwareFault hwfault $ do+	fast <- Annex.getState Annex.fast+	mstat <- liftIO $ catchMaybeIO $ getFileStatus file+	case (mstat, fast) of+		(Just stat, False) -> do+			filesize <- liftIO $ getFileSize' file stat+			showAction "checksum"+			check <$> hashFile hash file filesize+		_ -> return True   where-	go = do-		fast <- Annex.getState Annex.fast-		mstat <- liftIO $ catchMaybeIO $ getFileStatus file-		case (mstat, fast) of-			(Just stat, False) -> do-				filesize <- liftIO $ getFileSize' file stat-				showAction "checksum"-				check <$> hashFile hash file filesize-			_ -> return True 	expected = keyHash key 	check s 		| s == expected = True
BuildFlags.hs view
@@ -67,6 +67,8 @@ #endif #ifdef WITH_CONCURRENTOUTPUT 	, "ConcurrentOutput"+#else+#warning Building without ConcurrentOutput #endif #ifdef WITH_DNS 	, "DNS"
CHANGELOG view
@@ -1,3 +1,30 @@+git-annex (5.20151208) unstable; urgency=medium++  * Build with -j1 again to get reproducible build.+  * Display progress meter in -J mode when copying from a local git repo,+    to a local git repo, and from a remote git repo.+  * Display progress meter in -J mode when downloading from the web.+  * map: Improve display of git remotes with non-ssh urls, including http+    and gcrypt. +  * When core.sharedRepository is set, annex object files are not made mode+    444, since that prevents a user other than the file owner from locking+    them. Instead, a mode such as 664 is used in this case.+  * tahoe: Include tahoe capabilities in whereis display.+  * import: Changed to honor annex.largefiles settings.+  * addurl, importfeed: Changed to honor annex.largefiles settings,+    when the content of the url is downloaded. (Not when using --fast or+    --relaxed.)+  * webapp: Fix bugs that could result in a relative path such as "."+    being written to ~/.config/git-annex/autostart, and ignore any such +    relative paths in the file.+    This was a reversion caused by the relative path changes in 5.20150113.+  * dropunused: Make more robust when trying to drop an object that has+    already been dropped.+  * Fix reversion in handling of long filenames, particularly when using+    addurl/importfeed, which was introduced in the previous release.++ -- Joey Hess <id@joeyh.name>  Tue, 08 Dec 2015 11:14:03 -0400+ git-annex (5.20151116) unstable; urgency=medium    * Use concurrent-output library when configured with -fConcurrentOutput.
Command/Add.hs view
@@ -73,14 +73,18 @@ startSmall :: FilePath -> CommandStart startSmall file = do 	showStart "add" file+	next $ next $ addSmall file++addSmall :: FilePath -> Annex Bool+addSmall file = do 	showNote "non-large file; adding content to git repository"-	next $ performAdd file+	addFile file -performAdd :: FilePath -> CommandPerform-performAdd file = do+addFile :: FilePath -> Annex Bool+addFile file = do 	ps <- forceParams 	Annex.Queue.addCommand "add" (ps++[Param "--"]) [file]-	next $ return True+	return True  {- The add subcommand annexes a file, generating a key for it using a  - backend, and then moving it into the annex directory and setting up@@ -97,7 +101,7 @@ 				| otherwise -> do 					showStart "add" file 					next $ if isSymbolicLink s-						then performAdd file+						then next $ addFile file 						else perform file 	addpresent key = ifM isDirect 		( do
Command/AddUrl.hs view
@@ -29,6 +29,7 @@ import Types.UrlContents import Config import Annex.Content.Direct+import Annex.FileMatcher import Logs.Location import Utility.Metered import qualified Annex.Transfer as Transfer@@ -252,9 +253,9 @@ 				tmp <- fromRepo $ gitAnnexTmpObjectLocation key 				showOutput 				ok <- Transfer.notifyTransfer Transfer.Download (Just file) $-					Transfer.download webUUID key (Just file) Transfer.forwardRetry Transfer.noObserver $ const $ do+					Transfer.download webUUID key (Just file) Transfer.forwardRetry Transfer.noObserver $ \p -> do 						liftIO $ createDirectoryIfMissing True (parentDir tmp)-						downloadUrl [videourl] tmp+						downloadUrl key p [videourl] tmp 				if ok 					then do 						cleanup webUUID quviurl file key (Just tmp)@@ -294,9 +295,9 @@ downloadWeb :: URLString -> Url.UrlInfo -> FilePath -> Annex (Maybe Key) downloadWeb url urlinfo file = do 	let dummykey = addSizeUrlKey urlinfo $ Backend.URL.fromUrl url Nothing-	let downloader f _ = do+	let downloader f p = do 		showOutput-		downloadUrl [url] f+		downloadUrl dummykey p [url] f 	showAction $ "downloading " ++ url ++ " " 	downloadWith downloader dummykey webUUID url file @@ -335,17 +336,28 @@ addSizeUrlKey urlinfo key = key { keySize = Url.urlSize urlinfo }  cleanup :: UUID -> URLString -> FilePath -> Key -> Maybe FilePath -> Annex ()-cleanup u url file key mtmp = do-	when (isJust mtmp) $-		logStatus key InfoPresent-	setUrlPresent u key url-	Command.Add.addLink file key Nothing-	whenM isDirect $ do-		void $ addAssociatedFile key file-		{- For moveAnnex to work in direct mode, the symlink-		 - must already exist, so flush the queue. -}-		Annex.Queue.flush-	maybe noop (moveAnnex key) mtmp+cleanup u url file key mtmp = case mtmp of+	Nothing -> go+	Just tmp -> do+		largematcher <- largeFilesMatcher+		ifM (checkFileMatcher largematcher file)+			( go+			, do+				liftIO $ renameFile tmp file+				void $ Command.Add.addSmall file+			)+  where+	go = do+		when (isJust mtmp) $+			logStatus key InfoPresent+		setUrlPresent u key url+		Command.Add.addLink file key Nothing+		whenM isDirect $ do+			void $ addAssociatedFile key file+			{- For moveAnnex to work in direct mode, the symlink+			 - must already exist, so flush the queue. -}+			Annex.Queue.flush+		maybe noop (moveAnnex key) mtmp  nodownload :: URLString -> Url.UrlInfo -> FilePath -> Annex (Maybe Key) nodownload url urlinfo file
Command/DropUnused.hs view
@@ -14,6 +14,7 @@ import qualified Git import Command.Unused (withUnusedMaps, UnusedMaps(..), startUnused) import Annex.NumCopies+import Annex.Content  cmd :: Command cmd = command "dropunused" SectionMaintenance@@ -37,14 +38,20 @@ 	withUnusedMaps (start from numcopies) (rangesToDrop o)  start :: Maybe Remote -> NumCopies -> UnusedMaps -> Int -> CommandStart-start from numcopies = startUnused "dropunused" (perform from numcopies) (performOther gitAnnexBadLocation) (performOther gitAnnexTmpObjectLocation)+start from numcopies = startUnused "dropunused"+	(perform from numcopies)+	(performOther gitAnnexBadLocation)+	(performOther gitAnnexTmpObjectLocation)  perform :: Maybe Remote -> NumCopies -> Key -> CommandPerform perform from numcopies key = case from of 	Just r -> do 		showAction $ "from " ++ Remote.name r 		Command.Drop.performRemote key Nothing numcopies r-	Nothing -> Command.Drop.performLocal key Nothing numcopies []+	Nothing -> ifM (inAnnex key)+		( Command.Drop.performLocal key Nothing numcopies []+		, next (return True)+		)  performOther :: (Key -> Git.Repo -> FilePath) -> Key -> CommandPerform performOther filespec key = do
Command/Import.hs view
@@ -19,6 +19,8 @@ import Types.Key import Annex.CheckIgnore import Annex.NumCopies+import Types.FileMatcher+import Annex.FileMatcher  cmd :: Command cmd = withGlobalOptions (jobsOption : fileMatchingOptions) $ notBareRepo $@@ -64,10 +66,11 @@ 	inrepops <- liftIO $ filter (dirContains repopath) <$> mapM absPath (importFiles o) 	unless (null inrepops) $ do 		error $ "cannot import files from inside the working tree (use git annex add instead): " ++ unwords inrepops-	withPathContents (start (duplicateMode o)) (importFiles o)+	largematcher <- largeFilesMatcher+	withPathContents (start largematcher (duplicateMode o)) (importFiles o) -start :: DuplicateMode -> (FilePath, FilePath) -> CommandStart-start mode (srcfile, destfile) =+start :: FileMatcher Annex -> DuplicateMode -> (FilePath, FilePath) -> CommandStart+start largematcher mode (srcfile, destfile) = 	ifM (liftIO $ isRegularFile <$> getSymbolicLinkStatus srcfile) 		( do 			ma <- pickaction@@ -124,7 +127,10 @@ 		liftIO $ if mode == Duplicate || mode == SkipDuplicates 			then void $ copyFileExternal CopyAllMetaData srcfile destfile 			else moveFile srcfile destfile-		Command.Add.perform destfile+		ifM (checkFileMatcher largematcher destfile)+			( Command.Add.perform destfile+			, next $ Command.Add.addSmall destfile +			) 	notoverwriting why = do 		warning $ "not overwriting existing " ++ destfile ++ " " ++ why 		stop
Command/Map.hs view
@@ -15,6 +15,7 @@ import qualified Git.Url import qualified Git.Config import qualified Git.Construct+import qualified Remote import qualified Annex import Annex.UUID import Logs.UUID@@ -46,7 +47,9 @@ 	liftIO $ writeFile file (drawMap rs umap trusted) 	next $ next $ 		ifM (Annex.getState Annex.fast)-			( return True+			( do+				showLongNote $ "left map in " ++ file+				return True 			, do 				showLongNote $ "running: dot -Tx11 " ++ file 				showOutput@@ -164,9 +167,8 @@ {- Checks if two repos are the same. -} same :: Git.Repo -> Git.Repo -> Bool same a b-	| both Git.repoIsSsh = matching Git.Url.authority && matching Git.repoPath-	| both Git.repoIsUrl && neither Git.repoIsSsh = matching show-	| neither Git.repoIsSsh = matching Git.repoPath+	| both Git.repoIsUrl = matching Git.Url.scheme && matching Git.Url.authority && matching Git.repoPath+	| neither Git.repoIsUrl = matching Git.repoPath 	| otherwise = False   where 	matching t = t a == t b@@ -192,7 +194,13 @@ tryScan :: Git.Repo -> Annex (Maybe Git.Repo) tryScan r 	| Git.repoIsSsh r = sshscan-	| Git.repoIsUrl r = return Nothing+	| Git.repoIsUrl r = case Git.remoteName r of+		-- Can't scan a non-ssh url, so use any cached uuid for it.+		Just n -> Just <$> (either+			(const (pure r))+			(liftIO . setUUID r . Remote.uuid)+			=<< Remote.byName' n)+		Nothing -> return $ Just r 	| otherwise = liftIO $ safely $ Git.Config.read r   where 	pipedconfig pcmd params = liftIO $ safely $
Config/Files.hs view
@@ -26,8 +26,11 @@ readAutoStartFile :: IO [FilePath] readAutoStartFile = do 	f <- autoStartFile-	nub . map dropTrailingPathSeparator . lines+	filter valid . nub . map dropTrailingPathSeparator . lines 		<$> catchDefaultIO "" (readFile f)+  where+	-- Ignore any relative paths; some old buggy versions added eg "."+	valid = isAbsolute  modifyAutoStartFile :: ([FilePath] -> [FilePath]) -> IO () modifyAutoStartFile func = do@@ -42,12 +45,16 @@  - present, it's moved to the top, so it will be used as the default  - when opening the webapp. -} addAutoStartFile :: FilePath -> IO ()-addAutoStartFile path = modifyAutoStartFile $ (:) path+addAutoStartFile path = do+	path' <- absPath path+	modifyAutoStartFile $ (:) path'  {- Removes a directory from the autostart file. -} removeAutoStartFile :: FilePath -> IO ()-removeAutoStartFile path = modifyAutoStartFile $-	filter (not . equalFilePath path)+removeAutoStartFile path = do+	path' <- absPath path+	modifyAutoStartFile $+		filter (not . equalFilePath path')  {- The path to git-annex is written here; which is useful when cabal  - has installed it to some awful non-PATH location. -}
Makefile view
@@ -18,8 +18,9 @@ 	if [ "$(CABAL)" = ./Setup ]; then ghc --make Setup; fi 	$(CABAL) configure --ghc-options="$(shell Build/collect-ghc-options.sh)" +# -j1 is used for reproducible build git-annex: Build/SysConfig.hs-	$(CABAL) build+	$(CABAL) build -j1 	ln -sf dist/build/git-annex/git-annex git-annex  man/%.1: doc/%.mdwn@@ -242,8 +243,7 @@ 	$(MAKE) -C standalone/android  # We bypass cabal, and only run the main ghc --make command for a-# fast development built. Note: Does not rebuild C libraries, or link-# executable.+# fast development built. fast: dist/caballog 	@$$(grep 'ghc --make' dist/caballog | head -n 1 | sed -e 's/-package-id [^ ]*//g' -e 's/-hide-all-packages//') -O0 -j -dynamic 	@ln -sf dist/build/git-annex/git-annex git-annex
Messages/Progress.hs view
@@ -29,8 +29,8 @@  {- Shows a progress meter while performing a transfer of a key.  - The action is passed a callback to use to update the meter. -}-metered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a-metered combinemeterupdate key _af a = case keySize key of+metered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a+metered combinemeterupdate key a = case keySize key of 	Nothing -> nometer 	Just size -> withOutputType (go $ fromInteger size)   where@@ -66,11 +66,19 @@  {- Use when the progress meter is only desired for concurrent  - output; as when a command's own progress output is preferred. -}-concurrentMetered :: Maybe MeterUpdate -> Key -> AssociatedFile -> (MeterUpdate -> Annex a) -> Annex a-concurrentMetered combinemeterupdate key af a = withOutputType go+concurrentMetered :: Maybe MeterUpdate -> Key -> (MeterUpdate -> Annex a) -> Annex a+concurrentMetered combinemeterupdate key a = withOutputType go   where-	go (ConcurrentOutput _) = metered combinemeterupdate key af a-	go _ = a (fromMaybe (const noop) combinemeterupdate)+	go (ConcurrentOutput _) = metered combinemeterupdate key a+	go _ = a (fromMaybe nullMeterUpdate combinemeterupdate)++{- Poll file size to display meter, but only for concurrent output. -}+concurrentMeteredFile :: FilePath -> Maybe MeterUpdate -> Key -> Annex a -> Annex a+concurrentMeteredFile file combinemeterupdate key a = withOutputType go+  where+	go (ConcurrentOutput _) = metered combinemeterupdate key $ \p ->+		watchFileSize file p a+	go _ = a  {- Progress dots. -} showProgressDots :: Annex ()
Remote/External.hs view
@@ -369,12 +369,8 @@ startExternal externaltype = do 	errrelayer <- mkStderrRelayer 	liftIO $ do-		(Just hin, Just hout, Just herr, pid) <- createProcess $-			(proc cmd [])-				{ std_in = CreatePipe-				, std_out = CreatePipe-				, std_err = CreatePipe-				}+		(Just hin, Just hout, Just herr, pid) <- +			createProcess p `catchIO` runerr 		fileEncoding hin 		fileEncoding hout 		fileEncoding herr@@ -390,7 +386,14 @@ 			}   where 	cmd = externalRemoteProgram externaltype+	p = (proc cmd [])+		{ std_in = CreatePipe+		, std_out = CreatePipe+		, std_err = CreatePipe+		} +	runerr _ = error ("Cannot run " ++ cmd ++ " -- Make sure it's in your PATH and is executable.")+ 	checkearlytermination Nothing = noop 	checkearlytermination (Just exitcode) = ifM (inPath cmd) 		( error $ unwords [ "failed to run", cmd, "(" ++ show exitcode ++ ")" ]@@ -503,9 +506,9 @@ 	mkmulti (u, s, f) = (u, s, mkSafeFilePath f)  retrieveUrl :: Retriever-retrieveUrl = fileRetriever $ \f k _p -> do+retrieveUrl = fileRetriever $ \f k p -> do 	us <- getWebUrls k-	unlessM (downloadUrl us f) $+	unlessM (downloadUrl k p us f) $ 		error "failed to download content"  checkKeyUrl :: Git.Repo -> CheckPresent
Remote/Git.hs view
@@ -421,7 +421,7 @@  {- Tries to copy a key's content from a remote's annex to a file. -} copyFromRemote :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)-copyFromRemote r key file dest p = concurrentMetered (Just p) key file $+copyFromRemote r key file dest p = concurrentMetered (Just p) key $ 	copyFromRemote' r key file dest  copyFromRemote' :: Remote -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)@@ -440,12 +440,13 @@ 					copier <- mkCopier hardlink params 					runTransfer (Transfer Download u key) 						file noRetry noObserver -						(\p -> copier object dest p checksuccess)-	| Git.repoIsSsh (repo r) = unVerified $ feedprogressback $ \feeder -> do+						(\p -> copier object dest (combineMeterUpdate p meterupdate) checksuccess)+	| Git.repoIsSsh (repo r) = unVerified $ feedprogressback $ \p -> do 		direct <- isDirect-		Ssh.rsyncHelper (Just feeder) +		Ssh.rsyncHelper (Just (combineMeterUpdate meterupdate p)) 			=<< Ssh.rsyncParamsRemote direct r Download key dest file-	| Git.repoIsHttp (repo r) = unVerified $ Annex.Content.downloadUrl (keyUrls r key) dest+	| Git.repoIsHttp (repo r) = unVerified $+		Annex.Content.downloadUrl key meterupdate (keyUrls r key) dest 	| otherwise = error "copying from non-ssh, non-http remote not supported"   where 	{- Feed local rsync's progress info back to the remote,@@ -522,7 +523,7 @@ 			) 	| Git.repoIsSsh (repo r) = 		ifM (Annex.Content.preseedTmp key file)-			( fst <$> concurrentMetered Nothing key af+			( fst <$> concurrentMetered Nothing key 				(copyFromRemote' r key af file) 			, return False 			)@@ -533,17 +534,19 @@  {- Tries to copy a key's content to a remote's annex. -} copyToRemote :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool-copyToRemote r key file p = concurrentMetered (Just p) key file $ copyToRemote' r key file+copyToRemote r key file meterupdate = +	concurrentMetered (Just meterupdate) key $+		copyToRemote' r key file  copyToRemote' :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool-copyToRemote' r key file p+copyToRemote' r key file meterupdate 	| not $ Git.repoIsUrl (repo r) = 		guardUsable (repo r) (return False) $ commitOnCleanup r $ 			copylocal =<< Annex.Content.prepSendAnnex key 	| Git.repoIsSsh (repo r) = commitOnCleanup r $ 		Annex.Content.sendAnnex key noop $ \object -> do 			direct <- isDirect-			Ssh.rsyncHelper (Just p)+			Ssh.rsyncHelper (Just meterupdate) 				=<< Ssh.rsyncParamsRemote direct r Upload key object file 	| otherwise = error "copying to non-ssh repo not supported"   where@@ -563,10 +566,11 @@ 				ensureInitialized 				copier <- mkCopier hardlink params 				let verify = Annex.Content.RemoteVerify r-				runTransfer (Transfer Download u key) file noRetry noObserver $ const $-					Annex.Content.saveState True `after`+				runTransfer (Transfer Download u key) file noRetry noObserver $ \p ->+					let p' = combineMeterUpdate meterupdate p+					in Annex.Content.saveState True `after` 						Annex.Content.getViaTmp verify key-							(\dest -> copier object dest p (liftIO checksuccessio))+							(\dest -> copier object dest p' (liftIO checksuccessio)) 			)  fsckOnRemote :: Git.Repo -> [CommandParam] -> Annex (IO Bool)@@ -638,19 +642,8 @@   where 	sameDeviceIds a b = (==) <$> getDeviceId a <*> getDeviceId b 	getDeviceId f = deviceID <$> liftIO (getFileStatus $ parentDir f)-	docopy = liftIO $ bracket-		(forkIO $ watchfilesize zeroBytesProcessed)-		(void . tryIO . killThread)-		(const $ copyFileExternal CopyTimeStamps src dest)-	watchfilesize oldsz = do-		threadDelay 500000 -- 0.5 seconds-		v <- catchMaybeIO $ toBytesProcessed <$> getFileSize dest-		case v of-			Just sz-				| sz /= oldsz -> do-					p sz-					watchfilesize sz-			_ -> watchfilesize oldsz+	docopy = liftIO $ watchFileSize dest p $+		copyFileExternal CopyTimeStamps src dest #endif 	dorsync = Ssh.rsyncHelper (Just p) $ 		rsyncparams ++ [File src, File dest]
Remote/Helper/Special.hs view
@@ -155,8 +155,8 @@ specialRemote' cfg c preparestorer prepareretriever prepareremover preparecheckpresent baser = encr   where 	encr = baser-		{ storeKey = \k f p -> cip >>= storeKeyGen k f p-		, retrieveKeyFile = \k f d p -> cip >>= unVerified . retrieveKeyFileGen k f d p+		{ storeKey = \k _f p -> cip >>= storeKeyGen k p+		, retrieveKeyFile = \k _f d p -> cip >>= unVerified . retrieveKeyFileGen k d p 		, retrieveKeyFileCheap = \k f d -> cip >>= maybe 			(retrieveKeyFileCheap baser k f d) 			-- retrieval of encrypted keys is never cheap@@ -183,12 +183,12 @@ 	safely a = catchNonAsync a (\e -> warning (show e) >> return False)  	-- chunk, then encrypt, then feed to the storer-	storeKeyGen k f p enc = safely $ preparestorer k $ safely . go+	storeKeyGen k p enc = safely $ preparestorer k $ safely . go 	  where 		go (Just storer) = preparecheckpresent k $ safely . go' storer 		go Nothing = return False 		go' storer (Just checker) = sendAnnex k rollback $ \src ->-			displayprogress p k f $ \p' ->+			displayprogress p k $ \p' -> 				storeChunks (uuid baser) chunkconfig k src p' 					(storechunk enc storer) 					checker@@ -204,10 +204,10 @@ 					storer (enck k) (ByteContent encb) p  	-- call retriever to get chunks; decrypt them; stream to dest file-	retrieveKeyFileGen k f dest p enc =+	retrieveKeyFileGen k dest p enc = 		safely $ prepareretriever k $ safely . go 	  where-		go (Just retriever) = displayprogress p k f $ \p' ->+		go (Just retriever) = displayprogress p k $ \p' -> 			retrieveChunks retriever (uuid baser) chunkconfig 				enck k dest p' (sink dest enc) 		go Nothing = return False@@ -227,8 +227,8 @@  	chunkconfig = chunkConfig cfg -	displayprogress p k f a-		| displayProgress cfg = metered (Just p) k f a+	displayprogress p k a+		| displayProgress cfg = metered (Just p) k a 		| otherwise = a p  {- Sink callback for retrieveChunks. Stores the file content into the
Remote/S3.hs view
@@ -249,8 +249,8 @@ 	Nothing -> \_ _ _ -> do 		warnMissingCredPairFor "S3" (AWS.creds $ uuid r) 		return False-	Just geturl -> fileRetriever $ \f k _p ->-		unlessM (downloadUrl [geturl k] f) $+	Just geturl -> fileRetriever $ \f k p ->+		unlessM (downloadUrl k p [geturl k] f) $ 			error "failed to download content"  retrieveCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool
Remote/Tahoe.hs view
@@ -75,7 +75,7 @@ 		, lockContent = Nothing 		, checkPresent = checkKey u hdl 		, checkPresentCheap = False-		, whereisKey = Nothing+		, whereisKey = Just (getWhereisKey u) 		, remoteFsck = Nothing 		, repairRepo = Nothing 		, config = c@@ -230,6 +230,12 @@  getCapability :: UUID -> Key -> Annex (Maybe Capability) getCapability u k = getRemoteState u k++getWhereisKey :: UUID -> Key -> Annex [String]+getWhereisKey u k = disp <$> getCapability u k+  where+	disp Nothing = []+	disp (Just c) = [c]  {- tahoe put outputs a single line, containing the capability. -} parsePut :: String -> Maybe Capability
Remote/Web.hs view
@@ -72,7 +72,7 @@ 		}  downloadKey :: Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex (Bool, Verification)-downloadKey key _file dest _p = unVerified $ get =<< getWebUrls key+downloadKey key _af dest p = unVerified $ get =<< getWebUrls key   where 	get [] = do 		warning "no known url"@@ -84,13 +84,13 @@ 			case downloader of 				QuviDownloader -> do #ifdef WITH_QUVI-					flip downloadUrl dest+					flip (downloadUrl key p) dest 						=<< withQuviOptions Quvi.queryLinks [Quvi.httponly, Quvi.quiet] u' #else 					warning "quvi support needed for this url" 					return False #endif-				_ -> downloadUrl [u'] dest+				_ -> downloadUrl key p [u'] dest  downloadKeyCheap :: Key -> AssociatedFile -> FilePath -> Annex Bool downloadKeyCheap _ _ _ = return False
Test.hs view
@@ -83,6 +83,7 @@ import qualified Utility.Exception import qualified Utility.Hash import qualified Utility.Scheduled+import qualified Utility.Scheduled.QuickCheck import qualified Utility.HumanTime import qualified Utility.ThreadScheduler import qualified Utility.Base64@@ -157,7 +158,7 @@ 	, testProperty "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog 	, testProperty "prop_hashes_stable" Utility.Hash.prop_hashes_stable 	, testProperty "prop_mac_stable" Utility.Hash.prop_mac_stable-	, testProperty "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips+	, testProperty "prop_schedule_roundtrips" Utility.Scheduled.QuickCheck.prop_schedule_roundtrips 	, testProperty "prop_past_sane" Utility.Scheduled.prop_past_sane 	, testProperty "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips 	, testProperty "prop_metadata_sane" Types.MetaData.prop_metadata_sane
Utility/Exception.hs view
@@ -20,7 +20,8 @@ 	catchNonAsync, 	tryNonAsync, 	tryWhenExists,-	catchHardwareFault,+	catchIOErrorType,+	IOErrorType(..) ) where  import Control.Monad.Catch as X hiding (Handler)@@ -88,11 +89,11 @@ 	v <- tryJust (guard . isDoesNotExistError) a 	return (eitherToMaybe v) -{- Catches only exceptions caused by hardware faults.- - Ie, disk IO error. -}-catchHardwareFault :: MonadCatch m => m a -> (IOException -> m a) -> m a-catchHardwareFault a onhardwareerr = catchIO a onlyhw+{- Catches only IO exceptions of a particular type.+ - Ie, use HardwareFault to catch disk IO errors. -}+catchIOErrorType :: MonadCatch m => IOErrorType -> (IOException -> m a) -> m a -> m a+catchIOErrorType errtype onmatchingerr a = catchIO a onlymatching   where-	onlyhw e-		| ioeGetErrorType e == HardwareFault = onhardwareerr e+	onlymatching e+		| ioeGetErrorType e == errtype = onmatchingerr e 		| otherwise = throwM e
Utility/FileSystemEncoding.hs view
@@ -29,6 +29,7 @@ import qualified Data.Hash.MD5 as MD5 import Data.Word import Data.Bits.Utils+import Data.List import Data.List.Utils import qualified Data.ByteString.Lazy as L #ifdef mingw32_HOST_OS@@ -125,12 +126,12 @@  {- Like encodeW8 and decodeW8, but NULs are passed through unchanged. -} encodeW8NUL :: [Word8] -> FilePath-encodeW8NUL = join nul . map encodeW8 . split (s2w8 nul)+encodeW8NUL = intercalate nul . map encodeW8 . split (s2w8 nul)   where 	nul = ['\NUL']  decodeW8NUL :: FilePath -> [Word8]-decodeW8NUL = join (s2w8 nul) . map decodeW8 . split nul+decodeW8NUL = intercalate (s2w8 nul) . map decodeW8 . split nul   where 	nul = ['\NUL'] 
Utility/FreeDesktop.hs view
@@ -59,7 +59,7 @@ 	| null l = "" 	| otherwise = (intercalate ";" $ map (escapesemi . toString) l) ++ ";"   where-	escapesemi = join "\\;" . split ";"+	escapesemi = intercalate "\\;" . split ";"  genDesktopEntry :: String -> String -> Bool -> FilePath -> Maybe String -> [String] -> DesktopEntry genDesktopEntry name comment terminal program icon categories = catMaybes
Utility/Metered.hs view
@@ -18,7 +18,9 @@ import System.Posix.Types import Data.Int import Data.Bits.Utils+import Control.Concurrent import Control.Concurrent.Async+import Control.Monad.IO.Class (MonadIO)  {- An action that can be run repeatedly, updating it on the bytes processed.  -@@ -29,6 +31,9 @@ nullMeterUpdate :: MeterUpdate nullMeterUpdate _ = return () +combineMeterUpdate :: MeterUpdate -> MeterUpdate -> MeterUpdate+combineMeterUpdate a b = \n -> a n >> b n+ {- Total number of bytes processed so far. -} newtype BytesProcessed = BytesProcessed Integer 	deriving (Eq, Ord, Show)@@ -145,6 +150,23 @@   where 	k = 1024 	chunkOverhead = 2 * sizeOf (1 :: Int) -- GHC specific++{- Runs an action, watching a file as it grows and updating the meter. -}+watchFileSize :: (MonadIO m, MonadMask m) => FilePath -> MeterUpdate -> m a -> m a+watchFileSize f p a = bracket +	(liftIO $ forkIO $ watcher zeroBytesProcessed)+	(liftIO . void . tryIO . killThread)+	(const a)+  where+	watcher oldsz = do+		v <- catchMaybeIO $ toBytesProcessed <$> getFileSize f+		newsz <- case v of+			Just sz | sz /= oldsz -> do+				p sz+				return sz+			_ -> return oldsz+		threadDelay 500000 -- 0.5 seconds+		watcher newsz  data OutputHandler = OutputHandler 	{ quietMode :: Bool
Utility/Path.hs view
@@ -89,7 +89,7 @@ upFrom :: FilePath -> Maybe FilePath upFrom dir 	| length dirs < 2 = Nothing-	| otherwise = Just $ joinDrive drive (join s $ init dirs)+	| otherwise = Just $ joinDrive drive (intercalate s $ init dirs)   where 	-- on Unix, the drive will be "/" when the dir is absolute, otherwise "" 	(drive, path) = splitDrive dir@@ -149,7 +149,7 @@ relPathDirToFileAbs :: FilePath -> FilePath -> FilePath relPathDirToFileAbs from to 	| takeDrive from /= takeDrive to = to-	| otherwise = join s $ dotdots ++ uncommon+	| otherwise = intercalate s $ dotdots ++ uncommon   where 	s = [pathSeparator] 	pfrom = split s from@@ -288,7 +288,6 @@ 	if l <= 0 		then return 255 		else return $ minimum [l, 255]-  where #endif  {- Given a string that we'd like to use as the basis for FilePath, but that
Utility/SafeCommand.hs view
@@ -14,6 +14,7 @@ import Data.String.Utils import System.FilePath import Data.Char+import Data.List import Control.Applicative import Prelude @@ -85,7 +86,7 @@ shellEscape f = "'" ++ escaped ++ "'"   where 	-- replace ' with '"'"'-	escaped = join "'\"'\"'" $ split "'" f+	escaped = intercalate "'\"'\"'" $ split "'" f  -- | Unescapes a set of shellEscaped words or filenames. shellUnEscape :: String -> [String]
Utility/Scheduled.hs view
@@ -23,12 +23,10 @@ 	toRecurrance, 	toSchedule, 	parseSchedule,-	prop_schedule_roundtrips, 	prop_past_sane, ) where  import Utility.Data-import Utility.QuickCheck import Utility.PartialPrelude import Utility.Misc @@ -38,6 +36,7 @@ import Data.Time.Calendar import Data.Time.Calendar.WeekDate import Data.Time.Calendar.OrdinalDate+import Data.Time.Format () import Data.Tuple.Utils import Data.Char import Control.Applicative@@ -336,41 +335,6 @@ 	(rws, tws) = separate (== "at") (words s) 	recurrance = unwords rws 	scheduledtime = unwords tws--instance Arbitrary Schedule where-	arbitrary = Schedule <$> arbitrary <*> arbitrary--instance Arbitrary ScheduledTime where-	arbitrary = oneof-		[ pure AnyTime-		, SpecificTime -			<$> choose (0, 23)-			<*> choose (1, 59)-		]--instance Arbitrary Recurrance where-	arbitrary = oneof-		[ pure Daily-		, Weekly <$> arbday-		, Monthly <$> arbday-		, Yearly <$> arbday-		, Divisible-			<$> positive arbitrary-			<*> oneof -- no nested Divisibles-				[ pure Daily-				, Weekly <$> arbday-				, Monthly <$> arbday-				, Yearly <$> arbday-				]-		]-	  where-		arbday = oneof-			[ Just <$> nonNegative arbitrary-			, pure Nothing-			]--prop_schedule_roundtrips :: Schedule -> Bool-prop_schedule_roundtrips s = toSchedule (fromSchedule s) == Just s  prop_past_sane :: Bool prop_past_sane = and
+ Utility/Scheduled/QuickCheck.hs view
@@ -0,0 +1,51 @@+{- quickcheck for scheduled activities+ - + - Copyright 2013-2014 Joey Hess <id@joeyh.name>+ -+ - License: BSD-2-clause+ -}++{-# OPTIONS_GHC -fno-warn-orphans #-}++module Utility.Scheduled.QuickCheck where++import Utility.Scheduled+import Utility.QuickCheck++import Control.Applicative+import Prelude++instance Arbitrary Schedule where+	arbitrary = Schedule <$> arbitrary <*> arbitrary++instance Arbitrary ScheduledTime where+	arbitrary = oneof+		[ pure AnyTime+		, SpecificTime +			<$> choose (0, 23)+			<*> choose (1, 59)+		]++instance Arbitrary Recurrance where+	arbitrary = oneof+		[ pure Daily+		, Weekly <$> arbday+		, Monthly <$> arbday+		, Yearly <$> arbday+		, Divisible+			<$> positive arbitrary+			<*> oneof -- no nested Divisibles+				[ pure Daily+				, Weekly <$> arbday+				, Monthly <$> arbday+				, Yearly <$> arbday+				]+		]+	  where+		arbday = oneof+			[ Just <$> nonNegative arbitrary+			, pure Nothing+			]++prop_schedule_roundtrips :: Schedule -> Bool+prop_schedule_roundtrips s = toSchedule (fromSchedule s) == Just s
Utility/Tmp.hs view
@@ -88,8 +88,9 @@ 		makenewdir (tmpdir </> template) (0 :: Int) 	makenewdir t n = do 		let dir = t ++ "." ++ show n-		either (const $ makenewdir t $ n + 1) (const $ return dir)-			=<< tryIO (createDirectory dir)+		catchIOErrorType AlreadyExists (const $ makenewdir t $ n + 1) $ do+			createDirectory dir+			return dir  {- It's not safe to use a FilePath of an existing file as the template  - for openTempFile, because if the FilePath is really long, the tmpfile
debian/changelog view
@@ -1,3 +1,30 @@+git-annex (5.20151208) unstable; urgency=medium++  * Build with -j1 again to get reproducible build.+  * Display progress meter in -J mode when copying from a local git repo,+    to a local git repo, and from a remote git repo.+  * Display progress meter in -J mode when downloading from the web.+  * map: Improve display of git remotes with non-ssh urls, including http+    and gcrypt. +  * When core.sharedRepository is set, annex object files are not made mode+    444, since that prevents a user other than the file owner from locking+    them. Instead, a mode such as 664 is used in this case.+  * tahoe: Include tahoe capabilities in whereis display.+  * import: Changed to honor annex.largefiles settings.+  * addurl, importfeed: Changed to honor annex.largefiles settings,+    when the content of the url is downloaded. (Not when using --fast or+    --relaxed.)+  * webapp: Fix bugs that could result in a relative path such as "."+    being written to ~/.config/git-annex/autostart, and ignore any such +    relative paths in the file.+    This was a reversion caused by the relative path changes in 5.20150113.+  * dropunused: Make more robust when trying to drop an object that has+    already been dropped.+  * Fix reversion in handling of long filenames, particularly when using+    addurl/importfeed, which was introduced in the previous release.++ -- Joey Hess <id@joeyh.name>  Tue, 08 Dec 2015 11:14:03 -0400+ git-annex (5.20151116) unstable; urgency=medium    * Use concurrent-output library when configured with -fConcurrentOutput.
debian/rules view
@@ -25,4 +25,10 @@ override_dh_fixperms: 	dh_fixperms -Xld-linux +# Do not add "ldconfig" trigger since all libraries in the standalone build+# are private copies and the trigger activate-noawait trigger may not work+# on elderly distributions (e.g. squeeze)+override_dh_makeshlibs:+	dh_makeshlibs --noscripts+ endif
+ doc/bugs/20151116_tests_fail_on_OS_X.mdwn view
@@ -0,0 +1,40 @@+Test output on OS X. Btw, the previous version works:++```+OK (4.87s)+    map:                                            OK (0.33s)+    uninit:                                         Deleted branch git-annex (was 9a28b38).+OK (0.38s)+    uninit (in git-annex branch):                   Switched to branch 'git-annex'+OK (0.26s)+    upgrade:                                        OK (0.21s)+    whereis:                                        OK (0.61s)+    hook remote:                                    OK (0.91s)+    directory remote:                               OK (0.85s)+    rsync remote:                                   OK (1.40s)+    bup remote:                                     Reinitialized existing Git repository in /private/var/folders/4j/br7bdhjx4b384_snb2087gt00000gn/T/nix-build-git-annex-5.20151116.drv-0/.bup/+Initialized empty Git repository in /private/var/folders/4j/br7bdhjx4b384_snb2087gt00000gn/T/nix-build-git-annex-5.20151116.drv-0/git-annex-5.20151116/.t/tmprepo0/dir/+  content cannot be completely removed from bup remote+OK (2.62s)+    crypto:                                         OK (4.16s)+    preferred content:                              OK (1.97s)+    add subdirs:                                    Merge made by the 'recursive' strategy.+ conflictor.variant-cc12 | 1 ++ conflictor/subfile      | 1 ++ 2 files changed, 2 insertions(+)+ create mode 120000 conflictor.variant-cc12+ create mode 120000 conflictor/subfile+To /private/var/folders/4j/br7bdhjx4b384_snb2087gt00000gn/T/nix-build-git-annex-5.20151116.drv-0/git-annex-5.20151116/.t/repo+   e4d3d14..60148c4  git-annex -> synced/git-annex+   efda76d..f76baae  master -> synced/master+OK (0.55s)+    addurl:                                         git-annex: .git/annex/objects/2Q/J8/SHA256E-s3--2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae/SHA256E-s3--2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae: createSymbolicLink: invalid argument (File name too long)+FAIL (0.29s)+      addurl failed on file:///private/var/folders/4j/br7bdhjx4b384_snb2087gt00000gn/T/nix-build-git-annex-5.20151116.drv-0/git-annex-5.20151116/.t/tmprepo0/myurl++2 out of 150 tests failed (126.13s)+  (This could be due to a bug in git-annex, or an incompatability+   with utilities, such as git, installed on this system.)+```++> [[fixed|done]] --[[Joey]]
doc/bugs/A_weird___34__.__34___repository_shows_up_when_switching.mdwn view
@@ -23,3 +23,4 @@ ### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)  +> [[fixed|done]] --[[Joey]]
+ doc/bugs/Location_change_of_remote_DNS_ignored.mdwn view
@@ -0,0 +1,28 @@+### Please describe the problem.+git-annex ignores changing of remote location in .git/config++### What steps will reproduce the problem?+1. Change Hostname of previously working remote so that the existing remote will no longer work and produce "ssh: connect to host <DNS hostname> port 22: Network is unreachable" errors.+2. Stop all running git-annex processes.+3. Edit DNS name in corresponding remote .git/config.+4. Restart git-annex.+5. Turns out: git-annex still uses the old remote's DNS name.++### What version of git-annex are you using? On what operating system?+newest one available.+5.20151116-gbe86081 ++### Please provide any additional information below.+See following entry in log, occurring plenty often:+[[!format sh """+ssh: connect to host some.unreachable.dns.net port 22: Network is unreachable+rsync: connection unexpec+  rsync failed -- run git annex again to resume file transfer+tedly closed (0 bytes received so far) [Receiver]+rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.1]+"""]]++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)+Trust me I love git-annex. Had dreams of something like git-annex for almost 10 years. I instantly got stuck on git-annex when I have read the first few sentences about it. Since then, things in my life have changed in a quite serious manner.++THANKS for your help!
+ doc/bugs/Unable_to_take_transfer_lock.mdwn view
@@ -0,0 +1,41 @@+### Please describe the problem.++`git annex get --from=myremote' show "transfer already in progress, or unable to take transfer lock".++**Likely Problem discovered!** I copied the whole remote repo (was residing on a Linux machine accessed via SMB) and pasted it into my Mac. The problem was resolved. It is likely something to do with the fact that Mac OS filesystem is **case-insensitive**. I discovered this issue when I tried to copy that remote repo with ``cp`` rather than ``tar``ing it first.+++### What steps will reproduce the problem?++Remote is on a Linux machine.+Do `git annex get' on a Mac OS.+Do the same on another Linux machine.++The git annex client on the Linux machine works.+Mac OS doesn't.++rsync version for all machines: 3.1.1++### What version of git-annex are you using? On what operating system?++git-annex 5.20151019++Lubuntu 15.10.+Mac OS X 10.11.1 (El Capitan)+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)++Yes.++It's wonderful. This should be a problem with Mac OS.
+ doc/bugs/autostart__47__git-annex.desktop_gets_resurrected.mdwn view
@@ -0,0 +1,9 @@+### Please describe the problem.++Due to the very unstable kernel on my laptop atm I need to reboot quite frequently... and this issue with annex assistant immediately starting synchronizing (although I did disable all synchronizations in webapp, so it would be another issue I guess), I wanted just to disable autostart of git-annex altogether.  I have removed $HOME/.config/autostart/git-annex.desktop but to my surprise upon gnome crashing/relogin I had the same ssh key passphrase dialog and that file reappeared.++### What version of git-annex are you using? On what operating system?++5.20151116+gitg5416a1a-1~ndall+1++[[!meta author=yoh]]
+ doc/bugs/git-annex_cannot_connect_to_freenet_cloud___40__webdav__41__.mdwn view
@@ -0,0 +1,36 @@+### Please describe the problem.++git-annex's WebDAV support does not like (aka it does not work) the WebDAV server of the freenet cloud.+    +### What steps will reproduce the problem?++My first attempt was:++    WEBDAV_USERNAME='XXX' WEBDAV_PASSWORD='XXX' git annex initremote webdav type=webdav url='https://webmail.freenet.de/webdav' encryption=none+    initremote webdav (testing WebDAV server...) +    git-annex: WebDAV test failed: StatusCodeException (Status {statusCode = 401, statusMessage = "Unauthorized"}) [("Date","Fri, 04 Dec 2015 12:20:57 GMT"),("Server","Apache/2.2.16 (Debian)"),("WWW-Authenticate","Basic realm=\"MD-Cloud\""),+    ("Vary","Accept-Encoding"),("Content-Encoding","gzip"),("Content-Length","20"),("Connection","close"),("Content-Type","text/html; charset=iso-8859-15"),("X-Response-Body-Start",""),("X-Request-URL","MKCOL https://webmail.freenet.de:443/webdav/tmp")]+    (CJ {expose = []}): user error failed+    git-annex: initremote: 1 failed++Ok this fails (what is the error?). However, it does create a folder "tmp" in the "cloud". A second attempt yields another error:++    WEBDAV_USERNAME='XXX' WEBDAV_PASSWORD='XXX' git annex initremote webdav type=webdav url='https://webmail.freenet.de/webdav' encryption=none+    initremote webdav (testing WebDAV server...) +    git-annex: WebDAV test failed: StatusCodeException (Status {statusCode = 501, statusMessage = "Not Implemented"}) [("Date","Fri, 04 Dec 2015 12:21:22 GMT"),("Server","Apache/2.2.16 (Debian)"),("Content-Length","349"),("Connection","close"),+    ("Content-Type","application/xml; charset=utf-8"),("X-Response-Body-Start","<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<d:error xmlns:d=\"DAV:\" xmlns:s=\"http://sabredav.org/ns\">\n  <s:exception>Sabre\\DAV\\Exception\\NotImplemented</s:exception>\n  +    <s:message>This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.</s:message>\n  <s:sabredav-version>1.8.6</s:sabredav-version>\n</d:error>\n"),("X-Request-URL","PUT https://webmail.freenet.de:443/webdav+    /tmp/git-annex-test")] (CJ {expose = []}): user error failed+    git-annex: initremote: 1 failed++which is I guess the same. The WebDAV server does support writing and locking files. I tried writing using davfs2 and locking-unlocking using cadaver. I guess in the end that it's the server's fault, but it would be great to know what exactly fails at this point :).++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20151116-gbe86081++Gentoo Linux++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)++First time trying WebDAV support.
+ doc/bugs/git-annex_creates_many_zombies.mdwn view
@@ -0,0 +1,33 @@+### Please describe the problem.++In a debian unstable docker container, I run `git-annex assistant --auto` on a few repositories.++After a few days, I have many (> 10000 right now) zombie processes:++    % ps x | grep "git-annex.*defunct" | wc -l+    10325++### What steps will reproduce the problem?++Keep `git-annex assistant` running.++### What version of git-annex are you using? On what operating system?++Binary version 5.20151116-gbe86081 on Debian Linux unstable (up-to-date from a few days ago when my docker container started)++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)++I couldn't live without git-annex to synchronize my documents over multiple hosts and archives :-)++> [[done]]; this is a docker bug if anything, and I really don't see any+> way git-annex can solve it. --[[Joey]]
+ doc/bugs/regression_with_S3_creds_not_used.mdwn view
@@ -0,0 +1,59 @@+### Please describe the problem.++I am having a problem on Windows in which the AWS access credentials are stored but not used. When I have the ```AWS_ACCESS_KEY_ID``` and ```AWS_SECRET_ACCESS_KEY``` variables are set, everything works correctly. However if I open a new window that doesn't have envs set, git annex sync --content fails with a Forbidden message. Looking in the creds directory, I see plaintext creds stored.++### What steps will reproduce the problem?++```+# set AWS_ACCESS_KEY_ID=thing1+# set AWS_SECRET_ACCESS_KEY=thing2+# git init test+# cd test+# git annex init+# git annex initremote s3cloud type=S3 encryption=pubkey keyid=key embedcreds=yes+ ... everything works, annex-uuid is created, etc ...++# now open a new window, navigate to proper repo++# git annex sync --content++... forbidden messages++# Reset the env vars+... sync works as normal ...+```++Note that this fails *silently* when using the webapp. The app shows percentage of upload, and the uploads "complete" but the log shows:++```+  S3Error {s3StatusCode = Status {statusCode = 403, statusMessage = "Forbidden"}, s3ErrorCode = "InvalidAccessKeyId", s3ErrorMessage = "The AWS Access Key Id you provided does not exist in our records.", s3ErrorResource = Nothing, s3ErrorHostId = Just "/MfOhrvmoi1uTsuJDaV2c+3jxqt+/cAC8KBvGkbE+os1BAPAw/bLeNHiUF8kbSJ+2cMuNO+0mzQ=", s3ErrorAccessKeyId = Just "redacted", s3ErrorStringToSign = Nothing, s3ErrorBucket = Nothing, s3ErrorEndpointRaw = Nothing, s3ErrorEndpoint = Nothing}+```++### What version of git-annex are you using? On what operating system?++I'm on Windows:++```+git-annex version: 5.20151019-gcc50c00+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feed+s Quvi TDFA TorrentParser Database+key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384+SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEI+N256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E MD5 WORM URL+remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glac+ier ddar hook external+```++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)++I have successfully used git annex on linux and mac, and it is great!
+ doc/bugs/remote_repo_marked_as___34__here__34__.mdwn view
@@ -0,0 +1,38 @@+### Please describe the problem.++``git annex info`` shows a local repo as "not here" (withou the ``[here]`` tag), and shows a remote repo with the ``[here]`` tag.++I had to manually edit `.git/config` to set my local repo's UUID to the correct one.++> Well, git-annex can only display information that you've told it. +> In this case you seem to have done something wrong with UUIDs, and so it+> displayed [here] next to the UUID of the local repo, as it's supposed to.+> There's no bug here I think. [[done]] --[[Joey]]++### What steps will reproduce the problem?++I just ``git annex dead`` an old repo, and ``git annex semitrust`` a new repo by the same name as the old repo.+++### What version of git-annex are you using? On what operating system?++5.20150731-1build1++Lubuntu 15.10+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++### Have you had any luck using git-annex before? (Sometimes we get tired of reading bug reports all day and a lil' positive end note does wonders)++Yes, lots of luck (need more skill).++git-annex may need more error catches to prevent a wrong order of commands from corrupting a repo. But still, git annex works great.
doc/coding_style.mdwn view
@@ -98,3 +98,16 @@ or vertical whitespace around your code, making it hard to fit enough of it on the screen, consider finding a better abstraction, so the code that does fit on the screen is easily understandable. ;)++-----++Note for emacs users: You can put the following snippet into a file called +`.dir-locals.el` at root of git-annex's source tree to use tabs for indentation:++	((nil . ((indent-tabs-mode . t)+	         (tab-width . 8)+	         (fill-column . 80)))+	 ;; Warn about spaces used for indentation:+	 (haskell-mode . ((eval . (highlight-regexp "^ *")))))++Also consider [haskell-tab-indent-mode](https://spwhitton.name/tech/code/haskell-tab-indent/).  The standard indentation modes that come with haskell-mode do not work well with tabs for indentation.  This mode works well for hacking on git-annex.
+ doc/devblog/day_338__week_in_review.mdwn view
@@ -0,0 +1,16 @@+Monday: Some finishing touches on the pid locking support, and released+5.20151116. After the release I noticed that concurrent downloads didn't+always include a progress meter, and made the necessary changes to fix+that.++Wednesday: This was a day of minor bug fixing and responding to questions+etc. Message backlog got down below 90, not bad.++Thursday: I've been distracted from coding today with an idea of making+some new stickers. Hexagonal this time, and even better, composable...+So they can show git-annex getting as big as you want. ;)++[[stickers/hex.svg]]++The design is done, see [[stickers]], and seems to work well, and even+better is easy to modify. May find time to get these printed at some point.
+ doc/devblog/day_339_smudging_out_direct_mode.mdwn view
@@ -0,0 +1,61 @@+I'm considering ways to get rid of direct mode, replacing it with something+better implemented using [[todo/smudge]] filters.++## git-lfs++I started by trying out git-lfs, to see what I can learn from it. My+feeling is that git-lfs brings an admirable simplicity to using git with+large files. For example, it uses a push-hook to automatically+upload file contents before pushing a branch.++But its simplicity comes at the cost of being centralized. You can't make a+git-lfs repository locally and clone it onto other drive and have the local+repositories interoperate to pass file contents around. Everything has to+go back through a centralized server. I'm willing to pay complexity costs+for decentralization.++Its simplicity also means that the user doesn't have much control over what+files are present in their checkout of a repository. git-lfs downloads+all the files in the work tree. It doesn't have facilities for dropping+files to free up space, or for configuring a repository to only want to get+a subset of files in the first place. Some of this could be added to it +I suppose.++I also noticed that git-lfs uses twice the disk space, at least when+initially adding files. It keep a copy of the file in .git/lfs/objects/,+in addition to the copy in the working tree. That copy seems to be+necessary due to the way git smudge filters work, to avoid data loss. Of+course, git-annex manages to avoid that duplication when using symlinks,+and its direct mode also avoids that duplication (at the cost of some+robustness). I'd like to keep git-annex's single local copy feature +if possible.++## replacing direct mode++Anyway, as smudge/clean filters stand now, they can't be used to set up+git-annex symlinks; their interface doesn't allow it. But, I was able to+think up a design that uses smudge/clean filters to cover the same use+cases that direct mode covers now.++Thanks to the clean filter, adding a file with `git add` would check in a+small file that points to the git-annex object.++In the same repository, you could also use `git annex add` to check+in a git-annex symlink, which would protect the object from modification,+in the good old indirect mode way. `git annex lock` and `git annex unlock` +could switch a file between those two modes.++So this allows mixing directly writable annexed files and locked down+annexed files in the same repository. All regular git commands and all+git-annex commands can be used on both sorts of files. Workflows could+develop where a file starts out unlocked, but once it's done, is locked to+prevent accidental edits and archived away or published.++That's much more flexible than the current direct mode, and I think it will+be able to be implemented in a simpler, more scalable, and robust way too.+I can lose the direct mode merge code, and remove hundreds of lines of+other special cases for direct mode.++The downside, perhaps, is that for a repository to be usable on a crippled+filesystem, all the files in it will need to be unlocked. A file can't+easily be unlocked in one checkout and locked in another checkout.
+ doc/devblog/day_340__post_turkey_catchup.mdwn view
@@ -0,0 +1,9 @@+Spent a couple of days catching up on backlog, and my backlog is down to 80+messages now. Lowest in recent memory.++Made the annex.largefiles config be honored by `git annex import`, `git+annex addurl`, and even `git annex importfeed`.++Planning to dive into smudge filters soon. The design seems ready to go,+although there is some complication in needing to keep track of mappings+between worktree files and annex keys.
+ doc/devblog/day_341__starting_smudge.mdwn view
@@ -0,0 +1,24 @@+I've gotten git-annex working as a smudge/clean filter today in the+`smudge` branch. It works ok in a local git repository. `git add` lets+git-annex decide if it wants to annex a file's content, and checking out+branches and other git commands involving those files works pretty well.++It can sometimes be slow; git's smudge interface necessarily needs to+copy the content of files around, particularly when checking out files,+and so it's never going to be as fast as the good old git-annex symlink+approach. Most of the slow parts are things that can't be done in direct+mode repos though, like switching branches, so that isn't a regression.++No git-annex commands to manage the annexed content work yet. That+will need a key to worktree file mapping to be maintained, and implementing+that mapping and ensuring its always consistent is probably going to be+the harder part of this.++Also there's the question of how to handle upgrades from direct mode+repositories. This will be an upgrade from annex.version 5 to 6, and you+won't want to do it until all computers that have clones of a repository+have upgraded to git-annex 6.x, since older versions won't be able to work+with the upgraded repository. So, the repository upgrade will need to be+run manually initially, and it seems I'll need to keep supporting direct+mode for v5 repos in a transition period, which will probably be measured+in years.
+ doc/devblog/day_342__continuing_smudge.mdwn view
@@ -0,0 +1,30 @@+Made a lot of progress today. Implemented the database mapping a key to its+associated files.  As expected this database, when updated by the+smudge/clean filters, is not always consistent with the current git work tree.+In particular, commands like `git mv` don't update the database with the+new filename. So queries of the database will need to do some additional+work first to get it updated with any staged changes. But the database is+good enough for a proof of concept, I hope.++Then I got git-annex commands treating smudged files as annexed files.+So this works:++	joey@darkstar:~/tmp/new>git annex init+	init  ok+	(recording state in git...)+	joey@darkstar:~/tmp/new>cp ~/some.mp3 .+	joey@darkstar:~/tmp/new>git add some.mp3+	joey@darkstar:~/tmp/new>git diff --cached+	diff --git a/some.mp3 b/some.mp3+	new file mode 100644+	index 0000000..2df8868+	--- /dev/null+	+++ b/some.mp3+	@@ -0,0 +1 @@+	+/annex/objects/SHA256E-s191213--e4b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.mp3+	joey@darkstar:~/tmp/new>git annex whereis some.mp3+	whereis some.mp3 (1 copy) +	  	7de17427-329a-46ec-afd0-0a088f0d0b1b -- joey@darkstar:~/tmp/new [here]+	ok++get/drop don't yet update the smudged files, and that's the next step.
+ doc/download/comment_3_b59fc32a18a9fda8da120da82fade0a6._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="jckuester@11e9fceb442172b6db63320bb545797a47a4c103"+ nickname="jckuester"+ subject="error during &quot;git clone git://git.kitenet.net/git-annex&quot;"+ date="2015-11-22T15:38:57Z"+ content="""+error: unable to create file doc/bugs/On_Lubuntu_14.04_assistant_fails_to_create_new_setup_or_actually_work___40__fixed_by_regular_lxsession_package_update_from_2014-06-30__41__.mdwn (File name too long)+fatal: unable to checkout working tree+"""]]
+ doc/download/comment_4_bf102d87552f97ac293dd20f6822b84f._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 4"""+ date="2015-11-30T19:13:34Z"+ content="""+I guess you guys with the badly limited filename lenghs are using encfs or+something like that. encfs is [really shoddy](https://defuse.ca/audits/encfs.htm),+and I feel kind of like someone is complaining that the git repo can't be+checked out on MS-DOS. +8.3 filenames are so 1985, and 128 filenames are so.. 1995?+"""]]
+ doc/forum/Confusion_about_Webapp___40__on_OSX__41__.mdwn view
@@ -0,0 +1,9 @@+I am confused on how to invoke the web app. I am learning how to use this tool, however I don't feel quite confident yet. I wanted to test out the web app, to play around with configurations and auto syncing, however I stumbled over this:++    ➜  ~  git annex help webapp // works fine+    ➜  ~  git annex webapp+    Invalid argument `webapp' // uhh what.++git-annex-webapp didn't work either.++I installed with brew. El Capitan, latest update as of right now.
+ doc/forum/Find_out_if_file_is_in_annex__63__.mdwn view
@@ -0,0 +1,8 @@+Hi,++I am currently trying to move nearly all of my files into git-annex, and I was wondering if there is a (plumbing-level?) way to easily figure out if a file I find on a random hard disk is already contained in my annex repository?++I.e., is there an easy way to compute the key for a file (which is not in an annex) and look up if the file is already contained in a given annex repository? I've looked a bit at the plumbing-level commands but none seem to exactly fit the bill :-/++Cheers,+Alex
+ doc/forum/Manipulate_a_git-annex_repo_from_an_Android_app.mdwn view
@@ -0,0 +1,21 @@+I use the command line almost every hour, I'm familiar with it. But it's a pita on the phone.++I'd like to create an "graphical" Android application that lists/browses the repo's content and allows the user to manipulate the files/directories.++git-annex for Android (5.0) is installed and working fine. I was messing around (on my rooted phone) with the rwx permissions to run the git-annex binary from my app as it's a different user and has no access to those binaries by default. But no success yet: ++```+shell@jfltexx:/storage/sdcard1/repo $ /data/data/ga.androidterm/lib/lib.git-annex.so list++lib.git-annex.so: git: createProcess: runInteractiveProcess: exec: permission denied (Permission denied)+```++Question 1: How should I set up the permissions to be able to successfully run any git-annex command from my (non-commercial, private) Android app?++Question 2: What if I include all the git-annex binaries in my app as a resource and write them to disk after install and execute them? (Permissions should work.)+++Use case: family videos are stored in a repo at home. This repo is cloned to my phone's sdcard. I want to browse the repo on my phone and mark some directories to be transferred from home to phone. My app would be a simple frontend for git-annex where you can browse and do some basic stuff: get, drop, manipulate metadata (and of course start playing a video).++Thank you for any ideas,+Bence
+ doc/forum/assistant_and_archive_folder.mdwn view
@@ -0,0 +1,13 @@+I have a setup with a windows desktop and a linux laptop with both an annex repository, interconnected via a backup repository in the middle (connected via ssh).+Both computers are setup as clients and all 3 machines are running the assistant.++Today i tried creating an archive folder and a putting some files in it. To my understanding those files should have been dropped in the 2 machines but kept on the server.. instead I have them copied on each machine. Listing where the files are on both computers shows that both know that themselves and the server have a copy, but they don't know anything about each other.++AFAIK it looks like the bug reported in https://git-annex.branchable.com/forum/question_about_assistant_and___47__archive__47__/++laptop: git-annex version: 5.20151116+gitg5416a1a-1~ndall+1++server: git-annex version: 5.20151109-g08bb3b1++windows: the latest build on the website+
doc/git-annex.mdwn view
@@ -789,16 +789,26 @@  * `annex.largefiles` -  Allows configuring which files `git annex add` and the assistant consider-  to be large enough to need to be added to the annex. By default,-  all files are added to the annex.+  Allows configuring which files are considered to be large enough to+  need to be added to the annex. By default, all specified files are added+  to the annex, but configuring this can cause the small files to be+  checked into git, without using the annex.    The value is a preferred content expression. See [[git-annex-preferred-content]](1)   for details.    Example: -        	annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h)+	annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h)++  This setting is checked by `git annex add`, `git annex import` and the assistant.+  It's also used by `git annex addurl` and `git annex importfeed` when+  downloading files.++  It can be useful to temporarily override it via -c at the command line.+  For example:++  	git annex add -c annex.largefiles='include=*' 99kbfile  * `annex.numcopies` 
+ doc/install/Windows/comment_2_ef329ea100b36a1180e232a1f97369d6._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="eren.m.dursun@73116dce47e54243c7ee1637f1289afb02f07f4b"+ nickname="eren.m.dursun"+ subject="Re: Compatibility with recent version of Git for Windows"+ date="2015-11-29T19:24:03Z"+ content="""+To install git-annex next to 64bit git on Windows:++Start cmd.exe with administrator privileges and run+mklink /J \"C:\Program Files (x86)\Git\" \"C:\Program Files\Git\"+to add a sym-link. Install git-annex.+"""]]
+ doc/install/Windows/comment_3_10fb90bc434b4da189ed7235818ef30f._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 3"""+ date="2015-11-30T19:05:36Z"+ content="""+@eren, some of the programs included with git-annex need to use libraries+from Git for Windows. In particular, I think you'll find that rsync doesn't+work if you use the 64 bit Git for Windows.+"""]]
doc/logo.mdwn view
@@ -11,3 +11,11 @@ [[logo-old.svg]]  [[logo-old-bw.svg]]++----++	Copyright: 2007 Henrik Nyh <http://henrik.nyh.se/>+	           2010 Joey Hess <id@joeyh.name>+		   2013 John Lawrence+	License: other+	  Free to modify and redistribute with due credit, and obviously free to use.
− doc/news/version_5.20150930.mdwn
@@ -1,19 +0,0 @@-git-annex 5.20150930 released with [[!toggle text="these changes"]]-[[!toggleable text="""-   * Added new linux standalone "ancient" build to support kernels-     like 2.6.32.-   * info: Don't allow use in a non-git-annex repository, since it-     uses the git-annex branch and would create it if it were missing.-   * assistant: When updating ~/.ssh/config, preserve any symlinks.-   * webapp: Remove the "disable remote" feature from the UI.-   * S3: When built with aws-0.13.0, supports using more storage classes.-     In particular, storageclass=STANDARD\_IA to use Amazon's-     new Infrequently Accessed storage, and storageclass=NEARLINE-     to use Google's NearLine storage.-   * Improve ~/.ssh/config modification code to not add trailing spaces-     to lines it cannot parse.-   * Fix a crash at direct mode merge time when .git/index doesn't exist-     yet. Triggered by eg, git-annex sync --no-commit in a fresh clone of-     a repository.-   * status: Show added but not yet committed files.-   * Added stack.yaml to support easy builds from source with stack."""]]
+ doc/news/version_5.20151208.mdwn view
@@ -0,0 +1,24 @@+git-annex 5.20151208 released with [[!toggle text="these changes"]]+[[!toggleable text="""+   * Build with -j1 again to get reproducible build.+   * Display progress meter in -J mode when copying from a local git repo,+     to a local git repo, and from a remote git repo.+   * Display progress meter in -J mode when downloading from the web.+   * map: Improve display of git remotes with non-ssh urls, including http+     and gcrypt.+   * When core.sharedRepository is set, annex object files are not made mode+     444, since that prevents a user other than the file owner from locking+     them. Instead, a mode such as 664 is used in this case.+   * tahoe: Include tahoe capabilities in whereis display.+   * import: Changed to honor annex.largefiles settings.+   * addurl, importfeed: Changed to honor annex.largefiles settings,+     when the content of the url is downloaded. (Not when using --fast or+     --relaxed.)+   * webapp: Fix bugs that could result in a relative path such as "."+     being written to ~/.config/git-annex/autostart, and ignore any such+     relative paths in the file.+     This was a reversion caused by the relative path changes in 5.20150113.+   * dropunused: Make more robust when trying to drop an object that has+     already been dropped.+   * Fix reversion in handling of long filenames, particularly when using+     addurl/importfeed, which was introduced in the previous release."""]]
doc/not.mdwn view
@@ -52,7 +52,7 @@  * Similarly, git-annex is not [git-lfs](https://github.com/github/git-lfs),   which also uses git smudge filters, and appears to lack git-annex's-  widely distributed storage.+  widely distributed storage and partial checkouts.  * git-annex is also not [boar](http://code.google.com/p/boar/),   although it shares many of its goals and characteristics. Boar implements
+ doc/special_remotes/S3/comment_20_ce4ce50d51675ee4746a2528d4bea750._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="cantora@432fae6be728a32ac472387df86a8922f059d4a6"+ nickname="cantora"+ subject="How to view configuration of special remotes?"+ date="2015-12-08T08:29:12Z"+ content="""+I don't remember which gpg key my s3 remote is using, but I can't seem to get git annex to tell me about the configuration of my s3 remote, which has the gpg key ID that I need to find (I need to restore it from many backed up keys, but need to know which one). Is there a way to view the remote metadata? I was hoping to see a command like `git annex remoteinfo NAME`. (git annex version: `5.20140408-gb37d538`).+"""]]
− doc/special_remotes/bup/comment_15_91e34a0087eaec6ad3c393179621a471._comment
@@ -1,7 +0,0 @@-[[!comment format=mdwn- username="https://woid.cryptobitch.de/foobar"- subject="obnam"- date="2015-11-12T11:50:52Z"- content="""-Will obnam work as well with git-annex for backups?-"""]]
+ doc/special_remotes/comment_29_8393a14f084d022986c8245ee01f4198._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="encryptio@2557a3f5b4ef0cddf8f011d7dbb3e76d46ed9c79"+ nickname="encryptio"+ subject="git-annex-remote-b2"+ date="2015-12-04T03:19:29Z"+ content="""+I wrote an external remote for [Backblaze's B2](https://www.backblaze.com/b2/cloud-storage.html) object storage service: [git-annex-remote-b2](https://github.com/encryptio/git-annex-remote-b2). I can't be arsed to write a full page on it, but the README covers everything an experienced git-annex user needs to know to use it.+"""]]
+ doc/special_remotes/ipfs/comment_5_ba7d08b2bcb6614102c48b4cb3de5b1a._comment view
@@ -0,0 +1,30 @@+[[!comment format=mdwn+ username="rob.syme@92895c98b16fd7a88bed5f10913c522ebfd76c31"+ nickname="rob.syme"+ subject="Finding IPFS hash"+ date="2015-11-18T14:55:33Z"+ content="""+The use case is only very silly - I just wanted to look directly at the data stored at that IPFS hash - it was not important and certainly not worth changing the way git-annex stores its keys.++On a new machine with a new version of git-annex, I can no longer initialize a new IFPS remote:++    ⟫ ipfs version+    ipfs version 0.3.10-dev++    ⟫ git annex version+    git-annex version: 5.20151116-gbe86081+    build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV Inotify DBus DesktopNotify XMPP ConcurrentOutput DNS Feeds Quvi TDFA TorrentParser Database+    key/value backends: SHA256E SHA256 SHA512E SHA512 SHA224E SHA224 SHA384E SHA384 SHA3_256E SHA3_256 SHA3_512E SHA3_512 SHA3_224E SHA3_224 SHA3_384E SHA3_384 SKEIN256E SKEIN256 SKEIN512E SKEIN512 SHA1E SHA1 MD5E MD5 WORM URL+    remote types: git gcrypt S3 bup directory rsync web bittorrent webdav tahoe glacier ddar hook external+    local repository version: 5+    supported repository version: 5+    upgrade supported from repository versions: 0 1 2 4++    ⟫ git annex initremote ipfs type=external externaltype=ipfs encryption=none+    initremote ipfs +    git-annex: git-annex-remote-ipfs: createProcess: runInteractiveProcess: exec: does not exist (No such file or directory)+    failed+    git-annex: initremote: 1 failed++It looks like I'm missing a binary somewhere, but I'm not sure which one is missing.+"""]]
+ doc/special_remotes/ipfs/comment_6_8621bbd87982f73cf401cfa09d95d1e4._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="joey"+ subject="""comment 6"""+ date="2015-11-18T16:22:51Z"+ content="""+@rob.syme I think that error message is pretty clear: git-annex-remote-ipfs+is not present in your PATH or perhaps is not executable.++(Still, the error message could be improved a bit, doing that now.)+"""]]
+ doc/special_remotes/ipfs/comment_7_062f266f26b5788b418de6955bff442d._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="rob.syme@92895c98b16fd7a88bed5f10913c522ebfd76c31"+ nickname="rob.syme"+ subject="git-annex-remote-ipfs"+ date="2015-11-19T14:46:03Z"+ content="""+Silly me - I messed up my bashrc. Fixed now, thanks!+"""]]
+ doc/stickers.mdwn view
@@ -0,0 +1,21 @@+Hexagonal sticker design using the [[logo]] with add-on tiles to expand+the annex.++[[stickers/hex.svg]]+[download hex.svg](hex.svg)++[[stickers/hexdemos.svg]]+[download hexdemos.svg](hexdemos.svg)++This complies with <https://github.com/terinjokes/StickerConstructorSpec/>+and so is intended to combine with other hexagonal stickers.++Some of the add-on tiles contain enough white-space to add other art work+as desired.++It includes some smaller tiles that can bridge between hexagonal and+square/regtangular stickers, as illustrated in+<https://github.com/terinjokes/StickerConstructorSpec/issues/13>.++License: Same as git-annex [[logo]]; Joey would appreciate spare +git-annex stickers mailed his way, but does not require it. ;)
+ doc/stickers/comment_1_96f9b35048793c1cc0902cced82b65c5._comment view
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="http://bret.io/"+ subject="Woo!  "+ date="2015-11-19T23:48:01Z"+ content="""+Rad! Cant wait to add it to:++<img src=\"https://camo.githubusercontent.com/0133cd5cab79bd8e9945d0e89337e2041d157076/68747470733a2f2f63312e737461746963666c69636b722e636f6d2f312f3732302f32313339393337353133395f303564383938316231395f622e6a7067\" height=\"400\">++I like the idea of adapters too :)++https://www.stickermule.com/ and https://hexi.pics/help_en both print high quality spec compliant stickers.+"""]]
+ doc/stickers/comment_2_39cfee29eae5e69d88d84b2c65eb83fe._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="CandyAngel"+ subject="comment 2"+ date="2015-11-20T08:37:39Z"+ content="""+I don't usually like any decals on my stuff.. but I've never come across this before and it looks interesting. I'm really tempted..++However, I wouldn't be able to do it without having some nice way of dealing with tolerance stacking. The overlapping stickers (bottom-right) on the photo above would drive me mad! :)++I went ahead and [raised an issue](https://github.com/terinjokes/StickerConstructorSpec/issues/18) in case they want to deal with this in the specification by having a(some?) guide specification(s) too.+"""]]
+ doc/stickers/hex.svg view
@@ -0,0 +1,1017 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="220mm"+   height="110mm"+   viewBox="0 0 779.52757 389.76378"+   id="svg5535"+   version="1.1"+   inkscape:version="0.91 r13725"+   sodipodi:docname="hex.svg">+  <defs+     id="defs5537">+    <clipPath+       id="clip1">+      <path+         inkscape:connector-curvature="0"+         d="m 0,340.15625 481.89062,0 L 481.89062,0 0,0 0,340.15625 Z m 0,0"+         id="path7" />+    </clipPath>+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="0.32"+     inkscape:cx="201.37678"+     inkscape:cy="300.86122"+     inkscape:document-units="px"+     inkscape:current-layer="layer1"+     showgrid="false"+     showguides="true"+     inkscape:window-width="800"+     inkscape:window-height="730"+     inkscape:window-x="0"+     inkscape:window-y="12"+     inkscape:window-maximized="0"+     units="mm">+    <inkscape:grid+       type="xygrid"+       id="grid3730" />+  </sodipodi:namedview>+  <metadata+     id="metadata5540">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+        <dc:title></dc:title>+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     inkscape:groupmode="layer"+     id="layer2"+     inkscape:label="guides"+     style="display:inline"+     transform="translate(0,-662.59842)">+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 325.6126,1538.1481 518.7035,1339.6027"+       id="path4177"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 325.8853,1538.6936 76.9091,-132.8182"+       id="path3841"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 401.9762,1538.9663 325.3398,1405.0572"+       id="path3843"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 401.4307,1538.6936 209.9762,1338.5118"+       id="path4179"+       inkscape:connector-curvature="0" />+    <path+       style="display:none;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 231.27273,631.81675 153.81818,498.18039"+       id="path3851"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 441.2489,1339.0572 c 0.5455,268.3636 0.5455,268.3636 0.5455,268.3636"+       id="path4171"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 171.7944,1404.5118 153.2727,1.0909"+       id="path3849"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 286.8853,1339.0572 -76.9091,133.0909"+       id="path3847"+       inkscape:connector-curvature="0" />+    <path+       inkscape:connector-curvature="0"+       id="path4193"+       d="m 517.4996,1338.5586 c 0.5454,268.3636 0.5454,268.3636 0.5454,268.3636"+       style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 479.6507,1539.6233 0,-220.6174"+       id="path4232"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 441.0812,1472.8981 77.5246,133.0646"+       id="path4230"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 517.0631,1472.8981 c -75.2105,133.4503 -75.2105,133.4503 -75.2105,133.4503"+       id="path4228"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 516.5216,1472.1481 326.158,1272.5118"+       id="path4293"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 287.1891,1472.5124 210.8215,1338.2907"+       id="path4314"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 632.7035,1273.0572 C 442.3398,1472.6936 442.3398,1472.6936 442.3398,1472.6936"+       id="path4310"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 210.0502,1472.5124 402.5118,1273.1083"+       id="path4325"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 287.5748,1207.9259 -77.1389,263.0437"+       id="path4341"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="M 94.7275,1271.1798 286.032,1472.5124"+       id="path4339"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 305.4307,1372.3299 -121.6363,69.8182"+       id="path4367"+       inkscape:connector-curvature="0" />+    <path+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       d="m 249.2489,1405.0572 0,80.7273"+       id="path4365"+       inkscape:connector-curvature="0" />+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:50%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="304.93979"+       y="592.7428"+       id="text5006"+       sodipodi:linespacing="50%"><tspan+         sodipodi:role="line"+         id="tspan5010"+         x="304.93979"+         y="592.7428" /></text>+    <flowRoot+       xml:space="preserve"+       id="flowRoot5012"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5px;line-height:50%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion+         id="flowRegion5014"><rect+           id="rect5016"+           width="132.58252"+           height="37.565048"+           x="174.56699"+           y="544.12921" /></flowRegion><flowPara+         id="flowPara5018" /></flowRoot>    <flowRoot+       xml:space="preserve"+       id="flowRoot5020"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5px;line-height:50%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"><flowRegion+         id="flowRegion5022"><rect+           id="rect5024"+           width="159.09903"+           height="70.710678"+           x="150.26019"+           y="519.82239" /></flowRegion><flowPara+         id="flowPara5026" /></flowRoot>    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5px;line-height:50%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="243.06796"+       y="583.90393"+       id="text5028"+       sodipodi:linespacing="50%"><tspan+         sodipodi:role="line"+         id="tspan5030"+         x="243.06796"+         y="583.90393" /></text>+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:100%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="303.64539"+       y="1196.0898"+       id="text5032"+       sodipodi:linespacing="100%"><tspan+         sodipodi:role="line"+         id="tspan5034"+         x="303.64539"+         y="1196.0898">workshop</tspan></text>+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:80.00000119%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="795.43005"+       y="817.12488"+       id="text5052"+       sodipodi:linespacing="80.000001%"><tspan+         sodipodi:role="line"+         id="tspan5054"+         x="795.43005"+         y="817.12488">&lt;- cut</tspan><tspan+         sodipodi:role="line"+         x="795.43005"+         y="835.12488"+         id="tspan5056">after</tspan><tspan+         sodipodi:role="line"+         x="795.43005"+         y="853.12488"+         id="tspan5058">printing -&gt;</tspan></text>+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:100%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="834.16504"+       y="53.573872"+       id="text5060"+       sodipodi:linespacing="100%"><tspan+         sodipodi:role="line"+         id="tspan5062"+         x="834.16504"+         y="53.573872" /></text>+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:100%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="1068.3942"+       y="556.28259"+       id="text5064"+       sodipodi:linespacing="100%"><tspan+         sodipodi:role="line"+         id="tspan5066"+         x="1068.3942"+         y="556.28259" /></text>+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:100%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="31.25"+       y="1105.4872"+       id="text3511"+       sodipodi:linespacing="100%"><tspan+         sodipodi:role="line"+         id="tspan3513"+         x="31.25"+         y="1105.4872">(remove yellow borders before printing)</tspan></text>+  </g>+  <g+     inkscape:label="Layer 1"+     inkscape:groupmode="layer"+     id="layer1"+     transform="translate(0,-662.59842)">+    <path+       d="m 288.0751,1205.5751 -77.0088,0 -38.505,66.6925 38.505,66.6925 77.0088,0 38.505,-66.6925 -38.505,-66.6925 z"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       id="path3770"+       inkscape:connector-curvature="0" />+    <path+       d="m 172.3513,1271.5836 -77.0087,0 -38.505,66.6925 38.505,66.6925 77.0087,0 38.505,-66.6925 -38.505,-66.6925 z"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       id="path3772"+       inkscape:connector-curvature="0" />+    <path+       d="m 403.2324,1272.7809 -77.0087,0 -38.505,66.6925 38.505,66.6925 77.0087,0 38.505,-66.6925 -38.505,-66.6925 z"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       id="path3776"+       inkscape:connector-curvature="0" />+    <path+       inkscape:connector-curvature="0"+       id="path3780"+       style="display:inline;fill:#ffff00;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       d="m 403.0232,1405.6381 -77.0087,0 -38.505,66.6925 38.505,66.6925 77.0087,0 38.505,-66.6925 -38.505,-66.6925 z" />+    <path+       d="m 518.2852,1472.9918 -77.0087,0 -38.505,66.6925 38.505,66.6925 77.0087,0 38.505,-66.6925 -38.505,-66.6925 z"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       id="path3782"+       inkscape:connector-curvature="0" />+    <path+       inkscape:connector-curvature="0"+       sodipodi:nodetypes="ccccccccccccccccccc"+       id="path1927"+       d="m 361.244,1519.695 c -4.9886,-0.6427 -10.1226,-5.3595 -10.8399,-10.8931 -0.6879,-4.6263 0.3046,-10.0263 4.1288,-13.0794 1.6773,-1.1432 3.959,-2.4242 5.971,-2.2718 0.06,2.0481 -0.06,4.5376 0,6.5857 -2.3965,0.2668 -4.7163,2.9908 -4.6681,5.4849 0.059,3.2457 1.4952,6.2278 4.6179,7.1992 3.4541,1.1622 7.4079,0.8316 10.6054,-1.1006 2.6413,-2.058 2.8857,-5.8898 1.5042,-8.8058 -0.6214,-1.6046 -1.961,-2.7827 -3.7792,-2.7777 l 0,5.7124 -5.1268,0 0,-12.2981 15.5251,0 0,4.4225 -4.2524,0.039 c 3.9682,2.2621 4.3749,7.1442 4.1716,10.5313 0.1429,5.8185 -5.6054,10.5624 -11.3067,11.1967 -2.0627,0.1546 -3.808,0.1628 -6.5509,0.054 z"+       style="fill:#000000;fill-opacity:1" />+    <path+       inkscape:connector-curvature="0"+       sodipodi:nodetypes="ccccc"+       id="path1925"+       d="m 350.1524,1491.0078 -0.033,-6.454 29.1036,0 0,6.485 -29.0677,-0.031 z"+       style="fill:#40bf4c;fill-opacity:1" />+    <path+       inkscape:connector-curvature="0"+       sodipodi:nodetypes="ccccccccccccc"+       id="path1917"+       d="m 361.2446,1482.2867 0,-6.9069 -11.283,0 0,-6.0105 11.283,0 0,-7.7504 6.7486,0 0,7.7504 11.2302,0 0,6.0105 -11.2302,0 -0.1112,6.8925 -6.6374,0.014 z"+       style="fill:#ff0000;fill-opacity:1" />+    <path+       inkscape:connector-curvature="0"+       style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+       d="m 421.0825,1439.8168 1.0226,11.5259 -3.2195,-1.897 c -0.535,0.8922 -1.1307,1.7304 -1.7687,2.5149 l -4.6621,-3.5184 c 0.4505,-0.5552 0.8728,-1.4186 1.2524,-2.0477 l -3.2025,-1.887 z"+       id="path2836"+       sodipodi:nodetypes="cccccccc"+       inkscape:transform-center-x="-7.5938808"+       inkscape:transform-center-y="-14.892703" />+    <path+       sodipodi:nodetypes="cc"+       inkscape:connector-curvature="0"+       id="path4173"+       d="m 381.5079,1472.0799 c 13.1692,0.9841 18.358,-2.9516 32.181,-19.8195"+       style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+    <path+       inkscape:transform-center-y="-14.892703"+       inkscape:transform-center-x="-7.5938808"+       sodipodi:nodetypes="cccccccc"+       id="path4234"+       d="m 421.0825,1439.8168 1.0226,11.5259 -3.2195,-1.897 c -0.535,0.8922 -1.1307,1.7304 -1.7687,2.5149 l -4.6621,-3.5184 c 0.4505,-0.5552 0.8728,-1.4186 1.2524,-2.0477 l -3.2025,-1.887 z"+       style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+       inkscape:connector-curvature="0" />+    <path+       inkscape:transform-center-y="-14.892703"+       inkscape:transform-center-x="-7.5938808"+       sodipodi:nodetypes="cccccccc"+       id="path4234-6"+       d="m 421.0825,1439.8168 1.0226,11.5259 -3.2195,-1.897 c -0.535,0.8922 -1.1307,1.7304 -1.7687,2.5149 l -4.6621,-3.5184 c 0.4505,-0.5552 0.8728,-1.4186 1.2524,-2.0477 l -3.2025,-1.887 z"+       style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+       inkscape:connector-curvature="0" />+    <g+       id="g4200"+       transform="matrix(-1,0,0,1,672.584,839.94568)">+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m 364.9245,600.03084 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+         id="path4202"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-7.5938808"+         inkscape:transform-center-y="-14.892703" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4204"+         d="m 325.34987,632.29397 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+    </g>+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="295"+       y="612.36218"+       id="text4210"+       sodipodi:linespacing="125%"><tspan+         sodipodi:role="line"+         id="tspan4214"+         x="295"+         y="612.36218" /></text>+    <g+       id="g4296"+       transform="translate(56.158,839.78592)">+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path3369"+         d="m 368.32919,596.00324 c 16.28841,-12.44463 11.95901,-34.92532 5.48374,-49.13832"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m 366.86495,534.32461 10.72674,4.33949 -3.1552,2.00212 c 0.55054,0.88265 1.02545,1.79476 1.43327,2.72001 l -5.25579,2.54784 c -0.28914,-0.65386 -0.86528,-1.4231 -1.25249,-2.04757 l -3.13851,1.99153 z"+         id="path4288"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-4.9547788"+         inkscape:transform-center-y="-2.0479419" />+    </g>+    <g+       id="g4268"+       transform="translate(78.15537,281.85591)">+      <path+         d="m 462.58897,499.84363 -77.00875,0 -38.505,66.6925 38.505,66.6925 77.00875,0 38.505,-66.6925 -38.505,-66.6925 z"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         id="path3778"+         inkscape:connector-curvature="0" />+      <g+         id="g4262">+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4264"+           d="m 369.14737,596.54869 c 179.79378,-174.98868 95.13045,83.3911 55.1201,-80.50195"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+        <path+           inkscape:transform-center-y="-18.010798"+           inkscape:transform-center-x="0.7747508"+           sodipodi:nodetypes="cccccccc"+           id="path4266"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+      </g>+    </g>+    <g+       id="g4278"+       transform="matrix(-1,0,0,1,682.6161,291.09305)">+      <g+         id="g4865">+        <path+           transform="matrix(-1,0,0,1,646.48904,412.98535)"+           inkscape:connector-curvature="0"+           id="path4276"+           style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           d="m 183.90007,86.85828 77.00875,0 38.505,66.6925 -38.505,66.6925 -77.00875,0 -38.505,-66.6925 38.505,-66.6925 z" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 369.14737,596.54869 c 212.57536,-152.79796 34.16912,123.05809 55.1201,-80.50195"+           id="path4280"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           id="path4282"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="0.7747508"+           inkscape:transform-center-y="-18.010798" />+      </g>+      <g+         id="g4870">+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4874"+           d="m 369.14737,596.54869 c 212.57536,-152.79796 34.16912,123.05809 55.1201,-80.50195"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+        <path+           inkscape:transform-center-y="-18.010798"+           inkscape:transform-center-x="0.7747508"+           sodipodi:nodetypes="cccccccc"+           id="path4876"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+      </g>+    </g>+    <path+       inkscape:connector-curvature="0"+       id="path4286"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       d="m 518.3442,1339.9866 -77.0088,0 -38.505,66.6925 38.505,66.6925 77.0088,0 38.505,-66.6925 -38.505,-66.6925 z" />+    <g+       id="g4300"+       transform="matrix(-1,0,0,1,903.4486,839.49381)">+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m 368.32919,596.00324 c 16.28841,-12.44463 11.95901,-34.92532 5.48374,-49.13832"+         id="path4302"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:transform-center-y="-2.0479419"+         inkscape:transform-center-x="-4.9547788"+         sodipodi:nodetypes="cccccccc"+         id="path4304"+         d="m 366.86495,534.32461 10.72674,4.33949 -3.1552,2.00212 c 0.55054,0.88265 1.02545,1.79476 1.43327,2.72001 l -5.25579,2.54784 c -0.28914,-0.65386 -0.86528,-1.4231 -1.25249,-2.04757 l -3.13851,1.99153 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+    </g>+    <path+       inkscape:connector-curvature="0"+       id="path4306"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       d="m 633.9707,1406.4858 -77.0088,0 -38.505,66.6925 38.505,66.6925 77.0088,0 38.505,-66.6925 -38.505,-66.6925 z" />+    <path+       d="m 633.9707,1273.1689 -77.0088,0 -38.505,66.6925 38.505,66.6925 77.0088,0 38.505,-66.6925 -38.505,-66.6925 z"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       id="path4308"+       inkscape:connector-curvature="0" />+    <g+       id="g4329" />+    <g+       id="g4353" />+    <g+       id="g4386"+       transform="translate(56.158,839.78592)">+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m 368.32919,596.00324 c 16.28841,-12.44463 11.95901,-34.92532 5.48374,-49.13832"+         id="path4388"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:transform-center-y="-2.0479419"+         inkscape:transform-center-x="-4.9547788"+         sodipodi:nodetypes="cccccccc"+         id="path4390"+         d="m 366.86495,534.32461 10.72674,4.33949 -3.1552,2.00212 c 0.55054,0.88265 1.02545,1.79476 1.43327,2.72001 l -5.25579,2.54784 c -0.28914,-0.65386 -0.86528,-1.4231 -1.25249,-2.04757 l -3.13851,1.99153 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+    </g>+    <g+       id="g4400"+       transform="translate(391.60209,6.75397)">+      <g+         transform="translate(111.34978,210.75404)"+         id="g4375">+        <path+           d="m 231.07321,499.9747 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z"+           style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           id="path626"+           inkscape:connector-curvature="0" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4319"+           d="m 249.29398,597.77999 c -7.62767,-9.76104 -74.35507,-18.74907 -10.66556,-55.41105"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 249.2985,533.94593 -3.05391,11.16099 -2.35772,-2.89913 c -0.81214,0.65008 -1.66238,1.2285 -2.53352,1.74184 l -3.14561,-4.92138 c 0.61552,-0.36371 1.31203,-1.02593 1.88688,-1.48358 l -2.34526,-2.88379 z"+           id="path4321"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="-0.8537788"+           inkscape:transform-center-y="-5.2672031" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+           d="m 192.65946,503.68994 c -5.55525,6.2109 -9.2174,75.03571 -47.31146,41.52113"+           id="path4347"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:transform-center-y="-5.2672031"+           inkscape:transform-center-x="-0.8537788"+           sodipodi:nodetypes="cccccccc"+           id="path4349"+           d="m 136.1536,533.7696 11.16099,3.05391 -2.89913,2.35772 c 0.65008,0.81214 1.2285,1.66238 1.74184,2.53352 l -4.92138,3.14561 c -0.36371,-0.61552 -1.02593,-1.31203 -1.48358,-1.88688 l -2.88379,2.34526 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+           d="m 137.82586,596.30242 c 2.73241,5.35647 49.24076,-69.47997 55.40614,19.54145"+           id="path4359"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:transform-center-y="-1.9921231"+           inkscape:transform-center-x="3.1470162"+           sodipodi:nodetypes="cccccccc"+           id="path4361"+           d="m 192.94014,632.35933 -7.22736,-9.03656 3.73144,-0.20046 c -0.0478,-1.03918 -0.0152,-2.067 0.0824,-3.07343 l 5.83015,0.3524 c -0.0681,0.71169 0.0575,1.66452 0.0893,2.39861 l 3.7117,-0.19942 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+      </g>+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4394"+         d="m 342.11112,710.63678 -39.34085,66.72517"+         style="fill:none;fill-rule:evenodd;stroke:#f8ff00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4396"+         d="m 226.78843,777.74764 75.98184,-0.3857"+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4398"+         d="M 342.11112,843.70142 303.54166,777.36195"+         style="fill:none;fill-rule:evenodd;stroke:#ffe900;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+    </g>+    <g+       transform="translate(245.16964,204.81767)"+       id="g4622">+      <path+         d="m 175.5925,655.30669 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z"+         style="display:inline;fill:#ffff00;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         id="path4624"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#000000;fill-opacity:1"+         d="m 133.81328,769.36362 c -4.98858,-0.64265 -10.12259,-5.35945 -10.83989,-10.89312 -0.68794,-4.62623 0.30456,-10.02623 4.12875,-13.07935 1.67733,-1.14327 3.959,-2.42422 5.97107,-2.27178 0.0603,2.0481 -0.0603,4.53751 0,6.58561 -2.39655,0.26682 -4.71638,2.99081 -4.6681,5.48492 0.0587,3.24569 1.4952,6.2278 4.61788,7.1992 3.45403,1.16223 7.40791,0.83167 10.60533,-1.10057 2.64137,-2.05802 2.88574,-5.8898 1.50423,-8.8058 -0.62143,-1.60464 -1.96101,-2.78268 -3.77919,-2.77775 l 0,5.71246 -5.12679,0 0,-12.29807 15.52512,0 0,4.42245 -4.25241,0.0393 c 3.96819,2.26207 4.37493,7.14424 4.17158,10.53133 0.14295,5.81845 -5.6054,10.56238 -11.30674,11.19666 -2.06269,0.15465 -3.80795,0.16279 -6.55084,0.0545 z"+         id="path4626"+         sodipodi:nodetypes="ccccccccccccccccccc"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#40bf4c;fill-opacity:1"+         d="m 122.72168,740.67638 -0.0326,-6.45396 29.10361,0 -0.003,6.48504 -29.06768,-0.0311 z"+         id="path4628"+         sodipodi:nodetypes="ccccc"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#ff0000;fill-opacity:1"+         d="m 133.81384,731.95529 0,-6.90684 -11.28293,0 0,-6.01053 11.28293,0 0,-7.75042 6.74866,0 0,7.75042 11.2302,0 0,6.01053 -11.2302,0 -0.11125,6.89243 -6.63741,0.0144 z"+         id="path4630"+         sodipodi:nodetypes="ccccccccccccc"+         inkscape:connector-curvature="0" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+         d="m 154.07714,721.74852 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+         id="path4632"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m 193.65177,689.48539 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+         id="path4634"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-7.5938808"+         inkscape:transform-center-y="-14.892703" />+      <g+         transform="matrix(-1,0,0,1,445.15327,89.614307)"+         id="g4636">+        <path+           inkscape:transform-center-y="-14.892703"+           inkscape:transform-center-x="-7.5938808"+           sodipodi:nodetypes="cccccccc"+           id="path4638"+           d="m 364.9245,600.03084 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 325.34987,632.29397 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+           id="path4640"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+      </g>+    </g>+    <g+       transform="translate(1119.7747,19.39156)"+       id="g4642">+      <g+         id="g4644"+         transform="translate(77.454547,62.727274)">+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4646"+           d="m -106.81811,732.93789 c -7.62767,-9.76104 -74.35507,-18.74907 -10.66556,-55.41105"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m -106.81359,669.10383 -3.05391,11.16099 -2.35772,-2.89913 c -0.81214,0.65008 -1.66238,1.2285 -2.53352,1.74184 l -3.14561,-4.92138 c 0.61552,-0.36371 1.31203,-1.02593 1.88688,-1.48358 l -2.34526,-2.88379 z"+           id="path4648"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="-0.8537788"+           inkscape:transform-center-y="-5.2672031" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#f8ff00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           d="m -125.35075,635.04064 -39.34085,66.72517"+           id="path4650"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ffe900;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           d="m -125.35075,768.10528 -38.56946,-66.33947"+           id="path4652"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+      </g>+      <path+         style="fill:none;fill-rule:evenodd;stroke:#f9ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -48.545453,698.36219 39.272726,65.45455 -38.727276,66"+         id="path4654"+         inkscape:connector-curvature="0" />+    </g>+    <g+       transform="translate(1120.3201,-101.15389)"+       id="g4656">+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m -97.179901,820.75693 c -5.555249,6.2109 -9.217399,75.03571 -47.311459,41.52113"+         id="path4658"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:transform-center-y="-5.2672031"+         inkscape:transform-center-x="-0.8537788"+         sodipodi:nodetypes="cccccccc"+         id="path4660"+         d="m -153.68576,850.83659 11.16099,3.05391 -2.89913,2.35772 c 0.65008,0.81214 1.2285,1.66238 1.74184,2.53352 l -4.92138,3.14561 c -0.36371,-0.61552 -1.02593,-1.31203 -1.48358,-1.88688 l -2.88379,2.34526 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m -174.40071,884.06059 75.981839,-0.3857"+         id="path4662"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:connector-curvature="0"+         id="path4664"+         d="m -99.000001,883.54402 39.81818,-66.81819"+         style="fill:none;fill-rule:evenodd;stroke:#fff700;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         id="path4666"+         d="m -59.463711,816.94972 -76.753229,0 -38.56946,66.33948"+         style="fill:none;fill-rule:evenodd;stroke:#f0ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+    </g>+    <g+       transform="translate(1121.9565,-101.69934)"+       id="g4668">+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m -156.10441,923.00578 c 2.73241,5.35647 49.24076,-69.47997 55.40614,19.54145"+         id="path4670"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:transform-center-y="-1.9921231"+         inkscape:transform-center-x="3.1470162"+         sodipodi:nodetypes="cccccccc"+         id="path4672"+         d="m -100.99013,959.06269 -7.22736,-9.03656 3.73144,-0.20046 c -0.0478,-1.03918 -0.0152,-2.067 0.0824,-3.07343 l 5.830147,0.3524 c -0.0681,0.71169 0.0575,1.66452 0.0893,2.39861 l 3.7117,-0.19942 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m -178.49162,893.69696 75.98184,-0.3857"+         id="path4674"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:connector-curvature="0"+         id="path4676"+         d="m -103.90909,893.18039 40.909087,67.09091"+         style="fill:none;fill-rule:evenodd;stroke:#f3ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         id="path4678"+         d="m -178.63637,893.72584 39.27273,66.81818 76.363637,-0.54545"+         style="fill:none;fill-rule:evenodd;stroke:#ffe800;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+    </g>+    <g+       id="g4722"+       transform="translate(-68.56602,362.48887)">+      <path+         d="m 231.51016,498.82244 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         id="path4384"+         inkscape:connector-curvature="0" />+      <path+         sodipodi:nodetypes="csc"+         inkscape:connector-curvature="0"+         id="path4692"+         d="m 248.23414,597.36687 c -12.08969,-7.29009 -21.44443,-80.08465 -50.01457,-3.56579 -18.39769,49.27419 -42.43019,-41.02463 -51.52732,-48.47894"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m 136.03878,533.85322 1.62247,11.45695 2.7044,-2.57875 c 0.7237,0.74728 1.49423,1.42828 2.29371,2.04734 l 3.74095,-4.48555 c -0.56476,-0.4384 -1.17222,-1.18315 -1.68478,-1.70962 l 2.6901,-2.56512 z"+         id="path4694"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-0.4755438"+         inkscape:transform-center-y="-5.8683169" />+    </g>+    <g+       id="g4711"+       transform="matrix(-1,0,0,1,318.82406,215.12694)">+      <path+         inkscape:connector-curvature="0"+         id="path4713"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 231.51016,498.82244 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m 248.23414,597.36687 c -12.08969,-7.29009 -18.12987,-116.54484 -46.70001,-40.02598 -18.39769,49.27419 -45.74475,-4.56444 -54.84188,-12.01875"+         id="path4715"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="csc" />+      <path+         inkscape:transform-center-y="-5.8683169"+         inkscape:transform-center-x="-0.4755438"+         sodipodi:nodetypes="cccccccc"+         id="path4717"+         d="m 136.03878,533.85322 1.62247,11.45695 2.7044,-2.57875 c 0.7237,0.74728 1.49423,1.42828 2.29371,2.04734 l 3.74095,-4.48555 c -0.56476,-0.4384 -1.17222,-1.18315 -1.68478,-1.70962 l 2.6901,-2.56512 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+    </g>+    <g+       transform="matrix(-1,0,0,1,991.43724,158.30858)"+       id="g4743">+      <g+         id="g4745"+         transform="translate(111.34978,210.75404)">+        <path+           inkscape:connector-curvature="0"+           id="path4747"+           style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           d="m 231.07321,499.9747 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+           d="m 249.29398,597.77999 c -7.62767,-9.76104 -74.35507,-18.74907 -10.66556,-55.41105"+           id="path4749"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:transform-center-y="-5.2672031"+           inkscape:transform-center-x="-0.8537788"+           sodipodi:nodetypes="cccccccc"+           id="path4751"+           d="m 249.2985,533.94593 -3.05391,11.16099 -2.35772,-2.89913 c -0.81214,0.65008 -1.66238,1.2285 -2.53352,1.74184 l -3.14561,-4.92138 c 0.61552,-0.36371 1.31203,-1.02593 1.88688,-1.48358 l -2.34526,-2.88379 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4753"+           d="m 192.65946,503.68994 c -5.55525,6.2109 -9.2174,75.03571 -47.31146,41.52113"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 136.1536,533.7696 11.16099,3.05391 -2.89913,2.35772 c 0.65008,0.81214 1.2285,1.66238 1.74184,2.53352 l -4.92138,3.14561 c -0.36371,-0.61552 -1.02593,-1.31203 -1.48358,-1.88688 l -2.88379,2.34526 z"+           id="path4755"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="-0.8537788"+           inkscape:transform-center-y="-5.2672031" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4757"+           d="m 137.82586,596.30242 c 2.73241,5.35647 49.24076,-69.47997 55.40614,19.54145"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 192.94014,632.35933 -7.22736,-9.03656 3.73144,-0.20046 c -0.0478,-1.03918 -0.0152,-2.067 0.0824,-3.07343 l 5.83015,0.3524 c -0.0681,0.71169 0.0575,1.66452 0.0893,2.39861 l 3.7117,-0.19942 z"+           id="path4759"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="3.1470162"+           inkscape:transform-center-y="-1.9921231" />+      </g>+      <path+         style="fill:none;fill-rule:evenodd;stroke:#f8ff00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 342.11112,710.63678 -39.34085,66.72517"+         id="path4761"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 226.78843,777.74764 75.98184,-0.3857"+         id="path4763"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ffe900;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="M 342.11112,843.70142 303.54166,777.36195"+         id="path4765"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+    </g>+    <g+       id="g4767"+       transform="matrix(-1,0,0,1,926.46374,167.44204)">+      <g+         transform="translate(77.454547,62.727274)"+         id="g4769">+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+           d="m -106.81811,732.93789 c -7.62767,-9.76104 -74.35507,-18.74907 -10.66556,-55.41105"+           id="path4771"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:transform-center-y="-5.2672031"+           inkscape:transform-center-x="-0.8537788"+           sodipodi:nodetypes="cccccccc"+           id="path4773"+           d="m -106.81359,669.10383 -3.05391,11.16099 -2.35772,-2.89913 c -0.81214,0.65008 -1.66238,1.2285 -2.53352,1.74184 l -3.14561,-4.92138 c 0.61552,-0.36371 1.31203,-1.02593 1.88688,-1.48358 l -2.34526,-2.88379 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4775"+           d="m -125.35075,635.04064 -39.34085,66.72517"+           style="fill:none;fill-rule:evenodd;stroke:#f8ff00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4777"+           d="m -125.35075,768.10528 -38.56946,-66.33947"+           style="fill:none;fill-rule:evenodd;stroke:#ffe900;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+      </g>+      <path+         inkscape:connector-curvature="0"+         id="path4779"+         d="m -48.545453,698.36219 39.272726,65.45455 -38.727276,66"+         style="fill:none;fill-rule:evenodd;stroke:#f9ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+    </g>+    <g+       id="g4781"+       transform="matrix(-1,0,0,1,925.91828,46.89659)">+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4783"+         d="m -97.179901,820.75693 c -5.555249,6.2109 -9.217399,75.03571 -47.311459,41.52113"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m -153.68576,850.83659 11.16099,3.05391 -2.89913,2.35772 c 0.65008,0.81214 1.2285,1.66238 1.74184,2.53352 l -4.92138,3.14561 c -0.36371,-0.61552 -1.02593,-1.31203 -1.48358,-1.88688 l -2.88379,2.34526 z"+         id="path4785"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-0.8537788"+         inkscape:transform-center-y="-5.2672031" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4787"+         d="m -174.40071,884.06059 75.981839,-0.3857"+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#fff700;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -99.000001,883.54402 39.81818,-66.81819"+         id="path4789"+         inkscape:connector-curvature="0" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#f0ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -59.463711,816.94972 -76.753229,0 -38.56946,66.33948"+         id="path4791"+         inkscape:connector-curvature="0" />+    </g>+    <g+       id="g4793"+       transform="matrix(-1,0,0,1,924.28192,46.35114)">+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4795"+         d="m -156.10441,923.00578 c 2.73241,5.35647 49.24076,-69.47997 55.40614,19.54145"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m -100.99013,959.06269 -7.22736,-9.03656 3.73144,-0.20046 c -0.0478,-1.03918 -0.0152,-2.067 0.0824,-3.07343 l 5.830147,0.3524 c -0.0681,0.71169 0.0575,1.66452 0.0893,2.39861 l 3.7117,-0.19942 z"+         id="path4797"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="3.1470162"+         inkscape:transform-center-y="-1.9921231" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4799"+         d="m -178.49162,893.69696 75.98184,-0.3857"+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#f3ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -103.90909,893.18039 40.909087,67.09091"+         id="path4801"+         inkscape:connector-curvature="0" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ffe800;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -178.63637,893.72584 39.27273,66.81818 76.363637,-0.54545"+         id="path4803"+         inkscape:connector-curvature="0" />+    </g>+    <path+       inkscape:connector-curvature="0"+       id="path4858"+       style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+       d="m 287.2562,1338.4273 -77.0088,0 -38.505,66.6925 38.505,66.6925 77.0088,0 38.505,-66.6925 -38.505,-66.6925 z" />+    <text+       xml:space="preserve"+       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:35px;line-height:100%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+       x="9.375"+       y="558.61218"+       id="text5571"+       sodipodi:linespacing="100%"><tspan+         sodipodi:role="line"+         id="tspan5573"+         x="9.375"+         y="558.61218">git-annex tiling stickers</tspan><tspan+         sodipodi:role="line"+         x="9.375"+         y="593.61218"+         id="tspan5577">compliant with</tspan><tspan+         sodipodi:role="line"+         x="9.375"+         y="628.61218"+         id="tspan5575">https://github.com/terinjokes/StickerConstructorSpec/</tspan></text>+  </g>+</svg>
+ doc/stickers/hexdemos.svg view
@@ -0,0 +1,628 @@+<?xml version="1.0" encoding="UTF-8" standalone="no"?>+<!-- Created with Inkscape (http://www.inkscape.org/) -->++<svg+   xmlns:ns2="http://ns.adobe.com/AdobeIllustrator/10.0/"+   xmlns:dc="http://purl.org/dc/elements/1.1/"+   xmlns:cc="http://creativecommons.org/ns#"+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"+   xmlns:svg="http://www.w3.org/2000/svg"+   xmlns="http://www.w3.org/2000/svg"+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"+   width="210mm"+   height="297mm"+   viewBox="0 0 744.09448819 1052.3622047"+   id="svg3720"+   version="1.1"+   inkscape:version="0.91 r13725"+   sodipodi:docname="hexdemos.svg">+  <defs+     id="defs3722">+    <clipPath+       id="clip1">+      <path+         inkscape:connector-curvature="0"+         d="m 0,340.15625 481.89062,0 L 481.89062,0 0,0 0,340.15625 Z m 0,0"+         id="path7" />+    </clipPath>+  </defs>+  <sodipodi:namedview+     id="base"+     pagecolor="#ffffff"+     bordercolor="#666666"+     borderopacity="1.0"+     inkscape:pageopacity="0.0"+     inkscape:pageshadow="2"+     inkscape:zoom="0.35"+     inkscape:cx="375"+     inkscape:cy="520"+     inkscape:document-units="px"+     inkscape:current-layer="layer1"+     showgrid="false"+     inkscape:window-width="1366"+     inkscape:window-height="768"+     inkscape:window-x="0"+     inkscape:window-y="0"+     inkscape:window-maximized="0" />+  <metadata+     id="metadata3725">+    <rdf:RDF>+      <cc:Work+         rdf:about="">+        <dc:format>image/svg+xml</dc:format>+        <dc:type+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />+        <dc:title></dc:title>+      </cc:Work>+    </rdf:RDF>+  </metadata>+  <g+     inkscape:label="Layer 1"+     inkscape:groupmode="layer"+     id="layer1">+    <g+       id="g10"+       clip-path="url(#clip1)"+       style="clip-rule:nonzero;display:inline"+       transform="matrix(0.10894991,0,0,0.10894991,528.54623,740.43302)">+      <path+         id="path12"+         d="M 0,340.15625 113.38672,170.07812 0,0 85.039062,0 198.42578,170.07812 85.039062,340.15625 0,340.15625 Z m 0,0"+         style="fill:#0013ec;fill-opacity:1;fill-rule:nonzero;stroke:none"+         inkscape:connector-curvature="0" />+      <path+         id="path14"+         d="M 113.38672,340.15625 226.77344,170.07812 113.38672,0 l 85.03906,0 226.76953,340.15625 -85.03906,0 -70.86328,-106.29688 -70.86719,106.29688 -85.03906,0 z m 0,0"+         style="fill:#82a7ff;fill-opacity:1;fill-rule:nonzero;stroke:none"+         inkscape:connector-curvature="0" />+      <path+         id="path16"+         d="m 387.40234,240.94531 -37.79297,-56.6914 132.28125,-0.004 0,56.69531 -94.48828,0 z m 0,0"+         style="fill:#0013ec;fill-opacity:1;fill-rule:nonzero;stroke:none"+         inkscape:connector-curvature="0" />+      <path+         id="path18"+         d="m 330.71094,155.90625 -37.79688,-56.691406 188.97656,-0.0039 0,56.695316 -151.17968,0 z m 0,0"+         style="fill:#0013ec;fill-opacity:1;fill-rule:nonzero;stroke:none"+         inkscape:connector-curvature="0" />+    </g>+    <g+       style="display:inline"+       transform="matrix(0.47991457,0,0,0.47991457,210.94383,674.58843)"+       id="Layer_1"+       ns2:layer="yes"+       ns2:dimmedPercent="50"+       ns2:rgbTrio="#4F008000FFFF">+      <g+         id="g7">+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 51.986,57.297 c -1.797,0.025 0.34,0.926 2.686,1.287 0.648,-0.506 1.236,-1.018 1.76,-1.516 -1.461,0.358 -2.948,0.366 -4.446,0.229"+           id="path9" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 61.631,54.893 c 1.07,-1.477 1.85,-3.094 2.125,-4.766 -0.24,1.192 -0.887,2.221 -1.496,3.307 -3.359,2.115 -0.316,-1.256 -0.002,-2.537 -3.612,4.546 -0.496,2.726 -0.627,3.996"+           id="path11" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 65.191,45.629 c 0.217,-3.236 -0.637,-2.213 -0.924,-0.978 0.335,0.174 0.6,2.281 0.924,0.978"+           id="path13" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 45.172,1.399 c 0.959,0.172 2.072,0.304 1.916,0.533 1.049,-0.23 1.287,-0.442 -1.916,-0.533"+           id="path15" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="M 47.088,1.932 46.41,2.072 47.041,2.016 47.088,1.932"+           id="path17" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 32.372,59.764 -0.252,1.26 c 1.181,1.604 2.118,3.342 3.626,4.596 -1.085,-2.118 -1.891,-2.993 -3.374,-5.856"+           id="path21" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 35.164,59.654 c -0.625,-0.691 -0.995,-1.523 -1.409,-2.352 0.396,1.457 1.207,2.709 1.962,3.982 l -0.553,-1.63"+           id="path23" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 84.568,48.916 -0.264,0.662 c -0.484,3.438 -1.529,6.84 -3.131,9.994 1.77,-3.328 2.915,-6.968 3.395,-10.656"+           id="path25" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="M 45.527,0.537 C 46.742,0.092 48.514,0.293 49.803,0 48.123,0.141 46.451,0.225 44.8,0.438 l 0.727,0.099"+           id="path27" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="m 2.872,23.219 c 0.28,2.592 -1.95,3.598 0.494,1.889 1.31,-2.951 -0.512,-0.815 -0.494,-1.889"+           id="path29" />+        <path+           style="fill:#a80030"+           inkscape:connector-curvature="0"+           ns2:knockout="Off"+           d="M 0,35.215 C 0.563,33.487 0.665,32.449 0.88,31.449 -0.676,33.438 0.164,33.862 0,35.215"+           id="path31" />+      </g>+    </g>+    <g+       id="g4533"+       transform="matrix(-1,0,0,-1,337.47913,1609.9151)">+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4511"+         d="m -97.179901,820.75693 c -5.555249,6.2109 -9.217399,75.03571 -47.311459,41.52113"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m -153.68576,850.83659 11.16099,3.05391 -2.89913,2.35772 c 0.65008,0.81214 1.2285,1.66238 1.74184,2.53352 l -4.92138,3.14561 c -0.36371,-0.61552 -1.02593,-1.31203 -1.48358,-1.88688 l -2.88379,2.34526 z"+         id="path4513"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-0.8537788"+         inkscape:transform-center-y="-5.2672031" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4515"+         d="m -174.40071,884.06059 75.981839,-0.3857"+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#fff700;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -99.000001,883.54402 39.81818,-66.81819"+         id="path4517"+         inkscape:connector-curvature="0" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#f0ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"+         d="m -59.463711,816.94972 -76.753229,0 -38.56946,66.33948"+         id="path4519"+         inkscape:connector-curvature="0" />+    </g>+    <g+       id="g4591"+       transform="translate(184.79893,205.58643)">+      <path+         inkscape:connector-curvature="0"+         id="path4573"+         style="display:inline;fill:#ffff00;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 175.5925,655.30669 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z" />+      <path+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="ccccccccccccccccccc"+         id="path4575"+         d="m 133.81328,769.36362 c -4.98858,-0.64265 -10.12259,-5.35945 -10.83989,-10.89312 -0.68794,-4.62623 0.30456,-10.02623 4.12875,-13.07935 1.67733,-1.14327 3.959,-2.42422 5.97107,-2.27178 0.0603,2.0481 -0.0603,4.53751 0,6.58561 -2.39655,0.26682 -4.71638,2.99081 -4.6681,5.48492 0.0587,3.24569 1.4952,6.2278 4.61788,7.1992 3.45403,1.16223 7.40791,0.83167 10.60533,-1.10057 2.64137,-2.05802 2.88574,-5.8898 1.50423,-8.8058 -0.62143,-1.60464 -1.96101,-2.78268 -3.77919,-2.77775 l 0,5.71246 -5.12679,0 0,-12.29807 15.52512,0 0,4.42245 -4.25241,0.0393 c 3.96819,2.26207 4.37493,7.14424 4.17158,10.53133 0.14295,5.81845 -5.6054,10.56238 -11.30674,11.19666 -2.06269,0.15465 -3.80795,0.16279 -6.55084,0.0545 z"+         style="fill:#000000;fill-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="ccccc"+         id="path4577"+         d="m 122.72168,740.67638 -0.0326,-6.45396 29.10361,0 -0.003,6.48504 -29.06768,-0.0311 z"+         style="fill:#40bf4c;fill-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="ccccccccccccc"+         id="path4579"+         d="m 133.81384,731.95529 0,-6.90684 -11.28293,0 0,-6.01053 11.28293,0 0,-7.75042 6.74866,0 0,7.75042 11.2302,0 0,6.01053 -11.2302,0 -0.11125,6.89243 -6.63741,0.0144 z"+         style="fill:#ff0000;fill-opacity:1" />+      <path+         sodipodi:nodetypes="cc"+         inkscape:connector-curvature="0"+         id="path4581"+         d="m 154.07714,721.74852 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+      <path+         inkscape:transform-center-y="-14.892703"+         inkscape:transform-center-x="-7.5938808"+         sodipodi:nodetypes="cccccccc"+         id="path4583"+         d="m 193.65177,689.48539 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+      <g+         id="g4585"+         transform="matrix(-1,0,0,1,445.15327,89.614307)">+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 364.9245,600.03084 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+           id="path4587"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="-7.5938808"+           inkscape:transform-center-y="-14.892703" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4589"+           d="m 325.34987,632.29397 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+      </g>+    </g>+    <g+       transform="translate(12.550131,294.22209)"+       id="g4612">+      <path+         inkscape:connector-curvature="0"+         id="path4614"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 462.58897,499.84363 -77.00875,0 -38.505,66.6925 38.505,66.6925 77.00875,0 38.505,-66.6925 -38.505,-66.6925 z" />+      <g+         id="g4616">+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 369.14737,596.54869 c 179.79378,-174.98868 95.13045,83.3911 55.1201,-80.50195"+           id="path4618"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           id="path4620"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="0.7747508"+           inkscape:transform-center-y="-18.010798" />+      </g>+    </g>+    <g+       id="g4680"+       transform="matrix(1,0,0,-1,127.78383,1360.044)">+      <path+         inkscape:connector-curvature="0"+         id="path4682"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 462.58897,499.84363 -77.00875,0 -38.505,66.6925 38.505,66.6925 77.00875,0 38.505,-66.6925 -38.505,-66.6925 z" />+      <g+         id="g4684">+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 369.14737,596.54869 c 179.79378,-174.98868 95.13045,83.3911 55.1201,-80.50195"+           id="path4686"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           id="path4688"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="0.7747508"+           inkscape:transform-center-y="-18.010798" />+      </g>+    </g>+    <g+       transform="matrix(1,2.0107719e-5,2.0107719e-5,-1,-101.29487,1223.1898)"+       id="g4727">+      <g+         id="g4853"+         transform="matrix(-0.9999191,0.01271977,-0.01271977,-0.9999191,626.31079,1260.0115)"+         inkscape:transform-center-x="-16.572815"+         inkscape:transform-center-y="-15.467961">+        <path+           inkscape:connector-curvature="0"+           id="path4729"+           style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           d="m 231.51016,498.82244 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+           d="m 248.23414,597.36687 c -12.08969,-7.29009 -18.12987,-116.54484 -46.70001,-40.02598 -18.39769,49.27419 -45.74475,-4.56444 -54.84188,-12.01875"+           id="path4731"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="csc" />+        <path+           inkscape:transform-center-y="-5.8683169"+           inkscape:transform-center-x="-0.4755438"+           sodipodi:nodetypes="cccccccc"+           id="path4733"+           d="m 136.03878,533.85322 1.62247,11.45695 2.7044,-2.57875 c 0.7237,0.74728 1.49423,1.42828 2.29371,2.04734 l 3.74095,-4.48555 c -0.56476,-0.4384 -1.17222,-1.18315 -1.68478,-1.70962 l 2.6901,-2.56512 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+      </g>+    </g>+    <g+       transform="matrix(0.52225441,0.85278973,-0.85278973,0.52225441,588.38542,265.88987)"+       id="g4735">+      <path+         inkscape:connector-curvature="0"+         id="path4737"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 231.51016,498.82244 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m 248.23414,597.36687 c -12.08969,-7.29009 -21.44443,-80.08465 -50.01457,-3.56579 -18.39769,49.27419 -42.43019,-41.02463 -51.52732,-48.47894"+         id="path4739"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="csc" />+      <path+         inkscape:transform-center-y="-5.8683169"+         inkscape:transform-center-x="-0.4755438"+         sodipodi:nodetypes="cccccccc"+         id="path4741"+         d="m 136.03878,533.85322 1.62247,11.45695 2.7044,-2.57875 c 0.7237,0.74728 1.49423,1.42828 2.29371,2.04734 l 3.74095,-4.48555 c -0.56476,-0.4384 -1.17222,-1.18315 -1.68478,-1.70962 l 2.6901,-2.56512 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+    </g>+    <g+       transform="matrix(0.52823316,0.84909936,0.84909936,-0.52823316,-149.77447,1484.5351)"+       id="g4831">+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1"+         d="m -156.10441,923.00578 c 2.73241,5.35647 49.24076,-69.47997 55.40614,19.54145"+         id="path4833"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:transform-center-y="-1.9921231"+         inkscape:transform-center-x="3.1470162"+         sodipodi:nodetypes="cccccccc"+         id="path4835"+         d="m -100.99013,959.06269 -7.22736,-9.03656 3.73144,-0.20046 c -0.0478,-1.03918 -0.0152,-2.067 0.0824,-3.07343 l 5.830147,0.3524 c -0.0681,0.71169 0.0575,1.66452 0.0893,2.39861 l 3.7117,-0.19942 z"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#fffb00;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m -178.49162,893.69696 75.98184,-0.3857"+         id="path4837"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:connector-curvature="0"+         id="path4839"+         d="m -103.90909,893.18039 40.909087,67.09091"+         style="fill:none;fill-rule:evenodd;stroke:#f3ff00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         id="path4841"+         d="m -178.63637,893.72584 39.27273,66.81818 76.363637,-0.54545"+         style="fill:none;fill-rule:evenodd;stroke:#ffe800;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />+    </g>+    <g+       id="g4843"+       transform="matrix(-0.48344807,-0.87537304,-0.87537304,0.48344807,910.12857,689.09663)"+       inkscape:transform-center-x="48.4375"+       inkscape:transform-center-y="-140.625">+      <path+         inkscape:connector-curvature="0"+         id="path4845"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         d="m 462.58897,499.84363 -77.00875,0 -38.505,66.6925 38.505,66.6925 77.00875,0 38.505,-66.6925 -38.505,-66.6925 z" />+      <g+         id="g4847">+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 369.14737,596.54869 c 179.79378,-174.98868 95.13045,83.3911 55.1201,-80.50195"+           id="path4849"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           id="path4851"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="0.7747508"+           inkscape:transform-center-y="-18.010798" />+      </g>+    </g>+    <g+       transform="matrix(-1,0,0,1,629.2069,294.58461)"+       id="g4878">+      <g+         id="g4880">+        <path+           d="m 183.90007,86.85828 77.00875,0 38.505,66.6925 -38.505,66.6925 -77.00875,0 -38.505,-66.6925 38.505,-66.6925 z"+           style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           id="path4882"+           inkscape:connector-curvature="0"+           transform="matrix(-1,0,0,1,646.48904,412.98535)" />+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4884"+           d="m 369.14737,596.54869 c 212.57536,-152.79796 34.16912,123.05809 55.1201,-80.50195"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+        <path+           inkscape:transform-center-y="-18.010798"+           inkscape:transform-center-x="0.7747508"+           sodipodi:nodetypes="cccccccc"+           id="path4886"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+      </g>+      <g+         id="g4888">+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 369.14737,596.54869 c 212.57536,-152.79796 34.16912,123.05809 55.1201,-80.50195"+           id="path4890"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           id="path4892"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="0.7747508"+           inkscape:transform-center-y="-18.010798" />+      </g>+    </g>+    <g+       transform="matrix(0,1,-1,0,962.67982,79.118649)"+       id="g4906">+      <path+         d="m 175.5925,655.30669 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z"+         style="display:inline;fill:#ffff00;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         id="path4908"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#000000;fill-opacity:1"+         d="m 133.81328,769.36362 c -4.98858,-0.64265 -10.12259,-5.35945 -10.83989,-10.89312 -0.68794,-4.62623 0.30456,-10.02623 4.12875,-13.07935 1.67733,-1.14327 3.959,-2.42422 5.97107,-2.27178 0.0603,2.0481 -0.0603,4.53751 0,6.58561 -2.39655,0.26682 -4.71638,2.99081 -4.6681,5.48492 0.0587,3.24569 1.4952,6.2278 4.61788,7.1992 3.45403,1.16223 7.40791,0.83167 10.60533,-1.10057 2.64137,-2.05802 2.88574,-5.8898 1.50423,-8.8058 -0.62143,-1.60464 -1.96101,-2.78268 -3.77919,-2.77775 l 0,5.71246 -5.12679,0 0,-12.29807 15.52512,0 0,4.42245 -4.25241,0.0393 c 3.96819,2.26207 4.37493,7.14424 4.17158,10.53133 0.14295,5.81845 -5.6054,10.56238 -11.30674,11.19666 -2.06269,0.15465 -3.80795,0.16279 -6.55084,0.0545 z"+         id="path4910"+         sodipodi:nodetypes="ccccccccccccccccccc"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#40bf4c;fill-opacity:1"+         d="m 122.72168,740.67638 -0.0326,-6.45396 29.10361,0 -0.003,6.48504 -29.06768,-0.0311 z"+         id="path4912"+         sodipodi:nodetypes="ccccc"+         inkscape:connector-curvature="0" />+      <path+         style="fill:#ff0000;fill-opacity:1"+         d="m 133.81384,731.95529 0,-6.90684 -11.28293,0 0,-6.01053 11.28293,0 0,-7.75042 6.74866,0 0,7.75042 11.2302,0 0,6.01053 -11.2302,0 -0.11125,6.89243 -6.63741,0.0144 z"+         id="path4914"+         sodipodi:nodetypes="ccccccccccccc"+         inkscape:connector-curvature="0" />+      <path+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+         d="m 154.07714,721.74852 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+         id="path4916"+         inkscape:connector-curvature="0"+         sodipodi:nodetypes="cc" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m 193.65177,689.48539 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+         id="path4918"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-7.5938808"+         inkscape:transform-center-y="-14.892703" />+      <g+         transform="matrix(-1,0,0,1,445.15327,89.614307)"+         id="g4920">+        <path+           inkscape:transform-center-y="-14.892703"+           inkscape:transform-center-x="-7.5938808"+           sodipodi:nodetypes="cccccccc"+           id="path4922"+           d="m 364.9245,600.03084 1.0226,11.52597 -3.21949,-1.89699 c -0.53498,0.89217 -1.13069,1.7304 -1.76867,2.51487 l -4.66214,-3.51845 c 0.45046,-0.55521 0.8728,-1.41853 1.25235,-2.04767 l -3.20246,-1.88696 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+        <path+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1"+           d="m 325.34987,632.29397 c 13.1692,0.98414 18.35807,-2.95155 32.18101,-19.81947"+           id="path4924"+           inkscape:connector-curvature="0"+           sodipodi:nodetypes="cc" />+      </g>+    </g>+    <g+       id="g4926"+       transform="matrix(0.00271106,0.99999633,-0.99999633,0.00271106,872.97406,-95.227214)"+       inkscape:transform-center-x="-104.62014"+       inkscape:transform-center-y="7.2910125">+      <path+         d="m 462.58897,499.84363 -77.00875,0 -38.505,66.6925 38.505,66.6925 77.00875,0 38.505,-66.6925 -38.505,-66.6925 z"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         id="path4928"+         inkscape:connector-curvature="0" />+      <g+         id="g4930">+        <path+           sodipodi:nodetypes="cc"+           inkscape:connector-curvature="0"+           id="path4932"+           d="m 369.14737,596.54869 c 179.79378,-174.98868 95.13045,83.3911 55.1201,-80.50195"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:0;stroke-opacity:1" />+        <path+           inkscape:transform-center-y="-18.010798"+           inkscape:transform-center-x="0.7747508"+           sodipodi:nodetypes="cccccccc"+           id="path4934"+           d="m 422.69966,500.95772 -6.24535,9.74111 3.73197,-0.18982 c 0.0609,1.03849 0.20054,2.05731 0.40251,3.04807 l 5.7616,-0.95861 c -0.14198,-0.70071 -0.11643,-1.66145 -0.16137,-2.39484 l 3.71224,-0.18884 z"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           inkscape:connector-curvature="0" />+      </g>+    </g>+    <g+       id="g4946"+       transform="matrix(1,2.0107719e-5,2.0107719e-5,-1,-18.687743,786.98373)">+      <g+         inkscape:transform-center-y="-21.861258"+         inkscape:transform-center-x="-6.0002714"+         transform="matrix(-0.85808244,-0.51351196,0.51351196,-0.85808244,202.35599,1269.6551)"+         id="g4948">+        <path+           d="m 231.51016,498.82244 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z"+           style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+           id="path4950"+           inkscape:connector-curvature="0" />+        <path+           sodipodi:nodetypes="csc"+           inkscape:connector-curvature="0"+           id="path4952"+           d="m 248.23414,597.36687 c -12.08969,-7.29009 -18.12987,-116.54484 -46.70001,-40.02598 -18.39769,49.27419 -45.74475,-4.56444 -54.84188,-12.01875"+           style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+        <path+           inkscape:connector-curvature="0"+           style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+           d="m 136.03878,533.85322 1.62247,11.45695 2.7044,-2.57875 c 0.7237,0.74728 1.49423,1.42828 2.29371,2.04734 l 3.74095,-4.48555 c -0.56476,-0.4384 -1.17222,-1.18315 -1.68478,-1.70962 l 2.6901,-2.56512 z"+           id="path4954"+           sodipodi:nodetypes="cccccccc"+           inkscape:transform-center-x="-0.4755438"+           inkscape:transform-center-y="-5.8683169" />+      </g>+    </g>+    <g+       id="g4956"+       transform="matrix(-0.87044162,0.49227164,-0.49227164,-0.87044162,888.94556,730.52873)">+      <path+         d="m 231.51016,498.82244 -77.00876,0 -38.505,66.6925 38.505,66.69249 77.00876,0 38.505,-66.69249 -38.505,-66.6925 z"+         style="display:inline;fill:#fff6d5;fill-opacity:0;stroke:#edff24;stroke-width:1.5625;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"+         id="path4958"+         inkscape:connector-curvature="0" />+      <path+         sodipodi:nodetypes="csc"+         inkscape:connector-curvature="0"+         id="path4960"+         d="m 248.23414,597.36687 c -12.08969,-7.29009 -21.44443,-80.08465 -50.01457,-3.56579 -18.39769,49.27419 -42.43019,-41.02463 -51.52732,-48.47894"+         style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:3, 3, 9, 3;stroke-dashoffset:4.80000019;stroke-opacity:1" />+      <path+         inkscape:connector-curvature="0"+         style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:none"+         d="m 136.03878,533.85322 1.62247,11.45695 2.7044,-2.57875 c 0.7237,0.74728 1.49423,1.42828 2.29371,2.04734 l 3.74095,-4.48555 c -0.56476,-0.4384 -1.17222,-1.18315 -1.68478,-1.70962 l 2.6901,-2.56512 z"+         id="path4962"+         sodipodi:nodetypes="cccccccc"+         inkscape:transform-center-x="-0.4755438"+         inkscape:transform-center-y="-5.8683169" />+    </g>+    <rect+       style="fill:#006e93;fill-opacity:1;fill-rule:evenodd;stroke:#009453;stroke-width:2.09441543;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.80000019;stroke-opacity:1"+       id="rect5559"+       width="74.023422"+       height="96.675735"+       x="515.27136"+       y="627.57892"+       rx="0"+       ry="0" />+    <rect+       ry="0"+       rx="0"+       y="627.59033"+       x="437.39053"+       height="96.652977"+       width="75.657951"+       id="rect5569"+       style="fill:#ff7f26;fill-opacity:1;fill-rule:evenodd;stroke:#ff5739;stroke-width:2.11716366;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.80000019;stroke-opacity:1" />+  </g>+</svg>
doc/todo/make_addurl_respect_annex.largefiles_option.mdwn view
@@ -2,3 +2,5 @@  N.B. I do understand that use-case might be somewhat vague, let me know if I should expand reasoning [[!meta author=yoh]]++> [[done]] --[[Joey]]
doc/todo/smudge.mdwn view
@@ -15,6 +15,10 @@ > git to handle this sort of case in an efficient way.. just needs someone > to do the work. --[[Joey]]  +>> Update 2015: git status only calls the clean filter for files+>> that the index says are modified, so this is no longer a problem.+>> --[[Joey]]+ ----  The clean filter is run when files are staged for commit. So a user could copy@@ -36,35 +40,26 @@ and have it use git-annex when .gitattributes says to. Also, annexed files can be directly modified without having to `git annex unlock`. -### design+### configuration  In .gitattributes, the user would put something like "* filter=git-annex". This way they could control which files are annexed vs added normally. -(git-annex could have further controls to allow eg, passing small files-through to regular processing. At least .gitattributes is a special case,-it should never be annexed...)--For files not configured this way, git-annex could continue to use-its symlink method -- this would preserve backwards compatability,-and even allow mixing the two methods in a repo as desired.--To find files in the repository that are annexed, git-annex would do-`ls-files` as now, but would check if found files have the appropriate-filter, rather than the current symlink checks. To determine the key-of a file, rather than reading its symlink, git-annex would need to-look up the git blob associated with the file -- this can be done-efficiently using the existing code in `Branch.catFile`.--The clean filter would inject the file's content into the annex, and hard-link from the annex to the file. Avoiding duplication of data.+It would also be good to allow using this without having to specify+the files in .gitattributes. Just use "* filter=git-annex" there, and then+let git-annex decide which files to annex and which to pass through the+smudge and clean filters as-is. The smudge filter can just read a little of+its input to see if it's a pointer to an annexed file. The clean filter+could apply annex.largefiles to decide whether to annex a file's content or+not. -The smudge filter can't do that, so to avoid duplication of data, it-might always create an empty file. To get the content, `git annex get`-could be used (which would hard link it). A `post-checkout` hook might-be used to set up hard links for all currently available content.+For files not configured this way in .gitattributes, git-annex could+continue to use its symlink method -- this would preserve backwards+compatability, and even allow mixing the two methods in a repo as desired.+(But not switching an existing repo between indirect and direct modes;+the user decides which mode to use when adding files to the repo.) -#### clean+### clean  The trick is doing it efficiently. Since git a2b665d, v1.7.4.1, something like this works to provide a filename to the clean script:@@ -100,7 +95,7 @@ > but it seems to avoid this problem. > --[[Joey]] -#### smudge+### smudge  The smudge script can also be provided a filename with %f, but it cannot directly write to the file or git gets unhappy.@@ -108,18 +103,220 @@ > Still the case in 2015. Means an unnecesary read and pipe of the file > even if the content is already locally available on disk. --[[Joey]] -### dealing with partial content availability+### partial checkouts -The smudge filter cannot be allowed to fail, that leaves the tree and-index in a weird state. So if a file's content is requested by calling-the smudge filter, the trick is to instead provide dummy content,-indicating it is not available (and perhaps saying to run "git-annex get").+.. Are very important, otherwise a repo can't scale past the size of the+smallest client's disk! -Then, in the clean filter, it has to detect that it's cleaning a file-with that dummy content, and make sure to provide the same identifier as-it would if the file content was there. +It would be nice if the smudge filter could hard link or symlink a work+tree file to the annex object. +But currently, the smudge filter can't modify the work tree file on its own+-- git always modifies the file after getting the output of the smudge+filter, and will stumble over any modifications that the smudge filter+makes. And, it's important that the smudge filter never fail as that will+leave the repo in a bad state.++Seems the best that can be done is for the smudge filter to copy from the+annex object when the object is present. When it's not present, the smudge+filter should provide a pointer to its content.++The clean filter should detect when it's operating on that pointer file.+ I've a demo implementation of this technique in the scripts below.++### deduplication++.. Is nice; needing 2 copies of every annexed file is annoying.++Unfortunately, when using smudge/clean, `git merge` does not preserve a+smudged file in the work tree when renaming it. It instead deletes the old+file and asks the smudge filter to smudge the new filename.++So, copies need to be maintained in .git/annex/objects, though it's ok+to use hard links to the work tree files.++Even if hard links are used, smudge needs to output the content of an+annexed file, which will result in duplication when merging in renames of+files.++### design++Goal: Get rid of current direct mode, using smudge/clean filters instead to+cover the same use cases, more flexibly and robustly.++Use case 1:++A user wants to be able to edit files, and git-add, git commit,+without needing to worry about using git-annex to unlock files, add files,+etc.++Use case 2:++Using git-annex on a crippled filesystem that does not support symlinks.++Data:++* An annex pointer file has as its first line the git-annex key+  that it's standing in for. Subsequent lines of the file might+  be a message saying that the file's content is not currently available.+  An annex pointer file is checked into the git repository the same way+  that an annex symlink is checked in.+* A file map is  maintained by git-annex, to keep track of the keys+  that are used by files in the working tree.++Configuration: ++* .gitattributes tells git which files to use git-annex's smudge/clean+  filters with. Typically, all files except for dotfiles:++	* filter=annex+	.* !filter++* annex.largefiles tells git-annex which files should in fact be put in +  the annex. Other files are passed through the smudge/clean as-is and+  have their contents stored in git.++* annex.direct is repurposed to configure how the assistant adds files.+  When set to true, they're added unlocked.++git-annex clean:++* Run by `git add` (and diff and status, etc), and passed the+  filename, as well as fed the file content on stdin.++  Look at configuration to decide if this file's content belongs in the+  annex. If not, output the file content to stdout.++  Generate annex key from filename and content from stdin.++  Hard link .git/annex/objects to the file, if it doesn't already exist.+  (On platforms not supporting hardlinks, copy the file to+  .git/annex/objects.)++  This is done to prevent losing the only copy of a file when eg+  doing a git checkout of a different branch, or merging a commit that+  renames or deletes a file. But, no attempt is made to +  protect the object from being modified. If a user wants to+  protect object contents from modification, they should use+  `git annex add`, not `git add`, or they can `git annex lock` after adding,.++  There could be a configuration knob to cause a copy to be made to+  .git/annex/objects -- useful for those crippled filesystems. It might+  also drop that copy once the object gets uploaded to another repo ...+  But that gets complicated quickly.++  Update file map.++  Output the pointer file content to stdout.++git-annex smudge:++* Run by eg `git checkout`+  and passed the filename, as well as fed the pointer file content on stdin.++  Update file map.++  When an object is present in the annex, outputs its content to stdout.+  Otherwise, outputs the file pointer content.++git annex direct/indirect:++  Previously these commands switched in and out of direct mode.+  Now they become no-ops.++git annex lock/unlock:++  Makes sense for these to change to switch files between using+  git-annex symlinks and pointers. So, this provides both a way to+  transition repositories to using pointers, and a cleaner unlock/lock+  for repos using symlinks.++  unlock will stage a pointer file, and will copy the content of the object+  out of .git/annex/objects to the work tree file. (Might want a --hardlink+  switch.)+  +  lock will replace the current work tree file with the symlink, and stage it.+  Note that multiple work tree files could point to the same object.+  So, if the link count is > 1, replace the annex object with a copy of+  itself to break such a hard link. Always finish by locking down the+  permissions of the annex object.++#### file map++The file map needs to map from `Key -> [File]`. `File -> Key`+seems useful to have, but in practice is not worthwhile.++Drop and get operations need to know what files in the work tree use a+given key in order to update the work tree.++git-annex commands that look at annex symlinks to get keys to act on will+need fall back to either consulting the file map, or looking at the staged+file to see if it's a pointer to a key. So a `File -> Key` map is a possible+optimisation.++Question: If the smudge/clean filters update the file map incrementally+based on the pointer files they generate/see, will the result+always be consistent with the content of the working tree?++This depends on when git calls the smudge/clean filters and on what.+In particular:++* Does the clean filter always get called when adding a relevant +  file to git? Yes.+* Is the clean filter called at any other time? Yes, for example+  git diff will clean relevant modified files to generate the diff.+  So, the clean filter may see file versions that have not yet been staged+  in git.+* Is the clean filter ever passed content not in the work tree?+  I don't think so, but not 100% sure.+* Is the smudge filter always called when git updates a relevant file+  in the work tree? Yes.+* Is the smudge filter called at any other time? Seems unlikely but then+  there could be situations with a detached work tree or such.+* Does git call any useful hooks when removing a file from the work tree,+  or converting it to not be annexed?+  No!++From this analysis, any file map generated by the smudge/clean filters+is necessary potentially innaccurate. It may list deleted files.+It may or may not reflect current unstaged changes from the work tree.++Follows that any use of the file map needs to verify the info from it,+and throw out bad cached info (updating the map to match reality). ++When downloading a key, check if the files listed in the file map are+still pointer files in the work tree, and only replace them with the+content if so. ++When dropping a key, check if the files listed for it in the file map are+unmodified in the work tree, and are staged as pointers to the key,+and only reset them to the pointers if so. Note that this means that+a modified work tree file that has not yet been staged, but that+corresponds to a key, won't be reset when the key is dropped.+This is probably not a big deal; the user will either add the+file, which will add the key back, or reset the file.++Does the `File -> Key` map have any benefits given this innaccuracy?+Answer seems to be no; any answer that map gives may be innaccurate and+needs to be verified by looking at actual repo content, so might as well+just look at the repo content in the first place..++#### Upgrading++annex.version changes to 6++Upgrade should be handled automatically.++On upgrade, update .gitattributes with a stock configuration, unless+it already mentions "filter=annex".++Upgrading a direct mode repo needs to switch it out of bare mode, and+needs to run `git annex unlock` on all files (or reach the same result).+So will need to stage changes to all annexed files.++When a repo has some clones indirect and some direct, the upgraded repo+will have all files unlocked, necessarily in all clones.  ---- 
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20151116+Version: 5.20151208 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <id@joeyh.name>
+ man/git-annex-clean.1 view
@@ -0,0 +1,33 @@+.TH git-annex-clean 1+.SH NAME+git-annex-clean \- git filter driver for git-annex+.PP+.SH SYNOPSIS+git annex clean+.PP+.SH DESCRIPTION+When git-annex is used as a git filter driver, this command is run+by git commands such as \fBgit add\fP. It generates a file that+is added to the git repository and points to the git-annex object+containing the content of a large file.+.PP+To configure git to use git-annex as a git filter driver, place the+following in the .gitattributes file:+.PP+ * filter=annex+\&.* !filter+.PP+The annex.largefiles config is consulted to decide if a given file should+be added to git as\-is, or if its content are large enough to need to use+git-annex.+.PP+.SH SEE ALSO+git-annex(1)+.PP+git-annex\-smudge(1)+.PP+.SH AUTHOR+Joey Hess <id@joeyh.name>+.PP+.PP+
+ man/git-annex-smudge.1 view
@@ -0,0 +1,44 @@+.TH git-annex-smudge 1+.SH NAME+git-annex-smudge \- git filter driver for git-annex+.PP+.SH SYNOPSIS+git annex smudge [\-\-clean] file+.PP+.SH DESCRIPTION+This command lets git-annex be used as a git filter driver which lets+annexed files in the git repository to be unlocked at all times, instead+of being symlinks.+.PP+When adding a file with \fBgit add\fP, the annex.largefiles config is+consulted to decide if a given file should be added to git as\-is,+or if its content are large enough to need to use git-annex. To force a+file that would normally be added to the annex to be added to git as\-is,+this can be temporarily overridden. For example:+.PP+ git \-c annex.largefiles='exclude=*' add myfile+.PP+The git configuration to use this command as a filter driver is as follows.+This is normally set up for you by git-annex init, so you should+not need to configure it manually.+.PP+ [filter "annex"]+         smudge = git-annex smudge %f+         clean = git-annex smudge \-\-clean %f+.PP+To make git use that filter driver, it needs to be configured in+the .gitattributes file or in \fB.git/config/attributes\fP. The latter+is normally configured when a repository is initialized, with the following+contents:+.PP+ * filter=annex+\&.* !filter+.PP+.SH SEE ALSO+git-annex(1)+.PP+.SH AUTHOR+Joey Hess <id@joeyh.name>+.PP+.PP+
man/git-annex.1 view
@@ -674,9 +674,10 @@ The default reserve is 1 megabyte. .IP .IP "\fBannex.largefiles\fP"-Allows configuring which files \fBgit annex add\fP and the assistant consider-to be large enough to need to be added to the annex. By default,-all files are added to the annex.+Allows configuring which files are considered to be large enough to+need to be added to the annex. By default, all specified files are added+to the annex, but configuring this can cause the small files to be+checked into git, without using the annex. .IP The value is a preferred content expression. See git-annex\-preferred\-content(1) for details.@@ -684,6 +685,15 @@ Example: .IP  annex.largefiles = largerthan=100kb and not (include=*.c or include=*.h)+.IP+This setting is checked by \fBgit annex add\fP, \fBgit annex import\fP and the assistant.+It's also used by \fBgit annex addurl\fP and \fBgit annex importfeed\fP when+downloading files.+.IP+It can be useful to temporarily override it via \-c at the command line.+For example:+.IP+ git annex add \-c annex.largefiles='include=*' 99kbfile .IP .IP "\fBannex.numcopies\fP" This is a deprecated setting. You should instead use the