packages feed

git-annex 4.20131002 → 4.20131024

raw patch · 2081 files changed

+56770/−969 lines, 2081 filesdep ~basedep ~cryptohashbinary-added

Dependency ranges changed: base, cryptohash

This diff is very large; some files are shown as “too large to diff”. Download the raw patch for the complete diff.

Files

.gitignore view
@@ -1,3 +1,7 @@+tags+Setup+*.hi+*.o tmp test build-stamp@@ -9,7 +13,10 @@ git-annex git-annex.1 git-annex-shell.1+git-union-merge git-union-merge.1+git-recover-repository+git-recover-repository.1 doc/.ikiwiki html *.tix@@ -22,7 +29,3 @@ # OSX related .DS_Store .virthualenv-tags-Setup-*.hi-*.o
Annex.hs view
@@ -5,7 +5,7 @@  - Licensed under the GNU GPL version 3 or higher.  -} -{-# LANGUAGE GeneralizedNewtypeDeriving, TypeFamilies, MultiParamTypeClasses #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}  module Annex ( 	Annex,
Annex/Branch.hs view
@@ -20,6 +20,7 @@ 	get, 	change, 	commit,+	forceCommit, 	files, 	withIndex, 	performTransitions,@@ -136,39 +137,39 @@ 		{- Even when no refs need to be merged, the index 		 - may still be updated if the branch has gotten ahead  		 - of the index. -}-		then whenM (needUpdateIndex branchref) $ lockJournal $ do-			forceUpdateIndex branchref+		then whenM (needUpdateIndex branchref) $ lockJournal $ \jl -> do+			forceUpdateIndex jl branchref 			{- When there are journalled changes 			 - as well as the branch being updated, 			 - a commit needs to be done. -} 			when dirty $-				go branchref True [] []+				go branchref True [] [] jl 		else lockJournal $ go branchref dirty refs branches 	return $ not $ null refs   where 	isnewer ignoredrefs (r, _) 		| S.member r ignoredrefs = return False 		| otherwise = inRepo $ Git.Branch.changed fullname r-	go branchref dirty refs branches = withIndex $ do-		cleanjournal <- if dirty then stageJournal else return noop+	go branchref dirty refs branches jl = withIndex $ do+		cleanjournal <- if dirty then stageJournal jl else return noop 		let merge_desc = if null branches 			then "update" 			else "merging " ++ 				unwords (map Git.Ref.describe branches) ++  				" into " ++ show name 		localtransitions <- parseTransitionsStrictly "local"-			<$> getStale transitionsLog+			<$> getLocal transitionsLog 		unless (null branches) $ do 			showSideAction merge_desc-			mergeIndex refs+			mergeIndex jl refs 		let commitrefs = nub $ fullname:refs-		unlessM (handleTransitions localtransitions commitrefs) $ do+		unlessM (handleTransitions jl localtransitions commitrefs) $ do 			ff <- if dirty 				then return False 				else inRepo $ Git.Branch.fastForward fullname refs 			if ff-				then updateIndex branchref-				else commitBranch branchref merge_desc commitrefs+				then updateIndex jl branchref+				else commitIndex jl branchref merge_desc commitrefs 		liftIO cleanjournal  {- Gets the content of a file, which may be in the journal, or in the index@@ -181,21 +182,18 @@ get :: FilePath -> Annex String get file = do 	update-	get' file+	getLocal file  {- Like get, but does not merge the branch, so the info returned may not  - reflect changes in remotes.  - (Changing the value this returns, and then merging is always the  - same as using get, and then changing its value.) -}-getStale :: FilePath -> Annex String-getStale = get'--get' :: FilePath -> Annex String-get' file = go =<< getJournalFile file+getLocal :: FilePath -> Annex String+getLocal file = go =<< getJournalFileStale file   where 	go (Just journalcontent) = return journalcontent 	go Nothing = getRaw file-	+ getRaw :: FilePath -> Annex String getRaw file = withIndex $ L.unpack <$> catFile fullname file @@ -205,18 +203,23 @@  - modifes the current content of the file on the branch.  -} change :: FilePath -> (String -> String) -> Annex ()-change file a = lockJournal $ a <$> getStale file >>= set file+change file a = lockJournal $ \jl -> a <$> getLocal file >>= set jl file  {- Records new content of a file into the journal -}-set :: FilePath -> String -> Annex ()+set :: JournalLocked -> FilePath -> String -> Annex () set = setJournalFile  {- Stages the journal, and commits staged changes to the branch. -} commit :: String -> Annex ()-commit message = whenM journalDirty $ lockJournal $ do-	cleanjournal <- stageJournal+commit = whenM journalDirty . forceCommit++{- Commits the current index to the branch even without any journalleda+ - changes. -}+forceCommit :: String -> Annex ()+forceCommit message = lockJournal $ \jl -> do+	cleanjournal <- stageJournal jl 	ref <- getBranch-	withIndex $ commitBranch ref message [fullname]+	withIndex $ commitIndex jl ref message [fullname] 	liftIO cleanjournal  {- Commits the staged changes in the index to the branch.@@ -237,13 +240,13 @@  - previous point, though getting it a long time ago makes the race  - more likely to occur.  -}-commitBranch :: Git.Ref -> String -> [Git.Ref] -> Annex ()-commitBranch branchref message parents = do+commitIndex :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex ()+commitIndex jl branchref message parents = do 	showStoringStateAction-	commitBranch' branchref message parents-commitBranch' :: Git.Ref -> String -> [Git.Ref] -> Annex ()-commitBranch' branchref message parents = do-	updateIndex branchref+	commitIndex' jl branchref message parents+commitIndex' :: JournalLocked -> Git.Ref -> String -> [Git.Ref] -> Annex ()+commitIndex' jl branchref message parents = do+	updateIndex jl branchref 	committedref <- inRepo $ Git.Branch.commit message fullname parents 	setIndexSha committedref 	parentrefs <- commitparents <$> catObject committedref@@ -267,8 +270,8 @@ 	{- To recover from the race, union merge the lost refs 	 - into the index, and recommit on top of the bad commit. -} 	fixrace committedref lostrefs = do-		mergeIndex lostrefs-		commitBranch committedref racemessage [committedref]+		mergeIndex jl lostrefs+		commitIndex jl committedref racemessage [committedref] 		 	racemessage = message ++ " (recovery from race)" @@ -278,7 +281,7 @@ 	update 	(++) 		<$> branchFiles-		<*> getJournalledFiles+		<*> getJournalledFilesStale  {- Files in the branch, not including any from journalled changes,  - and without updating the branch. -}@@ -300,11 +303,27 @@  {- Merges the specified refs into the index.  - Any changes staged in the index will be preserved. -}-mergeIndex :: [Git.Ref] -> Annex ()-mergeIndex branches = do+mergeIndex :: JournalLocked -> [Git.Ref] -> Annex ()+mergeIndex jl branches = do+	prepareModifyIndex jl 	h <- catFileHandle 	inRepo $ \g -> Git.UnionMerge.mergeIndex h g branches +{- Removes any stale git lock file, to avoid git falling over when+ - updating the index.+ -+ - Since all modifications of the index are performed inside this module,+ - and only when the journal is locked, the fact that the journal has to be+ - locked when this is called ensures that no other process is currently+ - modifying the index. So any index.lock file must be stale, caused+ - by git running when the system crashed, or the repository's disk was+ - removed, etc.+ -}+prepareModifyIndex :: JournalLocked -> Annex ()+prepareModifyIndex _jl = do+	index <- fromRepo gitAnnexIndex+	void $ liftIO $ tryIO $ removeFile $ index ++ ".lock"+ {- Runs an action using the branch's index file. -} withIndex :: Annex a -> Annex a withIndex = withIndex' False@@ -342,40 +361,48 @@  - Compares the ref stored in the lock file with the current  - ref of the branch to see if an update is needed.  -}-updateIndex :: Git.Ref -> Annex ()-updateIndex branchref = whenM (needUpdateIndex branchref) $-	forceUpdateIndex branchref+updateIndex :: JournalLocked -> Git.Ref -> Annex ()+updateIndex jl branchref = whenM (needUpdateIndex branchref) $+	forceUpdateIndex jl branchref -forceUpdateIndex :: Git.Ref -> Annex ()-forceUpdateIndex branchref = do-	withIndex $ mergeIndex [fullname]+forceUpdateIndex :: JournalLocked -> Git.Ref -> Annex ()+forceUpdateIndex jl branchref = do+	withIndex $ mergeIndex jl [fullname] 	setIndexSha branchref  {- Checks if the index needs to be updated. -} needUpdateIndex :: Git.Ref -> Annex Bool needUpdateIndex branchref = do-	lock <- fromRepo gitAnnexIndexLock-	lockref <- Git.Ref . firstLine <$>-		liftIO (catchDefaultIO "" $ readFileStrict lock)-	return (lockref /= branchref)+	f <- fromRepo gitAnnexIndexStatus+	committedref <- Git.Ref . firstLine <$>+		liftIO (catchDefaultIO "" $ readFileStrict f)+	return (committedref /= branchref)  {- Record that the branch's index has been updated to correspond to a  - given ref of the branch. -} setIndexSha :: Git.Ref -> Annex () setIndexSha ref = do-	lock <- fromRepo gitAnnexIndexLock-	liftIO $ writeFile lock $ show ref ++ "\n"-	setAnnexPerm lock+	f <- fromRepo gitAnnexIndexStatus+	liftIO $ writeFile f $ show ref ++ "\n"+	setAnnexPerm f  {- Stages the journal into the index and returns an action that will  - clean up the staged journal files, which should only be run once- - the index has been committed to the branch. Should be run within- - lockJournal, to prevent others from modifying the journal. -}-stageJournal :: Annex (IO ())-stageJournal = withIndex $ do+ - the index has been committed to the branch.+ -+ - Before staging, this removes any existing git index file lock.+ - This is safe to do because stageJournal is the only thing that+ - modifies this index file, and only one can run at a time, because+ - the journal is locked. So any existing git index file lock must be+ - stale, and the journal must contain any data that was in the process+ - of being written to the index file when it crashed.+ -}+stageJournal :: JournalLocked -> Annex (IO ())+stageJournal jl = withIndex $ do+	prepareModifyIndex jl 	g <- gitRepo 	let dir = gitAnnexJournalDir g-	fs <- getJournalFiles+	fs <- getJournalFiles jl 	liftIO $ do 		h <- hashObjectStart g 		Git.UpdateIndex.streamUpdateIndex g@@ -405,8 +432,8 @@  - throw away history), so they are added to the list of refs to ignore,  - to avoid re-merging content from them again.  -}-handleTransitions :: Transitions -> [Git.Ref] -> Annex Bool-handleTransitions localts refs = do+handleTransitions :: JournalLocked -> Transitions -> [Git.Ref] -> Annex Bool+handleTransitions jl localts refs = do 	m <- M.fromList <$> mapM getreftransition refs 	let remotets = M.elems m 	if all (localts ==) remotets@@ -415,7 +442,7 @@ 			let allts = combineTransitions (localts:remotets) 			let (transitionedrefs, untransitionedrefs) = 				partition (\r -> M.lookup r m == Just allts) refs-			performTransitions allts (localts /= allts) transitionedrefs+			performTransitionsLocked jl allts (localts /= allts) transitionedrefs 			ignoreRefs untransitionedrefs 			return True   where@@ -440,14 +467,19 @@ 		liftIO $ catchDefaultIO "" $ readFile f  {- Performs the specified transitions on the contents of the index file,- - commits it to the branch, or creates a new branch. -}+ - commits it to the branch, or creates a new branch.+ -} performTransitions :: Transitions -> Bool -> [Ref] -> Annex ()-performTransitions ts neednewlocalbranch transitionedrefs = do+performTransitions ts neednewlocalbranch transitionedrefs = lockJournal $ \jl ->+	performTransitionsLocked jl ts neednewlocalbranch transitionedrefs+performTransitionsLocked :: JournalLocked -> Transitions -> Bool -> [Ref] -> Annex ()+performTransitionsLocked jl ts neednewlocalbranch transitionedrefs = do 	-- For simplicity & speed, we're going to use the Annex.Queue to 	-- update the git-annex branch, while it usually holds changes 	-- for the head branch. Flush any such changes. 	Annex.Queue.flush 	withIndex $ do+		prepareModifyIndex jl 		run $ mapMaybe getTransitionCalculator $ transitionList ts 		Annex.Queue.flush 		if neednewlocalbranch@@ -456,7 +488,7 @@ 				setIndexSha committedref 			else do 				ref <- getBranch-				commitBranch ref message (nub $ fullname:transitionedrefs)+				commitIndex jl ref message (nub $ fullname:transitionedrefs)   where   	message 		| neednewlocalbranch && null transitionedrefs = "new branch for transition " ++ tdesc
Annex/CatFile.hs view
@@ -43,7 +43,7 @@ 	h <- catFileHandle 	liftIO $ Git.CatFile.catTree h ref -catObjectDetails :: Git.Ref -> Annex (Maybe (L.ByteString, Sha))+catObjectDetails :: Git.Ref -> Annex (Maybe (L.ByteString, Sha, ObjectType)) catObjectDetails ref = do 	h <- catFileHandle 	liftIO $ Git.CatFile.catObjectDetails h ref
Annex/Content.hs view
@@ -30,6 +30,7 @@ 	freezeContent, 	thawContent, 	cleanObjectLoc,+	dirKeys, ) where  import System.IO.Unsafe (unsafeInterleaveIO)@@ -522,3 +523,18 @@ 	go GroupShared = groupWriteRead file 	go AllShared = groupWriteRead file 	go _ = allowWrite file++{- Finds files directly inside a directory like gitAnnexBadDir + - (not in subdirectories) and returns the corresponding keys. -}+dirKeys :: (Git.Repo -> FilePath) -> Annex [Key]+dirKeys dirspec = do+	dir <- fromRepo dirspec+	ifM (liftIO $ doesDirectoryExist dir)+		( do+			contents <- liftIO $ getDirectoryContents dir+			files <- liftIO $ filterM doesFileExist $+				map (dir </>) contents+			return $ mapMaybe (fileKey . takeFileName) files+		, return []+		)+
Annex/Content/Direct.hs view
@@ -101,7 +101,7 @@ 			else file':files  {- Associated files are always stored relative to the top of the repository.- - The input FilePath is relative to the CWD. -}+ - The input FilePath is relative to the CWD, or is absolute. -} normaliseAssociatedFile :: FilePath -> Annex FilePath normaliseAssociatedFile file = do 	top <- fromRepo Git.repoPath
Annex/Direct.hs view
@@ -13,6 +13,7 @@ import qualified Git.Merge import qualified Git.DiffTree as DiffTree import Git.Sha+import Git.FilePath import Git.Types import Annex.CatFile import qualified Annex.Queue@@ -122,6 +123,8 @@  -} mergeDirect :: FilePath -> Git.Ref -> Git.Repo -> IO Bool mergeDirect d branch g = do+	whenM (doesDirectoryExist d) $+		removeDirectoryRecursive d 	createDirectoryIfMissing True d 	let g' = g { location = Local { gitdir = Git.localGitDir g, worktree = Just d } } 	Git.Merge.mergeNonInteractive branch g'@@ -134,22 +137,22 @@ mergeDirectCleanup :: FilePath -> Git.Ref -> Git.Ref -> Annex () mergeDirectCleanup d oldsha newsha = do 	(items, cleanup) <- inRepo $ DiffTree.diffTreeRecursive oldsha newsha-	forM_ items updated+	makeabs <- flip fromTopFilePath <$> gitRepo+	forM_ items (updated makeabs) 	void $ liftIO cleanup 	liftIO $ removeDirectoryRecursive d   where-	updated item = do+	updated makeabs item = do+		let f = makeabs (DiffTree.file item) 		void $ tryAnnex $-			go DiffTree.srcsha DiffTree.srcmode moveout moveout_raw+			go f DiffTree.srcsha DiffTree.srcmode moveout moveout_raw 		void $ tryAnnex $ -			go DiffTree.dstsha DiffTree.dstmode movein movein_raw+			go f DiffTree.dstsha DiffTree.dstmode movein movein_raw 	  where-		go getsha getmode a araw+		go f getsha getmode a araw 			| getsha item == nullSha = noop-			| otherwise =-				maybe (araw f) (\k -> void $ a k f)+			| otherwise = maybe (araw f) (\k -> void $ a k f) 					=<< catKey (getsha item) (getmode item)-		f = DiffTree.file item  	moveout = removeDirect 
Annex/Journal.hs view
@@ -1,10 +1,10 @@ {- management of the git-annex journal  -  - The journal is used to queue up changes before they are committed to the- - git-annex branch. Amoung other things, it ensures that if git-annex is+ - git-annex branch. Among other things, it ensures that if git-annex is  - interrupted, its recorded data is not lost.  -- - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2011-2013 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -}@@ -23,9 +23,14 @@ {- Records content for a file in the branch to the journal.  -  - Using the journal, rather than immediatly staging content to the index- - avoids git needing to rewrite the index after every change. -}-setJournalFile :: FilePath -> String -> Annex ()-setJournalFile file content = do+ - avoids git needing to rewrite the index after every change.+ - + - The file in the journal is updated atomically, which allows+ - getJournalFileStale to always return a consistent journal file+ - content, although possibly not the most current one.+ -}+setJournalFile :: JournalLocked -> FilePath -> String -> Annex ()+setJournalFile _jl file content = do 	createAnnexDirectory =<< fromRepo gitAnnexJournalDir 	createAnnexDirectory =<< fromRepo gitAnnexTmpDir 	-- journal file is written atomically@@ -37,17 +42,32 @@ 		moveFile tmpfile jfile  {- Gets any journalled content for a file in the branch. -}-getJournalFile :: FilePath -> Annex (Maybe String)-getJournalFile file = inRepo $ \g -> catchMaybeIO $+getJournalFile :: JournalLocked -> FilePath -> Annex (Maybe String)+getJournalFile _jl = getJournalFileStale++{- Without locking, this is not guaranteed to be the most recent+ - version of the file in the journal, so should not be used as a basis for+ - changes. -}+getJournalFileStale :: FilePath -> Annex (Maybe String)+getJournalFileStale file = inRepo $ \g -> catchMaybeIO $ 	readFileStrict $ journalFile file g  {- List of files that have updated content in the journal. -}-getJournalledFiles :: Annex [FilePath]-getJournalledFiles = map fileJournal <$> getJournalFiles+getJournalledFiles :: JournalLocked -> Annex [FilePath]+getJournalledFiles jl = map fileJournal <$> getJournalFiles jl +getJournalledFilesStale :: Annex [FilePath]+getJournalledFilesStale = map fileJournal <$> getJournalFilesStale+ {- List of existing journal files. -}-getJournalFiles :: Annex [FilePath]-getJournalFiles = do+getJournalFiles :: JournalLocked -> Annex [FilePath]+getJournalFiles _jl = getJournalFilesStale++{- List of existing journal files, but without locking, may miss new ones+ - just being added, or may have false positives if the journal is staged+ - as it is run. -}+getJournalFilesStale :: Annex [FilePath]+getJournalFilesStale = do 	g <- gitRepo 	fs <- liftIO $ catchDefaultIO [] $ 		getDirectoryContents $ gitAnnexJournalDir g@@ -55,7 +75,7 @@  {- Checks if there are changes in the journal. -} journalDirty :: Annex Bool-journalDirty = not . null <$> getJournalFiles+journalDirty = not . null <$> getJournalFilesStale  {- Produces a filename to use in the journal for a file on the branch.  -@@ -77,14 +97,19 @@ fileJournal = replace [pathSeparator, pathSeparator] "_" . 	replace "_" [pathSeparator] +{- Sentinal value, only produced by lockJournal; required+ - as a parameter by things that need to ensure the journal is+ - locked. -}+data JournalLocked = ProduceJournalLocked+ {- Runs an action that modifies the journal, using locking to avoid  - contention with other git-annex processes. -}-lockJournal :: Annex a -> Annex a+lockJournal :: (JournalLocked -> Annex a) -> Annex a lockJournal a = do 	lockfile <- fromRepo gitAnnexJournalLock 	createAnnexDirectory $ takeDirectory lockfile 	mode <- annexFileMode-	bracketIO (lock lockfile mode) unlock (const a)+	bracketIO (lock lockfile mode) unlock (const $ a ProduceJournalLocked)   where #ifndef mingw32_HOST_OS 	lock lockfile mode = do@@ -101,4 +126,3 @@ #else 	unlock = removeFile #endif-
Annex/Ssh.hs view
@@ -16,6 +16,7 @@  import qualified Data.Map as M import Data.Hash.MD5+import System.Process (cwd)  import Common.Annex import Annex.LockPool@@ -52,15 +53,31 @@   where 	go Nothing = return (Nothing, []) 	go (Just dir) = do-		let socketfile = dir </> hostport2socket host port-		if valid_unix_socket_path socketfile-			then return (Just socketfile, sshConnectionCachingParams socketfile)-			else do-				socketfile' <- liftIO $ relPathCwdToFile socketfile-				return $ if valid_unix_socket_path socketfile'-					then (Just socketfile', sshConnectionCachingParams socketfile')-					else (Nothing, [])+		r <- liftIO $ bestSocketPath $ dir </> hostport2socket host port+		return $ case r of+			Nothing -> (Nothing, [])+			Just socketfile -> (Just socketfile, sshConnectionCachingParams socketfile) +{- Given an absolute path to use for a socket file,+ - returns whichever is shorter of that or the relative path to the same+ - file.+ -+ - If no path can be constructed that is a valid socket, returns Nothing. -}+bestSocketPath :: FilePath -> IO (Maybe FilePath)+bestSocketPath abssocketfile = do+	relsocketfile <- liftIO $ relPathCwdToFile abssocketfile+	let socketfile = if length abssocketfile <= length relsocketfile+		then abssocketfile+		else relsocketfile+	return $ if valid_unix_socket_path (socketfile ++ sshgarbage)+			then Just socketfile+			else Nothing+  where+  	-- ssh appends a 16 char extension to the socket when setting it+	-- up, which needs to be taken into account when checking+	-- that a valid socket was constructed.+  	sshgarbage = take (1+16) $ repeat 'X'+ sshConnectionCachingParams :: FilePath -> [CommandParam] sshConnectionCachingParams socketfile =  	[ Param "-S", Param socketfile@@ -96,8 +113,8 @@   where 	go Nothing = noop 	go (Just dir) = do-		sockets <- filter (not . isLock) <$>-			liftIO (catchDefaultIO [] $ dirContents dir)+		sockets <- liftIO $ filter (not . isLock)+			<$> catchDefaultIO [] (dirContents dir) 		forM_ sockets cleanup 	cleanup socketfile = do #ifndef mingw32_HOST_OS@@ -120,13 +137,15 @@ 		stopssh socketfile #endif 	stopssh socketfile = do-		let params = sshConnectionCachingParams socketfile+		let (dir, base) = splitFileName socketfile+		let params = sshConnectionCachingParams base 		-- "ssh -O stop" is noisy on stderr even with -q 		void $ liftIO $ catchMaybeIO $ 			withQuietOutput createProcessSuccess $-				proc "ssh" $ toCommand $+				(proc "ssh" $ toCommand $ 					[ Params "-O stop"-					] ++ params ++ [Param "any"]+					] ++ params ++ [Param "any"])+					{ cwd = Just dir } 		-- Cannot remove the lock file; other processes may 		-- be waiting on our exclusive lock to use it. @@ -139,8 +158,10 @@ hostport2socket host (Just port) = hostport2socket' $ host ++ "!" ++ show port hostport2socket' :: String -> FilePath hostport2socket' s-	| length s > 32 = md5s (Str s)+	| length s > lengthofmd5s = md5s (Str s) 	| otherwise = s+  where+	lengthofmd5s = 32  socket2lock :: FilePath -> FilePath socket2lock socket = socket ++ lockExt
Assistant.hs view
@@ -22,6 +22,7 @@ import Assistant.Threads.TransferWatcher import Assistant.Threads.Transferrer import Assistant.Threads.SanityChecker+import Assistant.Threads.Cronner #ifdef WITH_CLIBS import Assistant.Threads.MountWatcher #endif@@ -133,9 +134,13 @@ 			, assist $ netWatcherThread 			, assist $ netWatcherFallbackThread 			, assist $ transferScannerThread urlrenderer+			, assist $ cronnerThread urlrenderer 			, assist $ configMonitorThread 			, assist $ glacierThread 			, watch $ watchThread+			-- must come last so that all threads that wait+			-- on it have already started waiting+			, watch $ sanityCheckerStartupThread 			] 	 		liftIO waitForTermination
Assistant/Alert.hs view
@@ -15,6 +15,7 @@ import qualified Remote import Utility.Tense import Logs.Transfer+import Git.Remote (RemoteName)  import Data.String import qualified Data.Text as T@@ -27,17 +28,19 @@ import Yesod #endif -{- Makes a button for an alert that opens a Route. The button will- - close the alert it's attached to when clicked. -}+{- Makes a button for an alert that opens a Route. + -+ - If autoclose is set, the button will close the alert it's+ - attached to when clicked. -} #ifdef WITH_WEBAPP-mkAlertButton :: T.Text -> UrlRenderer -> Route WebApp -> Assistant AlertButton-mkAlertButton label urlrenderer route = do+mkAlertButton :: Bool -> T.Text -> UrlRenderer -> Route WebApp -> Assistant AlertButton+mkAlertButton autoclose label urlrenderer route = do 	close <- asIO1 removeAlert 	url <- liftIO $ renderUrl urlrenderer route [] 	return $ AlertButton 		{ buttonLabel = label 		, buttonUrl = url-		, buttonAction = Just close+		, buttonAction = if autoclose then Just close else Nothing 		} #endif @@ -76,6 +79,22 @@ 	, alertButton = Nothing 	} +errorAlert :: String -> AlertButton -> Alert+errorAlert msg button = Alert+	{ alertClass = Error+	, alertHeader = Nothing+	, alertMessageRender = renderData+	, alertData = [UnTensed $ T.pack msg]+	, alertCounter = 0+	, alertBlockDisplay = True+	, alertClosable = True+	, alertPriority = Pinned+	, alertIcon = Just ErrorIcon+	, alertCombiner = Nothing+	, alertName = Nothing+	, alertButton = Just button+	}+ activityAlert :: Maybe TenseText -> [TenseChunk] -> Alert activityAlert header dat = baseActivityAlert 	{ alertHeader = header@@ -146,6 +165,17 @@ 	render alert = tenseWords $ alerthead : alertData alert ++ [alertfoot] 	alerthead = "The daily sanity check found and fixed a problem:" 	alertfoot = "If these problems persist, consider filing a bug report."++fsckAlert :: AlertButton -> Maybe RemoteName -> Alert+fsckAlert button n = baseActivityAlert+	{ alertData = case n of+		Nothing -> [ UnTensed $ T.pack $ "Consistency check in progress" ]+		Just remotename -> [ UnTensed $ T.pack $ "Consistency check of " ++ remotename ++ " in progress"]+	, alertButton = Just button+	}++brokenRepositoryAlert :: AlertButton -> Alert+brokenRepositoryAlert = errorAlert "Serious problems have been detected with your repository. This needs your immediate attention!"  pairingAlert :: AlertButton -> Alert pairingAlert button = baseActivityAlert
Assistant/DaemonStatus.hs view
@@ -76,6 +76,10 @@ 			M.filter $ \alert -> 				alertName alert /= Just CloudRepoNeededAlert +updateScheduleLog :: Assistant ()+updateScheduleLog =+	liftIO . sendNotification =<< scheduleLogNotifier <$> getDaemonStatus+ {- Load any previous daemon status file, and store it in a MVar for this  - process to use as its DaemonStatus. Also gets current transfer status. -} startDaemonStatus :: Annex DaemonStatusHandle
Assistant/DeleteRemote.hs view
@@ -81,7 +81,7 @@ #ifdef WITH_WEBAPP finishRemovingRemote urlrenderer uuid = do 	desc <- liftAnnex $ Remote.prettyUUID uuid-	button <- mkAlertButton (T.pack "Finish deletion process") urlrenderer $+	button <- mkAlertButton True (T.pack "Finish deletion process") urlrenderer $ 		FinishDeleteRepositoryR uuid 	void $ addAlert $ remoteRemovalAlert desc button #else
Assistant/NamedThread.hs view
@@ -16,6 +16,7 @@ import Assistant.Types.UrlRenderer import Assistant.DaemonStatus import Assistant.Monad+import Utility.NotificationBroadcaster  import Control.Concurrent import Control.Concurrent.Async@@ -34,7 +35,7 @@  - Named threads are run by a management thread, so if they crash  - an alert is displayed, allowing the thread to be restarted. -} startNamedThread :: UrlRenderer -> NamedThread -> Assistant ()-startNamedThread urlrenderer namedthread@(NamedThread name a) = do+startNamedThread urlrenderer (NamedThread afterstartupsanitycheck name a) = do 	m <- startedThreads <$> getDaemonStatus 	case M.lookup name m of 		Nothing -> start@@ -44,14 +45,24 @@ 				Right Nothing -> noop 				_ -> start   where-	start = do+	start+		| afterstartupsanitycheck = do+			status <- getDaemonStatus+			h <- liftIO $ newNotificationHandle False $+				startupSanityCheckNotifier status+			startwith $ runmanaged $+				liftIO $ waitNotification h+		| otherwise = startwith $ runmanaged noop+	startwith runner = do 		d <- getAssistant id-		aid <- liftIO $ runmanaged $ d { threadName = name }-		restart <- asIO $ startNamedThread urlrenderer namedthread+		aid <- liftIO $ runner $ d { threadName = name }+		restart <- asIO $ startNamedThread urlrenderer (NamedThread False name a) 		modifyDaemonStatus_ $ \s -> s 			{ startedThreads = M.insertWith' const name (aid, restart) (startedThreads s) }-	runmanaged d = do-		aid <- async $ runAssistant d a+	runmanaged first d = do+		aid <- async $ runAssistant d $ do+			void first+			a 		void $ forkIO $ manager d aid 		return aid 	manager d aid = do@@ -65,7 +76,7 @@ 					] 				hPutStrLn stderr msg #ifdef WITH_WEBAPP-				button <- runAssistant d $ mkAlertButton+				button <- runAssistant d $ mkAlertButton True 					(T.pack "Restart Thread") 					urlrenderer  					(RestartThreadR name)@@ -75,7 +86,7 @@ #endif  namedThreadId :: NamedThread -> Assistant (Maybe ThreadId)-namedThreadId (NamedThread name _) = do+namedThreadId (NamedThread _ name _) = do 	m <- startedThreads <$> getDaemonStatus 	return $ asyncThreadId . fst <$> M.lookup name m 
Assistant/Sync.hs view
@@ -44,13 +44,19 @@  - they push to us. Since XMPP pushes run ansynchronously, any scan of the  - XMPP remotes has to be deferred until they're done pushing to us, so  - all XMPP remotes are marked as possibly desynced.+ -+ - Also handles signaling any connectRemoteNotifiers, after the syncing is+ - done.  -} reconnectRemotes :: Bool -> [Remote] -> Assistant () reconnectRemotes _ [] = noop reconnectRemotes notifypushes rs = void $ do-	modifyDaemonStatus_ $ \s -> s-		{ desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) }-	syncAction rs (const go)+	rs' <- filterM (checkavailable . Remote.repo) rs+	unless (null rs') $ do+		modifyDaemonStatus_ $ \s -> s+			{ desynced = S.union (S.fromList $ map Remote.uuid xmppremotes) (desynced s) }+		failedrs <- syncAction rs' (const go)+		mapM_ signal $ filter (`notElem` failedrs) rs'   where 	gitremotes = filter (notspecialremote . Remote.repo) rs 	(xmppremotes, nonxmppremotes) = partition isXMPPRemote rs@@ -73,6 +79,13 @@ 			filter (not . remoteAnnexIgnore . Remote.gitconfig) 				nonxmppremotes 		return failed+	signal r = liftIO . mapM_ (flip tryPutMVar ())+		=<< fromMaybe [] . M.lookup (Remote.uuid r) . connectRemoteNotifiers+			<$> getDaemonStatus+	checkavailable r+		| Git.repoIsLocal r || Git.repoIsLocalUnknown r =+			liftIO $ doesDirectoryExist $ Git.repoPath r+		| otherwise = return True  {- Updates the local sync branch, then pushes it to all remotes, in  - parallel, along with the git-annex branch. This is the same
Assistant/Threads/Committer.hs view
@@ -112,7 +112,7 @@ 	 - that make up a file rename? Or some of the pairs that make up  	 - a directory rename? 	 -}-	possiblyrename cs = all renamepart cs+	possiblyrename = all renamepart  	renamepart (PendingAddChange _ _) = True 	renamepart c = isRmChange c@@ -309,7 +309,7 @@ 			inRepo (Git.LsFiles.notInRepo False $ map changeFile pending) 		-- note: timestamp info is lost here 		let ts = changeTime exemplar-		return (map (PendingAddChange ts) newfiles, void $ liftIO $ cleanup)+		return (map (PendingAddChange ts) newfiles, void $ liftIO cleanup)  	returnWhen c a 		| c = return otherchanges@@ -317,12 +317,13 @@  	add :: Change -> Assistant (Maybe Change) 	add change@(InProcessAddChange { keySource = ks }) = -		catchDefaultIO Nothing <~> do-			sanitycheck ks $ do-				(mkey, mcache) <- liftAnnex $ do-					showStart "add" $ keyFilename ks-					Command.Add.ingest $ Just ks-				maybe (failedingest change) (done change mcache $ keyFilename ks) mkey+		catchDefaultIO Nothing <~> doadd+	  where+	  	doadd = sanitycheck ks $ do+			(mkey, mcache) <- liftAnnex $ do+				showStart "add" $ keyFilename ks+				Command.Add.ingest $ Just ks+			maybe (failedingest change) (done change mcache $ keyFilename ks) mkey 	add _ = return Nothing  	{- In direct mode, avoid overhead of re-injesting a renamed@@ -371,7 +372,7 @@ 			( inRepo $ gitAnnexLink file key 			, Command.Add.link file key mcache 			)-		whenM (pure DirWatcher.eventsCoalesce <||> isDirect) $ do+		whenM (pure DirWatcher.eventsCoalesce <||> isDirect) $ 			stageSymlink file =<< hashSymlink link 		showEndOk 		return $ Just $ finishedChange change key@@ -415,8 +416,8 @@ safeToAdd delayadd pending inprocess = do 	maybe noop (liftIO . threadDelaySeconds) delayadd 	liftAnnex $ do-		keysources <- mapM Command.Add.lockDown (map changeFile pending)-		let inprocess' = inprocess ++ catMaybes (map mkinprocess $ zip pending keysources)+		keysources <- forM pending $ Command.Add.lockDown . changeFile+		let inprocess' = inprocess ++ mapMaybe mkinprocess (zip pending keysources) 		openfiles <- S.fromList . map fst3 . filter openwrite <$> 			findopenfiles (map keySource inprocess') 		let checked = map (check openfiles) inprocess'@@ -434,7 +435,7 @@ 		| S.member (contentLocation ks) openfiles = Left change 	check _ change = Right change -	mkinprocess (c, Just ks) = Just $ InProcessAddChange+	mkinprocess (c, Just ks) = Just InProcessAddChange 		{ changeTime = changeTime c 		, keySource = ks 		}
Assistant/Threads/ConfigMonitor.hs view
@@ -12,13 +12,14 @@ import Assistant.DaemonStatus import Assistant.Commits import Utility.ThreadScheduler+import Logs import Logs.UUID import Logs.Trust-import Logs.Remote import Logs.PreferredContent import Logs.Group import Remote.List (remoteListRefresh) import qualified Git.LsTree as LsTree+import Git.FilePath import qualified Annex.Branch  import qualified Data.Set as S@@ -52,12 +53,13 @@ type Configs = S.Set (FilePath, String)  {- All git-annex's config files, and actions to run when they change. -}-configFilesActions :: [(FilePath, Annex ())]+configFilesActions :: [(FilePath, Assistant ())] configFilesActions =-	[ (uuidLog, void $ uuidMapLoad)-	, (remoteLog, void remoteListRefresh)-	, (trustLog, void trustMapLoad)-	, (groupLog, void groupMapLoad)+	[ (uuidLog, void $ liftAnnex uuidMapLoad)+	, (remoteLog, void $ liftAnnex remoteListRefresh)+	, (trustLog, void $ liftAnnex trustMapLoad)+	, (groupLog, void $ liftAnnex groupMapLoad)+	, (scheduleLog, void updateScheduleLog) 	-- Preferred content settings depend on most of the other configs, 	-- so will be reloaded whenever any configs change. 	, (preferredContentLog, noop)@@ -65,13 +67,12 @@  reloadConfigs :: Configs -> Assistant () reloadConfigs changedconfigs = do-	liftAnnex $ do-		sequence_ as-		void preferredContentMapLoad+	sequence_ as+	void $ liftAnnex preferredContentMapLoad 	{- Changes to the remote log, or the trust log, can affect the 	 - syncRemotes list. Changes to the uuid log may affect its 	 - display so are also included. -}-	when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) $+	when (any (`elem` fs) [remoteLog, trustLog, uuidLog]) 		updateSyncRemotes   where 	(fs, as) = unzip $ filter (flip S.member changedfiles . fst)@@ -83,4 +84,4 @@ 	<$> liftAnnex (inRepo $ LsTree.lsTreeFiles Annex.Branch.fullname files)   where 	files = map fst configFilesActions-	extract treeitem = (LsTree.file treeitem, LsTree.sha treeitem)+	extract treeitem = (getTopFilePath $ LsTree.file treeitem, LsTree.sha treeitem)
+ Assistant/Threads/Cronner.hs view
@@ -0,0 +1,236 @@+{- git-annex assistant sceduled jobs runner+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++{-# LANGUAGE DeriveDataTypeable, CPP #-}++module Assistant.Threads.Cronner (+	cronnerThread+) where++import Assistant.Common+import Assistant.DaemonStatus+import Utility.NotificationBroadcaster+import Annex.UUID+import Config.Files+import Logs.Schedule+import Utility.Scheduled+import Types.ScheduledActivity+import Utility.ThreadScheduler+import Utility.HumanTime+import Utility.Batch+import Assistant.TransferQueue+import Annex.Content+import Logs.Transfer+import Assistant.Types.UrlRenderer+import Assistant.Alert+import Remote+#ifdef WITH_WEBAPP+import Assistant.WebApp.Types+#endif+import Git.Remote (RemoteName)+import qualified Git.Fsck+import Logs.FsckResults++import Control.Concurrent.Async+import Control.Concurrent.MVar+import Data.Time.LocalTime+import Data.Time.Clock+import qualified Data.Map as M+import qualified Data.Set as S+import qualified Control.Exception as E+import qualified Data.Text as T++{- Loads schedules for this repository, and fires off one thread for each + - scheduled event that runs on this repository. Each thread sleeps until+ - its event is scheduled to run.+ -+ - To handle events that run on remotes, which need to only run when+ - their remote gets connected, threads are also started, and are passed+ - a MVar to wait on, which is stored in the DaemonStatus's+ - connectRemoteNotifiers.+ -+ - In the meantime the main thread waits for any changes to the+ - schedules. When there's a change, compare the old and new list of+ - schedules to find deleted and added ones. Start new threads for added+ - ones, and kill the threads for deleted ones. -}+cronnerThread :: UrlRenderer -> NamedThread+cronnerThread urlrenderer = namedThreadUnchecked "Cronner" $ do+	dstatus <- getDaemonStatus+	h <- liftIO $ newNotificationHandle False (scheduleLogNotifier dstatus)+	go h M.empty M.empty+  where+	go h amap nmap = do+		activities <- liftAnnex $ scheduleGet =<< getUUID++		let addedactivities = activities `S.difference` M.keysSet amap+		let removedactivities = M.keysSet amap `S.difference` activities++		forM_ (S.toList removedactivities) $ \activity ->+			case M.lookup activity amap of+				Just a -> do+					debug ["stopping removed job for", fromScheduledActivity activity, show (asyncThreadId a)]+					liftIO $ cancel a+				Nothing -> noop++		lastruntimes <- liftAnnex getLastRunTimes+		started <- startactivities (S.toList addedactivities) lastruntimes+		let addedamap = M.fromList $ map fst started+		let addednmap = M.fromList $ catMaybes $ map snd started++		let removefiltered = M.filterWithKey (\k _ -> S.member k removedactivities)+		let amap' = M.difference (M.union addedamap amap) (removefiltered amap)+		let nmap' = M.difference (M.union addednmap nmap) (removefiltered nmap)+		modifyDaemonStatus_ $ \s -> s { connectRemoteNotifiers = M.fromListWith (++) (M.elems nmap') }++		liftIO $ waitNotification h+		debug ["reloading changed activities"]+		go h amap' nmap'+  	startactivities as lastruntimes = forM as $ \activity ->+		case connectActivityUUID activity of+			Nothing -> do+				runner <- asIO2 (sleepingActivityThread urlrenderer)+				a <- liftIO $ async $+					runner activity (M.lookup activity lastruntimes)+				return ((activity, a), Nothing)+			Just u -> do+				mvar <- liftIO newEmptyMVar+				runner <- asIO2 (remoteActivityThread urlrenderer mvar)+				a <- liftIO $ async $+					runner activity (M.lookup activity lastruntimes)+				return ((activity, a), Just (activity, (u, [mvar])))++{- Calculate the next time the activity is scheduled to run, then+ - sleep until that time, and run it. Then call setLastRunTime, and+ - loop.+ -}+sleepingActivityThread :: UrlRenderer -> ScheduledActivity -> Maybe LocalTime -> Assistant ()+sleepingActivityThread urlrenderer activity lasttime = go lasttime =<< getnexttime lasttime+  where+  	getnexttime = liftIO . nextTime schedule+  	go _ Nothing = debug ["no scheduled events left for", desc]+	go l (Just (NextTimeExactly t)) = waitrun l t Nothing+	go l (Just (NextTimeWindow windowstart windowend)) =+		waitrun l windowstart (Just windowend)+	desc = fromScheduledActivity activity+	schedule = getSchedule activity+	waitrun l t mmaxt = do+		seconds <- liftIO $ secondsUntilLocalTime t+		when (seconds > Seconds 0) $ do+			debug ["waiting", show seconds, "for next scheduled", desc]+			liftIO $ threadDelaySeconds seconds+		now <- liftIO getCurrentTime+		tz <- liftIO $ getTimeZone now+		let nowt = utcToLocalTime tz now+		if tolate nowt tz+			then do+				debug ["too late to run scheduled", desc]+				go l =<< getnexttime l+			else run nowt+	  where+	  	tolate nowt tz = case mmaxt of+			Just maxt -> nowt > maxt+			-- allow the job to start 10 minutes late+			Nothing ->diffUTCTime +				(localTimeToUTC tz nowt)+				(localTimeToUTC tz t) > 600+	run nowt = do+		runActivity urlrenderer activity nowt+		go (Just nowt) =<< getnexttime (Just nowt)++{- Wait for the remote to become available by waiting on the MVar.+ - Then check if the time is within a time window when activity+ - is scheduled to run, and if so run it.+ - Otherwise, just wait again on the MVar.+ -}+remoteActivityThread :: UrlRenderer -> MVar () -> ScheduledActivity -> Maybe LocalTime -> Assistant ()+remoteActivityThread urlrenderer mvar activity lasttime = do+	liftIO $ takeMVar mvar+	go =<< liftIO (nextTime (getSchedule activity) lasttime)+  where+	go (Just (NextTimeWindow windowstart windowend)) = do+		now <- liftIO getCurrentTime+		tz <- liftIO $ getTimeZone now+		if now >= localTimeToUTC tz windowstart && now <= localTimeToUTC tz windowend+			then do+				let nowt = utcToLocalTime tz now+				runActivity urlrenderer activity nowt+				loop (Just nowt)+			else loop lasttime+	go _ = noop -- running at exact time not handled here+	loop = remoteActivityThread urlrenderer mvar activity++secondsUntilLocalTime :: LocalTime -> IO Seconds+secondsUntilLocalTime t = do+	now <- getCurrentTime+	tz <- getTimeZone now+	let secs = truncate $ diffUTCTime (localTimeToUTC tz t) now+	return $ if secs > 0+		then Seconds secs+		else Seconds 0++runActivity :: UrlRenderer -> ScheduledActivity -> LocalTime -> Assistant ()+runActivity urlrenderer activity nowt = do+	debug ["starting", desc]+	runActivity' urlrenderer activity+	debug ["finished", desc]+	liftAnnex $ setLastRunTime activity nowt+  where+	desc = fromScheduledActivity activity++runActivity' :: UrlRenderer -> ScheduledActivity -> Assistant ()+runActivity' urlrenderer (ScheduledSelfFsck _ d) = do+	program <- liftIO $ readProgramFile+	g <- liftAnnex gitRepo+	fsckresults <- showFscking urlrenderer Nothing $ tryNonAsync $ do+		r <- Git.Fsck.findBroken True g+		void $ batchCommand program (Param "fsck" : annexFsckParams d)+		return r+	when (Git.Fsck.foundBroken fsckresults) $ do+		u <- liftAnnex getUUID+		liftAnnex $ writeFsckResults u fsckresults+		button <- mkAlertButton True (T.pack "Click Here") urlrenderer $+			RepairRepositoryR u+		void $ addAlert $ brokenRepositoryAlert button+	mapM_ reget =<< liftAnnex (dirKeys gitAnnexBadDir)+  where+	reget k = queueTransfers "fsck found bad file; redownloading" Next k Nothing Download+runActivity' urlrenderer (ScheduledRemoteFsck u s d) = go =<< liftAnnex (remoteFromUUID u)+  where+	go (Just r) = void $ case Remote.remoteFsck r of+		Nothing -> void $ showFscking urlrenderer (Just $ Remote.name r) $ tryNonAsync $ do+			program <- readProgramFile+			batchCommand program $ +				[ Param "fsck"+				-- avoid downloading files+				, Param "--fast"+				, Param "--from"+				, Param $ Remote.name r+				] ++ annexFsckParams d+		Just mkfscker ->+			{- Note that having mkfsker return an IO action+			 - avoids running a long duration fsck in the+			 - Annex monad. -}+			void . showFscking urlrenderer (Just $ Remote.name r) . tryNonAsync+				=<< liftAnnex (mkfscker (annexFsckParams d))+	go Nothing = debug ["skipping remote fsck of uuid without a configured remote", fromUUID u, fromSchedule s]++showFscking :: UrlRenderer -> Maybe RemoteName -> IO (Either E.SomeException a) -> Assistant a+showFscking urlrenderer remotename a = do+#ifdef WITH_WEBAPP+	button <- mkAlertButton False (T.pack "Configure") urlrenderer ConfigFsckR+	r <- alertDuring (fsckAlert button remotename) $+		liftIO a+	either (liftIO . E.throwIO) return r+#else+	a+#endif++annexFsckParams :: Duration -> [CommandParam]+annexFsckParams d =+	[ Param "--incremental-schedule=1d"+	, Param $ "--time-limit=" ++ fromDuration d+	]
Assistant/Threads/Glacier.hs view
@@ -30,7 +30,7 @@ 	go = do 		rs <- filter isglacier . syncDataRemotes <$> getDaemonStatus 		forM_ rs $ \r -> -			check r =<< (liftAnnex $ getFailedTransfers $ Remote.uuid r)+			check r =<< liftAnnex (getFailedTransfers $ Remote.uuid r) 	check _ [] = noop 	check r l = do 		let keys = map getkey l
Assistant/Threads/Merger.hs view
@@ -54,7 +54,7 @@  {- Called when there's an error with inotify. -} onErr :: Handler-onErr msg = error msg+onErr = error  {- Called when a new branch ref is written, or a branch ref is modified.  -@@ -110,7 +110,7 @@ isAnnexBranch :: FilePath -> Bool isAnnexBranch f = n `isSuffixOf` f   where-	n = "/" ++ show Annex.Branch.name+	n = '/' : show Annex.Branch.name  fileToBranch :: FilePath -> Git.Ref fileToBranch f = Git.Ref $ "refs" </> base
Assistant/Threads/MountWatcher.hs view
@@ -34,7 +34,7 @@ #endif  mountWatcherThread :: NamedThread-mountWatcherThread = namedThread "MountWatcher" $+mountWatcherThread = namedThread "MountWatcher" #if WITH_DBUS 	dbusThread #else@@ -173,10 +173,10 @@ 	rs <- liftAnnex remoteList 	pairs <- liftAnnex $ mapM (checkremote repotop) rs 	let (waschanged, rs') = unzip pairs-	when (any id waschanged) $ do+	when (or waschanged) $ do 		liftAnnex $ Annex.changeState $ \s -> s { Annex.remotes = catMaybes rs' } 		updateSyncRemotes-	return $ catMaybes $ map snd $ filter fst pairs+	return $ mapMaybe snd $ filter fst pairs   where 	checkremote repotop r = case Remote.localpath r of 		Just p | dirContains dir (absPathFrom repotop p) ->
Assistant/Threads/PairListener.hs view
@@ -102,7 +102,7 @@ pairReqReceived :: Bool -> UrlRenderer -> PairMsg -> Assistant () pairReqReceived True _ _ = noop -- ignore our own PairReq pairReqReceived False urlrenderer msg = do-	button <- mkAlertButton (T.pack "Respond") urlrenderer (FinishLocalPairR msg)+	button <- mkAlertButton True (T.pack "Respond") urlrenderer (FinishLocalPairR msg) 	void $ addAlert $ pairRequestReceivedAlert repo button   where 	repo = pairRepo msg
Assistant/Threads/SanityChecker.hs view
@@ -1,11 +1,12 @@ {- git-annex assistant sanity checker  -- - Copyright 2012 Joey Hess <joey@kitenet.net>+ - Copyright 2012, 2013 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -}  module Assistant.Threads.SanityChecker (+	sanityCheckerStartupThread, 	sanityCheckerDailyThread, 	sanityCheckerHourlyThread ) where@@ -20,10 +21,20 @@ import qualified Assistant.Threads.Watcher as Watcher import Utility.LogFile import Utility.Batch+import Utility.NotificationBroadcaster import Config+import qualified Git+import qualified Utility.Lsof as Lsof  import Data.Time.Clock.POSIX +{- This thread runs once at startup, and most other threads wait for it+ - to finish. (However, the webapp thread does not, to prevent the UI+ - being nonresponsive.) -}+sanityCheckerStartupThread :: NamedThread+sanityCheckerStartupThread = namedThreadUnchecked "SanityCheckerStartup" $+	startupCheck+ {- This thread wakes up hourly for inxepensive frequent sanity checks. -} sanityCheckerHourlyThread :: NamedThread sanityCheckerHourlyThread = namedThread "SanityCheckerHourly" $ forever $ do@@ -42,7 +53,7 @@ 	go = do 		modifyDaemonStatus_ $ \s -> s { sanityCheckRunning = True } -		now <- liftIO $ getPOSIXTime -- before check started+		now <- liftIO getPOSIXTime -- before check started 		r <- either showerr return =<< (tryIO . batch) <~> dailyCheck  		modifyDaemonStatus_ $ \s -> s@@ -69,6 +80,14 @@ 			oneDay - truncate (now - lastcheck) 		| otherwise = oneDay +startupCheck :: Assistant ()+startupCheck = do+	checkStaleGitLocks++	{- Notify other threads that the startup sanity check is done. -}+	status <- getDaemonStatus+	liftIO $ sendNotification $ startupSanityCheckNotifier status+ {- It's important to stay out of the Annex monad as much as possible while  - running potentially expensive parts of this check, since remaining in it  - will block the watcher. -}@@ -78,7 +97,7 @@  	-- Find old unstaged symlinks, and add them to git. 	(unstaged, cleanup) <- liftIO $ Git.LsFiles.notInRepo False ["."] g-	now <- liftIO $ getPOSIXTime+	now <- liftIO getPOSIXTime 	forM_ unstaged $ \file -> do 		ms <- liftIO $ catchMaybeIO $ getSymbolicLinkStatus file 		case ms of@@ -128,6 +147,46 @@   where 	filesize f = fromIntegral . fileSize <$> liftIO (getFileStatus f) +{- Detect when a git lock file exists and has no git process currently+ - writing to it. This strongly suggests it is a stale lock file.+ -+ - However, this could be on a network filesystem. Which is not very safe+ - anyway (the assistant relies on being able to check when files have+ - no writers to know when to commit them). Just in case, when the lock+ - file appears stale, we delay for one minute, and check its size. If+ - the size changed, delay for another minute, and so on. This will at+ - least work to detect is another machine is writing out a new index+ - file, since git does so by writing the new content to index.lock.+ -}+checkStaleGitLocks :: Assistant ()+checkStaleGitLocks = do+	lockfiles <- filter (not . isInfixOf "gc.pid") +		. filter (".lock" `isSuffixOf`)+		<$> (liftIO . dirContentsRecursiveSkipping (== dropTrailingPathSeparator annexDir)+			=<< liftAnnex (fromRepo Git.localGitDir))+	checkStaleLocks lockfiles+checkStaleLocks :: [FilePath] -> Assistant ()+checkStaleLocks lockfiles = go =<< getsizes+  where+  	getsize lf = catchMaybeIO $ +		(\s -> (lf, fileSize s)) <$> getFileStatus lf+  	getsizes = liftIO $ catMaybes <$> mapM getsize lockfiles+	go [] = return ()+	go l = ifM (liftIO $ null <$> Lsof.query ("--" : map fst l))+		( do+			waitforit "to check stale git lock file"+			l' <- getsizes+			if l' == l+				then liftIO $ mapM_ nukeFile (map fst l)+				else go l'+		, do+			waitforit "for git lock file writer"+			go =<< getsizes+		)+	waitforit why = do+		notice ["Waiting for 60 seconds", why]+		liftIO $ threadDelaySeconds $ Seconds 60+ oneMegabyte :: Int oneMegabyte = 1000000 @@ -136,3 +195,4 @@  oneDay :: Int oneDay = 24 * oneHour+
Assistant/Threads/TransferScanner.hs view
@@ -85,13 +85,13 @@ 	mapM_ retry failed   where 	retry (t, info)-		| transferDirection t == Download = do+		| transferDirection t == Download = 			{- Check if the remote still has the key. 			 - If not, relies on the expensiveScan to 			 - get it queued from some other remote. -} 			whenM (liftAnnex $ remoteHas r $ transferKey t) $ 				requeue t info-		| otherwise = do+		| otherwise = 			{- The Transferrer checks when uploading 			 - that the remote doesn't already have the 			 - key, so it's not redundantly checked here. -}@@ -161,7 +161,7 @@ 			present key (Just f) Nothing 		liftAnnex $ do 			let slocs = S.fromList locs-			let use a = return $ catMaybes $ map (a key slocs) syncrs+			let use a = return $ mapMaybe (a key slocs) syncrs 			ts <- if present 				then filterM (wantSend True (Just f) . Remote.uuid . fst) 					=<< use (genTransfer Upload False)@@ -173,7 +173,7 @@ genTransfer :: Direction -> Bool -> Key -> S.Set UUID -> Remote -> Maybe (Remote, Transfer) genTransfer direction want key slocs r 	| direction == Upload && Remote.readonly r = Nothing-	| (S.member (Remote.uuid r) slocs) == want = Just+	| S.member (Remote.uuid r) slocs == want = Just 		(r, Transfer direction (Remote.uuid r) key) 	| otherwise = Nothing 
Assistant/Threads/TransferWatcher.hs view
@@ -51,7 +51,7 @@  {- Called when there's an error with inotify. -} onErr :: Handler-onErr msg = error msg+onErr = error  {- Called when a new transfer information file is written. -} onAdd :: Handler@@ -70,10 +70,9 @@  - The only thing that should change in the transfer info is the  - bytesComplete, so that's the only thing updated in the DaemonStatus. -} onModify :: Handler-onModify file = do-	case parseTransferFile file of-		Nothing -> noop-		Just t -> go t =<< liftIO (readTransferInfoFile Nothing file)+onModify file = case parseTransferFile file of+	Nothing -> noop+	Just t -> go t =<< liftIO (readTransferInfoFile Nothing file)   where 	go _ Nothing = noop 	go t (Just newinfo) = alterTransferInfo t $
Assistant/Threads/Transferrer.hs view
@@ -31,7 +31,7 @@ transfererThread = namedThread "Transferrer" $ do 	program <- liftIO readProgramFile 	forever $ inTransferSlot program $-		maybe (return Nothing) (uncurry $ genTransfer)+		maybe (return Nothing) (uncurry genTransfer) 			=<< getNextTransfer notrunning   where 	{- Skip transfers that are already running. -}@@ -96,7 +96,7 @@ 					True (transferKey t) 					(associatedFile info) 					(Just remote)-			void $ recordCommit+			void recordCommit 		, whenM (liftAnnex $ isNothing <$> checkTransfer t) $ 			void $ removeTransfer t 		)
Assistant/Threads/Watcher.hs view
@@ -5,7 +5,7 @@  - Licensed under the GNU GPL version 3 or higher.  -} -{-# LANGUAGE DeriveDataTypeable, BangPatterns, CPP #-}+{-# LANGUAGE DeriveDataTypeable, CPP #-}  module Assistant.Threads.Watcher ( 	watchThread,@@ -23,7 +23,7 @@ import Assistant.Alert import Utility.DirWatcher import Utility.DirWatcher.Types-import Utility.Lsof+import qualified Utility.Lsof as Lsof import qualified Annex import qualified Annex.Queue import qualified Git@@ -50,7 +50,7 @@ checkCanWatch :: Annex () checkCanWatch 	| canWatch = do-		liftIO setupLsof+		liftIO Lsof.setup 		unlessM (liftIO (inPath "lsof") <||> Annex.getState Annex.force) 			needLsof 	| otherwise = error "watch mode is not available on this system"@@ -79,7 +79,7 @@ runWatcher :: Assistant () runWatcher = do 	startup <- asIO1 startupScan-	matcher <- liftAnnex $ largeFilesMatcher+	matcher <- liftAnnex largeFilesMatcher 	direct <- liftAnnex isDirect 	symlinkssupported <- liftAnnex $ coreSymlinks <$> Annex.getGitConfig 	addhook <- hook $ if direct@@ -109,7 +109,7 @@  waitFor :: WatcherException -> Assistant () -> Assistant () waitFor sig next = do-	r <- liftIO $ (E.try pause :: IO (Either E.SomeException ()))+	r <- liftIO (E.try pause :: IO (Either E.SomeException ())) 	case r of 		Left e -> case E.fromException e of 			Just s@@ -124,7 +124,7 @@ startupScan scanner = do 	liftAnnex $ showAction "scanning" 	alertWhile' startupScanAlert $ do-		r <- liftIO $ scanner+		r <- liftIO scanner  		-- Notice any files that were deleted before 		-- watching was started.@@ -133,7 +133,7 @@ 		forM_ fs $ \f -> do 			liftAnnex $ onDel' f 			maybe noop recordChange =<< madeChange f RmChange-		void $ liftIO $ cleanup+		void $ liftIO cleanup 		 		liftAnnex $ showAction "started" 		liftIO $ putStrLn ""@@ -176,7 +176,7 @@ 		Right (Just change) -> do 			-- Just in case the commit thread is not 			-- flushing the queue fast enough.-			liftAnnex $ Annex.Queue.flushWhenFull+			liftAnnex Annex.Queue.flushWhenFull 			recordChange change   where   	normalize f@@ -300,7 +300,7 @@ 	liftAnnex $ do 		v <- catObjectDetails $ Ref $ ':':file 		case v of-			Just (currlink, sha)+			Just (currlink, sha, _type) 				| s2w8 link == L.unpack currlink -> 					stageSymlink file sha 			_ -> stageSymlink file =<< hashSymlink link@@ -340,8 +340,8 @@ 	now <- liftIO getCurrentTime 	recordChanges $ map (\f -> Change now f RmChange) fs -	void $ liftIO $ clean-	liftAnnex $ Annex.Queue.flushWhenFull+	void $ liftIO clean+	liftAnnex Annex.Queue.flushWhenFull 	noChange  {- Called when there's an error with inotify or kqueue. -}
Assistant/Threads/WebApp.hs view
@@ -29,9 +29,11 @@ import Assistant.WebApp.Configurators.Preferences import Assistant.WebApp.Configurators.Edit import Assistant.WebApp.Configurators.Delete+import Assistant.WebApp.Configurators.Fsck import Assistant.WebApp.Documentation import Assistant.WebApp.Control import Assistant.WebApp.OtherRepos+import Assistant.WebApp.Repair import Assistant.Types.ThreadedMonad import Utility.WebApp import Utility.Tmp@@ -83,7 +85,10 @@ 			urlfile <- runThreadState st $ fromRepo gitAnnexUrlFile 			go addr webapp htmlshim (Just urlfile)   where-	thread = namedThread "WebApp"+  	-- The webapp thread does not wait for the startupSanityCheckThread+	-- to finish, so that the user interface remains responsive while+	-- that's going on.+	thread = namedThreadUnchecked "WebApp" 	getreldir 		| noannex = return Nothing 		| otherwise = Just <$>
Assistant/Threads/XMPPClient.hs view
@@ -103,9 +103,8 @@ 		 - will also be killed. -} 		liftIO $ pinger `concurrently` sender `concurrently` receiver -	sendnotifications selfjid = forever $ do-		a <- inAssistant $ relayNetMessage selfjid-		a+	sendnotifications selfjid = forever $+		join $ inAssistant $ relayNetMessage selfjid 	receivenotifications selfjid lasttraffic = forever $ do 		l <- decodeStanza selfjid <$> getStanza 		void $ liftIO $ atomically . swapTMVar lasttraffic =<< getCurrentTime@@ -115,7 +114,7 @@ 	sendpings selfjid lasttraffic = forever $ do 		putStanza pingstanza -		startping <- liftIO $ getCurrentTime+		startping <- liftIO getCurrentTime 		liftIO $ threadDelaySeconds (Seconds 120) 		t <- liftIO $ atomically $ readTMVar lasttraffic 		when (t < startping) $ do@@ -154,8 +153,7 @@ 				, logJid jid 				, show $ logNetMessage msg' 				]-			a <- inAssistant $ convertNetMsg msg' selfjid-			a+			join $ inAssistant $ convertNetMsg msg' selfjid 			inAssistant $ sentImportantNetMessage msg c 	resendImportantMessages _ _ = noop @@ -196,7 +194,7 @@ decodeStanza :: JID -> ReceivedStanza -> [XMPPEvent] decodeStanza selfjid s@(ReceivedPresence p) 	| presenceType p == PresenceError = [ProtocolError s]-	| presenceFrom p == Nothing = [Ignorable s]+	| isNothing (presenceFrom p) = [Ignorable s] 	| presenceFrom p == Just selfjid = [Ignorable s] 	| otherwise = maybe [PresenceMessage p] decode (gitAnnexTagInfo p)   where@@ -209,7 +207,7 @@ 	 - along with their real meaning. -} 	impliedp v = [PresenceMessage p, v] decodeStanza selfjid s@(ReceivedMessage m)-	| messageFrom m == Nothing = [Ignorable s]+	| isNothing (messageFrom m) = [Ignorable s] 	| messageFrom m == Just selfjid = [Ignorable s] 	| messageType m == MessageError = [ProtocolError s] 	| otherwise = [fromMaybe (Unknown s) (GotNetMessage <$> decodeMessage m)]@@ -241,13 +239,13 @@ 					\c -> (baseJID <$> parseJID c) == Just tojid 				return $ putStanza presenceQuery 		_ -> return noop-	convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> do+	convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> 		if tojid == baseJID tojid 			then do 				clients <- maybe [] (S.toList . buddyAssistants) 					<$> getBuddy (genBuddyKey tojid) <<~ buddyList 				debug ["exploded undirected message to clients", unwords $ map logClient clients]-				return $ forM_ (clients) $ \(Client jid) ->+				return $ forM_ clients $ \(Client jid) -> 					putStanza $ pushMessage pushstage jid selfjid 			else do 				debug ["to client:", logJid tojid]@@ -266,7 +264,7 @@ 	convert (Pushing c pushstage) = withOtherClient selfjid c $ \tojid -> 		return $ putStanza $  pushMessage pushstage tojid selfjid -withOtherClient :: JID -> ClientID -> (JID -> Assistant (XMPP ())) -> (Assistant (XMPP ()))+withOtherClient :: JID -> ClientID -> (JID -> Assistant (XMPP ())) -> Assistant (XMPP ()) withOtherClient selfjid c a = case parseJID c of 	Nothing -> return noop 	Just tojid@@ -323,10 +321,10 @@ pairMsgReceived urlrenderer PairReq theiruuid selfjid theirjid 	| baseJID selfjid == baseJID theirjid = autoaccept 	| otherwise = do-		knownjids <- catMaybes . map (parseJID . getXMPPClientID)+		knownjids <- mapMaybe (parseJID . getXMPPClientID) 			. filter isXMPPRemote . syncRemotes <$> getDaemonStatus 		um <- liftAnnex uuidMap-		if any (== baseJID theirjid) knownjids && M.member theiruuid um+		if elem (baseJID theirjid) knownjids && M.member theiruuid um 			then autoaccept 			else showalert @@ -338,7 +336,7 @@ 		finishXMPPPairing theirjid theiruuid 	-- Show an alert to let the user decide if they want to pair. 	showalert = do-		button <- mkAlertButton (T.pack "Respond") urlrenderer $+		button <- mkAlertButton True (T.pack "Respond") urlrenderer $ 			ConfirmXMPPPairFriendR $ 				PairKey theiruuid $ formatJID theirjid 		void $ addAlert $ pairRequestReceivedAlert
Assistant/Types/DaemonStatus.hs view
@@ -5,8 +5,6 @@  - Licensed under the GNU GPL version 3 or higher.  -} -{-# LANGUAGE RankNTypes, ImpredicativeTypes #-}- module Assistant.Types.DaemonStatus where  import Common.Annex@@ -18,6 +16,7 @@ import Assistant.Types.Alert  import Control.Concurrent.STM+import Control.Concurrent.MVar import Control.Concurrent.Async import Data.Time.Clock.POSIX import qualified Data.Map as M@@ -31,9 +30,9 @@ 	, scanComplete :: Bool 	-- Time when a previous process of the daemon was running ok 	, lastRunning :: Maybe POSIXTime-	-- True when the sanity checker is running+	-- True when the daily sanity checker is running 	, sanityCheckRunning :: Bool-	-- Last time the sanity checker ran+	-- Last time the daily sanity checker ran 	, lastSanityCheck :: Maybe POSIXTime 	-- True when a scan for file transfers is running 	, transferScanRunning :: Bool@@ -62,9 +61,15 @@ 	, alertNotifier :: NotificationBroadcaster 	-- Broadcasts notifications when the syncRemotes change 	, syncRemotesNotifier :: NotificationBroadcaster+	-- Broadcasts notifications when the scheduleLog changes+	, scheduleLogNotifier :: NotificationBroadcaster+	-- Broadcasts a notification once the startup sanity check has run.+	, startupSanityCheckNotifier :: NotificationBroadcaster 	-- When the XMPP client is connected, this will contain the XMPP 	-- address. 	, xmppClientID :: Maybe ClientID+	-- MVars to signal when a remote gets connected.+	, connectRemoteNotifiers :: M.Map UUID [MVar ()] 	}  type TransferMap = M.Map Transfer TransferInfo@@ -93,4 +98,7 @@ 	<*> newNotificationBroadcaster 	<*> newNotificationBroadcaster 	<*> newNotificationBroadcaster+	<*> newNotificationBroadcaster+	<*> newNotificationBroadcaster 	<*> pure Nothing+	<*> pure M.empty
Assistant/Types/NamedThread.hs view
@@ -11,7 +11,11 @@ import Assistant.Types.ThreadName  {- Information about a named thread that can be run. -}-data NamedThread = NamedThread ThreadName (Assistant ())+data NamedThread = NamedThread Bool ThreadName (Assistant ())  namedThread :: String -> Assistant () -> NamedThread-namedThread = NamedThread . ThreadName+namedThread = NamedThread True . ThreadName++{- A named thread that can start running before the startup sanity check. -}+namedThreadUnchecked :: String -> Assistant () -> NamedThread+namedThreadUnchecked = NamedThread False . ThreadName
Assistant/WebApp/Configurators/AWS.hs view
@@ -121,7 +121,7 @@ postAddS3R = awsConfigurator $ do 	defcreds <- liftAnnex previouslyUsedAWSCreds 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ s3InputAForm defcreds+		runFormPostNoToken $ renderBootstrap $ s3InputAForm defcreds 	case result of 		FormSuccess input -> liftH $ do 			let name = T.unpack $ repoName input@@ -144,7 +144,7 @@ postAddGlacierR = glacierConfigurator $ do 	defcreds <- liftAnnex previouslyUsedAWSCreds 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ glacierInputAForm defcreds+		runFormPostNoToken $ renderBootstrap $ glacierInputAForm defcreds 	case result of 		FormSuccess input -> liftH $ do 			let name = T.unpack $ repoName input@@ -187,7 +187,7 @@ enableAWSRemote remotetype uuid = do 	defcreds <- liftAnnex previouslyUsedAWSCreds 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ awsCredsAForm defcreds+		runFormPostNoToken $ renderBootstrap $ awsCredsAForm defcreds 	case result of 		FormSuccess creds -> liftH $ do 			m <- liftAnnex readRemoteLog
Assistant/WebApp/Configurators/Delete.hs view
@@ -81,7 +81,7 @@ 	havegitremotes <- haveremotes syncGitRemotes 	havedataremotes <- haveremotes syncDataRemotes 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ sanityVerifierAForm $+		runFormPostNoToken $ renderBootstrap $ sanityVerifierAForm $ 			SanityVerifier magicphrase 	case result of 		FormSuccess _ -> liftH $ do
Assistant/WebApp/Configurators/Edit.hs view
@@ -181,7 +181,7 @@ 	curr <- liftAnnex $ getRepoConfig uuid mremote 	liftAnnex $ checkAssociatedDirectory curr mremote 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ editRepositoryAForm (isNothing mremote) curr+		runFormPostNoToken $ renderBootstrap $ editRepositoryAForm (isNothing mremote) curr 	case result of 		FormSuccess input -> liftH $ do 			setRepoConfig uuid mremote curr input
+ Assistant/WebApp/Configurators/Fsck.hs view
@@ -0,0 +1,149 @@+{- git-annex assistant fsck configuration+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU AGPL version 3 or higher.+ -}++{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-}++module Assistant.WebApp.Configurators.Fsck where++import qualified Data.Map as M+import qualified Data.Set as S+import qualified Data.Text as T++import Assistant.WebApp.Common+import Types.ScheduledActivity+import Utility.HumanTime+import Utility.Scheduled+import Logs.Schedule+import Annex.UUID+import qualified Remote+import Assistant.DaemonStatus+import qualified Annex.Branch++{- This adds a form to the page. It does not handle posting of the form,+ - because unlike a typical yesod form that posts using the same url+ - that generated it, this form posts using one of two other routes. -}+showFsckForm :: Bool -> ScheduledActivity -> Widget+showFsckForm new activity = do+	u <- liftAnnex getUUID+	let action = if new+		then AddActivityR u+		else ChangeActivityR u activity+	((res, form), enctype) <- liftH $ runFsckForm new activity+	case res of+		FormSuccess _ -> noop+		_ -> $(widgetFile "configurators/fsck/form")++{- This does not display a form, but it does get it from a post, and run+ - some Annex action on it. -}+withFsckForm :: (ScheduledActivity -> Annex ()) -> Handler ()+withFsckForm a = do+	((res, _form), _enctype) <- runFsckForm False defaultFsck+	case res of+		FormSuccess activity -> liftAnnex $ a activity+		_ -> noop++mkFsck :: UUID -> UUID -> Schedule -> Duration -> ScheduledActivity+mkFsck hereu u s d+	| u == hereu = ScheduledSelfFsck s d +	| otherwise = ScheduledRemoteFsck u s d++runFsckForm :: Bool -> ScheduledActivity -> Handler ((FormResult ScheduledActivity, Widget), Enctype)+runFsckForm new activity = case activity of+	ScheduledSelfFsck s d -> go s d =<< liftAnnex getUUID+	ScheduledRemoteFsck ru s d -> go s d ru+  where+  	go (Schedule r t) d ru = do+		u <- liftAnnex getUUID+		repolist <- liftAssistant (getrepolist ru)+		runFormPostNoToken $ \msg -> do+			(reposRes, reposView) <- mreq (selectFieldList repolist) "" (Just ru)+			(durationRes, durationView) <- mreq intField "" (Just $ durationSeconds d `quot` 60 )+			(timeRes, timeView) <- mreq (selectFieldList times) "" (Just t)+			(recurranceRes, recurranceView) <- mreq (selectFieldList recurrances) "" (Just r)+			let form = do+				webAppFormAuthToken+				$(widgetFile "configurators/fsck/formcontent")+			let formresult = mkFsck+				<$> pure u+				<*> reposRes+				<*> (Schedule <$> recurranceRes <*> timeRes)+				<*> (Duration <$> ((60 *) <$> durationRes))+			return (formresult, form)+	  where+		times :: [(Text, ScheduledTime)]+		times = ensurevalue t (T.pack $ fromScheduledTime t) $+			map (\x -> (T.pack $ fromScheduledTime x, x)) $+				AnyTime : map (\h -> SpecificTime h 0) [0..23]+		recurrances :: [(Text, Recurrance)]+		recurrances = ensurevalue r (T.pack $ fromRecurrance r) $+			[ ("every day", Daily)+			, ("every Sunday", Weekly $ Just 1)+			, ("every Monday", Weekly $ Just 2)+			, ("every Tuesday", Weekly $ Just 3)+			, ("every Wednesday", Weekly $ Just 4)+			, ("every Thursday", Weekly $ Just 5)+			, ("every Friday", Weekly $ Just 6)+			, ("every Saturday", Weekly $ Just 7)+			, ("monthly", Monthly Nothing)+			, ("twice a month", Divisible 2 (Weekly Nothing))+			, ("yearly", Yearly Nothing)+			, ("twice a year", Divisible 6 (Monthly Nothing))+			, ("quarterly", Divisible 4 (Monthly Nothing))+			]+	ensurevalue v desc l = case M.lookup v (M.fromList $ map (\(x,y) -> (y,x)) l) of+		Just _ -> l+		Nothing -> (desc, v) : l+	getrepolist :: UUID -> Assistant [(Text, UUID)]+	getrepolist ensureu = do+		-- It is possible to have fsck jobs for remotes that+		-- do not implement remoteFsck, but it's not too useful,+		-- so omit them from the UI normally.+		remotes <- filter (\r -> Remote.uuid r == ensureu || isJust (Remote.remoteFsck r)) . syncRemotes+			<$> getDaemonStatus+		u <- liftAnnex getUUID+		let us = u : (map Remote.uuid remotes)+		liftAnnex $ +			zip <$> (map T.pack <$> Remote.prettyListUUIDs us) <*> pure us++defaultFsck :: ScheduledActivity+defaultFsck = ScheduledSelfFsck (Schedule Daily AnyTime) (Duration $ 60*60)++showFsckStatus :: ScheduledActivity -> Widget+showFsckStatus activity = do+	m <- liftAnnex getLastRunTimes+	let lastrun = M.lookup activity m+	$(widgetFile "configurators/fsck/status")++getConfigFsckR :: Handler Html+getConfigFsckR = postConfigFsckR+postConfigFsckR :: Handler Html+postConfigFsckR = page "Consistency checks" (Just Configuration) $ do+	checks <- liftAnnex $ S.toList <$> (scheduleGet =<< getUUID)+	$(widgetFile "configurators/fsck")++changeSchedule :: Handler () -> Handler Html+changeSchedule a = do+	a+	liftAnnex $ Annex.Branch.commit "update"+	redirect ConfigFsckR++getRemoveActivityR :: UUID -> ScheduledActivity -> Handler Html+getRemoveActivityR u activity = changeSchedule $+	liftAnnex $ scheduleRemove u activity++getAddActivityR :: UUID -> Handler Html+getAddActivityR = postAddActivityR+postAddActivityR :: UUID -> Handler Html+postAddActivityR u = changeSchedule $+	withFsckForm $ scheduleAdd u++getChangeActivityR :: UUID -> ScheduledActivity -> Handler Html+getChangeActivityR = postChangeActivityR+postChangeActivityR :: UUID -> ScheduledActivity -> Handler Html+postChangeActivityR u oldactivity = changeSchedule $+	withFsckForm $ \newactivity -> scheduleChange u $+			S.insert newactivity . S.delete oldactivity
Assistant/WebApp/Configurators/IA.hs view
@@ -126,7 +126,7 @@ postAddIAR = iaConfigurator $ do 	defcreds <- liftAnnex previouslyUsedIACreds 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ iaInputAForm defcreds+		runFormPostNoToken $ renderBootstrap $ iaInputAForm defcreds 	case result of 		FormSuccess input -> liftH $ do 			let name = escapeBucket $ T.unpack $ itemName input@@ -165,7 +165,7 @@ enableIARemote uuid = do 	defcreds <- liftAnnex previouslyUsedIACreds 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ iaCredsAForm defcreds+		runFormPostNoToken $ renderBootstrap $ iaCredsAForm defcreds 	case result of 		FormSuccess creds -> liftH $ do 			m <- liftAnnex readRemoteLog
Assistant/WebApp/Configurators/Local.hs view
@@ -155,7 +155,7 @@ 	let androidspecial = False 	path <- liftIO . defaultRepositoryPath =<< liftH inFirstRun #endif-	((res, form), enctype) <- liftH $ runFormPost $ newRepositoryForm path+	((res, form), enctype) <- liftH $ runFormPostNoToken $ newRepositoryForm path 	case res of 		FormSuccess (RepositoryPath p) -> liftH $ 			startFullAssistant (T.unpack p) ClientGroup Nothing@@ -178,7 +178,7 @@ postNewRepositoryR :: Handler Html postNewRepositoryR = page "Add another repository" (Just Configuration) $ do 	home <- liftIO myHomeDir-	((res, form), enctype) <- liftH $ runFormPost $ newRepositoryForm home+	((res, form), enctype) <- liftH $ runFormPostNoToken $ newRepositoryForm home 	case res of 		FormSuccess (RepositoryPath p) -> do 			let path = T.unpack p@@ -233,7 +233,7 @@ 	removabledrives <- liftIO driveList 	writabledrives <- liftIO $ 		filterM (canWrite . T.unpack . mountPoint) removabledrives-	((res, form), enctype) <- liftH $ runFormPost $+	((res, form), enctype) <- liftH $ runFormPostNoToken $ 		selectDriveForm (sort writabledrives) 	case res of 		FormSuccess drive -> liftH $ redirect $ ConfirmAddDriveR drive@@ -294,11 +294,11 @@ 		r <- liftAnnex $ addRemote $ 			makeGCryptRemote remotename dir keyid 		return (Types.Remote.uuid r, r)-	go NoRepoKey = checkGCryptRepoEncryption dir makeunencrypted $ do-			mu <- liftAnnex $ probeGCryptRemoteUUID dir-			case mu of-				Just u -> enableexistinggcryptremote u-				Nothing -> error "The drive contains a gcrypt repository that is not a git-annex special remote. This is not supported."+	go NoRepoKey = checkGCryptRepoEncryption dir makeunencrypted makeunencrypted $ do+		mu <- liftAnnex $ probeGCryptRemoteUUID dir+		case mu of+			Just u -> enableexistinggcryptremote u+			Nothing -> error "The drive contains a gcrypt repository that is not a git-annex special remote. This is not supported." 	enableexistinggcryptremote u = do 		remotename' <- liftAnnex $ getGCryptRemoteName u dir 		makewith $ const $ do
Assistant/WebApp/Configurators/Pairing.hs view
@@ -265,7 +265,7 @@ promptSecret :: Maybe PairMsg -> (Text -> Secret -> Widget) -> Handler Html promptSecret msg cont = pairPage $ do 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $+		runFormPostNoToken $ renderBootstrap $ 			InputSecret <$> aopt textField "Secret phrase" Nothing 	case result of 		FormSuccess v -> do
Assistant/WebApp/Configurators/Preferences.hs view
@@ -90,7 +90,7 @@ postPreferencesR = page "Preferences" (Just Configuration) $ do 	((result, form), enctype) <- liftH $ do 		current <- liftAnnex getPrefs-		runFormPost $ renderBootstrap $ prefsAForm current+		runFormPostNoToken $ renderBootstrap $ prefsAForm current 	case result of 		FormSuccess new -> liftH $ do 			liftAnnex $ storePrefs new
Assistant/WebApp/Configurators/Ssh.hs view
@@ -116,7 +116,7 @@ postAddSshR = sshConfigurator $ do 	username <- liftIO $ T.pack <$> myUserName 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ sshInputAForm textField $+		runFormPostNoToken $ renderBootstrap $ sshInputAForm textField $ 			SshInput Nothing (Just username) Nothing 22 	case result of 		FormSuccess sshinput -> do@@ -168,7 +168,7 @@ 	case (mkSshInput . unmangle <$> getsshinput m, M.lookup "name" m) of 		(Just sshinput, Just reponame) -> sshConfigurator $ do 			((result, form), enctype) <- liftH $-				runFormPost $ renderBootstrap $ sshInputAForm textField sshinput+				runFormPostNoToken $ renderBootstrap $ sshInputAForm textField sshinput 			case result of 				FormSuccess sshinput' 					| isRsyncNet (inputHostname sshinput') ->@@ -342,15 +342,12 @@ {- Detect if the user entered a location with an existing, known  - gcrypt repository, and enable it. Otherwise, runs the action. -} checkExistingGCrypt :: SshData -> Widget -> Widget-checkExistingGCrypt sshdata nope = ifM (liftIO isGcryptInstalled)-	( checkGCryptRepoEncryption repourl nope $ do-		mu <- liftAnnex $ probeGCryptRemoteUUID repourl-		case mu of-			Just u -> void $ liftH $-				combineExistingGCrypt sshdata u-			Nothing -> error "The location contains a gcrypt repository that is not a git-annex special remote. This is not supported."-	, nope-	)+checkExistingGCrypt sshdata nope = checkGCryptRepoEncryption repourl nope nope $ do+	mu <- liftAnnex $ probeGCryptRemoteUUID repourl+	case mu of+		Just u -> void $ liftH $+			combineExistingGCrypt sshdata u+		Nothing -> error "The location contains a gcrypt repository that is not a git-annex special remote. This is not supported."   where   	repourl = genSshUrl sshdata @@ -413,7 +410,7 @@ getAddRsyncNetR = postAddRsyncNetR postAddRsyncNetR :: Handler Html postAddRsyncNetR = do-	((result, form), enctype) <- runFormPost $+	((result, form), enctype) <- runFormPostNoToken $ 		renderBootstrap $ sshInputAForm hostnamefield $ 			SshInput Nothing Nothing Nothing 22 	let showform status = inpage $@@ -465,11 +462,12 @@  enableRsyncNetGCrypt :: SshInput -> RemoteName -> Handler Html enableRsyncNetGCrypt sshinput reponame = -	prepRsyncNet sshinput reponame $ \sshdata ->-		checkGCryptRepoEncryption (genSshUrl sshdata) notencrypted $+	prepRsyncNet sshinput reponame $ \sshdata -> whenGcryptInstalled $+		checkGCryptRepoEncryption (genSshUrl sshdata) notencrypted notinstalled $ 			enableGCrypt sshdata reponame   where 	notencrypted = error "Unexpectedly found a non-encrypted git repository, instead of the expected encrypted git repository."+	notinstalled = error "internal"  {- Prepares rsync.net ssh key, and if successful, runs an action with  - its SshData. -}
Assistant/WebApp/Configurators/WebDAV.hs view
@@ -18,7 +18,6 @@ import Types.Remote (RemoteConfig) import Types.StandardGroups import Logs.Remote-import Assistant.Gpg import Assistant.WebApp.Utility import Git.Remote @@ -26,6 +25,7 @@ #endif import qualified Data.Text as T import Network.URI+import Assistant.Gpg  webDAVConfigurator :: Widget -> Handler Html webDAVConfigurator = page "Add a WebDAV repository" (Just Configuration)@@ -67,7 +67,7 @@ postAddBoxComR = boxConfigurator $ do 	defcreds <- liftAnnex $ previouslyUsedWebDAVCreds "box.com" 	((result, form), enctype) <- liftH $-		runFormPost $ renderBootstrap $ boxComAForm defcreds+		runFormPostNoToken $ renderBootstrap $ boxComAForm defcreds 	case result of 		FormSuccess input -> liftH $  			makeWebDavRemote initSpecialRemote "box.com" (toCredPair input) $ M.fromList@@ -110,7 +110,7 @@ 			maybe (pure Nothing) previouslyUsedWebDAVCreds $ 				urlHost url 		((result, form), enctype) <- liftH $-			runFormPost $ renderBootstrap $ webDAVCredsAForm defcreds+			runFormPostNoToken $ renderBootstrap $ webDAVCredsAForm defcreds 		case result of 			FormSuccess input -> liftH $ 				makeWebDavRemote enableSpecialRemote name (toCredPair input) M.empty
Assistant/WebApp/Configurators/XMPP.hs view
@@ -55,7 +55,7 @@ checkCloudRepos urlrenderer r = 	unlessM (syncingToCloudRemote <$> getDaemonStatus) $ do 		buddyname <- getBuddyName $ Remote.uuid r-		button <- mkAlertButton "Add a cloud repository" urlrenderer $+		button <- mkAlertButton True "Add a cloud repository" urlrenderer $ 			NeedCloudRepoR $ Remote.uuid r 		void $ addAlert $ cloudRepoNeededAlert buddyname button #else@@ -112,7 +112,7 @@ xmppform next = xmppPage $ do 	((result, form), enctype) <- liftH $ do 		oldcreds <- liftAnnex getXMPPCreds-		runFormPost $ renderBootstrap $ xmppAForm $+		runFormPostNoToken $ renderBootstrap $ xmppAForm $ 			creds2Form <$> oldcreds 	let showform problem = $(widgetFile "configurators/xmpp") 	case result of
Assistant/WebApp/Gpg.hs view
@@ -79,9 +79,18 @@   where 	missing = error $ "Cannot find configuration for the gcrypt remote at " ++ repoloc -checkGCryptRepoEncryption :: (Monad m, LiftAnnex m) => String -> m a -> m a -> m a-checkGCryptRepoEncryption location notencrypted encrypted = -	dispatch =<< liftAnnex (inRepo $ Git.GCrypt.probeRepo location)+{- Checks to see if a repo is encrypted with gcrypt, and runs one action if+ - it's not an another if it is.+ -+ - Since the probing requires gcrypt to be installed, a third action must+ - be provided to run if it's not installed.+ -}+checkGCryptRepoEncryption :: (Monad m, LiftAnnex m) => String -> m a -> m a -> m a -> m a+checkGCryptRepoEncryption location notencrypted notinstalled encrypted = +	ifM (liftAnnex $ liftIO isGcryptInstalled)+		( dispatch =<< liftAnnex (inRepo $ Git.GCrypt.probeRepo location)+		, notinstalled+		)   where 	dispatch Git.GCrypt.Decryptable = encrypted 	dispatch Git.GCrypt.NotEncrypted = notencrypted
Assistant/WebApp/Page.hs view
@@ -45,8 +45,8 @@ page :: Hamlet.Html -> Maybe NavBarItem -> Widget -> Handler Html page title navbaritem content = customPage navbaritem $ do 	setTitle title-	sideBarDisplay 	content+	sideBarDisplay  {- A custom page, with no title or sidebar set. -} customPage :: Maybe NavBarItem -> Widget -> Handler Html
+ Assistant/WebApp/Repair.hs view
@@ -0,0 +1,80 @@+{- git-annex assistant repository repair+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU AGPL version 3 or higher.+ -}++{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-}++module Assistant.WebApp.Repair where++import Assistant.WebApp.Common+import Assistant.WebApp.Utility+import Assistant.WebApp.RepoList+import Remote (prettyUUID)+import Command.Repair (repairAnnexBranch)+import Git.Repair (runRepairOf)+import Logs.FsckResults+import Annex.UUID+import Utility.Batch+import Config.Files++import Control.Concurrent.Async++getRepairRepositoryR :: UUID -> Handler Html+getRepairRepositoryR = postRepairRepositoryR+postRepairRepositoryR :: UUID -> Handler Html+postRepairRepositoryR u = page "Repair repository" Nothing $ do+	repodesc <- liftAnnex $ prettyUUID u+	$(widgetFile "control/repairrepository")++getRepairRepositoryRunR :: UUID -> Handler Html+getRepairRepositoryRunR = postRepairRepositoryRunR+postRepairRepositoryRunR :: UUID -> Handler Html+postRepairRepositoryRunR u = do+	-- Stop the watcher from running while running repairs.+	changeSyncable Nothing False++	fsckthread <- liftAssistant $ runRepair u++	-- Start the watcher running again. This also triggers it to do a+	-- startup scan, which is especially important if the git repo+	-- repair removed files from the index file. Those files will be+	-- seen as new, and re-added to the repository.+	changeSyncable Nothing True++	liftAnnex $ writeFsckResults u Nothing++	page "Repair repository" Nothing $ do+		let repolist = repoListDisplay $+			mainRepoSelector { nudgeAddMore = True }+		$(widgetFile "control/repairrepository/done")++runRepair :: UUID -> Assistant ()+runRepair u = do+	fsckresults <- liftAnnex (readFsckResults u)+	myu <- liftAnnex getUUID+	if u == myu+		then localrepair fsckresults+		else remoterepair fsckresults+  where+  	localrepair fsckresults = do+		-- This intentionally runs the repair inside the Annex+		-- monad, which is not stricktly necessary, but keeps+		-- other threads that might be trying to use the Annex+		-- from running until it completes.+		needfsck <- liftAnnex $ do+			(ok, stillmissing, modifiedbranches) <- inRepo $+				runRepairOf fsckresults True+			repairAnnexBranch stillmissing modifiedbranches+			return (not ok)+		when needfsck $+			backgroundfsck [ Param "--fast" ]++	remoterepair fsckresults = do+		error "TODO: remote repair"+	+	backgroundfsck params = liftIO $ void $ async $ do+		program <- readProgramFile+		batchCommand program (Param "fsck" : params)
Assistant/WebApp/Types.hs view
@@ -23,6 +23,7 @@ import Logs.Transfer import Utility.Gpg (KeyId) import Build.SysConfig (packageversion)+import Types.ScheduledActivity  import Yesod.Static import Text.Hamlet@@ -209,5 +210,9 @@ 	fromPathPiece = readish . unpack  instance PathPiece ThreadName where+	toPathPiece = pack . show+	fromPathPiece = readish . unpack++instance PathPiece ScheduledActivity where 	toPathPiece = pack . show 	fromPathPiece = readish . unpack
Assistant/WebApp/routes view
@@ -19,6 +19,7 @@ /config/xmpp/for/self XMPPConfigForPairSelfR GET POST /config/xmpp/for/frield XMPPConfigForPairFriendR GET POST /config/xmpp/needcloudrepo/#UUID NeedCloudRepoR GET+/config/fsck ConfigFsckR GET POST  /config/addrepository AddRepositoryR GET /config/repository/new NewRepositoryR GET POST@@ -83,6 +84,10 @@ /config/repository/delete/finish/#UUID FinishDeleteRepositoryR GET /config/repository/delete/here DeleteCurrentRepositoryR GET POST +/config/activity/add/#UUID AddActivityR GET POST+/config/activity/change/#UUID/#ScheduledActivity ChangeActivityR GET POST+/config/activity/remove/#UUID/#ScheduledActivity RemoveActivityR GET+ /transfers/#NotificationId TransfersR GET /notifier/transfers NotifierTransfersR GET @@ -102,5 +107,8 @@ /transfer/pause/#Transfer PauseTransferR GET POST /transfer/start/#Transfer StartTransferR GET POST /transfer/cancel/#Transfer CancelTransferR GET POST++/repair/#UUID RepairRepositoryR GET POST+/repair/run/#UUID RepairRepositoryRunR GET POST  /static StaticR Static getStatic
Backend/Hash.hs view
@@ -5,6 +5,8 @@  - Licensed under the GNU GPL version 3 or higher.  -} +{-# LANGUAGE CPP #-}+ module Backend.Hash (backends) where  import Common.Annex@@ -27,7 +29,9 @@ hashes :: [Hash] hashes = concat  	[ map SHAHash [256, 1, 512, 224, 384]+#ifdef WITH_CRYPTOHASH 	, map SkeinHash [256, 512]+#endif 	]  {- The SHA256E backend is the default, so genBackendE comes first. -}@@ -143,7 +147,7 @@ 	| hashsize == 224 = use SysConfig.sha224 sha224 	| hashsize == 384 = use SysConfig.sha384 sha384 	| hashsize == 512 = use SysConfig.sha512 sha512-	| otherwise = error $ "bad sha size " ++ show hashsize+	| otherwise = error $ "unsupported sha size " ++ show hashsize   where 	use Nothing hasher = Left $ show . hasher 	use (Just c) hasher@@ -157,6 +161,8 @@  skeinHasher :: HashSize -> (L.ByteString -> String) skeinHasher hashsize +#ifdef WITH_CRYPTOHASH 	| hashsize == 256 = show . skein256 	| hashsize == 512 = show . skein512-	| otherwise = error $ "bad skein size " ++ show hashsize+#endif+	| otherwise = error $ "unsupported skein size " ++ show hashsize
Backend/URL.hs view
@@ -10,11 +10,10 @@ 	fromUrl ) where -import Data.Hash.MD5- import Common.Annex import Types.Backend import Types.Key+import Backend.Utilities  backends :: [Backend] backends = [backend]@@ -27,18 +26,12 @@ 	, canUpgradeKey = Nothing 	} -{- When it's not too long, use the full url as the key name.- - If the url is too long, it's truncated at half the filename length- - limit, and the md5 of the url is prepended to ensure a unique key. -}+{- Every unique url has a corresponding key. -} fromUrl :: String -> Maybe Integer -> Annex Key fromUrl url size = do-	limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir-	let truncurl = truncateFilePath (limit `div` 2) url-	let key = if url == truncurl-		then url-		else truncurl ++ "-" ++ md5s (Str url)+	n <- genKeyName url 	return $ stubKey-		{ keyName = key+		{ keyName = n 		, keyBackendName = "URL" 		, keySize = size-	}+		}
+ Backend/Utilities.hs view
@@ -0,0 +1,25 @@+{- git-annex backend utilities+ -+ - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Backend.Utilities where++import Data.Hash.MD5++import Common.Annex++{- Generates a keyName from an input string. Takes care of sanitizing it.+ - If it's not too long, the full string is used as the keyName.+ - Otherwise, it's truncated at half the filename length limit, and its+ - md5 is prepended to ensure a unique key. -}+genKeyName :: String -> Annex String+genKeyName s = do+	limit <- liftIO . fileNameLengthLimit =<< fromRepo gitAnnexDir+	let s' = preSanitizeKeyName s+	let truncs = truncateFilePath (limit `div` 2) s'+	return $ if s' == truncs+		then s'+		else truncs ++ "-" ++ md5s (Str s)
Backend/WORM.hs view
@@ -11,6 +11,7 @@ import Types.Backend import Types.Key import Types.KeySource+import Backend.Utilities  backends :: [Backend] backends = [backend]@@ -33,9 +34,10 @@ keyValue :: KeySource -> Annex (Maybe Key) keyValue source = do 	stat <- liftIO $ getFileStatus $ contentLocation source-	return $ Just Key {-		keyName = takeFileName $ keyFilename source,-		keyBackendName = name backend,-		keySize = Just $ fromIntegral $ fileSize stat,-		keyMtime = Just $ modificationTime stat-	}+	n <- genKeyName $ keyFilename source+	return $ Just Key+		{ keyName = n+		, keyBackendName = name backend+		, keySize = Just $ fromIntegral $ fileSize stat+		, keyMtime = Just $ modificationTime stat+		}
Build/BundledPrograms.hs view
@@ -24,7 +24,10 @@ 	, Just "git" #endif 	, Just "cp"+#ifndef mingw32_HOST_OS+	-- using xargs on windows led to problems, so it's not used there 	, Just "xargs"+#endif 	, Just "rsync" 	, Just "ssh" #ifndef mingw32_HOST_OS@@ -41,8 +44,8 @@ 	, SysConfig.sha512 	, SysConfig.sha224 	, SysConfig.sha384-	-- ionice is not included in the bundle; we rely on the system's-	-- own version, which may better match its kernel+	-- nice and ionice are not included in the bundle; we rely on the+	-- system's own version, which may better match its kernel 	]   where 	ifset True s = Just s
Build/Configure.hs view
@@ -13,9 +13,9 @@ import Data.Char  import Build.TestConfig+import Build.Version import Utility.SafeCommand import Utility.Monad-import Utility.Exception import Utility.ExternalSHA import qualified Git.Version @@ -33,12 +33,13 @@ 	, TestCase "wget" $ testCmd "wget" "wget --version >/dev/null" 	, TestCase "bup" $ testCmd "bup" "bup --version >/dev/null" 	, TestCase "quvi" $ testCmd "quvi" "quvi --version >/dev/null"+	, TestCase "nice" $ testCmd "nice" "nice true >/dev/null" 	, TestCase "ionice" $ testCmd "ionice" "ionice -c3 true >/dev/null" 	, TestCase "gpg" $ maybeSelectCmd "gpg" 		[ ("gpg", "--version >/dev/null") 		, ("gpg2", "--version >/dev/null") ] 	, TestCase "lsof" $ findCmdPath "lsof" "lsof"-	, TestCase "gcrypt" $ findCmdPath "gcrypt" "git-remote-gcrypt"+	, TestCase "git-remote-gcrypt" $ findCmdPath "gcrypt" "git-remote-gcrypt" 	, TestCase "ssh connection caching" getSshConnectionCaching 	] ++ shaTestCases 	[ (1, "da39a3ee5e6b4b0d3255bfef95601890afd80709")@@ -89,40 +90,6 @@ 	cmd = "cp " ++ option 	cmdline = cmd ++ " " ++ testFile ++ " " ++ testFile ++ ".new" -isReleaseBuild :: IO Bool-isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD")--{- Version is usually based on the major version from the changelog, - - plus the date of the last commit, plus the git rev of that commit.- - This works for autobuilds, ad-hoc builds, etc.- -- - If git or a git repo is not available, or something goes wrong,- - or this is a release build, just use the version from the changelog. -}-getVersion :: Test-getVersion = do-	changelogversion <- getChangelogVersion-	version <- ifM (isReleaseBuild)-		( return changelogversion-		, catchDefaultIO changelogversion $ do-			let major = takeWhile (/= '.') changelogversion-			autoversion <- readProcess "sh"-				[ "-c"-				, "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'"-				] ""-			if null autoversion-				then return changelogversion-				else return $ concat [ major, ".", autoversion ]-		)-	return $ Config "packageversion" (StringConfig version)-	-getChangelogVersion :: IO String-getChangelogVersion = do-	changelog <- readFile "debian/changelog"-	let verline = takeWhile (/= '\n') changelog-	return $ middle (words verline !! 1)-  where-	middle = drop 1 . init- getGitVersion :: Test getGitVersion = Config "gitversion" . StringConfig . show 	<$> Git.Version.installed@@ -131,25 +98,6 @@ getSshConnectionCaching = Config "sshconnectioncaching" . BoolConfig <$> 	boolSystem "sh" [Param "-c", Param "ssh -o ControlPersist=yes -V >/dev/null 2>/dev/null"] -{- Set up cabal file with version. -}-cabalSetup :: IO ()-cabalSetup = do-	version <- takeWhile (\c -> isDigit c || c == '.')-		<$> getChangelogVersion-	cabal <- readFile cabalfile-	writeFile tmpcabalfile $ unlines $ -		map (setfield "Version" version) $-		lines cabal-	renameFile tmpcabalfile cabalfile-  where-	cabalfile = "git-annex.cabal"-	tmpcabalfile = cabalfile++".tmp"-	setfield field value s-		| fullfield `isPrefixOf` s = fullfield ++ value-		| otherwise = s-	  where-		fullfield = field ++ ": "- setup :: IO () setup = do 	createDirectoryIfMissing True tmpDir@@ -167,8 +115,8 @@ 		then writeSysConfig $ androidConfig config 		else writeSysConfig config 	cleanup-	whenM (isReleaseBuild) $-		cabalSetup+	whenM isReleaseBuild $+		cabalSetup "git-annex.cabal"  {- Hard codes some settings to cross-compile for Android. -} androidConfig :: [Config] -> [Config]
+ Build/Version.hs view
@@ -0,0 +1,69 @@+{- Package version determination, for configure script. -}++module Build.Version where++import Data.Maybe+import Control.Applicative+import Data.List+import System.Environment+import System.Directory+import Data.Char+import System.Process++import Build.TestConfig+import Utility.Monad+import Utility.Exception++{- Set when making an official release. (Distribution vendors should set+ - this too.) -}+isReleaseBuild :: IO Bool+isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD")++{- Version is usually based on the major version from the changelog, + - plus the date of the last commit, plus the git rev of that commit.+ - This works for autobuilds, ad-hoc builds, etc.+ -+ - If git or a git repo is not available, or something goes wrong,+ - or this is a release build, just use the version from the changelog. -}+getVersion :: Test+getVersion = do+	changelogversion <- getChangelogVersion+	version <- ifM (isReleaseBuild)+		( return changelogversion+		, catchDefaultIO changelogversion $ do+			let major = takeWhile (/= '.') changelogversion+			autoversion <- takeWhile (\c -> isAlphaNum c || c == '-') <$> readProcess "sh"+				[ "-c"+				, "git log -n 1 --format=format:'%ci %h'| sed -e 's/-//g' -e 's/ .* /-g/'"+				] ""+			if null autoversion+				then return changelogversion+				else return $ concat [ major, ".", autoversion ]+		)+	return $ Config "packageversion" (StringConfig version)+	+getChangelogVersion :: IO String+getChangelogVersion = do+	changelog <- readFile "debian/changelog"+	let verline = takeWhile (/= '\n') changelog+	return $ middle (words verline !! 1)+  where+	middle = drop 1 . init++{- Set up cabal file with version. -}+cabalSetup :: FilePath -> IO ()+cabalSetup cabalfile = do+	version <- takeWhile (\c -> isDigit c || c == '.')+		<$> getChangelogVersion+	cabal <- readFile cabalfile+	writeFile tmpcabalfile $ unlines $ +		map (setfield "Version" version) $+		lines cabal+	renameFile tmpcabalfile cabalfile+  where+	tmpcabalfile = cabalfile++".tmp"+	setfield field value s+		| fullfield `isPrefixOf` s = fullfield ++ value+		| otherwise = s+	  where+		fullfield = field ++ ": "
Build/make-sdist.sh view
@@ -10,7 +10,6 @@ find . \( -name .git -or -name dist -or -name cabal-dev \) -prune \ 	-or -not -name \\*.orig -not -type d -print \ | perl -ne "print unless length >= 100 - length q{$sdist_dir}" \-| grep -v \\._comment | grep -v \\.mdwn | grep -v /doc/design/ | grep -v /doc/android/ | grep -v /doc/assistant/ | grep -v /doc/tips/ \ | xargs cp --parents --target-directory dist/$sdist_dir  cd dist
BuildFlags.hs view
@@ -54,4 +54,10 @@ #ifdef WITH_QUVI 	, "Quvi" #endif+#ifdef WITH_TDFA+	, "TDFA"+#endif+#ifdef WITH_CRYPTOHASH+	, "CryptoHash"+#endif 	]
CHANGELOG view
@@ -1,3 +1,49 @@+git-annex (4.20131024) unstable; urgency=low++  * webapp: Fix bug when adding a remote and git-remote-gcrypt+    is not installed.+  * The assitant can now run scheduled incremental fsck jobs on the local+    repository and remotes. These can be configured using vicfg or with the+    webapp.+  * repair: New command, which can repair damaged git repositories+    (even ones not using git-annex).+  * webapp: When git repository damange is detected, repairs can be+    done using the webapp UI.+  * Automatically and safely detect and recover from dangling+    .git/annex/index.lock files, which would prevent git from+    committing to the git-annex branch, eg after a crash.+  * assistant: Detect stale git lock files at startup time, and remove them.+  * addurl: Better sanitization of generated filenames.+  * Better sanitization of problem characters when generating URL and WORM+    keys.+  * The control socket path passed to ssh needs to be 17 characters+    shorter than the maximum unix domain socket length, because ssh+    appends stuff to it to make a temporary filename. Closes: #725512+  * status: Fix space leak in local mode, introduced in version 4.20130920.+  * import: Skip .git directories.+  * Remove bogus runshell loop check.+  * addurl: Improve message when adding url with wrong size to existing file.+  * Fixed handling of URL keys that have no recorded size.+  * status: Fix a crash if a temp file went away while its size was+    being checked for status.+  * Deal with git check-attr -z output format change in git 1.8.5.+  * Work around sed output difference that led to version containing a newline+    on OSX.+  * sync: Fix automatic resolution of merge conflicts where one side is an+    annexed file, and the other side is a non-annexed file, or a directory.+  * S3: Try to ensure bucket name is valid for archive.org.+  * assistant: Bug fix: When run in a subdirectory, files from incoming merges+    were wrongly added to that subdirectory, and removed from their original+    locations.+  * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding+    DOS formatted paths for --git-dir and --work-tree.+  * Removed workaround for bug in git 1.8.4r0.+  * Added git-recover-repository command to git-annex source+    (not built by default; this needs to move to someplace else).+  * webapp: Move sidebar to the right hand side of the screen.++ -- Joey Hess <joeyh@debian.org>  Thu, 24 Oct 2013 12:59:55 -0400+ git-annex (4.20131002) unstable; urgency=low    * Note that the layout of gcrypt repositories has changed, and
Command/AddUrl.hs view
@@ -83,7 +83,8 @@ 		page <- fromMaybe badquvi 			<$> withQuviOptions Quvi.forceQuery [Quvi.quiet, Quvi.httponly] s' 		let link = fromMaybe badquvi $ headMaybe $ Quvi.pageLinks page-		let file = choosefile $ sanitizeFilePath $+		pathmax <- liftIO $ fileNameLengthLimit "."+		let file = choosefile $ truncateFilePath pathmax $ sanitizeFilePath $ 			Quvi.pageTitle page ++ "." ++ Quvi.linkSuffix link 		showStart "addurl" file 		next $ performQuvi relaxed s' (Quvi.linkUrl link) file@@ -123,14 +124,16 @@ 			next $ return True 		| otherwise = do 			headers <- getHttpHeaders-			ifM (Url.withUserAgent $ Url.check url headers $ keySize key)-				( do+			(exists, samesize) <- Url.withUserAgent $ Url.check url headers $ keySize key+			if exists && samesize+				then do 					setUrlPresent key url 					next $ return True-				, do-					warning $ "failed to verify url exists: " ++ url+				else do+					warning $ if exists+						then "url does not have expected file size (use --relaxed to bypass this check) " ++ url+						else "failed to verify url exists: " ++ url 					stop-				)  addUrlFile :: Bool -> URLString -> FilePath -> Annex Bool addUrlFile relaxed url file = do@@ -214,7 +217,7 @@  url2file :: URI -> Maybe Int -> Int -> FilePath url2file url pathdepth pathmax = case pathdepth of-	Nothing -> truncateFilePath pathmax $ escape fullurl+	Nothing -> truncateFilePath pathmax $ sanitizeFilePath fullurl 	Just depth 		| depth >= length urlbits -> frombits id 		| depth > 0 -> frombits $ drop depth@@ -223,6 +226,6 @@   where 	fullurl = uriRegName auth ++ uriPath url ++ uriQuery url 	frombits a = intercalate "/" $ a urlbits-	urlbits = map (truncateFilePath pathmax . escape) $ filter (not . null) $ split "/" fullurl+	urlbits = map (truncateFilePath pathmax . sanitizeFilePath) $+		filter (not . null) $ split "/" fullurl 	auth = fromMaybe (error $ "bad url " ++ show url) $ uriAuthority url-	escape = replace "/" "_" . replace "?" "_"
Command/Direct.hs view
@@ -54,8 +54,8 @@ 			Nothing -> noop 			Just a -> do 				showStart "direct" f-				r <- tryAnnex a-				case r of+				r' <- tryAnnex a+				case r' of 					Left e -> warnlocked e 					Right _ -> showEndOk 		return Nothing
Command/Fsck.hs view
@@ -104,7 +104,7 @@ 				Nothing -> noop 				Just started -> do 					now <- liftIO getPOSIXTime-					when (now - realToFrac started >= delta)+					when (now - realToFrac started >= durationToPOSIXTime delta) 						resetStartTime 		return True 
Command/PreCommit.hs view
@@ -16,6 +16,7 @@ import Annex.CatFile import Annex.Content.Direct import Git.Sha+import Git.FilePath  def :: [Command] def = [command "pre-commit" paramPaths seek SectionPlumbing@@ -40,10 +41,11 @@ startDirect :: [String] -> CommandStart startDirect _ = next $ do 	(diffs, clean) <- inRepo $ Git.DiffTree.diffIndex Git.Ref.headRef-	forM_ diffs go+	makeabs <- flip fromTopFilePath <$> gitRepo+	forM_ diffs (go makeabs) 	next $ liftIO clean   where-	go diff = do+	go makeabs diff = do 		withkey (Git.DiffTree.srcsha diff) (Git.DiffTree.srcmode diff) removeAssociatedFile 		withkey (Git.DiffTree.dstsha diff) (Git.DiffTree.dstmode diff) addAssociatedFile 	  where@@ -51,4 +53,5 @@ 			k <- catKey sha mode 			case k of 				Nothing -> noop-				Just key -> void $ a key (Git.DiffTree.file diff)+				Just key -> void $ a key $+					makeabs $ Git.DiffTree.file diff
+ Command/Repair.hs view
@@ -0,0 +1,71 @@+{- git-annex command+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Command.Repair where++import Common.Annex+import Command+import qualified Annex+import qualified Git.Repair+import qualified Annex.Branch+import Git.Fsck (MissingObjects)+import Git.Types+import Annex.Version++def :: [Command]+def = [noCommit $ dontCheck repoExists $+	command "repair" paramNothing seek SectionMaintenance "recover broken git repository"]++seek :: [CommandSeek]+seek = [withNothing start]++start :: CommandStart+start = next $ next $ runRepair =<< Annex.getState Annex.force++runRepair :: Bool -> Annex Bool+runRepair forced = do+	(ok, stillmissing, modifiedbranches) <- inRepo $+		Git.Repair.runRepair forced+	-- This command can be run in git repos not using git-annex,+	-- so avoid git annex branch stuff in that case.+	whenM (isJust <$> getVersion) $+		repairAnnexBranch stillmissing modifiedbranches+	return ok++{- After git repository repair, the .git/annex/index file could+ - still be broken, by pointing to bad objects, or might just be corrupt on+ - its own. Since this index file is not used to stage things+ - for long durations of time, it can safely be deleted if it is broken.+ -+ - Otherwise, if the git-annex branch was modified by the repair,+ - commit the index file to the git-annex branch.+ - This way, if the git-annex branch got rewound to an old version by+ - the repository repair, or was completely deleted, this will get it back+ - to a good state. Note that in the unlikely case where the git-annex+ - branch was rewound to a state that, had new changes from elsewhere not+ - yet reflected in the index, this does properly merge those into the+ - index before committing.+ -}+repairAnnexBranch :: MissingObjects -> [Branch] -> Annex ()+repairAnnexBranch missing modifiedbranches+	| Annex.Branch.fullname `elem` modifiedbranches = ifM okindex+		( commitindex+		, do+			nukeindex+			liftIO $ putStrLn "Had to delete the .git/annex/index file as it was corrupt. Since the git-annex branch is not up-to-date anymore. It would be a very good idea to run: git annex fsck --fast"+		)+	| otherwise = ifM okindex+		( noop+		, nukeindex+		)+  where+	okindex = Annex.Branch.withIndex $+		inRepo $ Git.Repair.checkIndex missing+	commitindex = do+		Annex.Branch.forceCommit "committing index after git repository repair"+		liftIO $ putStrLn "Successfully recovered the git-annex branch using .git/annex/index"+	nukeindex = inRepo $ nukeFile . gitAnnexIndex
+ Command/Schedule.hs view
@@ -0,0 +1,50 @@+{- git-annex command+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Command.Schedule where++import Common.Annex+import Command+import qualified Remote+import Logs.Schedule+import Types.ScheduledActivity++import qualified Data.Set as S++def :: [Command]+def = [command "schedule" (paramPair paramRemote (paramOptional paramExpression)) seek+	SectionSetup "get or set scheduled jobs"]++seek :: [CommandSeek]+seek = [withWords start]++start :: [String] -> CommandStart+start = parse+  where+  	parse (name:[]) = go name performGet+	parse (name:expr:[]) = go name $ \uuid -> do+		showStart "schedile" name+		performSet expr uuid+	parse _ = error "Specify a repository."++	go name a = do+		u <- Remote.nameToUUID name+		next $ a u++performGet :: UUID -> CommandPerform+performGet uuid = do+	s <- scheduleGet uuid+	liftIO $ putStrLn $ intercalate "; " $ +		map fromScheduledActivity $ S.toList s+	next $ return True++performSet :: String -> UUID -> CommandPerform+performSet expr uuid = case parseScheduledActivities expr of+	Left e -> error $ "Parse error: " ++ e+	Right l -> do+		scheduleSet uuid l+		next $ return True
Command/Status.hs view
@@ -70,7 +70,7 @@ type StatState = StateT StatInfo Annex  def :: [Command]-def = [command "status" paramPaths seek+def = [noCommit $ command "status" paramPaths seek 	SectionQuery "shows status information about the annex"]  seek :: [CommandSeek]@@ -311,15 +311,16 @@ 	initial = (emptyKeyData, emptyKeyData, emptyNumCopiesStats) 	update matcher fast key file vs@(presentdata, referenceddata, numcopiesstats) = 		ifM (matcher $ FileInfo file file)-			( (,,)-				<$> ifM (inAnnex key)+			( do+				!presentdata' <- ifM (inAnnex key) 					( return $ addKey key presentdata 					, return presentdata 					)-				<*> pure (addKey key referenceddata)-				<*> if fast+				let !referenceddata' = addKey key referenceddata+				!numcopiesstats' <- if fast 					then return numcopiesstats 					else updateNumCopiesStats key file numcopiesstats+				return $! (presentdata', referenceddata', numcopiesstats') 			, return vs 			) @@ -345,11 +346,11 @@ 	ks = keySize key  updateNumCopiesStats :: Key -> FilePath -> NumCopiesStats -> Annex NumCopiesStats-updateNumCopiesStats key file stats = do-	variance <- Variance <$> numCopiesCheck file key (-)-	return $ stats { numCopiesVarianceMap = update (numCopiesVarianceMap stats) variance }-  where-  	update m variance = M.insertWith' (+) variance 1 m+updateNumCopiesStats key file (NumCopiesStats m) = do+	!variance <- Variance <$> numCopiesCheck file key (-)+	let !m' = M.insertWith' (+) variance 1 m+	let !ret = NumCopiesStats m'+	return ret  showSizeKeys :: KeyData -> String showSizeKeys d = total ++ missingnote@@ -362,7 +363,7 @@ 			" keys of unknown size"  staleSize :: String -> (Git.Repo -> FilePath) -> Stat-staleSize label dirspec = go =<< lift (Command.Unused.staleKeys dirspec)+staleSize label dirspec = go =<< lift (dirKeys dirspec)   where 	go [] = nostat 	go keys = onsize =<< sum <$> keysizes keys@@ -370,10 +371,11 @@ 	onsize size = stat label $ 		json (++ aside "clean up with git-annex unused") $ 			return $ roughSize storageUnits False size-	keysizes keys = map (fromIntegral . fileSize) <$> stats keys-	stats keys = do+	keysizes keys = do 		dir <- lift $ fromRepo dirspec-		liftIO $ forM keys $ \k -> getFileStatus (dir </> keyFile k)+		liftIO $ forM keys $ \k -> catchDefaultIO 0 $+			fromIntegral . fileSize +				<$> getFileStatus (dir </> keyFile k)  aside :: String -> String aside s = " (" ++ s ++ ")"
Command/Sync.hs view
@@ -31,7 +31,9 @@ import Annex.ReplaceFile import Git.FileMode +import qualified Data.Set as S import Data.Hash.MD5+import Control.Concurrent.MVar  def :: [Command] def = [command "sync" (paramOptional (paramRepeating paramRemote))@@ -41,18 +43,29 @@ seek :: CommandSeek seek rs = do 	prepMerge-	branch <- fromMaybe nobranch <$> inRepo Git.Branch.current++	-- There may not be a branch checked out until after the commit,+	-- so only look it up once needed, and only look it up once.+	mvar <- liftIO newEmptyMVar+	let getbranch = ifM (liftIO $ isEmptyMVar mvar)+		( do+			branch <- fromMaybe (error "no branch is checked out")+				<$> inRepo Git.Branch.current+			liftIO $ putMVar mvar branch+			return branch+		, liftIO $ readMVar mvar+		)+	let withbranch a = a =<< getbranch+ 	remotes <- syncRemotes rs 	return $ concat 		[ [ commit ]-		, [ mergeLocal branch ]-		, [ pullRemote remote branch | remote <- remotes ]+		, [ withbranch mergeLocal ]+		, [ withbranch (pullRemote remote) | remote <- remotes ] 		, [ mergeAnnex ]-		, [ pushLocal branch ]-		, [ pushRemote remote branch | remote <- remotes ]+		, [ withbranch pushLocal ]+		, [ withbranch (pushRemote remote) | remote <- remotes ] 		]-  where-	nobranch = error "no branch is checked out"  {- Merging may delete the current directory, so go to the top  - of the repo. -}@@ -257,25 +270,33 @@  -  - This uses the Keys pointed to by the files to construct new  - filenames. So when both sides modified file foo, - - it will be deleted, and replaced with files foo.KEYA and foo.KEYB.+ - it will be deleted, and replaced with files foo.variant-A and+ - foo.variant-B.  -  - On the other hand, when one side deleted foo, and the other modified it,  - it will be deleted, and the modified version stored as file- - foo.KEYA (or KEYB).+ - foo.variant-A (or B).+ -+ - It's also possible that one side has foo as an annexed file, and+ - the other as a directory or non-annexed file. The annexed file+ - is renamed to resolve the merge, and the other object is preserved as-is.  -} resolveMerge :: Annex Bool resolveMerge = do 	top <- fromRepo Git.repoPath 	(fs, cleanup) <- inRepo (LsFiles.unmerged [top])-	merged <- and <$> mapM resolveMerge' fs+	mergedfs <- catMaybes <$> mapM resolveMerge' fs+	let merged = not (null mergedfs) 	void $ liftIO cleanup  	(deleted, cleanup2) <- inRepo (LsFiles.deleted [top]) 	unless (null deleted) $ 		Annex.Queue.addCommand "rm" [Params "--quiet -f --"] deleted 	void $ liftIO cleanup2-	+ 	when merged $ do+		unlessM isDirect $+			cleanConflictCruft mergedfs top 		Annex.Queue.flush 		void $ inRepo $ Git.Command.runBool 			[ Param "commit"@@ -284,44 +305,86 @@ 			] 	return merged -resolveMerge' :: LsFiles.Unmerged -> Annex Bool+resolveMerge' :: LsFiles.Unmerged -> Annex (Maybe FilePath) resolveMerge' u-	| issymlink LsFiles.valUs && issymlink LsFiles.valThem =-		withKey LsFiles.valUs $ \keyUs ->-			withKey LsFiles.valThem $ \keyThem -> do+	| issymlink LsFiles.valUs && issymlink LsFiles.valThem = do+		kus <- getKey LsFiles.valUs+		kthem <- getKey LsFiles.valThem+		case (kus, kthem) of+			-- Both sides of conflict are annexed files+			(Just keyUs, Just keyThem) -> do+				removeoldfile keyUs+				if keyUs == keyThem+					then makelink keyUs+					else do+						makelink keyUs+						makelink keyThem+				return $ Just file+			-- Our side is annexed, other side is not.+			(Just keyUs, Nothing) -> do 				ifM isDirect-					( maybe noop (`removeDirect` file) keyUs-					, liftIO $ nukeFile file+					-- Move newly added non-annexed object+					-- out of direct mode merge directory.+					( do+						removeoldfile keyUs+						makelink keyUs+						d <- fromRepo gitAnnexMergeDir+						liftIO $ rename (d </> file) file+					-- cleaup tree after git merge+					, do+						unstageoldfile+						makelink keyUs 					)-				Annex.Queue.addCommand "rm" [Params "--quiet -f --"] [file]-				go keyUs keyThem-	| otherwise = return False+				return $ Just file+			-- Our side is not annexed, other side is.+			(Nothing, Just keyThem) -> do+				makelink keyThem+				unstageoldfile+				return $ Just file+			-- Neither side is annexed; cannot resolve.+			(Nothing, Nothing) -> return Nothing+	| otherwise = return Nothing   where-	go keyUs keyThem-		| keyUs == keyThem = do-			makelink keyUs-			return True-		| otherwise = do-			makelink keyUs-			makelink keyThem-			return True 	file = LsFiles.unmergedFile u 	issymlink select = select (LsFiles.unmergedBlobType u) `elem` [Just SymlinkBlob, Nothing]-	makelink (Just key) = do+	makelink key = do 		let dest = mergeFile file key 		l <- inRepo $ gitAnnexLink dest key 		replaceFile dest $ makeAnnexLink l 		stageSymlink dest =<< hashSymlink l 		whenM isDirect $ 			toDirect key dest-	makelink _ = noop-	withKey select a = do-		let msha = select $ LsFiles.unmergedSha u-		case msha of-			Nothing -> a Nothing-			Just sha -> do-				key <- catKey sha symLinkMode-				maybe (return False) (a . Just) key+	removeoldfile keyUs = do+		ifM isDirect+			( removeDirect keyUs file+			, liftIO $ nukeFile file+			)+		Annex.Queue.addCommand "rm" [Params "--quiet -f --"] [file]+	unstageoldfile = Annex.Queue.addCommand "rm" [Params "--quiet -f --cached --"] [file]+	getKey select = case select (LsFiles.unmergedSha u) of+		Nothing -> return Nothing+		Just sha -> catKey sha symLinkMode++{- git-merge moves conflicting files away to files+ - named something like f~HEAD or f~branch, but the+ - exact name chosen can vary. Once the conflict is resolved,+ - this cruft can be deleted. To avoid deleting legitimate+ - files that look like this, only delete files that are+ - A) not staged in git and B) look like git-annex symlinks.+ -}+cleanConflictCruft :: [FilePath] -> FilePath -> Annex ()+cleanConflictCruft resolvedfs top = do+	(fs, cleanup) <- inRepo $ LsFiles.notInRepo False [top]+	mapM_ clean fs+	void $ liftIO cleanup+  where+	clean f+		| matchesresolved f = whenM (isJust <$> isAnnexLink f) $+			liftIO $ nukeFile f+		| otherwise = noop+	s = S.fromList resolvedfs+	matchesresolved f = S.member (base f) s+	base f = reverse $ drop 1 $ dropWhile (/= '~') $ reverse f  {- The filename to use when resolving a conflicted merge of a file,  - that points to a key.
Command/Unused.hs view
@@ -36,6 +36,7 @@ import qualified Option import Annex.CatFile import Types.Key+import Git.FilePath  def :: [Command] def = [withOptions [fromOption] $ command "unused" paramNothing seek@@ -293,9 +294,9 @@ 	forM_ ts $ tKey lookAtWorkingTree >=> maybe noop a 	liftIO $ void clean   where-	tKey True = fmap fst <$$> Backend.lookupFile . DiffTree.file+	tKey True = fmap fst <$$> Backend.lookupFile . getTopFilePath . DiffTree.file 	tKey False = fileKey . takeFileName . encodeW8 . L.unpack <$$>-		catFile ref . DiffTree.file+		catFile ref . getTopFilePath . DiffTree.file  {- Looks in the specified directory for bad/tmp keys, and returns a list  - of those that might still have value, or might be stale and removable.@@ -304,7 +305,7 @@  -} staleKeysPrune :: (Git.Repo -> FilePath) -> Bool -> Annex [Key] staleKeysPrune dirspec nottransferred = do-	contents <- staleKeys dirspec+	contents <- dirKeys dirspec 	 	dups <- filterM inAnnex contents 	let stale = contents `exclude` dups@@ -318,18 +319,6 @@ 				<$> getTransfers 			return $ filter (`S.notMember` inprogress) stale 		else return stale--staleKeys :: (Git.Repo -> FilePath) -> Annex [Key]-staleKeys dirspec = do-	dir <- fromRepo dirspec-	ifM (liftIO $ doesDirectoryExist dir)-		( do-			contents <- liftIO $ getDirectoryContents dir-			files <- liftIO $ filterM doesFileExist $-				map (dir </>) contents-			return $ mapMaybe (fileKey . takeFileName) files-		, return []-		)  data UnusedMaps = UnusedMaps 	{ unusedMap :: UnusedMap
Command/Vicfg.hs view
@@ -21,7 +21,9 @@ import Logs.Trust import Logs.Group import Logs.PreferredContent+import Logs.Schedule import Types.StandardGroups+import Types.ScheduledActivity import Remote  def :: [Command]@@ -59,6 +61,7 @@ 	{ cfgTrustMap :: TrustMap 	, cfgGroupMap :: M.Map UUID (S.Set Group) 	, cfgPreferredContentMap :: M.Map UUID String+	, cfgScheduleMap :: M.Map UUID [ScheduledActivity] 	}  getCfg :: Annex Cfg@@ -66,22 +69,25 @@ 	<$> trustMapRaw -- without local trust overrides 	<*> (groupsByUUID <$> groupMap) 	<*> preferredContentMapRaw+	<*> scheduleMap  setCfg :: Cfg -> Cfg -> Annex () setCfg curcfg newcfg = do-	let (trustchanges, groupchanges, preferredcontentchanges) = diffCfg curcfg newcfg+	let (trustchanges, groupchanges, preferredcontentchanges, schedulechanges) = diffCfg curcfg newcfg 	mapM_ (uncurry trustSet) $ M.toList trustchanges 	mapM_ (uncurry groupSet) $ M.toList groupchanges 	mapM_ (uncurry preferredContentSet) $ M.toList preferredcontentchanges+	mapM_ (uncurry scheduleSet) $ M.toList schedulechanges -diffCfg :: Cfg -> Cfg -> (TrustMap, M.Map UUID (S.Set Group), M.Map UUID String)-diffCfg curcfg newcfg = (diff cfgTrustMap, diff cfgGroupMap, diff cfgPreferredContentMap)+diffCfg :: Cfg -> Cfg -> (TrustMap, M.Map UUID (S.Set Group), M.Map UUID String, M.Map UUID [ScheduledActivity])+diffCfg curcfg newcfg = (diff cfgTrustMap, diff cfgGroupMap, diff cfgPreferredContentMap, diff cfgScheduleMap)   where 	diff f = M.differenceWith (\x y -> if x == y then Nothing else Just x) 		(f newcfg) (f curcfg)  genCfg :: Cfg -> M.Map UUID String -> String-genCfg cfg descs = unlines $ concat [intro, trust, groups, preferredcontent]+genCfg cfg descs = unlines $ concat+	[intro, trust, groups, preferredcontent, schedule]   where 	intro = 		[ com "git-annex configuration"@@ -120,6 +126,14 @@ 		(\(s, u) -> line "content" u s) 		(\u -> line "content" u "") +	schedule = settings cfgScheduleMap+		[ ""+		, com "Scheduled activities"+		, com "(Separate multiple activities with \"; \")"+		]+		(\(l, u) -> line "schedule" u $ fromScheduledActivities l)+		(\u -> line "schedule" u "")+ 	settings field desc showvals showdefaults = concat 		[ desc 		, concatMap showvals $ sort $ map swap $ M.toList $ field cfg@@ -173,6 +187,11 @@ 				Nothing -> 					let m = M.insert u value (cfgPreferredContentMap cfg) 					in Right $ cfg { cfgPreferredContentMap = m }+		| setting == "schedule" = case parseScheduledActivities value of+			Left e -> Left e+			Right l -> +				let m = M.insert u l (cfgScheduleMap cfg)+				in Right $ cfg { cfgScheduleMap = m } 		| otherwise = badval "setting" setting  	showerr (Just msg, l) = [parseerr ++ msg, l]
Creds.hs view
@@ -15,9 +15,7 @@ import Crypto import Types.Remote (RemoteConfig, RemoteConfigKey) import Remote.Helper.Encryptable (remoteCipher, embedCreds)-#ifndef mingw32_HOST_OS import Utility.Env (setEnv, getEnv)-#endif  import qualified Data.ByteString.Lazy.Char8 as L import qualified Data.Map as M
Git/Branch.hs view
@@ -96,7 +96,7 @@ 		pipeReadStrict [Param "write-tree"] repo 	sha <- getSha "commit-tree" $ pipeWriteRead 		(map Param $ ["commit-tree", show tree] ++ ps)-		message repo+		(Just $ flip hPutStr message) repo 	run [Param "update-ref", Param $ show branch, Param $ show sha] repo 	return sha   where
Git/CatFile.hs view
@@ -8,6 +8,7 @@ module Git.CatFile ( 	CatFileHandle, 	catFileStart,+	catFileStart', 	catFileStop, 	catFile, 	catTree,@@ -18,8 +19,7 @@ import System.IO import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L-import Data.Char-import System.Process (std_out, std_err)+import Data.Tuple.Utils import Numeric import System.Posix.Types @@ -30,13 +30,15 @@ import Git.Types import Git.FilePath import qualified Utility.CoProcess as CoProcess-import Utility.Hash  data CatFileHandle = CatFileHandle CoProcess.CoProcessHandle Repo  catFileStart :: Repo -> IO CatFileHandle-catFileStart repo = do-	coprocess <- CoProcess.rawMode =<< gitCoProcessStart True+catFileStart = catFileStart' True++catFileStart' :: Bool -> Repo -> IO CatFileHandle+catFileStart' restartable repo = do+	coprocess <- CoProcess.rawMode =<< gitCoProcessStart restartable 		[ Param "cat-file" 		, Param "--batch" 		] repo@@ -53,11 +55,10 @@ {- Uses a running git cat-file read the content of an object.  - Objects that do not exist will have "" returned. -} catObject :: CatFileHandle -> Ref -> IO L.ByteString-catObject h object = maybe L.empty fst <$> catObjectDetails h object+catObject h object = maybe L.empty fst3 <$> catObjectDetails h object -{- Gets both the content of an object, and its Sha. -}-catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha))-catObjectDetails (CatFileHandle hdl repo) object = CoProcess.query hdl send receive+catObjectDetails :: CatFileHandle -> Ref -> IO (Maybe (L.ByteString, Sha, ObjectType))+catObjectDetails (CatFileHandle hdl _) object = CoProcess.query hdl send receive   where 	query = show object 	send to = hPutStrLn to query@@ -65,56 +66,30 @@ 		header <- hGetLine from 		case words header of 			[sha, objtype, size]-				| length sha == shaSize &&-				  isJust (readObjectType objtype) -> -					case reads size of-						[(bytes, "")] -> readcontent bytes from sha+				| length sha == shaSize ->+					case (readObjectType objtype, reads size) of+						(Just t, [(bytes, "")]) -> readcontent t bytes from sha 						_ -> dne 				| otherwise -> dne 			_ 				| header == show object ++ " missing" -> dne-				| otherwise -> -					if any isSpace query-						then fallback-						else error $ "unknown response from git cat-file " ++ show (header, object)-	readcontent bytes from sha = do+				| otherwise -> error $ "unknown response from git cat-file " ++ show (header, object)+	readcontent objtype bytes from sha = do 		content <- S.hGet from bytes 		eatchar '\n' from-		return $ Just (L.fromChunks [content], Ref sha)+		return $ Just (L.fromChunks [content], Ref sha, objtype) 	dne = return Nothing 	eatchar expected from = do 		c <- hGetChar from 		when (c /= expected) $ 			error $ "missing " ++ (show expected) ++ " from git cat-file" -	{- Work around a bug in git 1.8.4 rc0 which broke it for filenames-	 - containing spaces. http://bugs.debian.org/718517   -	 - Slow! Also can use a lot of memory, if the object is large. -}-	fallback = do-		let p = gitCreateProcess -			[ Param "cat-file"-			, Param "-p"-			, Param query-			] repo-		(_, Just h, _, pid) <- withNullHandle $ \h -> -			createProcess p-				{ std_out = CreatePipe-				, std_err = UseHandle h-				}-		fileEncoding h-		content <- L.hGetContents h-		let sha = (\s -> length s `seq` s) (show $ sha1 content)-		ok <- checkSuccessProcess pid-		return $ if ok-			then Just (content, Ref sha)-			else Nothing- {- Gets a list of files and directories in a tree. (Not recursive.) -} catTree :: CatFileHandle -> Ref -> IO [(FilePath, FileMode)] catTree h treeref = go <$> catObjectDetails h treeref   where-  	go Nothing = []-	go (Just (b, _)) = parsetree [] b+	go (Just (b, _, TreeObject)) = parsetree [] b+  	go _ = []  	parsetree c b = case L.break (== 0) b of 		(modefile, rest)
Git/CheckAttr.hs view
@@ -13,6 +13,8 @@ import qualified Git.BuildVersion import qualified Utility.CoProcess as CoProcess +import System.IO.Error+ type CheckAttrHandle = (CoProcess.CoProcessHandle, [Attr], String)  type Attr = String@@ -37,16 +39,41 @@ {- Gets an attribute of a file. -} checkAttr :: CheckAttrHandle -> Attr -> FilePath -> IO String checkAttr (h, attrs, cwd) want file = do-	pairs <- CoProcess.query h send receive+	pairs <- CoProcess.query h send (receive "") 	let vals = map snd $ filter (\(attr, _) -> attr == want) pairs 	case vals of 		[v] -> return v 		_ -> error $ "unable to determine " ++ want ++ " attribute of " ++ file   where 	send to = hPutStr to $ file' ++ "\0"-	receive from = forM attrs $ \attr -> do-		l <- hGetLine from-		return (attr, attrvalue attr l)+	receive c from = do+		s <- hGetSomeString from 1024+		if null s+			then eofError+			else do+				let v = c ++ s+				maybe (receive v from) return (parse v)+	eofError = ioError $ mkIOError userErrorType "git check-attr EOF" Nothing Nothing+	parse s+		-- new null separated output+		| '\0' `elem` s = if "\0" `isSuffixOf` s+			then+				let bits = segment (== '\0') s+				in if length bits == (numattrs * 3) + 1+					then Just $ getattrvalues bits []+					else Nothing -- more attributes to come+			else Nothing -- output incomplete+		-- old one line per value output+		| otherwise = if "\n" `isSuffixOf` s+			then+				let ls = lines s+				in if length ls == numattrs+					then Just $ map (\(attr, val) -> (attr, oldattrvalue attr val))+						(zip attrs ls)+					else Nothing -- more attributes to come+			else Nothing -- line incomplete+	numattrs = length attrs+ 	{- Before git 1.7.7, git check-attr worked best with 	 - absolute filenames; using them worked around some bugs 	 - with relative filenames.@@ -58,7 +85,9 @@ 	file' 		| oldgit = absPathFrom cwd file 		| otherwise = relPathDirToFile cwd $ absPathFrom cwd file-	attrvalue attr l = end bits !! 0+	oldattrvalue attr l = end bits !! 0 	  where 		bits = split sep l 		sep = ": " ++ attr ++ ": "+	getattrvalues (_filename:attr:val:rest) c = getattrvalues rest ((attr,val):c)+	getattrvalues _ c = c
Git/Command.hs view
@@ -1,10 +1,12 @@ {- running git commands  -- - Copyright 2010-2012 Joey Hess <joey@kitenet.net>+ - Copyright 2010-2013 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -} +{-# LANGUAGE CPP #-}+ module Git.Command where  import System.Process (std_out, env)@@ -13,15 +15,26 @@ import Git import Git.Types import qualified Utility.CoProcess as CoProcess+#ifdef mingw32_HOST_OS+import Git.FilePath+#endif  {- Constructs a git command line operating on the specified repo. -} gitCommandLine :: [CommandParam] -> Repo -> [CommandParam] gitCommandLine params Repo { location = l@(Local _ _ ) } = setdir : settree ++ params   where-	setdir = Param $ "--git-dir=" ++ gitdir l+	setdir = Param $ "--git-dir=" ++ gitpath (gitdir l) 	settree = case worktree l of 		Nothing -> []-		Just t -> [Param $ "--work-tree=" ++ t]+		Just t -> [Param $ "--work-tree=" ++ gitpath t]+#ifdef mingw32_HOST_OS+	-- despite running on windows, msysgit wants a unix-formatted path+	gitpath s+		| isAbsolute s = "/" ++ dropDrive (toInternalGitPath s)+		| otherwise = s+#else+	gitpath = id+#endif gitCommandLine _ repo = assertLocal repo $ error "internal"  {- Runs git in the specified repo. -}@@ -72,13 +85,13 @@   where 	p  = gitCreateProcess params repo -{- Runs a git command, feeding it input, and returning its output,+{- Runs a git command, feeding it an input, and returning its output,  - which is expected to be fairly small, since it's all read into memory  - strictly. -}-pipeWriteRead :: [CommandParam] -> String -> Repo -> IO String-pipeWriteRead params s repo = assertLocal repo $+pipeWriteRead :: [CommandParam] -> Maybe (Handle -> IO ()) -> Repo -> IO String+pipeWriteRead params writer repo = assertLocal repo $ 	writeReadProcessEnv "git" (toCommand $ gitCommandLine params repo) -		(gitEnv repo) s (Just adjusthandle)+		(gitEnv repo) writer (Just adjusthandle)   where   	adjusthandle h = do 		fileEncoding h
Git/Construct.hs view
@@ -25,8 +25,6 @@  #ifndef mingw32_HOST_OS import System.Posix.User-#else-import Git.FilePath #endif import qualified Data.Map as M hiding (map, split) import Network.URI
Git/DiffTree.hs view
@@ -20,6 +20,7 @@ import Git import Git.Sha import Git.Command+import Git.FilePath import qualified Git.Filename import qualified Git.Ref @@ -29,7 +30,7 @@ 	, srcsha :: Sha -- nullSha if file was added 	, dstsha :: Sha -- nullSha if file was deleted 	, status :: String-	, file :: FilePath+	, file :: TopFilePath 	} deriving Show  {- Diffs two tree Refs. -}@@ -86,7 +87,7 @@ 		, srcsha = fromMaybe (error "bad srcsha") $ extractSha ssha 		, dstsha = fromMaybe (error "bad dstsha") $ extractSha dsha 		, status = s-		, file = Git.Filename.decode f+		, file = asTopFilePath $ Git.Filename.decode f 		} 	  where 		readmode = fst . Prelude.head . readOct
Git/FilePath.hs view
@@ -14,6 +14,7 @@  module Git.FilePath ( 	TopFilePath,+	fromTopFilePath, 	getTopFilePath, 	toTopFilePath, 	asTopFilePath,@@ -27,6 +28,11 @@  {- A FilePath, relative to the top of the git repository. -} newtype TopFilePath = TopFilePath { getTopFilePath :: FilePath }+	deriving (Show)++{- Returns an absolute FilePath. -}+fromTopFilePath :: TopFilePath -> Git.Repo -> FilePath+fromTopFilePath p repo = absPathFrom (repoPath repo) (getTopFilePath p)  {- The input FilePath can be absolute, or relative to the CWD. -} toTopFilePath :: FilePath -> Git.Repo -> IO TopFilePath
+ Git/Fsck.hs view
@@ -0,0 +1,87 @@+{- git fsck interface+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.Fsck (+	FsckResults,+	MissingObjects,+	findBroken,+	foundBroken,+	findMissing,+) where++import Common+import Git+import Git.Command+import Git.Sha+import Git.CatFile+import Utility.Batch++import qualified Data.Set as S++type MissingObjects = S.Set Sha++{- If fsck succeeded, Just a set of missing objects it found.+ - If it failed, Nothing. -}+type FsckResults = Maybe MissingObjects++{- Runs fsck to find some of the broken objects in the repository.+ - May not find all broken objects, if fsck fails on bad data in some of+ - the broken objects it does find.+ -+ - Strategy: Rather than parsing fsck's current specific output,+ - look for anything in its output (both stdout and stderr) that appears+ - to be a git sha. Not all such shas are of broken objects, so ask git+ - to try to cat the object, and see if it fails.+ -}+findBroken :: Bool -> Repo -> IO FsckResults+findBroken batchmode r = do+	(output, fsckok) <- processTranscript command' (toCommand params') Nothing+	let objs = parseFsckOutput output+	badobjs <- findMissing objs r+	if S.null badobjs && not fsckok+		then return Nothing+		else return $ Just badobjs+  where+	(command, params) = ("git", fsckParams r)+	(command', params')+		| batchmode = toBatchCommand (command, params)+		| otherwise = (command, params)++foundBroken :: FsckResults -> Bool+foundBroken Nothing = True+foundBroken (Just s) = not (S.null s)++{- Finds objects that are missing from the git repsitory, or are corrupt.+ -+ - Note that catting a corrupt object will cause cat-file to crash;+ - this is detected and it's restarted.+ -}+findMissing :: [Sha] -> Repo -> IO MissingObjects+findMissing objs r = go objs [] =<< start+  where+	start = catFileStart' False r+	go [] c h = do+		catFileStop h+		return $ S.fromList c+	go (o:os) c h = do+		v <- tryIO $ isNothing <$> catObjectDetails h o+		case v of+			Left _ -> do+				void $ tryIO $ catFileStop h+				go os (o:c) =<< start+			Right True -> go os (o:c) h+			Right False -> go os c h++parseFsckOutput :: String -> [Sha]+parseFsckOutput = catMaybes . map extractSha . concat . map words . lines++fsckParams :: Repo -> [CommandParam]+fsckParams = gitCommandLine+	[ Param "fsck"+	, Param "--no-dangling"+	, Param "--no-reflogs"+	]
Git/HashObject.hs view
@@ -36,8 +36,11 @@  {- Injects some content into git, returning its Sha. -} hashObject :: ObjectType -> String -> Repo -> IO Sha-hashObject objtype content repo = getSha subcmd $-	pipeWriteRead (map Param params) content repo+hashObject objtype content = hashObject' objtype (flip hPutStr content)++hashObject' :: ObjectType -> (Handle -> IO ()) -> Repo -> IO Sha+hashObject' objtype writer repo = getSha subcmd $+	pipeWriteRead (map Param params) (Just writer) repo   where 	subcmd = "hash-object" 	params = [subcmd, "-t", show objtype, "-w", "--stdin", "--no-filters"]
Git/LsFiles.hs view
@@ -20,6 +20,7 @@ 	Conflicting(..), 	Unmerged(..), 	unmerged,+	StagedDetails, ) where  import Common@@ -79,18 +80,20 @@ 	prefix = [Params "diff --cached --name-only -z"] 	suffix = Param "--" : map File l +type StagedDetails = (FilePath, Maybe Sha, Maybe FileMode)+ {- Returns details about files that are staged in the index,  - as well as files not yet in git. Skips ignored files. -}-stagedOthersDetails :: [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha, Maybe FileMode)], IO Bool)+stagedOthersDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) stagedOthersDetails = stagedDetails' [Params "--others --exclude-standard"]  {- Returns details about all files that are staged in the index. -}-stagedDetails :: [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha, Maybe FileMode)], IO Bool)+stagedDetails :: [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) stagedDetails = stagedDetails' []  {- Gets details about staged files, including the Sha of their staged  - contents. -}-stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([(FilePath, Maybe Sha, Maybe FileMode)], IO Bool)+stagedDetails' :: [CommandParam] -> [FilePath] -> Repo -> IO ([StagedDetails], IO Bool) stagedDetails' ps l repo = do 	(ls, cleanup) <- pipeNullSplit params repo 	return (map parse ls, cleanup)
Git/LsTree.hs view
@@ -8,6 +8,7 @@ module Git.LsTree ( 	TreeItem(..), 	lsTree,+	lsTreeParams, 	lsTreeFiles, 	parseLsTree ) where@@ -20,26 +21,30 @@ import Git import Git.Command import Git.Sha+import Git.FilePath import qualified Git.Filename  data TreeItem = TreeItem 	{ mode :: FileMode 	, typeobj :: String 	, sha :: String-	, file :: FilePath+	, file :: TopFilePath 	} deriving Show -{- Lists the complete contents of a tree, with lazy output. -}+{- Lists the complete contents of a tree, recursing into sub-trees,+ - with lazy output. -} lsTree :: Ref -> Repo -> IO [TreeItem]-lsTree t repo = map parseLsTree <$> pipeNullSplitZombie ps repo-  where-  	ps = [Params "ls-tree --full-tree -z -r --", File $ show t]+lsTree t repo = map parseLsTree+	<$> pipeNullSplitZombie (lsTreeParams t) repo +lsTreeParams :: Ref -> [CommandParam]+lsTreeParams t = [ Params "ls-tree --full-tree -z -r --", File $ show t ]+ {- Lists specified files in a tree. -} lsTreeFiles :: Ref -> [FilePath] -> Repo -> IO [TreeItem] lsTreeFiles t fs repo = map parseLsTree <$> pipeNullSplitStrict ps repo   where-  	ps = [Params "ls-tree -z --", File $ show t] ++ map File fs+  	ps = [Params "ls-tree --full-tree -z --", File $ show t] ++ map File fs  {- Parses a line of ls-tree output.  - (The --long format is not currently supported.) -}@@ -48,7 +53,7 @@ 	{ mode = fst $ Prelude.head $ readOct m 	, typeobj = t 	, sha = s-	, file = Git.Filename.decode f+	, file = asTopFilePath $ Git.Filename.decode f 	}   where 	-- l = <mode> SP <type> SP <sha> TAB <file>
+ Git/Objects.hs view
@@ -0,0 +1,29 @@+{- .git/objects+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.Objects where++import Common+import Git++objectsDir :: Repo -> FilePath+objectsDir r = localGitDir r </> "objects"++packDir :: Repo -> FilePath+packDir r = objectsDir r </> "pack"++listPackFiles :: Repo -> IO [FilePath]+listPackFiles r = filter (".pack" `isSuffixOf`) +	<$> catchDefaultIO [] (dirContents $ packDir r)++packIdxFile :: FilePath -> FilePath+packIdxFile = flip replaceExtension "idx"++looseObjectFile :: Repo -> Sha -> FilePath+looseObjectFile r sha = objectsDir r </> prefix </> rest+  where+	(prefix, rest) = splitAt 2 (show sha)
Git/Queue.hs view
@@ -5,7 +5,7 @@  - Licensed under the GNU GPL version 3 or higher.  -} -{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP, BangPatterns #-}  module Git.Queue ( 	Queue,@@ -26,7 +26,7 @@ import Git import Git.Command import qualified Git.UpdateIndex-	+ {- Queable actions that can be performed in a git repository.  -} data Action@@ -147,13 +147,21 @@ runAction repo (UpdateIndexAction streamers) = 	-- list is stored in reverse order 	Git.UpdateIndex.streamUpdateIndex repo $ reverse streamers-runAction repo action@(CommandAction {}) =+runAction repo action@(CommandAction {}) = +#ifndef mingw32_HOST_OS 	withHandle StdinHandle createProcessSuccess p $ \h -> do 		fileEncoding h 		hPutStr h $ intercalate "\0" $ toCommand $ getFiles action 		hClose h+#else+	-- Using xargs on Windows is problimatic, so just run the command+	-- once per file (not as efficient.)+	if null (getFiles action)+		then void $ boolSystem "git" gitparams+		else forM_ (getFiles action) $ \f ->+			void $ boolSystem "git" (gitparams ++ [f])+#endif   where-	p = (proc "xargs" params) { env = gitEnv repo }-	params = "-0":"git":baseparams-	baseparams = toCommand $ gitCommandLine+	p = (proc "xargs" $ "-0":"git":toCommand gitparams) { env = gitEnv repo }+	gitparams = gitCommandLine 		(Param (getSubcommand action):getParams action) repo
+ Git/RefLog.hs view
@@ -0,0 +1,22 @@+{- git reflog interface+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.RefLog where++import Common+import Git+import Git.Command+import Git.Sha++{- Gets the reflog for a given branch. -}+get :: Branch -> Repo -> IO [Sha]+get b = mapMaybe extractSha . lines <$$> pipeReadStrict+	[ Param "log"+	, Param "-g"+	, Param "--format=%H"+	, Param (show b)+	]
Git/Remote.hs view
@@ -17,6 +17,9 @@ import Data.Char import qualified Data.Map as M import Network.URI+#ifdef mingw32_HOST_OS+import Git.FilePath+#endif  type RemoteName = String 
+ Git/Repair.hs view
@@ -0,0 +1,495 @@+{- git repository recovery+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Git.Repair (+	runRepair,+	runRepairOf,+	cleanCorruptObjects,+	retrieveMissingObjects,+	resetLocalBranches,+	removeTrackingBranches,+	rewriteIndex,+	checkIndex,+	emptyGoodCommits,+) where++import Common+import Git+import Git.Command+import Git.Objects+import Git.Sha+import Git.Types+import Git.Fsck+import qualified Git.Config as Config+import qualified Git.Construct as Construct+import qualified Git.LsTree as LsTree+import qualified Git.LsFiles as LsFiles+import qualified Git.Ref as Ref+import qualified Git.RefLog as RefLog+import qualified Git.UpdateIndex as UpdateIndex+import qualified Git.Branch as Branch+import Utility.Tmp+import Utility.Rsync++import qualified Data.Set as S+import qualified Data.ByteString.Lazy as L+import Data.Tuple.Utils++{- Given a set of bad objects found by git fsck, removes all+ - corrupt objects, and returns a list of missing objects,+ - which need to be found elsewhere to finish recovery.+ -+ - Since git fsck may crash on corrupt objects, and so not+ - report the full set of corrupt or missing objects,+ - this removes corrupt objects, and re-runs fsck, until it+ - stabalizes.+ -+ - To remove corrupt objects, unpack all packs, and remove the packs+ - (to handle corrupt packs), and remove loose object files.+ -}+cleanCorruptObjects :: FsckResults -> Repo -> IO MissingObjects+cleanCorruptObjects mmissing r = check mmissing+  where+	check Nothing = do+		putStrLn "git fsck found a problem but no specific broken objects. Perhaps a corrupt pack file?"+		ifM (explodePacks r)+			( retry S.empty+			, return S.empty+			)+	check (Just bad)+		| S.null bad = return S.empty+		| otherwise = do+			putStrLn $ unwords +				[ "git fsck found"+				, show (S.size bad)+				, "broken objects."+				]+			exploded <- explodePacks r+			removed <- removeLoose r bad+			if exploded || removed+				then retry bad+				else return bad+	retry oldbad = do+		putStrLn "Re-running git fsck to see if it finds more problems."+		v <- findBroken False r+		case v of+			Nothing -> error $ unwords+				[ "git fsck found a problem, which was not corrected after removing"+				, show (S.size oldbad)+				, "corrupt objects."+				]+			Just newbad -> do+				removed <- removeLoose r newbad+				let s = S.union oldbad newbad+				if not removed || s == oldbad+					then return s+					else retry s++removeLoose :: Repo -> MissingObjects -> IO Bool+removeLoose r s = do+	let fs = map (looseObjectFile r) (S.toList s)+	count <- length <$> filterM doesFileExist fs+	if (count > 0)+		then do+			putStrLn $ unwords+				[ "removing"+				, show count+				, "corrupt loose objects"+				]+			mapM_ nukeFile fs+			return True+		else return False++explodePacks :: Repo -> IO Bool+explodePacks r = do+	packs <- listPackFiles r+	if null packs+		then return False+		else do+			putStrLn "Unpacking all pack files."+			mapM_ go packs+			return True+  where+	go packfile = do+		-- May fail, if pack file is corrupt.+		void $ tryIO $+			pipeWrite [Param "unpack-objects"] r $ \h ->+				L.hPut h =<< L.readFile packfile+		nukeFile packfile+		nukeFile $ packIdxFile packfile++{- Try to retrieve a set of missing objects, from the remotes of a+ - repository. Returns any that could not be retreived.+ -}+retrieveMissingObjects :: MissingObjects -> Repo -> IO MissingObjects+retrieveMissingObjects missing r+	| S.null missing = return missing+	| otherwise = withTmpDir "tmprepo" $ \tmpdir -> do+		unlessM (boolSystem "git" [Params "init", File tmpdir]) $+			error $ "failed to create temp repository in " ++ tmpdir+		tmpr <- Config.read =<< Construct.fromAbsPath tmpdir+		stillmissing <- pullremotes tmpr (remotes r) fetchrefstags missing+		if S.null stillmissing+			then return stillmissing+			else pullremotes tmpr (remotes r) fetchallrefs stillmissing+  where+	pullremotes _tmpr [] _ stillmissing = return stillmissing+	pullremotes tmpr (rmt:rmts) fetchrefs s+		| S.null s = return s+		| otherwise = do+			putStrLn $ "Trying to recover missing objects from remote " ++ repoDescribe rmt+			ifM (fetchsome rmt fetchrefs tmpr)+				( do+					void $ copyObjects tmpr r+					stillmissing <- findMissing (S.toList s) r+					pullremotes tmpr rmts fetchrefs stillmissing+				, do+					putStrLn $ unwords+						[ "failed to fetch from remote"+						, repoDescribe rmt+						, "(will continue without it, but making this remote available may improve recovery)"+						]+					pullremotes tmpr rmts fetchrefs s+				)+	fetchsome rmt ps = runBool $+		[ Param "fetch"+		, Param (repoLocation rmt)+		, Params "--force --update-head-ok --quiet"+		] ++ ps+	-- fetch refs and tags+	fetchrefstags = [ Param "+refs/heads/*:refs/heads/*", Param "--tags"]+	-- Fetch all available refs (more likely to fail,+	-- as the remote may have refs it refuses to send).+	fetchallrefs = [ Param "+*:*" ]++{- Copies all objects from the src repository to the dest repository.+ - This is done using rsync, so it copies all missing object, and all+ - objects they rely on. -}+copyObjects :: Repo -> Repo -> IO Bool+copyObjects srcr destr = rsync+	[ Param "-qr"+	, File $ addTrailingPathSeparator $ objectsDir srcr+	, File $ addTrailingPathSeparator $ objectsDir destr+	]++{- To deal with missing objects that cannot be recovered, resets any+ - local branches to point to an old commit before the missing+ - objects. Returns all branches that were changed, and deleted.+ -}+resetLocalBranches :: MissingObjects -> GoodCommits -> Repo -> IO ([Branch], [Branch], GoodCommits)+resetLocalBranches missing goodcommits r =+	go [] [] goodcommits =<< filter islocalbranch <$> getAllRefs r+  where+	islocalbranch b = "refs/heads/" `isPrefixOf` show b+	go changed deleted gcs [] = return (changed, deleted, gcs)+	go changed deleted gcs (b:bs) = do+		(mc, gcs') <- findUncorruptedCommit missing gcs b r+		case mc of+			Just c+				| c == b -> go changed deleted gcs' bs+				| otherwise -> do+					reset b c+					go (b:changed) deleted gcs' bs+			Nothing -> do+				nukeBranchRef b r+				go changed (b:deleted) gcs' bs+	reset b c = do+		nukeBranchRef b	r+		void $ runBool+			[ Param "branch"+			, Param (show $ Ref.base b)+			, Param (show c)+			] r++{- To deal with missing objects that cannot be recovered, removes+ - any remote tracking branches that reference them. Returns a list of+ - all removed branches.+ -}+removeTrackingBranches :: MissingObjects -> GoodCommits -> Repo -> IO ([Branch], GoodCommits)+removeTrackingBranches missing goodcommits r =+	go [] goodcommits =<< filter istrackingbranch <$> getAllRefs r+  where+  	istrackingbranch b = "refs/remotes/" `isPrefixOf` show b+	go removed gcs [] = return (removed, gcs)+	go removed gcs (b:bs) = do+		(ok, gcs') <- verifyCommit missing gcs b r+		if ok+			then go removed gcs' bs+			else do+				nukeBranchRef b r+				go (b:removed) gcs' bs++{- Gets all refs, including ones that are corrupt.+ - git show-ref does not output refs to commits that are directly+ - corrupted, so it is not used.+ -}+getAllRefs :: Repo -> IO [Ref]+getAllRefs r = do+	packedrs <- mapMaybe parsePacked . lines+		<$> catchDefaultIO "" (readFile $ packedRefsFile r)+	loosers <- map toref <$> dirContentsRecursive refdir+	return $ packedrs ++ loosers+  where+  	refdir = localGitDir r </> "refs"+	toref = Ref . relPathDirToFile (localGitDir r)++packedRefsFile :: Repo -> FilePath+packedRefsFile r = localGitDir r </> "packed-refs"++parsePacked :: String -> Maybe Ref+parsePacked l = case words l of+	(sha:ref:[])+		| isJust (extractSha sha) -> Just $ Ref ref+	_ -> Nothing++{- git-branch -d cannot be used to remove a branch that is directly+ - pointing to a corrupt commit. However, it's tried first. -}+nukeBranchRef :: Branch -> Repo -> IO ()+nukeBranchRef b r = void $ usegit <||> byhand+  where+	usegit = runBool+		[ Param "branch"+		, Params "-r -d"+		, Param $ show $ Ref.base b+		] r+	byhand = do+		nukeFile $ localGitDir r </> show b+		whenM (doesFileExist packedrefs) $+			withTmpFile "packed-refs" $ \tmp h -> do+				ls <- lines <$> readFile packedrefs+				hPutStr h $ unlines $+					filter (not . skiprefline) ls+				hClose h+				renameFile tmp packedrefs+		return True+	skiprefline l = case parsePacked l of+		Just packedref+			| packedref == b -> True+		_ -> False+	packedrefs = packedRefsFile r++{- Finds the most recent commit to a branch that does not need any+ - of the missing objects. If the input branch is good as-is, returns it.+ - Otherwise, tries to traverse the commits in the branch to find one+ - that is ok. That might fail, if one of them is corrupt, or if an object+ - at the root of the branch is missing. Finally, looks for an old version+ - of the branch from the reflog.+ -}+findUncorruptedCommit :: MissingObjects -> GoodCommits -> Branch -> Repo -> IO (Maybe Sha, GoodCommits)+findUncorruptedCommit missing goodcommits branch r = do+	(ok, goodcommits') <- verifyCommit missing goodcommits branch r+	if ok+		then return (Just branch, goodcommits')+		else do+			(ls, cleanup) <- pipeNullSplit+				[ Param "log"+				, Param "-z"+				, Param "--format=%H"+				, Param (show branch)+				] r+			let branchshas = catMaybes $ map extractSha ls+			reflogshas <- RefLog.get branch r+			-- XXX Could try a bit harder here, and look+			-- for uncorrupted old commits in branches in the+			-- reflog.+			cleanup `after` findfirst goodcommits (branchshas ++ reflogshas)+  where+	findfirst gcs [] = return (Nothing, gcs)+	findfirst gcs (c:cs) = do+		(ok, gcs') <- verifyCommit missing gcs c r+		if ok+			then return (Just c, gcs')+			else findfirst gcs' cs++{- Verifies tha none of the missing objects in the set are used by+ - the commit. Also adds to a set of commit shas that have been verified to+ - be good, which can be passed into subsequent calls to avoid+ - redundant work when eg, chasing down branches to find the first+ - uncorrupted commit. -}+verifyCommit :: MissingObjects -> GoodCommits -> Sha -> Repo -> IO (Bool, GoodCommits)+verifyCommit missing goodcommits commit r+	| checkGoodCommit commit goodcommits = return (True, goodcommits)+	| otherwise = do+		(ls, cleanup) <- pipeNullSplit+			[ Param "log"+			, Param "-z"+			, Param "--format=%H %T"+			, Param (show commit)+			] r+		let committrees = map parse ls+		if any isNothing committrees || null committrees+			then do+				void cleanup+				return (False, goodcommits)+			else do+				let cts = catMaybes committrees+				ifM (cleanup <&&> check cts)+					( return (True, addGoodCommits (map fst cts) goodcommits)+					, return (False, goodcommits)+					)+  where+	parse l = case words l of+		(commitsha:treesha:[]) -> (,)+			<$> extractSha commitsha+			<*> extractSha treesha+		_ -> Nothing+	check [] = return True+	check ((c, t):rest)+		| checkGoodCommit c goodcommits = return True+		| otherwise = verifyTree missing t r <&&> check rest++{- Verifies that a tree is good, including all trees and blobs+ - referenced by it. -}+verifyTree :: MissingObjects -> Sha -> Repo -> IO Bool+verifyTree missing treesha r+	| S.member treesha missing = return False+	| otherwise = do+		(ls, cleanup) <- pipeNullSplit (LsTree.lsTreeParams treesha) r+		let objshas = map (extractSha . LsTree.sha . LsTree.parseLsTree) ls+		if any isNothing objshas || any (`S.member` missing) (catMaybes objshas)+			then do+				void cleanup+				return False+			-- as long as ls-tree succeeded, we're good+			else cleanup++{- Checks that the index file only refers to objects that are not missing. -}+checkIndex :: MissingObjects -> Repo -> IO Bool+checkIndex missing r = do+	(bad, _good, cleanup) <- partitionIndex missing r+	if null bad+		then cleanup+		else do+			void cleanup+			return False++partitionIndex :: MissingObjects -> Repo -> IO ([LsFiles.StagedDetails], [LsFiles.StagedDetails], IO Bool)+partitionIndex missing r = do+	(indexcontents, cleanup) <- LsFiles.stagedDetails [repoPath r] r+	let (bad, good) = partition ismissing indexcontents+	return (bad, good, cleanup)+  where+	getblob (_file, Just sha, Just _mode) = Just sha+	getblob _ = Nothing+	ismissing = maybe False (`S.member` missing) . getblob++{- Rewrites the index file, removing from it any files whose blobs are+ - missing. Returns the list of affected files. -}+rewriteIndex :: MissingObjects -> Repo -> IO [FilePath]+rewriteIndex missing r+	| repoIsLocalBare r = return []+	| otherwise = do+		(bad, good, cleanup) <- partitionIndex missing r+		unless (null bad) $ do+			nukeFile (localGitDir r </> "index")+			UpdateIndex.streamUpdateIndex r+				=<< (catMaybes <$> mapM reinject good)+		void cleanup+		return $ map fst3 bad+  where+	reinject (file, Just sha, Just mode) = case toBlobType mode of+		Nothing -> return Nothing+		Just blobtype -> Just <$>+			UpdateIndex.stageFile sha blobtype file r+	reinject _ = return Nothing++newtype GoodCommits = GoodCommits (S.Set Sha)++emptyGoodCommits :: GoodCommits+emptyGoodCommits = GoodCommits S.empty++checkGoodCommit :: Sha -> GoodCommits -> Bool+checkGoodCommit sha (GoodCommits s) = S.member sha s++addGoodCommits :: [Sha] -> GoodCommits -> GoodCommits+addGoodCommits shas (GoodCommits s) = GoodCommits $+	S.union s (S.fromList shas)++displayList :: [String] -> String -> IO ()+displayList items header+	| null items = return ()+	| otherwise = do+		putStrLn header+		putStr $ unlines $ map (\i -> "\t" ++ i) truncateditems+  where+  	numitems = length items+	truncateditems+		| numitems > 10 = take 10 items ++ ["(and " ++ show (numitems - 10) ++ " more)"]+		| otherwise = items++{- Put it all together. -}+runRepair :: Bool -> Repo -> IO (Bool, MissingObjects, [Branch])+runRepair forced g = do+	putStrLn "Running git fsck ..."+	fsckresult <- findBroken False g+	if foundBroken fsckresult+		then runRepairOf fsckresult forced g+		else do+			putStrLn "No problems found."+			return (True, S.empty, [])+runRepairOf :: FsckResults -> Bool -> Repo -> IO (Bool, MissingObjects, [Branch])+runRepairOf fsckresult forced g = do+	missing <- cleanCorruptObjects fsckresult g+	stillmissing <- retrieveMissingObjects missing g+	if S.null stillmissing+		then successfulfinish stillmissing []+		else do+			putStrLn $ unwords+				[ show (S.size stillmissing)+				, "missing objects could not be recovered!"+				]+			if forced+				then continuerepairs stillmissing+				else unsuccessfulfinish stillmissing+  where+	continuerepairs stillmissing = do+		(remotebranches, goodcommits) <- removeTrackingBranches stillmissing emptyGoodCommits g+		unless (null remotebranches) $+			putStrLn $ unwords+				[ "removed"+				, show (length remotebranches)+				, "remote tracking branches that referred to missing objects"+				]+		(resetbranches, deletedbranches, _) <- resetLocalBranches stillmissing goodcommits g+		displayList (map show resetbranches)+			"Reset these local branches to old versions before the missing objects were committed:"+		displayList (map show deletedbranches)+			"Deleted these local branches, which could not be recovered due to missing objects:"+		deindexedfiles <- rewriteIndex stillmissing g+		displayList deindexedfiles+			"Removed these missing files from the index. You should look at what files are present in your working tree and git add them back to the index when appropriate."+		let modifiedbranches = resetbranches ++ deletedbranches+		if null resetbranches && null deletedbranches+			then successfulfinish stillmissing modifiedbranches+			else do+				unless (repoIsLocalBare g) $ do+					mcurr <- Branch.currentUnsafe g+					case mcurr of+						Nothing -> return ()+						Just curr -> when (any (== curr) modifiedbranches) $ do+							putStrLn $ unwords+								[ "You currently have"+								, show curr+								, "checked out. You may have staged changes in the index that can be committed to recover the lost state of this branch!"+								]+				putStrLn "Successfully recovered repository!"+				putStrLn "Please carefully check that the changes mentioned above are ok.."+				return (True, stillmissing, modifiedbranches)+	successfulfinish stillmissing modifiedbranches = do+		mapM_ putStrLn+			[ "Successfully recovered repository!"+			, "You should run \"git fsck\" to make sure, but it looks like"+			, "everything was recovered ok."+			]+		return (True, stillmissing, modifiedbranches)+	unsuccessfulfinish stillmissing = do+		if repoIsLocalBare g+			then do+				putStrLn "If you have a clone of this bare repository, you should add it as a remote of this repository, and re-run git-recover-repository."+				putStrLn "If there are no clones of this repository, you can instead run git-recover-repository with the --force parameter to force recovery to a possibly usable state."+			else putStrLn "To force a recovery to a usable state, run this command again with the --force parameter."+		return (False, stillmissing, [])
Git/Types.hs view
@@ -9,6 +9,7 @@  import Network.URI import qualified Data.Map as M+import System.Posix.Types  {- Support repositories on local disk, and repositories accessed via an URL.  -@@ -81,3 +82,9 @@ readBlobType "100755" = Just ExecutableBlob readBlobType "120000" = Just SymlinkBlob readBlobType _ = Nothing++toBlobType :: FileMode -> Maybe BlobType+toBlobType 0o100644 = Just FileBlob+toBlobType 0o100755 = Just ExecutableBlob+toBlobType 0o120000 = Just SymlinkBlob+toBlobType _ = Nothing
Git/UpdateIndex.hs view
@@ -13,6 +13,7 @@ 	streamUpdateIndex, 	lsTree, 	updateIndexLine,+	stageFile, 	unstageFile, 	stageSymlink ) where@@ -60,6 +61,11 @@ updateIndexLine :: Sha -> BlobType -> TopFilePath -> String updateIndexLine sha filetype file = 	show filetype ++ " blob " ++ show sha ++ "\t" ++ indexPath file++stageFile :: Sha -> BlobType -> FilePath -> Repo -> IO Streamer+stageFile sha filetype file repo = do+	p <- toTopFilePath file repo+	return $ pureStreamer $ updateIndexLine sha filetype p  {- A streamer that removes a file from the index. -} unstageFile :: FilePath -> Repo -> IO Streamer
GitAnnex.hs view
@@ -34,6 +34,7 @@ import qualified Command.InitRemote import qualified Command.EnableRemote import qualified Command.Fsck+import qualified Command.Repair import qualified Command.Unused import qualified Command.DropUnused import qualified Command.AddUnused@@ -54,6 +55,7 @@ import qualified Command.Dead import qualified Command.Group import qualified Command.Content+import qualified Command.Schedule import qualified Command.Ungroup import qualified Command.Vicfg import qualified Command.Sync@@ -117,6 +119,7 @@ 	, Command.Dead.def 	, Command.Group.def 	, Command.Content.def+	, Command.Schedule.def 	, Command.Ungroup.def 	, Command.Vicfg.def 	, Command.FromKey.def@@ -128,6 +131,7 @@ 	, Command.ReKey.def 	, Command.Fix.def 	, Command.Fsck.def+	, Command.Repair.def 	, Command.Unused.def 	, Command.DropUnused.def 	, Command.AddUnused.def
Limit.hs view
@@ -238,7 +238,8 @@  addTimeLimit :: String -> Annex () addTimeLimit s = do-	let seconds = fromMaybe (error "bad time-limit") $ parseDuration s+	let seconds = maybe (error "bad time-limit") durationToPOSIXTime $+		parseDuration s 	start <- liftIO getPOSIXTime 	let cutoff = start + seconds 	addLimit $ Right $ const $ const $ do
Locations.hs view
@@ -1,6 +1,6 @@ {- git-annex file locations  -- - Copyright 2010-2011 Joey Hess <joey@kitenet.net>+ - Copyright 2010-2013 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -}@@ -10,6 +10,7 @@ 	fileKey, 	keyPaths, 	keyPath,+	annexDir, 	objectDir, 	gitAnnexLocation, 	gitAnnexLink,@@ -27,6 +28,8 @@ 	gitAnnexBadLocation, 	gitAnnexUnusedLog, 	gitAnnexFsckState,+	gitAnnexFsckResultsLog,+	gitAnnexScheduleState, 	gitAnnexTransferDir, 	gitAnnexCredsDir, 	gitAnnexFeedStateDir,@@ -35,7 +38,7 @@ 	gitAnnexJournalDir, 	gitAnnexJournalLock, 	gitAnnexIndex,-	gitAnnexIndexLock,+	gitAnnexIndexStatus, 	gitAnnexIgnoredRefs, 	gitAnnexPidFile, 	gitAnnexDaemonStatusFile,@@ -51,6 +54,7 @@ 	annexHashes, 	hashDirMixed, 	hashDirLower,+	preSanitizeKeyName,  	prop_idempotent_fileKey ) where@@ -58,10 +62,12 @@ import Data.Bits import Data.Word import Data.Hash.MD5+import Data.Char  import Common import Types import Types.Key+import Types.UUID import qualified Git  {- Conventions:@@ -189,6 +195,15 @@ gitAnnexFsckState :: Git.Repo -> FilePath gitAnnexFsckState r = gitAnnexDir r </> "fsckstate" +{- .git/annex/fsckresults/uuid is used to store results of git fscks -}+gitAnnexFsckResultsLog :: UUID -> Git.Repo -> FilePath+gitAnnexFsckResultsLog u r = gitAnnexDir r </> "fsckresults" </> fromUUID u++{- .git/annex/schedulestate is used to store information about when+ - scheduled jobs were last run. -}+gitAnnexScheduleState :: Git.Repo -> FilePath+gitAnnexScheduleState r = gitAnnexDir r </> "schedulestate"+ {- .git/annex/creds/ is used to store credentials to access some special  - remotes. -} gitAnnexCredsDir :: Git.Repo -> FilePath@@ -223,9 +238,12 @@ gitAnnexIndex :: Git.Repo -> FilePath gitAnnexIndex r = gitAnnexDir r </> "index" -{- Lock file for .git/annex/index. -}-gitAnnexIndexLock :: Git.Repo -> FilePath-gitAnnexIndexLock r = gitAnnexDir r </> "index.lck"+{- Holds the ref of the git-annex branch that the index was last updated to.+ -+ - The .lck in the name is a historical accident; this is not used as a+ - lock. -}+gitAnnexIndexStatus :: Git.Repo -> FilePath+gitAnnexIndexStatus r = gitAnnexDir r </> "index.lck"  {- List of refs that should not be merged into the git-annex branch. -} gitAnnexIgnoredRefs :: Git.Repo -> FilePath@@ -281,6 +299,32 @@ isLinkToAnnex :: FilePath -> Bool isLinkToAnnex s = (pathSeparator:objectDir) `isInfixOf` s +{- Sanitizes a String that will be used as part of a Key's keyName,+ - dealing with characters that cause problems on substandard filesystems.+ -+ - This is used when a new Key is initially being generated, eg by getKey.+ - Unlike keyFile and fileKey, it does not need to be a reversable+ - escaping. Also, it's ok to change this to add more problimatic+ - characters later. Unlike changing keyFile, which could result in the+ - filenames used for existing keys changing and contents getting lost.+ -+ - It is, however, important that the input and output of this function+ - have a 1:1 mapping, to avoid two different inputs from mapping to the+ - same key.+ -}+preSanitizeKeyName :: String -> String+preSanitizeKeyName = concatMap escape+  where+  	escape c+		| isAsciiUpper c || isAsciiLower c || isDigit c = [c]+		| c `elem` ".-_ " = [c] -- common, assumed safe+		| c `elem` "/%:" = [c] -- handled by keyFile+		-- , is safe and uncommon, so will be used to escape+		-- other characters. By itself, it is escaped to +		-- doubled form.+		| c == ',' = ",,"+		| otherwise = ',' : show(ord(c))+ {- Converts a key into a filename fragment without any directory.  -  - Escape "/" in the key name, to keep a flat tree of files and avoid@@ -290,13 +334,30 @@  -     a slash  - "%" is escaped to "&s", and "&" to "&a"; this ensures that the mapping  -     is one to one.- - ":" is escaped to "&c", because despite it being 2011, people still care- -     about FAT.+ - ":" is escaped to "&c", because it seemed like a good idea at the time.+ -+ - Changing what this function escapes and how is not a good idea, as it+ - can cause existing objects to get lost.  -} keyFile :: Key -> FilePath keyFile key = replace "/" "%" $ replace ":" "&c" $ 	replace "%" "&s" $ replace "&" "&a"  $ key2file key +{- Reverses keyFile, converting a filename fragment (ie, the basename of+ - the symlink target) into a key. -}+fileKey :: FilePath -> Maybe Key+fileKey file = file2key $+	replace "&a" "&" $ replace "&s" "%" $+		replace "&c" ":" $ replace "%" "/" file++{- for quickcheck -}+prop_idempotent_fileKey :: String -> Bool+prop_idempotent_fileKey s+	| null s = True -- it's not legal for a key to have no keyName+	| otherwise= Just k == fileKey (keyFile k)+  where+	k = stubKey { keyName = s, keyBackendName = "test" }+ {- A location to store a key on the filesystem. A directory hash is used,  - to protect against filesystems that dislike having many items in a  - single directory.@@ -312,19 +373,6 @@ {- All possibile locations to store a key using different directory hashes. -} keyPaths :: Key -> [FilePath] keyPaths key = map (keyPath key) annexHashes--{- Reverses keyFile, converting a filename fragment (ie, the basename of- - the symlink target) into a key. -}-fileKey :: FilePath -> Maybe Key-fileKey file = file2key $-	replace "&a" "&" $ replace "&s" "%" $-		replace "&c" ":" $ replace "%" "/" file--{- for quickcheck -}-prop_idempotent_fileKey :: String -> Bool-prop_idempotent_fileKey s = Just k == fileKey (keyFile k)-  where-	k = stubKey { keyName = s, keyBackendName = "test" }  {- Two different directory hashes may be used. The mixed case hash  - came first, and is fine, except for the problem of case-strict
Logs.hs view
@@ -28,6 +28,7 @@ 	, trustLog 	, groupLog  	, preferredContentLog+	, scheduleLog 	]  {- All the ways to get a key from a presence log file -}@@ -51,6 +52,9 @@  preferredContentLog :: FilePath preferredContentLog = "preferred-content.log"++scheduleLog :: FilePath+scheduleLog = "schedule.log"  {- The pathname of the location log file for a given key. -} locationLogFile :: Key -> String
+ Logs/FsckResults.hs view
@@ -0,0 +1,43 @@+{- git-annex fsck results log files+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Logs.FsckResults (+	writeFsckResults,+	readFsckResults+) where++import Common.Annex+import Utility.Tmp+import Git.Fsck+import Git.Types++import qualified Data.Set as S++writeFsckResults :: UUID -> FsckResults -> Annex ()+writeFsckResults u fsckresults = do+	logfile <- fromRepo $ gitAnnexFsckResultsLog u+	liftIO $ +		case fsckresults of+			Nothing -> store S.empty logfile+			Just s+				| S.null s -> nukeFile logfile+				| otherwise -> store s logfile+  where+  	store s logfile = do +		createDirectoryIfMissing True (parentDir logfile)+		liftIO $ viaTmp writeFile logfile $ serialize s+	serialize = unlines . map show . S.toList++readFsckResults :: UUID -> Annex FsckResults+readFsckResults u = do+	logfile <- fromRepo $ gitAnnexFsckResultsLog u+	liftIO $ catchDefaultIO (Just S.empty) $+		deserialize <$> readFile logfile+  where+	deserialize l = +		let s = S.fromList $ map Ref $ lines l+		in if S.null s then Nothing else Just s
+ Logs/Schedule.hs view
@@ -0,0 +1,72 @@+{- git-annex scheduled activities log+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Logs.Schedule (+	scheduleLog,+	scheduleSet,+	scheduleAdd,+	scheduleRemove,+	scheduleChange,+	scheduleGet,+	scheduleMap,+	getLastRunTimes,+	setLastRunTime,+) where++import qualified Data.Map as M+import qualified Data.Set as S+import Data.Time.Clock.POSIX+import Data.Time.LocalTime++import Common.Annex+import Types.ScheduledActivity+import qualified Annex.Branch+import Logs+import Logs.UUIDBased+import Utility.Tmp++scheduleSet :: UUID -> [ScheduledActivity] -> Annex ()+scheduleSet uuid@(UUID _) activities = do+	ts <- liftIO getPOSIXTime+	Annex.Branch.change scheduleLog $+		showLog id . changeLog ts uuid val . parseLog Just+  where+  	val = fromScheduledActivities activities+scheduleSet NoUUID _ = error "unknown UUID; cannot modify"++scheduleMap :: Annex (M.Map UUID [ScheduledActivity])+scheduleMap = simpleMap+	. parseLogWithUUID parser+	<$> Annex.Branch.get scheduleLog+  where+	parser _uuid = eitherToMaybe . parseScheduledActivities++scheduleGet :: UUID -> Annex (S.Set ScheduledActivity)+scheduleGet u = do+	m <- scheduleMap+	return $ maybe S.empty S.fromList (M.lookup u m)++scheduleRemove :: UUID -> ScheduledActivity -> Annex ()+scheduleRemove u activity = scheduleChange u $ S.delete activity++scheduleAdd :: UUID -> ScheduledActivity -> Annex ()+scheduleAdd u activity = scheduleChange u $ S.insert activity++scheduleChange :: UUID -> (S.Set ScheduledActivity -> S.Set ScheduledActivity) -> Annex ()+scheduleChange u a = scheduleSet u . S.toList . a =<< scheduleGet u++getLastRunTimes :: Annex (M.Map ScheduledActivity LocalTime)+getLastRunTimes = do+	f <- fromRepo gitAnnexScheduleState+	liftIO $ fromMaybe M.empty+		<$> catchDefaultIO Nothing (readish <$> readFile f)++setLastRunTime :: ScheduledActivity -> LocalTime -> Annex ()+setLastRunTime activity lastrun = do+	f <- fromRepo gitAnnexScheduleState+	liftIO . viaTmp writeFile f . show . M.insert activity lastrun+		=<< getLastRunTimes
Makefile view
@@ -2,7 +2,6 @@ all=git-annex $(mans) docs  GHC?=ghc-GHCMAKE=$(GHC) $(GHCFLAGS) --make PREFIX?=/usr CABAL?=cabal # set to "./Setup" if you lack a cabal program @@ -28,8 +27,15 @@ git-annex-shell.1: doc/git-annex-shell.mdwn 	./Build/mdwn2man git-annex-shell 1 doc/git-annex-shell.mdwn > git-annex-shell.1 +# These are not built normally. git-union-merge.1: doc/git-union-merge.mdwn 	./Build/mdwn2man git-union-merge 1 doc/git-union-merge.mdwn > git-union-merge.1+git-recover-repository.1: doc/git-recover-repository.mdwn+	./Build/mdwn2man git-recover-repository 1 doc/git-recover-repository.mdwn > git-recover-repository.1+git-union-merge:+	$(GHC) --make -threaded $@+git-recover-repository:+	$(GHC) --make -threaded $@  install-mans: $(mans) 	install -d $(DESTDIR)$(PREFIX)/share/man/man1@@ -75,7 +81,8 @@ 	rm -rf tmp dist git-annex $(mans) configure  *.tix .hpc \ 		doc/.ikiwiki html dist tags Build/SysConfig.hs build-stamp \ 		Setup Build/InstallDesktopFile Build/EvilSplicer \-		Build/Standalone Build/OSXMkLibs+		Build/Standalone Build/OSXMkLibs \+		git-union-merge git-recover-repository 	find -name \*.o -exec rm {} \; 	find -name \*.hi -exec rm {} \; @@ -214,4 +221,4 @@ 	hdevtools --stop-server || true 	hdevtools check git-annex.hs -g -cpp -g -i -g -idist/build/git-annex/git-annex-tmp -g -i. -g -idist/build/autogen -g -Idist/build/autogen -g -Idist/build/git-annex/git-annex-tmp -g -IUtility -g -DWITH_TESTSUITE -g -DWITH_S3 -g -DWITH_ASSISTANT -g -DWITH_INOTIFY -g -DWITH_DBUS -g -DWITH_PAIRING -g -DWITH_XMPP -g -optP-include -g -optPdist/build/autogen/cabal_macros.h -g -odir -g dist/build/git-annex/git-annex-tmp -g -hidir -g dist/build/git-annex/git-annex-tmp -g -stubdir -g dist/build/git-annex/git-annex-tmp -g -threaded -g -Wall -g -XHaskell98 -g -XPackageImports -.PHONY: git-annex tags build-stamp+.PHONY: git-annex git-union-merge git-recover-repository tags build-stamp
Remote.hs view
@@ -16,6 +16,7 @@ 	hasKey, 	hasKeyCheap, 	whereisKey,+	remoteFsck,  	remoteTypes, 	remoteList,
Remote/Bup.hs view
@@ -63,6 +63,7 @@ 		, hasKey = checkPresent r bupr' 		, hasKeyCheap = bupLocal buprepo 		, whereisKey = Nothing+		, remoteFsck = Nothing 		, config = c 		, repo = r 		, gitconfig = gc
Remote/Directory.hs view
@@ -54,6 +54,7 @@ 			hasKey = checkPresent dir chunksize, 			hasKeyCheap = True, 			whereisKey = Nothing,+			remoteFsck = Nothing, 			config = M.empty, 			repo = r, 			gitconfig = gc,
Remote/GCrypt.hs view
@@ -107,6 +107,7 @@ 		, hasKey = checkPresent this rsyncopts 		, hasKeyCheap = repoCheap r 		, whereisKey = Nothing+		, remoteFsck = Nothing 		, config = M.empty 		, localpath = localpathCalc r 		, repo = r
Remote/Git.hs view
@@ -42,10 +42,13 @@ #ifndef mingw32_HOST_OS import Utility.CopyFile #endif+import Utility.Env+import Utility.Batch import Remote.Helper.Git import Remote.Helper.Messages import qualified Remote.Helper.Ssh as Ssh import qualified Remote.GCrypt+import Config.Files  import Control.Concurrent import Control.Concurrent.MSampleVar@@ -111,6 +114,9 @@ 			, hasKey = inAnnex r 			, hasKeyCheap = repoCheap r 			, whereisKey = Nothing+			, remoteFsck = if Git.repoIsUrl r+				then Nothing+				else Just $ fsckOnRemote r 			, config = M.empty 			, localpath = localpathCalc r 			, repo = r@@ -241,7 +247,7 @@   where 	checkhttp headers = do 		showChecking r-		ifM (anyM (\u -> Url.withUserAgent $ Url.check u headers (keySize key)) (keyUrls r key))+		ifM (anyM (\u -> Url.withUserAgent $ Url.checkBoth u headers (keySize key)) (keyUrls r key)) 			( return $ Right True 			, return $ Left "not found" 			)@@ -395,6 +401,23 @@ 						Annex.Content.getViaTmpChecked (liftIO checksuccessio) key 							(\d -> rsyncOrCopyFile params object d p) 			)++fsckOnRemote :: Git.Repo -> [CommandParam] -> Annex (IO Bool)+fsckOnRemote r params+	| Git.repoIsUrl r = do+		s <- Ssh.git_annex_shell r "fsck" params []+		return $ case s of+			Nothing -> return False+			Just (c, ps) -> batchCommand c ps+	| otherwise = return $ do+		program <- readProgramFile+		env <- getEnvironment+		r' <- Git.Config.read r+		let env' =+			[ ("GIT_WORK_TREE", Git.repoPath r')+			, ("GIT_DIR", Git.localGitDir r')+			] ++ env+		batchCommandEnv program (Param "fsck" : params) (Just env')  {- Runs an action on a local repository inexpensively, by making an annex  - monad using that repository. -}
Remote/Glacier.hs view
@@ -59,6 +59,7 @@ 			hasKey = checkPresent this, 			hasKeyCheap = False, 			whereisKey = Nothing,+			remoteFsck = Nothing, 			config = c, 			repo = r, 			gitconfig = gc,
Remote/Helper/Hooks.hs view
@@ -73,7 +73,7 @@ 		run starthook  		Annex.addCleanup (remoteid ++ "-stop-command") $ runstop lck-#ifndef __WINDOWS__+#ifndef mingw32_HOST_OS 	runstop lck = do 		-- Drop any shared lock we have, and take an 		-- exclusive lock, without blocking. If the lock
Remote/Hook.hs view
@@ -52,6 +52,7 @@ 			hasKey = checkPresent r hooktype, 			hasKeyCheap = False, 			whereisKey = Nothing,+			remoteFsck = Nothing, 			config = M.empty, 			localpath = Nothing, 			repo = r,
Remote/Rsync.hs view
@@ -79,6 +79,7 @@ 			, hasKey = checkPresent r o 			, hasKeyCheap = False 			, whereisKey = Nothing+			, remoteFsck = Nothing 			, config = M.empty 			, repo = r 			, gitconfig = gc
Remote/S3.hs view
@@ -62,6 +62,7 @@ 			hasKey = checkPresent this, 			hasKeyCheap = False, 			whereisKey = Nothing,+			remoteFsck = Nothing, 			config = c, 			repo = r, 			gitconfig = gc,@@ -101,23 +102,24 @@  	archiveorg = do 		showNote "Internet Archive mode"-		maybe (error "specify bucket=") (const noop) $-			getBucket archiveconfig-		writeUUIDFile archiveconfig u-		use archiveconfig-	  where-		archiveconfig =+		-- Ensure user enters a valid bucket name, since+		-- this determines the name of the archive.org item.+		let bucket = replace " " "-" $ map toLower $+			fromMaybe (error "specify bucket=") $+				getBucket c+		let archiveconfig =  			-- hS3 does not pass through x-archive-* headers 			M.mapKeys (replace "x-archive-" "x-amz-") $ 			-- encryption does not make sense here 			M.insert "encryption" "none" $+			M.insert "bucket" bucket $ 			M.union c $ 			-- special constraints on key names 			M.insert "mungekeys" "ia" $ 			-- bucket created only when files are uploaded-			M.insert "x-amz-auto-make-bucket" "1" $-			-- no default bucket name; should be human-readable-			M.delete "bucket" defaults+			M.insert "x-amz-auto-make-bucket" "1" defaults+		writeUUIDFile archiveconfig u+		use archiveconfig  store :: Remote -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool store r k _f p = s3Action r False $ \(conn, bucket) -> 
Remote/Web.hs view
@@ -56,6 +56,7 @@ 		hasKey = checkKey, 		hasKeyCheap = False, 		whereisKey = Just getUrls,+		remoteFsck = Nothing, 		config = M.empty, 		gitconfig = gc, 		localpath = Nothing,@@ -118,7 +119,7 @@ #endif 		DefaultDownloader -> do 			headers <- getHttpHeaders-			Right <$> Url.withUserAgent (Url.check u' headers $ keySize key)+			Right <$> Url.withUserAgent (Url.checkBoth u' headers $ keySize key)   where   	firsthit [] miss _ = return miss 	firsthit (u:rest) _ a = do
Remote/WebDAV.hs view
@@ -65,6 +65,7 @@ 			hasKey = checkPresent this, 			hasKeyCheap = False, 			whereisKey = Nothing,+			remoteFsck = Nothing, 			config = c, 			repo = r, 			gitconfig = gc,
Seek.hs view
@@ -60,7 +60,8 @@ withPathContents a params = map a . concat <$> liftIO (mapM get params)   where 	get p = ifM (isDirectory <$> getFileStatus p)-		( map (\f -> (f, makeRelative (parentDir p) f)) <$> dirContentsRecursive p+		( map (\f -> (f, makeRelative (parentDir p) f))+			<$> dirContentsRecursiveSkipping (".git" `isSuffixOf`) p 		, return [(p, takeFileName p)] 		) 
Test.hs view
@@ -59,6 +59,8 @@ import qualified Utility.Matcher import qualified Utility.Exception import qualified Utility.Hash+import qualified Utility.Scheduled+import qualified Utility.HumanTime #ifndef mingw32_HOST_OS import qualified GitAnnex import qualified Remote.Helper.Encryptable@@ -117,6 +119,7 @@ 	, check "prop_idempotent_deencode" Utility.Format.prop_idempotent_deencode 	, check "prop_idempotent_fileKey" Locations.prop_idempotent_fileKey 	, check "prop_idempotent_key_encode" Types.Key.prop_idempotent_key_encode+	, check "prop_idempotent_key_decode" Types.Key.prop_idempotent_key_decode 	, check "prop_idempotent_shellEscape" Utility.SafeCommand.prop_idempotent_shellEscape 	, check "prop_idempotent_shellEscape_multiword" Utility.SafeCommand.prop_idempotent_shellEscape_multiword 	, check "prop_logs_sane" Logs.prop_logs_sane@@ -138,6 +141,8 @@ 	, check "prop_read_show_TrustLevel" Types.TrustLevel.prop_read_show_TrustLevel 	, check "prop_parse_show_TrustLog" Logs.Trust.prop_parse_show_TrustLog 	, check "prop_hashes_stable" Utility.Hash.prop_hashes_stable+	, check "prop_schedule_roundtrips" Utility.Scheduled.prop_schedule_roundtrips+	, check "prop_duration_roundtrips" Utility.HumanTime.prop_duration_roundtrips 	]   where 	check desc prop = do@@ -715,25 +720,20 @@ 					 - thought the file was still in r2 -} 					git_annex_expectoutput env "find" ["--in", "r2"] [] -{- Regression test for the automatic conflict resolution bug fixed- - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -} test_conflict_resolution :: TestEnv -> Test test_conflict_resolution env = "automatic conflict resolution" ~:-	withtmpclonerepo env False $ \r1 -> do+	TestList [movein_bug, check_mixed_conflict True, check_mixed_conflict False]+  where+	{- Regression test for the automatic conflict resolution bug fixed+	 - in f4ba19f2b8a76a1676da7bb5850baa40d9c388e2. -}+	movein_bug = TestCase $ withtmpclonerepo env False $ \r1 -> do 		withtmpclonerepo env False $ \r2 -> do 			let rname r = if r == r1 then "r1" else "r2" 			forM_ [r1, r2] $ \r -> indir env r $ do 				{- Get all files, see check below. -} 				git_annex env "get" [] @? "get failed"-				{- Set up repos as remotes of each other;-				 - remove origin since we're going to sync-				 - some changes to a file. -}-				when (r /= r1) $-					boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"-				when (r /= r2) $-					boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"-				boolSystem "git" [Params "remote rm origin"] @? "remote rm"-+			pair r1 r2+			forM_ [r1, r2] $ \r -> indir env r $ do 				{- Set up a conflict. -} 				let newcontent = content annexedfile ++ rname r 				ifM (annexeval Config.isDirect)@@ -755,6 +755,36 @@ 			 - been put in it. -} 			forM_ [r1, r2] $ \r -> indir env r $ do 			 	git_annex env "get" [] @? "unable to get all files after merge conflict resolution in " ++ rname r++	{- Check merge conflict resolution when one side is an annexed+	 - file, and the other is a directory. -}+	check_mixed_conflict inr1 = TestCase $ withtmpclonerepo env False $ \r1 ->+		withtmpclonerepo env False $ \r2 -> do+			indir env r1 $ do+				writeFile conflictor "conflictor"+				git_annex env "add" [conflictor] @? "add conflicter failed"+				git_annex env "sync" [] @? "sync failed"+			indir env r2 $ do+				createDirectory conflictor+				writeFile (conflictor </> "subfile") "subfile"+				git_annex env "add" [conflictor] @? "add conflicter failed"+				git_annex env "sync" [] @? "sync failed"+			pair r1 r2+			let r = if inr1 then r1 else r2+			indir env r $ do+				git_annex env "sync" [] @? "sync failed in mixed conflict"+	  where+		conflictor = "conflictor"++	{- Set up repos as remotes of each other;+	 - remove origin since we're going to sync+	 - some changes to a file. -}+	pair r1 r2 = forM_ [r1, r2] $ \r -> indir env r $ do+		when (r /= r1) $+			boolSystem "git" [Params "remote add r1", File ("../../" ++ r1)] @? "remote add"+		when (r /= r2) $+			boolSystem "git" [Params "remote add r2", File ("../../" ++ r2)] @? "remote add"+		boolSystem "git" [Params "remote rm origin"] @? "remote rm"  test_map :: TestEnv -> Test test_map env = "git-annex map" ~: intmpclonerepo env $ do
Types/Key.hs view
@@ -14,7 +14,8 @@ 	key2file, 	file2key, -	prop_idempotent_key_encode+	prop_idempotent_key_encode,+	prop_idempotent_key_decode ) where  import System.Posix.Types@@ -59,7 +60,7 @@ 	_ ?: _ = ""  file2key :: FilePath -> Maybe Key-file2key s = if key == Just stubKey then Nothing else key+file2key s = if key == Just stubKey || (keyName <$> key) == Just "" then Nothing else key   where 	key = startbackend stubKey s @@ -88,3 +89,8 @@  prop_idempotent_key_encode :: Key -> Bool prop_idempotent_key_encode k = Just k == (file2key . key2file) k++prop_idempotent_key_decode :: FilePath -> Bool+prop_idempotent_key_decode f+	| null f = True -- skip illegal empty filename+	| otherwise = maybe True (\k -> key2file k == f) (file2key f)
Types/Remote.hs view
@@ -19,6 +19,7 @@ import Config.Cost import Utility.Metered import Git.Remote+import Utility.SafeCommand  type RemoteConfigKey = String type RemoteConfig = M.Map RemoteConfigKey String@@ -64,6 +65,10 @@ 	hasKeyCheap :: Bool, 	-- Some remotes can provide additional details for whereis. 	whereisKey :: Maybe (Key -> a [String]),+	-- Some remotes can run a fsck operation on the remote,+	-- without transferring all the data to the local repo+	-- The parameters are passed to the fsck command on the remote.+	remoteFsck :: Maybe ([CommandParam] -> a (IO Bool)), 	-- a Remote has a persistent configuration store 	config :: RemoteConfig, 	-- git repo for the Remote
+ Types/ScheduledActivity.hs view
@@ -0,0 +1,69 @@+{- git-annex scheduled activities+ -+ - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Types.ScheduledActivity where++import Common+import Utility.Scheduled+import Utility.HumanTime+import Types.UUID++import Data.Either++data ScheduledActivity +	= ScheduledSelfFsck Schedule Duration+	| ScheduledRemoteFsck UUID Schedule Duration+  deriving (Eq, Read, Show, Ord)++{- Activities that run on a remote, within a time window, so+ - should be run when the remote gets connected. -}+connectActivityUUID :: ScheduledActivity -> Maybe UUID+connectActivityUUID (ScheduledRemoteFsck u (Schedule _ AnyTime) _) = Just u+connectActivityUUID _ = Nothing++getSchedule :: ScheduledActivity -> Schedule+getSchedule (ScheduledSelfFsck s _) = s+getSchedule (ScheduledRemoteFsck _ s _) = s++getDuration :: ScheduledActivity -> Duration+getDuration (ScheduledSelfFsck _ d) = d+getDuration (ScheduledRemoteFsck _ _ d) = d++fromScheduledActivity :: ScheduledActivity -> String+fromScheduledActivity (ScheduledSelfFsck s d) = unwords+	[ "fsck self", fromDuration d, fromSchedule s ]+fromScheduledActivity (ScheduledRemoteFsck u s d) = unwords+	[ "fsck", fromUUID u, fromDuration d, fromSchedule s ]++toScheduledActivity :: String -> Maybe ScheduledActivity+toScheduledActivity = eitherToMaybe . parseScheduledActivity++parseScheduledActivity :: String -> Either String ScheduledActivity+parseScheduledActivity s = case words s of+	("fsck":"self":d:rest) -> qualified $ ScheduledSelfFsck+		<$> parseSchedule (unwords rest)+		<*> getduration d+	("fsck":u:d:rest) -> qualified $ ScheduledRemoteFsck+		<$> pure (toUUID u)+		<*> parseSchedule (unwords rest)+		<*> getduration d+	_ -> qualified $ Left "unknown activity"+  where+	qualified (Left e) = Left $ e ++ " in \"" ++ s ++ "\""+	qualified v = v+	getduration d = maybe (Left $ "failed to parse duration \""++d++"\"") Right (parseDuration d)++fromScheduledActivities :: [ScheduledActivity] -> String+fromScheduledActivities = intercalate "; " . map fromScheduledActivity++parseScheduledActivities :: String -> Either String [ScheduledActivity]+parseScheduledActivities s+	| null bad = Right good+	| otherwise = Left $ intercalate "; " bad+  where+	(bad, good) = partitionEithers $+		map parseScheduledActivity $ split "; " s
Utility/Batch.hs view
@@ -9,10 +9,15 @@  module Utility.Batch where +import Common+import qualified Build.SysConfig+ #if defined(linux_HOST_OS) || defined(__ANDROID__) import Control.Concurrent.Async import System.Posix.Process #endif+import qualified Control.Exception as E+import System.Process (env)  {- Runs an operation, at batch priority.  -@@ -38,3 +43,47 @@  maxNice :: Int maxNice = 19++{- Converts a command to run niced. -}+toBatchCommand :: (String, [CommandParam]) -> (String, [CommandParam])+toBatchCommand (command, params) = (command', params')+  where+#ifndef mingw32_HOST_OS+	commandline = unwords $ map shellEscape $ command : toCommand params+	nicedcommand+		| Build.SysConfig.nice = "nice " ++ commandline+		| otherwise = commandline+	command' = "sh"+	params' =+		[ Param "-c"+		, Param $ "exec " ++ nicedcommand+		]+#else+	command' = command+	params' = params+#endif++{- Runs a command in a way that's suitable for batch jobs that can be+ - interrupted.+ -+ - The command is run niced. If the calling thread receives an async+ - exception, it sends the command a SIGTERM, and after the command+ - finishes shuttting down, it re-raises the async exception. -}+batchCommand :: String -> [CommandParam] -> IO Bool+batchCommand command params = batchCommandEnv command params Nothing++batchCommandEnv :: String -> [CommandParam] -> Maybe [(String, String)] -> IO Bool+batchCommandEnv command params environ = do+	(_, _, _, pid) <- createProcess $ p { env = environ }+	r <- E.try (waitForProcess pid) :: IO (Either E.SomeException ExitCode)+	case r of+		Right ExitSuccess -> return True+		Right _ -> return False+		Left asyncexception -> do+			terminateProcess pid+			void $ waitForProcess pid+			E.throwIO asyncexception+  where+  	(command', params') = toBatchCommand (command, params)+  	p = proc command' $ toCommand params'+
Utility/Daemon.hs view
@@ -16,6 +16,7 @@  #ifndef mingw32_HOST_OS import System.Posix+import Control.Concurrent.Async #else import System.PosixCompat #endif@@ -46,7 +47,9 @@ 		nullfd <- openFd "/dev/null" ReadOnly Nothing defaultFileFlags 		redir nullfd stdInput 		redirLog logfd-		a+		{- forkProcess masks async exceptions; unmask them inside+		 - the action. -}+		wait =<< asyncWithUnmask (\unmask -> unmask a) 		out 	out = exitImmediately ExitSuccess #else
Utility/Directory.hs view
@@ -38,15 +38,20 @@  - and lazily. If the directory does not exist, no exception is thrown,  - instead, [] is returned. -} dirContentsRecursive :: FilePath -> IO [FilePath]-dirContentsRecursive topdir = dirContentsRecursive' [topdir]+dirContentsRecursive topdir = dirContentsRecursiveSkipping (const False) topdir -dirContentsRecursive' :: [FilePath] -> IO [FilePath]-dirContentsRecursive' [] = return []-dirContentsRecursive' (dir:dirs) = unsafeInterleaveIO $ do-	(files, dirs') <- collect [] [] =<< catchDefaultIO [] (dirContents dir)-	files' <- dirContentsRecursive' (dirs' ++ dirs)-	return (files ++ files')+{- Skips directories whose basenames match the skipdir. -}+dirContentsRecursiveSkipping :: (FilePath -> Bool) -> FilePath -> IO [FilePath]+dirContentsRecursiveSkipping skipdir topdir = go [topdir]   where+  	go [] = return []+	go (dir:dirs)+		| skipdir (takeFileName dir) = go dirs+		| otherwise = unsafeInterleaveIO $ do+			(files, dirs') <- collect [] []+				=<< catchDefaultIO [] (dirContents dir)+			files' <- go (dirs' ++ dirs)+			return (files ++ files') 	collect files dirs' [] = return (reverse files, reverse dirs') 	collect files dirs' (entry:entries) 		| dirCruft entry = collect files dirs' entries
Utility/Hash.hs view
@@ -1,13 +1,30 @@ {- Convenience wrapper around cryptohash.- -- - The resulting Digests can be shown to get a canonical hash encoding. -}+ - Falls back to SHA if it's not available.+ -} -module Utility.Hash where+{-# LANGUAGE CPP #-} -import Crypto.Hash+module Utility.Hash (+	sha1,+	sha224,+	sha256,+	sha384,+	sha512,+#ifdef WITH_CRYPTOHASH+	skein256,+	skein512,+#endif+	prop_hashes_stable+) where+ import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Char8 as C8 +#ifndef WITH_CRYPTOHASH+import Data.Digest.Pure.SHA+#else+import Crypto.Hash+ sha1 :: L.ByteString -> Digest SHA1 sha1 = hashlazy @@ -33,6 +50,8 @@ skein512 :: L.ByteString -> Digest Skein512_512 skein512 = hashlazy +#endif+ {- Check that all the hashes continue to hash the same. -} prop_hashes_stable :: Bool prop_hashes_stable = all (\(hasher, result) -> hasher foo == result)@@ -41,8 +60,10 @@ 	, (show . sha256, "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae") 	, (show . sha384, "98c11ffdfdd540676b1a137cb1a22b2a70350c9a44171d6b1180c6be5cbb2ee3f79d532c8a1dd9ef2e8e08e752a3babb") 	, (show . sha512, "f7fbba6e0636f890e56fbbf3283e524c6fa3204ae298382d624741d0dc6638326e282c41be5e4254d8820772c5518a2c5a8c0c7f7eda19594a7eb539453e1ed7")+#ifdef WITH_CRYPTOHASH 	, (show . skein256, "a04efd9a0aeed6ede40fe5ce0d9361ae7b7d88b524aa19917b9315f1ecf00d33") 	, (show . skein512, "fd8956898113510180aa4658e6c0ac85bd74fb47f4a4ba264a6b705d7a8e8526756e75aecda12cff4f1aca1a4c2830fbf57f458012a66b2b15a3dd7d251690a7")+#endif 	]   where 	foo = L.fromChunks [C8.pack "foo"]
Utility/HumanTime.hs view
@@ -1,26 +1,84 @@ {- Time for humans.  -- - Copyright 2012 Joey Hess <joey@kitenet.net>+ - Copyright 2012-2013 Joey Hess <joey@kitenet.net>  -  - Licensed under the GNU GPL version 3 or higher.  -} -module Utility.HumanTime where+module Utility.HumanTime (+	Duration(..),+	durationToPOSIXTime,+	parseDuration,+	fromDuration,+	prop_duration_roundtrips+) where  import Utility.PartialPrelude+import Utility.Applicative+import Utility.QuickCheck  import Data.Time.Clock.POSIX (POSIXTime)+import Data.Char+import Control.Applicative+import qualified Data.Map as M -{- Parses a human-input time duration, of the form "5h" or "1m". -}-parseDuration :: String -> Maybe POSIXTime-parseDuration s = do-	num <- readish s :: Maybe Integer-	units <- findUnits =<< lastMaybe s-	return $ fromIntegral num * units+newtype Duration = Duration { durationSeconds :: Integer }+  deriving (Eq, Ord, Read, Show)++durationToPOSIXTime :: Duration -> POSIXTime+durationToPOSIXTime = fromIntegral . durationSeconds++{- Parses a human-input time duration, of the form "5h", "1m", "5h1m", etc -}+parseDuration :: String -> Maybe Duration+parseDuration = Duration <$$> go 0   where-	findUnits 's' = Just 1-	findUnits 'm' = Just 60-	findUnits 'h' = Just $ 60 * 60-	findUnits 'd' = Just $ 60 * 60 * 24-	findUnits 'y' = Just $ 60 * 60 * 24 * 365-	findUnits _ = Nothing+  	go n [] = return n+  	go n s = do+		num <- readish s :: Maybe Integer+		let (c:rest) = dropWhile isDigit s+		u <- M.lookup c unitmap+		go (n + num * u) rest++fromDuration :: Duration -> String+fromDuration Duration { durationSeconds = d }+	| d == 0 = "0s"+	| otherwise = concat $ map showunit $ go [] units d+  where+	showunit (u, n)+		| n > 0 = show n ++ [u]+		| otherwise = ""+	go c [] _ = reverse c+	go c ((u, n):us) v =+		let (q,r) = v `quotRem` n+		in go ((u, q):c) us r++units :: [(Char, Integer)]+units = +	[ ('y', ysecs)+	, ('d', dsecs)+	, ('h', hsecs)+	, ('m', msecs)+	, ('s', 1)+	]++unitmap :: M.Map Char Integer+unitmap = M.fromList units++ysecs :: Integer+ysecs = dsecs * 365++dsecs :: Integer+dsecs = hsecs * 24++hsecs :: Integer+hsecs = msecs * 60++msecs :: Integer+msecs = 60++-- Durations cannot be negative.+instance Arbitrary Duration where+	arbitrary = Duration <$> nonNegative arbitrary++prop_duration_roundtrips :: Duration -> Bool+prop_duration_roundtrips d = parseDuration (fromDuration d) == Just d
Utility/Lsof.hs view
@@ -26,8 +26,8 @@ {- lsof is not in PATH on all systems, so SysConfig may have the absolute  - path where the program was found. Make sure at runtime that lsof is  - available, and if it's not in PATH, adjust PATH to contain it. -}-setupLsof :: IO ()-setupLsof = do+setup :: IO ()+setup = do 	let cmd = fromMaybe "lsof" SysConfig.lsof 	when (isAbsolute cmd) $ do 		path <- getSearchPath
Utility/Misc.hs view
@@ -29,7 +29,7 @@ readFileStrict :: FilePath -> IO String readFileStrict = readFile >=> \s -> length s `seq` return s -{- Like break, but the character matching the condition is not included+{- Like break, but the item matching the condition is not included  - in the second result list.  -  - separate (== ':') "foo:bar" = ("foo", "bar")
Utility/Process.hs view
@@ -72,17 +72,17 @@ 		, env = environ 		} -{- Writes a string to a process on its stdin, +{- Runs an action to write to a process on its stdin,   - returns its output, and also allows specifying the environment.  -} writeReadProcessEnv 	:: FilePath 	-> [String] 	-> Maybe [(String, String)]-	-> String 	-> (Maybe (Handle -> IO ()))+	-> (Maybe (Handle -> IO ())) 	-> IO String-writeReadProcessEnv cmd args environ input adjusthandle = do+writeReadProcessEnv cmd args environ writestdin adjusthandle = do 	(Just inh, Just outh, _, pid) <- createProcess p  	maybe (return ()) (\a -> a inh) adjusthandle@@ -94,7 +94,7 @@ 	_ <- forkIO $ E.evaluate (length output) >> putMVar outMVar ()  	-- now write and flush any input-	when (not (null input)) $ do hPutStr inh input; hFlush inh+	maybe (return ()) (\a -> a inh >> hFlush inh) writestdin 	hClose inh -- done with stdin  	-- wait on the output
Utility/QuickCheck.hs view
@@ -43,3 +43,6 @@  nonNegative :: (Num a, Ord a) => Gen a -> Gen a nonNegative g = g `suchThat` (>= 0)++positive :: (Num a, Ord a) => Gen a -> Gen a+positive g = g `suchThat` (> 0)
+ Utility/Scheduled.hs view
@@ -0,0 +1,347 @@+{- scheduled activities+ - + - Copyright 2013 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Scheduled (+	Schedule(..),+	Recurrance(..),+	ScheduledTime(..),+	NextTime(..),+	nextTime,+	fromSchedule,+	fromScheduledTime,+	toScheduledTime,+	fromRecurrance,+	toRecurrance,+	toSchedule,+	parseSchedule,+	prop_schedule_roundtrips+) where++import Common+import Utility.QuickCheck++import Data.Time.Clock+import Data.Time.LocalTime+import Data.Time.Calendar+import Data.Time.Calendar.WeekDate+import Data.Time.Calendar.OrdinalDate+import Data.Tuple.Utils+import Data.Char++{- Some sort of scheduled event. -}+data Schedule = Schedule Recurrance ScheduledTime+  deriving (Eq, Read, Show, Ord)++data Recurrance+	= Daily+	| Weekly (Maybe WeekDay)+	| Monthly (Maybe MonthDay)+	| Yearly (Maybe YearDay)+	-- Days, Weeks, or Months of the year evenly divisible by a number.+	-- (Divisible Year is years evenly divisible by a number.)+	| Divisible Int Recurrance+  deriving (Eq, Read, Show, Ord)++type WeekDay = Int+type MonthDay = Int+type YearDay = Int++data ScheduledTime+	= AnyTime+	| SpecificTime Hour Minute+  deriving (Eq, Read, Show, Ord)++type Hour = Int+type Minute = Int++{- Next time a Schedule should take effect. The NextTimeWindow is used+ - when a Schedule is allowed to start at some point within the window. -}+data NextTime+	= NextTimeExactly LocalTime+	| NextTimeWindow LocalTime LocalTime+  deriving (Eq, Read, Show)++startTime :: NextTime -> LocalTime+startTime (NextTimeExactly t) = t+startTime (NextTimeWindow t _) = t++nextTime :: Schedule -> Maybe LocalTime -> IO (Maybe NextTime)+nextTime schedule lasttime = do+	now <- getCurrentTime+	tz <- getTimeZone now+	return $ calcNextTime schedule lasttime $ utcToLocalTime tz now++{- Calculate the next time that fits a Schedule, based on the+ - last time it occurred, and the current time. -}+calcNextTime :: Schedule -> Maybe LocalTime -> LocalTime -> Maybe NextTime+calcNextTime (Schedule recurrance scheduledtime) lasttime currenttime+	| scheduledtime == AnyTime = do+		next <- findfromtoday True+		return $ case next of+			NextTimeWindow _ _ -> next+			NextTimeExactly t -> window (localDay t) (localDay t)+	| otherwise = NextTimeExactly . startTime <$> findfromtoday False+  where+  	findfromtoday anytime = findfrom recurrance afterday today+	  where+	  	today = localDay currenttime+		afterday = sameaslastday || toolatetoday+		toolatetoday = not anytime && localTimeOfDay currenttime >= nexttime+		sameaslastday = lastday == Just today+	lastday = localDay <$> lasttime+	nexttime = case scheduledtime of+		AnyTime -> TimeOfDay 0 0 0+		SpecificTime h m -> TimeOfDay h m 0+	exactly d = NextTimeExactly $ LocalTime d nexttime+	window startd endd = NextTimeWindow+		(LocalTime startd nexttime)+		(LocalTime endd (TimeOfDay 23 59 0))+	findfrom r afterday day = case r of+		Daily+			| afterday -> Just $ exactly $ addDays 1 day+			| otherwise -> Just $ exactly day+		Weekly Nothing+			| afterday -> skip 1+			| otherwise -> case (wday <$> lastday, wday day) of+				(Nothing, _) -> Just $ window day (addDays 6 day)+				(Just old, curr)+					| old == curr -> Just $ window day (addDays 6 day)+					| otherwise -> skip 1+		Monthly Nothing+			| afterday -> skip 1+			| maybe True (\old -> mnum day > mday old && mday day >= (mday old `mod` minmday)) lastday ->+				-- Window only covers current month,+				-- in case there is a Divisible requirement.+				Just $ window day (endOfMonth day)+			| otherwise -> skip 1+		Yearly Nothing+			| afterday -> skip 1+			| maybe True (\old -> ynum day > ynum old && yday day >= (yday old `mod` minyday)) lastday ->+				Just $ window day (endOfYear day)+			| otherwise -> skip 1+		Weekly (Just w)+			| w < 0 || w > maxwday -> Nothing+			| w == wday day -> if afterday+				then Just $ exactly $ addDays 7 day+				else Just $ exactly day+			| otherwise -> Just $ exactly $+				addDays (fromIntegral $ (w - wday day) `mod` 7) day+		Monthly (Just m)+			| m < 0 || m > maxmday -> Nothing+			-- TODO can be done more efficiently than recursing+			| m == mday day -> if afterday+				then skip 1+				else Just $ exactly day+			| otherwise -> skip 1+		Yearly (Just y)+			| y < 0 || y > maxyday -> Nothing+			| y == yday day -> if afterday+				then skip 365+				else Just $ exactly day+			| otherwise -> skip 1+		Divisible n r'@Daily -> handlediv n r' yday (Just maxyday)+		Divisible n r'@(Weekly _) -> handlediv n r' wnum (Just maxwnum)+		Divisible n r'@(Monthly _) -> handlediv n r' mnum (Just maxmnum)+		Divisible n r'@(Yearly _) -> handlediv n r' ynum Nothing+		Divisible _ r'@(Divisible _ _) -> findfrom r' afterday day+	  where+	  	skip n = findfrom r False (addDays n day)+	  	handlediv n r' getval mmax+			| n > 0 && maybe True (n <=) mmax =+				findfromwhere r' (divisible n . getval) afterday day+			| otherwise = Nothing+	findfromwhere r p afterday day+		| maybe True (p . getday) next = next+		| otherwise = maybe Nothing (findfromwhere r p True . getday) next+	  where+		next = findfrom r afterday day+		getday = localDay . startTime+	divisible n v = v `rem` n == 0++endOfMonth :: Day -> Day+endOfMonth day =+	let (y,m,_d) = toGregorian day+	in fromGregorian y m (gregorianMonthLength y m)++endOfYear :: Day -> Day+endOfYear day =+	let (y,_m,_d) = toGregorian day+	in endOfMonth (fromGregorian y maxmnum 1)++-- extracting various quantities from a Day+wday :: Day -> Int+wday = thd3 . toWeekDate+wnum :: Day -> Int+wnum = snd3 . toWeekDate+mday :: Day -> Int+mday = thd3 . toGregorian+mnum :: Day -> Int+mnum = snd3 . toGregorian+yday :: Day -> Int+yday = snd . toOrdinalDate+ynum :: Day -> Int+ynum = fromIntegral . fst . toOrdinalDate++{- Calendar max and mins. -}+maxyday :: Int+maxyday = 366 -- with leap days+minyday :: Int+minyday = 365+maxwnum :: Int+maxwnum = 53 -- some years have more than 52+maxmday :: Int+maxmday = 31+minmday :: Int+minmday = 28+maxmnum :: Int+maxmnum = 12+maxwday :: Int+maxwday = 7++fromRecurrance :: Recurrance -> String+fromRecurrance (Divisible n r) =+	fromRecurrance' (++ "s divisible by " ++ show n) r+fromRecurrance r = fromRecurrance' ("every " ++) r++fromRecurrance' :: (String -> String) -> Recurrance -> String+fromRecurrance' a Daily = a "day"+fromRecurrance' a (Weekly n) = onday n (a "week")+fromRecurrance' a (Monthly n) = onday n (a "month")+fromRecurrance' a (Yearly n) = onday n (a "year")+fromRecurrance' a (Divisible _n r) = fromRecurrance' a r -- not used++onday :: Maybe Int -> String -> String+onday (Just n) s = "on day " ++ show n ++ " of " ++ s+onday Nothing s = s++toRecurrance :: String -> Maybe Recurrance+toRecurrance s = case words s of+	("every":"day":[]) -> Just Daily+	("on":"day":sd:"of":"every":something:[]) -> withday sd something+	("every":something:[]) -> noday something+	("days":"divisible":"by":sn:[]) -> +		Divisible <$> getdivisor sn <*> pure Daily+	("on":"day":sd:"of":something:"divisible":"by":sn:[]) -> +		Divisible+			<$> getdivisor sn+			<*> withday sd something+	("every":something:"divisible":"by":sn:[]) -> +		Divisible+			<$> getdivisor sn+			<*> noday something+	(something:"divisible":"by":sn:[]) -> +		Divisible+			<$> getdivisor sn+			<*> noday something+	_ -> Nothing+  where+	constructor "week" = Just Weekly+	constructor "month" = Just Monthly+	constructor "year" = Just Yearly+	constructor u+		| "s" `isSuffixOf` u = constructor $ reverse $ drop 1 $ reverse u+		| otherwise = Nothing+  	withday sd u = do+		c <- constructor u+		d <- readish sd+		Just $ c (Just d)+	noday u = do+		c <- constructor u+		Just $ c Nothing+	getdivisor sn = do+		n <- readish sn+		if n > 0+			then Just n+			else Nothing++fromScheduledTime :: ScheduledTime -> String+fromScheduledTime AnyTime = "any time"+fromScheduledTime (SpecificTime h m) = +	show h' ++ (if m > 0 then ":" ++ pad 2 (show m) else "") ++ " " ++ ampm+  where+  	pad n s = take (n - length s) (repeat '0') ++ s+	(h', ampm)+		| h == 0 = (12, "AM")+		| h < 12 = (h, "AM")+		| h == 12 = (h, "PM")+		| otherwise = (h - 12, "PM")++toScheduledTime :: String -> Maybe ScheduledTime+toScheduledTime "any time" = Just AnyTime+toScheduledTime v = case words v of+	(s:ampm:[])+		| map toUpper ampm == "AM" ->+			go s (\h -> if h == 12 then 0 else h)+		| map toUpper ampm == "PM" ->+			go s (+ 12)+		| otherwise -> Nothing+	(s:[]) -> go s id+	_ -> Nothing+  where+  	go :: String -> (Int -> Int) -> Maybe ScheduledTime+	go s adjust =+		let (h, m) = separate (== ':') s+		in SpecificTime+			<$> (adjust <$> readish h)+			<*> if null m then Just 0 else readish m++fromSchedule :: Schedule -> String+fromSchedule (Schedule recurrance scheduledtime) = unwords+	[ fromRecurrance recurrance+	, "at"+	, fromScheduledTime scheduledtime+	]++toSchedule :: String -> Maybe Schedule+toSchedule = eitherToMaybe . parseSchedule++parseSchedule :: String -> Either String Schedule+parseSchedule s = do+	r <- maybe (Left $ "bad recurrance: " ++ recurrance) Right+		(toRecurrance recurrance)+	t <- maybe (Left $ "bad time of day: " ++ scheduledtime) Right+		(toScheduledTime scheduledtime)+	Right $ Schedule r t+  where+	(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 +			<$> nonNegative arbitrary +			<*> nonNegative arbitrary+		]++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/Url.hs view
@@ -11,6 +11,7 @@ 	URLString, 	UserAgent, 	check,+	checkBoth, 	exists, 	download, 	downloadQuiet@@ -32,12 +33,18 @@  {- Checks that an url exists and could be successfully downloaded,  - also checking that its size, if available, matches a specified size. -}-check :: URLString -> Headers -> Maybe Integer -> Maybe UserAgent -> IO Bool+checkBoth :: URLString -> Headers -> Maybe Integer -> Maybe UserAgent -> IO Bool+checkBoth url headers expected_size ua = do+	v <- check url headers expected_size ua+	return (fst v && snd v)+check :: URLString -> Headers -> Maybe Integer -> Maybe UserAgent -> IO (Bool, Bool) check url headers expected_size = handle <$$> exists url headers   where-	handle (False, _) = False-	handle (True, Nothing) = True-	handle (True, s) = expected_size == s+	handle (False, _) = (False, False)+	handle (True, Nothing) = (True, True)+	handle (True, s) = case expected_size of+		Just _ -> (True, expected_size == s)+		Nothing -> (True, True)  {- Checks that an url exists and could be successfully downloaded,  - also returning its size if available. 
Utility/WebApp.hs view
@@ -24,7 +24,7 @@ import qualified Data.CaseInsensitive as CI import Network.Socket import Control.Exception-import Crypto.Random+import "crypto-api" Crypto.Random import qualified Web.ClientSession as CS import qualified Data.ByteString.Lazy as L import qualified Data.ByteString.Lazy.UTF8 as L8
debian/changelog view
@@ -1,3 +1,49 @@+git-annex (4.20131024) unstable; urgency=low++  * webapp: Fix bug when adding a remote and git-remote-gcrypt+    is not installed.+  * The assitant can now run scheduled incremental fsck jobs on the local+    repository and remotes. These can be configured using vicfg or with the+    webapp.+  * repair: New command, which can repair damaged git repositories+    (even ones not using git-annex).+  * webapp: When git repository damange is detected, repairs can be+    done using the webapp UI.+  * Automatically and safely detect and recover from dangling+    .git/annex/index.lock files, which would prevent git from+    committing to the git-annex branch, eg after a crash.+  * assistant: Detect stale git lock files at startup time, and remove them.+  * addurl: Better sanitization of generated filenames.+  * Better sanitization of problem characters when generating URL and WORM+    keys.+  * The control socket path passed to ssh needs to be 17 characters+    shorter than the maximum unix domain socket length, because ssh+    appends stuff to it to make a temporary filename. Closes: #725512+  * status: Fix space leak in local mode, introduced in version 4.20130920.+  * import: Skip .git directories.+  * Remove bogus runshell loop check.+  * addurl: Improve message when adding url with wrong size to existing file.+  * Fixed handling of URL keys that have no recorded size.+  * status: Fix a crash if a temp file went away while its size was+    being checked for status.+  * Deal with git check-attr -z output format change in git 1.8.5.+  * Work around sed output difference that led to version containing a newline+    on OSX.+  * sync: Fix automatic resolution of merge conflicts where one side is an+    annexed file, and the other side is a non-annexed file, or a directory.+  * S3: Try to ensure bucket name is valid for archive.org.+  * assistant: Bug fix: When run in a subdirectory, files from incoming merges+    were wrongly added to that subdirectory, and removed from their original+    locations.+  * Windows: Deal with strange msysgit 1.8.4 behavior of not understanding+    DOS formatted paths for --git-dir and --work-tree.+  * Removed workaround for bug in git 1.8.4r0.+  * Added git-recover-repository command to git-annex source+    (not built by default; this needs to move to someplace else).+  * webapp: Move sidebar to the right hand side of the screen.++ -- Joey Hess <joeyh@debian.org>  Thu, 24 Oct 2013 12:59:55 -0400+ git-annex (4.20131002) unstable; urgency=low    * Note that the layout of gcrypt repositories has changed, and
+ doc/Android.mdwn view
@@ -0,0 +1,53 @@+git-annex is now available for Android. This includes the +[[git-annex assistant|/assistant]], for easy syncing between your Android+and other devices. You do not need to root your Android to use git-annex.++[[Android installation instructions|/install/android]]++When you run the git-annex Android app, two windows will open. The first is+a terminal window, and the second is a web browser showing the git-annex+webapp.++[[!img apps.png alt="two windows"]]++[[!toc ]]++## closing and reopening the webapp++The webapp does not need to be left open after you've set up your+repository. As long as the terminal window is left open, git-annex will+remain running and sync your files. To re-open the webapp after closing it,+use the [[!img newwindow.png alt="New Window"]] icon in the terminal window.++## starting git-annex++The app is not currently automatically started on boot, so you will need to+manually open it to keep your files in sync. You do not need to leave the+app running all the time, though. It will sync back up automatically when+started.++## stopping git-annex++Simply close the terminal window to stop git-annex from running.++## using the command line++[[!img terminal.png alt="Android terminal"]]++If you prefer to use `git-annex` at the command line, you can do so using the+terminal. A fairly full set of tools is provided, including `git`, `ssh`,+`rsync`, and `gpg`.++To prevent the webapp from being automatically started+when a terminal window opens, go into the terminal preferences, to "Inital+Command", and clear out the default `git annex webapp` setting.++Or, if you'd like to run the assistant automatically, but not open the+webapp, change the "Initial Command" to: `git annex assistant --autostart`++## using from adb shell++To set up the git-annex environment from within `adb shell`, run:+`/data/data/ga.androidterm/runshell`++This will launch a shell that has git-annex, git, etc in PATH.
+ doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="asking for ssh password in the terminal (not in web ui)"+ date="2013-05-24T23:49:40Z"+ content="""+not sure if that is a known issue:  whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise  +"""]]
+ doc/Android/comment_19_dc7b428f525a082834cb87221fc627ff._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="SSH Keys?"+ date="2013-07-17T16:50:46Z"+ content="""+Is there a way I can use an SSH Key to connect to a remote server?  What would be really cool, though maybe not feasible, would be to use connectbot as an ssh-agent.+"""]]
+ doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.4.90"+ subject="comment 20"+ date="2013-07-17T19:06:31Z"+ content="""+@frioux the webapp has a \"ssh server\" option that will set up a ssh key and use it for passwordless data transfer to a ssh server. You have to enter your password twice in the git-annex terminal app, and then it's set up.++The openssh included in the git-annex app fully supports everything you can usually do with ssh keys, so you can also set this up by hand.+"""]]
+ doc/Android/comment_29_37aa87a451d4390ed367402eec740855._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.21"+ subject="comment 29"+ date="2013-07-30T17:45:27Z"+ content="""+If you are experiencing a problem using git-annex on Android, please examine the list of [[bugs]] and add a new, detailed bug report if no-one has reported the problem. If you are not sure if you have a bug, or need help in filing a good bug report, ask for help in the [[forum]].++I have moved to [[oldcomments]] a lot of old comments about problems that may be fixed or+not (hard to tell without a bug report!) " This page cannot+scale to handle every bug report that someone wants to paste into it.+"""]]
+ doc/Android/comment_5_ba11b81c671d9bcd6f496fbd6f562b0f._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://mebus.myopenid.com/"+ ip="2a01:198:3eb:0:4a5b:39ff:fea4:55b3"+ subject="comment 5"+ date="2013-10-19T18:05:52Z"+ content="""+Hallo,++how can I use the app with public/private keys for SSH. Where can I add them?++Thanks++Mebus+++"""]]
+ doc/Android/oldcomments.mdwn view
@@ -0,0 +1,2 @@+If one of these comments is yours, and you are still experiencing the+problem, please file a proper [[bug_report|bugs]]. --[[Joey]]
+ doc/Android/oldcomments/comment_10_20e3d513b8b97496d76aca4619026cd6._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="comment 10"+ date="2013-05-24T03:11:50Z"+ content="""+>you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.++;-)  Sorry for confusion, here are the details:++\"Read-only file system\" -- that error appeared when I started \"stock git annex\", i.e. from running /data/data/ga.androidterm/lib/lib.start.so .+Since you have suggested that it might be coming from hard linking command, I have ran that one manually, and that is when I got \"Cross-device link\" error, which suggests that hard linking is not the one at fault here.++I will try fresh build now+Cheers,+"""]]
+ doc/Android/oldcomments/comment_11_c96b8f1cc1583a74eb2483f48357f023._comment view
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="fresh build"+ date="2013-05-24T03:21:29Z"+ content="""+With fresh build got:++u0_a39@android:/ $ git annex webapp+/system/bin/sh: git: not found++the PATH is /sbin:/system/bin:/system/xbin++where should git (and ga) reside now ? (/data somehow is not accessible now to u0_a39)+"""]]
+ doc/Android/oldcomments/comment_12_6551f5fa081494b079c10a33c9b0d8ad._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 12"+ date="2013-05-24T03:26:33Z"+ content="""+You should be able to run /data/data/ga.androidterm/runshell even if you cannot ls /data. This adds /data/data/ga.androidterm/bin to PATH++However, the shell that the app starts is started by runshell anyway, so I don't understand how this could happen.+"""]]
+ doc/Android/oldcomments/comment_13_7c633d245651ec08f63194fe1fc194ae._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"+ nickname="Franck"+ subject="Still problems with my old N1/CM7"+ date="2013-05-24T06:01:18Z"+ content="""+Hi, thank you for addressing this issue! I installed the new release but now it fails in another way: the message is just \"In mgmain NJI_OnLoad\" then the terminal says that the session is closed.+"""]]
+ doc/Android/oldcomments/comment_14_60c2403140085f9caf48a33b59a36ab4._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="It starts after uninstall/install"+ date="2013-05-24T23:29:52Z"+ content="""+Hi Joey -- there is success here... previous installation was \"updated\" by installing the new package without uninstalling previous one, and that apparently didn't work correctly (I didn't even have bin/ directory you mentioned).  So I have removed previous installation and reinstalled it again -- it starts now!  Thanks ;)+"""]]
+ doc/Android/oldcomments/comment_16_9af73451be09f03cfff81fdf9481ffc4._comment view
@@ -0,0 +1,27 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Few other issues"+ date="2013-05-25T15:35:46Z"+ content="""+Hi again.++talking about 4.20130523-gcfe07a2 version:++- because working in the terminal to interact with git-annex probably should not be a common case on Android, may be it is worth making default type of new added repository to become a full backup?  I have initiated a new one, attached a remote one, it said \"synced\" but all the files were just containing symlinks and were not usable.  I had to switch to \"full backup\" (or whatever that name) to finally get directory synced++- log file might grow too large simply because of containing numerous entries for attempting connect remote repository while offline, e.g.++Please make sure you have the correct access rights+and the repository exists.+ssh: Could not resolve hostname onerussian.com: No address associated with hostname+fatal: Could not read from remote repository.++IMHO those should not be there at all, e.g. if it is known that ATM there is no network connectivity++- In addition to two existing repositories (1 local /sdcard/annex, which is also avail at/storage/sdcard0/annex + 1 remote) I have added one more local (and said to keep it in sync with original local).  But it didn't work -- it \"Synced with onerussian.com_annex but not with Annex\" and claimed that the /external/extSdCard/Annex doesn't exist, although it is there (and with .git generated etc).  When I restarted the deamon I got into a \"new\" Repository: /storage/extSdCard/Annex which also listed the 1st local but with \"Failed to sync with localhost\" message -- no remote one listed.  Whenever I try to \"Switch repository\" to /sdcard/annex (the original local) -- it starts loading a new page but gets stuck right there.  The only way to revive webui is to go back to Dashboard.  Log there says (retyping from the screen so typos might be there):++error: cannot run git-receive-pack '/storage/sdcard0/annex': No such file or directory+fatal: unable to fork++"""]]
+ doc/Android/oldcomments/comment_17_f76561a654b534df3a807b1c045710b2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="comment 17"+ date="2013-05-29T02:43:29Z"+ content="""+joey -- any additional information could I provide to troubleshoot the issue?  original repository seems to sync ok, but I can't \"administer\" it if I can't even switch to it...+"""]]
+ doc/Android/oldcomments/comment_18_1b46cdf154ddadfe17e4b6e4054dc619._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://aap.liquidid.net/"+ nickname="AAP"+ subject="comment 18"+ date="2013-05-30T11:23:58Z"+ content="""+I too get the 'link busybox: Read-only file system' message. Here is my phone info: ++Phone: Samsung Galaxy Y GT-S5360 (rooted)   +Android: 2.3.6 Gingerbread   +BusyBox path: /system/xbin/ +++Androids own terminal seems not to understand the d argument (-ld: No such file or directory) but over ssh 'ls -ld /data/data/ga.androidterm' returns+     +         drwxr-x--x    1 app_97   app_97           0 May 30 12:57 /data/data/ga.androidterm/+"""]]
+ doc/Android/oldcomments/comment_1_cc9caa5dd22dd67e5c1d22d697096dd2._comment view
@@ -0,0 +1,15 @@+[[!comment format=txt+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Does it require the device to be rooted?"+ date="2013-05-16T20:55:45Z"+ content="""+Following your news on kickstarter downloaded the .apk, and installed it.  Upn start I just got a terminal window with++  link busybox: Read-only file system++  [Terminal session finished]++That is on Galaxy Note++"""]]
+ doc/Android/oldcomments/comment_21_5903f6a4a81a6534fa8cfafb3b6c37bb._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="SSH Keys - 2"+ date="2013-07-17T22:56:37Z"+ content="""+@joey should I be using the nightlies to see that?  Under \"Adding a remote server using ssh\" I only see  Host name, user name, directory, and port.  Will it only be an option after I type in a password?+"""]]
+ doc/Android/oldcomments/comment_22_36afd354f9669a154d7b6b2c4d43ded9._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.6.48"+ subject="comment 22"+ date="2013-07-17T23:25:21Z"+ content="""+@frioux it will automatically generate a new ssh key and configure the server to use it, once you submit the form and enter the password to let it into the server.+"""]]
+ doc/Android/oldcomments/comment_23_de98154792e8611a134429f06d82bcb1._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="comment 23"+ date="2013-07-18T02:01:28Z"+ content="""+@joey: ok, I got it to connect and it indeed sent over a key etc.  For some reason now though git-annex (on android) \"crashes\" shortly after starting.  To be clear, the web app says that the program crashed, the console is still there.  I suspect that it may have something to do with my largish remote repo and the time required to sync just the metadata, but I can't tell.  Any ideas what I should do next?  (Note that I *did* change it to manual mode because my phone doesn't have 30G of storage :)+"""]]
+ doc/Android/oldcomments/comment_24_7ab509c25243009bfbffd796ec64e77b._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://afoolishmanifesto.com/"+ nickname="frioux"+ subject="comment 24"+ date="2013-07-18T11:35:06Z"+ content="""+ok, it eventually got the details from the remote server, but now I'm getting some other oddities.  here is some of my log that shows what I am running into++Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:22:46 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:23:19 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:24:28 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory) (scanning...) [2013-07-18 06:24:31 CDT] Watcher: Performing startup scan Watcher crashed: addWatch: does not exist (No such file or directory) [2013-07-18 06:25:44 CDT] Watcher: warning Watcher crashed: addWatch: does not exist (No such file or directory)+"""]]
+ doc/Android/oldcomments/comment_25_026d1a01d5753d71ac3dfc002f2a5eec._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnRfQArYOmDd7r2DC7DkIJFOQgqXCVcAeU"+ nickname="Frew"+ subject="comment 25"+ date="2013-07-18T13:14:46Z"+ content="""+frioux here (something messed up with myopenid or something)++So I deleted the repo on my phone (via the CLI since the web app seemed hung) and recreated it; this time making sure that I set things to manual mode ASAP.  It didn't have the problem it was having before, but now what seems to have happened is that it fetches from the remote, commits to the local repo, and then immediately fetches and commits again.  It looks like it's about a 4s repeat loop.  Any ideas what I should do next?+"""]]
+ doc/Android/oldcomments/comment_26_f0a044fb649d43e32c96b08edbc336c3._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.0.140"+ subject="comment 26"+ date="2013-07-18T17:07:27Z"+ content="""+@Frew, you should file bug reports when you have a bug.++One problem you mentioned had already had a bug report filed by someone+else:+<http://git-annex.branchable.com/bugs/Watcher_crashed:_addWatch:_does_not_exist/> So you can post your details there.+"""]]
+ doc/Android/oldcomments/comment_27_6b9ae35b1ceeba14cd7a74e142870705._comment view
@@ -0,0 +1,34 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnaH44G3QbxBAYyDwy0PbvL0ls60XoaR3Y"+ nickname="Nigel"+ subject="Watcher crashed in Android on /storage/sdcard1 - bug?"+ date="2013-07-29T11:50:46Z"+ content="""+In webapp UI, added on first install, the location for repository: /storage/sdcard1++!warning++Watcher crashed: addWatch:++permission denied (Permission denied)++[Restart Thread]++:Performing startup scan+++In terminal Window 1:++nex webapp                                         <++  Detected a crippled filesystem.++  Enabling direct mode.++  Detected a filesystem without fifo support.++  Disabling ssh connection caching.+++Android 4.1.1 Huawei Y300 Annex.apk v1.0.52 version 4.20130723+"""]]
+ doc/Android/oldcomments/comment_28_c91db1215f529aa68bfb0576c3c5eddc._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="Jonathan"+ ip="63.131.117.194"+ subject="link busybox: Read-only file system"+ date="2013-07-29T20:08:12Z"+ content="""+Phone: HTC EVO 3d 4g+Model Number: pg86100+Android Version: 4.0.3+"""]]
+ doc/Android/oldcomments/comment_2_c2422b7dd9d526b3616e49f48cf178c2._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 2"+ date="2013-05-17T22:28:34Z"+ content="""+The Android app works on many non-rooted Android systems.++The \"link busybox: Read-only file system\" means that `/data/data/ga.androidterm/lib/lib.busybox.so` cannot be hard linked to `/data/data/ga.androidterm/busybox`. That's not normal. I'd appreciate if you could provide more information on your Android device, like Android version and model number.+"""]]
+ doc/Android/oldcomments/comment_3_0e4980c27b13dbc28477c02a82898248._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="Follow-up information on my system"+ date="2013-05-18T01:23:28Z"+ content="""+Sorry for the delay:  my android is stock Samsung-tuned Jelly beans.+Android 4.1.2+Baseband version N7000XXLSO++not sure if that would be of any use :-/  nothing in the logs (aLogcat) if I filter by annex -- should there any debug output? what should be a key to search by?+++"""]]
+ doc/Android/oldcomments/comment_4_86f7b5444e2eaea7f8f7b9160f671a1d._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnu1NYw8UF-NoDbKu8YKVGxi8FoZLH7JPs"+ nickname="Chris"+ subject="Not starting browser on Nexus 7, Android 4.2.2"+ date="2013-05-19T14:04:28Z"+ content="""+I just tried to run this on my Nexus 7 which has Android 4.2.2, and I received the following: <http://hodapple.com/files/Screenshot_2013-05-19-09-49-53.png> <http://hodapple.com/files/git-annex-error.txt>++In spite of that, though, the URL provided still worked.+"""]]
+ doc/Android/oldcomments/comment_5_9d78009435736a178d5a3f5a9bc0ed6a._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 5"+ date="2013-05-19T19:46:14Z"+ content="""+@Chris, that is a known bug: [[bugs/Android_app_permission_denial_on_startup]]+"""]]
+ doc/Android/oldcomments/comment_6_7b9523ddb20dc4a929e556c3ed0c7406._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 6"+ date="2013-05-19T20:06:56Z"+ content="""+@yarikoptic, there is a process you can perform that will help me determine what's going on.++You should be able to get the git-annex app to let you into a shell. You can do this by starting the app, and then going into its configuration menu, to Preferences, selecting \"Command Line\", and changing it to run \"/system/bin/sh\"++Then when you open a new window in the git-annex app, you'll be at a shell prompt. From there, you can run:++ls -ld /data/data/ga.androidterm++I'm interested to know a) whether the directory exists and b) what permissions and owner it has. On my tablet, I get back \"drwxr-x--x app_39 app_39\" .. and if I run `id` in the shell, it tells me it's running as `app_39`.++My guess is the directory probably does exist, but cannot be written to by the app. If you're able to verify that, the next step will be to investigate if there is some other directory that the app can write to. It needs to be able to write to someplace that is not on the `/sdcard` to install itself.+"""]]
+ doc/Android/oldcomments/comment_7_a56628a622da752806c42c5b8b54ceef._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwjBDXkP9HAQKhjTgThGOxUa1B99y_WRA"+ nickname="Franck"+ subject="Link issue"+ date="2013-05-22T12:01:38Z"+ content="""+Hi, I have exactly the same problem with the link that fails on my phone. However, I checked the permissions and they are as you describe on your tablet (except for the app number). At the same time, everything is fine on my tablet... The phone runs an old Cyanogenmod 7.2.0 (Android 2.3.7) while the tablet is a more recent Asus TF700T (Android 4.1.1). Let me know if you want me to run tests.+"""]]
+ doc/Android/oldcomments/comment_8_19656ec99b8f6aa64c1d01a3c9ae9bd0._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="why ln failed"+ date="2013-05-23T13:27:39Z"+ content="""+Finally got to check it out:  so indeed hardlinking fails but not because of permissions but \"link failed Cross-device link\"  that lib is -> /mnt/asec/ga.androidterm-1/lib  which resides on a different partition (vfat, /dev/block/dm-2, ro) from /data (ext4, /dev/block/mmcblk0p10)+"""]]
+ doc/Android/oldcomments/comment_9_55e703ae105d0c0ee9ac50df8cc59dfb._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 9"+ date="2013-05-23T18:44:46Z"+ content="""+@yarikoptic you said before the error was \"Read-only file system\". Now you're saying it's \"Cross-device link\". I'm slightly confused.++I've reworked the android app to not need any hard links. Try the current autobuild: <http://downloads.kitenet.net/git-annex/autobuild/android/git-annex.apk>+"""]]
+ doc/android/DCIM.png view

binary file changed (absent → 95786 bytes)

+ doc/android/appinstalled.png view

binary file changed (absent → 16805 bytes)

+ doc/android/apps.png view

binary file changed (absent → 53971 bytes)

+ doc/android/install.png view

binary file changed (absent → 55106 bytes)

+ doc/android/newwindow.png view

binary file changed (absent → 1009 bytes)

+ doc/android/terminal.png view

binary file changed (absent → 20565 bytes)

+ doc/android/webapp.png view

binary file changed (absent → 64097 bytes)

+ doc/assistant.mdwn view
@@ -0,0 +1,42 @@+The git-annex assistant creates a synchronised folder on each of your+OSX and Linux  computers, Android devices, removable drives, and+cloud services. The contents of the folder are the same everywhere.+It's very easy to use, and has all the power of git and git-annex.++## installation++The git-annex assistant comes as part of git-annex. +See [[install]] to get it installed.++See the [[release_notes]] for an overview of the status, and upgrade+instructions.++## intro screencast++[[!inline feeds=no template=bare pages=videos/git-annex_assistant_introduction]]++## documentation++* [[Basic usage|quickstart]]+* [[Android documentation|/Android]]+* Want to make two nearby computers share the same synchronised folder?  +  Follow the [[local_pairing_walkthrough]].+* Or perhaps you want to share files between computers in different+  locations, like home and work?  +  Follow the [[remote_sharing_walkthrough]].+* Want to share a synchronised folder with a friend?  +  Follow the [[share_with_a_friend_walkthrough]].+* Want to archive data to a drive or the cloud?  +  Follow the [[archival_walkthrough]].++## colophon++The git-annex assistant is being+[crowd funded on+Kickstarter](http://www.kickstarter.com/projects/joeyh/git-annex-assistant-like-dropbox-but-with-your-own/).+[[/assistant/Thanks]] to all my backers. This kickstarter is now closed, and there is a new home-made crowdfunding project to support the project for 2013-2014 [here](https://campaign.joeyh.name/).++I blog about my work on the git-annex assistant on a daily basis+in [[this_blog|design/assistant/blog]]. Follow along!++See also: The [[design|/design/assistant]] pages.
+ doc/assistant/addsshserver.png view

binary file changed (absent → 31740 bytes)

+ doc/assistant/archival_walkthrough.mdwn view
@@ -0,0 +1,32 @@+Normally, the git-annex assistant makes your files be available+wherever you use it, and so a copy of each file is stored in each repository.+That's perfect for files you're using right now, but what about files you're+not using any more?++You could just delete those files, but it's better to archive them, so+you can access them later. All you need to get started archiving your old+files is a USB drive, or an [Amazon Glacier](http://aws.amazon.com/glacier/)+account.++The webapp makes it easy to make a repository on either a USB drive,+or on Amazon Glacier. Once the repository is created, be sure to+put it in either the small archive, or full archive repository group.++[[!img repogroups.png]]++Now when you're done with a file, just move it into a directory named+"archive". The assistant will notice you put it there, and next time it+has the opportunity (when you plug in the USB drive, or when it can+talk to Amazon Glacier over the network), will move the file's+content to your archive repository.++You'll no longer be able to open the file once it's been archived.+If you later want to access it, you can just copy or move it out+of the archive directory, and the assistant will retrieve its+content from the archive.++Note that retrieving data from Amazon Glacier takes 4 to 5 hours.++### screencast++[[!inline feeds=no template=bare pages=videos/git-annex_assistant_archiving]]
+ doc/assistant/brokenrepositoryalert.png view

binary file changed (absent → 5806 bytes)

+ doc/assistant/buddylist.png view

binary file changed (absent → 4347 bytes)

+ doc/assistant/cloudnudge.png view

binary file changed (absent → 7332 bytes)

+ doc/assistant/combinerepos.png view

binary file changed (absent → 10677 bytes)

+ doc/assistant/comment_1_f2c4857b7b000e005f0c19279db14eaf._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkYrMBMTCEFUKskhWGD-1pzcw2ITshsi_8"+ nickname="Robert"+ subject="Annex on OS X 10.6"+ date="2013-06-04T23:10:03Z"+ content="""+I really hope they can get annex working on os x 10.6.  This is a great effort.  Thanks +"""]]
+ doc/assistant/comment_2_befa1f48e5a43a7965060491430a6bc4._comment view
@@ -0,0 +1,9 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawl9smfyJFgp3f2WjqqZWY6b7vo5eZv7GGQ"+ nickname="Bryan"+ subject="Ooh.  Do want on Windows"+ date="2013-07-03T20:44:05Z"+ content="""+Sadly, I didn't know about this when the Kickstarter was underway - I'd be happy to chip in $100 if it means I can get annex assistant on Windows earlier.++"""]]
+ doc/assistant/controlmenu.png view

binary file changed (absent → 8863 bytes)

+ doc/assistant/crashrecovery.png view

binary file changed (absent → 6594 bytes)

+ doc/assistant/dashboard.png view

binary file changed (absent → 41061 bytes)

+ doc/assistant/deleterepository.png view

binary file changed (absent → 22780 bytes)

+ doc/assistant/encryptdrive.png view

binary file changed (absent → 42725 bytes)

+ doc/assistant/example.png view

binary file changed (absent → 110994 bytes)

+ doc/assistant/fsckconfig.png view

binary file changed (absent → 59050 bytes)

+ doc/assistant/genkey.png view

binary file changed (absent → 27854 bytes)

+ doc/assistant/iaitem.png view

binary file changed (absent → 34868 bytes)

+ doc/assistant/inotify_max_limit_alert.png view

binary file changed (absent → 12583 bytes)

+ doc/assistant/local_pairing_walkthrough.mdwn view
@@ -0,0 +1,90 @@+So you have two computers in the same building, and you want them to share+the same synchronised folder, communicating directly with each other.++This is incredibly easy to set up with the git annex assistant.++Let's say the two computers are your computer and your friend's computer.+We'll start on your computer, where you open up your git annex dashboard.++[[!img addrepository.png alt="Add another repository button"]]++`*click*`++[[!img pairing.png alt="Pair with another computer"]]++`*click*`++Now the hard bit. You have to think up a secret phrase, and type it in,+(and perhaps get the spelling correct).++[[!img secret.png alt="Enter secret phrase"]]++Now your computer is in pairing mode. When your friend looks at her git+annex dashboard, she sees something like this.++[[!img pairrequest.png alt="Pair request"]]++`*click*`++[[!img secretempty.png alt="Enter same secret phrase"]]++Now it's up to you to let her know what the secret is. As soon as she+enters it, both your computers will be paired, and will begin to sync their+git-annex folders. Just like that you can share files.++----++## Requirements++For local pairing to work, you must have sshd (ssh server daemon) installed and working on all machines involved. That means you must allow at least local connections to sshd. On most Linux distributions, sshd is packaged in either openssh (openSUSE) or openssh-server (Debian). ++It is highly recommended that you disable root login, disable password login to sshd and just enable key based authentication instead. No one will be able to login without your key.++To disable root, after installing sshd, edit the sshd config (usually /etc/ssh/sshd_config file) and disable root login by adding:++    PermitRootLogin no++Restart sshd. See man sshd_config for details.++To disable password login and enable key based authentication, edit the sshd config (just like above) by uncommenting and changing the following options:++    ChallengeResponseAuthentication no+    PasswordAuthentication no+    UsePAM no+    +    PubkeyAuthentication yes++Restart sshd. See man sshd_config for details.++You can also restrict login to your local network only (not allow internet users from trying to log into your computer). Edit the hosts.deny file (usually /etc/hosts.deny) by adding the following:++    sshd : ALL EXCEPT LOCAL++Do note that restricting login to your local network may or may not block git-annex. Also note that this will not work on Mac OSX because Apple decided to disable this feature and replace it with a crippled version made by Apple.++## Tips++Something to keep in mind, especially if pairing doesn't seem to be+working, is that the two computers need to be on the same network for this+pairing process to work. Sometimes a building will have more than one+network inside it, and you'll need to connect them both to the same one.+Make sure the wireless network name is the same, or that they're both+plugged into the same router.++Also, the file sharing set up by this pairing only works when both+computers are on the same network. If you go on a trip, any files you+edit will not be visible to your friend until you get back. ++To get around this, you'll often also want to set up+[[jabber_pairing|share_with_a_friend_walkthrough]], and a server+in the cloud, which they can use to exchange files while away.++And also, you can pair with as many other computers as you like, not just+one!++## What does pairing actually do behind the scenes?++It ensures that both repositories have correctly configured +[[remotes|walkthrough/adding_a_remote]] pointing to each other.+If you have already configured this manually, you do not need to+perform pairing.
+ doc/assistant/local_pairing_walkthrough/addrepository.png view

binary file changed (absent → 2259 bytes)

+ doc/assistant/local_pairing_walkthrough/pairing.png view

binary file changed (absent → 6771 bytes)

+ doc/assistant/local_pairing_walkthrough/pairrequest.png view

binary file changed (absent → 5383 bytes)

+ doc/assistant/local_pairing_walkthrough/secret.png view

binary file changed (absent → 5132 bytes)

+ doc/assistant/local_pairing_walkthrough/secretempty.png view

binary file changed (absent → 9575 bytes)

+ doc/assistant/logs.png view

binary file changed (absent → 33631 bytes)

+ doc/assistant/makerepo.png view

binary file changed (absent → 32061 bytes)

+ doc/assistant/menu.png view

binary file changed (absent → 22921 bytes)

+ doc/assistant/osx-app.png view

binary file changed (absent → 2604 bytes)

+ doc/assistant/preferences.png view

binary file changed (absent → 22815 bytes)

+ doc/assistant/quickstart.mdwn view
@@ -0,0 +1,30 @@+## first run++To get started with the git-annex assistant, just pick it from+your system's list of applications.++[[!img assistant/menu.png]]+[[!img assistant/osx-app.png]]++It'll prompt you to set up a folder:++[[!img assistant/makerepo.png]]++Then any changes you make to its folder will automatically be committed to+git, and synced to repositories on other computers. You can use the+interface to add repositories and control the git-annex assistant.++[[!img assistant/running.png]]++## starting on boot++The git-annex assistant will automatically be started when you log in to+desktop environments like Mac OS X, Gnome, XFCE, and KDE, and the menu item+shown above can be used to open the webapp. On other systems, you may need+to start it by hand.++To start the webapp, run `git annex webapp` at the command line.++To start the assistant without opening the webapp, +you can run the command "git annex assistant --autostart". This is a+good thing to configure your system to run automatically when you log in.
+ doc/assistant/release_notes.mdwn view
@@ -0,0 +1,352 @@+## version 4.20131002++Now you can use the webapp to set up an encrypted git repository on a+remote ssh server, or on rsync.net, and use it as a live cloud backup. Or,+use the webapp to make an encrypted git repository on a removable drive,+and store it offsite as a secure backup.++## version 4.20130920++This release is the first to support fully encrypted git repositories+stored on removable drives. This can be set up easily using the webapp.++## version 4.20130909++This release fixes a crash that could occur when using XMPP with the+assitant. It has only been seen on OS X so far. The bug is not believed to+be explitable, but upgrading is still recommended.++## version 4.20130802++This release fixes several bugs, including a reversion introduced in the last+version that broke direct mode on Windows, Android, and other crippled+filesystems. It contains a workaround for a bug in recent git pre-releases+that broke handling of filenames containing spaces.+It is a highly recommended upgrade.++The webapp can now detect repositories that did not finish getting properly set+up, and can recover from one common bug that broke local pairing and remote+ssh server setups on systems using `ssh-agent`.++## version 4.20130723++This release fixes some bugs. Notably it fixes a bug that could result in data+loss when adding a tarball of a git-annex repository to your git-annex+repository.++Rsync.net have committed to support git-annex and offer a special+discounted rate for git-annex users.+<http://www.rsync.net/products/git-annex-pricing.html>++## version 4.20130709++This release is mostly bug fixes.++One of the bugs involved setting up rsync remotes on servers other than+rsync.net. The wrong `.ssh/authorized_keys` line was deployed to the+remote server. If you set up a rsync remote with a past release, and it does+not work, you will need to manually edit the `.ssh/authorized_keys` file,+and remove the `command=` forced command.++## version 4.20130621, 4.20130627++These releases mostly consist of bug fixes.++## version 4.20130601++This is a bugfix release, featuring significant XMPP improvements and+more robustness thanks to automated fuzz testing. Recommended upgrade.++This version changes its XMPP protocol, so it will fail to sync with older+git-annex versions over XMPP.++## version 4.20130521++This is a bugfix release. Recommended upgrade.++## version 4.20130516++This version contains numerous bug fixes, and improvements.++This is the first release with a fully usable Android app. No command-line+typing needed to set up syncing to your Android phone or tablet!+A few of the more advanced features may not work (or not work reliably)+on Android. The Android app is still beta quality.++This is also the first release with a Windows port! The Windows port+is in an alpha quality state, and is missing many features.+It does not yet include the assistant.++## version 4.20130501++This version contains numerous bug fixes, and improvements.++## version 4.20130417++This version contains numerous bug fixes, and improvements.++One bug that was fixed can affect users of gnome-keyring who+have set up remote repositories on ssh servers using the webapp.+The gnome-keyring may load the restricted key that is set up+for that, and make it be used for regular logins to the server;+with the result that you'll get an error message about "git-annex-shell"+when sshing to the server. ++If you experience this problem you can fix it by+moving `.ssh/key.git-annex*` to `.ssh/git-annex/` (creating+that directory first), and edit `.ssh/config` to reflect the new+location of the key. You will also need to restart gnome-keyring.++Another change relates to files in `archive/` directories. Client repositories+now sync these files between themselves like any other files, until+the files reach an archive repository. Only then are they removed from+the client repositories. So you need to ensure you have at least one+archive repository if you want to use the `archive/` directory feature.++## version 4.20130323, 4.20130405++These versions continue fixing bugs and adding features.++## version 4.20130314++This version makes a great many improvements and bugfixes, and is+a recommended upgrade.++If you have already used the webapp to locally pair two computers,+a bug caused the paired repository to not be given an appropriate cost.+To fix this, go into the Repositories page in the webapp, and drag the+repository for the locally paired computer to come before any repositories+that it's more expensive to transfer data to.++## version 4.20130227++This release fixes a bug with globbing that broke preferred content expressions.+So, it is a recommended upgrade from the previous release, which introduced+that bug.++In this release, the assistant is fully working on Android, although+it must be set up using the command line.++Repositories can now be placed on filesystems that lack support for symbolic+links; FAT support is complete.++## version 3.20130216++This adds a port to Android. Only usable at the command line so far;+beta qualitty.++Also a bugfix release, and improves support for FAT.++The following are known limitations of this release of the git-annex+assistant:++* No Android app yet.+* On BSD operating systems (but not on OS X), the assistant uses kqueue to+  watch files. Kqueue has to open every directory it watches, so too many+  directories will run it out of the max number of open files (typically+  1024), and fail. See [[this_bug|bugs/Issue_on_OSX_with_some_system_limits]]+  for a workaround.+* Also on systems with kqueue, modifications to existing files in direct+  mode will not be noticed.++## version 3.20130107, 3.20130114, 3.20130124, 3.20130207++These are bugfix releases.++## version 3.20130102++This release makes several significant improvements to the git-annex+assistant, which is still in beta.++The main improvement is direct mode. This allows you to directly edit files+in the repository, and the assistant will automatically commit and sync+your changes. Direct mode is the default for new repositories created+by the assistant. To convert your existing repository to use direct mode,+manually run `git annex direct` inside the repository.++## version 3.20121211++This release of the git-annex assistant (which is still in beta)+consists of mostly bugfixes, user interface improvements, and improvements+to existing features.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* Using Box.com's 5 gigabytes of free storage space as a cloud transfer+  point between between repositories that cannot directly contact+  one-another. (Many other cloud providers are also supported, from Rsync.net+  to Amazon S3, to your own ssh server.)+* Archiving or backing up files to Amazon Glacier. See [[archival_walkthrough]].+* [[Sharing repositories with friends|share_with_a_friend_walkthrough]]+  contacted through a Jabber server (such as Google Talk).+* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+  network (or VPN) and automatically keeping the files in the annex in+  sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+  will notice when the drive is mounted and keep it in sync.+  Such a drive can be stored as an offline backup, or transported between+  computers to keep them in sync.++The following are known limitations of this release of the git-annex+assistant:++* The Max OSX standalone app may not work on all versions of Max OSX.+  Please test!+* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+  files. Kqueue has to open every directory it watches, so too many+  directories will run it out of the max number of open files (typically+  1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+  for a workaround.++## version 3.20121126++This adds several features to the git-annex assistant, which is still in beta.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* Using Box.com's 5 gigabytes of free storage space as a cloud transfer+  point between between repositories that cannot directly contact+  one-another. (Many other cloud providers are also supported, from Rsync.net+  to Amazon S3, to your own ssh server.)+* Archiving or backing up files to Amazon Glacier.+* [[Sharing repositories with friends|share_with_a_friend_walkthrough]]+  contacted through a Jabber server (such as Google Talk).+* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+  network (or VPN) and automatically keeping the files in the annex in+  sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+  will notice when the drive is mounted and keep it in sync.+  Such a drive can be stored as an offline backup, or transported between+  computers to keep them in sync.++The following are known limitations of this release of the git-annex+assistant:++* The Max OSX standalone app does not work on all versions of Max OSX.+* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+  files. Kqueue has to open every directory it watches, so too many+  directories will run it out of the max number of open files (typically+  1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+  for a workaround.+* Retrieval of files from Amazon Glacier is not fully automated; the+  assistant does not automatically retry in the 4 to 5 hours period +  when Glacier makes the files available.++## version 3.20121112++This is a major upgrade of the git-annex assistant, which is still in beta.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* [[Sharing repositories with friends|share_with_a_friend_walkthrough]]+  contacted through a Jabber server (such as Google Talk).+* Setting up cloud repositories, that are used as backups, archives,+  or transfer points between repositories that cannot directly contact+  one-another.+* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+  network (or VPN) and automatically keeping the files in the annex in+  sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+  will notice when the drive is mounted and keep it in sync.+  Such a drive can be stored as an offline backup, or transported between+  computers to keep them in sync.++The following upgrade notes apply if you're upgrading from a previous version:++* For best results, edit the configuration of repositories you set+  up with older versions, and place them in a repository group.+  This lets the assistant know how you want to use the repository; for backup,+  archival, as a transfer point for clients, etc. Go to Configuration -&gt;+  Manage Repositories, and click in the "configure" link to edit a repository's+  configuration.+* If you set up a cloud repository with an older version, and have multiple+  clients using it, you are recommended to configure an Jabber account,+  so that clients can use it to communicate when sending data to the+  cloud repository. Configure Jabber by opening the webapp, and going to+  Configuration -&gt; Configure jabber account+* When setting up local pairing, the assistant did not limit the paired+  computer to accessing a single git repository. This new version does,+  by setting GIT_ANNEX_SHELL_DIRECTORY in `~/.ssh/authorized_keys`.++The following are known limitations of this release of the git-annex+assistant:++* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+  files. Kqueue has to open every directory it watches, so too many+  directories will run it out of the max number of open files (typically+  1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+  for a workaround.++## version 3.20121009++This is a maintenance release of the git-annex assistant, which is still in+beta.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+  network (or VPN) and automatically keeping the files in the annex in+  sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+  will notice when the drive is mounted and keep it in sync.+  Such a drive can be stored as an offline backup, or transported between+  computers to keep them in sync.+* Cloning your repository to a remote server, running ssh, and uploading+  changes made to your files to the server. There is special support+  for using the rsync.net cloud provider this way, or any shell account+  on a typical unix server, such as a Linode VPS can be used.++The following are known limitations of this release of the git-annex+assistant:++* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+  files. Kqueue has to open every directory it watches, so too many+  directories will run it out of the max number of open files (typically+  1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+  for a workaround.+* In order to ensure that all multiple repositories are kept in sync,+  each computer with a repository must be running the git-annex assistant.+* The assistant does not yet always manage to keep repositories in sync+  when some are hidden from others behind firewalls.++## version 3.20120924++This is the first beta release of the git-annex assistant.++In general, anything you can configure with the assistant's web app+will work. Some examples of use cases supported by this release include:++* [[Pairing|local_pairing_walkthrough]] two computers that are on the same local+  network (or VPN) and automatically keeping the files in the annex in+  sync as changes are made to them.+* Cloning your repository to removable drives, USB keys, etc. The assistant+  will notice when the drive is mounted and keep it in sync.+  Such a drive can be stored as an offline backup, or transported between+  computers to keep them in sync.+* Cloning your repository to a remote server, running ssh, and uploading+  changes made to your files to the server. There is special support+  for using the rsync.net cloud provider this way, or any shell account+  on a typical unix server, such as a Linode VPS can be used.++The following are known limitations of this release of the git-annex+assistant:++* On Mac OSX and BSD operating systems, the assistant uses kqueue to watch+  files. Kqueue has to open every directory it watches, so too many+  directories will run it out of the max number of open files (typically+  1024), and fail. See [[bugs/Issue_on_OSX_with_some_system_limits]]+  for a workaround.+* In order to ensure that all multiple repositories are kept in sync,+  each computer with a repository must be running the git-annex assistant.+* The assistant does not yet always manage to keep repositories in sync+  when some are hidden from others behind firewalls.+* If a file is checked into git as a normal file and gets modified+  (or merged, etc), it will be converted into an annexed file. So you+  should not mix use of the assistant with normal git files in the same+  repository yet.+* If you `git annex unlock` a file, it will immediately be re-locked.+  See [[bugs/watcher_commits_unlocked_files]].
+ doc/assistant/remote_sharing_walkthrough.mdwn view
@@ -0,0 +1,12 @@+So you have two computers that are not in the same place, and you want them+to share the same synchronised folder, communicating directly with each other.++[[!inline feeds=no template=bare pages=videos/git-annex_assistant_remote_sharing]]++You can add even more computers using the same method shown here.++----++If you have a laptop that is sometimes near another computer, you can+speed up file transfers when it is by also connecting it using the+[[local_pairing_walkthrough]].
+ doc/assistant/repairrepository.png view

binary file changed (absent → 31791 bytes)

+ doc/assistant/repogroups.png view

binary file changed (absent → 15636 bytes)

+ doc/assistant/repoinfo.png view

binary file changed (absent → 7603 bytes)

+ doc/assistant/repositories.png view

binary file changed (absent → 63405 bytes)

+ doc/assistant/rsync.net.encryption.png view

binary file changed (absent → 40504 bytes)

+ doc/assistant/rsync.net.png view

binary file changed (absent → 61465 bytes)

+ doc/assistant/running.png view

binary file changed (absent → 24664 bytes)

+ doc/assistant/share_with_a_friend_walkthrough.mdwn view
@@ -0,0 +1,58 @@+Want to share all the files in your repository with a friend?++Let's suppose you use Google Mail, and so does your friend, and you+sometimes also chat in Google Talk. The git-annex assistant will+use your Google account to share with your friend. (This actually+works with any Jabber account you use, not just Google Talk.)++Start by opening up your git annex dashboard.++[[!img local_pairing_walkthrough/addrepository.png alt="Add another repository button"]]++`*click*`++[[!img pairing.png alt="Share with a friend"]]++`*click*`++[[!img xmpp.png alt="Configuring Jabber account"]]++Fill that out, and git-annex will be able to show you a list of your+friends.++[[!img buddylist.png alt="Buddy list"]]++This list will refresh as friends log on and off, so you can+leave it open in a tab until a friend is available to start pairing.++(If your friend is not using git-annex yet, now's a great time to spread+the word!)++Once you click on "Start Pairing", your friend will see this pop up+on their git annex dashboard.++[[!img xmppalert.png alt="Pair request"]]++Once your friend clicks on that, your repositories will be paired.++### But, wait, there's one more step...++Despite the repositories being paired now, you and your friend can't yet+quite share files. You'll start to see your friend's files show up in your+git-annex folder, but you won't be able to open them yet.++What you need to do now is set up a repository out there in the cloud,+that both you and your friend can access. This will be used to transfer+files between the two of you.++At the end of the pairing process, a number of cloud providers are+suggested, and the git-annex assistant makes it easy to configure one of+them. Once you or your friend sets it up, it'll show up in the other+one's list of repositories:++[[!img repolist.png alt="Repository list"]]++The final step is to share the login information for the cloud repository+with your friend, so they can enable it too.++With that complete, you'll be able to open your friend's files!
+ doc/assistant/share_with_a_friend_walkthrough/buddylist.png view

binary file changed (absent → 5114 bytes)

+ doc/assistant/share_with_a_friend_walkthrough/pairing.png view

binary file changed (absent → 6892 bytes)

+ doc/assistant/share_with_a_friend_walkthrough/repolist.png view

binary file changed (absent → 8525 bytes)

+ doc/assistant/share_with_a_friend_walkthrough/xmppalert.png view

binary file changed (absent → 4070 bytes)

+ doc/assistant/thanks.mdwn view
@@ -0,0 +1,243 @@+The development of the git-annex assistant was made possible by the+generous donations of many people. I want to say "Thank You!" to each of+you individually, but until I meet all 951 of you, this page will have to+do. You have my most sincere thanks. --[[Joey]]++(If I got your name wrong, or you don't want it publically posted here,+email <joey@kitenet.net>.)++## Major Backers++These people are just inspiring in their enthusiasm and generosity to this+project.++* Jason Scott+* strager++## Beta Testers++Whole weeks of my time were made possible thanks to each of these+people, and their testing is invaluable to the development of+the git-annex assistant.++* Jimmy Tang+* David Pollak+* Pater+* Francois Marier+* Paul Sherwood+* Fred Epma+* Robert Ristroph+* Josh Triplett+* David Haslem+* AJ Ashton+* Svenne Krap+* Drew Hess+* Peter van Westen++## Prioritizers++These forward-thinking people contributed generously just to help+set my priorities in which parts of the git-annex assistant were most+important to develop.++Paul C. Bryan, Paul Tötterman, Don Marti, Dean Thompson, Djoume, David Johnston+Asokan Pichai, Anders Østhus, Dominik Wagenknecht, Charlie Fox, Yazz D. Atlas,+fenchel, Erik Penninga, Richard Hartmann, Graham, Stan Yamane, Ben Skelton,+Ian McEwen, asc, Paul Tagliamonte, Sherif Abouseda, Igor Támara, Anne Wind,+Mesar Hameed, Brandur K. Holm Petersen, Takahiro Inoue, Kai Hendry,+Stephen Youndt, Lee Roberson, Ben Strawbridge, Andrew Greenberg, Alfred Adams+Andrew, Aaron De Vries, Monti Knazze, Jorge Canseco, Hamish, Mark Eichin,+Sherif Abouseda, Ben Strawbridge, chee rabbits, Pedro Côrte-Real++And special thanks to Kevin McKenzie, who also gave me a login to a Mac OSX+machine, which has proven invaluable, Jimmy Tang who has helped+with Mac OSX autobuilding and packaging, and Yury V. Zaytsev who+provides the Windows autobuilder.++## Other Backers++Most of the success of the Kickstarter is thanks to these folks. Some of+them spent significant amounts of money in the guise of getting some+swag. For others, being listed here, and being crucial to making the +git-annex assistant happen was reward enough. Large or small, these+contributions are, literally, my bread and butter this year.++Amitai Schlair, mvime, Romain Lenglet, James Petts, Jouni Uuksulainen,+Wichert Akkerman, Robert Bellus, Kasper Souren, rob, Michiel Buddingh',+Kevin, Rob Avina, Alon Levy, Vikash, Michael Alan Dorman, Harley Pig,+Andreas Olsson, Pietpiet, Christine Spang, Liz Young, Oleg Kosorukov,+Allard Hoeve, Valentin Haenel, Joost Baaij, Nathan Yergler, Nathan Howell,+Frédéric Schütz, Matti Eskelinen, Neil McGovern, Lane Lillquist, db48x,+Stuart Prescott, Mark Matienzo, KarlTheGood, leonm, Drew Slininger, +Andreas Fuchs, Conrad Parker, Johannes Engelke, Battlegarden, Justin Kelly,+Robin Wagner, Thad Ward, crenquis, Trudy Goold, Mike Cochrane, Adam Venturella,+Russell Foo, furankupan, Giorgio Occhioni, andy, mind, Mike Linksvayer,+Stefan Strahl, Jelmer Vernooij, Markus Fix, David Hicks, Justin Azoff,+Iain Nicol, Bob Ippolito, Thomas Lundstrøm, Jason Mandel, federico2,+Edd Cochran, Jose Ortega, Emmett Agnew, Rudy Garcia, Kodi, Nick Rusnov,+Michael Rubin, Tom de Grunt, Richard Murray, Peter, Suzanne Pierce, Jared+Marcotte, folk, Eamon, Jeff Richards, Leo Sutedja, dann frazier, Mikkel+kristiansen, Matt Thomas, Kilian Evang, Gergely Risko, Kristian Rumberg,+Peter Kropf, Mark Hepburn, greymont, D. Joe Anderson, Jeremy Zunker, ctebo,+Manuel Roumain, Jason Walsh, np, Shawn, Johan Tibell, Branden Tyree, Dinyar+Rabady, Andrew Mason, damond armstead, Ethan Aubin, TomTom Tommie, Jimmy+Kaplowitz, Steven Zakulec, mike smith, Jacob Kirkwood, Mark Hymers, Nathan+Collins, Asbjørn Sloth Tønnesen, Misty De Meo, James Shubin,+Jim Paris, Adam Sjøgren, miniBill, Taneli, Kumar Appaiah, Greg Grossmeier,+Sten Turpin, Otavio Salvador, Teemu Hukkanen, Brian Stengaard, bob walker,+bibeneus, andrelo, Yaroslav Halchenko, hesfalling, Tommy L, jlargentaye,+Serafeim Zanikolas, Don Armstrong, Chris Cormack, shayne.oneill, Radu+Raduta, Josh S, Robin Sheat, Henrik Mygind, kodx, Christian, Geoff+Crompton, Brian May, Olivier Berger, Filippo Gadotti, Daniel Curto-Millet,+Eskild Hustvedt, Douglas Soares de Andrade, Tom L, Michael Nacos, Michaël+P., William Roe, Joshua Honeycutt, Brian Kelly, Nathan Rasch, jorge, Martin+Galese, alex cox, Avery Brooks, David Whittington, Dan Martinez, Forrest+Sutton, Jouni K. Seppänen, Arnold Cano, Robert Beaty, Daniel, Kevin Savetz,+Randy, Ernie Braganza, Aaron Haviland, Brian Brunswick, asmw, sean, Michael+Williams, Alexander, Dougal Campbell, Robert Bacchas, Michael Lewis, Collin+Price, Wes Frazier, Matt Wall, Brandon Barclay, Derek van Vliet, Martin+DeMello, kitt hodsden, Stephen Kitt, Leif Bergman, Simon Lilburn, Michael+Prokop, Christiaan Conover, Nick Coombe, Tim Dysinger, Brandon Robinson,+Philip Newborough, keith, Mike Fullerton, Kyle, Phil Windley, Tyler Head,+George V. Reilly, Matthew, Ali Gündüz, Vasyl Diakonov, Paolo Capriotti,+allanfranta, Martin Haeberli, msingle, Vincent Sanders, Steven King, Dmitry+Gribanov, Brandon High, Ben Hughes, Mike Dank, JohnE, Diggory Hardy,+Michael Hanke, valhalla, Samuli Tuomola, Jeff Rau, Benjamin Lebsanft, John+Drago, James, Aidan Cooper, rondie, Paul Kohler, Matthew Knights, Aaron+Junod, Patrick R McDonald, Christopher Browne, Daniel Engel, John SJ+Anderson, Peter Sarossy, Mike Prasad, Christoph Ender, Jan Dittberner,+Zohar, Alexander Jelinek, stefan, Danny O'Brien, Matthew Thode, Nicole+Aptekar, maurice gaston, Chris Adams, Mike Klemencic, Reedy, Subito, Tobias+Gruetzmacher, Ole-Morten Duesund, André Koot, mp, gdop, Cole Scott, Blaker,+Matt Sottile, W. Craig Trader, Louis-Philippe Dubrule, Brian Boucheron,+Duncan Smith, Brenton Buchbach, Kyle Stevenson, Eliot Lash, Egon Elbre,+Praveen, williamji, Thomas Schreiber, Neil Ford, Ryan Pratt, Joshua Brand,+Peter Cox, Markus Engstrom, John Sutherland, Dean Bailey, Ed Summers,+Hillel Arnold, David Fiander, Kurt Yoder, Trevor Muñoz, keri, Ivan+Sergeyenko, Shad Bolling, Tal Kelrich, Steve Presley, gerald ocker, Essex+Taylor, Josh Thomson, Trevor Bramble, Lance Higgins, Frank Motta, Dirk+Kraft, soundray, Joe Haskins, nmjk, Apurva Desai, Colin Dean, docwhat,+Joseph Costello, Jst, flamsmark, Alex Lang, Bill Traynor, Anthony David,+Marc-André Lureau, AlNapp, Giovanni Moretti, John Lawrence, João Paulo+Pizani Flor, Jim Ray, Gregory Thrush, Alistair McGann, Andrew Wied,+Koutarou Furukawa, Xiscu Ignacio, Aaron Sachs, Matt, Quirijn, Chet+Williams, Chris Gray, Bruce Segal, Tom Conder, Louis Tovar, Alex Duryee,+booltox, d8uv, Decklin Foster, Rafael Cervantes, Micah R Ledbetter, Kevin+Sjöberg, Johan Strombom, Zachary Cohen, Jason Lewis, Yves Bilgeri, Ville+Aine, Mark Hurley, Marco Bonetti, Maximilian Haack, Hynek Schlawack,+Michael Leinartas, Andreas Liebschner, Duotrig, Nat Fairbanks, David+Deutsch, Colin Hayhurst, calca, Kyle Goodrick, Marc Bobillier, Robert+Snook, James Kim, Olivier Serres, Jon Redfern, Itai Tavor, Michael+Fladischer, Rob, Jan Schmid, Thomas H., Anders Söderbäck, Abhishek+Dasgupta, Jeff Goeke-Smith, Tommy Thorn, bonuswavepilot, Philipp Edelmann,+Nick, Alejandro Navarro Fulleda, Yann Lallemant, andrew brennan, +Dave Allen Barker Jr, Fabian, Lukas Anzinger, Carl Witty, Andy Taylor,+Andre Klärner, Andrew Chilton, Adam Gibbins, Alexander Wauck, Shane O'Dea,+Paul Waite, Iain McLaren, Maggie Ellen Robin Hess, Willard Korfhage,+Nicolas, Eric Nikolaisen, Magnus Enger, Philipp Kern, Andrew Alderwick,+Raphael Wimmer, Benjamin Schötz, Ana Guerrero, Pete, Pieter van der Eems,+Aaron Suggs, Fred Benenson, Cedric Howe, Lance Ivy, Tieg Zaharia, Kevin+Cooney, Jon Williams, Anton Kudris, Roman Komarov, Brad Hilton, Rick Dakan,+Adam Whitcomb, Paul Casagrande, Evgueni Baldin, Robert Sanders, Kagan+Kayal, Dean Gardiner, micah altman, Cameron Banga, Ross Mcnairn, Oscar+Vilaplana, Robin Graham, Dan Gervais, Jon Åslund, Ragan Webber, Noble Hays,+stephen brown, Sean True, Maciek Swiech, faser, eikenberry, Kai Laborenz,+Sergey Fedoseev, Chris Fournier, Svend Sorensen, Greg K, wojtek, Johan+Ribenfors, Anton, Benjamin, Oleg Tsarev, PsychoHazard, John Cochrane,+Kasper Lauritzen, Patrick Naish, Rob, Keith Nasman, zenmaster, David Royer,+Max Woolf, Dan Gabber, martin rhoads, Martin Schmidinger, Paul+Scott-Wilson, Tom Gromak, Andy Webster, Dale Webb, Jim Watson, Stephen+Hansen, Mircea, Dan Goodenberger, Matthias Fink, Andy Gott, Daniel, Jai+Nelson, Shrayas Rajagopal, Vladimir Rutsky, Alexander, Thorben Westerhuys,+hiruki, Tao Neuendorffer Flaherty, Elline, Marco Hegenberg, robert, Balda,+Brennen Bearnes, Richard Parkins, David Gwilliam, Mark Johnson, Jeff Eaton,+Reddawn90, Heather Pusey, Chris Heinz, Colin, Phatsaphong Thadabusapa,+valunthar, Michael Martinez, redlukas, Yury V. Zaytsev, Blake, Tobias+"betabrain" A., Leon, sopyer, Steve Burnett, bessarabov, sarble, krsch.com,+Jack Self, Jeff Welch, Sam Pettiford, Jimmy Stridh, Diego Barberá, David+Steele, Oscar Ciudad, John Braman, Jacob, Nick Jenkins, Ben Sullivan, Brian+Cleary, James Brosnahan, Darryn Ten, Alex Brem, Jonathan Hitchcock, Jan+Schmidle, Wolfrzx99, Steve Pomeroy, Matthew Sitton, Finkregh, Derek Reeve,+GDR!, Cory Chapman, Marc Olivier Chouinard, Andreas Ryland, Justin, Andreas+Persenius, Games That Teach, Walter Somerville, Bill Haecker, Brandon+Phenix, Justin Shultz, Colin Scroggins, Tim Goddard, Ben Margolin, Michael+Martinez, David Hobbs, Andre Le, Jason Roberts, Bob Lopez, Gert Van Gool,+Robert Carnel, Anders Lundqvist, Aniruddha Sathaye, Marco Gillies, Basti+von Bejga, Esko Arajärvi, Dominik Deobald, Pavel Yudaev, Fionn Behrens,+Davide Favargiotti, Perttu Luukko, Silvan Jegen, Marcelo Bittencourt,+Leonard Peris, smercer, Alexandre Dupas, Solomon Matthews, Peter Hogg,+Richard E. Varian, Ian Oswald, James W. Sarvey, Ed Grether, Frederic+Savard, Sebastian Nerz, Hans-Chr. Jehg, Matija Nalis, Josh DiMauro, Jason+Harris, Adam Byrtek, Tellef, Magnus, Bart Schuurmans, Giel van Schijndel,+Ryan, kiodos, Richard 'maddog' Collins, PawZubr, Jason Gassel, Alex+Boisvert, Richard Thompson, maddi bolton, csights, Aaron Bryson, Jason Chu,+Maxime Côté, Kineteka Systems, Joe Cabezas, Mike Czepiel, Rami Nasra,+Christian Simonsen, Wouter Beugelsdijk, Adam Gibson, Gal Buki, James+Marble, Alan Chambers, Bernd Wiehle, Simon Korzun, Daniel Glassey, Eero af+Heurlin, Mikael, Timo Engelhardt, Wesley Faulkner, Jay Wo, Mike Belle,+David Fowlkes Jr., Karl-Heinz Strass, Ed Mullins, Sam Flint,+Hendrica, Mark Emer Anderson, Joshua Cole, Jan Gondol, Henrik Lindhe,+Albert Delgado, Patrick, Alexa Avellar, Chris, sebsn1349, Maxim Kachur,+Andrew Marshall, Navjot Narula, Alwin Mathew, Christian Mangelsdorf, Avi+Shevin, Kevin S., Guillermo Sanchez Estrada, Alex Krieger, Luca Meier, Will+Jessop, Nick Ruest, Lani Aung, Ulf Benjaminsson, Rudi Engelbrecht, Miles+Matton, Cpt_Threepwood, Adam Kuyper, reacocard, David Kilsheimer, Peter+Olson, Bill Fischofer, Prashant Shah, Simon Bonnick, Alexander Grudtsov,+Antoine Boegli, Richard Warren, Sebastian Rust, AlmostHuman, Timmy+Crawford, PC, Marek Belski, pontus, Douglas S Butts, Eric Wallmander, Joe+Pelar, VIjay, Trahloc, Vernon Vantucci, Matthew baya, Viktor Štujber,+Stephen Akiki, Daniil Zamoldinov, Atley, Chris Thomson, Jacob Briggs, Falko+Richter, Andy Schmitz, Sergi Sagas, Peder Refsnes, Jonatan, Ben, Bill+Niblock, Agustin Acuna, Jeff Curl, Tim Humphrey, bib, James Zarbock,+Lachlan Devantier, Michal Berg, Jeff Lucas, Sid Irish, Franklyn, Jared+Dickson, Olli Jarva, Adam Gibson, Lukas Loesche, Jukka Määttä, Alexander+Lin, Dao Tran, Kirk, briankb, Ryan Villasenor, Daniel Wong, barista, Tomas+Jungwirth, Jesper Hansen, Nivin Singh, Alessandro Tieghi, Billy Roessler,+Peter Fetterer, Pallav Laskar, jcherney, Tyler Wang, Steve, Gigahost, Beat+Wolf, Hannibal Skorepa, aktiveradio, Mark Nunnikhoven, Bret Comnes, Alan+Ruttenberg, Anthony DiSanti, Adam Warkiewicz, Brian Bowman, Jonathan, Mark+Filley, Tobias Mohr, Christian St. Cyr, j. faceless user, Karl Miller,+Thomas Taimre, Vikram, Jason Mountcastle, Jason, Paul Elliott, Alexander,+Stephen Farmer, rayslava, Peter Leurs, Sky Kruse, JP Reeves, John J Schatz,+Martin Sandmair, Will Thompson, John Hergenroeder, Thomas, Christophe+Ponsart, Wolfdog, Eagertolearn, LukasM, Federico Hernandez, Vincent Bernat,+Christian Schmidt, Cameron Colby Thomson, Josh Duff, James Brown, Theron+Trowbridge, Falke, Don Meares, tauu, Greg Cornford, Max Fenton, Kenneth+Reitz, Bruce Bensetler, Mark Booth, Herb Mann, Sindre Sorhus, Chris+Knadler, Daniel Digerås, Derek, Sin Valentine, Ben Gamari, david+lampenscherf, fardles, Richard Burdeniuk, Tobias Kienzler, Dawid Humbla,+Bruno Barbaroxa, D Malt, krivar, James Valleroy, Peter, Tim Geddings,+Matthias Holzinger, Hanen, Petr Vacek, Raymond, Griff Maloney, Andreas+Helveg Rudolph, Nelson Blaha, Colonel Fubar, Skyjacker Captain Gavin+Phoenix, shaun, Michael, Kari Salminen, Rodrigo Miranda, Alan Chan, Justin+Eugene Evans, Isaac, Ben Staffin, Matthew Loar, Magos, Roderik, Eugenio+Piasini, Nico B, Scott Walter, Lior Amsalem, Thongrop Rodsavas, Alberto de+Paola, Shawn Poulen, John Swiderski, lluks, Waelen, Mark Slosarek, Jim+Cristol, mikesol, Bilal Quadri, LuP, Allan Nicolson, Kevin Washington,+Isaac Wedin, Paul Anguiano, ldacruz, Jason Manheim, Sawyer, Jason+Woofenden, Joe Danziger, Declan Morahan, KaptainUfolog, Vladron, bart, Jeff+McNeill, Christian Schlotter, Ben McQuillan, Anthony, Julian, Martin O,+altruism, Eric Solheim, MarkS, ndrwc, Matthew, David Lehn, Matthew+Cisneros, Mike Skoglund, Kristy Carey, fmotta, Tom Lowenthal, Branden+Tyree, Aaron Whitehouse++## Also thanks to++* The Kickstarter team, who have unleashed much good on the world.+* The Haskell developers, who toiled for 20 years in obscurity+  before most of us noticed them, and on whose giant shoulders I now stand,+  in awe of the view.+* The Git developers, for obvious reasons.+* All of git-annex's early adopters, who turned it from a personal+  toy project into something much more, and showed me the interest was there.+* Rsync.net, for providing me a free account so I can make sure git-annex+  works well with it.+* LeastAuthority.com, for providing me a free Tahoe-LAFS grid account,+  so I can test git-annex with that, and back up the git-annex assistant+  screencasts.+* Anna and Mark, for the loan of the video camera; as well as the rest of+  my family, for your support. Even when I couldn't explain what I was+  working on.+* The Hodges, for providing such a congenial place for me to live and work+  on these first world problems, while you're off helping people in the+  third world.
+ doc/assistant/thumbnail.png view

binary file changed (absent → 3491 bytes)

+ doc/assistant/xmpp.png view

binary file changed (absent → 27753 bytes)

+ doc/assistant/xmppnudge.png view

binary file changed (absent → 6156 bytes)

+ doc/assistant/xmpppairingend.png view

binary file changed (absent → 34379 bytes)

+ doc/automatic_conflict_resolution.mdwn view
@@ -0,0 +1,23 @@+Running `git annex sync` or using the [[assistant]] involves merging+changes from elsewhere into your repository's currently checked out branch.+This could lead to a merge conflict, perhaps because the same file+got changed in two different ways. A nice feature is that these+merge conflicts are automatically resolved, rather than leaving+git in the middle of a conflicted merge, which would prevent further+syncing from happening.++When a conflict occurs, there will be several messages printed about the merge+conflict, and the file that has the merge conflict will be renamed, with+".variant-XXX" tacked onto it. So if there are two versions of file foo,+you might end up with "foo.variant-AAA" and "foo.variant-BBB". It's then+up to you to decide what to do with these two files. Perhaps you can+manually combine them back into a single file. Or perhaps you choose to+rename them to better names and keep two versions, or delete one version+you don't want.++The "AAA" and "BBB" in the above example are essentially arbitrary+(technically they are the MD5 checksum of the key). The automatic merge+conflict resoltuion is designed so that if two or more repositories both get+a merge conflict, and resolve it, the resolved repositories will not+themselves conflict. This is why it doesn't use something nicer, like+perhaps the name of the remote that the file came from.
+ doc/backends.mdwn view
@@ -0,0 +1,42 @@+When a file is annexed, a key is generated from its content and/or metadata.+The file checked into git symlinks to the key. This key can later be used+to retrieve the file's content (its value).++Multiple pluggable key-value backends are supported, and a single repository+can use different ones for different files.++* `SHA256E` -- The default backend for new files, combines a SHA256 hash of+  the file's content with the file's extension. This allows+  verifying that the file content is right, and can avoid duplicates of+  files with the same content. Its need to generate checksums+  can make it slower for large files. +* `SHA256` -- Does not include the file extension in the key, which can+  lead to better deduplication but can confuse some programs.+* `WORM` ("Write Once, Read Many") This assumes that any file with+  the same basename, size, and modification time has the same content.+  This is the least expensive backend, recommended for really large+  files or slow systems.+* `SHA512`, `SHA512E` -- Best currently available hash, for the very paranoid.+* `SHA1`, `SHA1E` -- Smaller hash than `SHA256` for those who want a checksum+   but are not concerned about security.+* `SHA384`, `SHA384E`, `SHA224`, `SHA224E` -- Hashes for people who like+  unusual sizes.+* `SKEIN512`, `SKEIN256` -- [Skein hash](http://en.wikipedia.org/wiki/Skein_hash),+  a well-regarded SHA3 hash competition finalist.++The `annex.backends` git-config setting can be used to list the backends+git-annex should use. The first one listed will be used by default when+new files are added.++For finer control of what backend is used when adding different types of+files, the `.gitattributes` file can be used. The `annex.backend`+attribute can be set to the name of the backend to use for matching files.++For example, to use the SHA256E backend for sound files, which tend to be+smallish and might be modified or copied over time,+while using the WORM backend for everything else, you could set+in `.gitattributes`:++	* annex.backend=WORM+	*.mp3 annex.backend=SHA256E+	*.ogg annex.backend=SHA256E
+ doc/backends/comment_1_375bb1fb5973e8fa67b763f2dd6e404b._comment view
@@ -0,0 +1,13 @@+[[!comment format=mdwn+ username="http://nanotech.nanotechcorp.net/"+ nickname="NanoTech"+ subject="SHA performance"+ date="2012-08-10T04:37:32Z"+ content="""+It turns out that (at least on x86-64 machines) `SHA512` [is faster than][1] `SHA256`. In some benchmarks I performed<sup>1</sup> `SHA256` was 1.8–2.2x slower than `SHA1` while `SHA512` was only 1.5–1.6x slower.++`SHA224` and `SHA384` are effectively just truncated versions of `SHA256` and `SHA512` so their performance characteristics are identical.++[1]: https://community.emc.com/community/edn/rsashare/blog/2010/11/01/sha-2-algorithms-when-sha-512-is-more-secure-and-faster+<sup>1</sup> `time head -c 100000000 /dev/zero | shasum -a 512`+"""]]
+ doc/backends/comment_2_1f2626eca9004b31a0b7fc1a0df8027b._comment view
@@ -0,0 +1,24 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm7eqCMh_B7mxE0tnchbr0JoYu11FUAFRY"+ nickname="Stéphane"+ subject="Tracking remote copies not even stored locally / URL backend turned into a &quot;special remote&quot;."+ date="2013-01-03T10:59:35Z"+ content="""+In case you came here looking for the URL backend.++## The URL backend++Several documents on the web refer to a special \"URL backend\", e.g. [Large file management with git-annex [LWN.net]](http://lwn.net/Articles/419241/).  Historical content will never be updated yet it drives people to living places.++## Why a URL backend ?++It is interesting because you can:++* let `git-annex` rest on the fact that some documents are available as extra copies available at any time (but from something that is not a git repository).+* track these documents like your own with all git features, which opens up some truly marvelous combinations, which this margin is too narrow to contain (Pierre d.F. wouldn't disapprove ;-).++## How/Where now ?++`git-annex` used to have a URL backend. It seems that the design changed into a \"special remote\" feature, not limited to the web. You can now track files available through plain directories, rsync, webdav, some cloud storage, etc, even clay tablets. For details see [[special remotes]].++"""]]
+ doc/backends/comment_3_fdcbf8727fdefb9942a54689234b9698._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmicVKRM8vJX4wPuAwlLEoS2cjmFXQkjkE"+ nickname="Thomas"+ subject="Please be more specific about what information goes into the key"+ date="2013-07-31T11:55:09Z"+ content="""+It's a bit confusing to read that SHA256 does not include the file extension from which I can deduct that SHA256E does include it. What else does it include? I used to \"seed\" my git-annex with localy available data by \"git-annex add\"-ing it in a temporary folder without doing a commit and than to initiate a copy from the slow remote annex repo. My theory was that remote copy sees the pre-seeded files and does not need to copy them again.++But does this theory hold true for different file names, extensions, modification date, full path? Maybe you could also link to the code that implements the different backends so that curious readers can check for themselves.++Thank you!+"""]]
+ doc/bare_repositories.mdwn view
@@ -0,0 +1,48 @@+Due to popular demand, git-annex can now be used with bare repositories.++So, for example, you can stash a file away in the origin:+`git annex move mybigfile --to origin`++Of course, for that to work, the bare repository has to be on a system with+[[git-annex-shell]] installed. If "origin" is on GitWeb, you still can't+use git-annex to store stuff there.++It took a while, but bare repositories are now supported exactly as well+as non-bare repositories. Except for these caveats:++* `git annex fsck` works in a bare repository, but does not display+  warnings about insufficient+  [[copies]]. To get those warnings, just run it in one of the non-bare+  checkouts.+* `git annex unused` in a bare repository only knows about keys used in+  branches that have been pushed to the bare repository. So use it with care..+* Commands that need a work tree, like `git annex add` won't work in a bare+  repository, of course.+* However, you can (with recent versions of git-annex) run `git annex copy`,+  `git annex get`, and `git annex move` in a bare repository. These behave+  as if the `--all` option were used, and just operate on every single+  version of every single file that is present in the git repository+  history.++***++Here is a quick example of how to set this up, using `origin` as the remote name, and assuming `~/annex` contains an annex:++On the server:++    git init --bare bare-annex.git+    cd bare-annex.git && git annex init origin++Now configure the remote and do the initial push:++    cd ~/annex+    git remote add origin example.com:bare-annex.git+    git push origin master git-annex++Now `git annex status` should show the configured bare remote. If it does not, you may have to pull from the remote first (older versions of `git-annex`)++If you wish to configure git such that you can push/pull without arguments, set the upstream branch:++    git branch master --set-upstream origin/master++   
+ doc/bare_repositories/comment_1_148e1da70d37d311634a0309a4ff8dcd._comment view
@@ -0,0 +1,22 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmraN_ldJplGunVGmnjjLN6jL9s9TrVMGE"+ nickname="Ævar Arnfjörð"+ subject="How to convert bare repositories to non-bare"+ date="2012-11-11T20:14:44Z"+ content="""+I made a repository bare and later wanted to convert it, this would have worked with just plain git:++    cd bare-repo.git+    mkdir .git+    mv .??* * .git/+    git config --unset core.bare+    git reset --hard++But because git-annex uses different hashing directories under bare repositories all the files in the repo will point to files you don't have. Here's how you can fix that up assuming you're using a backend that assigns unique hashes based on file content (e.g. the SHA256 backend):++    mv .git/annex/objects from-bare-repo+    git annex add from-bare-repo+    git rm -f from-bare-repo+++"""]]
+ doc/bugs.mdwn view
@@ -0,0 +1,18 @@+This is git-annex's bug list.++[[!sidebar content="""+[[!inline feeds=no template=bare pages=sidebar]]++Categories:++* [[Bugs_affecting_the_assistant|design/assistant/todo]]+* [[Bugs_needing_more_info|moreinfo]]+* [[Closed_bugs|bugs/done]]+"""+]]++[[!inline pages="./bugs/* and !./bugs/*/* and !./bugs/done and !link(done) +and !./bugs/moreinfo and !link(moreinfo)+and !*/Discussion" actions=yes postform=yes show=0 archive=yes]]++[[!edittemplate template=templates/bugtemplate match="bugs/*" silent=yes]]
+ doc/bugs/3.20121112:_build_error_in_assistant.mdwn view
@@ -0,0 +1,432 @@+Git-annex stopped compiling with GHC 7.4.2 after updating Yesod and friends to the respective latest version. The complete build log is attached below. I hope this helps. Further build logs are available at <http://hydra.nixos.org/job/nixpkgs/trunk/gitAndTools.gitAnnex>, too.++    building+    make flags:  PREFIX=/nix/store/9az61h33v1j6fkdmwdfy7gi0rhspsb9k-git-annex-3.20121112+    building Build/SysConfig.hs+    ghc -O2 -Wall -outputdir tmp -IUtility  -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_INOTIFY -DWITH_DBUS -threaded --make configure[b+    [1 of 7] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o )+    [2 of 7] Compiling Utility.Misc     ( Utility/Misc.hs, tmp/Utility/Misc.o )+    [3 of 7] Compiling Utility.Process  ( Utility/Process.hs, tmp/Utility/Process.o )+    [4 of 7] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o )+    [5 of 7] Compiling Build.TestConfig ( Build/TestConfig.hs, tmp/Build/TestConfig.o )+    [6 of 7] Compiling Build.Configure  ( Build/Configure.hs, tmp/Build/Configure.o )+    [7 of 7] Compiling Main             ( configure.hs, tmp/Main.o )+    Linking configure ...+    ./configure+      checking version... 3.20121112+      checking git... yes+      checking git version... 1.8.0+      checking cp -a... yes+      checking cp -p... yes+      checking cp --reflink=auto... yes+      checking uuid generator... uuidgen+      checking xargs -0... yes+      checking rsync... yes+      checking curl... yes+      checking wget... no+      checking bup... no+      checking gpg... no+      checking lsof... no+      checking ssh connection caching... yes+      checking sha1... sha1sum+      checking sha256... sha256sum+      checking sha512... sha512sum+      checking sha224... sha224sum+      checking sha384... sha384sum+    building Utility/Touch.hs+    hsc2hs Utility/Touch.hsc[b+    building Utility/Mounts.hs+    hsc2hs Utility/Mounts.hsc[b+    building Utility/libdiskfree.o+    cc -Wall   -c -o Utility/libdiskfree.o Utility/libdiskfree.c[b+    building Utility/libmounts.o+    cc -Wall   -c -o Utility/libmounts.o Utility/libmounts.c[b+    building git-annex+    install -d tmp[b+    ghc -O2 -Wall -outputdir tmp -IUtility  -DWITH_ASSISTANT -DWITH_S3 -DWITH_WEBAPP -DWITH_PAIRING -DWITH_XMPP -DWITH_DNS -DWITH_INOTIFY -DWITH_DBUS -threaded --make git-annex -o tmp/git-annex Utility/libdiskfree.o Utility/libmounts.o[b+    [  1 of 279] Compiling Utility.Dot      ( Utility/Dot.hs, tmp/Utility/Dot.o )+    [  2 of 279] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, tmp/Utility/ThreadLock.o )+    [  3 of 279] Compiling Utility.Mounts   ( Utility/Mounts.hs, tmp/Utility/Mounts.o )+    [  4 of 279] Compiling Utility.Yesod    ( Utility/Yesod.hs, tmp/Utility/Yesod.o )+    [  5 of 279] Compiling Utility.Tense    ( Utility/Tense.hs, tmp/Utility/Tense.o )+    [  6 of 279] Compiling Utility.Verifiable ( Utility/Verifiable.hs, tmp/Utility/Verifiable.o )+    [  7 of 279] Compiling Assistant.Types.TransferSlots ( Assistant/Types/TransferSlots.hs, tmp/Assistant/Types/TransferSlots.o )+    [  8 of 279] Compiling Types.StandardGroups ( Types/StandardGroups.hs, tmp/Types/StandardGroups.o )+    [  9 of 279] Compiling Utility.Percentage ( Utility/Percentage.hs, tmp/Utility/Percentage.o )+    [ 10 of 279] Compiling Utility.Base64   ( Utility/Base64.hs, tmp/Utility/Base64.o )+    [ 11 of 279] Compiling Utility.DataUnits ( Utility/DataUnits.hs, tmp/Utility/DataUnits.o )+    [ 12 of 279] Compiling Utility.JSONStream ( Utility/JSONStream.hs, tmp/Utility/JSONStream.o )+    [ 13 of 279] Compiling Messages.JSON    ( Messages/JSON.hs, tmp/Messages/JSON.o )+    [ 14 of 279] Compiling Build.SysConfig  ( Build/SysConfig.hs, tmp/Build/SysConfig.o )+    [ 15 of 279] Compiling Types.KeySource  ( Types/KeySource.hs, tmp/Types/KeySource.o )+    [ 16 of 279] Compiling Utility.State    ( Utility/State.hs, tmp/Utility/State.o )+    [ 17 of 279] Compiling Types.UUID       ( Types/UUID.hs, tmp/Types/UUID.o )+    [ 18 of 279] Compiling Types.Messages   ( Types/Messages.hs, tmp/Types/Messages.o )+    [ 19 of 279] Compiling Types.Group      ( Types/Group.hs, tmp/Types/Group.o )+    [ 20 of 279] Compiling Types.TrustLevel ( Types/TrustLevel.hs, tmp/Types/TrustLevel.o )+    [ 21 of 279] Compiling Types.BranchState ( Types/BranchState.hs, tmp/Types/BranchState.o )+    [ 22 of 279] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, tmp/Utility/PartialPrelude.o )+    [ 23 of 279] Compiling Utility.HumanTime ( Utility/HumanTime.hs, tmp/Utility/HumanTime.o )+    [ 24 of 279] Compiling Utility.Format   ( Utility/Format.hs, tmp/Utility/Format.o )+    [ 25 of 279] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, tmp/Utility/FileSystemEncoding.o )+    [ 26 of 279] Compiling Utility.Touch    ( Utility/Touch.hs, tmp/Utility/Touch.o )+    [ 27 of 279] Compiling Utility.Applicative ( Utility/Applicative.hs, tmp/Utility/Applicative.o )+    [ 28 of 279] Compiling Utility.Monad    ( Utility/Monad.hs, tmp/Utility/Monad.o )+    [ 29 of 279] Compiling Utility.Exception ( Utility/Exception.hs, tmp/Utility/Exception.o )+    [ 30 of 279] Compiling Utility.DBus     ( Utility/DBus.hs, tmp/Utility/DBus.o )+    [ 31 of 279] Compiling Utility.Misc     ( Utility/Misc.hs, tmp/Utility/Misc.o )+    [ 32 of 279] Compiling Utility.Process  ( Utility/Process.hs, tmp/Utility/Process.o )+    [ 33 of 279] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, tmp/Utility/SafeCommand.o )+    [ 34 of 279] Compiling Utility.Network  ( Utility/Network.hs, tmp/Utility/Network.o )+    [ 35 of 279] Compiling Utility.SRV      ( Utility/SRV.hs, tmp/Utility/SRV.o )++    Utility/SRV.hs:88:1: Warning: Defined but not used: `lookupSRVHost'++    Utility/SRV.hs:94:1: Warning: Defined but not used: `parseSrvHost'+    [ 36 of 279] Compiling Git.Types        ( Git/Types.hs, tmp/Git/Types.o )+    [ 37 of 279] Compiling Utility.UserInfo ( Utility/UserInfo.hs, tmp/Utility/UserInfo.o )+    [ 38 of 279] Compiling Utility.Path     ( Utility/Path.hs, tmp/Utility/Path.o )+    [ 39 of 279] Compiling Utility.TempFile ( Utility/TempFile.hs, tmp/Utility/TempFile.o )+    [ 40 of 279] Compiling Utility.Directory ( Utility/Directory.hs, tmp/Utility/Directory.o )+    [ 41 of 279] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, tmp/Utility/FreeDesktop.o )+    [ 42 of 279] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, tmp/Assistant/Install/AutoStart.o )+    [ 43 of 279] Compiling Common           ( Common.hs, tmp/Common.o )+    [ 44 of 279] Compiling Utility.FileMode ( Utility/FileMode.hs, tmp/Utility/FileMode.o )+    [ 45 of 279] Compiling Git              ( Git.hs, tmp/Git.o )+    [ 46 of 279] Compiling Git.FilePath     ( Git/FilePath.hs, tmp/Git/FilePath.o )+    [ 47 of 279] Compiling Utility.Matcher  ( Utility/Matcher.hs, tmp/Utility/Matcher.o )+    [ 48 of 279] Compiling Utility.Gpg      ( Utility/Gpg.hs, tmp/Utility/Gpg.o )+    [ 49 of 279] Compiling Types.Crypto     ( Types/Crypto.hs, tmp/Types/Crypto.o )+    [ 50 of 279] Compiling Types.Key        ( Types/Key.hs, tmp/Types/Key.o )+    [ 51 of 279] Compiling Types.Backend    ( Types/Backend.hs, tmp/Types/Backend.o )+    [ 52 of 279] Compiling Types.Remote     ( Types/Remote.hs, tmp/Types/Remote.o )+    [ 53 of 279] Compiling Git.Sha          ( Git/Sha.hs, tmp/Git/Sha.o )+    [ 54 of 279] Compiling Utility.CoProcess ( Utility/CoProcess.hs, tmp/Utility/CoProcess.o )+    [ 55 of 279] Compiling Git.Command      ( Git/Command.hs, tmp/Git/Command.o )+    [ 56 of 279] Compiling Git.Ref          ( Git/Ref.hs, tmp/Git/Ref.o )+    [ 57 of 279] Compiling Git.Branch       ( Git/Branch.hs, tmp/Git/Branch.o )+    [ 58 of 279] Compiling Git.UpdateIndex  ( Git/UpdateIndex.hs, tmp/Git/UpdateIndex.o )+    [ 59 of 279] Compiling Git.Queue        ( Git/Queue.hs, tmp/Git/Queue.o )+    [ 60 of 279] Compiling Git.HashObject   ( Git/HashObject.hs, tmp/Git/HashObject.o )+    [ 61 of 279] Compiling Git.CatFile      ( Git/CatFile.hs, tmp/Git/CatFile.o )+    [ 62 of 279] Compiling Git.UnionMerge   ( Git/UnionMerge.hs, tmp/Git/UnionMerge.o )+    [ 63 of 279] Compiling Git.Url          ( Git/Url.hs, tmp/Git/Url.o )+    [ 64 of 279] Compiling Git.Construct    ( Git/Construct.hs, tmp/Git/Construct.o )+    [ 65 of 279] Compiling Git.Config       ( Git/Config.hs, tmp/Git/Config.o )+    [ 66 of 279] Compiling Git.SharedRepository ( Git/SharedRepository.hs, tmp/Git/SharedRepository.o )+    [ 67 of 279] Compiling Git.Version      ( Git/Version.hs, tmp/Git/Version.o )+    [ 68 of 279] Compiling Git.CheckAttr    ( Git/CheckAttr.hs, tmp/Git/CheckAttr.o )+    [ 69 of 279] Compiling Annex            ( Annex.hs, tmp/Annex.o )+    [ 70 of 279] Compiling Types.Option     ( Types/Option.hs, tmp/Types/Option.o )+    [ 71 of 279] Compiling Types            ( Types.hs, tmp/Types.o )+    [ 72 of 279] Compiling Messages         ( Messages.hs, tmp/Messages.o )+    [ 73 of 279] Compiling Types.Command    ( Types/Command.hs, tmp/Types/Command.o )+    [ 74 of 279] Compiling Locations        ( Locations.hs, tmp/Locations.o )+    [ 75 of 279] Compiling Common.Annex     ( Common/Annex.hs, tmp/Common/Annex.o )+    [ 76 of 279] Compiling Fields           ( Fields.hs, tmp/Fields.o )+    [ 77 of 279] Compiling Annex.BranchState ( Annex/BranchState.hs, tmp/Annex/BranchState.o )+    [ 78 of 279] Compiling Annex.CatFile    ( Annex/CatFile.hs, tmp/Annex/CatFile.o )+    [ 79 of 279] Compiling Annex.Perms      ( Annex/Perms.hs, tmp/Annex/Perms.o )+    [ 80 of 279] Compiling Crypto           ( Crypto.hs, tmp/Crypto.o )+    [ 81 of 279] Compiling Annex.Exception  ( Annex/Exception.hs, tmp/Annex/Exception.o )+    [ 82 of 279] Compiling Annex.Journal    ( Annex/Journal.hs, tmp/Annex/Journal.o )+    [ 83 of 279] Compiling Annex.Branch     ( Annex/Branch.hs, tmp/Annex/Branch.o )+    [ 84 of 279] Compiling Usage            ( Usage.hs, tmp/Usage.o )+    [ 85 of 279] Compiling Annex.CheckAttr  ( Annex/CheckAttr.hs, tmp/Annex/CheckAttr.o )+    [ 86 of 279] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, tmp/Remote/Helper/Special.o )+    [ 87 of 279] Compiling Logs.Presence    ( Logs/Presence.hs, tmp/Logs/Presence.o )+    [ 88 of 279] Compiling Logs.Location    ( Logs/Location.hs, tmp/Logs/Location.o )+    [ 89 of 279] Compiling Logs.Web         ( Logs/Web.hs, tmp/Logs/Web.o )+    [ 90 of 279] Compiling Annex.LockPool   ( Annex/LockPool.hs, tmp/Annex/LockPool.o )+    [ 91 of 279] Compiling Logs.Transfer    ( Logs/Transfer.hs, tmp/Logs/Transfer.o )+    [ 92 of 279] Compiling Backend.SHA      ( Backend/SHA.hs, tmp/Backend/SHA.o )+    [ 93 of 279] Compiling Backend.WORM     ( Backend/WORM.hs, tmp/Backend/WORM.o )+    [ 94 of 279] Compiling Backend.URL      ( Backend/URL.hs, tmp/Backend/URL.o )+    [ 95 of 279] Compiling Assistant.Types.ScanRemotes ( Assistant/Types/ScanRemotes.hs, tmp/Assistant/Types/ScanRemotes.o )+    [ 96 of 279] Compiling Assistant.Types.ThreadedMonad ( Assistant/Types/ThreadedMonad.hs, tmp/Assistant/Types/ThreadedMonad.o )+    [ 97 of 279] Compiling Assistant.Types.TransferQueue ( Assistant/Types/TransferQueue.hs, tmp/Assistant/Types/TransferQueue.o )+    [ 98 of 279] Compiling Assistant.Types.Pushes ( Assistant/Types/Pushes.hs, tmp/Assistant/Types/Pushes.o )+    [ 99 of 279] Compiling Assistant.Types.BranchChange ( Assistant/Types/BranchChange.hs, tmp/Assistant/Types/BranchChange.o )+    [100 of 279] Compiling Logs.UUIDBased   ( Logs/UUIDBased.hs, tmp/Logs/UUIDBased.o )+    [101 of 279] Compiling Logs.Remote      ( Logs/Remote.hs, tmp/Logs/Remote.o )+    [102 of 279] Compiling Logs.Group       ( Logs/Group.hs, tmp/Logs/Group.o )+    [103 of 279] Compiling Utility.DiskFree ( Utility/DiskFree.hs, tmp/Utility/DiskFree.o )+    [104 of 279] Compiling Utility.Url      ( Utility/Url.hs, tmp/Utility/Url.o )+    [105 of 279] Compiling Utility.CopyFile ( Utility/CopyFile.hs, tmp/Utility/CopyFile.o )+    [106 of 279] Compiling Utility.Rsync    ( Utility/Rsync.hs, tmp/Utility/Rsync.o )+    [107 of 279] Compiling Git.LsFiles      ( Git/LsFiles.hs, tmp/Git/LsFiles.o )+    [108 of 279] Compiling Git.AutoCorrect  ( Git/AutoCorrect.hs, tmp/Git/AutoCorrect.o )+    [109 of 279] Compiling Git.CurrentRepo  ( Git/CurrentRepo.hs, tmp/Git/CurrentRepo.o )+    [110 of 279] Compiling Locations.UserConfig ( Locations/UserConfig.hs, tmp/Locations/UserConfig.o )+    [111 of 279] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, tmp/Utility/ThreadScheduler.o )+    [112 of 279] Compiling Git.Merge        ( Git/Merge.hs, tmp/Git/Merge.o )+    [113 of 279] Compiling Utility.Parallel ( Utility/Parallel.hs, tmp/Utility/Parallel.o )+    [114 of 279] Compiling Git.Remote       ( Git/Remote.hs, tmp/Git/Remote.o )+    [115 of 279] Compiling Assistant.Ssh    ( Assistant/Ssh.hs, tmp/Assistant/Ssh.o )+    [116 of 279] Compiling Assistant.Pairing ( Assistant/Pairing.hs, tmp/Assistant/Pairing.o )+    [117 of 279] Compiling Assistant.Types.NetMessager ( Assistant/Types/NetMessager.hs, tmp/Assistant/Types/NetMessager.o )+    [118 of 279] Compiling Utility.NotificationBroadcaster ( Utility/NotificationBroadcaster.hs, tmp/Utility/NotificationBroadcaster.o )+    [119 of 279] Compiling Assistant.Types.Buddies ( Assistant/Types/Buddies.hs, tmp/Assistant/Types/Buddies.o )+    [120 of 279] Compiling Utility.TSet     ( Utility/TSet.hs, tmp/Utility/TSet.o )+    [121 of 279] Compiling Assistant.Types.Commits ( Assistant/Types/Commits.hs, tmp/Assistant/Types/Commits.o )+    [122 of 279] Compiling Assistant.Types.Changes ( Assistant/Types/Changes.hs, tmp/Assistant/Types/Changes.o )+    [123 of 279] Compiling Utility.WebApp   ( Utility/WebApp.hs, tmp/Utility/WebApp.o )+    [124 of 279] Compiling Utility.Daemon   ( Utility/Daemon.hs, tmp/Utility/Daemon.o )+    [125 of 279] Compiling Utility.LogFile  ( Utility/LogFile.hs, tmp/Utility/LogFile.o )+    [126 of 279] Compiling Git.Filename     ( Git/Filename.hs, tmp/Git/Filename.o )+    [127 of 279] Compiling Git.LsTree       ( Git/LsTree.hs, tmp/Git/LsTree.o )+    [128 of 279] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, tmp/Utility/Types/DirWatcher.o )+    [129 of 279] Compiling Utility.INotify  ( Utility/INotify.hs, tmp/Utility/INotify.o )+    [130 of 279] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, tmp/Utility/DirWatcher.o )+    [131 of 279] Compiling Utility.Lsof     ( Utility/Lsof.hs, tmp/Utility/Lsof.o )+    [132 of 279] Compiling Config           ( Config.hs, tmp/Config.o )+    [133 of 279] Compiling Annex.UUID       ( Annex/UUID.hs, tmp/Annex/UUID.o )+    [134 of 279] Compiling Logs.UUID        ( Logs/UUID.hs, tmp/Logs/UUID.o )+    [135 of 279] Compiling Backend          ( Backend.hs, tmp/Backend.o )+    [136 of 279] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, tmp/Remote/Helper/Hooks.o )+    [137 of 279] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, tmp/Remote/Helper/Encryptable.o )+    [138 of 279] Compiling Annex.Queue      ( Annex/Queue.hs, tmp/Annex/Queue.o )+    [139 of 279] Compiling Annex.Content    ( Annex/Content.hs, tmp/Annex/Content.o )+    [140 of 279] Compiling Remote.S3        ( Remote/S3.hs, tmp/Remote/S3.o )+    [141 of 279] Compiling Remote.Directory ( Remote/Directory.hs, tmp/Remote/Directory.o )+    [142 of 279] Compiling Remote.Rsync     ( Remote/Rsync.hs, tmp/Remote/Rsync.o )+    [143 of 279] Compiling Remote.Web       ( Remote/Web.hs, tmp/Remote/Web.o )+    [144 of 279] Compiling Remote.Hook      ( Remote/Hook.hs, tmp/Remote/Hook.o )+    [145 of 279] Compiling Upgrade.V2       ( Upgrade/V2.hs, tmp/Upgrade/V2.o )+    [146 of 279] Compiling Annex.Ssh        ( Annex/Ssh.hs, tmp/Annex/Ssh.o )+    [147 of 279] Compiling Remote.Helper.Ssh ( Remote/Helper/Ssh.hs, tmp/Remote/Helper/Ssh.o )+    [148 of 279] Compiling Remote.Bup       ( Remote/Bup.hs, tmp/Remote/Bup.o )+    [149 of 279] Compiling Annex.Version    ( Annex/Version.hs, tmp/Annex/Version.o )+    [150 of 279] Compiling Init             ( Init.hs, tmp/Init.o )+    [151 of 279] Compiling Checks           ( Checks.hs, tmp/Checks.o )+    [152 of 279] Compiling Remote.Git       ( Remote/Git.hs, tmp/Remote/Git.o )+    [153 of 279] Compiling Remote.List      ( Remote/List.hs, tmp/Remote/List.o )+    [154 of 279] Compiling Logs.Trust       ( Logs/Trust.hs, tmp/Logs/Trust.o )+    [155 of 279] Compiling Remote           ( Remote.hs, tmp/Remote.o )+    [156 of 279] Compiling Assistant.Alert  ( Assistant/Alert.hs, tmp/Assistant/Alert.o )+    Loading package ghc-prim ... linking ... done.+    Loading package integer-gmp ... linking ... done.+    Loading package base ... linking ... done.+    Loading object (static) Utility/libdiskfree.o ... done+    Loading object (static) Utility/libmounts.o ... done+    final link ... done+    Loading package pretty-1.1.1.0 ... linking ... done.+    Loading package filepath-1.3.0.0 ... linking ... done.+    Loading package old-locale-1.0.0.4 ... linking ... done.+    Loading package old-time-1.1.0.0 ... linking ... done.+    Loading package bytestring-0.9.2.1 ... linking ... done.+    Loading package unix-2.5.1.0 ... linking ... done.+    Loading package directory-1.1.0.2 ... linking ... done.+    Loading package process-1.1.0.1 ... linking ... done.+    Loading package array-0.4.0.0 ... linking ... done.+    Loading package deepseq-1.3.0.0 ... linking ... done.+    Loading package time-1.4 ... linking ... done.+    Loading package containers-0.4.2.1 ... linking ... done.+    Loading package text-0.11.2.0 ... linking ... done.+    Loading package blaze-builder-0.3.1.0 ... linking ... done.+    Loading package blaze-markup-0.5.1.1 ... linking ... done.+    Loading package blaze-html-0.5.1.0 ... linking ... done.+    Loading package hashable-1.1.2.5 ... linking ... done.+    Loading package case-insensitive-0.4.0.3 ... linking ... done.+    Loading package primitive-0.5.0.1 ... linking ... done.+    Loading package vector-0.10.0.1 ... linking ... done.+    Loading package random-1.0.1.1 ... linking ... done.+    Loading package dlist-0.5 ... linking ... done.+    Loading package data-default-0.5.0 ... linking ... done.+    Loading package transformers-0.3.0.0 ... linking ... done.+    Loading package mtl-2.1.1 ... linking ... done.+    Loading package parsec-3.1.2 ... linking ... done.+    Loading package network-2.3.0.13 ... linking ... done.+    Loading package failure-0.2.0.1 ... linking ... done.+    Loading package template-haskell ... linking ... done.+    Loading package shakespeare-1.0.2 ... linking ... done.+    Loading package hamlet-1.1.1.1 ... linking ... done.+    Loading package http-types-0.7.3.0.1 ... linking ... done.+    Loading package base-unicode-symbols-0.2.2.4 ... linking ... done.+    Loading package transformers-base-0.4.1 ... linking ... done.+    Loading package monad-control-0.3.1.4 ... linking ... done.+    Loading package lifted-base-0.2 ... linking ... done.+    Loading package resourcet-0.4.3 ... linking ... done.+    Loading package semigroups-0.8.4.1 ... linking ... done.+    Loading package void-0.5.8 ... linking ... done.+    Loading package conduit-0.5.4.1 ... linking ... done.+    Loading package unordered-containers-0.2.2.1 ... linking ... done.+    Loading package vault-0.2.0.1 ... linking ... done.+    Loading package wai-1.3.0.1 ... linking ... done.+    Loading package date-cache-0.3.0 ... linking ... done.+    Loading package unix-time-0.1.2 ... linking ... done.+    Loading package fast-logger-0.3.1 ... linking ... done.+    Loading package attoparsec-0.10.2.0 ... linking ... done.+    Loading package cookie-0.4.0.1 ... linking ... done.+    Loading package shakespeare-css-1.0.2 ... linking ... done.+    Loading package syb-0.3.6.1 ... linking ... done.+    Loading package aeson-0.6.0.2 ... linking ... done.+    Loading package shakespeare-js-1.1.0 ... linking ... done.+    Loading package ansi-terminal-0.5.5 ... linking ... done.+    Loading package blaze-builder-conduit-0.5.0.2 ... linking ... done.+    Loading package stringsearch-0.3.6.4 ... linking ... done.+    Loading package byteorder-1.0.3 ... linking ... done.+    Loading package wai-logger-0.3.0 ... linking ... done.+    Loading package zlib-0.5.3.3 ... linking ... done.+    Loading package zlib-bindings-0.1.1.1 ... linking ... done.+    Loading package zlib-conduit-0.5.0.2 ... linking ... done.+    Loading package wai-extra-1.3.0.4 ... linking ... done.+    Loading package monad-logger-0.2.1 ... linking ... done.+    Loading package cereal-0.3.5.2 ... linking ... done.+    Loading package base64-bytestring-1.0.0.0 ... linking ... done.+    Loading package cipher-aes-0.1.2 ... linking ... done.+    Loading package entropy-0.2.1 ... linking ... done.+    Loading package largeword-1.0.3 ... linking ... done.+    Loading package tagged-0.4.4 ... linking ... done.+    Loading package crypto-api-0.10.2 ... linking ... done.+    Loading package cpu-0.1.1 ... linking ... done.+    Loading package crypto-pubkey-types-0.1.1 ... linking ... done.+    Loading package cryptocipher-0.3.5 ... linking ... done.+    Loading package cprng-aes-0.2.4 ... linking ... done.+    Loading package skein-0.1.0.9 ... linking ... done.+    Loading package clientsession-0.8.0.1 ... linking ... done.+    Loading package path-pieces-0.1.2 ... linking ... done.+    Loading package shakespeare-i18n-1.0.0.2 ... linking ... done.+    Loading package yesod-routes-1.1.1.1 ... linking ... done.+    Loading package yesod-core-1.1.5 ... linking ... done.+    [157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, tmp/Assistant/Types/DaemonStatus.o )+    [158 of 279] Compiling Assistant.Monad  ( Assistant/Monad.hs, tmp/Assistant/Monad.o )+    [159 of 279] Compiling Assistant.Types.NamedThread ( Assistant/Types/NamedThread.hs, tmp/Assistant/Types/NamedThread.o )+    [160 of 279] Compiling Assistant.Common ( Assistant/Common.hs, tmp/Assistant/Common.o )+    [161 of 279] Compiling Assistant.XMPP   ( Assistant/XMPP.hs, tmp/Assistant/XMPP.o )+    [162 of 279] Compiling Assistant.XMPP.Buddies ( Assistant/XMPP/Buddies.hs, tmp/Assistant/XMPP/Buddies.o )+    [163 of 279] Compiling Assistant.NetMessager ( Assistant/NetMessager.hs, tmp/Assistant/NetMessager.o )++    Assistant/NetMessager.hs:12:1:+        Warning: The import of `Types.Remote' is redundant+                   except perhaps to import instances from `Types.Remote'+                 To import instances alone, use: import Types.Remote()++    Assistant/NetMessager.hs:13:1:+        Warning: The import of `Git' is redundant+                   except perhaps to import instances from `Git'+                 To import instances alone, use: import Git()++    Assistant/NetMessager.hs:20:1:+        Warning: The import of `Data.Text' is redundant+                   except perhaps to import instances from `Data.Text'+                 To import instances alone, use: import Data.Text()+    [164 of 279] Compiling Assistant.Pushes ( Assistant/Pushes.hs, tmp/Assistant/Pushes.o )+    [165 of 279] Compiling Assistant.ScanRemotes ( Assistant/ScanRemotes.hs, tmp/Assistant/ScanRemotes.o )+    [166 of 279] Compiling Assistant.Install ( Assistant/Install.hs, tmp/Assistant/Install.o )+    [167 of 279] Compiling Assistant.XMPP.Client ( Assistant/XMPP/Client.hs, tmp/Assistant/XMPP/Client.o )+    [168 of 279] Compiling Assistant.Commits ( Assistant/Commits.hs, tmp/Assistant/Commits.o )+    [169 of 279] Compiling Assistant.BranchChange ( Assistant/BranchChange.hs, tmp/Assistant/BranchChange.o )+    [170 of 279] Compiling Assistant.Changes ( Assistant/Changes.hs, tmp/Assistant/Changes.o )+    [171 of 279] Compiling Assistant.WebApp.Types ( Assistant/WebApp/Types.hs, tmp/Assistant/WebApp/Types.o )+    Loading package unix-compat-0.4.0.0 ... linking ... done.+    Loading package file-embed-0.0.4.6 ... linking ... done.+    Loading package system-filepath-0.4.7 ... linking ... done.+    Loading package system-fileio-0.3.10 ... linking ... done.+    Loading package cryptohash-0.7.8 ... linking ... done.+    Loading package crypto-conduit-0.4.0.1 ... linking ... done.+    Loading package http-date-0.0.2 ... linking ... done.+    Loading package mime-types-0.1.0.0 ... linking ... done.+    Loading package wai-app-static-1.3.0.4 ... linking ... done.+    Loading package yesod-static-1.1.1.1 ... linking ... done.+    [172 of 279] Compiling Assistant.WebApp ( Assistant/WebApp.hs, tmp/Assistant/WebApp.o )+    Loading package network-conduit-0.6.1.1 ... linking ... done.+    Loading package safe-0.3.3 ... linking ... done.+    Loading package simple-sendfile-0.2.8 ... linking ... done.+    Loading package warp-1.3.4.4 ... linking ... done.+    Loading package yaml-0.8.1 ... linking ... done.+    Loading package yesod-default-1.1.2 ... linking ... done.+    [173 of 279] Compiling Assistant.WebApp.OtherRepos ( Assistant/WebApp/OtherRepos.hs, tmp/Assistant/WebApp/OtherRepos.o )+    [174 of 279] Compiling Limit            ( Limit.hs, tmp/Limit.o )+    [175 of 279] Compiling Option           ( Option.hs, tmp/Option.o )+    [176 of 279] Compiling Seek             ( Seek.hs, tmp/Seek.o )+    [177 of 279] Compiling Command          ( Command.hs, tmp/Command.o )+    [178 of 279] Compiling CmdLine          ( CmdLine.hs, tmp/CmdLine.o )+    [179 of 279] Compiling Command.ConfigList ( Command/ConfigList.hs, tmp/Command/ConfigList.o )+    [180 of 279] Compiling Command.InAnnex  ( Command/InAnnex.hs, tmp/Command/InAnnex.o )+    [181 of 279] Compiling Command.DropKey  ( Command/DropKey.hs, tmp/Command/DropKey.o )+    [182 of 279] Compiling Command.SendKey  ( Command/SendKey.hs, tmp/Command/SendKey.o )+    [183 of 279] Compiling Command.RecvKey  ( Command/RecvKey.hs, tmp/Command/RecvKey.o )+    [184 of 279] Compiling Command.TransferInfo ( Command/TransferInfo.hs, tmp/Command/TransferInfo.o )+    [185 of 279] Compiling Command.Commit   ( Command/Commit.hs, tmp/Command/Commit.o )+    [186 of 279] Compiling Command.Add      ( Command/Add.hs, tmp/Command/Add.o )+    [187 of 279] Compiling Command.Unannex  ( Command/Unannex.hs, tmp/Command/Unannex.o )+    [188 of 279] Compiling Command.FromKey  ( Command/FromKey.hs, tmp/Command/FromKey.o )+    [189 of 279] Compiling Command.ReKey    ( Command/ReKey.hs, tmp/Command/ReKey.o )+    [190 of 279] Compiling Command.Fix      ( Command/Fix.hs, tmp/Command/Fix.o )+    [191 of 279] Compiling Command.Describe ( Command/Describe.hs, tmp/Command/Describe.o )+    [192 of 279] Compiling Command.InitRemote ( Command/InitRemote.hs, tmp/Command/InitRemote.o )+    [193 of 279] Compiling Command.Unlock   ( Command/Unlock.hs, tmp/Command/Unlock.o )+    [194 of 279] Compiling Command.Lock     ( Command/Lock.hs, tmp/Command/Lock.o )+    [195 of 279] Compiling Command.PreCommit ( Command/PreCommit.hs, tmp/Command/PreCommit.o )+    [196 of 279] Compiling Command.Log      ( Command/Log.hs, tmp/Command/Log.o )+    [197 of 279] Compiling Command.Merge    ( Command/Merge.hs, tmp/Command/Merge.o )+    [198 of 279] Compiling Command.Group    ( Command/Group.hs, tmp/Command/Group.o )+    [199 of 279] Compiling Command.Ungroup  ( Command/Ungroup.hs, tmp/Command/Ungroup.o )+    [200 of 279] Compiling Command.Import   ( Command/Import.hs, tmp/Command/Import.o )+    [201 of 279] Compiling Logs.Unused      ( Logs/Unused.hs, tmp/Logs/Unused.o )+    [202 of 279] Compiling Command.AddUnused ( Command/AddUnused.hs, tmp/Command/AddUnused.o )+    [203 of 279] Compiling Command.Find     ( Command/Find.hs, tmp/Command/Find.o )+    [204 of 279] Compiling Logs.PreferredContent ( Logs/PreferredContent.hs, tmp/Logs/PreferredContent.o )+    [205 of 279] Compiling Annex.Wanted     ( Annex/Wanted.hs, tmp/Annex/Wanted.o )+    [206 of 279] Compiling Command.Whereis  ( Command/Whereis.hs, tmp/Command/Whereis.o )+    [207 of 279] Compiling Command.Trust    ( Command/Trust.hs, tmp/Command/Trust.o )+    [208 of 279] Compiling Command.Untrust  ( Command/Untrust.hs, tmp/Command/Untrust.o )+    [209 of 279] Compiling Command.Semitrust ( Command/Semitrust.hs, tmp/Command/Semitrust.o )+    [210 of 279] Compiling Command.Dead     ( Command/Dead.hs, tmp/Command/Dead.o )+    [211 of 279] Compiling Command.Vicfg    ( Command/Vicfg.hs, tmp/Command/Vicfg.o )+    [212 of 279] Compiling Command.Map      ( Command/Map.hs, tmp/Command/Map.o )+    [213 of 279] Compiling Command.Init     ( Command/Init.hs, tmp/Command/Init.o )+    [214 of 279] Compiling Command.Uninit   ( Command/Uninit.hs, tmp/Command/Uninit.o )+    [215 of 279] Compiling Command.Version  ( Command/Version.hs, tmp/Command/Version.o )+    [216 of 279] Compiling Upgrade.V1       ( Upgrade/V1.hs, tmp/Upgrade/V1.o )+    [217 of 279] Compiling Upgrade.V0       ( Upgrade/V0.hs, tmp/Upgrade/V0.o )+    [218 of 279] Compiling Upgrade          ( Upgrade.hs, tmp/Upgrade.o )+    [219 of 279] Compiling Command.Upgrade  ( Command/Upgrade.hs, tmp/Command/Upgrade.o )+    [220 of 279] Compiling Command.Drop     ( Command/Drop.hs, tmp/Command/Drop.o )+    [221 of 279] Compiling Command.Move     ( Command/Move.hs, tmp/Command/Move.o )+    [222 of 279] Compiling Command.Copy     ( Command/Copy.hs, tmp/Command/Copy.o )+    [223 of 279] Compiling Command.Get      ( Command/Get.hs, tmp/Command/Get.o )+    [224 of 279] Compiling Command.TransferKey ( Command/TransferKey.hs, tmp/Command/TransferKey.o )+    [225 of 279] Compiling Command.DropUnused ( Command/DropUnused.hs, tmp/Command/DropUnused.o )+    [226 of 279] Compiling Command.Fsck     ( Command/Fsck.hs, tmp/Command/Fsck.o )+    [227 of 279] Compiling Command.Reinject ( Command/Reinject.hs, tmp/Command/Reinject.o )+    [228 of 279] Compiling Command.Migrate  ( Command/Migrate.hs, tmp/Command/Migrate.o )+    [229 of 279] Compiling Command.Unused   ( Command/Unused.hs, tmp/Command/Unused.o )+    [230 of 279] Compiling Command.Status   ( Command/Status.hs, tmp/Command/Status.o )+    [231 of 279] Compiling Command.Sync     ( Command/Sync.hs, tmp/Command/Sync.o )+    [232 of 279] Compiling Command.Help     ( Command/Help.hs, tmp/Command/Help.o )+    [233 of 279] Compiling Command.AddUrl   ( Command/AddUrl.hs, tmp/Command/AddUrl.o )+    [234 of 279] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, tmp/Assistant/DaemonStatus.o )+    [235 of 279] Compiling Assistant.Sync   ( Assistant/Sync.hs, tmp/Assistant/Sync.o )+    [236 of 279] Compiling Assistant.MakeRemote ( Assistant/MakeRemote.hs, tmp/Assistant/MakeRemote.o )+    [237 of 279] Compiling Assistant.XMPP.Git ( Assistant/XMPP/Git.hs, tmp/Assistant/XMPP/Git.o )+    [238 of 279] Compiling Command.XMPPGit  ( Command/XMPPGit.hs, tmp/Command/XMPPGit.o )+    [239 of 279] Compiling Assistant.Threads.NetWatcher ( Assistant/Threads/NetWatcher.hs, tmp/Assistant/Threads/NetWatcher.o )+    [240 of 279] Compiling Assistant.NamedThread ( Assistant/NamedThread.hs, tmp/Assistant/NamedThread.o )+    [241 of 279] Compiling Assistant.WebApp.Notifications ( Assistant/WebApp/Notifications.hs, tmp/Assistant/WebApp/Notifications.o )++    Assistant/WebApp/Notifications.hs:39:11:+        No instances for (Text.Julius.ToJavascript String,+                          Text.Julius.ToJavascript Text)+          arising from a use of `Text.Julius.toJavascript'+        Possible fix:+          add instance declarations for+          (Text.Julius.ToJavascript String, Text.Julius.ToJavascript Text)+        In the first argument of `Text.Julius.Javascript', namely+          `Text.Julius.toJavascript delay'+        In the expression:+          Text.Julius.Javascript (Text.Julius.toJavascript delay)+        In the first argument of `Data.Monoid.mconcat', namely+          `[Text.Julius.Javascript+              ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')+                 "function longpoll_"),+            Text.Julius.Javascript (Text.Julius.toJavascript ident),+            Text.Julius.Javascript+              ((Data.Text.Lazy.Builder.fromText . Text.Shakespeare.pack')+                 "() {\+                 \\tlongpoll(longpoll_"),+            Text.Julius.Javascript (Text.Julius.toJavascript ident), ....]'+    make: *** [git-annex] Error 1++> Reproduced this and confirmed it's fixed in git. --[[Joey]] [[done]]
+ doc/bugs/3.20121112_build_fails_on_Ubuntu_12.04.mdwn view
@@ -0,0 +1,97 @@+What steps will reproduce the problem?++* Start with Ubuntu 12.04+* sudo apt-get install haskell-platform libgsasl7-dev gsasl g2hs+* cabal install git-annex --bindir=$HOME/bin++What is the expected output? What do you see instead?++Expected omething like "installation successful"++Actual output, after build notices:+++Loading package IfElse-0.85 ... linking ... done.+Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libdiskfree.o ... done+Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done+final link ... done+[157 of 279] Compiling Assistant.Types.DaemonStatus ( Assistant/Types/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/Types/DaemonStatus.o )+[158 of 279] Compiling Assistant.Monad  ( Assistant/Monad.hs, dist/build/git-annex/git-annex-tmp/Assistant/Monad.o )++Assistant/Monad.hs:86:16:+    Couldn't match expected type `Assistant a'+                with actual type `Reader AssistantData a'+    Expected type: (AssistantData -> a) -> Assistant a+      Actual type: (AssistantData -> a) -> Reader AssistantData a+    In the expression: reader+    In an equation for `getAssistant': getAssistant = reader++Assistant/Monad.hs:93:15:+    Couldn't match expected type `Assistant t0'+                with actual type `Reader r0 a0'+    In the return type of a call of `reader'+    In a stmt of a 'do' block: st <- reader threadState+    In the expression:+      do { st <- reader threadState;+           liftIO $ runThreadState st a }++Assistant/Monad.hs:99:14:+    Couldn't match expected type `Assistant t0'+                with actual type `Reader r0 a0'+    In the return type of a call of `reader'+    In a stmt of a 'do' block: d <- reader id+    In the expression:+      do { d <- reader id;+           liftIO $ io $ runAssistant d a }++Assistant/Monad.hs:105:14:+    Couldn't match expected type `Assistant t0'+                with actual type `Reader r0 a0'+    In the return type of a call of `reader'+    In a stmt of a 'do' block: d <- reader id+    In the expression:+      do { d <- reader id;+           return $ runAssistant d a }++Assistant/Monad.hs:110:14:+    Couldn't match expected type `Assistant t0'+                with actual type `Reader r0 a0'+    In the return type of a call of `reader'+    In a stmt of a 'do' block: d <- reader id+    In the expression:+      do { d <- reader id;+           return $ \ v -> runAssistant d $ a v }++Assistant/Monad.hs:115:14:+    Couldn't match expected type `Assistant t0'+                with actual type `Reader r0 a0'+    In the return type of a call of `reader'+    In a stmt of a 'do' block: d <- reader id+    In the expression:+      do { d <- reader id;+           return $ \ v1 v2 -> runAssistant d (a v1 v2) }++Assistant/Monad.hs:120:12:+    Couldn't match expected type `Assistant a0'+                with actual type `Reader r0 a1'+    In the return type of a call of `reader'+    In the first argument of `(>>=)', namely `reader v'+    In the expression: reader v >>= liftIO . io+cabal: Error: some packages failed to install:+git-annex-3.20121112 failed during the building phase. The exception was:+ExitFailure 1+++What version of git-annex are you using? On what operating system?++git annex 3.20121112+Ubuntu 12.04 (current "long term support", all packages up to date)++Please provide any additional information below.++No idea how important this is for git-annex in general but reporting in case it is. Thank you for working on git annex!++> I was able to reproduce this build error when I force installed+> an old version of the haskell mtl library. So git-annex needs version+> 2.1.1 to build, and I have adjusted the build dependencies appropriately.+> [[done]] --[[Joey]] 
+ doc/bugs/3.20121113_build_error___39__not_in_scope_getAddBoxComR__39__.mdwn view
@@ -0,0 +1,33 @@+What steps will reproduce the problem?++Building from latest source, Cabal update, cabal install --only dependencies, cabal configure, Cabal build++What is the expected output? What do you see instead?++Error message from build++...++Loading package DAV-0.2 ... linking ... done.++Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libdiskfree.o ... done++Loading object (static) dist/build/git-annex/git-annex-tmp/Utility/libmounts.o ... done++final link ... done+++Assistant/Threads/WebApp.hs:47:1: Not in scope: `getAddBoxComR'++Assistant/Threads/WebApp.hs:47:1: Not in scope: `getEnableWebDAVR'+++What version of git-annex are you using? On what operating system?++Latest version via git from git-annex.branchable.com++Debian Squeeze (6.0.6)++Please provide any additional information below.++> I noticed this earlier and fixed it. [[done]] --[[Joey]]
+ doc/bugs/4.20130601_xmpp_sync_error.mdwn view
@@ -0,0 +1,125 @@+4.20130601 xmpp sync error.++setup: A debian machine, with indirect fresh annex, android galaxy s3 with a+fresh direct annex, both running ga-20130601.++steps:+- Start assistant on both, add jabber account to both.+- Add box.com account on desktop with no encryption, (now correctly shows up on android, wasn't the case with 20130521).+- Add hello.txt on desktop repo, filename is now visible on android, but content is not.+- Add greeting.txt on desktop, nothing shows up on android, content still missing for hello.txt+- Webapp shows uploading messages, but no errors.+- Manually checking box.com confirms that files have been uploaded.++debian desktop daemon.log:++    [2013-06-02 17:57:03 CEST] main: starting assistant version 4.20130601+    (scanning...) [2013-06-02 17:57:03 CEST] Watcher: Performing startup scan+    (started...) [2013-06-02 17:57:52 CEST] XMPPClient: Pairing with myJabberAccount in progress+    [2013-06-02 17:57:53 CEST] XMPPReceivePack: Syncing with myJabberAccount +    [2013-06-02 17:58:03 CEST] XMPPClient: Pairing with myJabberAccount in progress+    [2013-06-02 17:58:52 CEST] main: Syncing with box.com +    warning: Not updating non-default fetch respec+	+	Please update the configuration manually if necessary.+    fatal: The remote end hung up unexpectedly+    [2013-06-02 17:59:53 CEST] XMPPReceivePack: Syncing with myJabberAccount +    [2013-06-02 18:00:02 CEST] Committer: Adding hello.txt++    (testing WebDAV server...)+    add hello.txt (checksum...) [2013-06-02 18:00:02 CEST] Committer: Committing changes to git+    [2013-06-02 18:00:02 CEST] XMPPSendPack: Syncing with myJabberAccount +    Already up-to-date.+    [2013-06-02 18:00:03 CEST] Committer: Committing changes to git+    fatal: The remote end hung up unexpectedly+    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:00:03 CEST] XMPPSendPack: Syncing with myJabberAccount ++    +100%          1.0 B/s 0s+                        +[2013-06-02 18:00:19 CEST] Transferrer: Uploaded hello.txt+    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:01:53 CEST] XMPPReceivePack: Syncing with myJabberAccount +    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:02:04 CEST] XMPPSendPack: Syncing with myJabberAccount +    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:03:53 CEST] XMPPReceivePack: Syncing with myJabberAccount +    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:05:10 CEST] Committer: Adding greeting.txt+    ok+    (Recording state in git...)+    (Recording state in git...)++    (Recording state in git...)+    add greeting.txt (checksum...) [2013-06-02 18:05:10 CEST] Committer: Committing changes to git+    [2013-06-02 18:05:10 CEST] XMPPSendPack: Syncing with myJabberAccount +    Already up-to-date.+    [2013-06-02 18:05:11 CEST] Committer: Committing changes to git++    +100%          9.0 B/s 0s+                        +[2013-06-02 18:05:24 CEST] Transferrer: Uploaded greeting.txt+    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:06:13 CEST] XMPPReceivePack: Syncing with myJabberAccount +    ok+    (Recording state in git...)+    (Recording state in git...)++    (Recording state in git...)+    fatal: The remote end hung up unexpectedly++Thanks as always.+++Android daemon.log:+    [2013-06-02 17:53:07 CEST] main: starting assistant version 4.20130601-g7483ca4+    (scanning...) [2013-06-02 17:53:07 CEST] Watcher: Performing startup scan+    (started...) [2013-06-02 17:57:51 CEST] XMPPClient: Pairing with myJabberAccount in progress+    [2013-06-02 17:57:52 CEST] XMPPSendPack: Syncing with myJabberAccount +    Already up-to-date.+    [2013-06-02 17:58:00 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 17:58:00 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 17:58:02 CEST] XMPPClient: Pairing with myJabberAccount in progress+    [2013-06-02 17:58:07 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 17:58:07 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 17:58:15 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 18:00:02 CEST] XMPPReceivePack: Syncing with myJabberAccount +    [2013-06-02 18:00:03 CEST] XMPPReceivePack: Unable to download files from your other devices. +    [2013-06-02 18:00:04 CEST] XMPPReceivePack: Syncing with myJabberAccount +    Merge made by the 'recursive' strategy.+     hello.txt | 1 ++     1 file changed, 1 insertion(+)+     create mode 120000 hello.txt+    [2013-06-02 18:00:05 CEST] Committer: Committing changes to git+    [2013-06-02 18:00:06 CEST] XMPPSendPack: Syncing with myJabberAccount +    Already up-to-date.+    [2013-06-02 18:00:14 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 18:00:14 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 18:00:25 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 18:02:03 CEST] Committer: Committing changes to git+    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:02:04 CEST] XMPPReceivePack: Unable to download files from your other devices. +    [2013-06-02 18:02:04 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 18:02:04 CEST] XMPPReceivePack: Syncing with myJabberAccount +    [2013-06-02 18:02:13 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 18:02:15 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 18:02:24 CEST] XMPPSendPack: Unable to download files from your other devices. +    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:04:04 CEST] XMPPReceivePack: Unable to download files from your other devices. +    [2013-06-02 18:05:10 CEST] XMPPReceivePack: Syncing with myJabberAccount +    [2013-06-02 18:06:12 CEST] Committer: Committing changes to git+    [2013-06-02 18:06:13 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 18:06:21 CEST] XMPPSendPack: Unable to download files from your other devices. +    [2013-06-02 18:06:21 CEST] XMPPSendPack: Syncing with myJabberAccount +    [2013-06-02 18:06:29 CEST] XMPPSendPack: Unable to download files from your other devices. +    fatal: The remote end hung up unexpectedly+    [2013-06-02 18:07:10 CEST] XMPPReceivePack: Unable to download files from your other devices. +++thanks++> Since this seems clearly a lack of box.com being configured +> to be used on the Android, I'm closing the bug: [[done]]. +> If I'm wrong, write back, and I'll reopen ;) --[[Joey]]
+ doc/bugs/400_mode_leakage.mdwn view
@@ -0,0 +1,25 @@+git-annex tends to preserve files that are added to an annex with+a mode such as 400. (Happens to me sometimes with email attachments.) +As these files are rsynced around, and end up on eg, a+publically visible repo with a webserver frontend, or a repo that is+acessible to a whole group of users, they will not be readable. ++I think it would make sense for git-annex to normalize file permissions+when adding them. Of course, there's some tension here with generally+storing file metadata when possible. Perhaps the normalization should only+ensure that group and other have read access?++(Security: We can assume that a repo that is not intended to be public is+in a 700 directory. And since git-annex cannot preserve file modes when+files transit through a special remote, using modes to limit access to+individual files is not wise.)++--[[Joey]]++> Revisiting this, git-annex already honors core.sharedrepository settings,+> so I just needed to set it to `world` to allow everyone to read.+> +> There was a code path in direct mode where that didn't work; fixed that.+> +> [[done]]+> --[[Joey]] 
+ doc/bugs/Add_another_repository_on_USB_drive_causes_sync_loop.mdwn view
@@ -0,0 +1,22 @@+What steps will reproduce the problem?++Mount USB drive formatted as FAT+Make directory for repository in it.+Set up another repository and choose to sync it with the existing one.++What is the expected output? What do you see instead?+The files should transfer from the main repository to the directory on the USB drive.+This happens, but afterwards a new sync happens from the USB drive repository back to the other existing repositories, because the file date of all the files on the USB drive has been set to today.+Further, git seemed to keep the USB key locked so umount was impossible until after killing it.++What version of git-annex are you using? On what operating system?+4.20130405+Linux++Please provide any additional information below.+++> Reproduced the core bug, which is that the assistant saw symlink standin+> files as new files, and annexed them. Now it doesn't, and I have+> it running on FAT with no trouble; can even rename symlink standin files+> and it commits symlink changes. Calling this [[done]]. --[[Joey]]
+ doc/bugs/Adding_box.com_remote_on_Android_fails_for_me.mdwn view
@@ -0,0 +1,20 @@+### Please describe the problem.++After submitting the form in the webapp for adding a box.com remote, I get:++   Internal Server Error - WEBDAV failed to write file: "Unauthorized": user error++### What steps will reproduce the problem?++Fill in the box.com add remote form. Username=username, password=password, "share..."=checked, directory=annex, Encryption="Encrypt all data" and hit the "Add repository" button.++### What version of git-annex are you using? On what operating system?++  git-annex version 4.20130513-g5185533 on Android 4.2.2++### Please provide any additional information below.++Didn't find a .git/annex/debug.log++> This error seems entirely consistent with you entering the wrong password.+> [[done]] --[[Joey]]
+ doc/bugs/Adding_git_ssh_remote_fails.mdwn view
@@ -0,0 +1,32 @@+### Please describe the problem.++While trying to add a ssh remote, the webapp promts the error:++    Reinitialized existing shared Git repository in /home/chris/annex-test/+    git-annex: please specify a description of this repository++resp.++    Initialized empty shared Git repository in /home/chris/annex-test-2/+    git-annex: please specify a description of this repository++### What steps will reproduce the problem?++Adding a ssh git remote.++### What version of git-annex are you using? On what operating system?++4.20130704-gaf18656 linux-amd64 and android++### 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++only successful ssh key generation in daemon.log++# End of transcript or log.+"""]]++> [[done]]; bad installation. --[[Joey]]
+ doc/bugs/Adding_second_remote_repository_over_ssh_fails.mdwn view
@@ -0,0 +1,41 @@+What steps will reproduce the problem?++Create a local and "remote server" repository++Create another local repositorty and keep it seperate from the first one. Fails while creating second repository on the remote.++What is the expected output? What do you see instead?++Expected to get two seperate repositories on the client and server. Only first one works.++Got an error:++    Failed to make repository++    Something went wrong setting up the repository on the remote server.++    Transcript: fatal: unrecognized command 'sh -c 'mkdir -p '"'"'second'"'"'&&cd '"'"'second'"'"'&&git init --bare --shared&&git annex init&&mkdir -p ~/.ssh&&if [ ! -e ~/.ssh/git-annex-shell ]; then (echo '"'"'#!/bin/sh'"'"';echo '"'"'set -e'"'"';echo '"'"'if [ "x$SSH_ORIGINAL_COMMAND" != "x" ]; then'"'"';echo '"'"'exec git-annex-shell -c "$SSH_ORIGINAL_COMMAND"'"'"';echo '"'"'else'"'"';echo '"'"'exec git-annex-shell -c "$@"'"'"';echo '"'"'fi'"'"') > ~/.ssh/git-annex-shell; fi&&chmod 700 ~/.ssh/git-annex-shell&&touch ~/.ssh/authorized_keys&&chmod 600 ~/.ssh/authorized_keys&&echo '"'"'command="GIT_ANNEX_SHELL_DIRECTORY='"'"'"'"'"'"'"'"'second'"'"'"'"'"'"'"'"' ~/.ssh/git-annex-shell",no-agent-forwarding,no-port-forwarding,no-X11-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvoTn+XBdlw/mQlu+NScAeuddUJqJaVXH6KUsO09OddnUvzv4W185ezbAjXfWDgN7ou0Q0xQzwiCzdoSl7T3USJQ1ywTG5Xt2sBV3RIqxyReNA7Nz0yhwWhZBJcFzof34ezNIsi9NVgEJcK2JEs2XqhO5wK5nxEDeays7ti2bqY6V21iOWSy9hlzjD4VTWTEFxQkDp4BCzDpPN934ztOtInwI8ayiTRJZlNQ+ej/AaA+/zOBWNvIFc/96iuMLKY6lLFThw1jNj5r5N7yPaysLdnwTJ3irtCzDygCpD4mau4frrOPvG90ZdcdrQSfIjRtM9nPZ5jIpohfvz0dIfgNFz marvin@marvin-U-100 '"'"' >>~/.ssh/authorized_keys'' git-annex-shell: git-shell failed+++What version of git-annex are you using? On what operating system?++4.20130413-g5747bf4 ubuntu 12.10 local++3.20120629 debian wheezy remote (also tried 4.20130413-g5747bf4)++Please provide any additional information below.++> This bug would appear to be the same as a bug I fixed today.+> +> Except this last bit:++**Also noticed if a user has no full name set in unix account, creating+remote repository always fails**++> So, I'm going to repurpose this bug to track that problem. --[[Joey]]++[[!meta title="assistant can fail to make git repository if remote server is lacking GECOS"]]++>> [[done]]; git-annex always checks for missing gecos and enables+>> a workaround. This does mean the server needs to be upgraded in order+>> for the fix to work. --[[Joey]]
+ doc/bugs/Addurl_downloads_but_does_not_checkout_files.mdwn view
@@ -0,0 +1,74 @@+What steps will reproduce the problem?++Example below illustrates downloading a podcast with git annex addurl:++list directory before...++~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls+folder.jpg           tuxradar_s04e24.ogg+tuxradar_s04e09.ogg  tuxradar_s05e01.ogg+tuxradar_s04e11.ogg  tuxradar_s05e02.ogg+tuxradar_s04e13.ogg  tuxradar_s05e03.ogg+tuxradar_s04e15.ogg  tuxradar_s05e04.ogg+tuxradar_s04e16.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg+tuxradar_s04e19.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg+tuxradar_s04e20.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg+tuxradar_s04e21.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg+tuxradar_s04e22.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg+tuxradar_s04e23.ogg++download file...++~/Podcasts/TuxRadar Linux Podcast (Ogg)$ git annex addurl http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg+addurl www.tuxradar.com_files_podcast_tuxradar_s05e05.ogg (downloading http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg ...) --2013-04-10 21:18:12--  http://www.tuxradar.com/files/podcast/tuxradar_s05e05.ogg+Resolving www.tuxradar.com (www.tuxradar.com)... 80.244.178.150+Connecting to www.tuxradar.com (www.tuxradar.com)|80.244.178.150|:80... connected.+HTTP request sent, awaiting response... 200 OK+Length: 33249291 (32M) [application/ogg]+Saving to: `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg'++100%[===============================>] 33,249,291   404K/s   in 81s     ++2013-04-10 21:19:35 (399 KB/s) - `/home/rob/Podcasts/.git/annex/tmp/URL--http&c%%www.tuxradar.com%files%podcast%tuxradar_s05e05.ogg' saved [33249291/33249291]++(checksum...) ok+(Recording state in git...)++file appears to have been downloaded, but isn't there...++~/Podcasts/TuxRadar Linux Podcast (Ogg)$ ls+folder.jpg           tuxradar_s04e24.ogg+tuxradar_s04e09.ogg  tuxradar_s05e01.ogg+tuxradar_s04e11.ogg  tuxradar_s05e02.ogg+tuxradar_s04e13.ogg  tuxradar_s05e03.ogg+tuxradar_s04e15.ogg  tuxradar_s05e04.ogg+tuxradar_s04e16.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e10.ogg+tuxradar_s04e19.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e12.ogg+tuxradar_s04e20.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e14.ogg+tuxradar_s04e21.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e17.ogg+tuxradar_s04e22.ogg  www.tuxradar.com_files_podcast_tuxradar_s04e18.ogg+tuxradar_s04e23.ogg++What is the expected output? What do you see instead?++File should exist in current directory. As you can see from above output, this has worked in the past (with older versions).++What version of git-annex are you using? On what operating system?++git-annex version: 4.20130405+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++OS: Debian Testing/Unstable++Please provide any additional information below.++The repository in question was created by the assistant and I tried the above with the assistant both running and not running, with no difference. I have also tried downloading other files.++EDIT: formatting++> Bug only affected direct mode. I think it used to work but I broke+> it when fixing another bug in direct mode. [[fixed|done]] --[[Joey]] 
+ doc/bugs/Allow_syncing_to_a_specific_directory_on_a_USB_remote.mdwn view
@@ -0,0 +1,30 @@+This follows up to the [comment made by+Laszlo](http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/#comment-f26d3b6b45bb66601ecfaa883ace161c)+on the [recent+poll](http://git-annex.branchable.com/design/assistant/polls/what_is_preventing_me_from_using_git-annex_assistant/).++I too need to be able to select the directory on the remote drive that the+annex will be synced to.++If I just add a remote drive via the web app, it syncs the repository to+`/mnt/usb/annex`, and it looks like it just creates a bare repository in+that folder. I need the repository to be synced to something like+`/mnt/usb/subfolder/myspecifiedfoldername` and I need that remote to be a+full repository.++My use case is that I use the USB drive to keep annexes in sync between two+computers. I have multiple annexes that need to be synced between the two+computers, and none of them are in a directory called `annex`. I also need+to be able to plug the drive into other computers and access the files+directly, without doing a `git clone` or anything like that. I have all of+this setup and working fine with just plain old git annex, but the web app+does not seem to support creating new repositories with this workflow.++I think it makes a lot of sense to allow the web application to add a new+remote that is simply a directory. People like me could specify the path of+the directory to be on the mounted USB drive. Others may want to add a+remote that is a mounted network share or something like that.++> [[done]], the webapp now has a "Add another repository" option,+> and you can just enter the path to whatever place you like inside a USB+> drive.  --[[Joey]]
+ doc/bugs/Android_app_permission_denial_on_startup.mdwn view
@@ -0,0 +1,18 @@+### Please describe the problem.++Android app barfs on startup.++### What steps will reproduce the problem?++Download/install/start Android app :)++### What version of git-annex are you using? On what operating system?++Just downloaded the .apk (Friday May 3rd).  Android 4.2.2 on Google/LG Nexus 4 ++### Please provide any additional information below.++See this [screenshot](https://docs.google.com/file/d/0B8tqeaAn45VORU1ET1ZpTWxLTjQ/edit?usp=sharing).+Feel free to ping me on IRC if you need additional info or want to test a fix.++> [[done]]; now comprehensively fixed. --[[Joey]]
+ doc/bugs/Android_daily_build_missing_webapp.mdwn view
@@ -0,0 +1,23 @@+### Please describe the problem.++The daily Android build is missing the webapp, raising a bug in case this is unexpected.++### What steps will reproduce the problem?++Down the daily APK, it is 9MB.++### What version of git-annex are you using? On what operating system?+++### 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.+"""]]++> Probably several of them were. I've fixed the cabal file, re-running+> android build now. [[done]] --[[Joey]] 
+ doc/bugs/Annex_thinks_file_exists_afer_being_dropped.mdwn view
@@ -0,0 +1,27 @@+#### What steps will reproduce the problem?++I've posted some code here:+   https://gist.github.com/4552036+++#### What is the expected output? What do you see instead?++I think I've found three bugs.  If they aren't bugs then there is a usage issue that could do with some documentation improvements.++Problem 1 - With 3 local annexes git-annex doesn't seem to search properly for them  (See code)++Problem 2 - Even after a sync an annex thinks another (local) annex has a file, even after it has been dropped  (See code)++SCARY bug - `whereis` seems to think that a locally dropped file still exists  (See code) +++#### What version of git-annex are you using? On what operating system?++git-annex version: 3.20130114++OS: OSX 10.6.8+++#### Please provide any additional information below.++> [[done]]; see comments --[[Joey]] 
+ doc/bugs/Assistant_doesn__39__t_actually_sync_file_contents_by_default.mdwn view
@@ -0,0 +1,16 @@+### Please describe the problem.++I'm trying to use the assistant to replicate the basic dropbox functionality of having a synced folder between two machines. Instead of actually syncing file contents by default the assistant just creates broken symlinks.++### What steps will reproduce the problem?++I've setup two repositories with each other as ssh remotes and ran the assistant on each after setting them in direct mode. I can create files on each of the repositories and have them show up on the other but all that shows up is a broken link. Actual contents don't get transferred. If I do a "git annex get" I can get the contents just fine. I tried setting annex.numcopies to 2 and that didn't work either.++What I'm missing here is some setting to tell the assistant "sync the contents of every new file". What it's doing instead is unacceptable. If I have the file in both repositories and change it in one, the other repository gets it's previous version of the file replaced by a broken symlink. From my point of view for the assistant to be a dropbox replacement it should never, under any circumstances, create a broken symlink in the sync folder. I had understood that that's what direct mode was, but it's not behaving that way right now at least.++### What version of git-annex are you using? On what operating system?++My basic setup for testing is two Ubuntu 12.04 LTS machines running git-annex 4.20130501++> [[done]], broken ~/.config/git-annex/program file, which is now detected+> and worked around. --[[Joey]]
+ doc/bugs/Assistant_dropping_from_backup_repo.mdwn view
@@ -0,0 +1,28 @@+Setup:++* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable++Steps:++* clone existing repository and activate assistant+* Have USB drive, U, with repository group `backup` and preferred content string `standard`++Expected:++* Assistant never ever tries to drop anything from U++Actual:++* Assistant immediately tries to drop files from U; fortunately I didn't have the USB drive plugged in+* Changing the preferred content string of U to `present or include=*` stops the dropping, but this was never required before++Additional information:++* The files that the Assistant started trying to drop were, I believe, the first (alphabetically) files in my repository to contain non-ascii characters in their file names (some French accented letters)++Thanks.++> The non-ascii characters are the giveaway: For 1 version, git-annex used+> a regex library that failed to ever match non-ascii characters. So it+> thought backup repos, which match "*" with a regex, wanted no such files.+> This is [[fixed|done]]. --[[Joey]]
+ doc/bugs/Assistant_stalls_when_adding__47__creating_repo_on_ArchLinux.mdwn view
@@ -0,0 +1,75 @@+### Please describe the problem.++I am experiencing a weird issue with any install I've had on this one (and only) ArchLinux machine: all of aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 and a Cabal install just stall when trying to create the initial Git annex repo in the webapp.++When started, it offers me to create the annex in ~/annex/ or ~/Desktop/annex/, where ~ gets turned into /home/USER when I press “Make repository”, but nothing else happens. This is regardless of if that repo exists when I try to create it or start the webapp.++If I start the webapp from an existing annex (now in ~/annex), it seems to work a bit better, but any other remote (SSH) server that I try to add fails. I just get a fleeting Bootstrap message box when I click “Check this server”, and nothing in the logs of eithr git annex webapp or the ssh logs of the server.++If an annex exists, but I start the webapp from another directory, it just behaves as if none were found.++Calls to git annex assistant --autostart complain that "Nothing listed in /home/omehani/.config/git-annex/autostart". I have checked the permissions on that directory, and tried deleting it to let git-annex recreate it, which it did, to no avail.+++### What steps will reproduce the problem?++Install any of the git-annex packages available from AUR++### What version of git-annex are you using? On what operating system?++* up-to-date ArchLinux, Linux cancey 3.10.10-1-ARCH #1 SMP PREEMPT Fri Aug 30 11:30:06 CEST 2013 x86_64 GNU/Linux+* aur/git-annex 4.20130516-1, aur/git-annex-bin-4.20130909-1, aur/git-annex-standalone-4.20130909-1 or through Cabal (on 2013-09-12)++### Please provide any additional information below.++The following is the output of webapp --debug. Nothing actually appears when trying to add/edit a repo.++[[!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++~/annex (master)$ git annex webapp --debug+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","show-ref","git-annex"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..27c891f84f6ea7a10c68c0dd696ab84d88ef0cec","--oneline","-n1"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..d0a1cb518045af01b443694aa2cd9af6386de38a","--oneline","-n1"]+[2013-09-16 10:26:55 EST] read: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","log","refs/heads/git-annex..3ff23e23d74ace008b03143120e84f07e52ed8ee","--oneline","-n1"]+[2013-09-16 10:26:55 EST] chat: git ["--git-dir=/home/omehani/annex/.git","--work-tree=/home/omehani/annex","cat-file","--batch"]+[2013-09-16 10:26:55 EST] logging to /home/omehani/annex/.git/annex/daemon.log+[2013-09-16 10:26:55 EST] logging to /home/omehani/annex/.git/annex/daemon.log+Launching web browser on file:///home/omehani/annex/.git/annex/webapp.html+START /usr/lib/firefox/firefox "/home/omehani/annex/.git/annex/webapp.html"++(process:2699): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed+++# End of transcript or log.+"""]]++Running git annex from a different directory.+[[!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++~$ git annex webapp --debug+Launching web browser on file:///tmp/webapp3934.html+START /usr/lib/firefox/firefox "/tmp/webapp3934.html"++(process:4008): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed++# End of transcript or log.+"""]]++Trying the autostart:+[[!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++~$ git annex assistant --autostart --debug+git-annex: Nothing listed in /home/omehani/.config/git-annex/autostart+++# End of transcript or log.+"""]]++> workaround is in place [[done]] --[[Joey]]
+ doc/bugs/Assistant_uses_obsolete_GDU_volume_monitor.mdwn view
@@ -0,0 +1,28 @@+### What steps will reproduce the problem?++Run `git annex assistant`.+++### What is the expected output? What do you see instead?++git-annex complains:++     dbus failed; falling back to mtab polling (ClientError {clientErrorMessage =+        "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided+        by any .service files", clientErrorFatal = False})++This is because the `gvfs-gdu-volume-monitor` daemon has been obsoleted and removed from GNOME 3.6 (maybe even earlier).++git-annex should start using `gvfs-udisks2-volume-monitor` at bus name `org.gtk.Private.UDisks2VolumeMonitor`.++Alternatively, git-annex should stop relying on any per-user services, and use kernel interfaces directly when available. (This way, monitoring could work even if the user wasn't logged in and/or didn't have a DBus session bus.)++  * On all Linux kernels since 2.6.15, the `/proc/self/mounts` file is pollable – you can use **select(), poll() or epoll** to detect new mounted filesystems, without having to rely on periodic checks. (Run `findmnt -p` to see it in action.)++  * On BSD systems, kqueue on `/etc/mtab`.++### What version of git-annex are you using? On what operating system?++git-annex 3.20130102 on Linux 3.7.1, GNOME 3.7++> [[done]] --[[Joey]] 
+ doc/bugs/Build-depends_needs___39__hxt__39___added_-_3.20121127.mdwn view
@@ -0,0 +1,36 @@+What steps will reproduce the problem?++Install git-annex via cabal - either from Hackage or as a manual install.  (i.e. <http://git-annex.branchable.com/install/cabal/>)++What is the expected output? What do you see instead?++Expect a clean install.++However, get the following error:++    Assistant/Install.hs:24:8:+        Could not find module `Data.AssocList'+        It is a member of the hidden package `hxt-9.3.1.1'.+        Perhaps you need to add `hxt' to the build-depends in your .cabal file.+        Use -v to see a list of the files searched for.+++What version of git-annex are you using? On what operating system?++git-annex: 3.20121127+OS: Mac OSX 10.6.8++Please provide any additional information below.++The fix seems to be as simple as adding 'htx' to the 'git-annex.cabal' file:++    Executable git-annex+      Main-Is: git-annex.hs+      Build-Depends: MissingH, hslogger, directory, filepath,+       unix, containers, utf8-string, network (>= 2.0), mtl (>= 2.1.1),+       bytestring, old-locale, time,+       -- Added htx here+       hxt,+       pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP,++> I removed the need for hxt, which was accidental. [[done]] --[[Joey]] 
+ doc/bugs/Build_error_on_Mac_OSX_10.6.mdwn view
@@ -0,0 +1,11 @@+While following the instructions given at the OSX build page , I get this error:++$ make+ghc -O2 -Wall -ignore-package monads-fd -fspec-constr-count=5 --make git-annex++Utility/JSONStream.hs:14:8:+    Could not find module `Text.JSON':+      Use -v to see a list of the files searched for.+make: *** [git-annex] Error 1++> Updated the instructions. [[done]] --[[Joey]] 
+ doc/bugs/Build_failure_at_commit_1efe4f3.mdwn view
@@ -0,0 +1,45 @@+Applying this++<pre>+laplace:git-annex jtang$ git diff+diff --git a/Assistant/WebApp/Configurators.hs b/Assistant/WebApp/Configurators.hs+index b9630b1..bf36e59 100644+--- a/Assistant/WebApp/Configurators.hs++++ b/Assistant/WebApp/Configurators.hs+@@ -101,7 +101,7 @@ checkRepositoryPath p = do+  -+  - If run in another directory, the user probably wants to put it there. -}+ defaultRepositoryPath :: Bool -> IO FilePath+-defaultRepositoryPath firstrun = do++defaultRepositoryPath firstRun = do+        cwd <- liftIO $ getCurrentDirectory+        home <- myHomeDir+        if home == cwd && firstRun+</pre>++Causes this to occur,++<pre>+Assistant/WebApp/Configurators.hs:114:17:+    Couldn't match expected type `Control.Monad.Trans.RWS.Lazy.RWST+                                    (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])+                                    Enctype+                                    Ints+                                    (GHandler WebApp WebApp)+                                    t0'+                with actual type `Text'+    Expected type: String+                   -> Control.Monad.Trans.RWS.Lazy.RWST+                        (Maybe (Env, FileEnv), WebApp, [Yesod.Form.Types.Lang])+                        Enctype+                        Ints+                        (GHandler WebApp WebApp)+                        t0+      Actual type: String -> Text+    In the first argument of `(.)', namely `T.pack'+    In the first argument of `(<$>)', namely+      `T.pack . addTrailingPathSeparator'+make: *** [git-annex] Error 1+</pre>++> [[fixed|done]] --[[Joey]] 
+ doc/bugs/Building_fails:_Could_not_find_module___96__Text.Blaze__39__.mdwn view
@@ -0,0 +1,105 @@+What steps will reproduce the problem?++<pre>+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git+Cloning into 'git-annex'...+remote: Counting objects: 40580, done.+remote: Compressing objects: 100% (10514/10514), done.+remote: Total 40580 (delta 29914), reused 40502 (delta 29837)+Receiving objects: 100% (40580/40580), 9.17 MiB | 238 KiB/s, done.+Resolving deltas: 100% (29914/29914), done.+dominik@Atlantis:/var/tmp$ cd git-annex/+dominik@Atlantis:/var/tmp/git-annex$ cabal update+Downloading the latest package list from hackage.haskell.org+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies+Resolving dependencies...+All the requested packages are already installed:+Use --reinstall if you want to reinstall anyway.+dominik@Atlantis:/var/tmp/git-annex$ cabal configure+Resolving dependencies...+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )+[ 8 of 21] Compiling Utility.Exception ( Utility/Exception.hs, dist/setup/Utility/Exception.o )+[ 9 of 21] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/setup/Utility/TempFile.o )+[10 of 21] Compiling Utility.Misc     ( Utility/Misc.hs, dist/setup/Utility/Misc.o )+[11 of 21] Compiling Utility.Process  ( Utility/Process.hs, dist/setup/Utility/Process.o )+[12 of 21] Compiling Utility.FreeDesktop ( Utility/FreeDesktop.hs, dist/setup/Utility/FreeDesktop.o )+[13 of 21] Compiling Assistant.Install.AutoStart ( Assistant/Install/AutoStart.hs, dist/setup/Assistant/Install/AutoStart.o )+[14 of 21] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/setup/Utility/SafeCommand.o )+[15 of 21] Compiling Utility.Directory ( Utility/Directory.hs, dist/setup/Utility/Directory.o )+[16 of 21] Compiling Common           ( Common.hs, dist/setup/Common.o )+[17 of 21] Compiling Locations.UserConfig ( Locations/UserConfig.hs, dist/setup/Locations/UserConfig.o )+[18 of 21] Compiling Build.TestConfig ( Build/TestConfig.hs, dist/setup/Build/TestConfig.o )+[19 of 21] Compiling Build.Configure  ( Build/Configure.hs, dist/setup/Build/Configure.o )+[20 of 21] Compiling Build.InstallDesktopFile ( Build/InstallDesktopFile.hs, dist/setup/Build/InstallDesktopFile.o )+[21 of 21] Compiling Main             ( Setup.hs, dist/setup/Main.o )+Linking ./dist/setup/setup ...+  checking version... 3.20121018+  checking git... yes+  checking git version... 1.7.10.4+  checking cp -a... yes+  checking cp -p... yes+  checking cp --reflink=auto... yes+  checking uuid generator... uuidgen+  checking xargs -0... yes+  checking rsync... yes+  checking curl... yes+  checking wget... yes+  checking bup... no+  checking gpg... yes+  checking lsof... yes+  checking host... no+  checking ssh connection caching... yes+  checking sha1... sha1sum+  checking sha256... sha256sum+  checking sha512... sha512sum+  checking sha224... sha224sum+  checking sha384... sha384sum+Configuring git-annex-3.20121018...+dominik@Atlantis:/var/tmp/git-annex$ cabal build+Building git-annex-3.20121018...+Preprocessing executable 'git-annex' for git-annex-3.20121018...++Assistant/Alert.hs:21:8:+    Could not find module `Text.Blaze'+    It is a member of the hidden package `blaze-markup-0.5.1.1'.+    Perhaps you need to add `blaze-markup' to the build-depends in your .cabal file.+    Use -v to see a list of the files searched for.+</pre>++What is the expected output? What do you see instead?++I expect the latest git HEAD to build without an error message or provide me with a package I need to install. Instead the error above is shown. In fact the package requested is installed:++<pre>+dominik@Atlantis:/var/tmp/git-annex$ cabal install blaze-markup+Resolving dependencies...+All the requested packages are already installed:+blaze-markup-0.5.1.1+Use --reinstall if you want to reinstall anyway.+</pre>++What version of git-annex are you using? On what operating system?++git HEAD, Ubuntu 12.10++Please provide any additional information below.++<pre>+$ cabal --version+cabal-install version 0.14.0+using version 1.14.0 of the Cabal library ++$ ghc --version+The Glorious Glasgow Haskell Compilation System, version 7.4.2++$ uname -a+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux+</pre>++> [[done]] --[[Joey]]
+ doc/bugs/Building_fails:_Not_in_scope:___96__myHomeDir__39___.mdwn view
@@ -0,0 +1,56 @@+What steps will reproduce the problem?++Building of the current github HEAD fails with a strange error message regarding OSX. I'm not using OSX but Ubuntu 12.10, why is cabal trying to build these files?++<pre>+dominik@Atlantis:/var/tmp$ git clone git://github.com/joeyh/git-annex.git+Cloning into 'git-annex'...+remote: Counting objects: 40243, done.+remote: Compressing objects: 100% (10568/10568), done.+remote: Total 40243 (delta 29647), reused 40044 (delta 29449)+Receiving objects: 100% (40243/40243), 9.12 MiB | 184 KiB/s, done.+Resolving deltas: 100% (29647/29647), done.+dominik@Atlantis:/var/tmp$ cd git-annex/+dominik@Atlantis:/var/tmp/git-annex$ cabal update+Downloading the latest package list from hackage.haskell.org+dominik@Atlantis:/var/tmp/git-annex$ cabal install --only-dependencies+Resolving dependencies...+All the requested packages are already installed:+Use --reinstall if you want to reinstall anyway.+dominik@Atlantis:/var/tmp/git-annex$ cabal configure+Resolving dependencies...+[ 1 of 21] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/setup/Utility/FileSystemEncoding.o )+[ 2 of 21] Compiling Utility.Applicative ( Utility/Applicative.hs, dist/setup/Utility/Applicative.o )+[ 3 of 21] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/setup/Utility/PartialPrelude.o )+[ 4 of 21] Compiling Utility.UserInfo ( Utility/UserInfo.hs, dist/setup/Utility/UserInfo.o )+[ 5 of 21] Compiling Utility.Monad    ( Utility/Monad.hs, dist/setup/Utility/Monad.o )+[ 6 of 21] Compiling Utility.Path     ( Utility/Path.hs, dist/setup/Utility/Path.o )+[ 7 of 21] Compiling Utility.OSX      ( Utility/OSX.hs, dist/setup/Utility/OSX.o )++Utility/OSX.hs:22:17: Not in scope: `myHomeDir'+</pre>++What is the expected output? What do you see instead?++I expect cabal to build git-annex. ++What version of git-annex are you using? On what operating system?++github HEAD on Ubuntu 12.10++Please provide any additional information below.++<pre>+$ cabal --version+cabal-install version 0.14.0+using version 1.14.0 of the Cabal library ++$ ghc --version+The Glorious Glasgow Haskell Compilation System, version 7.4.2++$ uname -a+Linux Atlantis 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux++</pre>++> [[fixed|done]] --[[Joey]] 
+ doc/bugs/Cabal_cannot_solve_dependencies.mdwn view
@@ -0,0 +1,36 @@+### Please describe the problem.++This is a follow up of [[Problems building on Mac OS X]].+As of 4.20130521.1, cabal still cannot resolve the dependencies.++### What steps will reproduce the problem?++    cabal update+    cabal install git-annex-4.20130521.1 --user --only-dependencies++### Please provide any additional information below.++[[!format sh """+Resolving dependencies...+cabal: Could not resolve dependencies:+trying: git-annex-4.20130521.1+trying: git-annex-4.20130521.1:+webapp+trying: yesod-form-1.3.0+trying: yesod-core-1.2.1+rejecting: yesod-default-1.2.0 (conflict: git-annex-4.20130521.1:webapp =>+yesod-default(<1.2))+rejecting: yesod-default-1.1.3.2, 1.1.3.1, 1.1.3, 1.1.2, 1.1.1, 1.1.0.2,+1.1.0.1, 1.1.0 (conflict: yesod-core==1.2.1, yesod-default => yesod-core>=1.1+&& <1.2)+rejecting: yesod-default-1.0.1.1, 1.0.1, 1.0.0 (conflict: yesod-core==1.2.1,+yesod-default => yesod-core>=1.0 && <1.1)+rejecting: yesod-default-0.6.1 (conflict: yesod-core==1.2.1, yesod-default =>+yesod-core>=0.10.1 && <0.11)+rejecting: yesod-default-0.5.0 (conflict: yesod-core==1.2.1, yesod-default =>+yesod-core>=0.9.4 && <0.10)+rejecting: yesod-default-0.4.1, 0.4.0, 0.3.1 (conflict: yesod-core==1.2.1,+yesod-default => yesod-core>=0.9 && <0.10+"""]]++> At the risk of closing early again, I have uploaded a .2 with+> hints for the version of yesod-form and yesod-static. [[done]] --[[Joey]] 
+ doc/bugs/Cabal_dependency_monadIO_missing.mdwn view
@@ -0,0 +1,17 @@+Just issuing the command `cabal install` results in the following error message.++    Command/Add.hs:54:3:+        No instance for (Control.Monad.IO.Control.MonadControlIO+                           (Control.Monad.State.Lazy.StateT Annex.AnnexState IO))+          arising from a use of `handle' at Command/Add.hs:54:3-24++Adding the dependency for `monadIO` to `git-annex.cabal` should fix this?  +-- Thomas++> No, it's already satisfied by `monad-control` being listed as a+> dependency in the cabal file. Your system might be old/new/or broken,+> perhaps it's time to provide some details about the version of haskell+> and of `monad-control` you have installed? --[[Joey]] ++>> Closing as apparently user error or a broken system.+>> If you see this problem please do say. [[done]] --[[Joey]] 
+ doc/bugs/Calls_to_rsync_don__39__t_always_use__annex-rsync-options.mdwn view
@@ -0,0 +1,35 @@+What steps will reproduce the problem?++Add a rsync special remote - one that you need a username/password to access (stored in text file $HOME/.rsync.password):++    $ git annex initremote myrsync type=rsync rsyncurl=rsync://username@rsync.example.com/myrsync encryption=none+    $ git annex describe myrsync "rsync server"+    $ git config remote.myrsync.annex-rsync-options "--password-file=$HOME/.rsync.password"++Copy a file to the remote:++    $ git annex -d copy my-file --to myrsync++What is the expected output? What do you see instead?++Expect to see the file copied over to the rsync remote, but the check doesn't use the annex-rsync-options and asks for a password.  The debug output is:++    copy my-file (checking myrsync...) [2012-10-28 01:01:01 EST] call: sh ["-c","rsync --quiet 'rsync://username@rsync.example.com/myrsync/[...SNIP...]' 2>/dev/null"]++However the actual copy does use annex-rsync-options and the copy works:++    [2012-10-28 01:01:05 EST] read: rsync ["--password-file=/home/blah/.rsync.password","--progress","--recursive","--partial","--partial-dir=.rsync-partial","/home/blah/annex/.git/annex/tmp/rsynctmp/12345/","rsync://username@rsync.example.com/myrsync"]+++What version of git-annex are you using? On what operating system?++git-annex: 3.20121017++OS: Ubuntu 12.04++Please provide any additional information below.++I think this fix is as easy as including the annex-rsync-options wherever rsync is called.++> I belive there was only the one place this was neglected. [[done]]+> --[[Joey]]
+ doc/bugs/Can__39__t___34__git-annex_get__34___with_3.20111203.mdwn view
@@ -0,0 +1,27 @@+Hi there,++After updating to 3.20111203 (on Arch Linux) I noticed I was not able to use `git annex get` from a SSH remote (server running Arch Linux, same version of git-annex): "requested key is not present". Same behavior with current master (commit 6cf28585). I had no issue with the previous version (3.20111122).++On this server, I was able to track down the issue using `git-annex-shell inannex` and `strace`:++    $ strace -f -o log git-annex-shell inannex ~/photos-annex.git WORM-s369360-m1321602916--2011-11-17.jpg   +    $ echo $?+    1+    $ tail -n20 log+    [...]+    25623 chdir("/home/schnouki/git-annex") = 0+    25623 stat("/home/schnouki/photos-annex.git/annex/objects/082/676/WORM-s369360-m1321602916--2011-11-17.jpg/WORM-s369360-m1321602916--2011-11-17.jpg", {st_mode=S_IFREG|0400, st_size=369360, ...}) = 0+    25623 open("annex/objects/082/676/WORM-s369360-m1321602916--2011-11-17.jpg/WORM-s369360-m1321602916--2011-11-17.jpg", O_RDONLY) = -1 ENOENT (No such file or directory)+    [...]++Note there is a call to `stat()` with the full path to the requested file, and *then* a call to `open()` with a relative path -- which calls this call to fail, and git-annex-shell to return 1. With 3.20111122, there was no call to `stat()`, just a successful call to `open()` with a full absolute path.++Using `git bisect` I was able to determine that this bug appeared in commit 64672c62 ("refactor"). Reverting it makes `git-annex-shell` work as expected, but I'm sure there are better ways to fix this. However I don't know enough Haskell to do it myself.++Could you please try to fix this in a future version?++> Thanks for a very good bug report. +> +> I've fixed this stupid mistake introduced in the code refactoring.+> [[done]]+> --[[Joey]]
+ doc/bugs/Can__39__t_rename___34__here__34___repository.mdwn view
@@ -0,0 +1,32 @@+### Please describe the problem.+Trying to rename the "here" repository fails++### What steps will reproduce the problem?+* Start git-annex webapp in the console (for the first time, or remove old annex directory + .config/git-annex)+* In the browser window that opens click "Make repository"+* The "here" repository should show up in the dashboard+* Go to settings and select edit+* Change the repository name (e.g. to here2) and click save changes+* You should be back at the dashboard and the repository name is still "here"+++### What version of git-annex are you using? On what operating system?+* git-annex version: 4.20130601+* build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+* built using cabal+* on Ubuntu 13.04 32bit++### 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++[2013-06-12 22:22:57 CEST] main: starting assistant version 4.20130601+(scanning...) [2013-06-12 22:22:57 CEST] Watcher: Performing startup scan+(started...) ++# End of transcript or log.+"""]]++> Made text field for this repository disabled. The current repository has no remote name to edit. [[done]] --[[Joey]]
+ doc/bugs/Can__39__t_set_repositories_directory.mdwn view
@@ -0,0 +1,15 @@+Can't set the repository directory+++At beginning during the webapp installation+++0.0.1 for OS X 10.8.2+++user error (git ["--git-dir=/Users/filippo/Desktop/annex/.git","--work-tree=/Users/filippo/Desktop/annex","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] exited 128)++[[!tag moreinfo assistant]]++> [[done]]; based on the comment, this was a broken git email issue, which+> git-annex now works around. --[[Joey]]
+ doc/bugs/Can__39__t_start_on_Cyanogenmod_10.2_nightly.mdwn view
@@ -0,0 +1,158 @@+### Please describe the problem.+The android app won't start on Cyanogenmod 10.2. Not sure if this is cyanogenmod specific or if it is because the underlying android is now version 4.3++### What steps will reproduce the problem?+Install the apk and start the program++### What version of git-annex are you using? On what operating system?+A 7 day old nightly as of this post(can't get specific number since it won't run)++### Please provide any additional information below.++Tested this on both a samsung galaxy S and a samsung galaxy note 2. With different nightlies of cyanogenmod 10.2++[[!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++Falling back to hardcoded app location; cannot find expected files in /data/app-lib+git annex webapp+u0_a115@android:/sdcard/git-annex.home $ git annex webapp+CANNOT LINK EXECUTABLE: git-annex invalid R_ARM_COPY relocation against DT_SYMBOLIC shared library libc.so (built with -Bsymbolic?)+1|u0_a115@android:/sdcard/git-annex.home $++---+++cat git-annex-install.log++Installation starting to /data/data/ga.androidterm+34c88243533e9b0a725ebe33533d990e628dc44b+installing busybox+installing git-annex+installing git-shell+installing git-upload-pack+installing git+installing gpg+installing rsync+installing ssh+installing ssh-keygen+linking ./libexec/git-core/git-config to git+linking ./libexec/git-core/git-fetch to git+linking ./libexec/git-core/git-fsck to git+linking ./libexec/git-core/git-unpack-file to git+linking ./libexec/git-core/git-get-tar-commit-id to git+linking ./libexec/git-core/git-fmt-merge-msg to git+linking ./libexec/git-core/git-push to git+linking ./libexec/git-core/git-for-each-ref to git+linking ./libexec/git-core/git-pack-redundant to git+linking ./libexec/git-core/git-mv to git+linking ./libexec/git-core/git-ls-remote to git+linking ./libexec/git-core/git-prune-packed to git+linking ./libexec/git-core/git-apply to git+linking ./libexec/git-core/git-check-ignore to git+linking ./libexec/git-core/git-log to git+linking ./libexec/git-core/git-cherry-pick to git+linking ./libexec/git-core/git-diff-files to git+linking ./libexec/git-core/git-commit-tree to git+linking ./libexec/git-core/git-index-pack to git+linking ./libexec/git-core/git-reflog to git+linking ./libexec/git-core/git-merge-index to git+linking ./libexec/git-core/git-column to git+linking ./libexec/git-core/git-checkout-index to git+linking ./libexec/git-core/git-diff-index to git+linking ./libexec/git-core/git-count-objects to git+linking ./libexec/git-core/git-fast-export to git+linking ./libexec/git-core/git-fetch-pack to git+linking ./libexec/git-core/git-merge-file to git+linking ./libexec/git-core/git-init to git+linking ./libexec/git-core/git-remote to git+linking ./libexec/git-core/git-init-db to git+linking ./libexec/git-core/git-ls-tree to git+linking ./libexec/git-core/git-merge-subtree to git+linking ./libexec/git-core/git-rev-parse to git+linking ./libexec/git-core/git-bundle to git+linking ./libexec/git-core/git-prune to git+linking ./libexec/git-core/git-peek-remote to git+linking ./libexec/git-core/git-tar-tree to git+linking ./libexec/git-core/git-describe to git+linking ./libexec/git-core/git-update-index to git+linking ./libexec/git-core/git to git+linking ./libexec/git-core/git-revert to git+linking ./libexec/git-core/git-show-ref to git+linking ./libexec/git-core/git-upload-archive to git+linking ./libexec/git-core/git-add to git+linking ./libexec/git-core/git-verify-tag to git+linking ./libexec/git-core/git-format-patch to git+linking ./libexec/git-core/git-show-branch to git+linking ./libexec/git-core/git-remote-fd to git+linking ./libexec/git-core/git-pack-refs to git+linking ./libexec/git-core/git-replace to git+linking ./libexec/git-core/git-pack-objects to git+linking ./libexec/git-core/git-notes to git+linking ./libexec/git-core/git-tag to git+linking ./libexec/git-core/git-var to git+linking ./libexec/git-core/git-help to git+linking ./libexec/git-core/git-gc to git+linking ./libexec/git-core/git-check-ref-format to git+linking ./libexec/git-core/git-shortlog to git+linking ./libexec/git-core/git-stage to git+linking ./libexec/git-core/git-mktree to git+linking ./libexec/git-core/git-merge-recursive to git+linking ./libexec/git-core/git-grep to git+linking ./libexec/git-core/git-clean to git+linking ./libexec/git-core/git-merge-base to git+linking ./libexec/git-core/git-repo-config to git+linking ./libexec/git-core/git-hash-object to git+linking ./libexec/git-core/git-read-tree to git+linking ./libexec/git-core/git-rm to git+linking ./libexec/git-core/git-fsck-objects to git+linking ./libexec/git-core/git-ls-files to git+linking ./libexec/git-core/git-mktag to git+linking ./libexec/git-core/git-stripspace to git+linking ./libexec/git-core/git-mailsplit to git+linking ./libexec/git-core/git-diff-tree to git+linking ./libexec/git-core/git-merge-ours to git+linking ./libexec/git-core/git-cherry to git+linking ./libexec/git-core/git-checkout to git+linking ./libexec/git-core/git-rev-list to git+linking ./libexec/git-core/git-write-tree to git+linking ./libexec/git-core/git-update-ref to git+linking ./libexec/git-core/git-blame to git+linking ./libexec/git-core/git-archive to git+linking ./libexec/git-core/git-update-server-info to git+linking ./libexec/git-core/git-merge-tree to git+linking ./libexec/git-core/git-show to git+linking ./libexec/git-core/git-remote-ext to git+linking ./libexec/git-core/git-merge to git+linking ./libexec/git-core/git-name-rev to git+linking ./libexec/git-core/git-bisect--helper to git+linking ./libexec/git-core/git-clone to git+linking ./libexec/git-core/git-symbolic-ref to git+linking ./libexec/git-core/git-send-pack to git+linking ./libexec/git-core/git-commit to git+linking ./libexec/git-core/git-mailinfo to git+linking ./libexec/git-core/git-credential to git+linking ./libexec/git-core/git-diff to git+linking ./libexec/git-core/git-patch-id to git+linking ./libexec/git-core/git-rerere to git+linking ./libexec/git-core/git-branch to git+linking ./libexec/git-core/git-reset to git+linking ./libexec/git-core/git-receive-pack to git+linking ./libexec/git-core/git-verify-pack to git+linking ./libexec/git-core/git-unpack-objects to git+linking ./libexec/git-core/git-check-attr to git+linking ./libexec/git-core/git-whatchanged to git+linking ./libexec/git-core/git-status to git+linking ./libexec/git-core/git-cat-file to git+linking ./libexec/git-core/git-annotate to git+linking ./bin/git-upload-archive to git+linking ./bin/git-receive-pack to git+linking ./libexec/git-core/git-shell to git-shell+linking ./libexec/git-core/git-upload-pack to git-upload-pack+Installation complete++# End of transcript or log.+"""]]++> [[dup|done]] of [[git-annex_broken_on_Android_4.3]].--[[Joey]] 
+ doc/bugs/Cannot_build_the_latest_with_GHC_7.6.1.mdwn view
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++cabal install git-annex++What is the expected output? What do you see instead?++I get this:++    Assistant/WebApp/Configurators/Local.hs:55:11:+    `fieldEnctype' is not a (visible) field of constructor `Field'++What version of git-annex are you using? On what operating system?++20121127++Please provide any additional information below.++> [[done]]; see comments. --[[Joey]] 
+ doc/bugs/Cannot_clone_an_annex.mdwn view
@@ -0,0 +1,69 @@+I have an annex that I use to store my digital photos.  I had a few false+starts creating this annex, but now it's looking good on my server:++    root@titan.local:/tank/Media/Pictures# git annex status+    supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+    supported remote types: git S3 bup directory rsync web hook+    trusted repositories: 0+    semitrusted repositories: 2+            00000000-0000-0000-0000-000000000001 -- web+            be88bc5a-17e2-11e2-a99b-d388d4437350 -- here (titan)+    untrusted repositories: 0+    dead repositories: 5+            0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan+            57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan+            6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan+            D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes+            EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes+    transfers in progress: none+    available local disk space: unknown+    local annex keys: 20064+    local annex size: 217 gigabytes+    known annex keys: 21496+    known annex size: 217 gigabytes+    bloom filter size: 16 mebibytes (4% full)+    backend usage: +            SHA256E: 41560+    root@titan.local:/tank/Media/Pictures# git annex unused+    unused . (checking for unused data...) ok++It passes `git annex fsck` without any problems.  However, when I "git clone"+this annex to my desktop machine and then do a `git annex sync`, I see this:++    Vulcan /Volumes/tank/Media/Pictures (master) $ git annex status+    supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+    supported remote types: git S3 bup directory rsync web hook+    trusted repositories: 0+    semitrusted repositories: 5+            00000000-0000-0000-0000-000000000001 -- web+            0A9F3136-A12A-43C7-9BE2-33F59954FD52 -- vulcan+            274D3474-7A25-44CD-8368-CF11C451014F -- here (vulcan)+            EE327B34-3E20-4B5B-8F0E-D500CBC9738D -- hermes+            be88bc5a-17e2-11e2-a99b-d388d4437350 -- titan+    untrusted repositories: 0+    dead repositories: 3+            57349F02-E497-4420-9230-6B15D8AB14EE -- vulcan+            6195C912-2707-4B75-AC8C-11C51FAA8FE0 -- vulcan+            D51DEDC4-9255-4A99-8520-2B1CED337674 -- hermes+    transfers in progress: none+    available local disk space: 1 terabyte (+1 megabyte reserved)+    local annex keys: 0+    local annex size: 0 bytes+    known annex keys: 21025+    known annex size: 217 gigabytes+    bloom filter size: 16 mebibytes (0% full)+    backend usage: +            SHA256: 18707+            SHA256E: 2318++Where did all these `SHA256` keys come from?++Why doesn't the known annex keys size match?++Further, I cannot `git annex get` on most of the files, because it says that+the `SHA256` key is not present.++It looks like I'll have to rollback my ZFS snapshots and start over, but I'm+wondering: how was I even able to create this situation?++> [[Done]]; user error. --[[Joey]] 
+ doc/bugs/Cannot_copy_to_a_git-annex_remote.mdwn view
@@ -0,0 +1,14 @@+What steps will reproduce the problem?++I really have no way to reproduce.  I have these two annex repository, both living on CentOS 6.3 machines, using SSH to copy from one to the other.  Everything has always worked fine, and I've copied hundreds of gigabytes and tens of thousands of files so far without a problem.++What is the expected output? What do you see instead?++I do "git copy --to storage FILE" and it says "Copying FILE... failed".  That's it.++How do I fix things so that I can copy again?  Nothing that I tried had any effect on the problem.++Thanks!++> Thanks to Jim's smart correlation of this with another bug, I've fixed+> them both. [[done]] --[[Joey]]
+ doc/bugs/Committer_crashed.mdwn view
@@ -0,0 +1,32 @@+# What steps will reproduce the problem?++Editing a text file with vim++#What is the expected output? What do you see instead?++    # On branch master+    # Changes not staged for commit:++    #   (use "git add <file>..." to update what will be committed)+    #   (use "git checkout -- <file>..." to discard changes in working directory)+    #+    #       typechange: test+    #+    # Untracked files:+    #   (use "git add <file>..." to include in what will be committed)+    #+    #       .test.swp++    no changes added to commit (use "git add" and/or "git commit -a")++    /.test.swp still has writers, not adding++    Committer crashed: ./test~: createLink: does not exist (No such file or directory)++# What version of git-annex are you using? On what operating system?++3.20130107 prebuilt tar ball on Debian testing++> Could also fail in `getFileStatus`. In either case it's a race+> with the file being deleted while it's still in the process of being+> locked down. Fixed this [[done]] --[[Joey]]
+ doc/bugs/Compile_needs_more_than_1.5gb_of_memory.mdwn view
@@ -0,0 +1,16 @@+What steps will reproduce the problem?++> cabal install git-annex++What is the expected output? What do you see instead?++> I would expect a working git-annex on my little linode. I have a linode 768 and trouble building the latest version. The process get's killed because of an out of memory condition.++What version of git-annex are you using? On what operating system?++> git-annex version: 4.20130314+> Ubuntu 12.04++Please provide any additional information below.++[[done]]
+ doc/bugs/Complete_failure_trying_to_unannex_a_large_annex.mdwn view
@@ -0,0 +1,56 @@+I really don't know what's happened here, I just did `git annex unannex .` in a very large annex:++    unannex Inbox/Lolcat.JPG (Recording state in git...)+    ok+    unannex Inbox/Lolcat.jpg (Recording state in git...)+    ok+    unannex Inbox/May 2012 Photo Stream/120502_0004.JPG (Recording state in git...)+    ok+    unannex Inbox/May 2012 Photo Stream/120518_0005.JPG (Recording state in git...)+    ok+    unannex Inbox/May 2012 Photo Stream/120523_0006.JPG (Recording state in git...)+    ok+    unannex Inbox/May 2012 Photo Stream/120523_0007.JPG (Recording state in git...)+    ok+    unannex Inbox/My boyfriend of 7 years and I are both physicists. Here's how he proposed to me. - Imgur.jpg (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121102_0035.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121102_0036.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121102_0037.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121102_0038.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121102_0039.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121103_0040.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121104_0041.JPG (Recording state in git...)+    ok+    unannex Inbox/Nov 2012 Photo Stream/121105_0042.JPG (Recording state in git...)+    error: bad index file sha1 signature+    fatal: index file corrupt+    git-annex: failed to read sha from git write-tree+    git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121105_0042.JPG"] failed+    Vulcan:~/Pictures $ ga unannex .+    unannex Inbox/Nov 2012 Photo Stream/121109_0043.JPG error: bad index file sha1 signature+    fatal: index file corrupt++    git-annex: fd:12: hClose: resource vanished (Broken pipe)+    failed+    git-annex: pre-commit: 1 failed+    git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121109_0043.JPG"] failed+    Vulcan:~/Pictures $ ga -F unannex .+    unannex Inbox/Nov 2012 Photo Stream/121124_0044.JPG error: bad index file sha1 signature+    fatal: index file corrupt++    git-annex: fd:12: hClose: resource vanished (Broken pipe)+    failed+    git-annex: pre-commit: 1 failed+    git-annex: git commit [Param "-q",Params "-m",Param "content removed from git annex",Param "--",File "Inbox/Nov 2012 Photo Stream/121124_0044.JPG"] failed++I guess now I'll just try to unlink the symlinks by hand, and drop the `.git` directory?++> [[done]]; per my comment this seems like a corrupt git repository.+> --[[Joey]]
+ doc/bugs/ControlPath_too_long_for_Unix_domain_socket.mdwn view
@@ -0,0 +1,53 @@+What steps will reproduce the problem?+Pairing an existing git annex repository with a fresh repository on another computer in the git-annex webapp+++What is the expected output? What do you see instead?+Expected result is that the two machines sync correctly.++What i see are some "ControlPath <data>  too long for unix domain socket" errors from ssh, but the computers do actually sync properly. ++Even though the data is synced properly, either the sender(or both of the clients) don't actually realize this. And the queue circles, all the transfers are being redone constantly(On every start of git-annex webapp on the original repository at least).+++What version of git-annex are you using? On what operating system?+Latest git master as of this post. Debian sid and Ubuntu 12.04+++Please provide any additional information below.+++stdout snippet from git-annex webapp:+++    ControlPath "/home/alansmithee/Desktop/annex/.git/annex/ssh/alansmithee@git-annex-debbook.local-alansmithee.dxpXHVCkLhsxvWaH" too long for Unix domain socket+    SHA256-s51233--0b4c59b3ab03b1ca6d95d4084fa6ff7220cf26695b6e3dd575f78af3dec6b701+           51233 100%    5.43MB/s    0:00:00 (xfer#1, to-check=0/1)++    sent 30 bytes  received 51385 bytes  102830.00 bytes/sec+    total size is 51233  speedup is 1.00+    ok+    (Recording state in git...)++    ControlPath "/home/alansmithee/Desktop/annex/.git/annex/ssh/alansmithee@git-annex-debbook.local-alansmithee.9ZQwEjraTxi20B6W" too long for Unix domain socket+    SHA256-s47883982--4b7cbb49506dcdd223a9db7b400cc41fc2e3ebbf5b2b17b75c9334bb949b6754+        47883982 100%    1.34MB/s    0:00:34 (xfer#1, to-check=0/1)++    sent 30 bytes  received 47889978 bytes  1388116.17 bytes/sec+    total size is 47883982  speedup is 1.00+    ok+    (Recording state in git...)+++This data appears on both the sending and receiving git-annex stdout. At least for the initial sync. For later syncs it only appears on the sender, though the client system is using a lot of resources.++> I've made git-annex detect if the control path would be too long,+> and disable ssh connection caching. It also tries a relative path+> to the file, which tends to make it shorter, and I think would+> keep ssh connection caching working in your example.+> +> Please test and see if it works, and also if the "looping" problem+> still happens. --[[Joey]]++>> Closing; I'm pretty sure the looping is just transfer retrying, to be+>> expected if they fail. [[done]] --[[Joey]] 
+ doc/bugs/Could_not_find_module_Data.Default.mdwn view
@@ -0,0 +1,33 @@+**What steps will reproduce the problem?**++Manually building git-annex from git.++**What is the expected output? What do you see instead?**++    $ cabal update+    ...+    $ cabal install --only-dependencies+    ...+    $ cabal configure+    ...+    $ cabal build+    Building git-annex-3.20120826...+    Preprocessing executable 'git-annex' for git-annex-3.20120826...+    +    Utility/Yesod.hs:15:8:+        Could not find module `Data.Default'+        It is a member of the hidden package `data-default-0.5.0'.+        Perhaps you need to add `data-default' to the build-depends in your .cabal file.+        Use -v to see a list of the files searched for.+    $++**What version of git-annex are you using? On what operating system?**++commit e7d728672a5fc923be9ab1d6fe4b65f2058b49c7+Arch Linux++**Please provide any additional information below.**++When I add data-default to git-annex.cabal's Build-Deps it works fine.++> Thanks, [[done]]. --[[Joey]]
+ doc/bugs/Could_not_read_from_remote_repository.mdwn view
@@ -0,0 +1,24 @@+### Please describe the problem.++I've been using git-annex for a few weeks now, and everything was working fine until today. Now, when git-annex goes to sync my files, it will hang for a while, and then display a red box on the left side, saying `! Synced with adam.liter`. So, basically, it doesn't really sync. The logs say that it cannot read from the remote repository, which is set up on box.com and was working just fine until today.++I've tried reconfiguring my jabber account on all my devices with git-annex as well as deleting and remaking the box.com repository, and none of these steps have solved the problem.++### What steps will reproduce the problem?++Making changes to any file located in the repository.++### What version of git-annex are you using? On what operating system?++Mac OS X 10.8.4 and git-annex version 4.20130801-gc88bbc4.++### Please provide any additional information below.++[[!format sh """+[2013-09-09 01:33:03 EDT] XMPPSendPack: Syncing with adam.liter +Already up-to-date.+fatal: Could not read from remote repository.++Please make sure you have the correct access rights+and the repository exists.+"""]]
+ doc/bugs/Could_not_resolve_dependencies.mdwn view
@@ -0,0 +1,40 @@+I'm not able to install git-annex with cabal.++What steps will reproduce the problem?++    bbigras@bbigras-VirtualBox:~$ cabal update+    Downloading the latest package list from hackage.haskell.org+    bbigras@bbigras-VirtualBox:~$ cabal install git-annex --bindir=$HOME/bin+    Resolving dependencies...+    cabal: Could not resolve dependencies:+    trying: git-annex-3.20130207 (user goal)+    trying: git-annex-3.20130207:+webdav+    trying: git-annex-3.20130207:+webapp+    trying: git-annex-3.20130207:+assistant+    trying: yesod-1.1.8.2 (dependency of git-annex-3.20130207:+assistant)+    trying: yesod-auth-1.1.5.2 (dependency of yesod-1.1.8.2)+    trying: authenticate-1.3.2.4 (dependency of yesod-auth-1.1.5.2)+    trying: xml-conduit-1.1.0.1 (dependency of authenticate-1.3.2.4)+    next goal: DAV (dependency of git-annex-3.20130207:+webdav)+    rejecting: DAV-0.3 (conflict: xml-conduit==1.1.0.1, DAV => xml-conduit>=1.0 &&+    <=1.1)+    rejecting: DAV-0.2, 0.1, 0.0.1, 0.0 (conflict: git-annex-3.20130207:webdav =>+    DAV(>=0.3))+    bbigras@bbigras-VirtualBox:~$+++What version of git-annex are you using? On what operating system?++Ubuntu 12.10 x86_64++cabal-install version 0.14.0+using version 1.14.0 of the Cabal library++> The Haskell DAV library needs to be updated to build with+> the newer version of xml-conduit. Library skew of this sort +> is common when using cabal.+> +> You can work around this by building git-annex without webdav:+> `cabal configure --flags=-WebDAV`+> +> This is not a git-annex bug. [[done]] --[[Joey]]
+ doc/bugs/Crash_trying_to_sync_with_a_repo_over_ssh.mdwn view
@@ -0,0 +1,43 @@+What steps will reproduce the problem?++I create a new annex, added in a bunch of files.++I cloned this annex to another machine, where I already had those files, so I copied them into a directory named "foo", did "git annex add foo", and then did "git rm -r foo", and git commit'd my clone of the annex.++Then I try to "git annex sync" with the remote.++What is the expected output? What do you see instead?++I don't know, I've never used git-annex before.  This is what I get each time:++    Hermes ~/Products/tmp/Movies (master) $ ga sync+    git-annex-shell: Prelude.(!!): index too large++What version of git-annex are you using? On what operating system?++It's the 'master' as of yesterday: c504f4025fec49e62601fbd4a3cd8f1270c7d221++I'm on OS X 10.8.2, using GHC 7.6.1.  The annex in question has 38G in a few hundred files.++Please provide any additional information below.++I'm willing to help track this down!++> I've got it, October 9th's release +> included commit bc649a35bacbecef93e378b1497f6a05b30bf452, which included a+> change to a `segment` function. It was supposed to be a+> rewrite in terms of a more general version, but it introduced a bug+> in what it returned in an edge case and this in turn led git-annex-shell's+> parameter parser to fail in a code path that was never reachable before.+> +> It'd fail both when a new repo was running `git-annex-shell configlist`,+> and in `git-annex-shell commit`, although this latter crash was less+> noticible and I'm sure you saw the former.+> +> Fixed the reversion; fixed insufficient guards around the partial code+> (which I cannot see a way to entirely eliminate sadly; look at+> GitAnnexShell.hs's `partitionParams` and weep or let me know if you have +> any smart ideas..); added a regression test to check the non-obvious+> behavior of segment with an empty segment. I'll be releasing a new+> version with this fix as soon as I have bandwidth, ie tomorrow.+> [[done]] --[[Joey]]
+ doc/bugs/Crash_when_adding_jabber_account_.mdwn view
@@ -0,0 +1,32 @@+*What steps will reproduce the problem?*++1. Start git-annex webapp+2. Configuration+3. Configure Jabber Account+4. Insert user and pass+5. Click "User this account"++Tryed 4 times, all the same.+++*What is the expected output? What do you see instead?*++On Chrome I get "Error 101 (net::ERR_CONNECTION_RESET): The connection was reset." or "Error 324 (net::ERR_EMPTY_RESPONSE): The server closed the connection without sending any data."++On the terminal where git-annex was running I get "Segmentation fault (core dumped)"+++*What version of git-annex are you using? On what operating system?*++git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102 ++OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux+++*Please provide any additional information below.*++On dmesg: +[45773.212717] git-annex[26779]: segfault at b724e840 ip 09699150 sp b4cfd038 error 7 in git-annex[8048000+1762000]++[[!tag /design/assistant]]+> [[done]], see comments --[[Joey]] 
+ doc/bugs/Creating_an_encrypted_S3_does_not_check_for_presence_of_GPG.mdwn view
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Don't have gpg installed/on your $PATH, and attempt to create an encrypted S3 remote via the web interface.++What is the expected output? What do you see instead?++Expected to be told to install GPG. Actual output was a Yesod error:++Internal Server Error+user error (gpg ["--batch","--no-tty","--use-agent","--quiet","--trust-model","always","--gen-random","--armor","1","512"] exited 127)++What version of git-annex are you using? On what operating system?++3.20130107 on Fedora 17 (64-bit).++Please provide any additional information below.++[[!tag /design/assistant]]
+ doc/bugs/DS__95__Store_not_gitignored.mdwn view
@@ -0,0 +1,26 @@+What steps will reproduce the problem?++Create a new git repo on OS X.  create a .gitignore file containing the line ".DS_Store".  Check it into git.  do "git annex init" to make the directory into a git annex repo.  do "git annex direct" to put it in direct mode.  do "git annex assistant" to start the assistant and watch it with "git annex webapp".++Open the directory in the finder.  Drag in some files and watch the assistant as it checks them in.  Play with your window's viewing preferences, maybe view things as "icons" so that the finder is forced to store metadata about where you dragged the icons in the window in the .DS_Store file.  As you do this, watch the webapp.  .DS_Store will start to be checked into git annex, and rechecked in frequently as it is updated.  Git annex assistant is not respecting the .gitignore file.  Is there some other way to tell git annex assistant that certain files should be ignored than .gitignore?+++What is the expected output? What do you see instead?++.DS_Store files are ignored by the assistant.+++What version of git-annex are you using? On what operating system?++git-annex version: 3.20130124++OS X Lion++Please provide any additional information below.++> Assistant does not support .gitignore yet. Requires an efficient query+> interface for ignores, which git does not provide.+>+> However, I've added a special case, OSX only ignore for .DS_Store files.+> [[done]] --[[Joey]] +
+ doc/bugs/Deasn__39__t_clean_up_ssh_keys_after_removing_remote_repo.mdwn view
@@ -0,0 +1,18 @@+### Please describe the problem.+I created a remote repo on ssh server with the same git-annex version, no personal ssh keys for the repo (password authentication). But I put ~ in front of the repo name so it created in different place than I wanted. I deleted it from assistant and then deleted the remote repo dir. When I added it with the correct path again it always asks for server password (it has some old annex pub key in authorized_keys, but not the new one; it might have been prompted for the password also with the initial repo). During the whole thing it failed to connect a few times due to wrong password or me realizing too late that it asks for yet another one and it generated keys few times, but ultimately didn't put the last one in remote's authorized_keys.++### What steps will reproduce the problem?+Create, delete and create again a new repo on remote ssh server with password auth.++### What version of git-annex are you using? On what operating system?+git-annex 4.20130601 Gentoo amd64++### 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.+"""]]
+ doc/bugs/Detection_assumes_that_shell_is_bash.mdwn view
@@ -0,0 +1,24 @@+###What steps will reproduce the problem?###++"Adding a remote server using ssh" and try to add a remote server where the account has ex. tcsh as loginshell++###What is the expected output? What do you see instead?###++To discover remote programs, it dumps away some born-shell code like:+"echo git-annex-probe loggedin;if which git-annex-shell; then echo git-annex-probe git-annex-shell; fi;if which rsync; then echo git-annex-probe rsync; fi;if which ~/.ssh/git-annex-shell; then echo git-annex-probe ~/.ssh/git-annex-shell; fi"++just wrap it with a bash -c '..' and you know that its interpreted by bash.++###What version of git-annex are you using? On what operating system?###++git-annex version: 3.20121017++###Please provide any additional information below.###++Not everyone has bash as there login-shell.++[[!tag /design/assistant]]++> [[done]]; assistant now uses sh -c "sane shell stuff here" to work+> around csh. (There are systems without bash, but probably fewer without sh)+> --[[Joey]]
+ doc/bugs/Difficult_to_troubleshoot_XMPP_login_failures.mdwn view
@@ -0,0 +1,11 @@+### Please describe the problem.++I have a jabber account on `jabber.ccc.de`. When trying to log in to that account, I get "Unable to connect to the Jabber server. Maybe you entered the wrong password? (Error message: AuthenticationFailure)" I've typed the password enough times that I'm relatively certain that I've typed it correctly at least once. It's difficult to see behind this error message. This is the only thing that shows up in the debug log:++    [2013-05-26 21:40:16 EDT] read: host ["-t","SRV","--","_xmpp-client._tcp.jabber.ccc.de"]+    [2013-05-26 21:40:16 EDT] read: host ["-t","SRV","--","_xmpp-client._tcp.jabber.ccc.de"]++It'd be great if this error were a wee bit more verbose.++> The XMPP library has been updated to include the actual error message from the server.+> [[done]] --[[Joey]]
+ doc/bugs/Direct_mode_keeps_re-checksuming_duplicated_files.mdwn view
@@ -0,0 +1,25 @@+##What steps will reproduce the problem?++    mkdir test+    git init+    git annex init "test"+    echo "test" > a+    echo "test" > b+    git annex add a b+    git annex sync+    git annex direct+    git annex sync | grep add+    git annex sync | grep add++##What is the expected output? What do you see instead?++The last two syncs shouldn't need to add or checksum anything.+Firstly, the output is very confusing because the files have already been added.+Secondly, the sync can take quite a while if you have lots of duplicates or a lot of files that are incidentally similar.++##What version of git-annex are you using? On what operating system?++git-annex version: 4.20130227 on Archlinux++> [[done]]; fixed inode caching code to support multiple files for the+> same content. --[[Joey]] 
+ doc/bugs/Direct_mode_repositories_end_up_with_unstaged_changes.mdwn view
@@ -0,0 +1,46 @@+### Please describe the problem.++After running two repositories syncing with one another in direct mode "git status" shows unstaged changes in both.++### What steps will reproduce the problem?++1. Create two direct mode repositories with each other as ssh remotes+2. Run "git annex assistant" on each+3. Create files on each and they get synced+4. Run "git status"++In my current repository the output is:++[[!format sh """+$ git status+# On branch master+# Changes not staged for commit:+#   (use "git add <file>..." to update what will be committed)+#   (use "git checkout -- <file>..." to discard changes in working directory)+#+#	typechange: fromgolias+#	typechange: fromwintermute+#+no changes added to commit (use "git add" and/or "git commit -a")+"""]]++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2++$ lsb_release -a+No LSB modules are available.+Distributor ID:	Ubuntu+Description:	Ubuntu 12.04.2 LTS+Release:	12.04+Codename:	precise+"""]]++> [[done]] --[[Joey]]
@@ -0,0 +1,32 @@+### Please describe the problem.++When a repository is set in direct mode it will still replace files with symlinks when it becomes aware of a change but still hasn't been able to sync the file contents. This can create repositories that are temporarily unusable with files replaced with broken symlinks.++### What steps will reproduce the problem?++1. Create two repositories with each other as remotes+2. Run the assistant on both+3. Create some file changes in one and watch the directory in another.+4. For a brief (or sometimes long) time the destination repository will have it's old version of the file replaced by a broken symlink++This is particularly noticeable when using XMPP as it can often be the case that the two repositories can't connect to each other directly but can talk through XMPP. This breaks using git-annex in direct mode for things like having a synced config directory across machines. Something like having "~/.bashrc" linked into "~/annex-repository/bashrc", doesn't work as there will be times when a machine is broken because .bashrc is linked to a broken symlink while it fetches a new version. ++The desired behavior would be to have git-annex in direct mode only replace older versions of files with newer versions of files.++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID:	Ubuntu+Description:	Ubuntu 12.04.2 LTS+Release:	12.04+Codename:	precise+"""]]
+ doc/bugs/Disconcerting_warning_from_git-annex.mdwn view
@@ -0,0 +1,6 @@+I did a "git annex add" of a bunch of files on a storage server with low IOPS, and saw this:++    git-annex: /tank/Media/Pictures/.git/annex/tmp/430_32b_SHA256E-s4464838--c1785a76ee1451f602e93c99c147e214705004e541de8256d74a3be3717d15e5.jpg.log: openBinaryFile: resource busy (file is locked)+failed++How is that even possible, when the server is doing nothing else?
+ doc/bugs/Displayed_copy_speed_is_wrong.mdwn view
@@ -0,0 +1,8 @@+When copying data to my remote, I regularly see speeds in excess of 100 MB/s on my home DSL line.++    2073939 100%  176.96MB/s    0:00:00 (xfer#1, to-check=0/1)++This is definitely not correct.++> Closing, as rsync does this to show you when it's making your life+> faster than it would be w/o rsync. [[done]] --[[Joey]] 
+ doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn view
@@ -0,0 +1,36 @@+What steps will reproduce the problem?++1. Click  "Remote server: Set up a repository on a remote server using ssh." +2. Enter hostname and different username than currently logged in user+3. Click check this server+++What is the expected output? ++> I expected to see the next step in the remote repo creration process.++What do you see instead?+++> Failed to ssh to the server. Transcript: ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied, please try again. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory Permission denied (publickey,password). +++What version of git-annex are you using? ++> git-annex: Version: 3.20130114 +++On what operating system?++> OSX: 10.8.2++++Please provide any additional information below.++> I mentioned "with a different username" because the assistant will allow me to create a remote repository on the same target machine when I use my normal username. I think this is most likely because I have a ssh-key setup for the account on the remote machine. However I do not want to assume anything and send you down the wrong OSX rabbit hole. ++> After a little research it seems that OSX does not have a ssh-askpass++[[!tag /design/assistant/OSX]]+[[!meta title="ssh-askpass not available on OSX"]]
+ doc/bugs/Error_when_dropping___34__hGetLine:_end_of_file__34__.mdwn view
@@ -0,0 +1,31 @@+Running 3.20121112 on Debian Squeeze.++Since adding a certain directory of files (just a bunch of PDFs) yesterday I am getting errors when I try to use `git annex drop .` when the files aren't present, rather doing nothing or saying 'ok', as it used to do/should do.  The errors are of the form `git-annex: fd:10: hGetLine: end of file` and sometimes of the form `git-annex: fd:17: hFlush: resource vanished (Broken pipe)`.  In my `daemon.log`, I have the errors++    (scanning...) Already up-to-date.+    Already up-to-date.+    TransferScanner crashed: fd:26: hGetLine: end of file+    Already up-to-date.+    (started...) git-annex: fd:25: hGetLine: end of file+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    git-annex: fd:24: hFlush: resource vanished (Broken pipe)+    [many more repetitions]++If I `git annex get` the files and then drop them again, a further attempt at a drop gives all these errors again.++> So in summary, a git-annex built against the old version of git in+> debian stable fails to work with a newer version of git, and rebuilding+> fixes it. FWIW, the git-annex backport to stable does not have this+> problem, because it checks git version at runtime. But I want to avoid+> the overhead of that check in git-annex mainline, because this old git+> version is well, very old and increasingly unlikely to be used. So,+> I don't think any changes to git-annex are warrented. [[done]] --[[Joey]]
+ doc/bugs/Error_when_moving_annexed_file_to_a_.gitignored_location.mdwn view
@@ -0,0 +1,21 @@+I just noticed that if you move a git-annex symlink to a location ignored by git, it simply works.  Upon committing that change, however, part of git-annex's `fix` function apparently tries to `git-add` the symlink.  This fails because the new, ignored location requires a `git-add --force`.++Considering that git proper doesn't fail or warn, I think git-annex shouldn't either.++This is the error message:++	$ git mv annexed-file ignored-dir/+	$ git commit+	fix ignored-dir/annexed-file ok+	(Recording state in git...)+	The following paths are ignored by one of your .gitignore files:+	ignored-dir+	Use -f if you really want to add them.+	fatal: no files added+	Command xargs ["-0","git","--git-dir=/home/[...]/repo/.git","--work-tree=/home/[...]/repo","add","--"] failed; exit code 123++	git-annex: user error (Command xargs ["-0","git","--git-dir=/home/[...]/repo/.git","--work-tree=/home/[...]/repo","add","--"] failed; exit code 123)+	failed+	git-annex: 1 failed++> Weird edge case.. ok, fixed. [[done]] --[[Joey]] 
+ doc/bugs/Every_new_file_gets_symlinked_to_a_git_object.mdwn view
@@ -0,0 +1,78 @@+### Please describe the problem.+Every file I add to a watched repository (by git-annex assistant) becomes symlinked, and sub-subsequently write protected.++Sorry if I'm missing something obvious.++### What steps will reproduce the problem?+1) Fresh install+2) create directory, init repo and git-annex+3) git annex assistant+4) add a file+5) ls -lsa to see the symlinked file+6) trying to write to the file throws a write-protected error+++### What version of git-annex are you using? On what operating system?+git-annex version: 4.20130725-g8140f7c  +build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP  +local repository version: 3  +default repository version: 3  +supported repository versions: 3 4  +upgrade supported from repository versions: 0 1 2++Using the generic linux distribution with ./runshell on Ubuntu 13.04 (I saw this same behaviour from the ubuntu package, i.e. apt-get install git-annex)+++### Please provide any additional information below.++Here is the output from my ls -lsa+[[!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+ 4 drwxrwxr-x  3 jetaggart jetaggart  4096 Jul 27 20:38 .+16 drwx------ 60 jetaggart jetaggart 16384 Jul 27 20:44 ..+ 4 drwxrwxr-x  7 jetaggart jetaggart  4096 Jul 27 20:38 .git+ 4 lrwxrwxrwx  1 jetaggart jetaggart   188 Jul 27 20:38 another.org -> .git/annex/objects/Qm/j7/SHA256E-s11--9484d4be897ca66ad4c9bbf299d12adfe37e089bbca1daecbbb49c375a9cf1e9.org/SHA256E-s11--9484d4be897ca66ad4c9bbf299d12adfe37e089bbca1daecbbb49c375a9cf1e9.org+ 4 lrwxrwxrwx  1 jetaggart jetaggart   186 Jul 27 20:33 blah.org -> .git/annex/objects/kj/q5/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.org/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.org+12 -rw-rw-r--  1 jetaggart jetaggart   119 Jul 27 20:37 todo.org+++# End of transcript or log.+"""]]++Here is the daemon.log++[[!format sh """++[2013-07-27 20:32:55 BST] main: starting assistant version 4.20130725-g8140f7c+(scanning...) [2013-07-27 20:32:55 BST] Watcher: Performing startup scan+(started...) +[2013-07-27 20:33:52 BST] Committer: Adding blah.org+add blah.org (checksum...) ok+[2013-07-27 20:33:52 BST] Committer: Committing changes to git+(Recording state in git...)+(Recording state in git...)+[2013-07-27 20:35:59 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:36:01 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:37:52 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:37:55 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:38:44 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:38:46 BST] Committer: Adding another.org+add another.org (checksum...) ok+[2013-07-27 20:38:46 BST] Committer: Committing changes to git+(Recording state in git...)+(Recording state in git...)+[2013-07-27 20:38:51 BST] Committer: Committing changes to git+(Recording state in git...)+[2013-07-27 20:38:56 BST] Committer: Committing changes to git+(Recording state in git...)++# End of transcript or log.+"""]]++> [[done]] --[[Joey]] 
+ doc/bugs/Fails_to_create_remote_repo_if_no_global_email_set.mdwn view
@@ -0,0 +1,55 @@+### Please describe the problem.+Trying to create repo on ssh server failed because git didn't know my email.++There were other issues I encountered:++ - While connecting to the server assistant says that there will be a password prompt, but doesn't tell that one should expect it to appear in the terminal.++ - When creating keys it says that I will be prompted for key password again, but it asks for password to remote server (I understood it wanted a password for its new key pair).. there is no telling for what those password prompts in terminal are for++ - It actually requires password for remote server multiple times before it starts to use its own keys++ - When failed to test the server or create the repo there the "Retry" button doesn't work (does nothing)++ - Maybe it should strip leading ~ from repo name?++ - Local pairing with annex 3.20121112ubuntu4 from Ubuntu 13.04  sort of works, but not quite.. it syncs the files, but assistant on Ubuntu doesn't show the name for repo on Gentoo (matching versions are important?)++ - When pairing it doesn't check if localhost has running sshd++ - I think that was the reason why progress bars were showing pending transfers even after the status message about syncing was green after starting sshd (synced, already up-to-date)++### What steps will reproduce the problem?+Create repo on remote ssh server without global git settings.++### What version of git-annex are you using? On what operating system?+git-annex-4.20130601, Gentoo amd64++### 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+Initialized empty shared Git repository in /home/reinis/~/Annex/Lit/+init  +*** Please tell me who you are.++Run++  git config --global user.email "you@example.com"+  git config --global user.name "Your Name"++to set your account's default identity.+Omit --global to set the identity only in this repository.++fatal: unable to auto-detect email address (got 'reinis@RD-HC.(none)')++git-annex: user error (git ["--git-dir=/home/me/~/Annex/Lit","commit-tree","4b825dc642cb6eb9a060e54bf8d69288fbee4904"] efailed+xited 128)+git-annex: init: 1 failed+++# End of transcript or log.+"""]]++> [[done]]; I've made git-annex detect such broken systems and configure them so git will work. (sigh!) --[[Joey]]
+ doc/bugs/Feature_request:___34__quvi__34___flag.mdwn view
@@ -0,0 +1,14 @@+### Please describe the problem.+git-annex v4.20130827 can't be built on ARM. Technically it's vector that can't be built due to a lack of Template Haskell compilers for this architecture. Vector is a dependency of aeson, which is a dependency of git-annex, which therefore fails to compile.++The only functionality that relies on aeson is, to my knowledge, quvi. Thus my feature request: If you were to introduce a flag to switch quvi support on or off, ARM users like me could circumvent the aeson dependency at build time. In this case we weren't stuck with 4.20130815 (the latest version to not depend on aeson) and could use current and future versions of git-annex. I would appreciate it.+++### What steps will reproduce the problem?+See above.+++### What version of git-annex are you using? On what operating system?+I'm running Raspbian Wheezy on a Raspberry Pi. The git-annex version to be built is 4.20130827. ++> [[done]] --[[Joey]]
+ doc/bugs/Files_disappear_from_locally_paired_annexes_when_edited.mdwn view
@@ -0,0 +1,36 @@+**What steps will reproduce the problem?**++Create two annexes from the command line on two separate machines:++    mkdir ~/Files.annex+    cd ~/Files.annex+    git init+    git annex init+    git annex untrust .+    git annex direct++Add remote to each one pointing to the other:++    git remote add [remote] [remote hostname]:Files.annex++Start assistant on both repos:++    git annex assistant++Fill one repository with a few text files, and wait for them to propagate.++Edit one of the text files using vim, and save.++**What is the expected output? What do you see instead?**++Edited file should remain in the repo, but a significant portion of the time, the file disappeared from the repo in which it was edited (the file is present and properly synced on the other repo).++**What version of git-annex are you using? On what operating system?**++git-annex 4.20130323, Mac OS X on the repo where the file was edited, Arch Linux for the other paired repo.++**Please provide any additional information below.**++I have observed this problem setting up the repos through the webapp as well, so I don't think it is related to setting up the repos manually. I think the way vim is writing the files seems to be tickling a race condition (both command-line vim and MacVim produce the behavior). I started trying to work around it by switching to emacs to edit those files, and the files haven't disappeared from the edited repo (so far at least).++[[!tag /design/assistant moreinfo]]
+ doc/bugs/GIT_DIR_support_incomplete.mdwn view
@@ -0,0 +1,17 @@+`GIT_DIR` support isn't right. Git does not look for `GIT_DIR/.git`;+git-annex does.++Also, to support this scenario, support for core.worktree needs to be added+as well:++	mkdir repo workdir+	git --work-tree=$PWD/workdir --git-dir=$PWD/repo init+	export GIT_DIR=$PWD/repo+	git status+	# ok+	git annex init "new repo"+	# fail++--[[Joey]] ++> [[fixed|done]] --[[Joey]] 
+ doc/bugs/GPG_can__39__t_handle_some_files.mdwn view
@@ -0,0 +1,23 @@+### Please describe the problem.++It looks like GPG is being used in text mode, or at least isn't overriding the GPG config.++### What steps will reproduce the problem?++Have a binary file with long lines, and attempt to copy it into git-annex.++This will happen:++    $ git-annex copy 09\ Into\ The\ Dissonance.mp3 -t rsync.net_annex+    copy 09 Into The Dissonance.mp3 (gpg) (checking rsync.net_annex...) (to rsync.net_annex...) gpg: can't handle text lines longer than 19995 characters+    failed+    git-annex: copy: 1 failed++A workaround is to remove "textmode" from your gpg.conf, but git-annex should force this.++### What version of git-annex are you using? On what operating system?++7ae625363bcb6e1fc8b3733c1d7814aca05a2368 on Ubuntu 13.04 x86_64++> The sheer number of ways gpg offers of shooting yourself in the foot..+> Ok [[done]] --[[Joey]] 
+ doc/bugs/GPG_passphrase_repeated_prompt.mdwn view
@@ -0,0 +1,24 @@+#### What steps will reproduce the problem?++1. Create a new repository with a directory+2. Add files+3. Select "Store your data in the cloud" with the "Remote server" option+4. Enter host, user, directory+5. Select "Use an encrypted rsync repository on the server" (Will there be an option for unencrypted later?)+6. GPG Passphrase prompt comes up for every file++#### What is the expected output? What do you see instead?++I expect to enter a passphase once and then it will sync all files with the remote server.++Instead, it begins syncing the files to the server but prompts for a GPG passphase for every single file.++#### What version of git-annex are you using? On what operating system?++3.20121017 precompiled binary on Arch Linux++#### Please provide any additional information below.++Not sure if I'm just missing a setting for GPG, but I would think I should only need to use the web app to configure the remote server.++[[!tag /design/assistant]]
+ doc/bugs/GPG_problem_on_Mac.mdwn view
@@ -0,0 +1,34 @@+### Please describe the problem.+Adding a box.com repository fails with an Internal server error and the message "user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","48","--symmetric","--force-mdc"] exited 2)"++Looking at the logfile it seems like git-annex is looking for gpg (gpg-agent) in /usr/local/MacGPG2/bin/. On my system it is in /usr/local/bin (installed using homebrew). I do not have the directory /usr/local/MacGPG2/.++Not sure if what the git-annex philosophy is: detect the location of such external programs or ship them together with git-annex.++### What steps will reproduce the problem?+Add a box.com repository (I assume every repository type that uses gpg will fail in the same way) on a Mac.+++### What version of git-annex are you using? On what operating system?+* git-annex version 4.20130626-g2dd6f84 (from https://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/)+* Mac OS 10.8.4++### 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++(Recording state in git...)++(encryption setup) (shared cipher) (testing WebDAV server...)+(gpg) gpg: error running `/usr/local/MacGPG2/bin/gpg-agent': probably not installed+gpg: DBG: running `/usr/local/MacGPG2/bin/gpg-agent' for testing failed: Configuration error+gpg: can't connect to the agent: IPC connect call failed+gpg: problem with the agent: No agent running+27/Jun/2013:13:41:37 +0200 [Error#yesod-core] user error (gpg ["--quiet","--trust-model","always","--batch","--passphrase-fd","21","--symmetric","--force-mdc"] exited 2) @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)+# End of transcript or log.+"""]]++> [[done]]; I've updated the OSX autobuild to +> use a gpg that doesn't fail when gpg-agent is missing. --[[Joey]]
+ doc/bugs/Glacier_remote_uploads_duplicates.mdwn view
@@ -0,0 +1,36 @@+### Please describe the problem.++Other references:++https://github.com/basak/glacier-cli/pull/19+http://git-annex.branchable.com/special_remotes/glacier/#comment-a2b05b8dc2d640ee498d90398f02931c++#### Background++ * Glacier doesn't support keys that the client selects, unlike S3. If you upload to Glacier, Glacier assigns a unique ID, not the client.+ * Glacier does support an "archive description" which is immutable. It also provides this "archive description" in an inventory listing, together with the unique IDs.+ * An "archive description" is not a unique key. It's perfectly possible to upload multiple archives to Glacier with the same "archive description".+ * glacier-cli uses the "archive description" field as an upload identifier, since the unique IDs are unfriendly to users. However, since they are potentially ambiguous identifiers, it also supports disambiguation using the ID itself. See "Addressing Archives" in README.md for details.++#### The Problem++This what I believe is happening in the two reports referenced above. When git-annex is used without `--trust-glacier`, it can end up uploading the same data multiple times. From git-annex's point of view, it cannot verify that the data is already in Glacier, so it uploads again, expecting an overwrite operation if the key is already in Glacier. Since glacier-cli maps the key to an "archive description" that can be duplicated, this is not what happens. Instead, a second archive is uploaded.++When git-annex later does a "checkpresent" operation, glacier-cli fails. This is because the request is ambiguous, since there are two archives in Glacier with the same "key". The error message could be better here, but I believe that the behaviour is correct.++#### Discussion++glacier-cli can find out what data Glacier claims to have using an inventory retrieval. However, this retrieval takes about four hours and can be out of date (eg. if someone else recently deleted the archive from another client). Thus, I can understand git-annex's desire not to trust this data or a cache of it.++However, whatever we do, it is impossible to map an "upload or overwrite on key X" type command to Glacier. We'll always end up with duplicates. Even if git-annex stored the Glacier archive IDs, there is no API to replace an existing archive with the same ID, and inventories are out of date even before we retrieve them.++#### Workaround++If the problem is as I think it is, always applying `--trust-glacier` should prevent the problem from occurring in most cases, since git-annex will run "checkpresent" and glacier-cli will confirm that the archive exists.++To fix the problem after it has occurred, it should be sufficient to delete duplicates using glacier-cli, since they _should_ be identical to each other. Some enhancement of the `glacier-cli archive list` command would help here.++Update 10 June 2013: I've pushed a `glacier-cli` update and helper script in commit `b68835`. This adds a `--force-ids` option to `glacier archive list`, with which the helper script `glacier-list-duplicates.sh` uses to identify duplicates that can be removed. If you're affected by this issue, I suggest that you use this helper to identify and fix your problem by removing the duplicates. Please do so carefully by checking that the output of the helper is correct before you use it to delete the duplicates. See the comments at the top of the helper script for usage information.++> [[fixed|done]], at least for the only well-working case for glacier, where+> only one repository can access glacier directly. --[[Joey]]
+ doc/bugs/Hanging_on_install_on_Mountain_lion.mdwn view
@@ -0,0 +1,26 @@+### Please describe the problem.++In trying to install git-annex on my mac OSX Mountain Lion, the program is hanging when I open the program.++### What steps will reproduce the problem?++Open the DMG, drag the app to applications folder, double-click on the application. Web browser opens with a localhost url. The webpage says "Starting webapp..." and doesn't go anywhere. Initialization seems to fail and I need to force quit the application.++### What version of git-annex are you using? On what operating system?++I'm not totally sure (since it hangs and I can't check a version number, but since I just downloaded it now and the homepage says the latest version is "version 4.20130621" which was released 2 days and 13 hours ago, I assume that is it. ++I'm using OSX 10.8.4.+++### 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.+"""]]++> Fixed root cause. [[done]] --[[Joey]]
+ doc/bugs/Hangs_on_creating_repository_when_using_--listen.mdwn view
@@ -0,0 +1,46 @@+### Please describe the problem.+When using the git-annex webapp with the --listen paramter it as usual asks one to create a new repository on first startup. Selecting a repository location here and clicking "Make repository" button leads to a never ending loading browser and some git zombies. ++### What steps will reproduce the problem?+Two machines needed++1. On machine one: git-annex webapp --listen=\<machine1-public-ip\>:34561 (you can choose another port as well)+2. On machine two: use a browser to go to the url the last step gave you+3. Click on make repository+++### What version of git-annex are you using? On what operating system?+* git-annex version: 4.20130601+* build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+* built using cabal+* on Ubuntu 13.04 32bit+++### 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++[2013-06-12 21:59:37 CEST] main: starting assistant version 4.20130601+WebApp crashed: unable to bind to local socket+[2013-06-12 21:59:37 CEST] WebApp: warning WebApp crashed: unable to bind to local socket++  dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "runClient: unable to determine DBUS address", clientErrorFatal = True})++  No known network monitor available through dbus; falling back to polling+(scanning...) [2013-06-12 21:59:37 CEST] Watcher: Performing startup scan+(started...) +++# End of transcript or log.+"""]]++> The problem is that, when a port is specified, it is used for each web+> server started, and the process of making a new repository unavoidably+> requires it to start a second web server instance. This would also affect+> switching between existing repositories in the webapp. I don't see+> any way to make it not crash here, except for ignoring the port it was told+> to use when something else is already listening there. --[[Joey]] ++[[!tag /design/assistant]]
@@ -0,0 +1,125 @@+### Please describe the problem.++Direct mode repositories seem to initially ignore hard linked files and then when changes are done to them sync them as separate files. However, changes to one file are only propagated to that file and not to any of the others that are hardlinked to it.++### What steps will reproduce the problem?++Inside a direct mode repository linked to a ssh remote:++[[!format sh """+$ ls -l+total 0+$ echo "something" > foo+$ ln foo bar+$ ls -l+total 8+-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 bar+-rw-r--r-- 2 pedrocr pedrocr 10 May 29 12:08 foo+$ tail .git/annex/daemon.log+   6c0fbd7..0bb8ef9  git-annex -> synced/git-annex+   0bae1b4..bfedc45  master -> synced/master++sent 77 bytes  received 31 bytes  72.00 bytes/sec+total size is 10  speedup is 0.09+[2013-05-29 12:08:03 WEST] Transferrer: Uploaded foo+Already up-to-date.+[2013-05-29 12:08:05 WEST] Pusher: Syncing with golias +To ssh://golias.git-annex/home/pedrocr/testsync+   0bb8ef9..2ce5013  git-annex -> synced/git-annex+$ git status+# On branch master+# Changes not staged for commit:+#   (use "git add <file>..." to update what will be committed)+#   (use "git checkout -- <file>..." to discard changes in working directory)+#+#	typechange: foo+#+# Untracked files:+#   (use "git add <file>..." to include in what will be committed)+#+#	bar+no changes added to commit (use "git add" and/or "git commit -a")+"""]]++On the remote repository:++[[!format sh """+$ ls -l+total 4+-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo+"""]]++If I now just touch the linked file on the repository:++[[!format sh """+$ touch bar+$ tail .git/annex/daemon.log++(merging synced/git-annex into git-annex...)+(Recording state in git...)+add bar (checksum...) [2013-05-29 12:12:49 WEST] Committer: Committing changes to git+[2013-05-29 12:12:49 WEST] Pusher: Syncing with golias +Already up-to-date.+To ssh://golias.git-annex/home/pedrocr/testsync+   2ce5013..d36166b  git-annex -> synced/git-annex+   bfedc45..ee3a7a1  master -> synced/master+Already up-to-date.+"""]]++On the remote repository:++[[!format sh """+$ ls -l+total 8+-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 bar+-rw-r--r-- 1 pedrocr pedrocr 10 May 29 12:08 foo+"""]]++Note that now bar has been synced as a new file and not a hardlink as it should be (the 1's after the permissions). ++The sync also isn't acting properly on the linked files. For example. ++First in the origin repository:++[[!format sh """+$ cat bar+something+$ cat foo+something+$ echo "someotherthing" > bar+$ cat bar+someotherthing+$ cat foo+someotherthing+"""]]++The result in the destination:++[[!format sh """+$ cat bar+someotherthing+$ cat foo+something+"""]]++So even if the intended behavior is for hardlinked files to be synced as two separate files the sync isn't correct because the two files changed in the origin and only one of them changed in the destination. This probably needs to be fixed with actual hard links for real filesystems and with some copying for crippled filesystems.++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID:	Ubuntu+Description:	Ubuntu 12.04.2 LTS+Release:	12.04+Codename:	precise+"""]]++
+ doc/bugs/Huge_annex_out_of_memory_on_switch_to_indirect_mode_and_status.mdwn view
@@ -0,0 +1,69 @@+### Please describe the problem.++[[!tag moreinfo]]++I added a lot of files to my annex in direct mode. Now I want to switch to indirect mode. git-annex status and indirect create an out-of-memory error.++### What steps will reproduce the problem?++I am not really sure, I added a lot of files to the annex, almost 3TB.+Then either git-annex status or git-annex indirect cause a similar error (see below).+++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501-g4a5bfb3+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++Ubuntu precise+3.2.0-26-generic+++### 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/debug.log+git-annex status+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web webdav glacier hook+repository mode: direct+trusted repositories: 0+semitrusted repositories: 7+	00000000-0000-0000-0000-000000000001 -- web+ 	0b8e6666-80d5-11e2-adf3-6f4d3d6ef0aa -- marek@x4:~/tmp/annex+ 	65c057c6-6027-11e2-84b0-b77d71696e49 -- here (.)+ 	96b31c5e-6524-11e2-b136-fbd1a03b2799 -- BackupOnGlacier+ 	b509c388-629a-11e2-be5f-d376e201ad86 -- marek@x201:~/AllData+ 	c636e33c-6e31-11e2-a9c4-a3c5546d69d9 -- desktop+ 	fbaa1c3a-60d7-11e2-842f-9348368d2f4c -- .+untrusted repositories: 0+dead repositories: 0+transfers in progress: none+available local disk space: 81 gigabytes (+1 megabyte reserved)+temporary directory size: 9 megabytes (clean up with git-annex unused)+local annex keys: 61396+local annex size: 3 terabytes+known annex keys: git-annex: out of memory (requested 985661440 bytes)++OR++git-annex indirect+commit  git-annex: out of memory (requested 985661440 bytes)++++++# End of transcript or log.+"""]]++> [[fixed|done]]. However, if you saw this behavior,+> you have large files checked directly into git. You may+> want to examine your repository and use git filter-branch to clean+> it up.+> --[[Joey]] 
+ doc/bugs/Incorrect_version_on_64_Standalone_Build.mdwn view
@@ -0,0 +1,11 @@+    $ wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz+    $ tar xvzf git-annex-standalone-amd64.tar.gz+    $ cd git-annex.linux+    $ ./git-annex version+    git-annex version: 4.20130324++Shouldn't that be `4.20130405`?++The md5sum of the build I downloaded is `aabbb3aa2397be206cae86f33db9eef4`.++> [[done]]; new version will look like eg `4.20130410-gc149c67` --[[Joey]] 
+ doc/bugs/Install_of_git-annex-3.20121112_fails.mdwn view
@@ -0,0 +1,20 @@+What steps will reproduce the problem?++- rm -rf ~/.ghc/ && cabal update && cabal install git-annex --bindir=$HOME/bin++What is the expected output? What do you see instead?++- I would like to have the latest release installed++What version of git-annex are you using? On what operating system?++- git-annex-3.20121112+- Ubuntu 12.04 LTS+- The Glorious Glasgow Haskell Compilation System, version 7.4.1++Please provide any additional information below.++I use it heavily on 4 machines since a month and I really like it.++> closing since this is a cabal library problem, and not something that+> can be fixed by any change to git-annex. [[done]] --[[Joey]] 
+ doc/bugs/Internal_Server_Error:_Unknown_UUID.mdwn view
@@ -0,0 +1,37 @@+### Please describe the problem.++One of my repositories has no name:+http://screencast.com/t/3OjxFzpz++And when I try to disable it I get this error:++    Internal Server Error+    Unknown UUID++When I try to delete it I get this error:++    Internal Server Error+    unknown UUID; cannot modify++I think this was the result of adding a Local Computer Repo, and then that computer signed off.  Maybe.++### What version of git-annex are you using? On what operating system?++git-annex version 4.20130601-g2b6c3f2+Mac OS 10.7.5++### Please provide any additional information below.++Maybe it's a glitch that only will happen this once, the problem is I can't get rid of it!  Are there anyways of manually getting rid of a repo with uid?++> Also reported here:+> [[Missing_repo_uuid_after_local_pairing_with_older_annex]] and+> [[Internal_Server_Error_unknown_UUID;_cannot_modify]]+> and [[Local_network___40__ssh__41___fails_to_pair__47__sync]]+> and [[Internal_Server_Error:_Unknown_UUID]]+> --[[Joey]] ++[[!meta title="local pairing leads to unknown UUID"]]++> This bug is [[fixed|done]]. The webapp will detect the problem and+> provides an interface to correct it. --[[Joey]]
+ doc/bugs/Internal_Server_Error_unknown_UUID__59___cannot_modify.mdwn view
@@ -0,0 +1,26 @@+### Please describe the problem.+I was trying to use "Local Computer" option to sync up two machines on my local network. I was having some firewall issues and it failed on one machine.+It still created a repository without a name in the web ui and i get that Error unknown UUID when trying to edit or delete it.++### What steps will reproduce the problem?+Machine A initiates pairing. Machine B accepts pairing. Machine A has a firewall blocking outgoing connections.+Machine B times out. Machine A accepts outgoing connections for vnetd. Machine A starts syncing with Machine B.+Machine B gets files but have a broken web ui.+++### What version of git-annex are you using? On what operating system?++4.20130601-g2b6c3f2+OSX 10.7.5 on both Machine A and B++### 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.+"""]]++> [[dup|done]] of [[Internal_Server_Error:_Unknown_UUID]] --[[Joey]] 
+ doc/bugs/Internal_server_error_adding_USB_drive_on_OS_X.mdwn view
@@ -0,0 +1,25 @@+What steps will reproduce the problem?++* Start with a clean setup.+* Allow webapp to start; use it to create annex in ~/Documents/annex That works.+* Go to add remote repo. Removable drive.+* Select "/Volumes/G-DRIVE slim". Click next.++What is the expected output? What do you see instead?+Expected is something like "done". What I see is++Internal Server Error++git config [Param "annex.uuid",Param "6898F314-7817-4CD5-B1C3-588C55522A3B"] failed++What version of git-annex are you using? On what operating system?++git-annex version 3.20130107, OS X Mountain Lion. No MacPorts/homebrew/fink installed. gcc / git are installed.++Please provide any additional information below.++Maybe something to do with the drive name having spaces? "/Volumes/git-annex" worked fine.++> Good thought in the comment. I was able to reproduce the failure+> if the removable drive already had an "annex" directory that was not+> a git repo. I've made it handle this case. [[done]] --[[Joey]] 
+ doc/bugs/Is_there_any_way_to_rate_limit_uploads_to_an_S3_backend__63__.mdwn view
@@ -0,0 +1,19 @@+What steps will reproduce the problem?++Adding files to a local annex set up to sync to a remote S3 one+++What is the expected output? What do you see instead?++It syncs, but maxes out the uplink+++What version of git-annex are you using? On what operating system?++3.20121112 on Debian testing+++Please provide any additional information below.++The man page lists how to configure rate limiting for rsync, not sure how to do it for this+
+ doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn view
@@ -0,0 +1,26 @@+I was dumping ~gigs of files of approximately 3-6megs a pop (my music collection) so I could track the files that I want to listen to when I'm on the go. I had the git watch command running from the assistant branch.++I was getting something along the lines of...++    /Users/jtang/annex/.git/annex/tmp/: openTempFile: resource exhausted (Too many open files)++and++    git-annex: createPipe: resource exhausted (Too many open files)++I also noticed that I somehow ended up with 256 ssh-agent's running on one of my machines, I'm not sure if the two issues are related or not, I had not noticed this type of behaviour up until recently.++Also this was appearing in the logs++    x00:annex jtang$ tail -f .git/annex/daemon.log+    (scanning...) Already up-to-date.+    kqueue: Too many open files++To be precise, I suspect that the kqueue limit is 256, I had 325 files in the 'queue', I ended up doing a _git annex add_ manually and all was fine.++[[!meta title="kqueue system limits"]]++> This affects BSD systems that use Kqueue. It no longer affects OSX,+> since we use FSEvents there instead. --[[Joey]] ++[[!tag /design/assistant]]
+ doc/bugs/It_is_very_easy_to_turn_git-annex_into_a_zombie.mdwn view
@@ -0,0 +1,25 @@+What steps will reproduce the problem?++Run the git-annex assitant, and then "sudo kill" it.++What is the expected output? What do you see instead?++I expect it to die, instead I end up with:++    14604   ??  S      0:00.64 ga assistant+    14623   ??  Z      0:00.00 (git)+    14624   ??  Z      0:00.00 (git)+    14936   ??  Z      0:00.00 (git-annex)++The only way to clear these zombies is to reboot.  Perhaps there is some resource not being correctly terminated under exceptional conditions?++Note that on OpenIndiana the problem is even more severe: Aborting git-annex at the wrong time leaves behind both zombie processes and lock files which cause the machine to suddenly halt if I try to access them in any way (via mv, rsync, etc)!++What version of git-annex are you using? On what operating system?++4d1e0c9 on OS X 10.8.2.++Please provide any additional information below.++[[!meta title="strange OSX behavior when killed"]]+[[!tag /design/assistant/OSX moreinfo]]
+ doc/bugs/JSON_output_broken_with___34__git_annex_sync__34__.mdwn view
@@ -0,0 +1,21 @@+What steps will reproduce the problem?++    $ git annex -j sync | json_reformat++What is the expected output? What do you see instead?++Expecting valid JSON, instead this happens:++    $ git annex -j sync | json_reformat+    lexical error: invalid char in json text.+              {"command":"commit","file":""# On branch master nothing to c+                         (right here) ------^+    $+++What version of git-annex are you using? On what operating system?++Newest standalone (3.20121126), Linux i386. The "json_reformat" program is from the "yajl-tools" .deb package.++> [[done]]; I've updated the --json documentation to note that it only+> works with some query commands. --[[Joey]] 
+ doc/bugs/Killing_the_assistant_daemon_leaves_ssh_mux_sessions_behind.mdwn view
@@ -0,0 +1,38 @@+### Please describe the problem.++If the assistant daemon is killed, ssh mux sessions are left behind. Incidentally there may be a better way to stop the assistant daemon besides "killall git-annex" but I haven't found it in the docs.++### What steps will reproduce the problem?++[[!format sh """+$ ps aux | grep mux+$ git-annex assistant+$ date > fromwintermute # Just causing a change that needs to be pushed, any will do+$ ps aux | grep mux+pedrocr  32665  0.0  0.0   6396   948 ?        Ss   11:06   0:00 ssh: /home/pedrocr/testsync/.git/annex/ssh/golias.git-annex [mux]+$ killall git-annex+$ ps aux | grep mux+pedrocr  32665  0.0  0.0   6396   948 ?        Ss   11:06   0:00 ssh: /home/pedrocr/testsync/.git/annex/ssh/golias.git-annex [mux]+"""]]++### What version of git-annex are you using? On what operating system?++[[!format sh """+$ git annex version+git-annex version: 4.20130516.1+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+local repository version: 4+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+$ lsb_release -a+No LSB modules are available.+Distributor ID:	Ubuntu+Description:	Ubuntu 12.04.2 LTS+Release:	12.04+Codename:	precise+"""]]++++> [[done]] --[[Joey]]
+ doc/bugs/Last_two_versions_didn__39__t_show_up_on_hackage.mdwn view
@@ -0,0 +1,11 @@+### Please describe the problem.+I don't know how the packages at hackage are managed, but the last version there is 4.20130601 while in the mean time there have been two other releases.++### What steps will reproduce the problem?+Check [[http://hackage.haskell.org/packages/archive/git-annex/]]++> Thanks for reporting. Turns out that hackage was rejecting+> it since it doesn't know about the OS name for the hurd. Since I +> am not sure I have the right name either, I have removed those bits+> and re-uploaded.+> [[done]] --[[Joey]] 
+ doc/bugs/Local_files_not_found.mdwn view
@@ -0,0 +1,50 @@+### Please describe the problem.++I have a git annex repo which cannot find the files with whereis, even though the files and contents are there. I have changed ownership of all the files. I am not sure, but I think that is when the problem was introduced. The current user that is invoking git annex owns and can access all files in the repository/annex)++Creating a new repository from scratch works just fine.+++### What steps will reproduce the problem?++    # (in my current, somehow corrupt annex)+    $ echo hello > testfile+    $ git annex add testfile+    add testfile (checksum...) ok+    (Recording state in git...)+    $ git commit -am testfile+    [master 73ed120] testfile+     1 file changed, 1 insertion(+)+     create mode 120000 testfile+    $ git annex whereis testfile+    whereis testfile (0 copies) failed+    git-annex: whereis: 1 failed+    +    +    # The contents exists though+    $ ls -l testfile+    lrwxrwxrwx 1 ftp ftp 176 May 13 09:43 testfile -> .git/annex/objects/P5/4q/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03+    $ cat .git/annex/objects/P5/4q/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03/SHA256-s6--5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03+    hello+    $ sha256sum testfile+    5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03  testfile+++    # the file can be found when unlocking/locking+    $ git annex unlock testfile+    unlock testfile (copying...) ok+    $ git annex lock testfile+    lock testfile ok+    (Recording state in git...)++### What version of git-annex are you using? On what operating system?+I ran Debian squeeze, with git annex 3.20120629~bpo60+2 when the problem was introduced. I just upgraded to wheezy, but the same problem exists with 3.20120629 from wheezy.++I also manually installed 4.20130501 from unstable, which also showed the same problem.+++### Please provide any additional information below.++I am not sure what information to supply, please provide pointers on what information might be useful.++> [[done]] per comment --[[Joey]]
+ doc/bugs/Local_network___40__ssh__41___fails_to_pair__47__sync.mdwn view
@@ -0,0 +1,175 @@+### Please describe the problem.+I am trying to set out two computers on the same network to synchronise.++### What steps will reproduce the problem?+Install Git-Annex. Start the webapp. Try to connect. Enter a secret phrase on both. The Mythbuntu machine shows "Failed to sync with Inspiron 14z" (the laptop). The laptop shows "Pairing in progress" forever.++The machines can normally connect together passwordlessly through ssh with public key encryption. ++### What version of git-annex are you using? On what operating system?+Ubuntu Raring Version: 3.20121112ubuntu2 from the repos on my laptop.  Install version 4.20130627 from the PPA on Mythbuntu Precise (which I use as a home server).++### Please provide any additional information below.+From the the laptop, where I started the pairing:+[[!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+$ git-annex webapp ++(process:3084): GLib-CRITICAL **: g_slice_set_config: assertion `sys_page_size == 0' failed++** (firefox:3084): WARNING **: Failed to find domain member of JSON manifest+Running global cleanup code from study base classes.+(Recording state in git...)++Launching web browser on file:///tmp/webapp3075.html+(scanning...) +  dbus failed; falling back to mtab polling (ClientError {clientErrorMessage = "Call failed: The name org.gtk.Private.GduVolumeMonitor was not provided by any .service files", clientErrorFatal = False})+(started...) Generating public/private rsa key pair.+Your identification has been saved in /tmp/git-annex-keygen3075.0/key.+Your public key has been saved in /tmp/git-annex-keygen3075.0/key.pub.+The key fingerprint is:+79:00:67:a4:f0:5f:62:26:78:ed:09:97:e4:c4:dd:56 aaron@Inspiron-14z+The key's randomart image is:++--[ RSA 2048]----++|    . .o*. . .E  |+|     + X... o    |+|    . * X ..     |+|     . O *       |+|        S .      |+|         .       |+|                 |+|                 |+|                 |++-----------------++Control socket connect(/home/shared/annex/.git/annex/ssh/mythbuntu@git-annex-mythbuntu-server.local-mythbuntu): Connection refused+Failed to connect to new control master+warning: no common commits++  Remote mythbuntuserver.local_annex does not have git-annex installed; setting remote.mythbuntuserver.local_annex.annex-ignore+Already up-to-date.+Counting objects: 13, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (9/9), done.+Writing objects: 100% (11/11), 1.06 KiB, done.+Total 11 (delta 2), reused 0 (delta 0)+To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/+ * [new branch]      git-annex -> synced/git-annex+ * [new branch]      master -> synced/master+Already up-to-date!+Merge made by the 'recursive' strategy.+Already up-to-date.+Already up-to-date.+Counting objects: 2, done.+Delta compression using up to 4 threads.+Compressing objects: 100% (2/2), done.+Writing objects: 100% (2/2), 326 bytes, done.+Total 2 (delta 1), reused 0 (delta 0)+To ssh://mythbuntu@git-annex-mythbuntu-server.local-mythbuntu/~/annex/+   82bf946..dfe0bd1  master -> synced/master+Already up-to-date.+SendMessage (77594660, 0x101f, (nil), (nil))+SendMessage (0, 0x1203, (nil), 0x7fffc68a1850)+SendMessage (0, 0x1204, (nil), 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x1, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x1, 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x2, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x2, 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x3, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x3, 0x7fffc68a1850)+SendMessage (0, 0x1203, 0x4, 0x7fffc68a1850)+SendMessage (0, 0x1204, 0x4, 0x7fffc68a1850)+SendMessage (77594660, 0x101f, (nil), (nil))+SendMessage (0, 0x1203, (nil), 0x7fffc68a1810)+SendMessage (0, 0x1204, (nil), 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x1, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x1, 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x2, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x2, 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x3, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x3, 0x7fffc68a1810)+SendMessage (0, 0x1203, 0x4, 0x7fffc68a1810)+SendMessage (0, 0x1204, 0x4, 0x7fffc68a1810)+SendMessage (77594660, 0x101f, (nil), (nil))+SendMessage (0, 0x1203, (nil), 0x7fffc68a2920)+SendMessage (0, 0x1204, (nil), 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x1, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x1, 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x2, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x2, 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x3, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x3, 0x7fffc68a2920)+SendMessage (0, 0x1203, 0x4, 0x7fffc68a2920)+SendMessage (0, 0x1204, 0x4, 0x7fffc68a2920)+Redirection loop trying to set HTTPS on:+  http://www.aol.com/favicon.ico+(falling back to HTTP)+SendMessage (77594652, 0x444, 0x1, 0x3652e00)+SendMessage (77594652, 0x444, 0x1, 0x3647de0)+SendMessage (77594652, 0x444, 0x1, 0x3667a80)+SendMessage (77594652, 0x444, 0x1, 0x3667a80)++# End of transcript or log.+# End of transcript or log.+"""]]++On the Mythbuntu machine:+[[!format sh """+$ git-annex webapp+Launching web browser on file:///tmp/webapp8399.html+(Recording state in git...)+"""]]++Unless I'm going mad, there doesn't seem to be a daemon.log on my laptop.++Daemon.log on the Mythbuntu machine:+[[!format sh """+[2013-07-14 10:38:56 BST] main: starting assistant version 4.20130627+(scanning...) [2013-07-14 10:38:56 BST] Watcher: Performing startup scan+(started...) [2013-07-14 10:38:57 BST] PairListener: aaron@Inspiron-14z:/home/shared/annex is sending a pair request.+Generating public/private rsa key pair.+Your identification has been saved in /tmp/git-annex-keygen.0/key.+Your public key has been saved in /tmp/git-annex-keygen.0/key.pub.+The key fingerprint is:+bb:8c:66:05:22:8e:fa:e1:10:33:6d:cb:d6:57:e2:47 mythbuntu@mythbuntu-server+The key's randomart image is:++--[ RSA 2048]----++|                 |+|                 |+|                 |+| .. . .          |+|+oo. ...E        |+|.*.o . +..       |+|o = . o.o        |+|.+ . .o+ .       |+| .o  o. o        |++-----------------++[2013-07-14 10:39:13 BST] main: Pairing with aaron@Inspiron-14z:/home/shared/annex in progress+ssh: connect to host Inspiron-14z.local port 22: Connection refused+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+[2013-07-14 10:39:17 BST] PairListener: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+Already up-to-date.+Already up-to-date.+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+Updating 82bf946..dfe0bd1+Fast-forward+[2013-07-14 10:39:56 BST] Pusher: Syncing with Inspiron14z.local__home_shared_annex +ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+ssh: connect to host Inspiron-14z.local port 22: Connection refused+fatal: The remote end hung up unexpectedly+"""]]
+ doc/bugs/Local_pairing_fails:_PairListener_crashed.mdwn view
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Attempting to pair between a local repository and a repository on a remote computer on my LAN. Pairing is initiated from my local machine and I'm interacting with the webapp on the remote machine via firefox running over an ssh -X connection. Pairing appears to work up to a point: I enter the secret at one end, the pairing request shows up at the other end. I then enter the secret at that end.++What is the expected output? What do you see instead?++Pairing should complete successfully. Instead I get the error message "PairListener crashed: bad comment in public key", followed by the public key. The pairing process then does not move beyond the 'awaiting pairing' pages.++What version of git-annex are you using? On what operating system?++Local Machine: 3.20121127, Debian Wheezy/Sid (the only package from unstable is git-annex).+Remote Machine: 3.20121113, Arch Linux (I installed the version from: https://aur.archlinux.org/packages/git-annex-bin/, which is supposedly the same as above, but reports the version specified here).++Please provide any additional information below.++None as yet. Let me know if there are any log files, etc. that I can post.++> So it was the period in the hostname! [[fixed|done]] --[[Joey]]
+ doc/bugs/Lost_S3_Remote.mdwn view
@@ -0,0 +1,59 @@+Somehow I've lost my S3 remote... git-annex knows it's there, but its not associating it with the git remote in .git/config++    $ git-annex whereis pebuilder.iso +    whereis pebuilder.iso (3 copies) +      	3b6fc6f6-3025-11e1-b496-33bffbc0f3ed -- housebackup (external seagate drive on /mnt/back/RemoteStore)+   	6b1326d8-2abb-11e1-8f43-979159a7f900 -- synology+   	9b297772-2ab2-11e1-a86f-2fd669cb2417 -- Amazon S3+    ok++Amazon S3 is the description from the remote.  My .git/config file contains this block:++    [remote "cloud"]+      annex-s3 = true+      annex-uuid = 9b297772-2ab2-11e1-a86f-2fd669cb2417+      annex-cost = 70++The UUID matches... But I cannot access it... see below:++    [39532:39531 - 0:626] 08:20:38 [vivitron@tronlap:o +3] ~/annex/ISO +    $ git-annex get pebuilder.iso --from=cloud+    git-annex: there is no git remote named "cloud"+    +    [39532:39531 - 0:627] 08:20:56 [vivitron@tronlap:o +3] ~/annex/ISO +    $ git-annex get pebuilder.iso --from="Amazon S3"+    git-annex: there is no git remote named "Amazon S3"+    +    [39532:39531 - 0:628] 08:21:01 [vivitron@tronlap:o +3] ~/annex/ISO +    $ git-annex get pebuilder.iso --from=9b297772-2ab2-11e1-a86f-2fd669cb2417+    git-annex: there is no git remote named "9b297772-2ab2-11e1-a86f-2fd669cb2417"++    [39532:39531 - 0:629] 08:21:08 [vivitron@tronlap:o +3] ~/annex/ISO +    $ ++git remote lists "cloud" as a remote:++    $ git remote+    all+    cloud+    cs+    es3+    origin++git-annex status lists S3 support:++    $ git-annex status+    supported backends: SHA256 SHA1 SHA512 SHA224 SHA384 SHA256E SHA1E SHA512E SHA224E SHA384E WORM URL+    supported remote types: git S3 bup directory rsync web hook++++I appreciate any help....  I've tested versions 3.20111211, 3.20111231, and 3.20120105++    $ git --version+    git version 1.7.8.1++++> [[done]]; I've fixed the build system so this confusing thing cannot+> happen anymore. --[[Joey]]
+ doc/bugs/Lost_S3_Remote/comment_1_6e80e6db6671581d471fc9a54181c04c._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 1"+ date="2012-01-06T03:04:35Z"+ content="""+Despite `status` listing S3 support, your git-annex is actually built with S3stub, probably because it failed to find the necessary S3 module at build time. Rebuild git-annex and watch closely, you'll see \"** building without S3 support\". Look above that for the error and fix it.++It was certianly a bug that it showed S3 as supported when built without it. I've fixed that.+"""]]
+ doc/bugs/Lost_S3_Remote/comment_2_c99c65882a3924f4890e500f9492b442._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joey.kitenet.net/"+ nickname="joey"+ subject="comment 2"+ date="2012-01-06T03:08:28Z"+ content="""+BTW, you'll want to \"make clean\", since the S3stub hack symlinks a file into place and it will continue building with S3stub even if you fix the problem until you clean.+"""]]
+ doc/bugs/Lost_S3_Remote/comment_3_1e434d5a20a692cd9dc7f6f8f20f30dd._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkey8WuXUh_x5JC2c9_it1CYRnVTgdGu1M"+ nickname="Dustin"+ subject="Thank you!"+ date="2012-01-06T03:38:27Z"+ content="""+make clean and rebuild worked...  Thank you+"""]]
+ doc/bugs/Makefile_is_missing_dependancies.mdwn view
@@ -0,0 +1,47 @@+<pre>+From e45c73e66fc18d27bdf5797876fbeb07786a4af1 Mon Sep 17 00:00:00 2001+From: Jimmy Tang <jtang@tchpc.tcd.ie>+Date: Tue, 22 Mar 2011 22:24:07 +0000+Subject: [PATCH] Touch up Makefile to depend on StatFS.hs++---+ Makefile |    2 +-+ 1 files changed, 1 insertions(+), 1 deletions(-)++diff --git a/Makefile b/Makefile+index 08e2f59..4ae8392 100644+--- a/Makefile++++ b/Makefile+@@ -15,7 +15,7 @@ SysConfig.hs: configure.hs TestConfig.hs+        hsc2hs $<+        perl -i -pe 's/^{-# INCLUDE.*//' $@+ +-$(bins): SysConfig.hs Touch.hs++$(bins): SysConfig.hs Touch.hs StatFS.hs+        $(GHCMAKE) $@+ + git-annex.1: doc/git-annex.mdwn+-- +1.7.4.1++</pre>+++StatFS.hs never gets depended on and compiled, the makefile was just missing something++> Thanks, [[done]]! Interested to hear if StatFS.hs works on OSX (no warning) or+> is a no-op (with warning). --[[Joey]] ++>> +>> for now it gives a warning, it looks like it should be easy enough to add OSX+>> support, I guess it's a case of just digging around documentation to find the equivalent+>> calls/headers. I'll give it a go at making this feature work on OSX and get back to you.+>> ++<pre>+jtang@exia:~/develop/git-annex $ make+hsc2hs StatFS.hsc+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS+StatFS.hsc:85:2: warning: #warning free space checking code not available for this OS+</pre>
+ doc/bugs/Manual_content_mode_isn__39__t_manual.mdwn view
@@ -0,0 +1,89 @@+### Please describe the problem.++The `manual` content mode doesn't follow the description provided in the help page, instead it seems to collect content.++### What steps will reproduce the problem?++1. Create a new git annex repository using the webapp, set the content type to `client`.+2. Create another repository, and set the content type to `manual`.+3. Copy something into the `client` repository.+4. It will be pushed/pulled into the `manual` repository.++### What version of git-annex are you using? On what operating system?++    git-annex version: 4.20130521-g25dba9d+    Ubuntu 13.04 x64.++### Please provide any additional information below.++I have also noticed very weird behaviour that I have been unable to replicate in testing, but I will describe the setup that it currently happens in:+I have 3x repositories, one a `client` repository, and the other two are set to `manual`. When put a new file into the `client` repository, it is pushed onto the two `manual` repositories. When these repositories have received it, the client drops the file and re-downloads it from one of the `manual` repositories. Once it's been pushed, deleted, and pulled, everything is happy... but the extra step makes no difference.++[[!format sh """+[2013-05-22 20:41:44 EST] main: starting assistant version 4.20130521-g25dba9d+[2013-05-22 20:41:44 EST] TransferScanner: Syncing with test3, test2 +Already up-to-date.++(scanning...) [2013-05-22 20:41:44 EST] Watcher: Performing startup scan+Already up-to-date.+Already up-to-date.+++(started...) From /home/valorin/workspace/tmp/test3+   f285dc2..406c20c  git-annex  -> test3/git-annex+   cdf2ad3..508983c  master     -> test3/master+From /home/valorin/workspace/tmp/test2+   1e04829..1c03533  git-annex  -> test2/git-annex+   8ad4bd3..18a5408  master     -> test2/master+Updating 508983c..18a5408+Fast-forward+Already up-to-date.+To /home/valorin/workspace/tmp/test2+   4e49293..a66ce5d  git-annex -> synced/git-annex+   508983c..18a5408  master -> synced/master+To /home/valorin/workspace/tmp/test3+   4e49293..a66ce5d  git-annex -> synced/git-annex+   508983c..18a5408  master -> synced/master+Already up-to-date.+Already up-to-date.+[2013-05-22 20:42:07 EST] Committer: Adding Firefly S..acked.m4v++(merging test3/git-annex into git-annex...)+(merging test2/git-annex into git-annex...)+(Recording state in git...)+++++add Firefly S01E03 Bushwhacked.m4v (checksum...) [2013-05-22 20:42:15 EST] Committer: Committing changes to git+[2013-05-22 20:42:15 EST] Pusher: Syncing with test3, test2 +Already up-to-date.+To /home/valorin/workspace/tmp/test2+   a66ce5d..a6773dd  git-annex -> synced/git-annex+   18a5408..f9e7692  master -> synced/master+To /home/valorin/workspace/tmp/test3+   a66ce5d..a6773dd  git-annex -> synced/git-annex+   18a5408..f9e7692  master -> synced/master+Already up-to-date.+Already up-to-date.+[2013-05-22 20:42:26 EST] Transferrer: Uploaded Firefly S..acked.m4v+[2013-05-22 20:42:26 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3+   a6773dd..c35f992  git-annex -> synced/git-annex+To /home/valorin/workspace/tmp/test2+   a6773dd..c35f992  git-annex -> synced/git-annex+[2013-05-22 20:42:35 EST] Transferrer: Uploaded Firefly S..acked.m4v+[2013-05-22 20:42:35 EST] Pusher: Syncing with test3, test2 +To /home/valorin/workspace/tmp/test3+   c35f992..9e47813  git-annex -> synced/git-annex+To /home/valorin/workspace/tmp/test2+   c35f992..9e47813  git-annex -> synced/git-annex+[2013-05-22 20:42:44 EST] Pusher: Syncing with test3, test2 +Everything up-to-date+Everything up-to-date+"""]]++> It turns out there was a bug in the preferred content expression parser,+> that made it parse the expression for manual mode (but I think no other standard+> expression) quite wrong, as if it had parens in the wrong place. This explains+> the broken behavior. [[fixed|done]] --[[Joey]]
+ doc/bugs/Manual_mode_weirdness.mdwn view
@@ -0,0 +1,37 @@+### Please describe the problem.++I have an annex which contains all my photos. There are repositories on my laptop and my home server as well as an s3 backup (for which syncing is currently disabled). I switched the copy on my laptop to manual mode via 'git annex vicfg' (this correctly shows up in the webapp). I then proceeded to drop several folders (each containing a year's worth of photos). This works fine, however the assistant immediately starts downloading the dropped files from the server! Numcopies is set to 1 and the problem exists with the server in both the 'transfer' and 'backup' groups (haven't tried others).++### What steps will reproduce the problem?++1. Create a repo with some files.+2. Create a bare-git remote on another machine.+3. Make sure the assistant is running for the repo in question. +4. Switch your local copy to manual mode.+5. Drop some files.+6. Watch as the assistant re-downloads them!++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130501+local repository version: unknown+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++Debian Testing/Sid.++### Please provide any additional information below.++If it's relevant I switched the local repository to indirect mode by manually shutting down the assistant and running 'git annex indirect' before restarting the assistant. This was done before any of the steps above.++[[!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.+"""]]++> [[done]] --[[Joey]] 
+ doc/bugs/Missing_repo_uuid_after_local_pairing_with_older_annex.mdwn view
@@ -0,0 +1,31 @@+### Please describe the problem.+I paired my repo running on Gentoo (git-annex 4.20130601) with Ubuntu 13.04 (git-annex 3.10121112ubuntu4). The repo on Ubuntu doesn't have uuid for the Gentoo remote, so:++- There is no name in assistan's repo settings for it++- Trying to access its settings gives Internal server error: Unknown UUID+15/Jun/2013:12:39:10 +0300 [Error#yesod-core] Unknown UUID @(yesod-core-1.1.8.3:Yesod.Internal.Core ./Yesod/Internal/Core.hs:550:5)++- In dashboard on Ubuntu all changes stay queued forever (although the syncing seems to work)++### What steps will reproduce the problem?+Pair local computers with different annex versions.++### What version of git-annex are you using? On what operating system?+Gentoo (git-annex 4.20130601)+Ubuntu 13.04 (git-annex 3.10121112ubuntu4)++### 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.+"""]]++> Others are reporting what seems to be the same problem here:+> [[Internal_Server_Error:_Unknown_UUID]].+> +> [[dup|done]] --[[Joey]]
+ doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn view
@@ -0,0 +1,15 @@+Running the 'assistant' branch, I occassionally get++To myhost1:/Users/jtang/annex+ ! [rejected]        master -> synced/master (non-fast-forward)+error: failed to push some refs to 'myhost1:/Users/jtang/annex'+hint: Updates were rejected because a pushed branch tip is behind its remote+hint: counterpart. Check out this branch and merge the remote changes+hint: (e.g. 'git pull') before pushing again.+hint: See the 'Note about fast-forwards' in 'git push --help' for details.+(Recording state in git...)++manually running a 'git annex sync' usually fixes it, I guess once the sync command runs periodically this problem will go away, is this even OSX specific? I don't quite get the behaviour that is described in [[design/assistant/blog/day_15__its_aliiive]].++> With my changes today, I've seen it successfully recover from this+> situation. [[done]] --[[Joey]] 
+ doc/bugs/Most_recent_git-annex_will_not_build_on_OpenIndiana.mdwn view
@@ -0,0 +1,36 @@+Version 3.20120825 built on my OpenIndiana system just fine, but the latest release gives me this during setup:++    Linking /tmp/git-annex-3.20121017-13013/git-annex-3.20121017/dist/setup/setup ...+      checking version... 3.20121017+      checking git... yes+      checking git version... 1.7.8.2+      checking cp -a... yes+      checking cp -p... yes+      checking cp --reflink=auto... yes+      checking uuid generator... uuid -m+      checking xargs -0... yes+      checking rsync... yes+      checking curl... yes+      checking wget... yes+      checking bup... no+      checking gpg... no+      checking lsof... no+      checking ssh connection caching... yes+      checking sha1... sha1sum+      checking sha256... sha256sum+      checking sha512... sha512sum+      checking sha224... sha224sum+      checking sha384... sha384sum+    Configuring git-annex-3.20121017...+    Building git-annex-3.20121017...+    Preprocessing executable 'git-annex' for git-annex-3.20121017...+    In file included from Mounts.hsc:25:0:+    Utility/libmounts.h:13:3: warning: #warning mounts listing code not available for this OS [-Wcpp]++    Utility/libkqueue.c:13:23:+         fatal error: sys/event.h: No such file or directory+    compilation terminated.++Is it possible to remove the new requirement?  Thanks!++> [[done]] --[[Joey]]
+ doc/bugs/Name_scheme_does_not_follow_git__39__s_rules.mdwn view
@@ -0,0 +1,31 @@+I can create an annex remote named 'test:/test'. git itself does not allow colons in names, though. The name scheme for an annex should be the same as for git repos themselves.++> What do you mean by "an annex remote"? git-annex uses the same+> remotes configuration as does git. If you put invalid+> stuff in .git/config it might handle it slightly different than +> git, I don't know. Examples needed. --[[Joey]] ++>> What I mean is this:++    % cd 1+    % git init+    % git annex init "my:colon"+    % [...]+    % cd ../2+    % git init+    % git annex init "second"+    % git remote add "my:colon" ../1+    fatal: 'my:colon' is not a valid remote name++>> -- RichiH++>>> I see.. Git annex init does not specifiy a remote's name, it specifies+>>> an arbitrary human-readable description of the repository, which will+>>> be displayed when there is no configured remote corresponding to the+>>> repository. So this is not a bug unless some documentation of that is+>>> unclear. --[[Joey]] ++>>>> Nobody spoke up to say it's unclear, so closing as PEBKAC :)+>>>> [[done]] --[[Joey]] ++>>>>> I still think git-annex should follow the same rules as git in this regard, but if your design decision is different, I won't try to argue the point :) -- RichiH
+ doc/bugs/Need_to_manually_install_c2hs_-_3.20121127_and_previous.mdwn view
@@ -0,0 +1,37 @@+What steps will reproduce the problem?++Install git-annex via cabal - either from Hackage or as a manual install. (i.e. <http://git-annex.branchable.com/install/cabal/>)++What is the expected output? What do you see instead?++Expect a clean install.++However, get the following error:++      Configuring gnuidn-0.2...+      cabal: The program c2hs is required but it could not be found.+      Failed to install gnuidn-0.2+      cabal: Error: some packages failed to install:+      git-annex-3.20121127 depends on gnuidn-0.2 which failed to install.+      gnuidn-0.2 failed during the configure step. The exception was:+      ExitFailure 1+      network-protocol-xmpp-0.4.4 depends on gnuidn-0.2 which failed to install.++What version of git-annex are you using? On what operating system?++git-annex: 3.20121127 (and previous versions)++OS: Mac OSX 10.6.8+++Please provide any additional information below.++The fix seems as easy as++    cabal install c2hs++Should c2hs be included as a dep got git-annex or is this a bug in gnuidn?++> Apparently cabal does not support automatically installing programs+> needed for the build. I've updated the cabal installation instructions+> to document the need to install c2hs. [[done]] --[[Joey]]
+ doc/bugs/No_easy_way_to_re-inject_a_file_into_an_annex.mdwn view
@@ -0,0 +1,12 @@+My local git index got corrupted and I needed to clone and annex get all data from my main repo.++Some files were never copied anywhere so I am stuck with symlinks to nowhere.++I tried to copy over the symlink with a copy of the actual file, which did not work. Trying to unlock, copying over the symlink, and relock did not work, either.++Then, I copied the annex object to the correct place in .git/annex/objects/..., set all modes, re-ran fsck and the file re-appeared.+++Long story short, I think there should be a `git annex reinject $file` or similar which will take a file, either one replacing the symlink or with an arbitrary path, and put it into the correct place in the object store. Called normally, it should reject all reinjects where the checksum does not match. With --force, this should be overridden. For reasons of safety, WORM should always require --force.++> [[closing|done]], seems addressed --[[Joey]] 
+ doc/bugs/No_progress_bars_with_S3.mdwn view
@@ -0,0 +1,26 @@+## What steps will reproduce the problem?++Add new data to a repository with an S3 special remote. Monitor the repository with the web app.+++## What is the expected output? What do you see instead?++I expect a changing status bar and percentage. Instead I see no changes when an upload becomes active.+++## What version of git-annex are you using? On what operating system?++3.20130102 on Arch 64-bit.+++## Please provide any additional information below.+++When uploading local data to an S3 remote, I see no progress bars. The progress bar area on active uploads stays the same grey as the bar on queued uploads. The status does not change from "0% of...". The uploads are completing, but this makes it very difficult to judge their activity.++The only remotes I currently have setup are S3 special remotes, so I cannot say whether progress bars are working for uploads to other remote types.++> [[done]], this turned out to be a confusion in the progress code;+> parts were expecting a full number of bytes since the start, while+> other parts were sending the number of bytes in a chunk. Result was+> progress bars stuck at 0% often. --[[Joey]]
+ doc/bugs/No_version_information_from_cli.mdwn view
@@ -0,0 +1,18 @@+git-annex does not listen to -v, --version or version.++At the very least, it should return both the version of the binary and the version of the object store it supports.+If it supports several annex versions, they should be listed in a comma-separated fashion.+If git-annex is called from within an annex, it should print the version of the local object store.++Sample:++    % git annex version+    git-annex version               : 0.24+    default object store version    : 3+    supported object store versions : 2,3+    local object store version      : 2+    % ++The above might look like overkill, but it's in a form that will, most likely, never need to be extended.++> Great idea, [[done]] --[[Joey]] 
+ doc/bugs/OSX_alias_permissions_and_versions_problem.mdwn view
@@ -0,0 +1,37 @@+What steps will reproduce the problem?++Use assistant and create repository the a folder in home dir.+Use textedit and save a new txt to the repository folder. ++What is the expected output? What do you see instead?++The alias solution is broken. It should work more like Dropbox.+Textedit saves the file initially, but it is immediately locked.+Since it autosaves, it asks to unlock or duplicate.+Then gives the error:+"The file “Untitled 16.txt” cannot be unlocked."++If the file exists:+The document “Untitled 14” could not be saved as “Untitled 14.txt”. You don’t have permission.++If you open a file from the repository (now replaced by a symlink) with textedit, there are other problems:+- The filename will not be correct (will show the sha hash). +- It will ask to unlock, then give the error "You don’t have permission to write to the folder that the file “SHA256E-s8--8985d9832de2e28b5e1af64258c391a34d7528709ef916bac496e698c139020c.txt” is in."++What version of git-annex are you using? On what operating system?++OSX Lion+git-annex version: 3.20120924++Please provide any additional information below.++Even if you fix these problems, automatic versioning in lion will probably don't work, and the symlinks seem a hackish solution and don't seem intuitive or easy to the end user. +The sync should be transparent but it's not, and it's error prone. It would even be best to keep file copies in the git repo and sync them with the original folder than make symlinks.++Dropbox even allows to put a symlink in the dropbox directory, and it will sync the file. ++[[!tag /design/assistant/OSX]]++> Now the assistant creates new repositories using direct mode on OSX.+> In direct mode, there is no locking of files; they can be modified+> directly. [[done]] --[[Joey]]
+ doc/bugs/OSX_app_issues.mdwn view
@@ -0,0 +1,6 @@+This is a collection of problem reports for the standalone OSX app.+If you have a problem using it, post it here. --[[Joey]] ++(Some things that should be fixed now have been moved to [[old]].)++[[!tag /design/assistant/OSX]]
+ doc/bugs/OSX_app_issues/comment_10_54d8f3e429df9a9958370635c890abf0._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.3.194"+ subject="comment 10"+ date="2013-01-19T16:13:20Z"+ content="""+The app uses the version of git included in it, because using the system's installed version if there is one is likely to run into other version incompatabilities. ++You can either install git-annex using cabal and homebrew, as documented, or you could go in and delete+all the git programs out of the app, and then it'd use the system's git stuff instead.+"""]]
+ doc/bugs/OSX_app_issues/comment_10_6d23232fbb15d0ee3ab532a4884f81ed._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-04-16T17:14:13Z"+ content="""+@Jeremy, it's been a long time since anyone reported having the \"LSOpenURLsWithRole()\". It seemed to go away when the dmg was fixed to include all the necessary libraries. So my guess is you installed it wrong, somehow, and perhaps it's not finding those libraries that are part of the dmg.++You should be able to start the assistant by running it directly from the dmg.+"""]]
+ doc/bugs/OSX_app_issues/comment_11_5db2baa771fd01a284eac8a16c1c8c67._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkAghrKEvslMcV2INKUhtPPMsfnzQyyd8"+ nickname="Jeremy"+ subject="comment 11"+ date="2013-04-17T02:02:00Z"+ content="""+@joey, figured it out. There was a program added to the startup list, presumably from when I ran things from the dmg a while ago. Once I delete that, it started fine. Of course, I forgot to write down the name of the program... I remember it had an LW in the name.+"""]]
+ doc/bugs/OSX_app_issues/comment_11_bb2ceb95a844449795addee6986d0763._comment view
@@ -0,0 +1,26 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlYy4BrJyV1PdfqzevCVziXRp89iUH6Xzw"+ nickname="Christopher"+ subject="Code signing errors in log on starting git-annex.app"+ date="2013-01-19T22:30:32Z"+ content="""+When I run via the App and set up a fresh repo, i get some Console.app spam (looks like one per file added to the repo dir... or maybe one per git command?):++    2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x1008b4000): p=73995[git] clearing CS_VALID+    2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x10f99e000): p=73996[git] clearing CS_VALID+    2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x102b44000): p=73997[git] clearing CS_VALID+    2013-01-19 2:44:55.000 PM kernel[0]: CODE SIGNING: cs_invalid_page(0x1029f4000): p=73998[git] clearing CS_VALID+    ...++and nothing seems to work. The page address and the pid increment steadily with each line.  I'm using 10.8.2 (12C60) on a Mac Pro, and grabbed:++     /git-annex/OSX/current/10.8.2_Mountain_Lion/git-annex.dmg.bz2	++(published 14-Jan-2013 15:19)++It seems to be a code signing issue, perhaps with the vendored git binaries. While things are sort-of working, the web app shows the files flying by really fast. ++Using a fresh repo via `git annex webapp` works great (I built that after much teeth-knashing, brew install/link cycles, and then cabal install git-annex). ++I am very excited for this to work, this is exactly what I've been waiting for to replace dropbox. Came very close to writing it myself a few times (and in Haskell no less!!). +"""]]
+ doc/bugs/OSX_app_issues/comment_12_62170597c7f441d84d48986857998858._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkCw26IdxXXPBoLcZsQFslM67OJSJynb1w"+ nickname="Alexander"+ subject="standalone app dmg won't open in OSX 10.8.3"+ date="2013-04-29T18:05:54Z"+ content="""+I downloaded the app build from [http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/](http://downloads.kitenet.net/git-annex/OSX/current/10.8.2_Mountain_Lion/) and unpacked it, but the .dmg won't open. I can run other dmg's successfully. ++Trying to install git-annex via cabal on the same machine led to this issue: [http://git-annex.branchable.com/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/#comment-7cc94df1bf9a75a6d03369f3897d6816](http://git-annex.branchable.com/tips/Building_git-annex_on_Debian_OR___37____164____35____34____164____37____38____34____35___Haskell__33__/#comment-7cc94df1bf9a75a6d03369f3897d6816)+"""]]
+ doc/bugs/OSX_app_issues/comment_12_f3bc5a4e4895ac9351786f0bdd8005ba._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmYiJgOvC4IDYkr2KIjMlfVD9r_1Sij_jY"+ nickname="Douglas"+ subject="Error creating remote repository using ssh on OSX"+ date="2013-01-25T13:18:40Z"+ content="""+There is an issue with creating remote repositories using ssh (the problem may require using a different account name.) I filed the following bug:+++<http://git-annex.branchable.com/bugs/Error_creating_remote_repository_using_ssh_on_OSX/>+"""]]
+ doc/bugs/OSX_app_issues/comment_13_cb12d419459e5cac766022ee0697fedc._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="John"+ ip="109.242.130.160"+ subject="runshell typo prevents execution"+ date="2013-09-22T00:24:10Z"+ content="""+Using the latest Mountain Lion build available.++>$ /Applications/git-annex.app/Contents/MacOS/git-annex++>/Applications/git-annex.app/Contents/MacOS/runshell: line 25: syntax error near unexpected token `&'++Line 25:+>echo \"** runshell loop detected!\"> &2++Fix (obvious but for the sake of completeness):+>echo \"** runshell loop detected!\" >&2+"""]]
+ doc/bugs/OSX_app_issues/comment_14_c966fa549bc73c52034ac9abc49de52a._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.154.1.250"+ subject="comment 14"+ date="2013-09-22T14:15:28Z"+ content="""+I have fixed the runshell typo and updated the builds.+"""]]
+ doc/bugs/OSX_app_issues/comment_15_10f1df95266f1a8c9ef933183190f6e2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="gueux"+ ip="2a01:240:fe6d:0:8947:cf55:f955:49b9"+ subject="same typo on Lion build"+ date="2013-10-23T09:17:58Z"+ content="""+Could you please fix this typo on the Lion build?+"""]]
+ doc/bugs/OSX_app_issues/comment_16_064e151da121f9c2ef13c19ecb4e7458._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="Remy"+ ip="83.87.21.84"+ subject="Crashes on OSX 10.9"+ date="2013-10-23T20:30:12Z"+ content="""+I just installed OSX Mavericks. I also took the latest autobuild and copied it over the old git-annex.app to be sure it doesn't work.+When I execute \"git-annex status\" I get the following message+++> dyld: Symbol not found: _objc_debug_taggedpointer_mask+>   Referenced from: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+>   Expected in: /Applications/git-annex.app/Contents/MacOS/bundle/I+>  in /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation+> [1]    1361 trace trap  git-annex status+"""]]
+ doc/bugs/OSX_app_issues/comment_2_fd560811c57df5cbc3976639642b8b19._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkN91jAhoesnVI9TtWANaBPaYjd1V9Pag8"+ nickname="Benjamin"+ subject="Package for older OS X"+ date="2012-11-17T12:36:45Z"+ content="""+Is there an option to provide application bundle for older versions of OS X? The last time I tried the bundle wouldn't work under 10.5. If no specific features from newer OS X versions are required, it could be enough to add a simple switch when building.+"""]]
+ doc/bugs/OSX_app_issues/comment_7_93e0bb53ac2d7daef53426fbdc5f92d9._comment view
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkurjhi0CRJvgm7QNaZDWS9hitBtavqIpc"+ nickname="Bret"+ subject="git-annex.app Not working on 32 bit machines"+ date="2012-11-03T19:18:47Z"+ content="""+I tried running the git-annex.app on my Core Duo Macbook pro, and it does not run at all.  I get an error on my system.log++`Nov  3 12:13:26 Bret-Mac [0x0-0x15015].com.branchable.git-annex[155]: /Applications/git-annex.app/Contents/MacOS/runshell: line 52: /Applications/git-annex.app/Contents/MacOS/bin/git-annex: Bad CPU type in executable+Nov  3 12:13:26 Bret-Mac com.apple.launchd.peruser.501[92] ([0x0-0x15015].com.branchable.git-annex[155]): Exited with exit code: 1`++It works on my 64 bit machine, and this has become quite the problem for a while now, where people with newer macs dont compile back for a 32bit machine.  ++Is there any hope for a pre-compiled binary that works on a 32 bit machine?+"""]]
+ doc/bugs/OSX_app_issues/comment_8_141eac2f3fb25fe18b4268786f00ad6a._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkSq2FDpK2n66QRUxtqqdbyDuwgbQmUWus"+ nickname="Jimmy"+ subject="comment 8"+ date="2012-11-07T16:08:00Z"+ content="""+I've been updating my haskell platform install recently, i used to try and get the builder to spit out 32/64bit binaries, but recently it's just become too messy, I've just migrated to a full 64bit build system. I'm afraid I won't be able to  provide 32bit builds any more.+"""]]
+ doc/bugs/OSX_app_issues/comment_8_f4d5b2645d7f29b80925159efb94a998._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmOsimKUgz6rxpmsS_nrBQGavEYyUpDlsE"+ nickname="Tim"+ subject="OS X 10.8.2"+ date="2013-01-11T00:07:54Z"+ content="""+Double click on the app, give permission for it to run and ... nothing+"""]]
+ doc/bugs/OSX_app_issues/comment_9_2e6dfca0fd8df04066769653724eae28._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmRFKwny4rArBaz-36xTcsJYqKIgdDaw5Q"+ nickname="Andrew"+ subject="Prefer the system/path git binaries if they're a newer version"+ date="2013-01-19T06:20:38Z"+ content="""+I have used homebrew to install git v1.8.0.2 but git-annex.app packages git v1.7.10.2. git 1.7 crashes due to some newer directives in my global git config.++    error: Malformed value for push.default: simple+    error: Must be one of nothing, matching, tracking or current.+    fatal: bad config file line 38 in /Users/akraut/.gitconfig+    +    git-annex: fd:13: hGetLine: end of file+    failed+    git-annex: webapp: 1 failed++"""]]
+ doc/bugs/OSX_app_issues/comment_9_e1bbe83a1b9a7385ed6d443d0cc22bc7._comment view
@@ -0,0 +1,18 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlkAghrKEvslMcV2INKUhtPPMsfnzQyyd8"+ nickname="Jeremy"+ subject="Unable to start assistant"+ date="2013-04-16T01:07:05Z"+ content="""+I got the git-annex assistant to work once a long time ago when I ran it the first time directly from the dmg. Ever since then (i.e., after putting it in my applications folder) I have never gotten it to run. Wondering if anyone else has experienced this?++I am running OSX 10.7.5 and just pulled the latest app (05-Apr-2013 10:17).++For reference, when I try to kick off the the assistant from the command line I get the error:++    $ open /Applications/git-annex.app+    LSOpenURLsWithRole() failed with error -10810 for the file /Applications/git-annex.app.++I am wondering if there is some sort of file or modification that was made when I accidently kicked it off initially from the dmg, if so any thoughts on what to clear / change?++"""]]
+ doc/bugs/OSX_app_issues/old.mdwn view
@@ -0,0 +1,1 @@+These issues should be fixed now.
+ doc/bugs/OSX_git-annex.app_error:__LSOpenURLsWithRole__40____41__.mdwn view
@@ -0,0 +1,26 @@+**What steps will reproduce the problem?**++Either double click on the app or from the terminal++    $ open /Applications/git-annex.app++**What is the expected output? What do you see instead?**++I'd expect to see git-annex run.  "git-annex" doesn't run and what I see (in the terminal) is:++    LSOpenURLsWithRole() failed with error -10810 for the file /Applications/git-annex.app.++**What version of git-annex are you using? On what operating system?**++*git-annex*: 3.20121017++*git-annex.app*: ???++*OS*: OSX 10.6.8 64 bit+++**Please provide any additional information below.**++[[!tag /design/assistant/OSX]]++> This was fixed a while ago. [[done]] --[[Joey]] 
+ doc/bugs/OS_X_10.8:_Can__39__t_reopen_webapp.mdwn view
@@ -0,0 +1,31 @@+### Please describe the problem.++If the assistant is not running, I can successfully open the git-annex application, which will trigger my browser to open a new tab with the assistant interface.++However, once that has been done one time, there appears to be no way to get back to the assistant if the tab is closed.  Attempting to open the application again while the assistant is running in the background results in nothing happening at all. ++### What steps will reproduce the problem?++1. Open git-annex.app+2. See assistant and then close the browser tab+3. Open git-annex.app again+4. Nothing happens++### What version of git-annex are you using? On what operating system?++Version 4.20130723-ge023649 on OS X 10.8.4.++### Please provide any additional information below.++From .git/annex/daemon.log:++[[!format sh """+[2013-07-28 00:01:08 CDT] main: starting assistant version 4.20130723-ge023649++(scanning...) [2013-07-28 00:01:08 CDT] Watcher: Performing startup scan+(started...)+"""]]++> [[done]]; I added the `&` to git-annex-shell.+> Hopefully that does not cause any other unwanted behavior..+> --[[Joey]]
+ doc/bugs/Old_repository_stuck.mdwn view
@@ -0,0 +1,9 @@+I had created a test repository a time ago with an old version of git-annex. I didn't really used it so I simply deleted the directory by hand. Now I've installed a new version of git-annex  and the old repository stills appears on the webapp, but there is no interface to delete it.++* Old git-annex version: don't remember +* New git-annex version: I downloaded 3.20130107 (twice to be sure), but for some reason 'git-annex version' reports 3.20130102+* OS: Ubuntu 12.04.1 LTS 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux++> This is [[fixed|done]] in git; assuming the repo was showing up+> in the upper-right menu for switching amoung local repositories.+> --[[Joey]] 
+ doc/bugs/On_Windows__44___wget_is_not_used__44___even_if_available.mdwn view
@@ -0,0 +1,67 @@+### Please describe the problem.+On Windows, with a remote repository configured for HTTP access, wget is never used, even if it's available in the system. curl is always used.++### What steps will reproduce the problem?+1. Set up an annex on a remote system, configure it for HTTP access, run an HTTP server.+2. over HTTP, clone it to Windows+3. "annex get -vd <file>"+4. note that curl is used.+++### What version of git-annex are you using? On what operating system?+Windows 7: 4.20140627-g8a36ec5 (from the git-annex download page)++### Additional Info+After some debugging, it appears the issue is that git-annex looks to see if the file 'wget' is available in any directory on the PATH. on windows, wget is installed as 'wget.exe', and the file 'wget' does not exist anywhere. creating a file named 'wget' works around the issue. (wget.exe appears to still be the file used)++###Full Transcript+1. remote annex is created on host 192.168.0.8, with file "file1.txt"+[[!format sh """+#Windows 7+#download and install git from git-scm.com/download/win+#Git-1.8.3-preview20130601.exe+#on install, selecting "Run Git from the Windows Command Prompt"+#on install, selecting "checkout as-is, commit as-is"+#installs to C:\Program Files (x86)\Git+#download and install git-annex from http://git-annex.branchable.com/install/+#git-annex-installer.exe+#need to right-click 'run as administrator', per reported bug (link here)+#installs to C:\Program Files (x86)\Git\cmd+#also installs some utilities, including wget.exe++C:\Users\test-git-annex>git clone http://192.168.0.8:8000/test_annex/.git+Cloning into 'test_annex'...++C:\Users\test-git-annex>cd test_annex++C:\Users\test-git-annex\test_annex>dir+ Volume in drive C has no label.++ Directory of C:\Users\test-git-annex\test_annex++<DIR>          .+<DIR>          ..+              178 file1.txt+               1 File(s)            178 bytes++C:\Users\test-git-annex\test_annex>type file1.txt+.git/annex/objects/J9/m6/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729/SHA256-s21--6ed275e9e01c84a57fdd99d6af793c5d587d02e699cd2c28b32b7dc90f73e729++C:\Users\test-git-annex\test_annex>git annex init windows+init windows+  Detected a crippled filesystem.++  Enabling direct mode.++  Detected a filesystem without fifo support.++  Disabling ssh connection caching.+ok+(Recording state in git...)++C:\Users\test-git-annex\test_annex> git annex get file.txt+#fails, with error dialog box, indicating libcurl-4.dll is missing, indicating git-annex is trying to use curl.++"""]]++> I fixed this immediately after it was mentioned on IRC. [[done]] --[[Joey]] 
+ doc/bugs/Out_of_memory_error_in_fsck_whereis_find_and_status_cmds.mdwn view
@@ -0,0 +1,84 @@+Before I start on what's gone wrong, many thanks for a great program: finally a way of finding out where I've put all those files, and I enjoyed your talk in Australia. Not quite to New Zealand, but a good start :-)++To play with git-annex, I decided to convert my ~/Downloads directory to a git-annex repository, as there were a wide variety of files in it, mostly easily replaceable, and also handy to have on multiple machines. In hindsight, probably wasn't a great idea, as I'd regularly forget it was a git-annex repo and move files and directories out manually, which caused all sorts of fun trying to sort out the dead symlinks. Then I after one update, the repository format changed, from WORM to xxx256 format which meant there were now both sorts in the GA object store.++More recently I'd tried converting the repo to direct mode, you get the idea: lots of playing with git-annex commands, and now that I think about it, possibly some git commands too trying to repair missing files.++Anyway I've ended up with a 27GB git-annex repo that now manages to kill git-annex whenever I try to check it using "git-annex fsck". ++Not only does the fsck subcommand cause it to die, but also "find", "whereis" and "status". It dies on the same file (for find/whereis/fsck).++e.g.++    ... lots of stuff deleted ...+    whereis 1wolf14.zip (2 copies) +            051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop+            2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads)+    ok+    git-annex: out of memory (requested 2097152 bytes)++Now "git status" for some repo data:++    myPC:~/Downloads$ git annex status+    supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+    supported remote types: git S3 bup directory rsync web webdav glacier hook+    repository mode: direct+    trusted repositories: 0+    semitrusted repositories: 4+            00000000-0000-0000-0000-000000000001 -- web+            051f0b00-e265-11e1-894e-3b0b3f3844f2 -- Laptop+            2c4e11e0-a1b4-11e1-9a02-73e17b04c00f -- here (myPC - Downloads)+            48fbe52a-a1b3-11e1-bb80-ebc15118871d -- netbk+    untrusted repositories: 0+    dead repositories: 0+    transfers in progress: none+    available local disk space: 100 gigabytes (+1 megabyte reserved)+    local annex keys: 1719+    local annex size: 27 gigabytes+    known annex keys: git-annex: out of memory (requested 2097152 bytes)++It always seems to die at about 3.5GB memory usage. This is running on Ubuntu 12.04, using the latest GA release built using cabal:++    git-annex version: 4.20130227+    local repository version: 3+    default repository version: 3+    supported repository versions: 3 4+    upgrade supported from repository versions: 0 1 2++There are also dead symlinks that point to directories that have meta-data but not the symlink target (manually line-wrapped):++    myPC:~/Downloads$ ls -l precise*+    lrwxrwxrwx 1 nino nino 194 Oct 21 12:48 precise-dvd-i386.iso -> +                 .git/annex/objects/0x/Xz/SHA256-s3590631424--+                 b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0/+                 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0++But looking in the symlink destination directory, there's no corresponding object, only metadata:++    myPC:~/Downloads/.git/annex/objects/0x/Xz/SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0$ ls -l+    total 8+    -rw-rw-r-- 1 nino nino 30 Jan  8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.cache+    -rw-rw-r-- 1 nino nino 49 Jan  8 23:15 SHA256-s3590631424--b08ecdd4846948ec076b23afae7f87be9cfba5218fb9ba4160f26c0b8d4b5dd0.map++But there is another version somewhere else.++    -r--r--r-- 1 nino nino 3590631424 Mar 18  2012 ./.git/annex/objects/Kj/wM/WORM-s3590631424-m1331991509+                        --precise-dvd-i386.iso/WORM-s3590631424-m1331991509--precise-dvd-i386.iso++This actual file does exist in the "Used" directory:++    -rw-r--r-- 1 nino nino 3.4G May 27  2012 precise-dvd-i386.iso++I'm not so worried about the mangled repo - it's quite possibly because of clueless git/git-annex command usage - but the inability to use the fsck command is concerning++I could just uninit everything, but as it dies prematurely, I'm not certain that all the contents would be restored.+Any thoughts on how I can get git-annex (esp. fsck) to complete would be appreciated.++Thanks+Giovanni++> [[fixed|done]]. However, if you saw this behavior,+> you have large files checked directly into git. You may+> want to examine your repository and use git filter-branch to clean+> it up.+> --[[Joey]] 
+ doc/bugs/Partial_direct__47__indirect_repo.mdwn view
@@ -0,0 +1,24 @@+Setup:++* Fresh install of Debian Wheezy on machines A & B, git-annex 4.20130227 pulled in from unstable+* On both machines, clone old repository which contains both annexed files and a three small files checked straight into git++Steps:++* On both machines, use webapp to create `~/.config/git-annex/autostart` by just firing it up and typing in location of existing repository+* Move a new file into B's annex, in a subdirectory that is preferred on both A & B++Expected:++* The new file is copied over to A and everything remains in indirect mode+* Three files checked straight into git remain checked straight into git (see below for why this is a variant on [[bugs/Switching_between_direct_and_indirect_stomps_on___39__regular__39___git_files/]])++Actual:++* New file copied over but seems to be in direct mode, while all the other content that is present is still symlinked+* Files checked into git converted to direct mode files too (can tell this has happened by following step:)+* Typing `git annex indirect` on A & B shows conversion of precisely four files (three files originally checked into git and new file added to B ) back to indirect++Thanks.++> [[done]], webapp now avoids changing existing repos here. --[[Joey]]
+ doc/bugs/Prevent_accidental_merges.mdwn view
@@ -0,0 +1,14 @@+With the storage layout v3, pulling the git-annex branch into the master branch is... less than ideal.++The fact that the two branches contain totally different data make an accidental merge worse, arguably.++Adding a tiny binary file called .gitnomerge to both branches would solve that without any noticeable overhead.++Yes, there is an argument to be made that this is too much hand-holding, but I still think it's worth it.++-- Richard++> It should be as easy to undo such an accidential merge+> as it is to undo any other git commit, right? I quite like that git-annex +> no longer adds any clutter to the master branch, and would be reluctant+> to change that. --[[Joey]]
+ doc/bugs/Problem_when_dropping_unused_files.mdwn view
@@ -0,0 +1,21 @@+### Please describe the problem.++While dropping 19 unused files from an annex, I got this error:++    error: invalid object 100644 c873416e78db4dd94b6ab40470d6fe99b2ecb8bd for '002/0a6/SHA256E-s427690--03aeabcde841b66168b72de80098d74e047f3ffc832d4bbefa1f2f70ee6c92f8.jpg.log'+    fatal: git-write-tree: error building trees+    git-annex: failed to read sha from git write-tree++I've actually seen this before, a few months ago.++### What steps will reproduce the problem?++I have no idea, but once it happens I can't interact with unused files anymore.  Also, `git annex fsck` now reports this same problem as well.++### What version of git-annex are you using? On what operating system?++git-annex version: 4.20130815, OS X 10.8.4++> [[done]]; no indication this is anything other than a corrupt git+> repository, which can be caused by system crash, disk data loss, +> cosmic rays, etc. This is why we keep backups... --[[Joey]] 
+ doc/bugs/Problem_with_bup:_cannot_lock_refs.mdwn view
@@ -0,0 +1,52 @@+Hi!++Using bup for storing seems a good idea to save space, but I still have a problem when trying to copy files to my local git repo.+I have two partitions:++- /Data (NTFS)++- / (ext4)++I turned the directory /Data/Audio into a git-annex repo, and cloned it into /home/me/AudioClone.+I added the remote bup to AudioClone by doing:++    git annex initremote mybup type=bup encryption=none buprepo=++But when I try to copy some files that I have previously got by "git annex get" by doing:++    [~/AudioClone]$ git annex copy someartist/somealbum --to mybup++it fails and tells me:++    copy Order To Die/01 Morituri Te Salutant.flac (to mybup...) +    fatal: Cannot lock the ref 'refs/heads/WORM-s7351771-m1318841909--01 Morituri Te Salutant.flac'.+    Traceback (most recent call last):+      File "/usr/lib/bup/cmd/bup-split", line 170, in <module>+        git.update_ref(refname, commit, oldref)+      File "/usr/lib/bup/bup/git.py", line 835, in update_ref+        _git_wait('git update-ref', p)+      File "/usr/lib/bup/bup/git.py", line 930, in _git_wait+        raise GitError('%s returned %d' % (cmd, rv))+    bup.git.GitError: git update-ref returned 128++for each file, **except for the album cover file**, which is a simple JPG that bup doesn't try to split. This one gets copied nicely but the big FLAC files don't.++I tried to restart my session, in case bup adds my username to a group or something.++(I'm using Ubuntu 11.10)++> Apparently bup-split does not allow storing data using filenames with+> spaces in them. I can reproduce the same bug using the same filename;+> if I remove the spaces all is well.+> +> Since bup-split -n uses git branches, I guess git-annex needs to avoid+> giving it any names containing spaces, or anything else not allowed+> in a git branch name. The rules for legal git branch names are quite complex+> (see git-check-ref-format(1)) so it will take me some times to code+> this up.+> +> A workaround is to switch to the SHA256 backend+> (`git annex migrate --backend=SHA256`), which avoids spaces in its keys.+> --[[Joey]]++>> Now fixed in git. [[done]] --[[Joey]] 
+ doc/bugs/Problems_building_on_Mac_OS_X.mdwn view
@@ -0,0 +1,62 @@+### Please describe the problem.++Installing via Cabal fails due to dependency conflicts with yesod. If I build without the webapp flag, the problem disappears.++### What steps will reproduce the problem?+Running `cabal install c2hs git-annex --bindir=$HOME/bin`.++### What version of git-annex are you using? On what operating system?+I was attempting to install 4.20130521 from Hackage. My operating system is Mac OS X 10.6.8. Cabal-install is at 0.14.0.++### 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/debug.log+Resolving dependencies...+cabal: Could not resolve dependencies:+trying: git-annex-4.20130521 (user goal)+trying: git-annex-4.20130521:+webapp+trying: yesod-default-1.2.0 (dependency of git-annex-4.20130521:+webapp)+trying: yesod-core-1.2.1 (dependency of yesod-default-1.2.0)+trying: cookie-0.4.0.1/installed-9d9... (dependency of yesod-core-1.2.1)+next goal: yesod (dependency of git-annex-4.20130521:+webapp)+rejecting: yesod-1.2.0.1, 1.2.0 (conflict: git-annex-4.20130521:webapp =>+yesod(<1.2))+rejecting: yesod-1.1.9.3, 1.1.9.2, 1.1.9.1, 1.1.9, 1.1.8.2, 1.1.8.1, 1.1.8,+1.1.7.2, 1.1.7.1, 1.1.7, 1.1.6, 1.1.5, 1.1.4.1, 1.1.4 (conflict:+yesod-core==1.2.1, yesod => yesod-core>=1.1.5 && <1.2)+rejecting: yesod-1.1.3.1, 1.1.3, 1.1.2, 1.1.1.2, 1.1.1, 1.1.0.3, 1.1.0.2,+1.1.0.1, 1.1.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=1.1 && <1.2)+rejecting: yesod-1.0.1.6, 1.0.1.5, 1.0.1.4, 1.0.1.3, 1.0.1.2, 1.0.1.1, 1.0.1,+1.0.0.2, 1.0.0.1, 1.0.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=1.0+&& <1.1)+rejecting: yesod-0.10.2, 0.10.1.4, 0.10.1.3, 0.10.1.2, 0.10.1.1, 0.10.1+(conflict: yesod-core==1.2.1, yesod => yesod-core>=0.10.1 && <0.11)+rejecting: yesod-0.9.4.1, 0.9.4, 0.9.3.4, 0.9.3.3, 0.9.3.2 (conflict:+yesod-core==1.2.1, yesod => yesod-core>=0.9.3.4 && <0.10)+rejecting: yesod-0.9.3.1, 0.9.3, 0.9.2.2, 0.9.2.1, 0.9.2, 0.9.1.1 (conflict:+yesod-core==1.2.1, yesod => yesod-core>=0.9.1.1 && <0.10)+rejecting: yesod-0.9.1 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.9+&& <0.10)+rejecting: yesod-0.8.2.1, 0.8.2, 0.8.1 (conflict: yesod-core==1.2.1, yesod =>+yesod-core>=0.8.1 && <0.9)+rejecting: yesod-0.8.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.8+&& <0.9)+rejecting: yesod-0.7.3, 0.7.2 (conflict: yesod-core==1.2.1, yesod =>+yesod-core>=0.7.0.2 && <0.8)+rejecting: yesod-0.7.1 (conflict: yesod-core==1.2.1, yesod =>+yesod-core>=0.7.0.1 && <0.8)+rejecting: yesod-0.7.0 (conflict: yesod-core==1.2.1, yesod => yesod-core>=0.7+&& <0.8)+rejecting: yesod-0.6.7, 0.6.6, 0.6.5, 0.6.4, 0.6.3, 0.6.2, 0.6.1.2, 0.6.1.1,+0.6.1, 0.6.0.2, 0.6.0.1, 0.6.0, 0.5.4.2, 0.5.4.1, 0.5.4, 0.5.3, 0.5.2, 0.5.1,+0.5.0.3, 0.5.0.2, 0.5.0.1, 0.5.0, 0.4.1, 0.4.0.3, 0.4.0.2, 0.4.0.1, 0.4.0+(conflict: cookie => time==1.4/installed-d61..., yesod => time>=1.1.4 && <1.3)+rejecting: yesod-0.3.1.1, 0.3.1, 0.3.0, 0.2.0, 0.0.0.2, 0.0.0.1, 0.0.0+(conflict: cookie => time==1.4/installed-d61..., yesod => time>=1.1.3 && <1.2)+# End of transcript or log.+"""]]++> Not OSX specific. I have added a version hint that makes cabal work and uploaded+> a point release with this fix. [[done]] --[[Joey]]
+ doc/bugs/Problems_running_make_on_osx.mdwn view
@@ -0,0 +1,49 @@+Followed the instructions over here: http://git-annex.branchable.com/forum/git-annex_on_OSX/++and had to install the following extra packages to be able to get make to start:++[realizes pcre-light is needed but pcre not installed on my mac]  +sudo port install pcre  +sudo cabal install pcre-light  ++> Ah right, that is a new dependency. I've updated the forum page+> with this info.+> --[[Joey]] ++But then I got the following error:  ++<pre>+ghc -O2 -Wall --make git-annex  +[ 7 of 52] Compiling BackendTypes     ( BackendTypes.hs, BackendTypes.o   ++BackendTypes.hs:71:17:  +    No instance for (Arbitrary Char)  +      arising from a use of `arbitrary' at BackendTypes.hs:71:17-25  +    Possible fix: add an instance declaration for (Arbitrary Char)  +    In a stmt of a 'do' expression: backendname <- arbitrary  +    In the expression:  +        do backendname <- arbitrary  +           keyname <- arbitrary  +             return $ Key (backendname, keyname)  +    In the definition of `arbitrary':  +        arbitrary = do backendname <- arbitrary  +                       keyname <- arbitrary  +                         return $ Key (backendname, keyname)  +make: *** [git-annex] Error 1  +</pre>++My knowledge of Haskell (had to lookup the spelling...) is more than rudimentary so any help would be appreciated.++> Hmm, it seems you may be missing part of the quickcheck haskell+> library, or have a different version than me.+> +> The easy fix is probably to just edit BackendTypes.hs and delete the+> entire end of the file from line 68, "for quickcheck" down. This code+> is only used by the test suite (so "make test" will fail), +> but it should get it to build. --[[Joey]]++---++Closing this bug because the above problem now has a solution documented on+the install page, and the below test suite failure problems should all be+resolved on OSX. [[done]] --[[Joey]] 
+ doc/bugs/Problems_with_syncing_gnucash.mdwn view
@@ -0,0 +1,568 @@+### Please describe the problem.+I am trying to sync gnucash between my server and my notebook. Both devices are connected via VPN to provide bidirectional SSH connectivity. After adding some data in gnucash the logfiles get synced properly but the changes to the gnucash.gnucash file are not recognized. Touching the file afterwards causes git-annex to immediately transfer the file.++### What steps will reproduce the problem?++Store your gnucash configuration in a git-annex repository. Add some transactions and wait for git-annex to sync your *.gnucash file.++### What version of git-annex are you using? On what operating system?++server and notebook -> Ubuntu 12.04.2 LTS:+[[!format sh """+florz@server:~$ git-annex version+git-annex version: 4.20130601+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS+"""]]++### Please provide any additional information below.++before opening gnucash:+[[!format sh """+florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 113902         Blöcke: 240        EA Block: 4096   Normale Datei+Gerät: 15h/21d  Inode: 2974371     Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:32:37.974073365 +0200+Modifiziert: 2013-06-22 19:32:37.846073367 +0200+Geändert   : 2013-06-22 19:32:37.970073365 +0200+ Geburt    : -++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 113902         Blöcke: 224        EA Block: 4096   Normale Datei+Gerät: fc00h/64512d     Inode: 401737579   Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:40:24.148876398 +0200+Modifiziert: 2013-06-22 19:24:18.000000000 +0200+Geändert   : 2013-06-22 19:24:26.817865369 +0200+ Geburt    : -+"""]]++after doing some changes in gnucash:+[[!format sh """+florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 114039         Blöcke: 240        EA Block: 4096   Normale Datei+Gerät: 15h/21d  Inode: 2974990     Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:52:12.226049268 +0200+Modifiziert: 2013-06-22 19:52:12.342049265 +0200+Geändert   : 2013-06-22 19:52:12.342049265 +0200+ Geburt    : -++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 113902         Blöcke: 224        EA Block: 4096   Normale Datei+Gerät: fc00h/64512d     Inode: 401737579   Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:40:24.148876398 +0200+Modifiziert: 2013-06-22 19:24:18.000000000 +0200+Geändert   : 2013-06-22 19:24:26.817865369 +0200+ Geburt    : -++# after some time -> still no transfer++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 113902         Blöcke: 224        EA Block: 4096   Normale Datei+Gerät: fc00h/64512d     Inode: 401737579   Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:40:24.148876398 +0200+Modifiziert: 2013-06-22 19:24:18.000000000 +0200+Geändert   : 2013-06-22 19:24:26.817865369 +0200+ Geburt    : -+"""]]++doing a touch on the file:+[[!format sh """+florz@notebook:~$ touch annex-sync/gnucash/gnucash.gnucash+florz@notebook:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 114039         Blöcke: 240        EA Block: 4096   Normale Datei+Gerät: 15h/21d  Inode: 2974990     Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:54:27.222046497 +0200+Modifiziert: 2013-06-22 19:54:27.070046501 +0200+Geändert   : 2013-06-22 19:54:27.214046498 +0200+ Geburt    : -++#it syncs immediately++florz@server:~$ stat annex-sync/gnucash/gnucash.gnucash+  Datei: »annex-sync/gnucash/gnucash.gnucash“+  Größe: 114039         Blöcke: 224        EA Block: 4096   Normale Datei+Gerät: fc00h/64512d     Inode: 401737638   Verknüpfungen: 1+Zugriff: (0600/-rw-------)  Uid: ( 1000/   florz)   Gid: ( 1000/   florz)+Zugriff    : 2013-06-22 19:54:35.307056482 +0200+Modifiziert: 2013-06-22 19:54:27.000000000 +0200+Geändert   : 2013-06-22 19:54:34.787072264 +0200+ Geburt    : -+"""]]++on my notebook:+[[!format sh """+Everything up-to-date+Everything up-to-date+Everything up-to-date+[2013-06-22 19:52:12 CEST] Watcher: file deleted gnucash/gnucash.gnucash.tmp-rFzA3U+[2013-06-22 19:52:12 CEST] Committer: committing 1 changes+[2013-06-22 19:52:12 CEST] Committer: Committing changes to git+[2013-06-22 19:52:12 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:52:12 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:12 CEST] Watcher: add direct gnucash/gnucash.gnucash.20130622195200.log+[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:12 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:12 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:12 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:13 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"]+[2013-06-22 19:52:13 CEST] Committer: Adding gnucash.g..95200.log+ok+(Recording state in git...)+(Recording state in git...)++++(Recording state in git...)+add gnucash/gnucash.gnucash.20130622195200.log (checksum...) [2013-06-22 19:52:13 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:52:13 CEST] Committer: committing 1 changes+[2013-06-22 19:52:13 CEST] Committer: Committing changes to git+[2013-06-22 19:52:13 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:13 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:52:13 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing : new file created+[2013-06-22 19:52:13 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing+[2013-06-22 19:52:13 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing : new file created+[2013-06-22 19:52:13 CEST] call: /home/florz/bin/git-annex ["transferkeys","--readfd","29","--writefd","27"]+[2013-06-22 19:52:13 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Nothing+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/books/gnucash.gnucash.gcm+[2013-06-22 19:52:14 CEST] Watcher: file deleted gnucash/gnucash.gnucash.7f0101.29284.LNK+[2013-06-22 19:52:14 CEST] Watcher: file deleted gnucash/gnucash.gnucash.LCK+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/accelerator-map+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/expressions-2.0+[2013-06-22 19:52:14 CEST] Watcher: changed direct .gnucash/stylesheets-2.0+[2013-06-22 19:52:14 CEST] Watcher: add direct gnucash/gnucash.gnucash.20130622195212.log+[2013-06-22 19:52:14 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"]+[2013-06-22 19:52:14 CEST] Committer: Adding 5 files+ok+(Recording state in git...)+add .gnucash/books/gnucash.gnucash.gcm (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add .gnucash/accelerator-map (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add .gnucash/expressions-2.0 (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add .gnucash/stylesheets-2.0 (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+ok+add gnucash/gnucash.gnucash.20130622195212.log (checksum...) [2013-06-22 19:52:15 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:52:15 CEST] Committer: committing 7 changes+[2013-06-22 19:52:15 CEST] Committer: Committing changes to git+[2013-06-22 19:52:15 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+To ssh://florz@192.168.1.3/home/florz/annex-sync/+   7d4c30d..1954c7f  master -> synced/master+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:15 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master+[2013-06-22 19:52:15 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing : new file created+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:15 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing : new file created+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:15 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"]+Already up-to-date.+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:15 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]+To ssh://florz@192.168.2.2/home/florz/annex-sync/+   7d4c30d..e1cb6c3  master -> synced/master+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:16 CEST] Merger: merging refs/remotes/server192.168.2.2/synced/master into refs/heads/master+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:16 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/server192.168.2.2/synced/master"]+Already up-to-date.+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:16 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]++gnucash.gnucash.20130622195200.log++         778 100%    0.00kB/s    0:00:00  +         778 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:52:17 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195200.log Just 778++sent 876 bytes  received 31 bytes  201.56 bytes/sec+total size is 778  speedup is 0.86+[2013-06-22 19:52:17 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "8b8aa5c2cfe4466c6b897f7987246021468033301a696e2db0070386f7d0f3fd.log", keyBackendName = "SHA256E", keySize = Just 778, keyMtime = Nothing}}+[2013-06-22 19:52:17 CEST] Transferrer: Uploaded gnucash.g..95200.log+[2013-06-22 19:52:17 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing+[2013-06-22 19:52:17 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Nothing+[2013-06-22 19:52:18 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:18 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:52:18 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:52:18 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","f2463d30e73fec86e14c9df4bcae5e568398a503","-p","refs/heads/git-annex"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","776258f91d4245ffe13117a771dc8c7723867c1a"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:18 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:18 CEST] Merger: merging refs/heads/synced/master into refs/heads/master+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:18 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"]+Already up-to-date.+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]++gnucash.gnucash.20130622195212.log++         411 100%    0.00kB/s    0:00:00  +         411 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:52:20 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195212.log Just 411++sent 509 bytes  received 31 bytes  154.29 bytes/sec+total size is 411  speedup is 0.76+[2013-06-22 19:52:20 CEST] Transferrer: Uploaded gnucash.g..95212.log+[2013-06-22 19:52:20 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "36e8842e91f7577d12992724c8f52586e9ea7cb0234312dc5544ea4dc6f6c39a.log", keyBackendName = "SHA256E", keySize = Just 411, keyMtime = Nothing}}+[2013-06-22 19:52:20 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing+[2013-06-22 19:52:20 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Nothing+To ssh://florz@192.168.1.3/home/florz/annex-sync/+   e7d4504..776258f  git-annex -> synced/git-annex+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:21 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:21 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"]+Already up-to-date.+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:52:21 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c","e1cb6c3b8bc0c851e6dab51271a4cde04815c50c"]++gnucash.gnucash.20130622195212.log++         411 100%    0.00kB/s    0:00:00  +         411 100%    0.00kB/s    0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:52:21 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash.20130622195212.log Just 411++sent 509 bytes  received 31 bytes  360.00 bytes/sec+total size is 411  speedup is 0.76+[2013-06-22 19:52:22 CEST] Transferrer: Uploaded gnucash.g..95212.log+[2013-06-22 19:52:22 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "36e8842e91f7577d12992724c8f52586e9ea7cb0234312dc5544ea4dc6f6c39a.log", keyBackendName = "SHA256E", keySize = Just 411, keyMtime = Nothing}}+[2013-06-22 19:52:22 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing+[2013-06-22 19:52:22 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash.20130622195200.log Nothing+To ssh://florz@192.168.2.2/home/florz/annex-sync/+   e7d4504..776258f  git-annex -> synced/git-annex+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:22 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-06-22 19:52:22 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "8b8aa5c2cfe4466c6b897f7987246021468033301a696e2db0070386f7d0f3fd.log", keyBackendName = "SHA256E", keySize = Just 778, keyMtime = Nothing}}+git-annex-shell: key is already present in annex+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-06-22 19:52:24 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:52:24 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:52:24 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:52:24 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","1641422d48162f533f80693486d7c5a1208b9fcf","-p","refs/heads/git-annex"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","48cfe2eb07d63d4a59c237994eb07896c92ef1c4"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:52:24 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:24 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..48cfe2eb07d63d4a59c237994eb07896c92ef1c4","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e7d4504abea59b0b59659908ba771783acc6cd55","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:24 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..48cfe2eb07d63d4a59c237994eb07896c92ef1c4","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","df87e3bef80902abc6d48ce0fbfe3432c790cd21"]+[2013-06-22 19:52:25 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","df87e3bef80902abc6d48ce0fbfe3432c790cd21..refs/heads/git-annex","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:52:25 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","5bf44cd143b2c35a44e609e083af23093eb02028","-p","refs/heads/git-annex","-p","df87e3bef80902abc6d48ce0fbfe3432c790cd21"]+[2013-06-22 19:52:25 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","4cd264f192611f5a0d76e54d31329921a650f896"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:25 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+To ssh://florz@192.168.1.3/home/florz/annex-sync/+   df87e3b..4cd264f  git-annex -> synced/git-annex+[2013-06-22 19:52:26 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:26 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..776258f91d4245ffe13117a771dc8c7723867c1a","--oneline","-n1"]+[2013-06-22 19:52:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+To ssh://florz@192.168.2.2/home/florz/annex-sync/+   776258f..4cd264f  git-annex -> synced/git-annex+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:52:28 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:53:18 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-06-22 19:54:27 CEST] Watcher: changed direct gnucash/gnucash.gnucash+[2013-06-22 19:54:27 CEST] read: lsof ["-F0can","+d","/home/florz/annex-sync/.git/annex/tmp/"]+[2013-06-22 19:54:27 CEST] Committer: Adding gnucash.gnucash+ok+(Recording state in git...)+++(Recording state in git...)+++(Recording state in git...)+(merging synced/git-annex into git-annex...)+(Recording state in git...)+add gnucash/gnucash.gnucash (checksum...) [2013-06-22 19:54:27 CEST] read: sha256sum ["/home/florz/annex-sync/.git/annex/tmp/gnucash25536.gnucash"]+[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:54:27 CEST] Committer: committing 1 changes+[2013-06-22 19:54:27 CEST] Committer: Committing changes to git+[2013-06-22 19:54:27 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-06-22 19:54:27 CEST] Committer: queued Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing : new file created+[2013-06-22 19:54:27 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:54:27 CEST] Transferrer: Transferring: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing+[2013-06-22 19:54:27 CEST] Committer: queued Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing : new file created+[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:54:27 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:54:27 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","4c81716cf1a0e0df472ffb43770ac8a27ca45420","-p","refs/heads/git-annex"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","e9e2f951a5c1c645447ccc565bc3def9caeff93c"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:27 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:54:27 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Nothing+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:27 CEST] Merger: merging refs/heads/synced/master into refs/heads/master+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:27 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"]+Already up-to-date.+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:27 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"]++++gnucash.gnucash++       32768  28%    0.00kB/s    0:00:00  [2+      114039 100%   15.50MB/s    0:00:00 (xfer#1, to-check=0/1)+013-06-22 19:54:28 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Just 32768+[2013-06-22 19:54:28 CEST] TransferWatcher: transfer starting: Upload UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512" gnucash/gnucash.gnucash Just 114039+To ssh://florz@192.168.1.3/home/florz/annex-sync/+   4cd264f..e9e2f95  git-annex -> synced/git-annex+   e1cb6c3..e41ffae  master -> synced/master+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..4cd264f192611f5a0d76e54d31329921a650f896","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:33 CEST] Merger: merging refs/remotes/home192.168.1.3/synced/master into refs/heads/master+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:33 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/home192.168.1.3/synced/master"]+Already up-to-date.+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/ann+sent 114130 bytes  received 31 bytes  20756.55 bytes/sec+total size is 114039  espeedup is 1.00+x-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:33 CEST] Transferrer: Uploaded gnucash.gnucash+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "dc591dd7-2446-45c6-84dc-55bdf79e7512", transferKey = Key {keyName = "91ec950e4004863219ea33f1398ea4308e0969267c207272e046858ede8bf9d9", keyBackendName = "SHA256E", keySize = Just 114039, keyMtime = Nothing}}+[2013-06-22 19:54:33 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"]+[2013-06-22 19:54:33 CEST] Transferrer: Transferring: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Nothing++gnucash.gnucash++       32768  28%    0.00kB/s    0:00:00  +      114039 100%   19.38MB/s    0:00:00 (xfer#1, to-check=0/1)+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Just 32768+[2013-06-22 19:54:33 CEST] TransferWatcher: transfer starting: Upload UUID "84bab1ab-238f-4602-953a-a297aab6da44" gnucash/gnucash.gnucash Just 114039+To ssh://florz@192.168.2.2/home/florz/annex-sync/+   4cd264f..e9e2f95  git-annex -> synced/git-annex+   e1cb6c3..e41ffae  master -> synced/master+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:34 CEST] Merger: merging refs/remotes/server192.168.2.2/synced/master into refs/heads/master+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:34 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync/.git/annex/merge/","merge","--no-edit","refs/remotes/server192.168.2.2/synced/master"]+Already up-to-date.+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/master"]+[2013-06-22 19:54:34 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-tree","-z","--raw","--no-renames","-l0","-r","e41ffae310ed2a50058b2f963decde4f9bc10a14","e41ffae310ed2a50058b2f963decde4f9bc10a14"]++sent 114130 bytes  received 31 bytes  45664.40 bytes/sec+total size is 114039  speedup is 1.00+[2013-06-22 19:54:35 CEST] Transferrer: Uploaded gnucash.gnucash+[2013-06-22 19:54:35 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "84bab1ab-238f-4602-953a-a297aab6da44", transferKey = Key {keyName = "91ec950e4004863219ea33f1398ea4308e0969267c207272e046858ede8bf9d9", keyBackendName = "SHA256E", keySize = Just 114039, keyMtime = Nothing}}+[2013-06-22 19:54:36 CEST] Pusher: Syncing with server192.168.2.2, home192.168.1.3 +[2013-06-22 19:54:36 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-w","--stdin-paths"]+[2013-06-22 19:54:36 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:54:36 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","fb43dcef4baa4b928faec6622a4f7889125c6c0a","-p","refs/heads/git-annex"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","b74b3402e31d7394815733811b9668b00cc51aa9"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","symbolic-ref","HEAD"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","refs/heads/master"]+[2013-06-22 19:54:36 CEST] Pusher: pushing to [Remote { name ="server192.168.2.2" },Remote { name ="home192.168.1.3" }]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","server192.168.2.2","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:36 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..b74b3402e31d7394815733811b9668b00cc51aa9","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..df87e3bef80902abc6d48ce0fbfe3432c790cd21","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:36 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--gitTo ssh://florz@192.168.1.3/home/florz/annex-sync/+- ! [rejected]        dgit-annex -> synced/git-annexi (r=/non-fast-forwardh)o+me/florz/aerror: failed to push some refs to 'ssh://florz@192.168.1.3/home/florz/annex-sync/'+nTo prevent you from losing history, non-fast-forward updates were rejected+Merge the remote changes (e.g. 'git pull') before pushing again.  See the+'Note about fast-forwards' section of 'git push --help' for details.+nex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..b74b3402e31d7394815733811b9668b00cc51aa9","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] feed: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-index","-z","--index-info"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","89e2137442dfdb06facbaba3079873d90c7af281"]+[2013-06-22 19:54:39 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","hash-object","-t","blob","-w","--stdin"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","89e2137442dfdb06facbaba3079873d90c7af281..refs/heads/git-annex","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","write-tree"]+[2013-06-22 19:54:39 CEST] chat: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","commit-tree","f175a05b82160942363f46bf1af3e7af1660dfa1","-p","refs/heads/git-annex","-p","89e2137442dfdb06facbaba3079873d90c7af281"]+[2013-06-22 19:54:39 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","update-ref","refs/heads/git-annex","fabac4b203dce9e812b4637f7e95375b15a3f739"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:39 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+To ssh://florz@192.168.2.2/home/florz/annex-sync/+   e9e2f95..fabac4b  git-annex -> synced/git-annex+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:40 CEST] Pusher: trying manual pull to resolve failed pushes+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..e9e2f951a5c1c645447ccc565bc3def9caeff93c","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:40 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","fetch","home192.168.1.3"]+From ssh://192.168.1.3/home/florz/annex-sync+   e9e2f95..89e2137  synced/git-annex -> home192.168.1.3/synced/git-annex+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:42 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--verify","-q","refs/remotes/home192.168.1.3/master"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/master..refs/remotes/home192.168.1.3/master","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--verify","-q","refs/remotes/home192.168.1.3/synced/master"]+[2013-06-22 19:54:43 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/synced/master..refs/remotes/home192.168.1.3/synced/master","--oneline","-n1"]+[2013-06-22 19:54:43 CEST] Pusher: pushing to [Remote { name ="home192.168.1.3" }]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","branch","-f","synced/master"]+[2013-06-22 19:54:43 CEST] call: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","push","home192.168.1.3","git-annex:synced/git-annex","master:synced/master"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..89e2137442dfdb06facbaba3079873d90c7af281","--oneline","-n1"]+[2013-06-22 19:54:45 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+Everything up-to-date+[2013-06-22 19:54:46 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","git-annex"]+[2013-06-22 19:54:46 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","show-ref","--hash","refs/heads/git-annex"]+[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..fabac4b203dce9e812b4637f7e95375b15a3f739","--oneline","-n1"]+[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..69a00fc4a2079b3a87725cc0e3e8b8a1e3a9ae20","--oneline","-n1"]+[2013-06-22 19:54:47 CEST] read: git ["--git-dir=/home/florz/annex-sync/.git","--work-tree=/home/florz/annex-sync","log","refs/heads/git-annex..3c87a082e3b5340597dc59b9d5963b191f24a936","--oneline","-n1"]+"""]]++[[!tag /design/assistant]]+[[!meta title="hard link to open file which is then deleted"]]++> I have fixed this bug. [[done]] --[[Joey]]
+ doc/bugs/Provide_64-bit_standalone_build.mdwn view
@@ -0,0 +1,6 @@+The 32-bit standalone build appears to require two libraries (lib32-libyaml and lib32-gsasl) that are not available on Arch Linux. [See the comments on the AUR package](https://aur.archlinux.org/packages/git-annex-bin/). I'd appreciate it if you could bring back the 64-bit build.++> [[done]], based on <https://aur.archlinux.org/packages/git-annex-bin/>+> they are managing with what I am providing. Also, Arch Linux has a+> proper build of git-annex from source, so I'm not going to worry about+> git-annex-bin, the rationalle for which I don't even understand. --[[Joey]]
+ doc/bugs/Proxy_support.mdwn view
@@ -0,0 +1,18 @@+What steps will reproduce the problem?++Adding a e.g box.com repository from behind a http proxy via webapp.++What is the expected output? What do you see instead?++Connection should be made. But there is an error message:++"Internal Server Error+connect: does not exist (Connection refused): user error"++What version of git-annex are you using? On what operating system?++3.20121127 on Archlinux++Please provide any additional information below.++I don't use networkmanager if proxy information is obtained from it. There should be a fallback to environment variables.
+ doc/bugs/Remote_repo_and_set_operation_with_find.mdwn view
@@ -0,0 +1,6 @@+Currently, git annex find lists files that are present in the current repository, possibly restricted to a subdirectory. But it does not easily seem possible to get this information about a remote repository.++I would find it useful if this command understood flags that makes it tell me what is present somewhere else (maybe "--on remote") and combinations of the flags ("--on remote1 --and --not-on remote2" or "--on disk1 --or --on disk2").++> Almost. You're looking for `--in remote`, which was added 2 months ago.+> [[done]] --[[Joey]] 
+ doc/bugs/Remote_repositories_have_to_be_setup_encrypted.mdwn view
@@ -0,0 +1,27 @@+What steps will reproduce the problem?++Create a new remote repository in the webapp. Get to the final phase of the setup where it asks you if you want to encrypt it, yet no other option is given to continue.++What is the expected output? What do you see instead?++At least two options:++1. Use an encrypted rsync repository on the server (the existing one)+2. Use an unencrypted rsync repository on the server++What version of git-annex are you using? On what operating system?++    $ ./git-annex version+    git-annex version: 3.20130102++    $ uname -a+    Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux++    $ lsb_release -a+    Distributor ID:	Ubuntu+    Description:	Ubuntu 12.04.1 LTS+    Release:	12.04+    Codename:	precise++[[!meta title="webapp does not allow disabling encryption on rsync special remotes"]]+[[!tag /design/assistant]]
+ doc/bugs/Renamed_special_remote_cannot_be_reactivated_by_the_webapp.mdwn view
@@ -0,0 +1,30 @@+Setup:++* fresh install of Debian Wheezy with git-annex 4.20130227 pulled in from unstable+* clone existing repository and activate assistant+* repository has encrypted rsync remote originally setup with the name `metaarray`+* this remote was renamed to `ma` a long time ago, using the webapp+* had to perform this rename on each client++Steps:++* attempt to reactivate special remote using webapp repositories page, on reinstalled machine++Expected:++* special remote starts working+* renaming special remotes ought to survive clones++Actual:++* firstly, special remote activation page has blank hostname box and the hostname of the machine is in the username box+* form gives error "cannot change encryption type of existing remote"++Workaround:++* execute `git annex initremote metaarray`+* rename `metaarray` to `ma` again using the webapp++Perhaps the renaming of the remote not surviving clones is unavoidable, but the webapp should be able to cope with the situation.  Thanks.++[[!tag /design/assistant]]
+ doc/bugs/Repository_deletion_error.mdwn view
@@ -0,0 +1,46 @@+**What steps will reproduce the problem?**++On the dashboard, click settings > Delete on the repo you want to remove.+Wait for the dropping to finish.+Start final deletion when the message "The repository "repo" has been emptied, and can now be removed." pops up.++**What is the expected output? What do you see instead?**++The repository should be deleted, but I only see "Internal Server Error: git [Param "remote",Param "remove",Param "repo"] failed".++**What version of git-annex are you using? On what operating system?**++Standalone build, git-annex version 4.20130417-g4bb97d5++**Please provide any additional information below.**++The log shows:++     [2013-04-22 22:17:22 CEST] TransferScanner: The repository "repo" has been emptied, and can now be removed. +     error: Unknown subcommand: remove+     usage: git remote [-v | --verbose]+       or: git remote add [-t <branch>] [-m <master>] [-f] [--mirror=<fetch|push>] <name> <url>+       or: git remote rename <old> <new>+       or: git remote rm <name>+       or: git remote set-head <name> (-a | -d | <branch>)+       or: git remote [-v | --verbose] show [-n] <name>+       or: git remote prune [-n | --dry-run] <name>+       or: git remote [-v | --verbose] update [-p | --prune] [(<group> | <remote>)...]+       or: git remote set-branches [--add] <name> <branch>...+       or: git remote set-url <name> <newurl> [<oldurl>]+       or: git remote set-url --add <name> <newurl>+       or: git remote set-url --delete <name> <url>++        -v, --verbose         be verbose; must be placed before a subcommand++++> Seems that `git remote remove` is new as of git 1.8.0 or so.+> Older gits only support `git remote rm`. Which newer gits+> support as well. but it seems to be in the process+> of being deprecated so I'd rather not use it.+> +> So, I've made the version of git it's+> built for determine which subcommand it uses. [[done]] --[[Joey]]+> +> (You can run `git remote rm repo` by hand to clean up from this BTW.)
+ doc/bugs/Resource_exhausted.mdwn view
@@ -0,0 +1,45 @@+What steps will reproduce the problem?+My annex dir has 23459 files and uses 749MB disk space.+Just create a repository put this dir inside, and git-annex will crash.++What is the expected output? What do you see instead?+I expect git-annex handles large number of files, and does not watch every single file of it.++What version of git-annex are you using? On what operating system?+I'm using git-annex linux build, version 2013.04.17.++Please provide any additional information below.++    [2013-04-17 23:52:35 CEST] Transferrer: Downloaded pappas_hu..di_44.jpg+    git-annex: runInteractiveProcess: pipe: Too many open files+    Committer crashed: lsof: createProcess: resource exhausted (Too many open files)+    [2013-04-17 23:53:52 CEST] Committer: warning Committer crashed: lsof: createProcess: resource exhausted (Too many open files)+    git-annex: runInteractiveProcess: pipe: Too many open files+    git: createProcess: resource exhausted (Too many open files)+    DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files)+    [2013-04-17 23:57:24 CEST] DaemonStatus: warning DaemonStatus crashed: /home/user/Desktop/down/annex_test/.git/annex/daemon.status.tmp21215: openFile: resource exhausted (Too many open files)+    git-annex: runInteractiveProcess: pipe: Too many open files+    git: createProcess: resource exhausted (Too many open files)+    git-annex: runInteractiveProcess: pipe: Too many open files+    NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files)+    [2013-04-18 00:27:17 CEST] NetWatcherFallback: warning NetWatcherFallback crashed: git: createProcess: resource exhausted (Too many open files)+    git-annex: runInteractiveProcess: pipe: Too many open files+    git-annex: git: createProcess: resource exhausted (Too many open files)+    git-annex: accept: resource exhausted (Too many open files)++Instead of raising system's limit (which is a neverending story), can we make git-annex only watch a directory and not every file of it?++Or could the user specify some directory which he knows it is rarely change, to not be watched only check it once a day?++The best would be if git annex could automatically adapt itself.+Ie. it watches eg. 200 files, and if some of it does not change for three days, then it drops from the watching basket, and those who changed (noticed while sanity checked) it adds to the basket.++I don't really want to raise the ulimit, because my ultimate goal is to have git-annex on multiple raspberry pi with external harddrive (one at my home, one at my mom's home, one at my friends home, etc, etc). And raspberry is fairly low on resource.++I'm interested in your thoughts.++Best, + Laszlo++[[!tag /design/assistant]]+[[!meta title="assistant can try to add too many files at once in batch add mode"]]
+ doc/bugs/Resource_leak_somewhere_in_the___39__get__39___code.mdwn view
@@ -0,0 +1,24 @@+What steps will reproduce the problem?++I have an Annex with about 18k files in it.  If I clone it and then run `git annex get .`, it gets a few thousand files and then starts reporting:++    get 2004-2012/Originals/110414_0362.jpg (from titan...) +    rsync: fork: Resource temporarily unavailable (35)+    rsync error: error in IPC code (code 14) at pipe.c(63) [Receiver=3.0.9]++I have to abort and re-run `git annex get .` several times to finally get all of the files.++What is the expected output? What do you see instead?++I didn't expect what I saw!  I think there's a resource not being released in the `get` code.++What version of git-annex are you using? On what operating system?++master branch, d430fb1.++Please provide any additional information below.++OS X 10.8.2.  The machine has tons of RAM and tons of process handles free.  It's really not doing anything else but this git-annex at the time of my tests.++> [[done]], this is a bug introduced in 3.20121009, and I've reverted the+> buggy change. --[[Joey]]
+ doc/bugs/Rsync_encrypted_remote_asks_for_ssh_key_password_for_each_file.mdwn view
@@ -0,0 +1,30 @@+What steps will reproduce the problem?++Add an encrypted rsync remote by it's 'Host' value in ~/.ssh/config.++eg.:++cat ~/.ssh/config | grep Host++    Host serverNick++git annex initremote rsyncRemote type=rsync rsyncurl=serverNick:/home/USER/Music encryption=USER@gmail.com++git annex copy some\ artist --to serverNick+++What is the expected output? What do you see instead?++I'd expect it to remember the key password like a normal ssh remote.  Instead I get asked for the key password 3 times for each file in the folder.++What version of git-annex are you using? On what operating system?++3.20130216.  Arch x64 (up to date as of 2013-03-07)++Please provide any additional information below.+++[[!meta title="rsync special remote does not use ssh connection caching"]]++> [[done]]; ssh connection caching is now done for these remotes.+> --[[Joey]]
+ doc/bugs/Rsync_remote_created_via_webapp_remains_empty.mdwn view
@@ -0,0 +1,138 @@+### Please describe the problem.+The remote server, connected with rsync and with encryption enabled doesn't fill with files.++### What steps will reproduce the problem?+* Add remote server via webapp+* Supply password when asked+* both buttons turn green ('ready to add remote server')+* Select encrypted rsync repository+* When done, files will be queued for transfer, and the queue empties quickly. Afterwards, no files have actually been transferred, but a green message appears and says something like 'synced with xxx'.+* Also, on the remote an empty directory (~/annex) is created.++### What version of git-annex are you using? On what operating system?+local: kubuntu 12.10,            git-annex 4.20130621-g36258de+remote: debian (linux 3.8.0-25), git-annex 4.20130621-g36258de+Both are installed from tarball and PATH is set at the top of .bashrc.++### Please provide any additional information below.++[[!format sh """++Here is what is put in the logs when the button is toggled from 'syncing disabled' to 'syncing enabled'.+daemon.log:++[2013-07-03 13:43:07 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","true"]+[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"]+[2013-07-03 13:43:07 CEST] read: git ["config","--null","--list"]+[2013-07-03 13:43:07 CEST] main: Syncing with mybox +[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","git-annex"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..4cc51b410f5257f60e4ea187ab0c29783effcc88","--oneline","-n1"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","log","refs/heads/git-annex..6728d4d49ef97365eea0e2d379951acee9a9ded8","--oneline","-n1"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","symbolic-ref","HEAD"]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","show-ref","refs/heads/master"]+[2013-07-03 13:43:07 CEST] TransferScanner: starting scan of [Remote { name ="mybox" }]+[2013-07-03 13:43:07 CEST] read: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","ls-files","--cached","-z","--"]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/TSPC_FF_R.png Nothing+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/uren.xls Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/eldo_ur.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/ A 65J-Conversion-Step 0-to-50MS 0-to-0.7mW 9b Charge-Sharing SAR ADC in 90nm Digital CMOS.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/.directory Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/2009SOVC_A_0.92mW_10-bit_50-MSs_SAR_ADC_in_0.13um_CMOS_Process.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 8-bit 500-KSs Low Power SAR ADC for Biomedical Applications.pdf Nothing : expensive scan found missing object+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "ea86501fb0db033a103ed2c0806a1bddc145224afc4eb5e17fceb70bf1f674da.png", keyBackendName = "SHA256E", keySize = Just 11004, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A 9.2b 47fJ SAR with input range prediction DAC switching.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/Thumbs.db Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "23b9a2be728c8af402ededb3eef7e9238b38d54c0ca50a05cbdf4aeea8f03c76.db", keyBackendName = "SHA256E", keySize = Just 12800, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+:+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/A Low-Power Static Dual Edge-Triggered Flip-Flop.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Aanmeldingsformulier Masterexamen.odt Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "f27ac57481c9eb0bf7bf1f6c99666aca5c8282137effa33791241b3d36b12de2.odt", keyBackendName = "SHA256E", keySize = Just 22041, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/An Energy-Efficient Charge Recycling Approach for a SAR Converter With Capacitive DAC.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Intake_form_MSc_Electrical_Engineering_def dec 2011-1.pdf Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "a261cb3835ed869c6ad2347d303ed10e94efa8a50cc9ff053d772c2158097244.pdf", keyBackendName = "SHA256E", keySize = Just 667666, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:07 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/Calibration Technique for SAR Analog-to-Digital Converters.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:07 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing+[2013-07-03 13:43:07 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.doc Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cb69f2f4ae313277acd163b9bba19392ce50d3c5205ba8bbd90bf9c453088176.doc", keyBackendName = "SHA256E", keySize = Just 34304, keyMtime = Nothing}}+[2013-07-03 13:43:08 CEST] call: git ["--git-dir=/home/boris/annex/.git","--work-tree=/home/boris/annex","config","remote.mybox.annex-sync","false"]+[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"]+[2013-07-03 13:43:08 CEST] read: git ["config","--null","--list"]+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] TransferScanner: queued Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing : expensive scan found missing object+[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/administratie/Opdrachtomschrijving Master.pdf Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer finishing: Transfer {transferDirection = Upload, transferUUID = UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23", transferKey = Key {keyName = "cea054d80cb5ca572b7055c0132ec2d13125534566ed4a79ab2514c9a60d8ee4.pdf", keyBackendName = "SHA256E", keySize = Just 19802, keyMtime = Nothing}}+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]+[2013-07-03 13:43:08 CEST] Transferrer: Transferring: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing+[2013-07-03 13:43:08 CEST] TransferWatcher: transfer starting: Upload UUID "32841e5f-1e4d-4c72-84c4-bbb54a335a23" afstuderen/literatuur/D15_01.pdf Nothing+fatal: unrecognized command 'rsync --server -vre.iLsf --partial-dir .rsync-partial . annex/'+git-annex-shell: git-shell failed+rsync: connection unexpectedly closed (0 bytes received so far) [sender]+rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]++++# End of transcript or log.+"""]]++> [[fixed|done]], corrected logic error that caused `authorized_keys`+> to incorrectly force the git-annex-shell command for rsync remotes. --[[Joey]]
+ doc/bugs/S3_bucket_uses_the_same_key_for_encryption_and_hashing.mdwn view
@@ -0,0 +1,10 @@+While using HMAC instead of "plain" hash functions is inherently more secure, it's still a bad idea to re-use keys for different purposes.++Also, ttbomk, HMAC needs two keys, not one. Are you re-using the same key twice?++Compability for old buckets and support for different ones can be maintained by introducing a new option and simply copying over the encryption key's identifier into this new option should it be missing.++> Bug was filed prematurely, but was a good bit of paranoia, and gpg and+> hmac are given different secret keys [[done]] --[[Joey]] ++>> Thanks :) -- RIchiH
+ doc/bugs/S3_buckets_with_capital_letters_breaks_authentication.mdwn view
@@ -0,0 +1,32 @@+### Please describe the problem.++As described in [[tips/Internet_Archive_via_S3]], there is a problem using S3 with buckets that have capital letters. The bug lies either in the hS3 library or in archive.org itself.++### What steps will reproduce the problem?++Try to add an [[special_remotes/S3]] remote with capital letters in the bucket name.++### What version of git-annex are you using? On what operating system?++[[!format txt """+git-annex version: 4.20130921-g434dc22+build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP DNS Feeds Quvi+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]++### 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+anarcat@angela:video$ git annex initremote archive-moglenrepublica type=S3 host=s3.us.archive.org bucket=Republica2012-EbenMoglen-FreedomOfThoughtRequiresFreeMedia+initremote archive-moglenrepublica (Internet Archive mode) git-annex: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details.+# End of transcript or log.+"""]]++Just thought it would be better to have a separate thread for this bug. :)++> [[fixed|done]] --[[Joey]]
+ doc/bugs/S3_memory_leaks.mdwn view
@@ -0,0 +1,14 @@+S3 has memory leaks++Sending a file to S3 causes a slow memory increase toward the file size.++Copying the file back from S3 causes a slow memory increase toward the+file size.++The author of hS3 is aware of the problem, and working on it. I think I+have identified the root cause of the buffering; it's done by hS3 so it can+resend the data if S3 sends it a 307 redirect. --[[Joey]]++At least the send leak should be fixed by the patch in the s3-memory-leak+branch in git. That needs a patch to hS3, which I have sent to its author.+--[[Joey]] 
+ doc/bugs/S3_memory_leaks/comment_1_a7268213b090bce6b1f1858a8e23d90e._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://schnouki.net/"+ nickname="Schnouki"+ subject="comment 1"+ date="2013-10-18T08:36:45Z"+ content="""+Hi Joey,++It looks like your patch hasn't been merged yet. And this bug is quite annoying for me (can't backup files bigger than 1.5 GB from my NAS).++Would it be possible to include this fix in your standalone builds and Debian packages?++Thanks!+"""]]
+ doc/bugs/S3_upload_not_using_multipart.mdwn view
@@ -0,0 +1,53 @@+What steps will reproduce the problem?++> Try to copy/move a file greater than 5G to S3.++    git annex copy large_file.tgz --to cloud++What is the expected output? What do you see instead?++> Looks like git-annex may not be using the Multipart Upload API: http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html++> Expected transfer to succeed, instead this error is output:++    copy large-file.tgz (gpg) (checking cloud...) (to cloud...) Reading passphrase from file descriptor 12    +++     Your proposed upload exceeds the maximum allowed size+     failed+     git-annex: copy: 1 failed++What version of git-annex are you using? On what operating system?++> OSX 10.8.2++Please provide any additional information below.++    annex [master●] % git annex status+	supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+	supported remote types: git S3 bup directory rsync web webdav glacier hook+	repository mode: indirect+	trusted repositories: 0+	semitrusted repositories: 3+		00000000-0000-0000-0000-000000000001 -- web+	 	BE1D8EC7-C64B-47DE-AD4E-2A50437532B4 -- cloud+	 	E84568BA-6A4B-4AA1-B622-605B9248EDB1 -- here (eric laptop)+	untrusted repositories: 0+	dead repositories: 0+	transfers in progress: none+	available local disk space: 169 gigabytes (+1 megabyte reserved)+	temporary directory size: 218 megabytes (clean up with git-annex unused)+	local annex keys: 24+	local annex size: 8 gigabytes+	known annex keys: 25+	known annex size: 8 gigabytes+	bloom filter size: 16 mebibytes (0% full)+	backend usage: +		SHA256E: 49+	annex [master●] % git annex version+	git-annex version: 3.20130114+	local repository version: 3+	default repository version: 3+	supported repository versions: 3+	upgrade supported from repository versions: 0 1 2+
+ doc/bugs/Segfaults_on_Fedora_18_with_SELinux_enabled.mdwn view
@@ -0,0 +1,65 @@+git-annex version: 4.20130323++Running the webapp with SELinux enabled:++    [0 zerodogg@browncoats annexed]$ git annex webapp --debug+    Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+    /home/zerodogg/bin/git-annex: line 25:  5801 Segmentation fault      (core dumped) "$base/runshell" git-annex "$@"++After disabling SELinux it works just fine. This is on a freshly installed (default settings) Fedora 18 on x86-64.++Running the assistant also works, but segfaults when attempting to open the webapp:++    [0 zerodogg@browncoats annexed]$ git annex assistant &+    [1] 6241+    [0 zerodogg@browncoats annexed]$ +    [0 zerodogg@browncoats annexed]$ git annex webapp --debug+    Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+    /home/zerodogg/bin/git-annex: line 25:  6322 Segmentation fault      (core dumped) "$base/runshell" git-annex "$@"+    [139 zerodogg@browncoats annexed]$ Created new window in existing browser session.++Here's what `dmesg` says:++    [   71.488843] SELinux: initialized (dev proc, type proc), uses genfs_contexts+    [  115.443932] git-annex[3985]: segfault at e6e62984 ip 0000000009b8085a sp 00000000f4bfd028 error 4 in git-annex[8048000+1c75000]+    [  125.148819] SELinux: initialized (dev proc, type proc), uses genfs_contexts+    [  125.230155] git-annex[4043]: segfault at e6eda984 ip 0000000009b8085a sp 00000000f63fd028 error 4 in git-annex[8048000+1c75000]+    [  406.855659] SELinux: initialized (dev proc, type proc), uses genfs_contexts+    [  407.033966] git-annex[5806]: segfault at e6faa984 ip 0000000009b8085a sp 00000000f6dfd028 error 4 in git-annex[8048000+1c75000]+    [  462.368045] git-annex[6279]: segfault at e6f76984 ip 0000000009b8085a sp 00000000f49fd028 error 4 in git-annex[8048000+1c75000]+    [  465.714636] SELinux: initialized (dev proc, type proc), uses genfs_contexts+    [  465.930434] git-annex[6329]: segfault at e6e7a984 ip 0000000009b8085a sp 00000000f63fd028 error 4 in git-annex[8048000+1c75000]+    [  560.570480] git-annex[7050]: segfault at e7022984 ip 0000000009b8085a sp 00000000f54fd028 error 4 in git-annex[8048000+1c75000]+    [  565.510664] SELinux: initialized (dev proc, type proc), uses genfs_contexts+    [  565.688681] git-annex[7108]: segfault at e7196984 ip 0000000009b8085a sp 00000000f54fd028 error 4 in git-annex[8048000+1c75000]++Running the whole thing with --debug doesn't appear to provide anything useful:++    [0 zerodogg@browncoats annexed]$ git annex assistant --debug &+    [1] 7018+    [0 zerodogg@browncoats annexed]$ [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","show-ref","git-annex"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","show-ref","--hash","refs/heads/git-annex"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..f2260840bd9563f3d9face53dddd6807813860cd","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..798526ef1315811296b1ac95d4cf97c72141ad29","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..0d827b1ef545a88e94ee8cc973e54a1b74d216f4","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..1d8f91411b827c4d59735dbc572e7f278e870e43","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..cc442416b325866139db6dbe374bddacda6fef91","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..3c2f44ffd82df1a0ae8858bdf2610e933b105a09","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..fb8819ca92d9a2ed39e6d329160b5f8da60df83f","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..68d0f936ee044b0ca34cf4029bcd6274fed88499","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] read: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","log","refs/heads/git-annex..3ba3dfef6340196126f4fc630b5048188230d1ff","--oneline","-n1"]+    [2013-03-24 16:27:02 CET] chat: git ["--git-dir=/home/zerodogg/Documents/annexed/.git","--work-tree=/home/zerodogg/Documents/annexed","cat-file","--batch"]+    +    [1]  + done       GITWRAP annex assistant --debug+    [0 zerodogg@browncoats annexed]$ git annex webapp --debug &+    [1] 7082+    [0 zerodogg@browncoats annexed]$ Launching web browser on file:///home/zerodogg/Documents/annexed/.git/annex/webapp.html+    /home/zerodogg/bin/git-annex: line 25:  7088 Segmentation fault      (core dumped) "$base/runshell" git-annex "$@"+    +    [1]  + exit 139   GITWRAP annex webapp --debug+    [0 zerodogg@browncoats annexed]$ Created new window in existing browser session.++> On IRC it developed that it segfaulted at other times, and gdb complained+> of a library mismatch. Seems something changed in Fedora libc, and +> the 32 bit binary is not working on 64 bit. I've brought back the 64 bit+> standalone builds, which work. [[done]] --[[Joey]]
+ doc/bugs/Selfsigned_certificates_with_jabber_fail_miserably..mdwn view
@@ -0,0 +1,22 @@+### Please describe the problem.+Entering a jabber address which's server got a selfsigned certificate, the process just fails, without asking for acceptance for that certificate. This is quite a showstopper.+(for example: jabber.ccc.de)+++### What steps will reproduce the problem?+Try with an account from e.g. jabber.ccc.de+++### What version of git-annex are you using? On what operating system?+Arch Linux, aur/git-annex-standalone 4.20130709-1 ++### Please provide any additional information below.+There is no logoutput to add... I'm sorry.++[[!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.+"""]]
+ doc/bugs/Should_ignore_.thumbnails__47___on_android.mdwn view
@@ -0,0 +1,28 @@+### Please describe the problem.++When creating a Camera repository on android, the .thumbnails/ directory (containing useless crushed JPGs and even more useless oodles of thumbnail metadata databases) is annexed. This leads to confusion (assistant tries to annex database and thumbnails in modification) and waste (uploading/annexing unusable/unneeded metadata).++### What steps will reproduce the problem?++Install git-annex on Android and choose the defaults for a camera repository.+++### What version of git-annex are you using? On what operating system?++4.20130601, Android 4.2.2+++### 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.+"""]]++> I've [[done]] this, however the .gitignore file it writes will+> not actually be used by the assistant until it gets support+> for querying gitignore settings from git. There is already a+> bug tracking that, and it's in process. --[[Joey]] 
+ doc/bugs/Should_try_again_when_network_fails___40__esp._DNS__41__.mdwn view
@@ -0,0 +1,50 @@+### Please describe the problem.++If you have a flaky connection big uploads and downloads will fail. git-annex should try again few times.++This is an example of failed download.++[[!format sh """+$ git annex get --not --in here+get File1.bin (from s3...) (gpg) +You need a passphrase to unlock the secret key for+user: "Gioele"+4096-bit RSA key, ....++gpg: gpg-agent is not available in this session++  ErrorMisc "<socket: 14>: hGetBuf: resource vanished (Connection reset by peer)"+                        +  Unable to access these remotes: s3++  Try making some of these repositories available:+        331fa184-799d-4511-1725-ef2a17ace8b4 -- s3+        c2a0cfa0-8871-9721-9b81-5649281fabdc -- other+failed+get File2.bin (from s3...) ++  Unable to access these remotes: s3++  Try making some of these repositories available:+        331fa184-799d-4511-1725-ef2a17ace8b4 -- s3+        c2a0cfa0-8871-9721-9b81-5649281fabdc -- other+failed+git-annex: get: 2 failed+"""]]++This is especially annoying when the DNS is out of order for a few seconds every now and then. In such cases, git-annex will complain, skip very fast to the next file, and repeat this process until it runs out of files. In the end it will have uploaded or downloaded very few files.++Please not that it may not possible to write a simple shell loop to try again as the are GPG passwords to be entered.++Git-annex should try again to upload or download a file in case something goes wrong.++### What version of git-annex are you using? On what operating system?++    git-annex version: 4.20130709.1+    build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP+    local repository version: unknown+    default repository version: 3+    supported repository versions: 3 4+    upgrade supported from repository versions: 0 1 2++Ubuntu 12.04.2 LTS
+ doc/bugs/Small_archive_behaving_like_archive.mdwn view
@@ -0,0 +1,33 @@+### Please describe the problem.++repos of group smallarchive have started trying to accumulate all files.++I have an archive repo (rsync) and a smallarchive repo (glacier). The assistant is now trying to transfer everything up to glacier. This is new behavior as of this version of annex.++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?++Mac OSX 10.8.3 (Build 12D78)++    git-annex version: 4.20130501-ged2fc6f+    +    local repository version: 4+    default repository version: 3+    supported repository versions: 3 4+    upgrade supported from repository versions: 0 1 2+    build flags: Assistant Webapp Pairing Testsuite S3 WebDAV FsEvents XMPP DNS+++### 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/debug.log+++# End of transcript or log.+"""]]++[[!tag moreinfo]]
+ doc/bugs/Stale_lock_files_on_Android.mdwn view
@@ -0,0 +1,44 @@+### Please describe the problem.++Both my Android devices where not processing git-annex updates due to stale lock files. While the lock files are different, I've reported them both together as they are related. ++### What steps will reproduce the problem?++Unknown, perhaps the assistant crashed, or the battery ran flat on them.++To resolve the issue I had to manually remove the lock files.++### What version of git-annex are you using? On what operating system?++On my Android phone, daily build 4.20130614-g221aea4+On my Android tablet, daily build 4.20130621-g36258de++### Please provide any additional information below.++It seems to me that it'd be useful to have the assistant check to see if the lock files are still valid and remove them if they're stale.++[[!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++My phone:++From ssh://git-annex-flick-andrewannex_phonecamera/~/phone-camera+   987dc25..682cdd1  git-annex  -> flick_phonecamera/git-annex+fatal: Unable to create '/storage/emulated/legacy/DCIM/.git/refs/remotes/flick_phonecamera/synced/git-annex.lock': File exists.++My tablet:++Committer: Adding Coleman-C..eedom.pdf+Committer: Committing changes to git+fatal: Unable to create '/mnt/sdcard/reference/.git/index.lock': File exists.++# End of transcript or log.+"""]]++> The '/mnt/sdcard/reference/.git/index.lock' lock file will now be+> automatically dealt with. Have not done anything about the refs/remotes+> lock files yet. --[[Joey]]+> +> Now the assistant deals with all stale git lock files on startup. +> [[done]] --[[Joey]]
+ doc/bugs/Stress_test.mdwn view
@@ -0,0 +1,45 @@+What steps will reproduce the problem?++mkdir annex_stress; cd annex_stress, +then execute the following script:++    #! /bin/sh+    +    # creating a directory, in which we dump all the files.+    mkdir probes; cd probes+    +    for i in `seq -w 1 25769`; do+        mkdir probe$i+        echo "This is an important file, which saved also in backup ('back') directory too.\n Content changes: $i" > probe$i/probe$i.txt+        echo "This is just an identical content file. Saved in each subdir." > probe$i/defaults.txt+        echo "This is a variable ($i) content file, which is not backed up in 'back' directory." > probe$i/probe-nb$i.txt+        mkdir probe$i/back+        cp probe$i/probe$i.txt probe$i/back/probe$i.txt+    done+++It creates about 25000 directory and 3 files in each, two of them are identical.++What is the expected output? What do you see instead?++I expect git annex could import the directory within 12 hours. +Yet, it just crashes the gui (starting webapp, uses the cpu 100% and it does not finish after 28hours.)+++What version of git-annex are you using? On what operating system?++version 2013.04.17++Please provide any additional information below.++I do hope git-annex can be fixed to handle large number of files.+This stress test models well enough my own directory structure, +relatively high number of files relatively low disk space usage +(my own directory structure: 750MB, this test creates 605MB).+++Best, + Laszlo++[[!meta title="assistant Stress test"]]+[[!tag /design/assistant]]
+ doc/bugs/Stress_test/comment_10_1694e990eab6592159309c231c6dcc16._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 10"+ date="2013-05-06T16:54:36Z"+ content="""+My estimate was indeed slightly optimistic. While I did not run the whole import, it did run slower for the later batches of files. As far as I can see, that slowdown is just because git gets slower as it has more files. So nothing I can do about it. git-annex is now scaling well itself, though.++Re checksumming on startup: There was a bug that caused the assistant to re-checksum all direct mode files on startup. This bug was fixed in version 4.20130417. If you're using that version and still see it re-checksumming files, please file a new bug report about it, as this is not intended behavior.++You seem to be saying that the assistant is failing to add some files, and then when stopped and restarted it finds and adds them. I don't quite know how that would happen. If you can provide a test case that I can use to reproduce that behavior, I will try to debug it.+"""]]
+ doc/bugs/Stress_test/comment_11_ab4cb6eefd279e6c1f229e089f703581._comment view
@@ -0,0 +1,25 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="comment 11"+ date="2013-05-11T05:36:48Z"+ content="""+rechecksuming: it seem like it is indeed fixed in the newest (2013.05.01) version downloaded from here:+http://downloads.kitenet.net/git-annex/linux/++I tried to add the big stress test dir as a secondary repository into git-annex (along with my real data dir), but +seems like some library is not matching on my system, so some curl is complaining:++    curl: /lib/tls/i686/cmov/libc.so.6: version `GLIBC_2.12' not found (required by /home/user/Desktop/down/git-annex.linux//usr/lib/i386-linux-gnu/libldap_r-2.4.so.2)++I'm on ubuntu 10.04.++And the log file is starting to fill up, so maybe once a problem occur, it should only write into the log file once.++I will redone this stress test next week, without combining with any repository.+Thank you very much for your response, I do appreciate you are bothering/dealing with my complains!:)++Best, + Laszlo++"""]]
+ doc/bugs/Stress_test/comment_1_c4c764488ac082f5c48d3a6b4b5fba42._comment view
@@ -0,0 +1,17 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 1"+ date="2013-04-23T20:00:31Z"+ content="""+Is this related or unrelated to the bug you filed at [[Resource_exhausted]]?++I tried this test, and noticed that it was taking the assistant rather a long time to get to the 10 thousand file threshhold where it makes a batch commit. A small change to a better data structure for its queue reduced that time from probably 10 minutes to 2.5. ++I was unable to reproduce any problem with the webapp. Please provide lots of details to back up \"it just crashes the GUI\".++The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration. +So after it adds the first 8192 directories, it begins failing to watch any more, and printing a message about you needing to increase the inotify limits for each additional directory. I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex. (It will also break file manager, dropbox, etc, which all use inotify in the same way.)++The other main time sink is that git-annex needs to run `git hash-object` once per file to stage its symlink. That is a lot of processes to run, and perhaps it could be sped up by using `git fast-import`.+"""]]
+ doc/bugs/Stress_test/comment_2_42125bba09a0ea9821cda7183e458100._comment view
@@ -0,0 +1,47 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="comment 2"+ date="2013-04-24T06:30:16Z"+ content="""+Hi,++First of all thank you for your time looking into my bug. I try to research more from my side.++The 'Resource exhausted' bugreport +(which lost its title, and could not click on it to add this testcase as a comment)+was tested on real data, my own working directory (a copy of it).+This bugreport is tested on the output of this small shell script.++None of them succeeded to import, and I quickly assumed it is the exact same.++So I will test again, raising the ulimit to 81920, and report.++    The main problem with this directory tree is that it has more directories than inotify can watch, in the default configuration++I would be perfectly fine if I could configure git-annex to sync those directory only once a month or once a week+(ie. check for update once a week). So no need to watch it real time, those are my archived work files.++    I don't think that 51 thousand directories is a particularly realistic amount for any real-world usage of git-annex.++Well, it is not 25000 dir in a single a folder, but rather something like this:++    work_done/2009/workname/back9/back8/back7/back6/back5++Where each 'backX' contains a whole backup the work until it. +So the directory structure is a bit more deep, and no 25000 subdirectory in a single dir. +But the overall numbers are right.++If I could somehow mark this **work_done** dir to not sync real time (or work_done/2008,work_done/2009,work_done/2010,work_done/2011,work_done/2012 subdir in them), +then my whole issue would vanish.++I only want to use git-annex to have a backup of this directory. +In case of laptop theft, or misfunction I could have a backup. +I dont need live sync anywhere, I have directories which I know I will not touch for months.++Best,+ Laszlo++++"""]]
+ doc/bugs/Stress_test/comment_3_8240e61106b494d3600ad91f16eb5b1c._comment view
@@ -0,0 +1,20 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="comment 3"+ date="2013-04-24T09:10:20Z"+ content="""+    (It will also break file manager, dropbox, etc, which all use inotify in the same way.)++I beg to differ: with dropbox I handle my scrapbook(1) folder, +which means 130 thousand files for over 2 years now without problem between three computers.++    ~/Dropbox/scrapbook$ ls -R -1 |wc -l+    130263++Don't get me wrong. I'm not complaining, I only give you a completely unrelated usecase, +which requires also high number of files handling. And in that case the 81 thousand ulimit would not help either.++(1): https://addons.mozilla.org/hu/firefox/addon/scrapbook/++"""]]
+ doc/bugs/Stress_test/comment_4_c38d84e0dcc834931804c44bce7f7b7a._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 4"+ date="2013-04-24T15:05:33Z"+ content="""+You're confusing number of files (inotify doesn't care) with number of directories (inotify does care).++Dropbox is on record about being limited in the number of directories it can watch without adjusting the inotify limit. +<https://www.dropbox.com/help/145>+"""]]
+ doc/bugs/Stress_test/comment_5_60ce20ee255451c4ea809ba475561adb._comment view
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 5"+ date="2013-04-24T15:30:04Z"+ content="""+I found a bug in the webapp thanks to this stress test. When inotify goes over limit, it displays a message about how to fix it..+But it displays that message over and over for each file. The result is a constantly updating very large web page. ++Unless you tell me differently, I'm going to assume that's what the GUI crash you referred to was, since it can make a web browser very slow.++I've fixed this problem. Now when it goes over limit, the webapp will just display this:++[[/assistant/inotify_max_limit_alert.png]]+"""]]
+ doc/bugs/Stress_test/comment_6_1371562e201393986cd41597f6f288cb._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 6"+ date="2013-04-24T17:26:39Z"+ content="""+I put in a further change to reduce the number of alerts shown in the webapp when bulk adding files. This probably quadrupled the speed or more, even when the webapp was not running, as updating an alert every time a file was added was a lot of unnecessary work.++After these changes, it adds the first 10 thousand files in 35 minutes, on my five year old netbook. It should scale linear+(aside from git's own scalability issues with a lot of files, which I don't think are very bad under 1 million files),+so adding all 100 thousand files should take 6 hours or so.++I'm interested to see what results you get, compared with before..+"""]]
+ doc/bugs/Stress_test/comment_7_a14be7699da224a8f6c9b34f1b911219._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ nickname="joey"+ subject="comment 7"+ date="2013-04-24T21:02:55Z"+ content="""+A few more changes got the rate down to 21 minutes per 10 thousand files. Estimate 3.5 hours for all.+"""]]
+ doc/bugs/Stress_test/comment_8_a01995bdca7ade7dde9842b53fbc4e0c._comment view
@@ -0,0 +1,57 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="Definite improvement"+ date="2013-05-03T06:27:12Z"+ content="""+Hi,++I have just tried it out again with the latest (20130501) version.++It is really nice to see you have been working on it, and it have improved tremendously!+The logging issue solved, and logrotates even, and it finished importing without crashing!++Remaining polishing things:++a)+The import time is not as good (as you write), it slowes itself down.+It is true the first 10000 files import in about an hour, but it finishes with everything+in 9 hours 20 minutes.+(on a normal laptop, the last 5000 file portion took more then 2 hours)++b) +Every startup means rechecksuming everything, so it means the second start took also around 8-12 hours.+(I don't know exactly because it finished somewhere during the night, but it was longer then 8 hours)+I don't think rechecksuming is necessary at all, if the filename, size and date have not modified, +then why rechecksuming (sha) it?+++c) +It is leaking. +At the second startup, it reported it successfully added:+    Added 2375 files 5 files probe25366.txt++I have not touched the directory. ls confirms leaking:++    After first start (importing):+    annex_many/.git$ ls -lR |wc -l+    770199++    After second startup:+    annex_many/.git$ ls -lR |wc -l+    788351++d) Without ulimit raise, it does not work at all.+I think it could be solved by not watching each and every directory all the time.+Every users will likely have a working directory and some which he don't intend to touch/modify at all.+Some usecases: photo archiving, video archiving, finished work archiving, etc++All the above results with the stress test script. +I would love to have a confirmation by a thirdparty.++Overall I'm impressed with the work you have done.++Best, + Laszlo++"""]]
+ doc/bugs/Stress_test/comment_9_9f7efe81b7e40aaa04a865394c53e20f._comment view
@@ -0,0 +1,52 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm5iosFbL2By7UFeViqkc6v-hoAtqILeDA"+ nickname="Laszlo"+ subject="Maybe it is not leaking after all"+ date="2013-05-03T18:37:48Z"+ content="""+I have been working the whole day zipping up (tar.gz) all the unused directories.+Now my real data dir looks like this:++    ./annex_real/work_done$ du -hs .+    1,1G	.+    Has 9088 files and 1608 directories in total:+    ./annex_real/work_done$ ls -R1l |grep \\-r |wc -l+    9088+    ./annex_real/work_done$ ls -R1l |grep ^d |wc -l+    1608++When I first started git annex, it added 5492 files, then next time it added the missing 3596 files. Then it stopped adding files.+From the gui everything looked fine even at the first start (performed startup scan), even in the log files (daemon.log.x) was nothing suspicious.++    ./annex_real/work_done$ for i in ../.git/annex/daemon.log.*; do echo $i; cat $i |grep files; done+     ../.git/annex/daemon.log.1+     ../.git/annex/daemon.log.2+     ../.git/annex/daemon.log.3+     ../.git/annex/daemon.log.4+     [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files+     ../.git/annex/daemon.log.5+     [2013-05-03 19:15:22 CEST] Committer: Adding 5492 files++As you can see, this case is not a stress test at all, +it is really the minimal test case, 1.1GB diskspace, 9088 files and a thousand dirs. +The real question is, why git-annex miss at the first startup 3492 files (ie. adding all the files).++It would help tremendously, if it would display at startup how many files he found, +and when it adds, then how many left to be added.+Something like this:++    (scanning...) [2013-05-03 20:03:14 CEST] Watcher: Performing startup scan+    (started...)+    [2013-05-03 20:03:34 CEST] Committer: Found 9088 files+    [2013-05-03 20:03:34 CEST] Committer: Adding 3596 files of 9088 remaining files (9088 in total)+    ....+    [2013-05-03 20:05:04 CEST] Committer: Adding 1492 files of 5492 remaining files (9088 in total)+    ....+    [2013-05-03 20:06:02 CEST] Committer: Adding 4000 files of 4000 remaining files (9088 in total)++So it is definietly a bug, and I stuck how to debug it further. Everything looks just fine.++Best, + Laszlo++"""]]
+ doc/bugs/Switching_from_indirect_mode_to_direct_mode_breaks_duplicates.mdwn view
@@ -0,0 +1,30 @@+#What steps will reproduce the problem?++1. Create a new repository in indirect mode.++2. Add the same file twice under a different name. Now you have two symlinks pointing to the same file under .git/annex/objects/++3. Switch to direct mode. The first symlink gets replaced by the actual file. The second stays unchanged, pointing to nowhere. But git annex whereis still reports it has a copy.++4. Delete the first file. Git annex whereis still thinks it has a copy of file 2, which is not true -> data loss.++#What is the expected output? What do you see instead?++When switching to direct mode, both symlinks should be replaced by a copy (or at least a hardlink) of the actual file.++> The typo that caused this bug is fixed. --[[Joey]] ++#What version of git-annex are you using? On what operating system?++3.20130107 on Arch Linux x64++#Please provide any additional information below.++The deduplication performed by git-annex is very dangerous in itself+because files with identical content become replaced by references to the+same file without the user necessarily being aware. Think of the user+making a copy of a file, than modifying it. He would expect to end up with+two files, the unchanged original and the modified copy. But what he really+gets is two symlinks pointing to the same modified file.++> I agree, it now copies rather than hard linking.  [[done]] --[[Joey]] 
@@ -0,0 +1,51 @@+What steps will reproduce the problem?++Create two repositories by running git annex webapp. Sync them by linking them to the same xmpp account. Add files on both sides.++What is the expected output? What do you see instead?++I expect the same file to show up on both sides with the same contents. Instead adding a file on any side creates a broken link with the same name on the other side. For example:++Side A:++    $ ls -la+    total 20+    drwxrwxr-x  3 pedrocr pedrocr 4096 Jan  3 19:24 .+    drwxr-xr-x 55 pedrocr pedrocr 4096 Jan  3 19:19 ..+    lrwxrwxrwx  1 pedrocr pedrocr  178 Jan  3 19:22 bar -> .git/annex/objects/FQ/vV/SHA256E-s8--12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2/SHA256E-s8--12a61f4e173fb3a11c05d6471f74728f76231b4a5fcd9667cef3af87a3ae4dc2+    lrwxrwxrwx  1 pedrocr pedrocr  178 Jan  3 19:20 foo -> .git/annex/objects/g7/9v/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730/SHA256E-s4--7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730+    drwxrwxr-x  7 pedrocr pedrocr 4096 Jan  3 19:24 .git+    -rw-r--r--  1 pedrocr pedrocr    0 Jan  3 19:24 testing++"foo" and "bar" are broken links that were created on Side B++Side B:++    $ ls -la+    total 24+    drwxrwxr-x  3 pedrocr pedrocr 4096 Jan  3 19:24 .+    drwx------ 42 pedrocr pedrocr 4096 Jan  3 19:18 ..+    -rw-r--r--  1 pedrocr pedrocr    8 Jan  3 19:22 bar+    -rw-r--r--  1 pedrocr pedrocr    4 Jan  3 19:20 foo+    drwxrwxr-x  7 pedrocr pedrocr 4096 Jan  3 19:24 .git+    lrwxrwxrwx  1 pedrocr pedrocr  178 Jan  3 19:24 testing -> .git/annex/objects/pX/ZJ/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855/SHA256E-s0--e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855++In this case "testing" is a broken link and was created on Side A.++What version of git-annex are you using? On what operating system?++    $ ./git-annex version+    git-annex version: 3.20130102++    $ uname -a+    Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux++    $ lsb_release -a+    Distributor ID:	Ubuntu+    Description:	Ubuntu 12.04.1 LTS+    Release:	12.04+    Codename:	precise++> [[done]]; the webapp now detects when XMPP pairing has been used but no+> transfer remote is available, and prompts the user to create one.+> --[[Joey]]
+ doc/bugs/Test_failure_on_debian_dropunused.mdwn view
@@ -0,0 +1,31 @@+### Please describe the problem.+./git-annex test fails:+                                          +    ### Failure in: git-annex unused/dropunused                                                                                                     +    dropunused failed+    Cases: 1  Tried: 1  Errors: 0  Failures: 1   ++### What steps will reproduce the problem?+./git-annex test++### What version of git-annex are you using? On what operating system?+4.20130723-206-g1647361+++debian 7.1 i686++### Please provide any additional information below.++I'm not sure if there is a way to get extra information out of the test harness. I had a quick look at the code and couldn't see anything obvious.+I've tried a clean and rebuild and it reappears, so if there is more information you need just let me know what.++[[!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.+"""]]++> Forgot to update the test suite for this behavior change.+> [[done]] --[[Joey]]
+ doc/bugs/The_assistant_hangs_forever.mdwn view
@@ -0,0 +1,46 @@+What steps will reproduce the problem?++1. Open the assistant with git-annex webapp+2. Click add another repository+3. Choose "add another repository"+4. Use "/home/pierre/testme" (try and get the problem with a new directory or an existing directory)+5. Press "Make Repository"+5. Choose "Keep the repository separate" ++What is the expected output? What do you see instead?++Go to the created repository but the interface hangs forever+I have 4 git-annex processes that use no CPUs.+I can still use the UI by clicking around with success or even shutdown the daemon.+If I shutdown the daemon, all git-annex process gets killed.++What version of git-annex are you using? On what operating system?++It is said to be git-annex version: 4.20130324 but it is actually 4.20130405 (known bug)++Please provide any additional information below.+++OS: Arch linux, bin package (not installed from source)+All tests are OK+Nothing happens on the log pages++This is so weird that I would like to see the log file but I cannot find it. I have looked at /var/log without success.+I have tried other available version on Arch linux (AUR git-annex-bin, AUR git-annex-standalone, haskell-web git-annex) and they all exhibit the same problem.+At that stage, what I would like to be able is to try to figure out what is going on using the log file.+Thanks++> This could happen when using the amd64 standalone build, because I +> forgot to install curl into its chroot, so it was not included in the+> bundle. If the host system also lacked curl, or something prevented+> curl from working, it would fail like this.+> +> I've included curl into the amd64 standalone build. I've also made the+> assistant fall back to using a built-in http client if it is built+> without curl.+> +> None of which helps at all with the Arch git-annex-bin hack, since+> that binary will be built with a working curl (when my amd64 standalone+> builder builds it), and then installed onto a system, that,+> apparently, has a broken curl. Which is one of many reasons I cannot+> support that hack. [[done]] --[[Joey]]
+ doc/bugs/The_webapp_doesn__39__t_allow_deleting_repositories.mdwn view
@@ -0,0 +1,33 @@+What steps will reproduce the problem?++After creating new remote repositories in the webapp there's no option to delete them++What is the expected output? What do you see instead?++Some option to delete a repository, just like I can disable sync or change the config of a remote++What version of git-annex are you using? On what operating system?++    $ ./git-annex version+    git-annex version: 3.20130102++    $ uname -a+    Linux wintermute 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:45:18 UTC 2012 i686 i686 i386 GNU/Linux++    $ lsb_release -a+    Distributor ID:	Ubuntu+    Description:	Ubuntu 12.04.1 LTS+    Release:	12.04+    Codename:	precise++[[!tag /design/assistant]]++> Status: You can delete the current repository. You can also remove+> repositories from the list of remotes (without deleting their content)+> and you can tell it you want to stop using a remote, and it will+> suck all content off that remote until it's empty.+> +> Still todo: Detect when a remote has been sucked dry, and actually delete+> it. --[[Joey]]++>> [[done]] --[[Joey]]
+ doc/bugs/TransferScanner_crash_on_Android.mdwn view
@@ -0,0 +1,24 @@+### Please describe the problem.++TransferScanner crashes trying to add a file.++### What steps will reproduce the problem?++Start the web app.++### What version of git-annex are you using? On what operating system?++4.20130709-g339d1e0 on Android.++### Please provide any additional information below.++There was a whole stack of nulls in some of those log lines as well. I've ++[[!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++TransferScanner crashed: unknown response from git cat-file ("refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e missing",refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00(7981 more elided)\00.log)+[2013-07-16 15:19:26 NZST] TransferScanner: warning TransferScanner crashed: unknown response from git cat-file ("refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e missing",refs/heads/git-annex:289/20f/SHA256E-s85883241--3bf01cfd6a422f9b661ed335e6142bbdaf899cd71587bb3cc812256064c7071e\00\00\00\00\00(7991 more elided)\00.log)+# End of transcript or log.+"""]]
+ doc/bugs/Tries_to_upload_to_remote_although_remote_is_dead.mdwn view
@@ -0,0 +1,51 @@+What steps will reproduce the problem?++I added a (encrypted) ssh remote and everything worked fine. Now I marked the remote as dead, but git-annex still tries to upload to this remote. I recognize this because it asks for my ssh and gpg keys passwords. ++While transfering (or asking for the password), `git annex status` shows the following:+<pre>+supported backends: SHA256E SHA1E SHA512E SHA224E SHA384E SHA256 SHA1 SHA512 SHA224 SHA384 WORM URL+supported remote types: git S3 bup directory rsync web hook+trusted repositories: 0+semitrusted repositories: 2+	00000000-0000-0000-0000-000000000001 -- web+ 	cd16b9c6-f464-11e1-9845-8749687232d2 -- here (Dell)+untrusted repositories: 0+dead repositories: 7+	11379fa0-ecd6-49e2-9bec-24fc19cc7b9f -- vserver.dbruhn.de_annex+ 	2195e036-d2ef-4357-8c89-a9aaec23ebdc -- vserver-plain+ 	4d066ea1-fb9f-45fd-990a-5c5c836f530e -- inTmp+ 	bb276045-6ba6-488f-88d0-39a3c5f5134d -- vserver-enc+ 	c49f3372-3fcf-49fc-b626-73ba4454c172 -- annexBare (bareAnnex)+ 	e52645b3-bfb6-457d-b281-967353919e29 -- AnnexUSBFAT+ 	ea3d6acc-716c-48e8-9b6b-993b90dcc1db -- vserver2+transfers in progress: +	uploading Schmidt/somefile.m4a+++ to vserver2+available local disk space: 43 gigabytes (+1 megabyte reserved)+temporary directory size: 389 megabytes (clean up with git-annex unused)+local annex keys: 23+local annex size: 396 megabytes+known annex keys: 19+known annex size: 396 megabytes+bloom filter size: 16 mebibytes (0% full)+backend usage: +	SHA256E: 42+</pre>++As you can see, the `vserver2` remote is marked as dead but git-annex still tries to upload. This problem keeps occuring even after restarts. ++What is the expected output? What do you see instead?++If I do not get the `dead` status wrong, git-annex should not use these remotes.+++What version of git-annex are you using? On what operating system?++git-annex HEAD from yesterdays git. Ubuntu 12.10++Please provide any additional information below.++[[!tag /design/assistant moreinfo]]
+ doc/bugs/Trouble_initializing_git_annex_on_NFS.mdwn view
@@ -0,0 +1,16 @@+The following occurs in a directory that is shared on an NFS server:++    /media/mybook/movies $ git init+    Initialized empty Git repository in /media/mybook/movies/.git/+    /media/mybook/movies $ git annex init mybook-movies+    init mybook-movies +    git-annex: waitToSetLock: resource exhausted (No locks available)+    failed+    git-annex: init: 1 failed+    /media/mybook/movies $++This happens reliably.  Is there any way around it?  I have shell+access on the NFS server, but it is a NAS, so I don't think it is+capable of running git-annex.++[[done]]
+ doc/bugs/True_backup_support.mdwn view
@@ -0,0 +1,7 @@+I'd like to be able to restore my data from S3/Glacier following a catastrophic loss of information.++As I understand it, git-annex doesn't solve this problem for me because it only stores file *contents* in S3/Glacier.  A restore-from-nothing requires both the file contents and also the file names and metadata, which git-annex doesn't store in S3.++I'm still feeling my way around git-annex, but I think it will probably be sufficient for my purposes to set up a cron job to push my annex to github.  But I think it would be helpful if git-annex could take care of this automatically.++> Based on the comments, this is [[done]] --[[Joey]]
+ doc/bugs/Truncated_file_transferred_via_S3.mdwn view
@@ -0,0 +1,614 @@+### Please describe the problem.++I have two machines connected with annex assistant via XMPP and S3. I placed a file into the annex directory on one computer, and it fairly immediately transferred to the other, as expected. However the resulting file appears to be truncated.++### What steps will reproduce the problem?++Unknown, I haven't noticed this happen before.++### What version of git-annex are you using? On what operating system?++The sending end was from commit ef1fd09c5c1c3950727f0760df36075e45192b33 (Tue Jul 2 16:52:43 2013 +0000), the receiving end was at 1c16de8ebcef6c1920a8437af380f8aea5a2c535 (Wed Jun 12 20:31:43 2013 +0000). Both on Ubuntu 13.04.++### Please provide any additional information below.++Details of the file at the sending end:++[[!format text """+$ stat git-annex_4.20130627_amd64.deb +  Bestand: ‘git-annex_4.20130627_amd64.deb’+  Grootte: 10140744     Blokken: 19808        IO-blok: 4096   normaal bestand+Apparaat: 801h/2049d   Inode: 27394054     Koppelingen: 1+Toegang: (0644/-rw-r--r--)   UID: ( 1000/   robin)   GID: ( 1000/   robin)+Toegang:   2013-07-03 21:57:26.774297184 +1200+Gewijzigd: 2013-07-03 21:57:25.526306867 +1200+Veranderd: 2013-07-03 21:57:26.770297214 +1200+"""]]++and at the receiving end:++[[!format text """+  Bestand: ‘git-annex_4.20130627_amd64.deb’+  Grootte: 10105870     Blokken: 19760        IO-blok: 4096   normaal bestand+Apparaat: 16h/22d   Inode: 6167474      Koppelingen: 1+Toegang: (0664/-rw-rw-r--)   UID: ( 1000/   robin)   GID: ( 1000/   robin)+Toegang:   2013-07-03 10:58:02.653724449 +0100+Gewijzigd: 2013-07-03 10:58:02.365724461 +0100+Veranderd: 2013-07-03 10:58:02.369724461 +0100+"""]]++(it was coincidence I expect that it was a deb of git-annex I'd just made :)++Some more poking indicates that it's not strictly a truncation, not too far into the file, the content changes:++Sent:++[[!format text """+00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314+00002b0 4a0d 2954 d6aa fb42 2699 7437 df7f 6a6d+00002c0 7f7f 4f1c bce5 5e0f 5cc3 d5b1 e896 2829+00002d0 4ed2 8426 9496 a669 3dd1 d6ed 26dd 3b1d+00002e0 4c2a 4ef2 e29b 778c 4818 0e49 990e 314c+"""]]++Received:++[[!format text """+00002a0 4ea6 bb1e 4c18 d54e b836 b19a d9a2 6314+00002b0 544a aa29 42d6 99fb 3726 7f74 6ddf 7f6a+00002c0 1c7f e54f 0fbc c35e b15c 96d5 29e8 d228+00002d0 264e 9684 6994 d1a6 ed3d ddd6 1d26 2a3b+00002e0 f24c 9b4e 8ce2 1877 4948 0e0e 4c99 1931+"""]]++Oddly, there seems to be a pattern in the difference of the first incorrect row, it looks like kind of like strange endian weirdness rearranging things.++aabb ccdd eeff gghh++becomes:++bbdd ffcc hhee ..gg++where the .. comes from further along the pattern.++Deleting and re-adding the file doesn't cause the new version to appear, but that's presumably because it's addressing by SHA, so it doesn't see that as a change.++[[!format text """+# 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++Sending machine:++(started...) [2013-07-03 21:57:17 NZST] XMPPSendPack: Syncing with eythian+[2013-07-03 21:57:17 NZST] XMPPReceivePack: Syncing with eythian+Everything up-to-date+[2013-07-03 21:57:25 NZST] Committer: Adding git-annex..amd64.deb++add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:25 NZST] Committer: Committing changes to git+[2013-07-03 21:57:25 NZST] Pusher: Syncing with backups+To /mnt/backups/annex+   2783051..69b3503  git-annex -> synced/git-annex+   0b10576..e1b6f29  master -> synced/master+(gpg) Already up-to-date.+Already up-to-date.+[2013-07-03 21:57:26 NZST] XMPPSendPack: Syncing with eythian+[2013-07-03 21:57:26 NZST] Committer: Adding git-annex..amd64.deb+ok+(Recording state in git...)+(Recording state in git...)+++add git-annex_4.20130627_amd64.deb (checksum...) [2013-07-03 21:57:26 NZST] Committer: Committing changes to git++0%        96.0KB/s 1m42s[2013-07-03 21:57:27 NZST] Pusher: Syncing with backups+To /mnt/backups/annex+   69b3503..026ba8e  git-annex -> synced/git-annex+To xmpp::eythian@jabber.kallisti.net.nz+   2783051..69b3503  git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+   0b10576..e1b6f29  master -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master+1%       127.9KB/s 1m16s[2013-07-03 21:57:27 NZST] XMPPSendPack: Syncing with eythian+25%        631.7KB/s 12sTo xmpp::eythian@jabber.kallisti.net.nz+   69b3503..35b3fd8  git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+[2013-07-03 21:57:30 NZST] XMPPSendPack: Syncing with eythian+51%           1.2MB/s 4sEverything up-to-date+[2013-07-03 21:57:34 NZST] Transferrer: Uploaded git-annex..amd64.deb+[2013-07-03 21:57:34 NZST] Pusher: Syncing with backups+To /mnt/backups/annex+   026ba8e..1eb67d8  git-annex -> synced/git-annex+[2013-07-03 21:57:35 NZST] XMPPSendPack: Syncing with eythian+To xmpp::eythian@jabber.kallisti.net.nz+   35b3fd8..1eb67d8  git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+[2013-07-03 21:57:36 NZST] XMPPSendPack: Syncing with eythian+Everything up-to-date+[2013-07-03 21:58:03 NZST] XMPPReceivePack: Syncing with eythian+Already up-to-date.+[2013-07-03 21:58:04 NZST] XMPPReceivePack: Syncing with eythian+[2013-07-03 22:09:44 NZST] XMPPSendPack: Syncing with eythian+To xmpp::eythian@jabber.kallisti.net.nz+   1eb67d8..822dbb1  git-annex -> refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex+[2013-07-03 22:09:45 NZST] XMPPSendPack: Syncing with eythian+Everything up-to-date++Receiving machine:++[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a18/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from a20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from b24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c27/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c25/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c16/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from c21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d27/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d15/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from d24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from f21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from h26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from j23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from k22/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from l17/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m32/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m18/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from o20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s24/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s21/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s19/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s25/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s16/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from s26/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w23/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from w20/msn Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])"+[2013-07-03 10:57:16 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (PushRequest (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\"))"+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from m9/Adium Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from p6/NEW_HOTNESS Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:16 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:17 BST] XMPPClient: push notification for+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [0b10576100879220b2f50bf53f552befe2fda8de,27830516f221de09f7906954ba0bcc6b3dd31680])"]+[2013-07-03 10:57:17 BST] XMPPClient: ignoring CanPush with known shas+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:17 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:17 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"]+[2013-07-03 10:57:17 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:17 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:17 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"<elided>\")"]+[2013-07-03 10:57:17 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:57:17 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "<elided>")+[2013-07-03 10:57:17 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:18 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:18 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:18 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:18 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:18 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"]+[2013-07-03 10:57Everything up-to-date+:18 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57"+[2013-07-03 10:57:18 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:21 BST] XMPPClient: received: ["Presence from a15/android_talk53f054b9e972 Nothing"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:26 BST] XMPPClient: push notification for+[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:26 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"]+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"]+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:26 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:26 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:26 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:26 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:26 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:26 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:27 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:27 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:27 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..27830516f221de09f7906954ba0bcc6b3dd31680","--oneline","-n1"]+[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "<elided>")+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"]+[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:27 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","69b3503287d87c26989a755d0cc660c3c68f2c80"]+[2013-07-03 10:57:27 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","69b3503287d87c26989a755d0cc660c3c68f2c80..refs/heads/git-annex","--oneline","-n1"]+[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","69b3503287d87c26989a755d0cc660c3c68f2c80"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:27 BST] TransferScanner: starting scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:27 BST] Merger: merging refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master into refs/heads/master+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:57:27 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/synced/9e67bebc-655c-47da-97a0-2bb02bbbc580/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+Updating 0b10576..e1b6f29+Fast-forward+ git-annex_4.20130627_amd64.deb | 1 ++ 1 file changed, 1 insertion(+)+ create mode 120000 git-annex_4.20130627_amd64.deb+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","0b10576100879220b2f50bf53f552befe2fda8de","e1b6f2944e7d082299cb1696c55d9064a11c4577"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"]+[2013-07-03 10:57:27 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"]+[2013-07-03 10:57:28 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb+[2013-07-03 10:57:28 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"]+[2013-07-03 10:57:28 BST] Committer: committing 1 changes+[2013-07-03 10:57:28 BST] Committer: Committing changes to git+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:28 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:28 BST] XMPPClient: push notification for+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:28 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"]+[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:28 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587+[2013-07-03 10:57:28 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,69b3503287d87c26989a755d0cc660c3c68f2c80])"+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"]+[2013-07-03 10:57:28 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:28 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:28 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:28 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,026ba8e7ba89bccd22f5ff31a26c82ee75641b55])"]+[2013-07-03 10:57:29 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:29 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:29 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:29 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:29 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:29 BST] TransferScanner: finished scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:29 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:29 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:30 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:30 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..69b3503287d87c26989a755d0cc660c3c68f2c80","--oneline","-n1"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"]+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","35b3fd81218834a29b9f516b64b4671c0b0902d3"]+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","35b3fd81218834a29b9f516b64b4671c0b0902d3..refs/heads/git-annex","--oneline","-n1"]+[2013-07-03 10:57:30 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","35b3fd81218834a29b9f516b64b4671c0b0902d3"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"]+[2013-07-03 10:57:30 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:30 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"]+[2013-07-03 10:57:30 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:30 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:30 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:30 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:30 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:30 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:31 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:31 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:31 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:31 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:31 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:31 BST] TransferScanner: starting scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:31 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"]+[2013-07-03 10:57:32 BST] TransferScanner: finished scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:34 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"push\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"])], elementNodes = []})","NotifyPush [UUID \"a23dd126-7bb7-42ce-b15a-b01990df5f2a\"]"]+[2013-07-03 10:57:34 BST] XMPPClient: push notification for+[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:57:34 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [(Name {nameLocalName = \"query\", nameNamespace = Nothing, namePrefix = Nothing},[ContentText \"\"])], elementNodes = []})","QueryPresence"]+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"]+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (CanPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,1eb67d85f89c92345757805d83939d75e8ce54a0])"]+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (PushRequest (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:35 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:35 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:35 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:35 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:35 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 2 "<elided>")+[2013-07-03 10:57:35 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:36 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 2 \"<elided>\")"]+[2013-07-03 10:57:36 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 2 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 3 "<elided>")+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:36 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 4 "<elided>")+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..35b3fd81218834a29b9f516b64b4671c0b0902d3","--oneline","-n1"]+[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"]+[2013-07-03 10:57:36 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:36 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","1eb67d85f89c92345757805d83939d75e8ce54a0"]+[2013-07-03 10:57:36 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","1eb67d85f89c92345757805d83939d75e8ce54a0..refs/heads/git-annex","--oneline","-n1"]+[2013-07-03 10:57:36 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","1eb67d85f89c92345757805d83939d75e8ce54a0"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:57:36 BST] TransferScanner: starting scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"]+[2013-07-03 10:57:36 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","refs/heads/git-annex"]+[2013-07-03 10:57:36 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-files","--cached","-z","--"]+[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (StartingPush (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:57:37 BST] XMPPReceivePack: started running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:57:37 BST] XMPPReceivePack: Syncing with eythian +[2013-07-03 10:57:37 BST] chat: git ["receive-pack","/home/robin/Bureaublad/annex"]+[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackOutput 1 "<elided>")+[2013-07-03 10:57:37 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:37 BST] XMPPClient: received: ["Pushing \"e57\" (SendPackOutput 1 \"<elided>\")"]+[2013-07-03 10:57:37 BST] XMPPClient: NetMessager stored Pushing "e57" (SendPackOutput 1 "<elided>") in ReceivePack inbox "e57"+[2013-07-03 10:57:37 BST] XMPPReceivePack: finished running push Pushing "e57" (StartingPush (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:57:37 BST] XMPPClient: sending: Pushing "e57" (ReceivePackDone ExitSuccess)+[2013-07-03 10:57:37 BST] TransferScanner: queued Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing : expensive scan found missing object+[2013-07-03 10:57:37 BST] Transferrer: Transferring: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing+[2013-07-03 10:57:38 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:57:38 BST] TransferScanner: finished scan of [Remote { name ="eythian" }]+[2013-07-03 10:57:38 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Nothing+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 131008+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 262016+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 393024+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 524032+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 655040+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 786048+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 917056+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1048064+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1179072+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1310080+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1441088+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1572096+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1703104+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1834112+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 1965120+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2096128+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2227136+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2358144+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2489152+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2620160+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2751168+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 2882176+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3013184+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3144192+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3275200+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3406208+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3537216+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3668224+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3799232+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 3930240+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4192256+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4323264+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4454272+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4585280+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4716288+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 4847296+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5109312+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5240320+[2013-07-03 10:58:01 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5371328+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5502336+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5633344+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5764352+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 5895360+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6157376+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6288384+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6419392+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6550400+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6681408+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 6943424+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7074432+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7205440+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7336448+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7598464+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7729472+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7860480+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 7991488+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8122496+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8253504+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8384512+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8515520+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8646528+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8777536+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 8908544+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9039552+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9170560+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9301568+[2013-07-03 10:58:02 BST] XMPPClient: received: ["Unknown message"]+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9432576+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9563584+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9694592+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9825600+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 9956608+[2013-07-03 10:58:02 BST] TransferWatcher: transfer starting: Download UUID "971c808b-ce67-4edb-b317-21c0da6b5462" git-annex_4.20130627_amd64.deb Just 10087616+[2013-07-03 10:58:02 BST] Watcher: add symlink git-annex_4.20130627_amd64.deb+[2013-07-03 10:58:02 BST] Transferrer: Downloaded git-annex..amd64.deb+[2013-07-03 10:58:02 BST] TransferWatcher: transfer finishing: Transfer {transferDirection = Download, transferUUID = UUID "971c808b-ce67-4edb-b317-21c0da6b5462", transferKey = Key {keyName = "8514472fd7c4ea28b385b0335db408ee28f58911b5ad0ba9d2e2cbfd1b99c86d.deb", keyBackendName = "SHA256E", keySize = Just 10140744, keyMtime = Nothing}}+[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-t","blob","-w","--stdin"]+[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","hash-object","-w","--stdin-paths"]+[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","write-tree"]+[2013-07-03 10:58:02 BST] chat: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit-tree","9b6f9b59c19650e25f11e2d50acb3bf25b631150","-p","refs/heads/git-annex"]+[2013-07-03 10:58:02 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-ref","refs/heads/git-annex","822dbb101976fed8b775d04bba6da876c591a9f0"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","git-annex"]+[2013-07-03 10:58:02 BST] Committer: committing 1 changes+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/git-annex"]+[2013-07-03 10:58:02 BST] Committer: Committing changes to git+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..822dbb101976fed8b775d04bba6da876c591a9f0","--oneline","-n1"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","log","refs/heads/git-annex..1eb67d85f89c92345757805d83939d75e8ce54a0","--oneline","-n1"]+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"]+[2013-07-03 10:58:02 BST] feed: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","update-index","-z","--index-info"]+[2013-07-03 10:58:02 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])+[2013-07-03 10:58:02 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","commit","--allow-empty-message","--no-edit","-m","","--quiet","--no-verify"]+[2013-07-03 10:58:02 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:58:03 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:58:03 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:03 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:03 BST] Merger: merging refs/heads/synced/master into refs/heads/master+[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:58:03 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex/.git/annex/merge/","merge","--no-edit","refs/heads/synced/master"]+Already up-to-date.+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--hash","refs/heads/master"]+[2013-07-03 10:58:03 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","diff-tree","-z","--raw","--no-renames","-l0","-r","e1b6f2944e7d082299cb1696c55d9064a11c4577","e1b6f2944e7d082299cb1696c55d9064a11c4577"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (PushRequest (UUID \"9e67bebc-655c-47da-97a0-2bb02bbbc580\"))"]+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 2 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 2 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 3 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 3 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 4 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 4 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 5 \"<elided>\")"]+[2013-07-03 10:58:03 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 5 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "<elided>")+[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:03 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 2 "<elided>")+[2013-07-03 10:58:03 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 6 \"<elided>\")"]+[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 6 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 7 \"<elided>\")"]+[2013-07-03 10:58:04 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 7 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"]+[2013-07-03 10:58To xmpp::eythian@jabber.kallisti.net.nz+:0   2783051..822dbb1  4git-annex -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex +BS   0b10576..e1b6f29  Tmaster -> refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master]+ XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57"+[2013-07-03 10:58:04 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:58:04 BST] XMPPSendPack: started running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580"))+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","symbolic-ref","HEAD"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","refs/heads/master"]+[2013-07-03 10:58:04 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","show-ref","--head","refs/heads/git-annex","HEAD"]+[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","branch","-f","synced/master"]+[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e30" (CanPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])+[2013-07-03 10:58:04 BST] XMPPSendPack: Syncing with eythian +[2013-07-03 10:58:04 BST] XMPPClient: exploded undirected message to clients e7/27209141331372845435882587+[2013-07-03 10:58:04 BST] call: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","push","eythian","git-annex:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/git-annex","refs/heads/master:refs/synced/2c0b788e-7b2d-474b-8963-d889b9556229/ZXl0aGlhbkBqYWJiZXIua2FsbGlzdGkubmV0Lm56/master"]+[2013-07-03 10:58:04 BST] XMPPClient: sending: Pushing "e57" (StartingPush (UUID "2c0b788e-7b2d-474b-8963-d889b9556229"))+[2013-07-03 10:58:04 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:04 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from e7/27209141331372845435882587 Just (Element {elementName = Name {nameLocalName = \"git-annex\", nameNamespace = Just \"git-annex\", namePrefix = Nothing}, elementAttributes = [], elementNodes = []})"]+[2013-07-03 10:58:05 BST] XMPPClient: sending to new client: e7/27209141331372845435882587 "Pushing \"e57\" (CanPush (UUID \"2c0b788e-7b2d-474b-8963-d889b9556229\") [e1b6f2944e7d082299cb1696c55d9064a11c4577,822dbb101976fed8b775d04bba6da876c591a9f0])"+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Presence from 0/ Nothing"]+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackOutput 1 \"<elided>\")"]+[2013-07-03 10:58:05 BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackOutput 1 "<elided>") in SendPack inbox "e57"+[2013-07-03 10:58:05 BST] XMPPClient: sending: Pushing "e57" (SendPackOutput 1 "<elided>")+[2013-07-03 10:58:05 BST] XMPPClient: to client: e7/27209141331372845435882587+[2013-07-03 10:58:05 BST] XMPPClient: received: ["Pushing \"e57\" (ReceivePackDone ExitSuccess)"]+[2013-07-03 10:58:05 Everything up-to-date+BST] XMPPClient: NetMessager stored Pushing "e57" (ReceivePackDone ExitSuccess) in SendPack inbox "e57"+[2013-07-03 10:58:05 BST] XMPPSendPack: finished running push Pushing "e57" (PushRequest (UUID "9e67bebc-655c-47da-97a0-2bb02bbbc580")) True+[2013-07-03 10:58:27 BST] read: git ["--git-dir=/home/robin/Bureaublad/annex/.git","--work-tree=/home/robin/Bureaublad/annex","ls-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","preferred-content.log"]+++# End of transcript or log.+"""]]
+ doc/bugs/Unable_to_add_files_on_Android_due_to_weird_rename_error.mdwn view
@@ -0,0 +1,37 @@+### Please describe the problem.++I am receiving a weird error when trying to add a file into a git annex repo on Android. I can't explain how it got into this state, and I can't figure out how to fix it.++### What steps will reproduce the problem?++See the output below - I'm happy to run any debugging commands that are required.++### What version of git-annex are you using? On what operating system?++ASUS Transformer Infinity Android Tablet, Android 4.2.1.++[[!format sh """+git-annex version: 4.20130601-g7483ca4+build flags: Assistant Webapp Testsuite S3 WebDAV Inotify XMPP DNS+local repository version: 3+default repository version: 3+supported repository versions: 3 4+upgrade supported from repository versions: 0 1 2+"""]]+++### Please provide any additional information below.++[[!format sh """+u0_a141@android:/sdcard/git-annex.home/Documents $ git annex add Music/MobileSheets/The\ New\ Real\ Book\ 1/New\ Real\ Book\ 1\ Eb_19.pdf+add Music/MobileSheets/The New Real Book 1/New Real Book 1 Eb_19.pdf (checksum...) unknown option -- reflink=auto+git-annex: /storage/emulated/legacy/git-annex.home/Documents/.git/annex/tmp/New Real Book 1 Eb15137.pdf: rename: does not exist (No such file or directory)+failed+git-annex: add: 1 failed+1|u0_a141@android:/sdcard/git-annex.home/Documents $ ls -la .git/annex/tmp/+drwxrwxr-x    2 root     sdcard_r      4096 Jun 14 13:42 .+drwxrwxr-x    6 root     sdcard_r      4096 Jun 14 13:35 ..+u0_a141@android:/sdcard/git-annex.home/Documents $+"""]]++> Should be [[fixed|done]] --[[Joey]]
+ doc/bugs/Unable_to_import_feed.mdwn view
@@ -0,0 +1,27 @@+Using `git-annex version: 4.20130802` on Debian unstable, when trying to add the feed at <http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml>, I get:++[[!format sh """+importfeed http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml +--2013-08-16 09:14:13--  http://www.ndr.de/fernsehen/sendungen/extra_3/videos/zum_mitnehmen/extradrei196_version-hq.xml+Auflösen des Hostnamen »www.ndr.de (www.ndr.de)«... 212.201.100.171, 212.201.100.187+Verbindungsaufbau zu www.ndr.de (www.ndr.de)|212.201.100.171|:80... verbunden.+HTTP-Anforderung gesendet, warte auf Antwort... 200 OK+Länge: 61809 (60K) [application/xml]+In »»/tmp/feed4404«« speichern.++100%[============================================>] 61.809      --.-K/s   in 0,03s   ++2013-08-16 09:14:13 (2,20 MB/s) - »»/tmp/feed4404«« gespeichert [61809/61809]++failed+git-annex: importfeed: 1 failed+"""]]++(Oh, and using `format` with nono-ASCII seems to break down., at least in the preview.)++> I'm going to close this since I've narrowed it down to a bug in the+> upstream feed library. [[done]]. Of course, if we get a lot of reports of+> the library not working, I may need to revisit using it, but for now this+> seems an isolated problem. Also, I tried validating the feed, and it is+> not 100% valid, and one of the validity problems is a missing enclosure+> length. --[[Joey]] 
+ doc/bugs/Unable_to_switch_back_to_direct_mode.mdwn view
@@ -0,0 +1,55 @@+### Please describe the problem.++I seem to be unable to switch back and forth between git annex direct and git annex indirect mode in one of my repositories.  I can in others just fine.++### What steps will reproduce the problem?++In the broken repository I can do:++    cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ git annex direct+    commit  +    add audio/part2.aup (checksum...) ok+    ok+    add images/campaign.png (checksum...) ok+    ok+    add images/transifex.png (checksum...) ok+    ok+    add script-lines.txt (checksum...) ok+    ok+    add vid_pitch.blend (checksum...) ok+    ok+    (Recording state in git...)+    [master 9f13dc0] commit before switching to direct mode+     1 file changed, 145 insertions(+), 1 deletion(-)+     rewrite audio/part2.aup (100%)+     mode change 120000 => 100644+    ok+    direct gavroche-vid-shot.blend +    git-annex: /home/cwebber/gfx-proj/mediagoblin_vid/.git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f: rename: permission denied (Permission denied)+    failed+    git-annex: direct: 1 failed++looking at the files:++    cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ ls -l gavroche-vid-shot.blend+    lrwxrwxrwx 1 cwebber cwebber 190 Apr 28 18:27 gavroche-vid-shot.blend -> .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f+    cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$ ls -l .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f+    -rw-r--r-- 1 cwebber cwebber 2935980 Apr 28 18:27 .git/annex/objects/3M/mx/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f/SHA256E-s2935980--3a1c838333a4a0ee1eaa837c3f08a910d3f29fc60baf41affd936fbefe11111f+    cwebber@earlgrey:~/gfx-proj/mediagoblin_vid$++... it looks like these permissions should be fine!++Some notable things:++* I believe Blender wrote directly to a file that was in "locked" somehow, despite it being in that state.  It may have actually followed the symlink and overwritten that file, I'm not sure.+* However, the file that git-annex is now reporting with "permission denied" is not the one it did previously... I did git checkout -- on all the files, switched them over, and it's a different set of broken things now!+* It's actually easy enough to fix... in fact, I did fix it!  I just did a fresh clone of the git repository and a git annex get and everything is fine now.  However, it seemed like possibly a bug that might hit other people, hence my reporting it.++### What version of git-annex are you using? On what operating system?++git annex version 4.20130417 on debian wheezy++### Please provide any additional information below.+++> [[done]]; see comments. --[[Joey]]
+ doc/bugs/Unable_to_sync_a_second_machine_through_Box.mdwn view
@@ -0,0 +1,46 @@+What steps will reproduce the problem?++Install 4.20130417 as packaged in Debian unstable.+Using "git annex webapp", setup on first machine adding repository ~/annex.  Add a Box.com repository in directory "annex", encrypted.  Add a jabber account (apparently successful).+Add test file to ~/annex.  Login via website to box.com, notice that the "annex" directory is created and contains encrypted file.+On second (remote machine), follow the same steps (add repository in ~/annex, Add a Box.com repository in directory "annex", encrypted, Add same jabber account).++What is the expected output? What do you see instead?++Expected the file to appear in the second machine's ~/annex.  The webapp indicates: Synced with box.com+Log file says:++[2013-04-23 06:50:16 EDT] main: starting assistant version 4.20130417+(scanning...) [2013-04-23 06:50:16 EDT] Watcher: Performing startup scan+(started...) +(encryption setup shared cipher) (testing WebDAV server...)+(gpg) [2013-04-23 06:50:50 EDT] main: Syncing with box.com +[2013-04-23 06:50:50 EDT] main: Share with friends, and keep your devices in sync across the cloud. +[2013-04-23 06:51:03 EDT] main: Share with friends, and keep your devices in sync across the cloud. +warning: Not updating non-default fetch respec+	+	Please update the configuration manually if necessary.+Initializing nautilus-gdu extension+Shutting down nautilus-gdu extension+git-annex: Daemon is already running.++What version of git-annex are you using? On what operating system?++4.20130417, debian testing with apt-pinning to unstable on both systems.++Please provide any additional information below.++When editing the Box.com repository, the option to select a directory no longer appears (and the configuration doesn't show the one selected at creation).+There's no indication if the jabber communication is working successfully.  It could be that signalling isn't working for some reason, but the user has no information to determine that.+It would be helpful if there were some indication in the Dashboard as to the number of files/directories/objects that git annex believes exists in each location.  It could be that it's not accessing the Box.com server successfully, but again, this is difficult to determine.++It's great to see that git annex might make a box.com account useful for automatic upload and sync... looking forward to getting it to work on both sides! Thanks for making this!++[[!tag /design/assistant moreinfo]]++> The robustness of the XMPP support has massively improved since this bug+> report was filed. Since no more information is forthcoming, I consider+> this bug [[done]].+>+> (Incidentially, this bug got me to santize all information logged about+> XMPP protocol, including the names/emails of buddies..) --[[Joey]]
+ doc/bugs/Unable_to_use_remotes_with_space_in_the_path.mdwn view
@@ -0,0 +1,35 @@+### Please describe the problem.++Git annex can't use remotes with the type "file://" if the path contains spaces++### What steps will reproduce the problem?++- Create one repository with a space in the path (and initialize annex in it)+- Clone that repo to an other directory (and initialize annex also in that)+- add a file to the first repository in the annex way+- chdir to the second repository and try to get that file, it won't work (also after git pull or git sync pull)++Check this typescripts for a more detailed description++<http://uz.sns.it/~enrico/git-annex-bugreport.txt>++<http://pastebin.com/f8wkDNrG> (thanks mhameed for that data)+++### What version of git-annex are you using? On what operating system?++I'm using debian testing (jessie) on a i386 machine.++`git-annex` version: 4.20130521 (according to apt data and `git annex version`)++`git-annex` build flags: Assistant Webapp Pairing Testsuite S3 WebDAV Inotify DBus XMPP++`git` version: 1.7.10.4+++### Please provide any additional information below.++I don't use git annex assistant nor the webapp++> Tested and only file:// and not other urls have this problem.+> guilhem provided a fix. [[done]] --[[Joey]] 
+ doc/bugs/Unfortunate_interaction_with_Calibre.mdwn view
@@ -0,0 +1,24 @@+# Calibre ++Calibre is a somewhat popular eBook management package that's also free software.  <http://calibre-ebook.com/>  ++Install via+    # apt-get install calibre++There is a somewhat unfortunate interaction between Calibre and git-annex...++* git-annex makes its files become read-only.  By the way, that's not quite obvious from the documentation; I suggest making that more prominent.+* Calibre modifies files (not quite sure of semantics, how, or why) when doing various operations, notably such as when copying a book from one's library to one's portable reading device.++These don't play well together, sadly.++I'd expect most of the issue to sit on the Calibre side, and have reported it as a bug.+[Calibre bug #739045](https://bugs.launchpad.net/calibre/+bug/739045)+Preliminary indication is that they're treating it as a functionality change they'll decline to fix.  Which isn't entirely unreasonable - I anticipated as much, and I don't want to treat that as a bad/wrong decision.++However, I think it's:+* Unfortunate, as fitting Calibre together with git-annex seems like a neat idea.+* Useful to make sure that this kind of "doesn't play well together" condition is documented, even if only as a bug report.++> [[done]]; the assistant uses direct mode by default now to avoid+> this kind of thing. --[[Joey]] 
+ doc/bugs/Unknown_command___39__list__39__.mdwn view
@@ -0,0 +1,15 @@+### Please describe the problem.++The man page claims there exists a query command 'list' but:++    % git annex list somefile+    git-annex: Unknown command 'list'++### What version of git-annex are you using? On what operating system?++man page online and git-annex version 4.20130909.++> Your last line explains the problem. The online man page+> documents the latest release, or in some cases+> unrelased git version. You have a version 2 releases old installed.+> [[done]] --[[Joey]]
+ doc/bugs/Unknown_remote_type_webdav.mdwn view
@@ -0,0 +1,8 @@+When I attempt to setup a [box.com special remote](http://git-annex.branchable.com/tips/using_box.com_as_a_special_remote/) I get the following error:++    git-annex: Unknown remote type webdav++I'm using the Linux prebuilt tarball. Does it not include webdav support?++> The amd64 standalone tarball was indeed built without it for the last+> release. Fixed that. [[done]] --[[Joey]]
+ doc/bugs/Update_dependency_on_certificate___62____61___1.3.3.mdwn view
@@ -0,0 +1,64 @@+What steps will reproduce the problem?++Run:++    cabal install git-annex++What is the expected output? What do you see instead?++The current output is the following:++    $ cabal install git-annex        +    Resolving dependencies...    +    Configuring certificate-1.3.2...+    Building certificate-1.3.2...+    Preprocessing library certificate-1.3.2...+    [ 1 of 10] Compiling Data.Certificate.KeyDSA ( Data/Certificate/KeyDSA.hs, dist/build/Data/Certificate/KeyDSA.o )+    [ 2 of 10] Compiling Data.Certificate.KeyRSA ( Data/Certificate/KeyRSA.hs, dist/build/Data/Certificate/KeyRSA.o )+    +    Data/Certificate/KeyRSA.hs:64:27:+        `RSA.private_pub' is not a (visible) field of constructor `RSA.PrivateKey'+    cabal: Error: some packages failed to install:+    DAV-0.3 depends on certificate-1.3.2 which failed to install.+    authenticate-1.3.2 depends on certificate-1.3.2 which failed to install.+    certificate-1.3.2 failed during the building phase. The exception was:+    ExitFailure 1+    git-annex-3.20130107 depends on certificate-1.3.2 which failed to install.+    http-conduit-1.8.6.3 depends on certificate-1.3.2 which failed to install.+    http-reverse-proxy-0.1.1.1 depends on certificate-1.3.2 which failed to install.+    tls-1.0.3 depends on certificate-1.3.2 which failed to install.+    tls-extra-0.5.1 depends on certificate-1.3.2 which failed to install.+    yesod-1.1.7.2 depends on certificate-1.3.2 which failed to install.+    yesod-auth-1.1.3 depends on certificate-1.3.2 which failed to install.++I'd rather get a message stating how awesome the software I just installed is. :)++What version of git-annex are you using? On what operating system?++  * Debian (testing)+  * GHC 7.4.1+  * Cabal 1.14.0, cabal-install 0.14.0+  * cabal list git-annex says the installing version is: 3.20130107++Please provide any additional information below.++The certificate package version 1.3.2 does not seem to install properly with+this version of GHC (I think).++Version 1.3.3 solves the issue. I don't know if there is a way for me to+override the dependency tree to try to force the version update with+cabal-install, so maybe it's worth filing a bug.++Thanks a lot for git-annex.++> Welcome to cabal hell! This problem is why haskell's cabal system is not+> a sufficient way for users to install git-annex, and we have to provide+> prebuilt builds.+> +> No change to git-annex can fix this problem. The problem is that+> the old version of certificate got busted by some change to one of its+> dependencies, and several libraries that git-annex depends on have not+> yet been updated to use the new version of certificate. Once those+> libraries get updated, it'll fix itself.+> +> [[done]]; not git-annex bug. --[[Joey]]
+ doc/bugs/Use_a_git_repository_on_the_server_don__39__t_work.mdwn view

file too large to diff

+ doc/bugs/Using_Github_as_remote_throws_proxy_errors.mdwn view

file too large to diff

+ doc/bugs/Using_a_revoked_GPG_key.mdwn view

file too large to diff

+ doc/bugs/WEBDAV_443.mdwn view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_10_9ee2c5ed44295455af890caee7b06f1a._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_11_863a7d315212c9a8ab8f6fafa5d1b7f5._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_12_c17a4e23011e0a917dbe0ecf7e9f0cb5._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_13_3414416ff455d2fd1a7c7e7c4554b54d._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_14_e1da141eefb0445c217e5f5c119356da._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_15_41c3134bcc222b97bf183559723713d9._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_16_89621b526065b5bef753ce75db1af7b5._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_17_131a1b65c8008cf9f02c93d4fb75720b._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_18_b4f894a0b9ebb84ab73f6ffcf0778090._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_1_c6572ca1eaaf89b01c0ed99a4058412f._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_2_a357969cde382a91e13920ee1e9f711c._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_3_213815d6b827d467c60f3e8af925813b._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_4_b775be4b722fc7124d9fbe2d5d01cc9f._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_5_c4ea745da437e56b2426d1c2c00dfcec._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_6_ef05c0ae88fee9c626922c6064ffdf1e._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_7_eecabe8d5ed564cb540450770ca7d0b6._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_8_7f77ba8ebd90186d3b3949ae529ba393._comment view

file too large to diff

+ doc/bugs/WEBDAV_443/comment_9_87ebdc92b48d672964fb3f248c53600f._comment view

file too large to diff

+ doc/bugs/WORM:_Handle_long_filenames_correctly.mdwn view

file too large to diff

+ doc/bugs/Watcher_crashed:_addWatch:_does_not_exist.mdwn view

file too large to diff

+ doc/bugs/WebDAV_HandshakeFailed_.mdwn view

file too large to diff

+ doc/bugs/Webapp_fails_to_resolve_ipv6_hostname.mdwn view

file too large to diff

+ doc/bugs/Weird_behaviour_of_direct_and_indirect_annexes.mdwn view

file too large to diff

+ doc/bugs/Windows_and_Linux_in_direct_mode_confuses_git.mdwn view

file too large to diff

+ doc/bugs/Windows_build_test_failures.mdwn view

file too large to diff

+ doc/bugs/With_S3__44___GPG_ask_for_a_new_passphrase.mdwn view

file too large to diff

+ doc/bugs/Wrong_port_while_configuring_ssh_remote.mdwn view

file too large to diff

+ doc/bugs/__34__Adding_4923_files__34___is_really_slow.mdwn view

file too large to diff

+ doc/bugs/__34__drop__34___deletes_all_files_with_identical_content.mdwn view

file too large to diff

+ doc/bugs/__34__fatal:_bad_config_file__34__.mdwn view

file too large to diff

+ doc/bugs/__34__git_annex_watch__34___adds_map.dot.mdwn view

file too large to diff

+ doc/bugs/__34__make_test__34___fails_silently.mdwn view

file too large to diff

+ doc/bugs/__91__webapp__93___pause_syncing_with_specific_repository.mdwn view

file too large to diff

+ doc/bugs/__96__git_annex_fix__96___run_on_non-annexed_files_is_no-op.mdwn view

file too large to diff

+ doc/bugs/__96__git_annex_import__96___clobbers_mtime.mdwn view

file too large to diff

+ doc/bugs/__96__git_annex_sync__96___ignores_remotes.mdwn view

file too large to diff

+ doc/bugs/_impossible_to_switch_repositories_on_android__in_webapp.mdwn view

file too large to diff

+ doc/bugs/acl_not_honoured_in_rsync_remote.mdwn view

file too large to diff

+ doc/bugs/add_range_argument_to___34__git_annex_dropunused__34___.mdwn view

file too large to diff

+ doc/bugs/add_script-friendly_output_options.mdwn view

file too large to diff

+ doc/bugs/added_branches_makes___39__git_annex_unused__39___slow.mdwn view

file too large to diff

+ doc/bugs/adding_an_rsync.net_repo_give_an_gpg_error.mdwn view

file too large to diff

+ doc/bugs/addurl_--relaxed_with_--file_doesn__39__t_actually_relax.mdwn view

file too large to diff

+ doc/bugs/addurl_fails_on_the_internet_archive.mdwn view

file too large to diff

+ doc/bugs/allows_repository_with_the_same_name_twice.mdwn view

file too large to diff

+ doc/bugs/android:_high_CPU_usage__44___unclear_how_to_quit.mdwn view

file too large to diff

+ doc/bugs/android_4.2.1__44___galaxy_nexus_java.lang.SecurityException.mdwn view

file too large to diff

+ doc/bugs/annex-rsync-options_shell-split_carelessly.mdwn view

file too large to diff

+ doc/bugs/annex.numcopies_not_overriden_by_--numcopies_option.mdwn view

file too large to diff

+ doc/bugs/annex_add_in_annex.mdwn view

file too large to diff

+ doc/bugs/annex_get_fails:___34__No_such_file_or_directory__34__.mdwn view

file too large to diff

+ doc/bugs/annex_get_over_SSH_is_very_slow.mdwn view

file too large to diff

+ doc/bugs/annex_unannex__47__uninit_should_handle_copies.mdwn view

file too large to diff

+ doc/bugs/another_build_error_in_assistant.mdwn view

file too large to diff

+ doc/bugs/archiving_git_repositories.mdwn view

file too large to diff

+ doc/bugs/assistant_-_GTalk_collision.mdwn view

file too large to diff

+ doc/bugs/assistant_always_assumes_port_22__63__.mdwn view

file too large to diff

+ doc/bugs/assistant_bails_when_adding_encrypted_usbdrive_repo_on_mac.mdwn view

file too large to diff

+ doc/bugs/assistant_does_not_allow_adding_an_existing_repo.mdwn view

file too large to diff

+ doc/bugs/assistant_does_not_list_remote___39__origin__39__.mdwn view

file too large to diff

+ doc/bugs/assistant_does_not_warn_on_files_it_failed_to_add.mdwn view

file too large to diff

+ doc/bugs/assistant_doesn__39__t_sync_empty_directories.mdwn view

file too large to diff

+ doc/bugs/assistant_doesn__39__t_sync_file_permissions.mdwn view

file too large to diff

+ doc/bugs/assistant_fails_to_sync_in_preferred_content_mode_manual.mdwn view

file too large to diff

+ doc/bugs/assistant_hangs_during_commit.mdwn view

file too large to diff

+ doc/bugs/assistant_ignore_.gitignore.mdwn view

file too large to diff

+ doc/bugs/assistant_not_noticing_file_renames__44___not_fixing_files.mdwn view

file too large to diff

+ doc/bugs/assistant_syncs_with_remotes_even_when_all_remotes_disabled.mdwn view

file too large to diff

+ doc/bugs/authentication_to_rsync.net_fails.mdwn view

file too large to diff

+ doc/bugs/backend_version_upgrade_leaves_repo_unusable.mdwn view

file too large to diff

+ doc/bugs/bad_behaviour_with_file_names_with_newline_in_them.mdwn view

file too large to diff

+ doc/bugs/bad_comment_in_ssh_public_key_ssh-rsa.mdwn view

file too large to diff

+ doc/bugs/bare_git_repos.mdwn view

file too large to diff

+ doc/bugs/box.com_never_stops_syncing..mdwn view

file too large to diff

+ doc/bugs/build_fails_in_Assistant__47__WebApp__47__Gpg.hs.mdwn view

file too large to diff

+ doc/bugs/build_is_broken_at_commit_cc0e5b7.mdwn view

file too large to diff

+ doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn view

file too large to diff

+ doc/bugs/build_issue_with_latest_release_0.20110522-1-gde817ba.mdwn view

file too large to diff

+ doc/bugs/build_problem_on_OSX.mdwn view

file too large to diff

+ doc/bugs/building_on_lenny.mdwn view

file too large to diff

+ doc/bugs/bup_initremote_failed_with_localhost_+_username.mdwn view

file too large to diff

+ doc/bugs/cabal_configure_is_broken_on_OSX_builds.mdwn view

file too large to diff

+ doc/bugs/cabal_install_fails_to_install_manpage.mdwn view

file too large to diff

+ doc/bugs/can__39__t_annex_get_from_annex_in_direct_mode.mdwn view

file too large to diff

+ doc/bugs/cannot_add_file__44___get___34__user_error__34__.mdwn view

file too large to diff

+ doc/bugs/cannot_connect_to_xmpp_server.mdwn view

file too large to diff

+ doc/bugs/cannot_determine_uuid_for_origin.mdwn view

file too large to diff

file too large to diff

+ doc/bugs/case-insensitive.mdwn view

file too large to diff

+ doc/bugs/case_sensitivity_on_FAT.mdwn view

file too large to diff

+ doc/bugs/check_for_curl_in_configure.hs.mdwn view

file too large to diff

+ doc/bugs/clicking_back_in_the_web_browser_crashes.mdwn view

file too large to diff

+ doc/bugs/com.branchable.git-annex.assistant.plist_is_invalid.mdwn view

file too large to diff

+ doc/bugs/commitBuffer:_invalid_argument___40__invalid_character__41__.mdwn view

file too large to diff

+ doc/bugs/commit_f20a40f_breaks_on_OSX_as_mntent.h_doesn__39__t_exist.mdwn view

file too large to diff

+ doc/bugs/concurrent_git-annex_processes_can_lead_to_locking_issues.mdwn view

file too large to diff

+ doc/bugs/configurable_path_to_git-annex-shell.mdwn view

file too large to diff

+ doc/bugs/configure_script_should_detect_uuidgen_instead_of_just_uuid.mdwn view

file too large to diff

+ doc/bugs/conflicting_haskell_packages.mdwn view

file too large to diff

+ doc/bugs/conq:_invalid_command_syntax.mdwn view

file too large to diff

+ doc/bugs/copy_doesn__39__t_scale.mdwn view

file too large to diff

+ doc/bugs/copy_fast_confusing_with_broken_locationlog.mdwn view

file too large to diff

+ doc/bugs/copy_to_webdav_sometimes_doesn__39__t_work.mdwn view

file too large to diff

+ doc/bugs/creating_a_plain_directory_where_a_mountpoint_should_have_been.mdwn view

file too large to diff

+ doc/bugs/creating_a_remote_server_repository.mdwn view

file too large to diff

+ doc/bugs/creds_directory_not_automatically_created.mdwn view

file too large to diff

+ doc/bugs/cross_platform_permissions_woes.mdwn view

file too large to diff

+ doc/bugs/cyclic_drop.mdwn view

file too large to diff

+ doc/bugs/direct_mode_assistant_in_subdir_confusion.mdwn view

file too large to diff

+ doc/bugs/direct_mode_renames.mdwn view

file too large to diff

+ doc/bugs/direct_repository_on_FAT32_fails_to_addurl_containing___63__.mdwn view

file too large to diff

+ doc/bugs/done.mdwn view

file too large to diff

+ doc/bugs/dotdot_problem.mdwn view

file too large to diff

+ doc/bugs/drop_fails_to_see_copies_that_whereis_sees.mdwn view

file too large to diff

+ doc/bugs/dropping_and_re-adding_from_web_remotes_doesn__39__t_work.mdwn view

file too large to diff

+ doc/bugs/dropping_files_with_a_URL_backend_fails.mdwn view

file too large to diff

+ doc/bugs/dropunused_doesn__39__t_handle_double_spaces_in_filename.mdwn view

file too large to diff

+ doc/bugs/dropunused_doesn__39__t_work_in_my_case__63__.mdwn view

file too large to diff

+ doc/bugs/encfs_accused_of_being_crippled.mdwn view

file too large to diff

+ doc/bugs/encrpyted_ssh_remote_on_macosx.mdwn view

file too large to diff

+ doc/bugs/encrypted_S3_stalls.mdwn view

file too large to diff

+ doc/bugs/encryption_given_a_gpg_keyid_still_uses_symmetric_encryption.mdwn view

file too large to diff

+ doc/bugs/encryption_key_is_surprising.mdwn view

file too large to diff

+ doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn view

file too large to diff

+ doc/bugs/error_on_only_repository_copy_deletion.mdwn view

file too large to diff

+ doc/bugs/error_propigation.mdwn view

file too large to diff

+ doc/bugs/error_when_using_repositories_with_non-ASCII_characters.mdwn view

file too large to diff

+ doc/bugs/error_with_file_names_starting_with_dash.mdwn view

file too large to diff

+ doc/bugs/extraneous_shell_escaping_for_rsync_remotes.mdwn view

file too large to diff

+ doc/bugs/fails_to_handle_lot_of_files.mdwn view

file too large to diff

+ doc/bugs/failure_to_return_to_indirect_mode_on_usb.mdwn view

file too large to diff

+ doc/bugs/fat_support.mdwn view

file too large to diff

+ doc/bugs/fat_support/comment_1_04bcc4795d431e8cb32293aab29bbfe2._comment view

file too large to diff

+ doc/bugs/fat_support/comment_2_bb4a97ebadb5c53809fc78431eabd7c8._comment view

file too large to diff

+ doc/bugs/fat_support/comment_3_df3b943bc1081a8f3f7434ae0c8e061e._comment view

file too large to diff

+ doc/bugs/fat_support/comment_4_90a8a15bedd94480945a374f9d706b86._comment view

file too large to diff

+ doc/bugs/fat_support/comment_5_64bbf89de0836673224b83fdefa0407b._comment view

file too large to diff

+ doc/bugs/fat_support/comment_6_a3b6000330c9c376611c228d746a1d55._comment view

file too large to diff

+ doc/bugs/fat_support/comment_7_a0ac7f2c44efc8116940c7b94b35e9d0._comment view

file too large to diff

+ doc/bugs/fat_support/comment_8_acc947643a635eb10a1bff92083a3506._comment view

file too large to diff

+ doc/bugs/fatal:_empty_ident_name.mdwn view

file too large to diff

+ doc/bugs/file_access__47__locking_issues_with_the_assitant.mdwn view

file too large to diff

+ doc/bugs/file_modification_times.mdwn view

file too large to diff

+ doc/bugs/free_space_checking.mdwn view

file too large to diff

+ doc/bugs/fsck_output.mdwn view

file too large to diff

+ doc/bugs/fsck_should_double-check_when_a_content-check_fails.mdwn view

file too large to diff

+ doc/bugs/fsck_thinks_file_content_is_bad_when_it_isn__39__t.mdwn view

file too large to diff

+ doc/bugs/gcrypt_initremote_pushes_git-annex_but_not_master.mdwn view

file too large to diff

+ doc/bugs/get_failed__44___but_remote_has_the_file.mdwn view

file too large to diff

+ doc/bugs/git-annex:_Argument_list_too_long.mdwn view

file too large to diff

+ doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn view

file too large to diff

+ doc/bugs/git-annex:_Not_in_a_git_repository._.mdwn view

file too large to diff

+ doc/bugs/git-annex:_fd:14:_hGetLine:_end_of_file.mdwn view

file too large to diff

+ doc/bugs/git-annex:_getUserEntryForID:_failed___40__Success__41__.mdwn view

file too large to diff

+ doc/bugs/git-annex:_status:_1_failed.mdwn view

file too large to diff

+ doc/bugs/git-annex_3.20130216.1_tests_are_broken.mdwn view

file too large to diff

+ doc/bugs/git-annex_add_should_repack_as_it_goes.mdwn view

file too large to diff

+ doc/bugs/git-annex_branch_corruption.mdwn view

file too large to diff

+ doc/bugs/git-annex_branch_push_race.mdwn view

file too large to diff

+ doc/bugs/git-annex_broken_on_Android_4.3.mdwn view

file too large to diff

+ doc/bugs/git-annex_directory_hashing_problems_on_osx.mdwn view

file too large to diff

+ doc/bugs/git-annex_dropunused_has_no_effect.mdwn view

file too large to diff

+ doc/bugs/git-annex_fix_not_noticing_file_renames.mdwn view

file too large to diff

+ doc/bugs/git-annex_get:_requested_key_is_not_present.mdwn view

file too large to diff

+ doc/bugs/git-annex_has_issues_with_git_when_staging__47__commiting_logs.mdwn view

file too large to diff

+ doc/bugs/git-annex_immediately_re-gets_dropped_files.mdwn view

file too large to diff

+ doc/bugs/git-annex_incorrectly_parses_bare_IPv6_addresses.mdwn view

file too large to diff

+ doc/bugs/git-annex_losing_rsync_remotes_with_encryption_enabled.mdwn view

file too large to diff

+ doc/bugs/git-annex_merge_stalls.mdwn view

file too large to diff

+ doc/bugs/git-annex_on_crippled_filesystem_can_still_failed_due_to_case_.mdwn view

file too large to diff

+ doc/bugs/git-annex_opens_too_many_files.mdwn view

file too large to diff

+ doc/bugs/git-annex_quit_unexpectedly___40__macosx__41__.mdwn view

file too large to diff

+ doc/bugs/git-annex_sync_broken_on_squeeze_backports.mdwn view

file too large to diff

+ doc/bugs/git-annex_thinks_files_are_in_repositories_they_are_not.mdwn view

file too large to diff

+ doc/bugs/git-annex_webapp_command_not_found.mdwn view

file too large to diff

+ doc/bugs/git_annex_add_..._adds_too_much.mdwn view

file too large to diff

+ doc/bugs/git_annex_add_eats_files_when_filename_is_too_long.mdwn view

file too large to diff

+ doc/bugs/git_annex_add_error_with_Andrew_File_System.mdwn view

file too large to diff

+ doc/bugs/git_annex_add_memory_leak.mdwn view

file too large to diff

+ doc/bugs/git_annex_add_removes_file_with_no_data_left.mdwn view

file too large to diff

+ doc/bugs/git_annex_assistant_--autostart_failed.mdwn view

file too large to diff

+ doc/bugs/git_annex_copy_--fast_does_not_copy_files.mdwn view

file too large to diff

+ doc/bugs/git_annex_copy_-f_REMOTE_._doesn__39__t_work_as_expected.mdwn view

file too large to diff

+ doc/bugs/git_annex_copy_trying_to_connect_to_remotes_uninvolved.mdwn view

file too large to diff

+ doc/bugs/git_annex_does_nothing_useful.mdwn view

file too large to diff

+ doc/bugs/git_annex_doesn__39__t_work_in_Max_OS_X_10.9.mdwn view

file too large to diff

+ doc/bugs/git_annex_fork_bombs_on_gpg_file.mdwn view

file too large to diff

+ doc/bugs/git_annex_fsck_in_direct_mode_does_not_checksum_files.mdwn view

file too large to diff

+ doc/bugs/git_annex_fsck_is_a_no-op_in_bare_repos.mdwn view

file too large to diff

+ doc/bugs/git_annex_get_choke_when_remote_is_an_ssh_url_with_a_port.mdwn view

file too large to diff

+ doc/bugs/git_annex_gets_confused_about_remotes_with_dots_in_their_names.mdwn view

file too large to diff

+ doc/bugs/git_annex_import_destroys_a_fellow_git_annex_repository.mdwn view

file too large to diff

+ doc/bugs/git_annex_importfeed_fails.mdwn view

file too large to diff

+ doc/bugs/git_annex_indirect_can_fail_catastrophically.mdwn view

file too large to diff

+ doc/bugs/git_annex_initremote_needs_some___34__error_checking__34__.mdwn view

file too large to diff

+ doc/bugs/git_annex_initremote_walks_.git-annex.mdwn view

file too large to diff

+ doc/bugs/git_annex_map_has_problems_with_urls_containing___126__.mdwn view

file too large to diff

+ doc/bugs/git_annex_migrate_leaves_old_backend_versions_around.mdwn view

file too large to diff

+ doc/bugs/git_annex_should_use___39__git_add_-f__39___internally.mdwn view

file too large to diff

+ doc/bugs/git_annex_sync_in_direct_mode_does_not_honor_skip-worktree.mdwn view

file too large to diff

+ doc/bugs/git_annex_uninit_loses_content_when_interrupted.mdwn view

file too large to diff

+ doc/bugs/git_annex_uninit_removes_files_not_previously_added_to_annex.mdwn view

file too large to diff

+ doc/bugs/git_annex_unlock_is_not_atomic.mdwn view

file too large to diff

+ doc/bugs/git_annex_unused_aborts_due_to_filename_encoding_problems.mdwn view

file too large to diff

+ doc/bugs/git_annex_unused_failes_on_empty_repository.mdwn view

file too large to diff

+ doc/bugs/git_annex_unused_seems_to_check_for_current_path.mdwn view

file too large to diff

+ doc/bugs/git_annex_upgrade_output_is_inconsistent_and_spammy.mdwn view

file too large to diff

+ doc/bugs/git_annex_version_should_without_being_in_a_repo_.mdwn view

file too large to diff

+ doc/bugs/git_annex_webapp_--listen_on_a_remote_linux_server.mdwn view

file too large to diff

+ doc/bugs/git_annex_webapp_runs_on_wine.mdwn view

file too large to diff

+ doc/bugs/git_annex_won__39__t_copy_files_to_my_usb_drive.mdwn view

file too large to diff

+ doc/bugs/git_annix_breaks_git_commit_after_uninstall.mdwn view

file too large to diff

+ doc/bugs/git_defunct_processes___40__child_of_git-annex_assistant__41__.mdwn view

file too large to diff

+ doc/bugs/git_rename_detection_on_file_move.mdwn view

file too large to diff

+ doc/bugs/git_version_in_prebuilt_linux_tarball_is_outdated.mdwn view

file too large to diff

+ doc/bugs/gix-annex_help_is_homicidal.mdwn view

file too large to diff

+ doc/bugs/glacier_from_multiple_repos.mdwn view

file too large to diff

+ doc/bugs/googlemail.mdwn view

file too large to diff

+ doc/bugs/gpg_bundled_with_OSX_build_fails.mdwn view

file too large to diff

+ doc/bugs/gpg_error_on_android.mdwn view

file too large to diff

+ doc/bugs/gpg_goes_to_100__37___cpu_on_bad_input_data.mdwn view

file too large to diff

+ doc/bugs/gpg_hangs_on_glacier_remote_creation.mdwn view

file too large to diff

+ doc/bugs/gpg_needs_--use-agent.mdwn view

file too large to diff

+ doc/bugs/hGetContents:_user_error.mdwn view

file too large to diff

+ doc/bugs/host_with_rysnc_installed__44___not_recognized.mdwn view

file too large to diff

+ doc/bugs/immediately_drops_files.mdwn view

file too large to diff

+ doc/bugs/importfeed_fails__44___bad_feed_content.mdwn view

file too large to diff

+ doc/bugs/importfeed_uses___34____95__foo__34___as_extension.mdwn view

file too large to diff

+ doc/bugs/inconsistent_use_of_SI_prefixes.mdwn view

file too large to diff

+ doc/bugs/internal_server_error_creating_repo_on_ssh_server.mdwn view

file too large to diff

+ doc/bugs/interrupting_migration_causes_problems.mdwn view

file too large to diff

+ doc/bugs/javascript_functions_qouting_issue.mdwn view

file too large to diff

+ doc/bugs/journal_commit_error_when_using_annex.mdwn view

file too large to diff

+ doc/bugs/long_running_assistant_causes_resource_starvation_on_OSX.mdwn view

file too large to diff

+ doc/bugs/lsof__47__committer_thread_loops_occassionally.mdwn view

file too large to diff

+ doc/bugs/make_SHA512E_the_default.mdwn view

file too large to diff

+ doc/bugs/make_install_can__39__t_be_used_with_sudo.mdwn view

file too large to diff

+ doc/bugs/make_install_doesn__39__t_create_git-annex-shell.mdwn view

file too large to diff

+ doc/bugs/making_annex-merge_try_a_fast-forward.mdwn view

file too large to diff

+ doc/bugs/manpage_has_slight_indentation_error.mdwn view

file too large to diff

+ doc/bugs/map_not_respecting_annex_ssh_options__63__.mdwn view

file too large to diff

+ doc/bugs/merge_causes_out_of_memory_on_large_repos.mdwn view

file too large to diff

+ doc/bugs/migrated_files_not_showing_up_in_unused_list.mdwn view

file too large to diff

+ doc/bugs/minor_bug:_errors_are_not_verbose_enough.mdwn view

file too large to diff

+ doc/bugs/missing_dependency_in_git-annex-3.20130216.mdwn view

file too large to diff

+ doc/bugs/missing_kde__47__gnome_menu_item..mdwn view

file too large to diff

+ doc/bugs/moreinfo.mdwn view

file too large to diff

+ doc/bugs/nfs_mounted_repo_results_in_errors_on_drop_move.mdwn view

file too large to diff

+ doc/bugs/non-annexed_file_changed_to_annexed_on_typechange.mdwn view

file too large to diff

+ doc/bugs/not_possible_to_have_annex_on_a_separate_filesystem.mdwn view

file too large to diff

+ doc/bugs/old_data_isn__39__t_unused_after_migration.mdwn view

file too large to diff

+ doc/bugs/on--git-dir_and_--work-tree_options.mdwn view

file too large to diff

+ doc/bugs/ordering.mdwn view

file too large to diff

+ doc/bugs/pasting_into_annex_on_OSX.mdwn view

file too large to diff

+ doc/bugs/problem_commit_normal_links.mdwn view

file too large to diff

+ doc/bugs/problem_with_upgrade_v2_-__62___v3.mdwn view

file too large to diff

+ doc/bugs/problems_with_utf8_names.mdwn view

file too large to diff

+ doc/bugs/random_files_vanishing_when_assistant_gets_restarted.mdwn view

file too large to diff

+ doc/bugs/reinject_should_leave_file_in_place_on_checksum_mismatch.mdwn view

file too large to diff

+ doc/bugs/removable_device_configurator_chokes_on_spaces.mdwn view

file too large to diff

+ doc/bugs/rename:_permission_denied__44___after_direct_mode_switch.mdwn view

file too large to diff

+ doc/bugs/restart_daemon_required.mdwn view

file too large to diff

+ doc/bugs/rsync_remote_shows_no_progress.mdwn view

file too large to diff

+ doc/bugs/scp_interrupt_to_background.mdwn view

file too large to diff

+ doc/bugs/show_version_without_having_to_be_in_a_git_repo.mdwn view

file too large to diff

+ doc/bugs/signal_weirdness.mdwn view

file too large to diff

+ doc/bugs/smarter_flood_filling.mdwn view

file too large to diff

file too large to diff

+ doc/bugs/ssh-keygen_failed_when_adding_remote_server_repo.mdwn view

file too large to diff

+ doc/bugs/ssh_connection_caching_broken_on_NTFS.mdwn view

file too large to diff

+ doc/bugs/submodule_path_problem.mdwn view

file too large to diff

+ doc/bugs/test_suite_failure_on_samba_mount.mdwn view

file too large to diff

+ doc/bugs/test_suite_shouldn__39__t_fail_silently.mdwn view

file too large to diff

+ doc/bugs/tests_fail_when_there_is_no_global_.gitconfig_for_the_user.mdwn view

file too large to diff

+ doc/bugs/tests_failed_to_build_-_after_an_update_of_haskell_platform.mdwn view

file too large to diff

+ doc/bugs/three_character_directories_created.mdwn view

file too large to diff

+ doc/bugs/three_way_sync_via_S3_and_Jabber.mdwn view

file too large to diff

+ doc/bugs/tmp_file_handling.mdwn view

file too large to diff

+ doc/bugs/touch.hsc_has_problems_on_non-linux_based_systems.mdwn view

file too large to diff

+ doc/bugs/transferkey_fails_due_to_gpg.mdwn view

file too large to diff

+ doc/bugs/typo_in___34__ready_to_add_remote_server__34___message.mdwn view

file too large to diff

+ doc/bugs/unable_to_change_repository_group_of___34__here__34__.mdwn view

file too large to diff

+ doc/bugs/unannex_and_uninit_do_not_work_when_git_index_is_broken.mdwn view

file too large to diff

+ doc/bugs/unannex_command_doesn__39__t_all_files.mdwn view

file too large to diff

+ doc/bugs/unannex_removes_object_even_if_referred_to_by_others.mdwn view

file too large to diff

+ doc/bugs/unannex_vs_unlock_hook_confusion.mdwn view

file too large to diff

+ doc/bugs/undefined.mdwn view

file too large to diff

+ doc/bugs/unfinished_repos_in_webapp.mdwn view

file too large to diff

+ doc/bugs/unhappy_without_UTF8_locale.mdwn view

file too large to diff

+ doc/bugs/uninit_and_indirect_don__39__t_work_on_android.mdwn view

file too large to diff

file too large to diff

+ doc/bugs/uninit_does_not_work_in_old_repos.mdwn view

file too large to diff

+ doc/bugs/uninit_loses_data_if_git-annex_add_didn__39__t_complete.mdwn view

file too large to diff

+ doc/bugs/uninit_should_not_run_when_branch_git-annex_is_checked_out.mdwn view

file too large to diff

+ doc/bugs/unlock_fails_silently_with_directory_symlinks.mdwn view

file too large to diff

+ doc/bugs/unlock_not_working_on_os_x_10.6_-_cp:_illegal_option_--_-_.mdwn view

file too large to diff

+ doc/bugs/unlock_then_lock_of_uncommitted_file_loses_it.mdwn view

file too large to diff

+ doc/bugs/upgrade_left_untracked_.git-annex__47____42___directories.mdwn view

file too large to diff

+ doc/bugs/uploads_queued_to_annex-ignore_remotes.mdwn view

file too large to diff

+ doc/bugs/using_old_remote_format_generates_irritating_output.mdwn view

file too large to diff

+ doc/bugs/utf8.mdwn view

file too large to diff

+ doc/bugs/utf8/comment_10_f298b8b480d3ab2dd9c279589afcd0ea._comment view

file too large to diff

+ doc/bugs/utf8/comment_11_a8864a46f8154680beeea27449ac6f09._comment view

file too large to diff

+ doc/bugs/utf8/comment_12_2202c3479d19d306f31aac5a47b55e7d._comment view

file too large to diff

+ doc/bugs/utf8/comment_13_7044d2c5bb1c91ee37eb9868963a1ff2._comment view

file too large to diff

+ doc/bugs/utf8/comment_14_656b3caa16ae93b092fb5804fa575a3b._comment view

file too large to diff

+ doc/bugs/utf8/comment_15_25b3d4c47c45b72129b17b171a45c5f9._comment view

file too large to diff

+ doc/bugs/utf8/comment_16_2aaab9253bbc75012292c7b5a7d55696._comment view

file too large to diff

+ doc/bugs/utf8/comment_1_416ad6fb5f7379732129dc5283a7e550._comment view

file too large to diff

+ doc/bugs/utf8/comment_2_cd55f6bbeb145fd554f331dcff64f5e1._comment view

file too large to diff

+ doc/bugs/utf8/comment_3_bb583a419d6fa4e33e5364c4468b35c6._comment view

file too large to diff

+ doc/bugs/utf8/comment_4_cd8a22cfb70d9d21f0a5339ccc52ee93._comment view

file too large to diff

+ doc/bugs/utf8/comment_5_14eefd4bee283802e9c462fa20b7835c._comment view

file too large to diff

+ doc/bugs/utf8/comment_6_58d8b5bdb9f11e8c344e86a675a075dd._comment view

file too large to diff

+ doc/bugs/utf8/comment_7_00fa9672ce55b6bfa885b8a13287ac25._comment view

file too large to diff

+ doc/bugs/utf8/comment_8_a01e26fa0fafbc291020f53dbfdf6443._comment view

file too large to diff

+ doc/bugs/utf8/comment_9_b7c084be01ce985be51e48503fcba468._comment view

file too large to diff

+ doc/bugs/uuid.log_trust.log_and_remote.log_merge_wackiness.mdwn view

file too large to diff

+ doc/bugs/view_logs_fails:_Internal_Server_Error__internal_liftAnnex.mdwn view

file too large to diff

+ doc/bugs/watch_command_on_OSX_--_hangs_with_a_small_repo.mdwn view

file too large to diff

+ doc/bugs/watch_command_on_OSX_10.7.mdwn view

file too large to diff

+ doc/bugs/watcher_commits_unlocked_files.mdwn view

file too large to diff

+ doc/bugs/webapp:_difficult_to_abort_adding_a_repository.mdwn view

file too large to diff

+ doc/bugs/webapp_hang.mdwn view

file too large to diff

+ doc/bugs/webapp_hang/comment_1_08aa908a64d0fe2d50438d01545c3f01._comment view

file too large to diff

+ doc/bugs/webapp_hang/comment_2_2a21ac5657128a454f9deb77c4d18057._comment view

file too large to diff

+ doc/bugs/webapp_requires_reload_for_notification_bubbles.mdwn view

file too large to diff

+ doc/bugs/webapp_shows___34__Added_x_files__34___a_bit_ugly.mdwn view

file too large to diff

+ doc/bugs/webapp_usability:_put_the_notices_on_the_right.mdwn view

file too large to diff

+ doc/bugs/weird_local_clone_confuses.mdwn view

file too large to diff

+ doc/bugs/whereis_outputs_no_informaiton_for_unlocked_files.mdwn view

file too large to diff

+ doc/bugs/windows_fails_test___34__recoverEncode__34__.mdwn view

file too large to diff

+ doc/bugs/windows_install_failure.mdwn view

file too large to diff

+ doc/bugs/windows_port_-_can__39__t_directly_access_files.mdwn view

file too large to diff

+ doc/bugs/windows_port_-_repo_can__39__t_pull_newly_added_files_.mdwn view

file too large to diff

+ doc/bugs/xdg-user-dir_error.mdwn view

file too large to diff

+ doc/bugs/xmpp_needs_one_account_per_distinct_repository.mdwn view

file too large to diff

+ doc/bugs/yesod-default_is_needed_as_a_dependancy.mdwn view

file too large to diff

+ doc/bugs/yesod-form_missing.mdwn view

file too large to diff

+ doc/bugs/youtube_support_suddenly_stopped_working.mdwn view

file too large to diff

+ doc/builds.mdwn view

file too large to diff

+ doc/coding_style.mdwn view

file too large to diff

+ doc/comments.mdwn view

file too large to diff

+ doc/contact.mdwn view

file too large to diff

+ doc/contact/comment_1_12d60f767d90bea94974e1ff6b206d31._comment view

file too large to diff

+ doc/contact/comment_2_95b6d868b913418de50ba121d71d2390._comment view

file too large to diff

+ doc/contact/comment_3_2cf43bd406673294e6cdbd785c4a0d0c._comment view

file too large to diff

+ doc/contact/comment_4_586a506e27379d74fbc0f4b654e89c7d._comment view

file too large to diff

+ doc/copies.mdwn view

file too large to diff

+ doc/copies/comment_1_af9bee33777fb8a187b714fc8c5fb11d._comment view

file too large to diff

+ doc/design.mdwn view

file too large to diff

+ doc/design/assistant.mdwn view

file too large to diff

+ doc/design/assistant/OSX.mdwn view

file too large to diff

+ doc/design/assistant/OSX/comment_1_9290f6e6f265e906b08631224392b7bf._comment view

file too large to diff

+ doc/design/assistant/android.mdwn view

file too large to diff

+ doc/design/assistant/blog.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_100__cursed_clouds.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_102__very_high_level_programming.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_103__bugfix_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_104__misc.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_105__lazy_Sunday.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_106__lazy_Monday.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_107__memory_leak.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_108__another_zombie_outbreak.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_109__dropping.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_10__lsof.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_110__more_dropping.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_111__config_monitor.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_113__notifier_work.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_114__xmpp.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_115__my_new_form.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_116__the_segfault.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_117__new_topologies.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_118__monadic_discontinuity.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_119__time_for_testing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_11__freebsd.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_120__test_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_121__buddy_list.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_122__xmpp_pairing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_123__xmpp_insanity.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_124__git_push_over_xmpp_groundwork.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_125__xmpp_push_continues.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_126__mr_watson_come_here.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_127__xmpp_syncs.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_128__last_xmpp_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_129__release.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_12__freebsd_redux.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_130__what_now.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_131__webdav_groundwork.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_132__webdav_continued.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_133__webdav_working.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_134__box.com_configurator.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_135__progress_revisited.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_136__misc.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_137__Glacier.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_138__back.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_139__catch_up.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_13__kqueue_continued.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_140__release_monday.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_141__release_tuesday.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_142__filling_in.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_143__what_next.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_144__webapp_work.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_145__more_webapp_work.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_146__meanwhile.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_147__direct_mode.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_148__direct_mode.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_149__rainy_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_14__kqueue_kqueue_kqueue.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_14__thinking_about_syncing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_150__12:12.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_151__direct_mode_toggle.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_152__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_153__hibernation.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_154__direct_mode_merging.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_155__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_156_and_157__direct_mode_assistant.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_158__fsevents.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_159__fsevents_and_assistant.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_15__its_aliiive.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_160__finishing_up_direct_mode.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_161__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_162__UI.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_163__free_features.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_164__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_165__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_166__a_short_long_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_167__safe_direct_mode_transfers.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_168__back_to_theme.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_169__direct_mode_is_safe.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_16__more_robust_syncing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_170__bugfixes_and_release.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_171__logs.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_172__short_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_173__snow_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_174__last_weekend_before_AU.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_175__pacific_features.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_176__thread_management.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_178__bus_hacking.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_179__brief_updates.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_17__push_queue_prune.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_180__back.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_181__triage.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_182__it_begins.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_183__plan_b.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_184__just_wanna_run_something.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_185__android_liftoff.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_186__Android_success.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_187__porting_utilities.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_188__crippled_filesystem_support.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_189__more_crippling.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_18__merging.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_190-191__weekend.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_192_193__more_porting.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_194__nice_moment.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_195__real_android_app.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_196__android_bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_197__template_haskell.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_198__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_199__wrapping_up_Android_for_now.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_19__random_improvements.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_1__inotify.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_200__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_201__real_Android_wrapup.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_201__real_Android_wrapup/fib.png view

file too large to diff

+ doc/design/assistant/blog/day_201__working_web_server.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_203__procrastination.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_204__deprocrastination.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_205_206__rainy_day__snow_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_207__XMPP.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_208__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_209__The_Bug.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_20__data_transfer_design.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_210__spring.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_211__zooming_along.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_212__accidental_all_nighter.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_213__costs.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_214__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_215__dashboard_UI_refresh.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_216__more_bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_217__nothing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_219__bug_triage.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_21__transfer_tracking.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_220__performance.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_221__this_and_that.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_222__back.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_223__progress_revisited.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_224__annex.largefiles.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_225__back_from_the_dead.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_226__poll_results.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_227__bigfixing_all_day_today.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_228__more_work_on_repository_removals.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_229__rainy_day_bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_22__horrible_option_parsing_hack.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_230__Mom.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_231__insert_title.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_232__headless_webapp.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_233__taxes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_234__clean_shutdown.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_235__birthday.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_236__evil_splicer.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_237__gnome-keyring_craziness.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_238__back_to_Android.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_239__bugfixes_and_frustration.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_23__transfer_watching.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_240__it_builds.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_241__cleanup.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_242__more_porting.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_243__in_the_field.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_244__android_porting.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_245__misc.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_246__bug_treadmill.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_247__performance_tuning.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_248__Internet_Archive.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_249__quiet_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_24__airport_digressions.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_250__stymied.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_251__xmpp_improvements.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_252__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_253__OMG.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_254__Android_app_polishing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_255__Debian_release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_256__8bit.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_257__rainy_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_258__beginning_of_the_end.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_259__Android_dominos_toppling.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_25__transfer_queueing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_260__Windows_dev_environment.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_261__Windows_first_stage_complete.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_262__DOS_path_separators.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_263_catching_up.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_264__Windows_second_stage_complete.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_265__correctness.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_266__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_267__windows_autobuilder.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_268__core_monad_change.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_269__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_26__dying_drives.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_270__release_and_xmpp.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_271__more_xmpp.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_272__fuzz_tester.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_273-274__fun.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_275__working_hard_or.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_276__fuzzing_continues.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_277__private_static_protected_void.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_278__winding_down.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_279__final_release_prep.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_27__robust_transfers.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_28-35__threaded_runtime_tarpit.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_280__yesod.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_281__back.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_282-283__caught_up.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_284__porting.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_285__fixed_the_archive_directory_loop.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_286__Windows_test_suite.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_287__niceness.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_288__success_stories.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_289__back_in_the_swing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_290__https_release.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_291__--all.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_292__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_293__gpg_builds.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_294__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_295__balls_in_the_air.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_296__new_crowdfunding_campaign.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_297__back_to_work.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_298__exceptional.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_299__bugfixing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_2__races.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_300__new_logo.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_301__direct_unannex.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_302_release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_303__oops.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_304__dropunused_safety.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_305__interesting_bugs.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_306__offtopic.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_307__buuuugs.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_308__ssh-agent.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_309__filenames.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_310__release_day.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_311__Windows_porting.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_312__DebConf_midpoint.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_313__back.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_314__quvi.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_315__backlog.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_316__day_off.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_317__misc.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_36__minimal_test_case.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_37__back.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_39__twice_is_enemy_action.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_3__more_races.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_40__dbus.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_41__foo.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_42__the_answer.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_43__simple_scanner.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_44__webapp_basics.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_45__long_polling.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_45__long_polling/full.png view

file too large to diff

+ doc/design/assistant/blog/day_45__long_polling/phone.png view

file too large to diff

+ doc/design/assistant/blog/day_46__notification_pools.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_47__alert_messages.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_48__intro.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_49__first_run_experience.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_4__speed.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_50__directory_name.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_51__desktop.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_52__file_browser.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_54__adding_removable_drives.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_55__alerts.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_56__transfer_control.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_57__afk.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_58__more_transfer_control.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_59__dinner.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_5__committing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_60__taking_stock.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_61__network_connection_detection.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_62__smarter_syncing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_63__transfer_retries.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_64__syncing_robustly.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_65__transfer_polish.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_66__the_merge.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_67__progress_bars.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_68__transfers.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_69__build_fixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_6__polish.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_70__adding_ssh_remotes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_71__ssh_probing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_73__rsync.net_configurator.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_74__bits_and_peices.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_75__zeromq_and_pairing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_76__pairing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_77_alert_buttons.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_78__pairing_continued.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_79__pairing_finished.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_7__bugfixes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_7__bugfixes/profile.png view

file too large to diff

+ doc/design/assistant/blog/day_7__bugfixes/profile2.png view

file too large to diff

+ doc/design/assistant/blog/day_80__default_backend.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_81__enabling_pre-existing_special_remotes.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_82__git-annex_branch_work.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_83__3-way.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_84__deferred_downloads.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_85__more_foundation_work.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_86__towards_the_beta.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_87__more_progress_progress.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_88__progressbars_still_progressing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_89__final_polish.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_8__speed.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_90__beta.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_91__break.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_92__S3.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_93__OSX_standalone_app.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_93__easy_install.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_95__repository_groups.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_96__revisiting_file_adds.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_97__stuffing.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_98__preferred_content.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_99_shotgun.mdwn view

file too large to diff

+ doc/design/assistant/blog/day_9__correctness.mdwn view

file too large to diff

+ doc/design/assistant/chunks.mdwn view

file too large to diff

+ doc/design/assistant/cloud.mdwn view

file too large to diff

+ doc/design/assistant/comment_10_f2233fad55c20686cf299bf6788f1f23._comment view

file too large to diff

+ doc/design/assistant/comment_11_a38f0f21c2346e65b786d791b6829f9b._comment view

file too large to diff

+ doc/design/assistant/comment_12_5e991177d6577384f39a36ae02f5f574._comment view

file too large to diff

+ doc/design/assistant/comment_13_f8625c6f43b58847840df338a73b7972._comment view

file too large to diff

+ doc/design/assistant/comment_14_c37ef5931b0f5c1f808083e0d636a208._comment view

file too large to diff

+ doc/design/assistant/comment_15_68c98a27083567f20c2e6bc2a760991b._comment view

file too large to diff

+ doc/design/assistant/comment_16_8e6788c817c60371d2a2f158e1a65f87._comment view

file too large to diff

+ doc/design/assistant/comment_17_97bdfacac5ac492281c9454ee4c0228e._comment view

file too large to diff

+ doc/design/assistant/comment_18_53137b2df4913496c0afb2d895aa4ee2._comment view

file too large to diff

+ doc/design/assistant/comment_19_ff1b0ba57e22ed757ec3fc5400b5e43e._comment view

file too large to diff

+ doc/design/assistant/comment_1_a48fcfbf97f0a373ea375cd8f07f0fc8._comment view

file too large to diff

+ doc/design/assistant/comment_20_099da245e3276fa84f5e14312d186621._comment view

file too large to diff

+ doc/design/assistant/comment_2_6d3552414fdcc2ed3244567e6c67989d._comment view

file too large to diff

+ doc/design/assistant/comment_3_05223be50c889b2ed6bc4abf74116450._comment view

file too large to diff

+ doc/design/assistant/comment_4_fbbd93b55803ae21e6ba4b6568c2fafd._comment view

file too large to diff

+ doc/design/assistant/comment_5_f4e9af3fed6c27e8ff39badb9794064d._comment view

file too large to diff

+ doc/design/assistant/comment_6_c7ad07cade1f44f9a8b61f92225bb9c5._comment view

file too large to diff

+ doc/design/assistant/comment_7_609d38e993267195a80fecd84c93d1e2._comment view

file too large to diff

+ doc/design/assistant/comment_8_22b818e1a2a825efb78139271a14f944._comment view

file too large to diff

+ doc/design/assistant/comment_9_d052e2142da8b4838fb1edf791ea23ae._comment view

file too large to diff

+ doc/design/assistant/configurators.mdwn view

file too large to diff

+ doc/design/assistant/deltas.mdwn view

file too large to diff

+ doc/design/assistant/desymlink.mdwn view

file too large to diff

+ doc/design/assistant/disaster_recovery.mdwn view

file too large to diff

+ doc/design/assistant/encrypted_git_remotes.mdwn view

file too large to diff

+ doc/design/assistant/gpgkeys.mdwn view

file too large to diff

+ doc/design/assistant/inotify.mdwn view

file too large to diff

+ doc/design/assistant/leftovers.mdwn view

file too large to diff

+ doc/design/assistant/more_cloud_providers.mdwn view

file too large to diff

+ doc/design/assistant/pairing.mdwn view

file too large to diff

+ doc/design/assistant/partial_content.mdwn view

file too large to diff

+ doc/design/assistant/polls.mdwn view

file too large to diff

+ doc/design/assistant/polls/Android.mdwn view

file too large to diff

+ doc/design/assistant/polls/Android_default_directory.mdwn view

file too large to diff

+ doc/design/assistant/polls/goals_for_April.mdwn view

file too large to diff

+ doc/design/assistant/polls/prioritizing_special_remotes.mdwn view

file too large to diff

+ doc/design/assistant/progressbars.mdwn view

file too large to diff

+ doc/design/assistant/rate_limiting.mdwn view

file too large to diff

+ doc/design/assistant/screenshot/firstrun.png view

file too large to diff

+ doc/design/assistant/screenshot/intro.png view

file too large to diff

+ doc/design/assistant/sshpassword.mdwn view

file too large to diff

+ doc/design/assistant/syncing.mdwn view

file too large to diff

+ doc/design/assistant/todo.mdwn view

file too large to diff

+ doc/design/assistant/transfer_control.mdwn view

file too large to diff

+ doc/design/assistant/webapp.mdwn view

file too large to diff

+ doc/design/assistant/windows.mdwn view

file too large to diff

+ doc/design/assistant/xmpp.mdwn view

file too large to diff

+ doc/design/assistant/xmpp_security.mdwn view

file too large to diff

+ doc/design/encryption.mdwn view

file too large to diff

+ doc/design/encryption/comment_1_4715ffafb3c4a9915bc33f2b26aaa9c1._comment view

file too large to diff

+ doc/design/encryption/comment_2_a610b3d056a059899178859a3a821ea5._comment view

file too large to diff

+ doc/design/encryption/comment_3_cca186a9536cd3f6e86994631b14231c._comment view

file too large to diff

+ doc/design/encryption/comment_4_8f3ba3e504b058791fc6e6f9c38154cf._comment view

file too large to diff

+ doc/design/encryption/comment_5_520e60aa53217b5ba428d4c05d897dee._comment view

file too large to diff

+ doc/design/encryption/comment_6_d677fead0fe0c543f48f07d85f83f592._comment view

file too large to diff

+ doc/design/encryption/comment_7_c1c38a09b1276e29adc3ba564dc0fe4e._comment view

file too large to diff

+ doc/design/gcrypt.mdwn view

file too large to diff

+ doc/design/roadmap.mdwn view

file too large to diff

+ doc/devblog.mdwn view

file too large to diff

+ doc/devblog/day_-1__drop_dead.mdwn view

file too large to diff

+ doc/devblog/day_-3__.mdwn view

file too large to diff

+ doc/devblog/day_-4__forgetting.mdwn view

file too large to diff

+ doc/devblog/day_10__lazy_Sunday.mdwn view

file too large to diff

+ doc/devblog/day_11__webapp_encrypted_drives.mdwn view

file too large to diff

+ doc/devblog/day_12__gpg_key_generation.mdwn view

file too large to diff

+ doc/devblog/day_13__encrypted_sneakernet_working.mdwn view

file too large to diff

+ doc/devblog/day_14__gcrypt_refinements_and_OOM_fixes.mdwn view

file too large to diff

+ doc/devblog/day_15-17__Android_rebuild.mdwn view

file too large to diff

+ doc/devblog/day_19__moving_on.mdwn view

file too large to diff

+ doc/devblog/day_1__inauspicious_beginning.mdwn view

file too large to diff

+ doc/devblog/day_20__gcrypt_and_git-annex-shell.mdwn view

file too large to diff

+ doc/devblog/day_21__bugfix_day.mdwn view

file too large to diff

+ doc/devblog/day_22__gcrypt_on_rsync.net.mdwn view

file too large to diff

+ doc/devblog/day_23__GNU_day.mdwn view

file too large to diff

+ doc/devblog/day_24__nearly_done_with_gcrypt.mdwn view

file too large to diff

+ doc/devblog/day_25__finishing_up_gcrypt.mdwn view

file too large to diff

+ doc/devblog/day_26__gcrypt_really_done_this_time.mdwn view

file too large to diff

+ doc/devblog/day_27__locking_fun.mdwn view

file too large to diff

+ doc/devblog/day_28__lazy_saturday.mdwn view

file too large to diff

+ doc/devblog/day_29__scheduling.mdwn view

file too large to diff

+ doc/devblog/day_2__new_laptop.mdwn view

file too large to diff

+ doc/devblog/day_30__cronner.mdwn view

file too large to diff

+ doc/devblog/day_31__blah.mdwn view

file too large to diff

+ doc/devblog/day_32__fsck_config_UI.mdwn view

file too large to diff

+ doc/devblog/day_33__fsck_on_connect.mdwn view

file too large to diff

+ doc/devblog/day_34__wrapping_up_fsck.mdwn view

file too large to diff

+ doc/devblog/day_35__anacron_and_bugfixing.mdwn view

file too large to diff

+ doc/devblog/day_36__bugfixing.mdwn view

file too large to diff

+ doc/devblog/day_37__long_day.mdwn view

file too large to diff

+ doc/devblog/day_38__starting_git_repo_repair.mdwn view

file too large to diff

+ doc/devblog/day_39__git-recover-repository.mdwn view

file too large to diff

+ doc/devblog/day_3__gcrypt_uuids.mdwn view

file too large to diff

+ doc/devblog/day_40__another_fine_mess.mdwn view

file too large to diff

+ doc/devblog/day_41__onward.mdwn view

file too large to diff

+ doc/devblog/day_42__repair_milestone.mdwn view

file too large to diff

+ doc/devblog/day_4__unexpected_windows_day.mdwn view

file too large to diff

+ doc/devblog/day_5__gcrypt_special_remote_part_1.mdwn view

file too large to diff

+ doc/devblog/day_6__gcrypt_fully_working.mdwn view

file too large to diff

+ doc/devblog/day_7__release_day.mdwn view

file too large to diff

+ doc/devblog/day_8__ill.mdwn view

file too large to diff

+ doc/devblog/day_9__Friday_the_13th.mdwn view

file too large to diff

+ doc/devblog/moving_blogs.mdwn view

file too large to diff

+ doc/devblog/moving_blogs/comment_1_6caa7e67461a6ea5de8155ae9cf75fab._comment view

file too large to diff

+ doc/devblog/moving_blogs/comment_2_e3e2048fc2397b87a2f29c9fe49394cb._comment view

file too large to diff

+ doc/direct_mode.mdwn view

file too large to diff

+ doc/direct_mode/comment_10_94284a476604e9c812b7ee475ca22959._comment view

file too large to diff

+ doc/direct_mode/comment_11_1c79c93f4b17cfc354ab920e3775cc60._comment view

file too large to diff

+ doc/direct_mode/comment_12_1b5218fdb6ee362d6df68ff1229590d4._comment view

file too large to diff

+ doc/direct_mode/comment_13_55108ac736ea450df89332ba5de4a208._comment view

file too large to diff

+ doc/direct_mode/comment_14_ff4ffc2aabc5fd174d7386ef13860f78._comment view

file too large to diff

+ doc/direct_mode/comment_15_1cd32456630b25d5aaa6d2763e6eb384._comment view

file too large to diff

+ doc/direct_mode/comment_1_93fc31e8dc0ad16248a2593a1482d375._comment view

file too large to diff

+ doc/direct_mode/comment_2_7f7086b34ed136851963f145868a1d23._comment view

file too large to diff

+ doc/direct_mode/comment_3_8020d74bddf0e38b0a297e5dae7c217b._comment view

file too large to diff

+ doc/direct_mode/comment_4_97c26bd82f623a3b2d56bab4afff0126._comment view

file too large to diff

+ doc/direct_mode/comment_5_42363bf0367f935b3eee8ad3d2eaf5cf._comment view

file too large to diff

+ doc/direct_mode/comment_6_5f03b1686c1fb3f7606a5bc724ac3812._comment view

file too large to diff

+ doc/direct_mode/comment_7_5355ac418bfb26e990762b80f4c36b77._comment view

file too large to diff

+ doc/direct_mode/comment_8_6cd15e2c5fd0bef48f60c6993322c2fc._comment view

file too large to diff

+ doc/direct_mode/comment_9_cff56dbcdfec60375c30d5b1b1c60614._comment view

file too large to diff

+ doc/distributed_version_control.mdwn view

file too large to diff

+ doc/download.mdwn view

file too large to diff

+ doc/download/comment_1_ec2578241a966cfcdd43f2a26a5c8709._comment view

file too large to diff

+ doc/download/comment_2_ee0d158ac59903737dbc4ef632f11fe3._comment view

file too large to diff

+ doc/encryption.mdwn view

file too large to diff

+ doc/encryption/comment_1_1afca8d7182075d46db41f6ad3dd5911._comment view

file too large to diff

+ doc/feeds.mdwn view

file too large to diff

+ doc/footer/column_a.mdwn view

file too large to diff

+ doc/footer/column_b.mdwn view

file too large to diff

+ doc/forum.mdwn view

file too large to diff

+ doc/forum/A_really_stupid_question.mdwn view

file too large to diff

+ doc/forum/Accessing_files_directly_on__a_USB_device.mdwn view

file too large to diff

+ doc/forum/Accessing_files_in_bare_repository.mdwn view

file too large to diff

+ doc/forum/Adding_existing_S3_bucket_to_sync_with.mdwn view

file too large to diff

+ doc/forum/Android:_is_constant_high_cpu_usage_to_be_expected__63__.mdwn view

file too large to diff

+ doc/forum/Annex_contents_just_disappeared__63__.mdwn view

file too large to diff

+ doc/forum/Annex_dropping_files.mdwn view

file too large to diff

+ doc/forum/Assistant:_configure_auto-sync.mdwn view

file too large to diff

+ doc/forum/Assistant_not_syncing_to_Rsync.mdwn view

file too large to diff

+ doc/forum/Auto_archiving.mdwn view

file too large to diff

+ doc/forum/Automatic_commit_messages_for_git_annex_sync.mdwn view

file too large to diff

+ doc/forum/Automatically_syncronise_centralised_repository.mdwn view

file too large to diff

+ doc/forum/Behaviour_of_fsck.mdwn view

file too large to diff

+ doc/forum/Best_way_to_manage_files_on_removable_media__63__.mdwn view

file too large to diff

+ doc/forum/Box.com_hasn__39__t_been_working_for_a_few_days.mdwn view

file too large to diff

+ doc/forum/Building_a_Debian_package_of_git-annex.mdwn view

file too large to diff

+ doc/forum/Building_git-annex-3.20121112-19309.mdwn view

file too large to diff

+ doc/forum/Cabal:_Could_not_resolve_dependencies___40__yesod__41__.mdwn view

file too large to diff

+ doc/forum/Calculating_Annex_Cost_by_Ping_Times.mdwn view

file too large to diff

+ doc/forum/Can__39__t_get_git-annex_merge_to_work_from_git_hook.mdwn view

file too large to diff

+ doc/forum/Can__39__t_get_pairing_to_work.mdwn view

file too large to diff

+ doc/forum/Can__39__t_init_git_annex.mdwn view

file too large to diff

+ doc/forum/Can__39__t_install:_Mac_OS_10.8.2.mdwn view

file too large to diff

+ doc/forum/Can_we_have_remotes_that_aren__39__t_tracked__63___.mdwn view

file too large to diff

+ doc/forum/Cannot_find_git-annex_in_server.mdwn view

file too large to diff

+ doc/forum/Cannot_launch_webapp_on_ubuntu_12.04_using_ppa.mdwn view

file too large to diff

+ doc/forum/Centralized_repository_with_webapp.mdwn view

file too large to diff

+ doc/forum/Check_if_remote_is_using_GPG__63__.mdwn view

file too large to diff

+ doc/forum/Check_when_your_last_fsck_was__63__.mdwn view

file too large to diff

+ doc/forum/Cleaning_up_after_aborted_sync_in_direct_mode.mdwn view

file too large to diff

+ doc/forum/Coming_from_git_world.mdwn view

file too large to diff

+ doc/forum/DBus_on_Ubuntu_12.04__63__.mdwn view

file too large to diff

+ doc/forum/DS__95__Store_files_are_not_added.mdwn view

file too large to diff

+ doc/forum/Debugging_Git_Annex.mdwn view

file too large to diff

+ doc/forum/Default_text__47__html_handler.mdwn view

file too large to diff

+ doc/forum/Delete_unused_files__47__metadata.mdwn view

file too large to diff

+ doc/forum/Deleting_Unused_Files_by_Age.mdwn view

file too large to diff

+ doc/forum/Detached_git_work_tree__63__.mdwn view

file too large to diff

+ doc/forum/Difference_between_copy__44___move_and_get__63__.mdwn view

file too large to diff

+ doc/forum/Different_annexes_pointing_to_same_special_remote__63__.mdwn view

file too large to diff

+ doc/forum/Direct_special_remotes.mdwn view

file too large to diff

+ doc/forum/Does_Jabber_syncing_work_when_the_buddy_is_offline__63__.mdwn view

file too large to diff

+ doc/forum/Does_git-annex_version_big_files__63__.mdwn view

file too large to diff

+ doc/forum/Does_migrate_ensure_data_integrity__63__.mdwn view

file too large to diff

+ doc/forum/Don__39__t_understand_how_to_delete__47__recover_files.mdwn view

file too large to diff

+ doc/forum/Don__39__t_understand_local_vs._known_keys.mdwn view

file too large to diff

+ doc/forum/Drop_with_assistant.mdwn view

file too large to diff

+ doc/forum/Encrypted_ssh_remote__44___synced_folders.mdwn view

file too large to diff

+ doc/forum/Error_adding_ssh_remote_in_assistant.mdwn view

file too large to diff

+ doc/forum/External_drive_syncs_git-annex_branch_but_not_master_branch.mdwn view

file too large to diff

+ doc/forum/Feature_Request:_add_filename_to_hash_objects.mdwn view

file too large to diff

+ doc/forum/Feature_request:_Multiple_concurrent_transfers.mdwn view

file too large to diff

+ doc/forum/Feature_request:_git_annex_copy_--auto_does_the_right_thing.mdwn view

file too large to diff

+ doc/forum/Feature_request:_webapp_support_for_centralized_bare_repos.mdwn view

file too large to diff

+ doc/forum/First_attempt_at_an_OSX_launcher___40__.app__41__.mdwn view

file too large to diff

+ doc/forum/Fixing_up_corrupt_annexes.mdwn view

file too large to diff

+ doc/forum/Forcing_one_repo_to_contain_a_copy_of_all_files.mdwn view

file too large to diff

+ doc/forum/Getting_started_with_Amazon_S3.mdwn view

file too large to diff

+ doc/forum/Git_Annex_Assistant:_How_to_add_a_remote__63__.mdwn view

file too large to diff

+ doc/forum/Git_Annex_Transfer_Protocols.mdwn view

file too large to diff

+ doc/forum/Git_annex_assistant_in_command_line.mdwn view

file too large to diff

+ doc/forum/Git_annex_assistant_on_EC2.mdwn view

file too large to diff

+ doc/forum/Git_annex_on_Windows.mdwn view

file too large to diff

+ doc/forum/Git_annex_syncing_speed__44___possible__63__.mdwn view

file too large to diff

+ doc/forum/Git_repos_in_git_annex__63__.mdwn view

file too large to diff

+ doc/forum/Git_repositories_in_the_annex__63__.mdwn view

file too large to diff

+ doc/forum/Handling_web_special_remote_when_content_changes__63__.mdwn view

file too large to diff

+ doc/forum/Help_Windows_walkthrough.mdwn view

file too large to diff

+ doc/forum/Help_with_syncing_file_contents.mdwn view

file too large to diff

+ doc/forum/How_do_I_dropunused_with_an_rsync_remote__63__.mdwn view

file too large to diff

+ doc/forum/How_do_you_know_when_something_fails_a_fsck__63__.mdwn view

file too large to diff

+ doc/forum/How_to_deal_with_renamed_files_in_direct_mode__63__.mdwn view

file too large to diff

+ doc/forum/How_to_delete_a_remote__63__.mdwn view

file too large to diff

+ doc/forum/How_to_handle_the_git-annex_branch__63__.mdwn view

file too large to diff

+ doc/forum/How_to_make_Maven_releases_work_with_git_annex___63__.mdwn view

file too large to diff

+ doc/forum/How_to_prevent_the_assistant_from_downloading_all_data__63__.mdwn view

file too large to diff

+ doc/forum/How_to_rename_a_remote__63__.mdwn view

file too large to diff

+ doc/forum/How_to_restore_symlinks.mdwn view

file too large to diff

+ doc/forum/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn view

file too large to diff

+ doc/forum/Howto_remove_a_repository__63__.mdwn view

file too large to diff

+ doc/forum/Howto_remove_unused_files.mdwn view

file too large to diff

+ doc/forum/Import_options/comment_1_118a5f978090a3909299876a01c0adec._comment view

file too large to diff

+ doc/forum/Import_options/comment_2_21da91f08cb6b28ae3e79ade033db516._comment view

file too large to diff

+ doc/forum/Is_an_automagic_upgrade_of_the_object_directory_safe__63__.mdwn view

file too large to diff

file too large to diff

+ doc/forum/Lacking_webapp_on_Trisquel__47__Ubuntu_Precise.mdwn view

file too large to diff

+ doc/forum/Let_watch_selectively_annex_files.mdwn view

file too large to diff

file too large to diff

+ doc/forum/Local_and_remote_in_direct_mode.mdwn view

file too large to diff

+ doc/forum/Looking_at_the_webapp_on_OSX.mdwn view

file too large to diff

+ doc/forum/Make_whereis_output_more_compact.mdwn view

file too large to diff

+ doc/forum/Making_git-annex_a_self-funded_project__63__.mdwn view

file too large to diff

+ doc/forum/Making_git-annex_less_necessary.mdwn view

file too large to diff

+ doc/forum/Managing_multiple_annexes_with_assistant__63__.mdwn view

file too large to diff

+ doc/forum/Managing_multiple_repositories_concurrently__63__.mdwn view

file too large to diff

+ doc/forum/Manual_Setup_of_a_Central_Repo.mdwn view

file too large to diff

+ doc/forum/Manual_mode_option_in_assistant_auto-syncs.mdwn view

file too large to diff

+ doc/forum/Manual_webapp_behaviour_on_ARM.mdwn view

file too large to diff

+ doc/forum/Missing_git-annex.linux__47__runshell.mdwn view

file too large to diff

+ doc/forum/Moving_large_files_within_the_repo_without_copying___63__.mdwn view

file too large to diff

+ doc/forum/Need_new_build_instructions_for_Debian_stable.mdwn view

file too large to diff

+ doc/forum/Need_some_help_to_fix_my_repository.mdwn view

file too large to diff

+ doc/forum/New_git-annex_integration_mode_for_Emacs_users.mdwn view

file too large to diff

+ doc/forum/New_user_misunderstandings.mdwn view

file too large to diff

+ doc/forum/No_SSL_traffic_for_S3__63__.mdwn view

file too large to diff

+ doc/forum/Not_sure_how_to_get_my_s3_remote_back.mdwn view

file too large to diff

+ doc/forum/OSX_Mavericks_anyone__63__.mdwn view

file too large to diff

+ doc/forum/OSX__39__s_default_sshd_behaviour_has_limited_paths_set.mdwn view

file too large to diff

file too large to diff

+ doc/forum/OpenOffice___47___Libre_Office.mdwn view

file too large to diff

+ doc/forum/Overwriting_data_without_getting_it.mdwn view

file too large to diff

+ doc/forum/Please_fix_compatibility_with_ghc_7.0.mdwn view

file too large to diff

+ doc/forum/Podcast_syncing_use-case.mdwn view

file too large to diff

+ doc/forum/Poor_man__39__s_IMAP.mdwn view

file too large to diff

+ doc/forum/Post-Kickstarter.mdwn view

file too large to diff

+ doc/forum/Problem_compiling_current_master.mdwn view

file too large to diff

+ doc/forum/Problems_syncing_with_box.com.mdwn view

file too large to diff

+ doc/forum/Problems_using_submodules_with_git-annex__63__.mdwn view

file too large to diff

+ doc/forum/Problems_with_large_numbers_of_files.mdwn view

file too large to diff

+ doc/forum/Pruning_out_unwanted_Git_objects.mdwn view

file too large to diff

+ doc/forum/Push__47__Pull_with_the_Assistant.mdwn view

file too large to diff

+ doc/forum/Pushing_git_repo_to_AWS_S3_from_behind_proxy.mdwn view

file too large to diff

+ doc/forum/Reappearing_repos_in_webapp_and_vicfg.mdwn view

file too large to diff

+ doc/forum/Recommended_number_of_repositories.mdwn view

file too large to diff

+ doc/forum/Relocating_annex_directory.mdwn view

file too large to diff

+ doc/forum/Removing_files_not_found_by_git_annex_unused.mdwn view

file too large to diff

+ doc/forum/Restricting_git-annex-shell_to_a_specific_repository.mdwn view

file too large to diff

+ doc/forum/Retrieve_previous_version_in_direct_mode.mdwn view

file too large to diff

+ doc/forum/Revert_file_linkage_to_original_files.mdwn view

file too large to diff

+ doc/forum/Running_assistant_on_a_server___40__no_X_available__41__.mdwn view

file too large to diff

+ doc/forum/Running_assistant_steps_manually.mdwn view

file too large to diff

+ doc/forum/Running_out_of__inodes.mdwn view

file too large to diff

+ doc/forum/Same_Jabber_account_for_different_annexes.mdwn view

file too large to diff

+ doc/forum/Securing_a_shared_ssh_server.mdwn view

file too large to diff

+ doc/forum/Setup_of_rsync_special_remote_with_non-standard_ssh_port.mdwn view

file too large to diff

+ doc/forum/Share_only_certain_files_of_a_repo___40__Assistant__41__.mdwn view

file too large to diff

+ doc/forum/Share_with_friend_copies_only_sym_links.mdwn view

file too large to diff

+ doc/forum/Sharing_annex_with_local_clones.mdwn view

file too large to diff

+ doc/forum/Simple_check_out_with_assistant__63__.mdwn view

file too large to diff

+ doc/forum/Slightly_finer_control_over_file_whereabouts.mdwn view

file too large to diff

+ doc/forum/Special_remote_without_chmod.mdwn view

file too large to diff

+ doc/forum/Storing_uncontrolled_files_in_an_annex.mdwn view

file too large to diff

+ doc/forum/Stupid_mistake:_recoverable__63__.mdwn view

file too large to diff

+ doc/forum/Sync_without_jabber_account.mdwn view

file too large to diff

+ doc/forum/Synchronize_large_files___40__VM_images__41__.mdwn view

file too large to diff

+ doc/forum/Syncing_machines_on_different_networks.mdwn view

file too large to diff

+ doc/forum/Syncronisation_of_syncronisation_between_3_repositories__63__.mdwn view

file too large to diff

+ doc/forum/Transfer_remotes.mdwn view

file too large to diff

+ doc/forum/Trouble_installing_from_cabal_on_debian-testing.mdwn view

file too large to diff

+ doc/forum/Truly_purging_dead_repositories.mdwn view

file too large to diff

+ doc/forum/USB_backup_with_files_visible.mdwn view

file too large to diff

+ doc/forum/Ubuntu_PPA.mdwn view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_1_b55535258b1b4bcfc802235f0cba075d._comment view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_2_adc4d644fed058d1811acf0b35db9c18._comment view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_3_fc9cd51558c47718f243437202a11803._comment view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_4_3a8bbd0a7450a7f5323cd13144824aea._comment view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_5_2e1beaeebda0201c635db8b276cedf20._comment view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_6_bd99fb70399fc58d98781a89c6d38428._comment view

file too large to diff

+ doc/forum/Ubuntu_PPA/comment_7_c3f7ec8573934c59d70a48e36e321c13._comment view

file too large to diff

+ doc/forum/Un-git-annex__63__.mdwn view

file too large to diff

+ doc/forum/Undo_Git_Annex_Changes_To_Linked_Files.mdwn view

file too large to diff

+ doc/forum/Unknown_remote_type_S3.mdwn view

file too large to diff

+ doc/forum/Unlock_files_when_assistant_is_running__63__.mdwn view

file too large to diff

+ doc/forum/Use_case_with_syncing_only_a_subset_possible__63__.mdwn view

file too large to diff

+ doc/forum/Use_local_files_instead_of_re-downloading_from_S3_remote.mdwn view

file too large to diff

file too large to diff

+ doc/forum/Using_Linux_static_builds.mdwn view

file too large to diff

+ doc/forum/Using___34__sync__34___to_sink_all_branches__63__.mdwn view

file too large to diff

+ doc/forum/Using_for_Music_repo.mdwn view

file too large to diff

+ doc/forum/Using_git-annex_as_a_library.mdwn view

file too large to diff

+ doc/forum/Using_git-annex_via_command_line_in_OS_X.mdwn view

file too large to diff

+ doc/forum/Watch__47__assistant__47__webapp_documentation.mdwn view

file too large to diff

+ doc/forum/Webapp_on_ARM.mdwn view

file too large to diff

+ doc/forum/Webapp_on_ARM/comment_1_82ac40cef5b59070136527b8d81a5ce2._comment view

file too large to diff

+ doc/forum/Weird_behavior_with_OS_X_Finder_and_Preview.app.mdwn view

file too large to diff

+ doc/forum/What_can_be_done_in_case_of_conflict.mdwn view

file too large to diff

+ doc/forum/What_happened_to_the_walkthrough__63__.mdwn view

file too large to diff

+ doc/forum/What_is_the_best_way_to___34__git_annex_mv__34___file__63__.mdwn view

file too large to diff

+ doc/forum/Which_cloud_providers_are_supported__63___.mdwn view

file too large to diff

+ doc/forum/Why_does_the_bup_remote_use___126____47__.bup__63__.mdwn view

file too large to diff

+ doc/forum/Will_git-annex_solve_my_problem__63__.mdwn view

file too large to diff

+ doc/forum/Will_git_annex_work_on_a_FAT32_formatted_key__63__.mdwn view

file too large to diff

+ doc/forum/Windows_support.mdwn view

file too large to diff

+ doc/forum/Windows_usage_instructions.mdwn view

file too large to diff

+ doc/forum/Wishlist:_Bittorrent-like_transfers.mdwn view

file too large to diff

+ doc/forum/Wishlist:_Don__39__t_make_files_readonly.mdwn view

file too large to diff

+ doc/forum/Wishlist:_Ways_of_selecting_files_based_on_meta-information.mdwn view

file too large to diff

+ doc/forum/Wishlist:_automatic_reinject.mdwn view

file too large to diff

+ doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn view

file too large to diff

+ doc/forum/Wishlist:_mark_remotes_offline.mdwn view

file too large to diff

+ doc/forum/Wishlist:_options_for_syncing_meta-data_and_data.mdwn view

file too large to diff

+ doc/forum/XMPP_authentication_failure.mdwn view

file too large to diff

+ doc/forum/__34__Pairing__34___more_than_two_computers.mdwn view

file too large to diff

+ doc/forum/__34__du__34___equivalent_on_an_annex__63__.mdwn view

file too large to diff

+ doc/forum/__34__git_annex_lock__34___very_slow_for_big_repo.mdwn view

file too large to diff

+ doc/forum/__34__permission_denied__34___in_fsck_on_shared_repo.mdwn view

file too large to diff

+ doc/forum/advantages_of_SHA__42___over_WORM.mdwn view

file too large to diff

+ doc/forum/android_binary-only_download.mdwn view

file too large to diff

+ doc/forum/annexed_file_key_for_web_remote_with_SHA256E_backend.mdwn view

file too large to diff

+ doc/forum/archaeology_of_deleted_files.mdwn view

file too large to diff

+ doc/forum/archival_and_multiple_users.mdwn view

file too large to diff

+ doc/forum/assistant_overzealously_moving_stuff_to_other_repos.mdwn view

file too large to diff

+ doc/forum/assistant_without_watch__63__.mdwn view

file too large to diff

+ doc/forum/autobuilders_for_git-annex_to_aid_development.mdwn view

file too large to diff

+ doc/forum/bainstorming:_git_annex_push___38___pull.mdwn view

file too large to diff

+ doc/forum/bash_completion.mdwn view

file too large to diff

+ doc/forum/batch_check_on_remote_when_using_copy.mdwn view

file too large to diff

+ doc/forum/benefit_of_splitting_a_repository.mdwn view

file too large to diff

+ doc/forum/cabal_install_fails_on_uuid.mdwn view

file too large to diff

+ doc/forum/can_I_only_add_my_own_files__63__.mdwn view

file too large to diff

+ doc/forum/can_git-annex_replace_ddm__63__.mdwn view

file too large to diff

+ doc/forum/clear_box.com_repository.mdwn view

file too large to diff

+ doc/forum/cloud_services_to_support.mdwn view

file too large to diff

+ doc/forum/cloudcmd.mdwn view

file too large to diff

+ doc/forum/commit_current_workdir_state_in_direct_mode.mdwn view

file too large to diff

+ doc/forum/confusion_with_remotes__44___map.mdwn view

file too large to diff

+ doc/forum/correct_way_to_add_two_preexisting_datasets.mdwn view

file too large to diff

+ doc/forum/dot_git_slash_annex_slash_tmp.mdwn view

file too large to diff

+ doc/forum/endless_password_prompt_loop.mdwn view

file too large to diff

+ doc/forum/error_in_installation_of_base-4.5.0.0.mdwn view

file too large to diff

+ doc/forum/example_of_massively_disconnected_operation.mdwn view

file too large to diff

+ doc/forum/exclude_files_from_annex.mdwn view

file too large to diff

+ doc/forum/expire_files__44___move_to_other_hosts.mdwn view

file too large to diff

+ doc/forum/exporting_annexed_files.mdwn view

file too large to diff

+ doc/forum/first-time_setup_git-annex.mdwn view

file too large to diff

+ doc/forum/flickrannex_--_not_sure_I_get_it.mdwn view

file too large to diff

+ doc/forum/fsck_gives_false_positives.mdwn view

file too large to diff

+ doc/forum/gadu_-_git-annex_disk_usage.mdwn view

file too large to diff

+ doc/forum/get_and_copy_with_bare_repositories.mdwn view

file too large to diff

+ doc/forum/getting_git_annex_to_do_a_force_copy_to_a_remote.mdwn view

file too large to diff

+ doc/forum/git-annex___38___ikiwiki_experiment.mdwn view

file too large to diff

+ doc/forum/git-annex_across_two_filesystems.mdwn view

file too large to diff

+ doc/forum/git-annex_and_tagfs.mdwn view

file too large to diff

+ doc/forum/git-annex_communication_channels.mdwn view

file too large to diff

+ doc/forum/git-annex_on_OSX.mdwn view

file too large to diff

+ doc/forum/git-annex_on_Samba_share.mdwn view

file too large to diff

+ doc/forum/git-annex_on_Ubuntu_13.04_and_13.10_not_working.mdwn view

file too large to diff

+ doc/forum/git-annex_on_archlinuxarm__44___armv6.mdwn view

file too large to diff

+ doc/forum/git-annex_pre-commit_eats_all_my_4GB_of_ram.mdwn view

file too large to diff

+ doc/forum/git-annex_teams___47___groups.mdwn view

file too large to diff

+ doc/forum/git-annex_unused_not_dropping_deleted_files.mdwn view

file too large to diff

+ doc/forum/git-assistant_clarification.mdwn view

file too large to diff

+ doc/forum/git-remote-gcrypt.mdwn view

file too large to diff

+ doc/forum/git-status_typechange_in_direct_mode.mdwn view

file too large to diff

+ doc/forum/git-subtree_support__63__.mdwn view

file too large to diff

+ doc/forum/git_annex_add_crash_and_subsequent_recovery.mdwn view

file too large to diff

+ doc/forum/git_annex_alternative.mdwn view

file too large to diff

+ doc/forum/git_annex_assistant__44___share_with_other_devices.mdwn view

file too large to diff

+ doc/forum/git_annex_copy_--fast_--to_blah_much_slower_than_--from_blah.mdwn view

file too large to diff

+ doc/forum/git_annex_get_creates_a_new_uuid.mdwn view

file too large to diff

+ doc/forum/git_annex_ls___47___metadata_in_git_annex_whereis.mdwn view

file too large to diff

+ doc/forum/git_annex_sync_dies___40__sometimes__41__.mdwn view

file too large to diff

+ doc/forum/git_pull_remote_git-annex.mdwn view

file too large to diff

+ doc/forum/git_tag_missing_for_3.20111011.mdwn view

file too large to diff

+ doc/forum/git_unannex_speed.mdwn view

file too large to diff

+ doc/forum/glacier_-_range_retrievals_and_daily_free_retrieval_allowance.mdwn view

file too large to diff

+ doc/forum/hashing_objects_directories.mdwn view

file too large to diff

+ doc/forum/help_running_git-annex_on_top_of_existing_repo.mdwn view

file too large to diff

+ doc/forum/how_to_decrypt_file_from_encrypted_special_remote__63__.mdwn view

file too large to diff

+ doc/forum/howto_update_feed.mdwn view

file too large to diff

+ doc/forum/incompatible_versions__63__.mdwn view

file too large to diff

+ doc/forum/linux_standalone_tarballs.mdwn view

file too large to diff

+ doc/forum/location_tracking_cleanup.mdwn view

file too large to diff

+ doc/forum/making_good_use_of_my_shiny_new_rsync.net_account.mdwn view

file too large to diff

+ doc/forum/man_pages_in_the_prebuilt_linux_tarball.mdwn view

file too large to diff

+ doc/forum/managing_multiple_repositories.mdwn view

file too large to diff

+ doc/forum/many_remotes.mdwn view

file too large to diff

+ doc/forum/migrate_existing_git_repository_to_git-annex.mdwn view

file too large to diff

+ doc/forum/migration_to_git-annex_and_rsync.mdwn view

file too large to diff

+ doc/forum/mistakenly_checked___42__files__42___into_an_annex.__bummer..mdwn view

file too large to diff

+ doc/forum/multiple_routes_to_same_repository.mdwn view

file too large to diff

file too large to diff

+ doc/forum/multiple_urls_for_the_same_UUID.mdwn view

file too large to diff

+ doc/forum/new_microfeatures.mdwn view

file too large to diff

+ doc/forum/nntp__47__usenet_special_remote.mdwn view

file too large to diff

+ doc/forum/non-bare_repo_on_cloud_remote.mdwn view

file too large to diff

+ doc/forum/not_getting_file_contents.mdwn view

file too large to diff

+ doc/forum/one_annex_versus_many_annexes__63__.mdwn view

file too large to diff

+ doc/forum/one_or_many_annexes__63__.mdwn view

file too large to diff

+ doc/forum/performance_and_multiple_replication_problems.mdwn view

file too large to diff

+ doc/forum/post-copy__47__sync_hook.mdwn view

file too large to diff

+ doc/forum/preferred_content_settings_for_multiple_symlinks.mdwn view

file too large to diff

+ doc/forum/public-web-frontend.mdwn view

file too large to diff

+ doc/forum/pulling_from_encrypted_remote.mdwn view

file too large to diff

+ doc/forum/pure_git-annex_only_workflow.mdwn view

file too large to diff

+ doc/forum/purge_files_with_no_copies.mdwn view

file too large to diff

+ doc/forum/question_about_assistant_and___47__archive__47__.mdwn view

file too large to diff

+ doc/forum/recover_deleted_files___63__.mdwn view

file too large to diff

+ doc/forum/recovering_from_repo_corruption.mdwn view

file too large to diff

+ doc/forum/reliability__47__completeness_of_XMPP_updates.mdwn view

file too large to diff

+ doc/forum/relying_on_git_for_numcopies.mdwn view

file too large to diff

+ doc/forum/remote_server_client_repositories_are_bare__33____63__.mdwn view

file too large to diff

+ doc/forum/reserving_space_with_directory_special_remotes.mdwn view

file too large to diff

+ doc/forum/retrieving_previous_versions.mdwn view

file too large to diff

+ doc/forum/rsync_over_ssh__63__.mdwn view

file too large to diff

+ doc/forum/safely_dropping_git-annex_history.mdwn view

file too large to diff

+ doc/forum/seems_to_build_fine_on_haskell_platform_2011.mdwn view

file too large to diff

+ doc/forum/shared_cipher_tries_to_use_gpg.mdwn view

file too large to diff

+ doc/forum/something_really_good_happened_with_3.20130124.mdwn view

file too large to diff

+ doc/forum/sparse_git_checkouts_with_annex.mdwn view

file too large to diff

+ doc/forum/special_remote_for_IMAP.mdwn view

file too large to diff

+ doc/forum/special_remote_for_iPods.mdwn view

file too large to diff

+ doc/forum/ssh_password.mdwn view

file too large to diff

+ doc/forum/ssh_password/comment_1_a3e5a41e1d4da683d577976b134b11ee._comment view

file too large to diff

+ doc/forum/ssh_password/comment_2_fa261676a99d49d4b237b0d43048d76d._comment view

file too large to diff

+ doc/forum/start_assistant_from_command_line.mdwn view

file too large to diff

+ doc/forum/switching_backends.mdwn view

file too large to diff

+ doc/forum/switching_to__47__from_direct_mode_while_assistant_is_running.mdwn view

file too large to diff

+ doc/forum/syncing_home_directories.mdwn view

file too large to diff

+ doc/forum/syncing_non-git_trees_with_git-annex.mdwn view

file too large to diff

+ doc/forum/taskwarrior.mdwn view

file too large to diff

+ doc/forum/taskwarrior/comment_1_1c3a29e7d292cb602d9d349f8009b51e._comment view

file too large to diff

+ doc/forum/tell_us_how_you__39__re_using_git-annex.mdwn view

file too large to diff

+ doc/forum/tips:_special__95__remotes__47__hook_with_tahoe-lafs.mdwn view

file too large to diff

+ doc/forum/ui.mdwn view

file too large to diff

+ doc/forum/ui/comment_1_f3e3446b05d6b573e29e6cad300fb635._comment view

file too large to diff

+ doc/forum/ui/comment_2_b493ee97eb2378e72c12f3d137109580._comment view

file too large to diff

+ doc/forum/unannex_alternatives.mdwn view

file too large to diff

+ doc/forum/unknown_response_from_git_cat-file.mdwn view

file too large to diff

+ doc/forum/unlock__47__lock_always_gets_me.mdwn view

file too large to diff

+ doc/forum/updating_the___34__number_of_copies__34__.mdwn view

file too large to diff

+ doc/forum/use_existing_ssh_keys__63__.mdwn view

file too large to diff

+ doc/forum/version_3_upgrade.mdwn view

file too large to diff

+ doc/forum/vlc_and_git-annex.mdwn view

file too large to diff

+ doc/forum/webapp___47___assistant_without_watch.mdwn view

file too large to diff

+ doc/forum/webapp_and_manual_mode.mdwn view

file too large to diff

+ doc/forum/webapp_listen_port_with_autostart.mdwn view

file too large to diff

+ doc/forum/windows_port__63__.mdwn view

file too large to diff

+ doc/forum/wishlist:_get__47__drop_via_webapp_file_explorer.mdwn view

file too large to diff

+ doc/forum/wishlist:_make_copy_stop_on_exhausted_disk_space.mdwn view

file too large to diff

+ doc/forum/working_without_git-annex_commits.mdwn view

file too large to diff

+ doc/future_proofing.mdwn view

file too large to diff

+ doc/git-annex-shell.mdwn view

file too large to diff

+ doc/git-annex.mdwn view

file too large to diff

+ doc/git-recover-repository.mdwn view

file too large to diff

+ doc/git-union-merge.mdwn view

file too large to diff

+ doc/how_it_works.mdwn view

file too large to diff

+ doc/how_it_works/comment_1_b3bdd6a06d5764db521ae54878131f5f._comment view

file too large to diff

+ doc/index.mdwn view

file too large to diff

+ doc/install.mdwn view

file too large to diff

+ doc/install/Android.mdwn view

file too large to diff

+ doc/install/Android/comment_10_225f2c6fe255be93702cfbd4dc172f3b._comment view

file too large to diff

+ doc/install/Android/comment_11_4e970633d9073fcf4bc33f3fff2525b2._comment view

file too large to diff

+ doc/install/Android/comment_12_87da4f379a0276b662583e7e22061218._comment view

file too large to diff

+ doc/install/Android/comment_13_f077a27c04131da89db1d7abcab3e68f._comment view

file too large to diff

+ doc/install/Android/comment_1_f9ced494a530e6ae3e76cfbaddb89f5d._comment view

file too large to diff

+ doc/install/Android/comment_2_74cccae04ea23a8600069c7e658143aa._comment view

file too large to diff

+ doc/install/Android/comment_3_82c7cb31d19d4e18ca5548da5ca19a79._comment view

file too large to diff

+ doc/install/Android/comment_4_cebaa8ee5bbed27d9b2d032ca7bdec6e._comment view

file too large to diff

+ doc/install/Android/comment_5_40cb6cb72c4ad4aa19a4a40f41a6a757._comment view

file too large to diff

+ doc/install/Android/comment_6_b0f723538e7328d5070c563f070858bd._comment view

file too large to diff

+ doc/install/Android/comment_7_c6dc23d0e6f4138c4bf8e3452755676f._comment view

file too large to diff

+ doc/install/Android/comment_8_34f7c42050fa48769a6bfae60d72e477._comment view

file too large to diff

+ doc/install/Android/comment_9_f3d289b78d6bdb3cc65689495a8439a5._comment view

file too large to diff

+ doc/install/ArchLinux.mdwn view

file too large to diff

+ doc/install/ArchLinux/comment_1_da5919c986d2ae187bc2f73de9633978._comment view

file too large to diff

+ doc/install/ArchLinux/comment_2_e5f923e6d81cfb3fba7a72f60baaf4ab._comment view

file too large to diff

+ doc/install/ArchLinux/comment_3_8e607cd883ec174571e9dfe3b25bfd05._comment view

file too large to diff

+ doc/install/ArchLinux/comment_4_a378391dd218859f381c479259dd8fe3._comment view

file too large to diff

+ doc/install/Debian.mdwn view

file too large to diff

+ doc/install/Debian/comment_10_d5da996e106d2e4d8a822aa9bcc78596._comment view

file too large to diff

+ doc/install/Debian/comment_11_84283676da247c401bc9b4bb12c2b453._comment view

file too large to diff

+ doc/install/Debian/comment_12_0aca83b055d0a9dd8589c50250a8bbea._comment view

file too large to diff

+ doc/install/Debian/comment_13_167a091764e5e99ec0f35a65e95a22de._comment view

file too large to diff

+ doc/install/Debian/comment_14_a34e23d9aa3027012ab1236aa4f7d5cb._comment view

file too large to diff

+ doc/install/Debian/comment_15_20d8271ba3f6cfe3c8849c3d41607630._comment view

file too large to diff

+ doc/install/Debian/comment_1_029486088d098c2d4f1099f2f0e701a9._comment view

file too large to diff

+ doc/install/Debian/comment_2_648e3467e260cdf233acdb0b53313ce0._comment view

file too large to diff

+ doc/install/Debian/comment_3_4d922e11249627634ecc35bba4044d9e._comment view

file too large to diff

+ doc/install/Debian/comment_4_2a93ab18b05ccb90e7acc5885866fca2._comment view

file too large to diff

+ doc/install/Debian/comment_5_38e6399083e10a6a274f35bddc15d4ac._comment view

file too large to diff

+ doc/install/Debian/comment_6_2e7bbdbaabbfb9d89de22e913066e822._comment view

file too large to diff

+ doc/install/Debian/comment_7_1bccc7bf7a4ef61a9b30024b9b22ba7d._comment view

file too large to diff

+ doc/install/Debian/comment_8_5b5a3b0e8abe8831a6a15a4e258d14fd._comment view

file too large to diff

+ doc/install/Debian/comment_9_97eaed998ffd1ed79585075ed5cff06e._comment view

file too large to diff

+ doc/install/Fedora.mdwn view

file too large to diff

+ doc/install/Fedora/comment_1_c4db84e672ad4b45b522db735706b00f._comment view

file too large to diff

+ doc/install/Fedora/comment_2_f98c488c09bef86e2b0414589ce9e141._comment view

file too large to diff

+ doc/install/Fedora/comment_3_d872acf8865fe7c99a9b712db5b38ea4._comment view

file too large to diff

+ doc/install/Fedora/comment_4_93b3402e4c51e1a5c96f907bb528164b._comment view

file too large to diff

+ doc/install/Fedora/comment_5_0427e0503764b29e57abf9e97155136b._comment view

file too large to diff

+ doc/install/Fedora/comment_6_1b1b38a79251fe2e8c1e4debbe3bc3c5._comment view

file too large to diff

+ doc/install/FreeBSD.mdwn view

file too large to diff

+ doc/install/Gentoo.mdwn view

file too large to diff

+ doc/install/Linux_standalone.mdwn view

file too large to diff

+ doc/install/NixOS.mdwn view

file too large to diff

+ doc/install/OSX.mdwn view

file too large to diff

+ doc/install/OSX/comment_10_cd2120552ef894a37933b328136fa4cc._comment view

file too large to diff

+ doc/install/OSX/comment_11_740fa80e2e54e6fb570f820ff1f56440._comment view

file too large to diff

+ doc/install/OSX/comment_12_a84028080578a8b60115b6c4ef823627._comment view

file too large to diff

+ doc/install/OSX/comment_13_d6f1db401858ffea23c123db49f5b296._comment view

file too large to diff

+ doc/install/OSX/comment_14_035f856923276b0edad879e196e94097._comment view

file too large to diff

+ doc/install/OSX/comment_15_336e0acb00e84943715e69917643a69e._comment view

file too large to diff

+ doc/install/OSX/comment_16_1befafa862b7d07b1f6e57c0182497cf._comment view

file too large to diff

+ doc/install/OSX/comment_17_19c08b2c6c2c5cd88bf96d2bcbbd9055._comment view

file too large to diff

+ doc/install/OSX/comment_18_537fad5d8854e765499d47602d1ab398._comment view

file too large to diff

+ doc/install/OSX/comment_19_18d4377f4ded5604d395d73783ba82c9._comment view

file too large to diff

+ doc/install/OSX/comment_20_3e6a3c00444badf2cf7a9ee3d54af11e._comment view

file too large to diff

+ doc/install/OSX/comment_21_987f1302f56107c926b6daf83e124654._comment view

file too large to diff

+ doc/install/OSX/comment_22_6b5f44a98f9d37a1c6ecfe19a60fe6c5._comment view

file too large to diff

+ doc/install/OSX/comment_23_3d82a270dd4b0159f4aab5675166e1e3._comment view

file too large to diff

+ doc/install/OSX/comment_24_b9d3563a2cc3d769f27876e028dc344d._comment view

file too large to diff

+ doc/install/OSX/comment_25_db90984062a07576a4777b2d743161f1._comment view

file too large to diff

+ doc/install/OSX/comment_27_2a60108a440231ba83f5a54b6bcc5488._comment view

file too large to diff

+ doc/install/OSX/comment_27_d453510b9bb62072a4c663206c12c8a4._comment view

file too large to diff

+ doc/install/OSX/comment_28_0970bfd63137ea48701dff6aea1b4bcb._comment view

file too large to diff

+ doc/install/OSX/comment_29_8622ed56c6a8034c20fb311418d94003._comment view

file too large to diff

+ doc/install/OSX/comment_2_25552ff2942048fafe97d653757f1ad6._comment view

file too large to diff

+ doc/install/OSX/comment_30_ce58633ef5b2f8f4caa7e626358f33be._comment view

file too large to diff

+ doc/install/OSX/comment_31_09084a7b3cf06bfa3add0f4991476ffe._comment view

file too large to diff

+ doc/install/OSX/comment_32_a46d8e3e7795b9afb1e1c2be943d12af._comment view

file too large to diff

+ doc/install/OSX/comment_33_203a36322b3c453c05c8906c64e62e06._comment view

file too large to diff

+ doc/install/OSX/comment_3_47a77a03040fe628109bd54f82f9ad7a._comment view

file too large to diff

+ doc/install/OSX/comment_4_25cac8bcd84a5210fc0a5243260b8cc7._comment view

file too large to diff

+ doc/install/OSX/comment_4_bbe99673033e4c48c8bb3db24ee419f9._comment view

file too large to diff

+ doc/install/OSX/comment_5_39b4b748b4586bf32b37edfefef84bba._comment view

file too large to diff

+ doc/install/OSX/comment_6_1a9c91ef43edc4148947f202ff604114._comment view

file too large to diff

+ doc/install/OSX/comment_7_892f7e65f95f43697164267c4b71c0d5._comment view

file too large to diff

+ doc/install/OSX/comment_8_38d9c2eea1090674de2361274eab5b0e._comment view

file too large to diff

+ doc/install/OSX/comment_9_35bf3812db6f3ef25da9b3bc84f147c5._comment view

file too large to diff

+ doc/install/OSX/old_comments.mdwn view

file too large to diff

+ doc/install/ScientificLinux5.mdwn view

file too large to diff

+ doc/install/Ubuntu.mdwn view

file too large to diff

+ doc/install/Ubuntu/comment_10_490e065314693423ab6969d8ae6978fe._comment view

file too large to diff

+ doc/install/Ubuntu/comment_11_4ebac3fb43de854ed1a3b1d2ea94011a._comment view

file too large to diff

+ doc/install/Ubuntu/comment_1_d1c511153fe94bf33e19a1281f1c92f2._comment view

file too large to diff

+ doc/install/Ubuntu/comment_2_ad13886c1c1f76d1cd995ea7b7d8471c._comment view

file too large to diff

+ doc/install/Ubuntu/comment_3_a08817322739b03cf0fec97283b16f1a._comment view

file too large to diff

+ doc/install/Ubuntu/comment_4_fe0997e56136bd30749f0995cbf19b56._comment view

file too large to diff

+ doc/install/Ubuntu/comment_5_fbb5306a162db1a1ee9efa3523aac952._comment view

file too large to diff

+ doc/install/Ubuntu/comment_6_a97e7f0e62ac685c3ded423bddeaa67f._comment view

file too large to diff

+ doc/install/Ubuntu/comment_7_921a223fd7e679b9ced3d8ba5ce688e0._comment view

file too large to diff

+ doc/install/Ubuntu/comment_8_1f943cb084fa8e21bc6ee5fc3118f02f._comment view

file too large to diff

+ doc/install/Ubuntu/comment_9_c2f8b35ada873acb1ce593b04e2899fe._comment view

file too large to diff

+ doc/install/Windows.mdwn view

file too large to diff

+ doc/install/cabal.mdwn view

file too large to diff

+ doc/install/cabal/comment_10_7ebe353b05d4df29897dc9a4f45c8a91._comment view

file too large to diff

+ doc/install/cabal/comment_11_0d06702e6e0ae3cd331cf748a9f6f273._comment view

file too large to diff

+ doc/install/cabal/comment_12_b93ca271dffca3f948645d3e1326c1d9._comment view

file too large to diff

+ doc/install/cabal/comment_13_3dac019cda71bf99878c0a1d9382323b._comment view

file too large to diff

+ doc/install/cabal/comment_14_14b46470593f84f8c3768a91cb77bdab._comment view

file too large to diff

+ doc/install/cabal/comment_15_c3a5b0aad28a90e0bb8da31a430578eb._comment view

file too large to diff

+ doc/install/cabal/comment_16_4faf214f97f9516898d7c17d743ef825._comment view

file too large to diff

+ doc/install/cabal/comment_17_2a9d6807a3a13815c824985521757167._comment view

file too large to diff

+ doc/install/cabal/comment_18_1efa0c7a963ec452fc6336fbe4964f6e._comment view

file too large to diff

+ doc/install/cabal/comment_19_6f42f9234f9ff6a2ca6bbb4d2643843e._comment view

file too large to diff

+ doc/install/cabal/comment_1_f04df6bcd50d1d01eb34868bb00ac35c._comment view

file too large to diff

+ doc/install/cabal/comment_20_0f553be2a4c666e3bed58b2bce549406._comment view

file too large to diff

+ doc/install/cabal/comment_21_f91a6ec21e96eced73ea9579fd8cbd15._comment view

file too large to diff

+ doc/install/cabal/comment_22_2f27b78215f97ade1986ca806c634cb3._comment view

file too large to diff

+ doc/install/cabal/comment_23_c34d2b1d95830a3e58671a5b566a1758._comment view

file too large to diff

+ doc/install/cabal/comment_24_40cbde8ec067b3a860e6df1a9bea5f76._comment view

file too large to diff

+ doc/install/cabal/comment_2_a69d17c55e56a707ec6606d5cdddee25._comment view

file too large to diff

+ doc/install/cabal/comment_3_55bed050bdb768543dbe1b86edec057d._comment view

file too large to diff

+ doc/install/cabal/comment_4_2ff7f8a3b03bea7e860248829d595bd1._comment view

file too large to diff

+ doc/install/cabal/comment_5_8789fc27466714faa5a3a7a6b8ec6e5d._comment view

file too large to diff

+ doc/install/cabal/comment_6_5afb2d081e8b603bc338cd460ad9317d._comment view

file too large to diff

+ doc/install/cabal/comment_7_129c4f2e404c874e5adfa52902a81104._comment view

file too large to diff

+ doc/install/cabal/comment_8_738c108f131e3aab0d720bc4fd6a81fd._comment view

file too large to diff

+ doc/install/cabal/comment_9_5ddbba419d96a7411f7edddaa4d7b739._comment view

file too large to diff

+ doc/install/fromscratch.mdwn view

file too large to diff

+ doc/install/openSUSE.mdwn view

file too large to diff

+ doc/internals.mdwn view

file too large to diff

+ doc/internals/hashing.mdwn view

file too large to diff

+ doc/internals/key_format.mdwn view

file too large to diff

+ doc/license.mdwn view

file too large to diff

+ doc/links/key_concepts.mdwn view

file too large to diff

+ doc/links/other_stuff.mdwn view

file too large to diff

+ doc/links/the_details.mdwn view

file too large to diff

+ doc/location_tracking.mdwn view

file too large to diff

+ doc/logo.mdwn view

file too large to diff

+ doc/meta.mdwn view

file too large to diff

+ doc/news.mdwn view

file too large to diff

+ doc/news/LWN_article.mdwn view

file too large to diff

+ doc/news/Presentation_at_FOSDEM.mdwn view

file too large to diff

+ doc/news/git_annex_fall_of_code.mdwn view

file too large to diff

+ doc/news/sharebox_a_FUSE_filesystem_for_git-annex.mdwn view

file too large to diff

+ doc/news/version_4.20130827.mdwn view

file too large to diff

+ doc/news/version_4.20130909.mdwn view

file too large to diff

+ doc/news/version_4.20131002.mdwn view

file too large to diff

+ doc/news/version_4.20131024.mdwn view

file too large to diff

+ doc/not.mdwn view

file too large to diff

+ doc/not/comment_1_ab41bec1ccc884e71780cb9458439170._comment view

file too large to diff

+ doc/not/comment_2_0e19ff7deb5ed65f2bc685d4c516d816._comment view

file too large to diff

+ doc/not/comment_3_bab9584c41a25dda934ad230e3eb732d._comment view

file too large to diff

+ doc/not/comment_4_b2a0d5a45ab8ddd66c29dde9412d7a12._comment view

file too large to diff

+ doc/not/comment_5_f2829ecbe80a61aa9a8411d2403de69e._comment view

file too large to diff

+ doc/not/comment_6_547fc59b19ad66d7280c53a7f923ea08._comment view

file too large to diff

+ doc/not/comment_7_581e23cca0219711f8a4500a8d5d20fc._comment view

file too large to diff

+ doc/not/comment_8_5c61457f117de38ef487e5cc2780d554._comment view

file too large to diff

+ doc/preferred_content.mdwn view

file too large to diff

+ doc/preferred_content/comment_10_f0bce3c67f293eaba97b92f0942876b6._comment view

file too large to diff

+ doc/preferred_content/comment_1_7d45e21dfb016e9ffa4715346dd0c1a6._comment view

file too large to diff

+ doc/preferred_content/comment_2_1ccd90b009245667ad59f4d29d2a3a37._comment view

file too large to diff

+ doc/preferred_content/comment_4_384025b5fa23a3f175985a081438149f._comment view

file too large to diff

+ doc/preferred_content/comment_4_6a9bc657bc7415f0e118357d8c6664c6._comment view

file too large to diff

+ doc/preferred_content/comment_5_f0a957e67297c4bb5a8778c11b3c9fd4._comment view

file too large to diff

+ doc/preferred_content/comment_6_b434c0e2aaa132020fd4a01551285376._comment view

file too large to diff

+ doc/preferred_content/comment_7_c4acaa237bf1a8512c5e8ea4cdbd11b9._comment view

file too large to diff

+ doc/preferred_content/comment_8_ff2a2dc9c566ebd9f570bdfcd7bfc030._comment view

file too large to diff

+ doc/preferred_content/comment_9_f82538be42428691d7cab60a7add2e74._comment view

file too large to diff

+ doc/privacy.mdwn view

file too large to diff

+ doc/related_software.mdwn view

file too large to diff

+ doc/scalability.mdwn view

file too large to diff

+ doc/sidebar.mdwn view

file too large to diff

+ doc/sitemap.mdwn view

file too large to diff

+ doc/special_remotes.mdwn view

file too large to diff

+ doc/special_remotes/S3.mdwn view

file too large to diff

+ doc/special_remotes/S3/comment_10_c366f020c9b97a365e21878a33360079._comment view

file too large to diff

+ doc/special_remotes/S3/comment_11_c1da387e082d91feec13dde91ccb111a._comment view

file too large to diff

+ doc/special_remotes/S3/comment_12_59c3ecab7dbc8be53258460473cac21c._comment view

file too large to diff

+ doc/special_remotes/S3/comment_13_0789a21d980825188bb09f7fc8bba8be._comment view

file too large to diff

+ doc/special_remotes/S3/comment_14_29574a51d5831c51e2e765eb2c06e567._comment view

file too large to diff

+ doc/special_remotes/S3/comment_15_ceb9048c743135f6beca57a23505f0a3._comment view

file too large to diff

+ doc/special_remotes/S3/comment_16_7b79f8b5ef88a2775d61b5ac5774d3e0._comment view

file too large to diff

+ doc/special_remotes/S3/comment_1_4a1f7a230dad6caa84831685b236fd73._comment view

file too large to diff

+ doc/special_remotes/S3/comment_2_5b22d67de946f4d34a4a3c7449d32988._comment view

file too large to diff

+ doc/special_remotes/S3/comment_3_bcab2bd0f168954243aa9bcc9671bd94._comment view

file too large to diff

+ doc/special_remotes/S3/comment_4_38c0b062997fde1ad28facc05d973e83._comment view

file too large to diff

+ doc/special_remotes/S3/comment_5_409bc2b56382417cf26bb222fb783ba7._comment view

file too large to diff

+ doc/special_remotes/S3/comment_6_78da9e233882ec0908962882ea8c4056._comment view

file too large to diff

+ doc/special_remotes/S3/comment_7_6af9781004d982d8e6b20a83ad29eead._comment view

file too large to diff

+ doc/special_remotes/S3/comment_8_0fa68d584ee7f6b5c9058fba7e911a11._comment view

file too large to diff

+ doc/special_remotes/S3/comment_9_7ad757b3865b04967c79af0a263bb3b0._comment view

file too large to diff

+ doc/special_remotes/bup.mdwn view

file too large to diff

+ doc/special_remotes/bup/comment_10_f78c1ed97d2e4c6ebffaa7482cfe0c9b._comment view

file too large to diff

+ doc/special_remotes/bup/comment_11_b53bceb0058acf4d1ab12ea4853ee443._comment view

file too large to diff

+ doc/special_remotes/bup/comment_12_65d923226cf6120349d807c5c60f640c._comment view

file too large to diff

+ doc/special_remotes/bup/comment_1_96179a003da4444f6fc08867872cda0a._comment view

file too large to diff

+ doc/special_remotes/bup/comment_2_612b038c15206f9f3c2e23c7104ca627._comment view

file too large to diff

+ doc/special_remotes/bup/comment_3_1186def82741ddab1ade256fb2e59e6f._comment view

file too large to diff

+ doc/special_remotes/bup/comment_4_7d22a805dd2914971e7ca628ceea69be._comment view

file too large to diff

+ doc/special_remotes/bup/comment_6_5942333cde09fd98e26c4f1d389cb76f._comment view

file too large to diff

+ doc/special_remotes/bup/comment_7_cb1a0d3076e9d06e7a24204478f6fa98._comment view

file too large to diff

+ doc/special_remotes/bup/comment_8_4cbc67e5911748d13cee3c483d7ece8a._comment view

file too large to diff

+ doc/special_remotes/bup/comment_9_ca7096a759961af375e6bd49663b45b3._comment view

file too large to diff

+ doc/special_remotes/comment_10_e9881290486a1770bd260f8650ada9c6._comment view

file too large to diff

+ doc/special_remotes/comment_11_e01b5cc5a0d81b071e93e27e7b91fe2a._comment view

file too large to diff

+ doc/special_remotes/comment_12_13237170ef5b6646e0e25d3421af3fe5._comment view

file too large to diff

+ doc/special_remotes/comment_13_1a36a0483a9db04d36e0234a192ebad8._comment view

file too large to diff

+ doc/special_remotes/comment_14_a8419963dc024b1d9eb73807596012dc._comment view

file too large to diff

+ doc/special_remotes/comment_15_95ccfdd22a2391daa99e0beb04adedd6._comment view

file too large to diff

+ doc/special_remotes/comment_16_b9d238fb15ad7628e33c90b071e07bb0._comment view

file too large to diff

+ doc/special_remotes/comment_17_cc21b81a8f809f6efa5f5b6332513fc3._comment view

file too large to diff

+ doc/special_remotes/comment_18_3fe750118ff1edbe91a110b86fb5b662._comment view

file too large to diff

+ doc/special_remotes/comment_19_6794eb52bd87c28ef1df3172aa7d5780._comment view

file too large to diff

+ doc/special_remotes/comment_1_961276c18e9353ca8e25cad53e7ec51f._comment view

file too large to diff

+ doc/special_remotes/comment_2_97543acfa7434e332ebea5672e446317._comment view

file too large to diff

+ doc/special_remotes/comment_3_9229776623c234204c8b164edff95da0._comment view

file too large to diff

+ doc/special_remotes/comment_4_3bbda479d13f6bf393dcd59ed94ddeaa._comment view

file too large to diff

+ doc/special_remotes/comment_5_f7000975d38077828ab11a99095b39eb._comment view

file too large to diff

+ doc/special_remotes/comment_6_5d2bd7c1e1493d3c3784708a9b0bc001._comment view

file too large to diff

+ doc/special_remotes/comment_7_af01ee5ce31b1490af565cb087d65277._comment view

file too large to diff

+ doc/special_remotes/comment_8_3d4ffec566d68d601eafe8758a616756._comment view

file too large to diff

+ doc/special_remotes/comment_9_26af468952f0403171370b56e127830a._comment view

file too large to diff

+ doc/special_remotes/directory.mdwn view

file too large to diff

+ doc/special_remotes/directory/comment_12._comment view

file too large to diff

+ doc/special_remotes/gcrypt.mdwn view

file too large to diff

+ doc/special_remotes/glacier.mdwn view

file too large to diff

+ doc/special_remotes/hook.mdwn view

file too large to diff

+ doc/special_remotes/hook/comment_1_6a74a25891974a28a8cb42b87cb53c26._comment view

file too large to diff

+ doc/special_remotes/hook/comment_2_ee7c43b93c5b787216334f019643f6a0._comment view

file too large to diff

+ doc/special_remotes/hook/comment_3_2593291795e732994862d08bf2ed467b._comment view

file too large to diff

+ doc/special_remotes/hook/comment_4_35d79b5ffa5a19056efcdc805070bc4b._comment view

file too large to diff

+ doc/special_remotes/hook/comment_5_6fbf1e963fa3ea4b2eb8ca5a3819762d._comment view

file too large to diff

+ doc/special_remotes/hook/comment_6_e0ab48d5333e5de85f016b097e6fdac1._comment view

file too large to diff

+ doc/special_remotes/hook/comment_7_cc2b1243c2c36e63241513bcaddfea67._comment view

file too large to diff

+ doc/special_remotes/hook/comment_8_bbae315233bda48eb04662dfd48cf1ae._comment view

file too large to diff

+ doc/special_remotes/hook/comment_9_037523d1994c702239ca96791156fe65._comment view

file too large to diff

+ doc/special_remotes/rsync.mdwn view

file too large to diff

+ doc/special_remotes/web.mdwn view

file too large to diff

+ doc/special_remotes/web/comment_1_0bd570025f6cd551349ea88a4729ac8e._comment view

file too large to diff

+ doc/special_remotes/web/comment_2_333141cc9ec6c26ffd19aa95303a91e3._comment view

file too large to diff

+ doc/special_remotes/webdav.mdwn view

file too large to diff

+ doc/special_remotes/xmpp.mdwn view

file too large to diff

+ doc/special_remotes/xmpp/comment_1_568247938929a2934e8198fca80b7184._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_2_9fc3f512020b7eb2591d6b7b2e8de2d7._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_3_48ddbba1402d89acaea07cff747c48e0._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_4_59857879abaae22bde444a215e00bf18._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_5_583ee374bd34fcc9ae26c2fd690e8c47._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_6_8f0b5bba1271d031a67e7f0c175d67d5._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_7_ac7acbded03325b015959d82ae77faf1._comment view

file too large to diff

+ doc/special_remotes/xmpp/comment_8_81a9636a1e8a36a58185468a26f8633d._comment view

file too large to diff

+ doc/summary.mdwn view

file too large to diff

+ doc/sync.mdwn view

file too large to diff

+ doc/sync/comment_1_59681be5568f568f5c54eb0445163dd2._comment view

file too large to diff

+ doc/sync/comment_2_9301ff5e81d37475f594e74fbe32f24e._comment view

file too large to diff

+ doc/sync/comment_3_49560003da47490e4fabd4ab0089f2d7._comment view

file too large to diff

+ doc/sync/comment_4_cf29326408e62575085d1f980087c923._comment view

file too large to diff

+ doc/sync/comment_5_18c396c59907147bb2bf713e55392b6b._comment view

file too large to diff

+ doc/templates/bugtemplate.mdwn view

file too large to diff

+ doc/testimonials.mdwn view

file too large to diff

+ doc/tips.mdwn view

file too large to diff

+ doc/tips/Decentralized_repository_behind_a_Firewall.mdwn view

file too large to diff

+ doc/tips/Delay_Assistant_Startup_on_Login.mdwn view

file too large to diff

+ doc/tips/Git_annex_and_Calibre.mdwn view

file too large to diff

+ doc/tips/How_to_retroactively_annex_a_file_already_in_a_git_repo.mdwn view

file too large to diff

+ doc/tips/Internet_Archive_via_S3.mdwn view

file too large to diff

+ doc/tips/Using_Git-annex_as_a_web_browsing_assistant.mdwn view

file too large to diff

+ doc/tips/assume-unstaged.mdwn view

file too large to diff

+ doc/tips/assume-unstaged/comment_1_44abd811ef79a85e557418e17a3927be._comment view

file too large to diff

+ doc/tips/assume-unstaged/comment_2_5b589f37cfc03bf7be33a51826cc4dba._comment view

file too large to diff

+ doc/tips/automatically_getting_files_on_checkout.mdwn view

file too large to diff

+ doc/tips/beware_of_SSD_wear_when_doing_fsck_on_large_special_remotes.mdwn view

file too large to diff

+ doc/tips/centralised_repository:_starting_from_nothing.mdwn view

file too large to diff

+ doc/tips/centralized_git_repository_tutorial.mdwn view

file too large to diff

+ doc/tips/downloading_podcasts.mdwn view

file too large to diff

+ doc/tips/dropboxannex.mdwn view

file too large to diff

+ doc/tips/emacs_integration.mdwn view

file too large to diff

+ doc/tips/finding_duplicate_files.mdwn view

file too large to diff

+ doc/tips/finding_duplicate_files/comment_3._comment view

file too large to diff

+ doc/tips/flickrannex.mdwn view

file too large to diff

+ doc/tips/flickrannex/comment_10_50707f259abe5829ce075dfbecd5a4ba._comment view

file too large to diff

+ doc/tips/flickrannex/comment_11_ab5bcb025381b3da4d7c6dfd0c7310dd._comment view

file too large to diff

+ doc/tips/flickrannex/comment_12_90a331275d888221bc695003c8acbe46._comment view

file too large to diff

+ doc/tips/flickrannex/comment_13_1596e70dca71c853fd1d6fc9bde02b18._comment view

file too large to diff

+ doc/tips/flickrannex/comment_2_d74c4fc7edf8e47f7482564ce0ef4d12._comment view

file too large to diff

+ doc/tips/flickrannex/comment_2_f53d0d5520e2835e9705bea4e75556f0._comment view

file too large to diff

+ doc/tips/flickrannex/comment_4_9ebba4d61140f6c2071e988c9328cf7e._comment view

file too large to diff

+ doc/tips/flickrannex/comment_5_4470dae270613dd8712623474bc80ab0._comment view

file too large to diff

+ doc/tips/flickrannex/comment_5_d395cdcf815cb430e374ff05c1a63ff4._comment view

file too large to diff

+ doc/tips/flickrannex/comment_6_8cf730097001ffe106f2c743edce9d0a._comment view

file too large to diff

+ doc/tips/flickrannex/comment_7_a80c8087c4e1562a4c98a24edc182e5a._comment view

file too large to diff

+ doc/tips/flickrannex/comment_8_94f84254c32cf0f7dd1441b7da5d2bc6._comment view

file too large to diff

+ doc/tips/flickrannex/comment_9_5299b4cab4a4cb8e8fd4d2b39f0ea59c._comment view

file too large to diff

+ doc/tips/fully_encrypted_git_repositories_with_gcrypt.mdwn view

file too large to diff

+ doc/tips/googledriveannex.mdwn view

file too large to diff

+ doc/tips/imapannex.mdwn view

file too large to diff

+ doc/tips/megaannex.mdwn view

file too large to diff

+ doc/tips/migrating_data_to_a_new_backend.mdwn view

file too large to diff

+ doc/tips/migrating_two_seperate_disconnected_directories_to_git_annex.mdwn view

file too large to diff

+ doc/tips/offline_archive_drives.mdwn view

file too large to diff

+ doc/tips/owncloudannex.mdwn view

file too large to diff

+ doc/tips/owncloudannex/comment_1_129652308c3c499462828dcaf8e747a4._comment view

file too large to diff

+ doc/tips/owncloudannex/comment_2_38604990368666f654d41891ba99ac61._comment view

file too large to diff

+ doc/tips/owncloudannex/comment_3_1bfd290d00d6536da7d31818db46f8ec._comment view

file too large to diff

+ doc/tips/owncloudannex/comment_4_492b6922a7c5bb5464fedb46b0c5303b._comment view

file too large to diff

+ doc/tips/owncloudannex/comment_5_1d48ac08714fadcb06d874570d745bd8._comment view

file too large to diff

+ doc/tips/owncloudannex/comment_6_65959f49a2f56bffd6fe48670c0c8d5a._comment view

file too large to diff

+ doc/tips/owncloudannex/comment_7_7482002991672ef67836bae43b8d0be8._comment view

file too large to diff

+ doc/tips/powerful_file_matching.mdwn view

file too large to diff

+ doc/tips/recover_data_from_lost+found.mdwn view

file too large to diff

+ doc/tips/replacing_Sparkleshare_or_dvcs-autosync_with_the_assistant.mdwn view

file too large to diff

+ doc/tips/setup_a_public_repository_on_a_web_site.mdwn view

file too large to diff

+ doc/tips/shared_git_annex_directory_between_multiple_users.mdwn view

file too large to diff

+ doc/tips/skydriveannex.mdwn view

file too large to diff

+ doc/tips/untrusted_repositories.mdwn view

file too large to diff

+ doc/tips/using_Amazon_Glacier.mdwn view

file too large to diff

+ doc/tips/using_Amazon_S3.mdwn view

file too large to diff

+ doc/tips/using_Amazon_S3/comment_1_666a26f95024760c99c627eed37b1966._comment view

file too large to diff

+ doc/tips/using_Amazon_S3/comment_2_f5a0883be7dbb421b584c6dc0165f1ef._comment view

file too large to diff

+ doc/tips/using_Google_Cloud_Storage.mdwn view

file too large to diff

+ doc/tips/using_box.com_as_a_special_remote.mdwn view

file too large to diff

+ doc/tips/using_git_annex_with_no_fixed_hostname_and_optimising_ssh.mdwn view

file too large to diff

+ doc/tips/using_gitolite_with_git-annex.mdwn view

file too large to diff

+ doc/tips/using_the_SHA1_backend.mdwn view

file too large to diff

+ doc/tips/using_the_web_as_a_special_remote.mdwn view

file too large to diff

+ doc/tips/visualizing_repositories_with_gource.mdwn view

file too large to diff

+ doc/tips/visualizing_repositories_with_gource/screenshot.jpg view

file too large to diff

+ doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn view

file too large to diff

+ doc/tips/what_to_do_when_you_lose_a_repository.mdwn view

file too large to diff

+ doc/tips/yet_another_simple_disk_usage_like_utility.mdwn view

file too large to diff

+ doc/todo.mdwn view

file too large to diff

+ doc/todo/A_really_simple_way_to_pair_devices_like_bittorent_sync.mdwn view

file too large to diff

+ doc/todo/Bittorrent-like_features.mdwn view

file too large to diff

+ doc/todo/Build_for_Synology_DSM.mdwn view

file too large to diff

+ doc/todo/Move_ssh_config_to___126____47__ssh__47__git-annex__47__config.mdwn view

file too large to diff

+ doc/todo/Please_abort_build_if___34__make_test__34___fails.mdwn view

file too large to diff

+ doc/todo/Please_add_support_for_monad-control_0.3.x.mdwn view

file too large to diff

+ doc/todo/S3.mdwn view

file too large to diff

+ doc/todo/Slow_transfer_for_a_lot_of_small_files..mdwn view

file too large to diff

+ doc/todo/Use_MediaScannerConnection_on_Android.mdwn view

file too large to diff

+ doc/todo/Use_a_remote_as_a_sharing_site_for_files_with_obfuscated_URLs.mdwn view

file too large to diff

+ doc/todo/Wishlist:_additional_environment_variables_for_hooks.mdwn view

file too large to diff

+ doc/todo/Wishlist:_sanitychecker_fix_wrong_UUID__47__duplicate_remote.mdwn view

file too large to diff

+ doc/todo/add_--exclude_option_to_git_annex_find.mdwn view

file too large to diff

+ doc/todo/add_-all_option.mdwn view

file too large to diff

+ doc/todo/add_a_git_backend.mdwn view

file too large to diff

+ doc/todo/add_an_icon_for_the_.desktop_file.mdwn view

file too large to diff

+ doc/todo/add_metadata_to_annexed_files.mdwn view

file too large to diff

+ doc/todo/assistant_git_sync_laddering.mdwn view

file too large to diff

+ doc/todo/assistant_smarter_archive_directory_handling.mdwn view

file too large to diff

+ doc/todo/assistant_threaded_runtime.mdwn view

file too large to diff

+ doc/todo/auto_remotes.mdwn view

file too large to diff

+ doc/todo/auto_remotes/discussion.mdwn view

file too large to diff

+ doc/todo/automatic_bookkeeping_watch_command.mdwn view

file too large to diff

+ doc/todo/avoid_unnecessary_union_merges.mdwn view

file too large to diff

+ doc/todo/backendSHA1.mdwn view

file too large to diff

+ doc/todo/branching.mdwn view

file too large to diff

+ doc/todo/cache_key_info.mdwn view

file too large to diff

+ doc/todo/cache_key_info/comment_1_578df1b3b2cbfdc4aa1805378f35dc48._comment view

file too large to diff

+ doc/todo/checkout.mdwn view

file too large to diff

+ doc/todo/checksum_verification_on_transfer.mdwn view

file too large to diff

+ doc/todo/direct_mode_guard.mdwn view

file too large to diff

+ doc/todo/done.mdwn view

file too large to diff

+ doc/todo/exclude_files_on_a_given_remote.mdwn view

file too large to diff

+ doc/todo/faster_gnupg_cipher.mdwn view

file too large to diff

+ doc/todo/faster_rsync_remotes.mdwn view

file too large to diff

+ doc/todo/file_copy_progress_bar.mdwn view

file too large to diff

+ doc/todo/free_space_checking_for_local_special_remotes.mdwn view

file too large to diff

+ doc/todo/fsck.mdwn view

file too large to diff

+ doc/todo/fsck_special_remotes.mdwn view

file too large to diff

+ doc/todo/git-annex-shell.mdwn view

file too large to diff

+ doc/todo/git-annex_unused_eats_memory.mdwn view

file too large to diff

+ doc/todo/gitolite_and_gitosis_support.mdwn view

file too large to diff

+ doc/todo/gitrm.mdwn view

file too large to diff

+ doc/todo/hidden_files.mdwn view

file too large to diff

+ doc/todo/http_git_annex_404_retry.mdwn view

file too large to diff

+ doc/todo/http_headers.mdwn view

file too large to diff

+ doc/todo/immutable_annexed_files.mdwn view

file too large to diff

+ doc/todo/importfeed:_allow___36____123__itemdate__125___with_--template.mdwn view

file too large to diff

+ doc/todo/incremental_fsck.mdwn view

file too large to diff

+ doc/todo/keep_annexed_files_for_a_while.mdwn view

file too large to diff

file too large to diff

+ doc/todo/makefile:_respect___36__PREFIX.mdwn view

file too large to diff

+ doc/todo/mdwn2man:_make_backticks_bold.mdwn view

file too large to diff

+ doc/todo/network_remotes.mdwn view

file too large to diff

+ doc/todo/nicer_whereis_output.mdwn view

file too large to diff

+ doc/todo/object_dir_reorg_v2.mdwn view

file too large to diff

+ doc/todo/optimise_git-annex_merge.mdwn view

file too large to diff

+ doc/todo/optinally_transfer_file_unencryptedly.mdwn view

file too large to diff

+ doc/todo/parallel_possibilities.mdwn view

file too large to diff

+ doc/todo/pushpull.mdwn view

file too large to diff

+ doc/todo/redundancy_stats_in_status.mdwn view

file too large to diff

+ doc/todo/resuming_encrypted_uploads.mdwn view

file too large to diff

+ doc/todo/rsync.mdwn view

file too large to diff

+ doc/todo/smudge.mdwn view

file too large to diff

+ doc/todo/smudge/comment_1_4ea616bcdbc9e9a6fae9f2e2795c31c9._comment view

file too large to diff

+ doc/todo/smudge/comment_2_e04b32caa0d2b4c577cdaf382a3ff7f6._comment view

file too large to diff

+ doc/todo/special_remote_for_amazon_glacier.mdwn view

file too large to diff

+ doc/todo/speed_up_fsck.mdwn view

file too large to diff

+ doc/todo/stream_feature__63__.mdwn view

file too large to diff

+ doc/todo/support-non-utf8-locales.mdwn view

file too large to diff

+ doc/todo/support_S3_multipart_uploads.mdwn view

file too large to diff

+ doc/todo/support_for_lossy_remotes.mdwn view

file too large to diff

+ doc/todo/support_for_writing_external_special_remotes.mdwn view

file too large to diff

+ doc/todo/support_fsck_in_bare_repos.mdwn view

file too large to diff

file too large to diff

+ doc/todo/sync_my_local_git-annex_from_a_dump_remote.mdwn view

file too large to diff

+ doc/todo/tahoe_lfs_for_reals.mdwn view

file too large to diff

+ doc/todo/union_mounting.mdwn view

file too large to diff

+ doc/todo/union_mounting/comment_1_cb08435812dd7766de26199c73f38e8b._comment view

file too large to diff

+ doc/todo/union_mounting/comment_2_240b1736f6bd4fbf87c372d3a46e661b._comment view

file too large to diff

+ doc/todo/untracked_remotes.mdwn view

file too large to diff

+ doc/todo/use_cp_reflink.mdwn view

file too large to diff

+ doc/todo/using_url_backend.mdwn view

file too large to diff

+ doc/todo/windows_support.mdwn view

file too large to diff

+ doc/todo/windows_support/comment_1_3cc26ad8101a22e95a8c60cf0c4dedcc._comment view

file too large to diff

+ doc/todo/windows_support/comment_2_8acae818ce468967499050bbe3c532ea._comment view

file too large to diff

+ doc/todo/windows_support/comment_3_bd0a12f4c9b884ab8a06082842381a01._comment view

file too large to diff

+ doc/todo/windows_support/comment_4_ad06b98b2ddac866ffee334e41fee6a8._comment view

file too large to diff

+ doc/todo/windows_support/comment_5_444fc7251f57db241b6e80abae41851c._comment view

file too large to diff

+ doc/todo/windows_support/comment_6_34f1f60b570c389bb1e741b990064a7e._comment view

file too large to diff

+ doc/todo/windows_support/comment_7_a5ca56c487257434650420acfa60e39f._comment view

file too large to diff

+ doc/todo/windows_support/comment_8_61214de7d967740d42905f3823ce2f65._comment view

file too large to diff

+ doc/todo/windows_support/comment_9_259a0b1a6f4d8d1944173380adc5e7c8._comment view

file too large to diff

+ doc/todo/wishlist:_Add_to_Android_version_to_Google_Play.mdwn view

file too large to diff

+ doc/todo/wishlist:_Advanced_settings_for_xmpp_and_webdav.mdwn view

file too large to diff

+ doc/todo/wishlist:_An_--all_option_for_dropunused.mdwn view

file too large to diff

+ doc/todo/wishlist:_An_option_like_--git-dir.mdwn view

file too large to diff

+ doc/todo/wishlist:_Freeing_X_space_on_remote_Y.mdwn view

file too large to diff

+ doc/todo/wishlist:_GnuPG_options.mdwn view

file too large to diff

+ doc/todo/wishlist:_Have_a_preview_of_download_or_upload_size.mdwn view

file too large to diff

+ doc/todo/wishlist:_Option_to_specify_max_transfer_rate.mdwn view

file too large to diff

+ doc/todo/wishlist:_Prevent_repeated_password_prompts_for_one_command.mdwn view

file too large to diff

+ doc/todo/wishlist:_Restore_s3_files_moved_to_Glacier.mdwn view

file too large to diff

+ doc/todo/wishlist:___34__git_annex_add__34___multiple_processes.mdwn view

file too large to diff

+ doc/todo/wishlist:___34__quiet__34___annex_get_for_centralized_use_case.mdwn view

file too large to diff

+ doc/todo/wishlist:___39__get__39___queue_and_schedule..mdwn view

file too large to diff

+ doc/todo/wishlist:___39__whereis__39___support_in_the_webapp.mdwn view

file too large to diff

+ doc/todo/wishlist:___96__git_annex_drop_--relaxed__96__.mdwn view

file too large to diff

+ doc/todo/wishlist:___96__git_annex_sync_-m__96__.mdwn view

file too large to diff

+ doc/todo/wishlist:_addurl_https:.mdwn view

file too large to diff

+ doc/todo/wishlist:_allow_configuration_of_downloader_for_addurl.mdwn view

file too large to diff

+ doc/todo/wishlist:_annex.largefiles_support_for_mimetypes.mdwn view

file too large to diff

+ doc/todo/wishlist:_archive_from_remote_with_the_least_free_space.mdwn view

file too large to diff

+ doc/todo/wishlist:_command_options_changes.mdwn view

file too large to diff

+ doc/todo/wishlist:_define_remotes_that_must_have_all_files.mdwn view

file too large to diff

+ doc/todo/wishlist:_disable_automatic_commits.mdwn view

file too large to diff

+ doc/todo/wishlist:_display_status_of_remotes_in_the_webapp.mdwn view

file too large to diff

+ doc/todo/wishlist:_do_round_robin_downloading_of_data.mdwn view

file too large to diff

+ doc/todo/wishlist:_dropping_git-annex_history.mdwn view

file too large to diff

+ doc/todo/wishlist:_generic_annex.cost-command.mdwn view

file too large to diff

+ doc/todo/wishlist:_git-annex_replicate.mdwn view

file too large to diff

+ doc/todo/wishlist:_git_annex_diff.mdwn view

file too large to diff

+ doc/todo/wishlist:_git_annex_put_--_same_as_get__44___but_for_defaults.mdwn view

file too large to diff

+ doc/todo/wishlist:_git_annex_status.mdwn view

file too large to diff

+ doc/todo/wishlist:_git_backend_for_git-annex.mdwn view

file too large to diff

+ doc/todo/wishlist:_history_of_operations.mdwn view

file too large to diff

+ doc/todo/wishlist:_make_git_annex_reinject_work_in_direct_mode.mdwn view

file too large to diff

+ doc/todo/wishlist:_make_partial_files_available_during_transfer.mdwn view

file too large to diff

+ doc/todo/wishlist:_more_descriptive_commit_messages_in_git-annex_branch.mdwn view

file too large to diff

+ doc/todo/wishlist:_option_to_disable_url_checking_with_addurl.mdwn view

file too large to diff

+ doc/todo/wishlist:_option_to_print_more_info_with___39__unused__39__.mdwn view

file too large to diff

+ doc/todo/wishlist:_perform_fsck_remotely.mdwn view

file too large to diff

+ doc/todo/wishlist:_print_locations_for_files_in_rsync_remote.mdwn view

file too large to diff

+ doc/todo/wishlist:_query_things_like_description__44___trust_level.mdwn view

file too large to diff

+ doc/todo/wishlist:_recursive_directory_remote_setup__47__addurl.mdwn view

file too large to diff

+ doc/todo/wishlist:_simple_url_for_webapp.mdwn view

file too large to diff

+ doc/todo/wishlist:_simpler_gpg_usage.mdwn view

file too large to diff

+ doc/todo/wishlist:_special_remote_Ubuntu_One.mdwn view

file too large to diff

+ doc/todo/wishlist:_special_remote_for_sftp_or_rsync.mdwn view

file too large to diff

+ doc/todo/wishlist:_special_remote_mega.co.nz.mdwn view

file too large to diff

+ doc/todo/wishlist:_support_copy_--from__61__x_--to__61__y.mdwn view

file too large to diff

+ doc/todo/wishlist:_support_drop__44___find_on_special_remotes.mdwn view

file too large to diff

+ doc/todo/wishlist:_support_for_more_ssh_urls_.mdwn view

file too large to diff

+ doc/todo/wishlist:_swift_backend.mdwn view

file too large to diff

+ doc/todo/wishlist:_traffic_accounting_for_git-annex.mdwn view

file too large to diff

+ doc/todo/wishlist:_unify_directory_scheme_for_the_store.mdwn view

file too large to diff

file too large to diff

+ doc/todo/wishlist:_vicfg_possible_repo_group_names.mdwn view

file too large to diff

+ doc/todo/wishlist:alias_system.mdwn view

file too large to diff

+ doc/transferring_data.mdwn view

file too large to diff

+ doc/trust.mdwn view

file too large to diff

+ doc/upgrades.mdwn view

file too large to diff

+ doc/upgrades/SHA_size.mdwn view

file too large to diff

+ doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment view

file too large to diff

+ doc/upgrades/gcrypt.mdwn view

file too large to diff

+ doc/upgrades/gcrypt/comment_1_606c1527735996ae671f78948e4ad84b._comment view

file too large to diff

+ doc/use_case/Alice.mdwn view

file too large to diff

+ doc/use_case/Bob.mdwn view

file too large to diff

+ doc/users.mdwn view

file too large to diff

+ doc/users/anarcat.mdwn view

file too large to diff

+ doc/users/chrysn.mdwn view

file too large to diff

+ doc/users/fmarier.mdwn view

file too large to diff

+ doc/users/gebi.mdwn view

file too large to diff

+ doc/users/joey.mdwn view

file too large to diff

+ doc/users/tobiastheviking.mdwn view

file too large to diff

+ doc/videos.mdwn view

file too large to diff

+ doc/videos/FOSDEM2012.mdwn view

file too large to diff

+ doc/videos/LCA2013.mdwn view

file too large to diff

+ doc/videos/git-annex_assistant_archiving.mdwn view

file too large to diff

+ doc/videos/git-annex_assistant_introduction.mdwn view

file too large to diff

+ doc/videos/git-annex_assistant_remote_sharing.mdwn view

file too large to diff

+ doc/videos/git-annex_assistant_sync_demo.mdwn view

file too large to diff

+ doc/videos/git-annex_watch_demo.mdwn view

file too large to diff

+ doc/videos/git-annex_weppapp_demo.mdwn view

file too large to diff

+ doc/walkthrough.mdwn view

file too large to diff

+ doc/walkthrough/adding_a_remote.mdwn view

file too large to diff

+ doc/walkthrough/adding_files.mdwn view

file too large to diff

+ doc/walkthrough/automatically_managing_content.mdwn view

file too large to diff

+ doc/walkthrough/backups.mdwn view

file too large to diff

+ doc/walkthrough/creating_a_repository.mdwn view

file too large to diff

+ doc/walkthrough/fsck:_verifying_your_data.mdwn view

file too large to diff

+ doc/walkthrough/fsck:_when_things_go_wrong.mdwn view

file too large to diff

+ doc/walkthrough/getting_file_content.mdwn view

file too large to diff

+ doc/walkthrough/modifying_annexed_files.mdwn view

file too large to diff

+ doc/walkthrough/more.mdwn view

file too large to diff

+ doc/walkthrough/moving_file_content_between_repositories.mdwn view

file too large to diff

+ doc/walkthrough/removing_files.mdwn view

file too large to diff

+ doc/walkthrough/removing_files:_When_things_go_wrong.mdwn view

file too large to diff

+ doc/walkthrough/renaming_files.mdwn view

file too large to diff

+ doc/walkthrough/syncing.mdwn view

file too large to diff

+ doc/walkthrough/transferring_files:_When_things_go_wrong.mdwn view

file too large to diff

+ doc/walkthrough/unused_data.mdwn view

file too large to diff

+ doc/walkthrough/using_bup.mdwn view

file too large to diff

+ doc/walkthrough/using_ssh_remotes.mdwn view

file too large to diff

+ doc/walkthrough/using_tags_and_branches.mdwn view

file too large to diff

git-annex.1 view

file too large to diff

git-annex.cabal view

file too large to diff

+ git-recover-repository.hs view

file too large to diff

standalone/android/Makefile view

file too large to diff

standalone/android/buildchroot-inchroot view

file too large to diff

standalone/android/haskell-patches/comonad_cross-build.patch view

file too large to diff

standalone/android/haskell-patches/entropy_cross-build.patch view

file too large to diff

− standalone/android/haskell-patches/file-embed_export-TH-symbols.patch

file too large to diff

− standalone/android/haskell-patches/hamlet_export-TH-splice-stuff.patch

file too large to diff

standalone/android/haskell-patches/lens_various-hacking-to-cross-build.patch view

file too large to diff

− standalone/android/haskell-patches/primitive_fix-build-with-new-ghc.patch

file too large to diff

− standalone/android/haskell-patches/shakespeare-js_TH-exports.patch

file too large to diff

+ standalone/android/haskell-patches/stm-chans_cross-build.patch view

file too large to diff

standalone/android/haskell-patches/unix-time_hack-for-Bionic.patch view

file too large to diff

standalone/android/haskell-patches/vector_hack-to-build-with-new-ghc.patch view

file too large to diff

standalone/android/haskell-patches/yesod-core_expand_TH.patch view

file too large to diff

standalone/android/haskell-patches/yesod-form_spliced-TH.patch view

file too large to diff

standalone/android/install-haskell-packages view

file too large to diff

standalone/linux/runshell view

file too large to diff

standalone/osx/git-annex.app/Contents/MacOS/runshell view

file too large to diff

+ templates/configurators/fsck.cassius view

file too large to diff

+ templates/configurators/fsck.hamlet view

file too large to diff

+ templates/configurators/fsck/form.hamlet view

file too large to diff

+ templates/configurators/fsck/formcontent.hamlet view

file too large to diff

+ templates/configurators/fsck/status.hamlet view

file too large to diff

templates/configurators/main.hamlet view

file too large to diff

+ templates/control/repairrepository.hamlet view

file too large to diff

+ templates/control/repairrepository/done.hamlet view

file too large to diff