git-annex 3.20120624 → 3.20120629
raw patch · 48 files changed
+1022/−91 lines, 48 filesdep ~stmbinary-added
Dependency ranges changed: stm
Files
- Annex.hs +1/−1
- CHANGELOG +15/−0
- Command/Sync.hs +103/−2
- Common.hs +1/−0
- Git.hs +5/−0
- Git/Config.hs +4/−0
- Git/LsFiles.hs +79/−1
- Git/Types.hs +8/−0
- Git/UnionMerge.hs +7/−4
- GitAnnex.hs +6/−0
- INSTALL +2/−1
- Logs/Presence.hs +1/−1
- Makefile +1/−1
- Remote.hs +1/−1
- Remote/Directory.hs +1/−1
- Remote/Git.hs +62/−51
- Utility/Applicative.hs +16/−0
- Utility/libkqueue.o binary
- debian/changelog +15/−0
- debian/control +1/−1
- doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn +19/−0
- doc/bugs/More_sync__39__ing_weirdness_with_the_assistant_branch_on_OSX.mdwn +15/−0
- doc/bugs/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn +43/−0
- doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn +159/−0
- doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn +34/−0
- doc/bugs/undefined.mdwn +5/−0
- doc/bugs/watcher_commits_unlocked_files.mdwn +28/−0
- doc/design/assistant/.syncing.mdwn.swp binary
- doc/design/assistant/blog/day_16__more_robust_syncing.mdwn +44/−0
- doc/design/assistant/blog/day_17__push_queue_prune.mdwn +19/−0
- doc/design/assistant/blog/day_18__merging.mdwn +82/−0
- doc/design/assistant/blog/day_19__random_improvements.mdwn +50/−0
- doc/design/assistant/inotify.mdwn +16/−4
- doc/design/assistant/syncing.mdwn +47/−4
- doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn +10/−0
- doc/git-annex-shell.mdwn +1/−1
- doc/git-annex.mdwn +5/−0
- doc/install.mdwn +2/−1
- doc/install/OSX/comment_10_798000aab19af2944b6e44dbc550c6fe._comment +10/−0
- doc/install/OSX/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment +10/−0
- doc/install/OSX/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment +39/−0
- doc/install/OSX/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment +14/−0
- doc/news/version_3.20120605.mdwn +0/−11
- doc/news/version_3.20120629.mdwn +12/−0
- doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment +12/−0
- git-annex-shell.1 +1/−1
- git-annex.1 +5/−0
- git-annex.cabal +11/−4
Annex.hs view
@@ -128,7 +128,7 @@ {- Makes an Annex state object for the specified git repo. - Ensures the config is read, if it was not already. -} new :: Git.Repo -> IO AnnexState-new gitrepo = newState <$> Git.Config.read gitrepo+new = newState <$$> Git.Config.read {- performs an action in the Annex monad -} run :: AnnexState -> Annex a -> IO (a, AnnexState)
CHANGELOG view
@@ -1,3 +1,18 @@+git-annex (3.20120629) unstable; urgency=low++ * cabal: Only try to use inotify on Linux.+ * Version build dependency on STM, and allow building without it,+ which disables the watch command.+ * Avoid ugly failure mode when moving content from a local repository+ that is not available.+ * Got rid of the last place that did utf8 decoding.+ * Accept arbitrarily encoded repository filepaths etc when reading+ git config output. This fixes support for remotes with unusual characters+ in their names.+ * sync: Automatically resolves merge conflicts.++ -- Joey Hess <joeyh@debian.org> Fri, 29 Jun 2012 10:17:49 -0400+ git-annex (3.20120624) unstable; urgency=low * watch: New subcommand, a daemon which notices changes to
Command/Sync.hs view
@@ -15,15 +15,22 @@ import qualified Remote import qualified Annex import qualified Annex.Branch+import qualified Annex.Queue+import Annex.Content+import Annex.CatFile import qualified Git.Command+import qualified Git.LsFiles as LsFiles import qualified Git.Merge import qualified Git.Branch import qualified Git.Ref import qualified Git+import Git.Types (BlobType(..)) import qualified Types.Remote import qualified Remote.Git import qualified Data.Map as M+import qualified Data.ByteString.Lazy as L+import Data.Hash.MD5 def :: [Command] def = [command "sync" (paramOptional (paramRepeating paramRemote))@@ -155,10 +162,104 @@ Annex.Branch.forceUpdate stop -mergeFrom :: Git.Ref -> CommandCleanup+mergeFrom :: Git.Ref -> Annex Bool mergeFrom branch = do showOutput- inRepo $ Git.Merge.mergeNonInteractive branch+ ok <- inRepo $ Git.Merge.mergeNonInteractive branch+ if ok+ then return ok+ else resolveMerge++{- Resolves a conflicted merge. It's important that any conflicts be+ - resolved in a way that itself avoids later merge conflicts, since+ - multiple repositories may be doing this concurrently.+ -+ - Only annexed files are resolved; other files are left for the user to+ - handle.+ -+ - 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.+ -+ - 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).+ -}+resolveMerge :: Annex Bool+resolveMerge = do+ top <- fromRepo Git.repoPath+ merged <- all id <$> (mapM resolveMerge' =<< inRepo (LsFiles.unmerged [top]))+ when merged $ do+ Annex.Queue.flush+ void $ inRepo $ Git.Command.runBool "commit"+ [Param "-m", Param "git-annex automatic merge conflict fix"]+ return merged++resolveMerge' :: LsFiles.Unmerged -> Annex Bool+resolveMerge' u+ | issymlink LsFiles.valUs && issymlink LsFiles.valThem =+ withKey LsFiles.valUs $ \keyUs ->+ withKey LsFiles.valThem $ \keyThem -> go keyUs keyThem+ | otherwise = return False+ where+ go keyUs keyThem+ | keyUs == keyThem = do+ makelink keyUs+ return True+ | otherwise = do+ liftIO $ nukeFile file+ Annex.Queue.addCommand "rm" [Params "--quiet -f --"] [file]+ makelink keyUs+ makelink keyThem+ return True+ file = LsFiles.unmergedFile u+ issymlink select = any (select (LsFiles.unmergedBlobType u) ==)+ [Just SymlinkBlob, Nothing]+ makelink (Just key) = do+ let dest = mergeFile file key+ l <- calcGitLink dest key+ liftIO $ do+ nukeFile dest+ createSymbolicLink l dest+ Annex.Queue.addCommand "add" [Param "--force", Param "--"] [dest]+ makelink _ = noop+ withKey select a = do+ let msha = select $ LsFiles.unmergedSha u+ case msha of+ Nothing -> a Nothing+ Just sha -> do+ key <- fileKey . takeFileName+ . encodeW8 . L.unpack + <$> catObject sha+ maybe (return False) (a . Just) key++{- The filename to use when resolving a conflicted merge of a file,+ - that points to a key.+ -+ - Something derived from the key needs to be included in the filename,+ - but rather than exposing the whole key to the user, a very weak hash+ - is used. There is a very real, although still unlikely, chance of+ - conflicts using this hash.+ -+ - In the event that there is a conflict with the filename generated+ - for some other key, that conflict will itself be handled by the+ - conflicted merge resolution code. That case is detected, and the full+ - key is used in the filename.+ -}+mergeFile :: FilePath -> Key -> FilePath+mergeFile file key+ | doubleconflict = go $ show key+ | otherwise = go $ shortHash $ show key+ where+ varmarker = ".variant-"+ doubleconflict = varmarker `isSuffixOf` (dropExtension file)+ go v = takeDirectory file+ </> dropExtension (takeFileName file)+ ++ varmarker ++ v+ ++ takeExtension file+ +shortHash :: String -> String+shortHash = take 4 . md5s . encodeFilePath changed :: Remote -> Git.Ref -> Annex Bool changed remote b = do
Common.hs view
@@ -26,6 +26,7 @@ import Utility.Path as X import Utility.Directory as X import Utility.Monad as X+import Utility.Applicative as X import Utility.FileSystemEncoding as X import Utility.PartialPrelude as X
Git.hs view
@@ -19,6 +19,7 @@ repoIsHttp, repoIsLocal, repoIsLocalBare,+ repoIsLocalUnknown, repoDescribe, repoLocation, repoPath,@@ -98,6 +99,10 @@ repoIsLocalBare :: Repo -> Bool repoIsLocalBare Repo { location = Local { worktree = Nothing } } = True repoIsLocalBare _ = False++repoIsLocalUnknown :: Repo -> Bool+repoIsLocalUnknown Repo { location = LocalUnknown { } } = True+repoIsLocalUnknown _ = False assertLocal :: Repo -> a -> a assertLocal repo action
Git/Config.hs view
@@ -54,6 +54,10 @@ {- Reads git config from a handle and populates a repo with it. -} hRead :: Repo -> Handle -> IO Repo hRead repo h = do+ -- We use the FileSystemEncoding when reading from git-config,+ -- because it can contain arbitrary filepaths (and other strings)+ -- in any encoding.+ fileEncoding h val <- hGetContentsStrict h store val repo
Git/LsFiles.hs view
@@ -1,6 +1,6 @@ {- git ls-files interface -- - Copyright 2010 Joey Hess <joey@kitenet.net>+ - Copyright 2010,2012 Joey Hess <joey@kitenet.net> - - Licensed under the GNU GPL version 3 or higher. -}@@ -13,11 +13,16 @@ changedUnstaged, typeChanged, typeChangedStaged,+ Conflicting(..),+ Unmerged(..),+ unmerged, ) where import Common import Git import Git.Command+import Git.Types+import Git.Sha {- Scans for files that are checked into git at the specified locations. -} inRepo :: [FilePath] -> Repo -> IO [FilePath]@@ -75,3 +80,76 @@ where prefix = [Params "diff --name-only --diff-filter=T -z"] suffix = Param "--" : map File l++{- A item in conflict has two possible values.+ - Either can be Nothing, when that side deleted the file. -}+data Conflicting v = Conflicting+ { valUs :: Maybe v+ , valThem :: Maybe v+ } deriving (Show)++data Unmerged = Unmerged+ { unmergedFile :: FilePath+ , unmergedBlobType :: Conflicting BlobType+ , unmergedSha :: Conflicting Sha+ } deriving (Show)++{- Returns a list of the files in the specified locations that have+ - unresolved merge conflicts.+ -+ - ls-files outputs multiple lines per conflicting file, each with its own+ - stage number:+ - 1 = old version, can be ignored+ - 2 = us+ - 3 = them+ - If a line is omitted, that side deleted the file.+ -}+unmerged :: [FilePath] -> Repo -> IO [Unmerged]+unmerged l repo = reduceUnmerged [] . catMaybes . map parseUnmerged <$> list repo+ where+ files = map File l+ list = pipeNullSplit $ Params "ls-files --unmerged -z --" : files++data InternalUnmerged = InternalUnmerged+ { isus :: Bool+ , ifile :: FilePath+ , iblobtype :: Maybe BlobType+ , isha :: Maybe Sha+ } deriving (Show)++parseUnmerged :: String -> Maybe InternalUnmerged+parseUnmerged s+ | null file || length ws < 3 = Nothing+ | otherwise = do+ stage <- readish (ws !! 2) :: Maybe Int+ unless (stage == 2 || stage == 3) $+ fail undefined -- skip stage 1+ blobtype <- readBlobType (ws !! 0)+ sha <- extractSha (ws !! 1)+ return $ InternalUnmerged (stage == 2) file (Just blobtype) (Just sha)+ where+ (metadata, file) = separate (== '\t') s+ ws = words metadata++reduceUnmerged :: [Unmerged] -> [InternalUnmerged] -> [Unmerged]+reduceUnmerged c [] = c+reduceUnmerged c (i:is) = reduceUnmerged (new:c) rest+ where+ (rest, sibi) = findsib i is+ (blobtypeA, blobtypeB, shaA, shaB)+ | isus i = (iblobtype i, iblobtype sibi, isha i, isha sibi)+ | otherwise = (iblobtype sibi, iblobtype i, isha sibi, isha i)+ new = Unmerged+ { unmergedFile = ifile i+ , unmergedBlobType = Conflicting blobtypeA blobtypeB+ , unmergedSha = Conflicting shaA shaB+ }+ findsib templatei [] = ([], deleted templatei)+ findsib templatei (l:ls)+ | ifile l == ifile templatei = (ls, l)+ | otherwise = (l:ls, deleted templatei)+ deleted templatei = templatei+ { isus = not (isus templatei)+ , iblobtype = Nothing+ , isha = Nothing+ }
Git/Types.hs view
@@ -51,6 +51,7 @@ {- Types of objects that can be stored in git. -} data ObjectType = BlobObject | CommitObject | TreeObject+ deriving (Eq) instance Show ObjectType where show BlobObject = "blob"@@ -65,9 +66,16 @@ {- Types of blobs. -} data BlobType = FileBlob | ExecutableBlob | SymlinkBlob+ deriving (Eq) {- Git uses magic numbers to denote the type of a blob. -} instance Show BlobType where show FileBlob = "100644" show ExecutableBlob = "100755" show SymlinkBlob = "120000"++readBlobType :: String -> Maybe BlobType+readBlobType "100644" = Just FileBlob+readBlobType "100755" = Just ExecutableBlob+readBlobType "120000" = Just SymlinkBlob+readBlobType _ = Nothing
Git/UnionMerge.hs view
@@ -10,8 +10,7 @@ mergeIndex ) where -import qualified Data.Text.Lazy as L-import qualified Data.Text.Lazy.Encoding as L+import qualified Data.ByteString.Lazy as L import qualified Data.Set as S import Common@@ -79,10 +78,14 @@ =<< calcMerge . zip shas <$> mapM getcontents shas where [_colonmode, _bmode, asha, bsha, _status] = words info- getcontents s = map L.unpack . L.lines .- L.decodeUtf8 <$> catObject h s use sha = return $ Just $ updateIndexLine sha FileBlob $ asTopFilePath file+ -- We don't know how the file is encoded, but need to+ -- split it into lines to union merge. Using the+ -- FileSystemEncoding for this is a hack, but ensures there+ -- are no decoding errors. Note that this works because+ -- streamUpdateIndex sets fileEncoding on its write handle.+ getcontents s = lines . encodeW8 . L.unpack <$> catObject h s {- Calculates a union merge between a list of refs, with contents. -
GitAnnex.hs view
@@ -5,6 +5,8 @@ - Licensed under the GNU GPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module GitAnnex where import System.Console.GetOpt@@ -58,7 +60,9 @@ import qualified Command.Map import qualified Command.Upgrade import qualified Command.Version+#ifdef WITH_ASSISTANT import qualified Command.Watch+#endif cmds :: [Command] cmds = concat@@ -100,7 +104,9 @@ , Command.Map.def , Command.Upgrade.def , Command.Version.def+#ifdef WITH_ASSISTANT , Command.Watch.def+#endif ] options :: [Option]
INSTALL view
@@ -37,12 +37,13 @@ * [TestPack](http://hackage.haskell.org/cgi-bin/hackage-scripts/package/testpack) * [QuickCheck 2](http://hackage.haskell.org/package/QuickCheck) * [HTTP](http://hackage.haskell.org/package/HTTP)- * [hS3](http://hackage.haskell.org/package/hS3) (optional) * [json](http://hackage.haskell.org/package/json) * [IfElse](http://hackage.haskell.org/package/IfElse) * [bloomfilter](http://hackage.haskell.org/package/bloomfilter) * [edit-distance](http://hackage.haskell.org/package/edit-distance)+ * [hS3](http://hackage.haskell.org/package/hS3) (optional) * [stm](http://hackage.haskell.org/package/stm)+ (optional; version 2.3 or newer) * [hinotify](http://hackage.haskell.org/package/hinotify) (optional; Linux only) * Shell commands
Logs/Presence.hs view
@@ -48,7 +48,7 @@ {- Reads a log file. - Note that the LogLines returned may be in any order. -} readLog :: FilePath -> Annex [LogLine]-readLog file = parseLog <$> Annex.Branch.get file+readLog = parseLog <$$> Annex.Branch.get {- Parses a log file. Unparseable lines are ignored. -} parseLog :: String -> [LogLine]
Makefile view
@@ -14,7 +14,7 @@ PREFIX=/usr IGNORE=-ignore-package monads-fd -ignore-package monads-tf-BASEFLAGS=-Wall $(IGNORE) -outputdir tmp -IUtility -DWITH_S3 $(BASEFLAGS_OPTS)+BASEFLAGS=-Wall $(IGNORE) -outputdir tmp -IUtility -DWITH_ASSISTANT -DWITH_S3 $(BASEFLAGS_OPTS) GHCFLAGS=-O2 $(BASEFLAGS) CFLAGS=-Wall
Remote.hs view
@@ -75,7 +75,7 @@ byName' "" = return $ Left "no remote specified" byName' n = handle . filter matching <$> remoteList where- handle [] = Left $ "there is no git remote named \"" ++ n ++ "\""+ handle [] = Left $ "there is no available git remote named \"" ++ n ++ "\"" handle match = Right $ Prelude.head match matching r = n == name r || toUUID n == uuid r
Remote/Directory.hs view
@@ -272,7 +272,7 @@ remove :: FilePath -> ChunkSize -> Key -> Annex Bool remove d chunksize k = liftIO $ withStoredFiles chunksize d k go where- go files = all id <$> mapM removefile files+ go = all id <$$> mapM removefile removefile file = catchBoolIO $ do let dir = parentDir file allowWrite dir
Remote/Git.hs view
@@ -42,7 +42,8 @@ list :: Annex [Git.Repo] list = do c <- fromRepo Git.config- mapM (tweakurl c) =<< fromRepo Git.remotes+ rs <- mapM (tweakurl c) =<< fromRepo Git.remotes+ mapM configread rs where annexurl n = "remote." ++ n ++ ".annexurl" tweakurl c r = do@@ -52,41 +53,57 @@ Just url -> inRepo $ \g -> Git.Construct.remoteNamed n $ Git.Construct.fromRemoteLocation url g+ {- It's assumed to be cheap to read the config of non-URL+ - remotes, so this is done each time git-annex is run+ - in a way that uses remotes.+ - Conversely, the config of an URL remote is only read+ - when there is no cached UUID value. -}+ configread r = do+ notignored <- repoNotIgnored r+ u <- getRepoUUID r+ case (repoCheap r, notignored, u) of+ (_, False, _) -> return r+ (True, _, _) -> tryGitConfigRead r+ (False, _, NoUUID) -> tryGitConfigRead r+ _ -> return r -gen :: Git.Repo -> UUID -> Maybe RemoteConfig -> Annex Remote-gen r u _ = do- {- It's assumed to be cheap to read the config of non-URL remotes,- - so this is done each time git-annex is run. Conversely,- - the config of an URL remote is only read when there is no- - cached UUID value. -}- let cheap = not $ Git.repoIsUrl r- notignored <- repoNotIgnored r- r' <- case (cheap, notignored, u) of- (_, False, _) -> return r- (True, _, _) -> tryGitConfigRead r- (False, _, NoUUID) -> tryGitConfigRead r- _ -> return r+repoCheap :: Git.Repo -> Bool+repoCheap = not . Git.repoIsUrl - u' <- getRepoUUID r'+gen :: Git.Repo -> UUID -> Maybe RemoteConfig -> Annex Remote+gen r u _ = new <$> remoteCost r defcst+ where+ defcst = if repoCheap r then cheapRemoteCost else expensiveRemoteCost+ new cst = Remote {+ uuid = u,+ cost = cst,+ name = Git.repoDescribe r,+ storeKey = copyToRemote r,+ retrieveKeyFile = copyFromRemote r,+ retrieveKeyFileCheap = copyFromRemoteCheap r,+ removeKey = dropKey r,+ hasKey = inAnnex r,+ hasKeyCheap = repoCheap r,+ whereisKey = Nothing,+ config = Nothing,+ repo = r,+ remotetype = remote+ } - let defcst = if cheap then cheapRemoteCost else expensiveRemoteCost- cst <- remoteCost r' defcst+{- Checks relatively inexpensively if a repository is available for use. -}+repoAvail :: Git.Repo -> Annex Bool+repoAvail r + | Git.repoIsHttp r = return True+ | Git.repoIsUrl r = return True+ | Git.repoIsLocalUnknown r = return False+ | otherwise = liftIO $ catchBoolIO $ onLocal r $ return True - return Remote {- uuid = u',- cost = cst,- name = Git.repoDescribe r',- storeKey = copyToRemote r',- retrieveKeyFile = copyFromRemote r',- retrieveKeyFileCheap = copyFromRemoteCheap r',- removeKey = dropKey r',- hasKey = inAnnex r',- hasKeyCheap = cheap,- whereisKey = Nothing,- config = Nothing,- repo = r',- remotetype = remote- }+{- Avoids performing an action on a local repository that's not usable.+ - Does not check that the repository is still available on disk. -}+guardUsable :: Git.Repo -> a -> Annex a -> Annex a+guardUsable r onerr a+ | Git.repoIsLocalUnknown r = return onerr+ | otherwise = a {- Tries to read the config for a specified remote, updates state, and - returns the updated repo. -}@@ -159,7 +176,7 @@ dispatch ExitSuccess = Right True dispatch (ExitFailure 1) = Right False dispatch _ = unknown- checklocal = dispatch <$> check+ checklocal = guardUsable r unknown $ dispatch <$> check where check = liftIO $ catchMsgIO $ onLocal r $ Annex.Content.inAnnexSafe key@@ -168,13 +185,6 @@ dispatch (Right Nothing) = unknown unknown = Left $ "unable to check " ++ Git.repoDescribe r -{- Checks inexpensively if a repository is available for use. -}-repoAvail :: Git.Repo -> Annex Bool-repoAvail r - | Git.repoIsHttp r = return True- | Git.repoIsUrl r = return True- | otherwise = liftIO $ catchBoolIO $ onLocal r $ return True- {- Runs an action on a local repository inexpensively, by making an annex - monad using that repository. -} onLocal :: Git.Repo -> Annex a -> IO a@@ -193,14 +203,15 @@ dropKey :: Git.Repo -> Key -> Annex Bool dropKey r key- | not $ Git.repoIsUrl r = commitOnCleanup r $ liftIO $ onLocal r $ do- ensureInitialized- whenM (Annex.Content.inAnnex key) $ do- Annex.Content.lockContent key $- Annex.Content.removeAnnex key- Annex.Content.logStatus key InfoMissing- Annex.Content.saveState True- return True+ | not $ Git.repoIsUrl r =+ guardUsable r False $ commitOnCleanup r $ liftIO $ onLocal r $ do+ ensureInitialized+ whenM (Annex.Content.inAnnex key) $ do+ Annex.Content.lockContent key $+ Annex.Content.removeAnnex key+ Annex.Content.logStatus key InfoMissing+ Annex.Content.saveState True+ return True | Git.repoIsHttp r = error "dropping from http repo not supported" | otherwise = commitOnCleanup r $ onRemote r (boolSystem, False) "dropkey" [ Params "--quiet --force"@@ -210,7 +221,7 @@ {- Tries to copy a key's content from a remote's annex to a file. -} copyFromRemote :: Git.Repo -> Key -> FilePath -> Annex Bool copyFromRemote r key file- | not $ Git.repoIsUrl r = do+ | not $ Git.repoIsUrl r = guardUsable r False $ do params <- rsyncParams r loc <- liftIO $ gitAnnexLocation key r rsyncOrCopyFile params loc file@@ -220,7 +231,7 @@ copyFromRemoteCheap :: Git.Repo -> Key -> FilePath -> Annex Bool copyFromRemoteCheap r key file- | not $ Git.repoIsUrl r = do+ | not $ Git.repoIsUrl r = guardUsable r False $ do loc <- liftIO $ gitAnnexLocation key r liftIO $ catchBoolIO $ createSymbolicLink loc file >> return True | Git.repoIsSsh r =@@ -233,7 +244,7 @@ {- Tries to copy a key's content to a remote's annex. -} copyToRemote :: Git.Repo -> Key -> Annex Bool copyToRemote r key- | not $ Git.repoIsUrl r = commitOnCleanup r $ do+ | not $ Git.repoIsUrl r = guardUsable r False $ commitOnCleanup r $ do keysrc <- inRepo $ gitAnnexLocation key params <- rsyncParams r -- run copy from perspective of remote
+ Utility/Applicative.hs view
@@ -0,0 +1,16 @@+{- applicative stuff+ -+ - Copyright 2012 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Utility.Applicative where++{- Like <$> , but supports one level of currying.+ - + - foo v = bar <$> action v == foo = bar <$$> action+ -}+(<$$>) :: Functor f => (a -> b) -> (c -> f a) -> c -> f b+f <$$> v = fmap f . v+infixr 4 <$$>
− Utility/libkqueue.o
binary file changed (1108 → absent bytes)
debian/changelog view
@@ -1,3 +1,18 @@+git-annex (3.20120629) unstable; urgency=low++ * cabal: Only try to use inotify on Linux.+ * Version build dependency on STM, and allow building without it,+ which disables the watch command.+ * Avoid ugly failure mode when moving content from a local repository+ that is not available.+ * Got rid of the last place that did utf8 decoding.+ * Accept arbitrarily encoded repository filepaths etc when reading+ git config output. This fixes support for remotes with unusual characters+ in their names.+ * sync: Automatically resolves merge conflicts.++ -- Joey Hess <joeyh@debian.org> Fri, 29 Jun 2012 10:17:49 -0400+ git-annex (3.20120624) unstable; urgency=low * watch: New subcommand, a daemon which notices changes to
debian/control view
@@ -21,7 +21,7 @@ libghc-bloomfilter-dev, libghc-edit-distance-dev, libghc-hinotify-dev [linux-any],- libghc-stm-dev,+ libghc-stm-dev (>= 2.3), ikiwiki, perlmagick, git,
+ doc/bugs/Issue_on_OSX_with_some_system_limits.mdwn view
@@ -0,0 +1,19 @@+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.
+ 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/build_issue_with_8baff14054e65ecbe801eb66786a55fa5245cb30.mdwn view
@@ -0,0 +1,43 @@+Building commit 8baff14054e65ecbe801eb66786a55fa5245cb30 yields this...+++<pre>+[164 of 189] Compiling Command.Sync ( Command/Sync.hs, tmp/Command/Sync.o )+Command/Sync.hs:268:34:+Not in scope: `vermarker'+Perhaps you meant `varmarker' (line 267)+make: *** [git-annex] Error 1+</pre>++Supplied fix...++<pre>++From a23a1af99c7a95c316a87f9c6f5f67a6f8ff6937 Mon Sep 17 00:00:00 2001+From: Jimmy Tang <jtang@tchpc.tcd.ie>+Date: Wed, 27 Jun 2012 21:55:22 +0100+Subject: [PATCH 14/14] fix build issue introduced in+ 8baff14054e65ecbe801eb66786a55fa5245cb30++---+ Command/Sync.hs | 2 +-+ 1 file changed, 1 insertion(+), 1 deletion(-)++diff --git a/Command/Sync.hs b/Command/Sync.hs+index b2bf24d..dfaed59 100644+--- a/Command/Sync.hs++++ b/Command/Sync.hs+@@ -265,7 +265,7 @@ mergeFile file key+ | otherwise = go $ shortHash $ show key+ where+ varmarker = ".variant-"+- doubleconflict = vermarker `isSuffixOf` (dropExtension file)++ doubleconflict = varmarker `isSuffixOf` (dropExtension file)+ go v = takeDirectory file+ </> dropExtension (takeFileName file)+ ++ varmarker ++ v+-- +1.7.11.1+</pre>++[[fixed|done]]
+ doc/bugs/error_building_git-annex_3.20120624_using_cabal.mdwn view
@@ -0,0 +1,159 @@+I am trying to install git-annex 3.20120624 using cabal. My currently installed version of git-annex is 3.20120615. After a "cabal update", the build of git-annex fails:++ bram@falafel% cabal install git-annex+ Resolving dependencies...+ [1 of 4] Compiling Utility.SafeCommand ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Utility/SafeCommand.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Utility/SafeCommand.o )+ [2 of 4] Compiling Build.TestConfig ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Build/TestConfig.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Build/TestConfig.o )+ [3 of 4] Compiling Build.Configure ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Build/Configure.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Build/Configure.o )+ [4 of 4] Compiling Main ( /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/Setup.hs, /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/Main.o )+ Linking /tmp/git-annex-3.20120624-4173/git-annex-3.20120624/dist/setup/setup ...+ checking version... 3.20120624+ checking git... yes+ checking git version... 1.7.9.5+ checking cp -a... yes+ checking cp -p... yes+ checking cp --reflink=auto... yes+ checking uuid generator... uuid+ checking xargs -0... yes+ checking rsync... yes+ checking curl... no+ checking wget... yes+ checking bup... no+ checking gpg... yes+ checking lsof... yes+ checking ssh connection caching... yes+ checking sha1... sha1sum+ checking sha512... sha512sum+ checking sha224... sha224sum+ checking sha384... sha384sum+ checking sha256... sha256sum+ Configuring git-annex-3.20120624...+ Building git-annex-3.20120624...+ Preprocessing executable 'git-annex' for git-annex-3.20120624...+ [ 1 of 183] Compiling Utility.Percentage ( Utility/Percentage.hs, dist/build/git-annex/git-annex-tmp/Utility/Percentage.o )+ [ 2 of 183] Compiling Utility.Dot ( Utility/Dot.hs, dist/build/git-annex/git-annex-tmp/Utility/Dot.o )+ [ 3 of 183] Compiling Utility.ThreadLock ( Utility/ThreadLock.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadLock.o )+ [ 4 of 183] Compiling Utility.Base64 ( Utility/Base64.hs, dist/build/git-annex/git-annex-tmp/Utility/Base64.o )+ [ 5 of 183] Compiling Utility.DataUnits ( Utility/DataUnits.hs, dist/build/git-annex/git-annex-tmp/Utility/DataUnits.o )+ [ 6 of 183] Compiling Utility.JSONStream ( Utility/JSONStream.hs, dist/build/git-annex/git-annex-tmp/Utility/JSONStream.o )+ [ 7 of 183] Compiling Messages.JSON ( Messages/JSON.hs, dist/build/git-annex/git-annex-tmp/Messages/JSON.o )+ [ 8 of 183] Compiling Build.SysConfig ( Build/SysConfig.hs, dist/build/git-annex/git-annex-tmp/Build/SysConfig.o )+ [ 9 of 183] Compiling Types.KeySource ( Types/KeySource.hs, dist/build/git-annex/git-annex-tmp/Types/KeySource.o )+ [ 10 of 183] Compiling Types.UUID ( Types/UUID.hs, dist/build/git-annex/git-annex-tmp/Types/UUID.o )+ [ 11 of 183] Compiling Utility.State ( Utility/State.hs, dist/build/git-annex/git-annex-tmp/Utility/State.o )+ [ 12 of 183] Compiling Types.Messages ( Types/Messages.hs, dist/build/git-annex/git-annex-tmp/Types/Messages.o )+ [ 13 of 183] Compiling Types.TrustLevel ( Types/TrustLevel.hs, dist/build/git-annex/git-annex-tmp/Types/TrustLevel.o )+ [ 14 of 183] Compiling Types.BranchState ( Types/BranchState.hs, dist/build/git-annex/git-annex-tmp/Types/BranchState.o )+ [ 15 of 183] Compiling Git.Index ( Git/Index.hs, dist/build/git-annex/git-annex-tmp/Git/Index.o )+ [ 16 of 183] Compiling Utility.PartialPrelude ( Utility/PartialPrelude.hs, dist/build/git-annex/git-annex-tmp/Utility/PartialPrelude.o )+ [ 17 of 183] Compiling Utility.Format ( Utility/Format.hs, dist/build/git-annex/git-annex-tmp/Utility/Format.o )+ [ 18 of 183] Compiling Utility.FileSystemEncoding ( Utility/FileSystemEncoding.hs, dist/build/git-annex/git-annex-tmp/Utility/FileSystemEncoding.o )+ [ 19 of 183] Compiling Utility.Touch ( dist/build/git-annex/git-annex-tmp/Utility/Touch.hs, dist/build/git-annex/git-annex-tmp/Utility/Touch.o )+ [ 20 of 183] Compiling Utility.Monad ( Utility/Monad.hs, dist/build/git-annex/git-annex-tmp/Utility/Monad.o )+ [ 21 of 183] Compiling Utility.Path ( Utility/Path.hs, dist/build/git-annex/git-annex-tmp/Utility/Path.o )+ [ 22 of 183] Compiling Utility.SafeCommand ( Utility/SafeCommand.hs, dist/build/git-annex/git-annex-tmp/Utility/SafeCommand.o )+ [ 23 of 183] Compiling Utility.RsyncFile ( Utility/RsyncFile.hs, dist/build/git-annex/git-annex-tmp/Utility/RsyncFile.o )+ [ 24 of 183] Compiling Utility.Exception ( Utility/Exception.hs, dist/build/git-annex/git-annex-tmp/Utility/Exception.o )+ [ 25 of 183] Compiling Utility.TempFile ( Utility/TempFile.hs, dist/build/git-annex/git-annex-tmp/Utility/TempFile.o )+ [ 26 of 183] Compiling Utility.Directory ( Utility/Directory.hs, dist/build/git-annex/git-annex-tmp/Utility/Directory.o )+ [ 27 of 183] Compiling Utility.Misc ( Utility/Misc.hs, dist/build/git-annex/git-annex-tmp/Utility/Misc.o )+ [ 28 of 183] Compiling Git.Types ( Git/Types.hs, dist/build/git-annex/git-annex-tmp/Git/Types.o )+ [ 29 of 183] Compiling Common ( Common.hs, dist/build/git-annex/git-annex-tmp/Common.o )+ [ 30 of 183] Compiling Utility.FileMode ( Utility/FileMode.hs, dist/build/git-annex/git-annex-tmp/Utility/FileMode.o )+ [ 31 of 183] Compiling Git ( Git.hs, dist/build/git-annex/git-annex-tmp/Git.o )+ [ 32 of 183] Compiling Git.Command ( Git/Command.hs, dist/build/git-annex/git-annex-tmp/Git/Command.o )+ [ 33 of 183] Compiling Git.Ref ( Git/Ref.hs, dist/build/git-annex/git-annex-tmp/Git/Ref.o )+ [ 34 of 183] Compiling Git.FilePath ( Git/FilePath.hs, dist/build/git-annex/git-annex-tmp/Git/FilePath.o )+ [ 35 of 183] Compiling Utility.Matcher ( Utility/Matcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Matcher.o )+ [ 36 of 183] Compiling Utility.Gpg ( Utility/Gpg.hs, dist/build/git-annex/git-annex-tmp/Utility/Gpg.o )+ [ 37 of 183] Compiling Types.Crypto ( Types/Crypto.hs, dist/build/git-annex/git-annex-tmp/Types/Crypto.o )+ [ 38 of 183] Compiling Types.Key ( Types/Key.hs, dist/build/git-annex/git-annex-tmp/Types/Key.o )+ [ 39 of 183] Compiling Types.Backend ( Types/Backend.hs, dist/build/git-annex/git-annex-tmp/Types/Backend.o )+ [ 40 of 183] Compiling Types.Remote ( Types/Remote.hs, dist/build/git-annex/git-annex-tmp/Types/Remote.o )+ [ 41 of 183] Compiling Git.Sha ( Git/Sha.hs, dist/build/git-annex/git-annex-tmp/Git/Sha.o )+ [ 42 of 183] Compiling Git.Branch ( Git/Branch.hs, dist/build/git-annex/git-annex-tmp/Git/Branch.o )+ [ 43 of 183] Compiling Git.UpdateIndex ( Git/UpdateIndex.hs, dist/build/git-annex/git-annex-tmp/Git/UpdateIndex.o )+ [ 44 of 183] Compiling Git.Queue ( Git/Queue.hs, dist/build/git-annex/git-annex-tmp/Git/Queue.o )+ [ 45 of 183] Compiling Git.Url ( Git/Url.hs, dist/build/git-annex/git-annex-tmp/Git/Url.o )+ [ 46 of 183] Compiling Git.Construct ( Git/Construct.hs, dist/build/git-annex/git-annex-tmp/Git/Construct.o )+ [ 47 of 183] Compiling Git.Config ( Git/Config.hs, dist/build/git-annex/git-annex-tmp/Git/Config.o )+ [ 48 of 183] Compiling Git.SharedRepository ( Git/SharedRepository.hs, dist/build/git-annex/git-annex-tmp/Git/SharedRepository.o )+ [ 49 of 183] Compiling Git.Version ( Git/Version.hs, dist/build/git-annex/git-annex-tmp/Git/Version.o )+ [ 50 of 183] Compiling Utility.CoProcess ( Utility/CoProcess.hs, dist/build/git-annex/git-annex-tmp/Utility/CoProcess.o )+ [ 51 of 183] Compiling Git.HashObject ( Git/HashObject.hs, dist/build/git-annex/git-annex-tmp/Git/HashObject.o )+ [ 52 of 183] Compiling Git.CatFile ( Git/CatFile.hs, dist/build/git-annex/git-annex-tmp/Git/CatFile.o )+ [ 53 of 183] Compiling Git.UnionMerge ( Git/UnionMerge.hs, dist/build/git-annex/git-annex-tmp/Git/UnionMerge.o )+ [ 54 of 183] Compiling Git.CheckAttr ( Git/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Git/CheckAttr.o )+ [ 55 of 183] Compiling Annex ( Annex.hs, dist/build/git-annex/git-annex-tmp/Annex.o )+ [ 56 of 183] Compiling Types.Option ( Types/Option.hs, dist/build/git-annex/git-annex-tmp/Types/Option.o )+ [ 57 of 183] Compiling Types ( Types.hs, dist/build/git-annex/git-annex-tmp/Types.o )+ [ 58 of 183] Compiling Messages ( Messages.hs, dist/build/git-annex/git-annex-tmp/Messages.o )+ [ 59 of 183] Compiling Types.Command ( Types/Command.hs, dist/build/git-annex/git-annex-tmp/Types/Command.o )+ [ 60 of 183] Compiling Locations ( Locations.hs, dist/build/git-annex/git-annex-tmp/Locations.o )+ [ 61 of 183] Compiling Common.Annex ( Common/Annex.hs, dist/build/git-annex/git-annex-tmp/Common/Annex.o )+ [ 62 of 183] Compiling Annex.Exception ( Annex/Exception.hs, dist/build/git-annex/git-annex-tmp/Annex/Exception.o )+ [ 63 of 183] Compiling Annex.BranchState ( Annex/BranchState.hs, dist/build/git-annex/git-annex-tmp/Annex/BranchState.o )+ [ 64 of 183] Compiling Annex.CatFile ( Annex/CatFile.hs, dist/build/git-annex/git-annex-tmp/Annex/CatFile.o )+ [ 65 of 183] Compiling Annex.Perms ( Annex/Perms.hs, dist/build/git-annex/git-annex-tmp/Annex/Perms.o )+ [ 66 of 183] Compiling Annex.Journal ( Annex/Journal.hs, dist/build/git-annex/git-annex-tmp/Annex/Journal.o )+ [ 67 of 183] Compiling Annex.Branch ( Annex/Branch.hs, dist/build/git-annex/git-annex-tmp/Annex/Branch.o )+ [ 68 of 183] Compiling Crypto ( Crypto.hs, dist/build/git-annex/git-annex-tmp/Crypto.o )+ [ 69 of 183] Compiling Usage ( Usage.hs, dist/build/git-annex/git-annex-tmp/Usage.o )+ [ 70 of 183] Compiling Annex.CheckAttr ( Annex/CheckAttr.hs, dist/build/git-annex/git-annex-tmp/Annex/CheckAttr.o )+ [ 71 of 183] Compiling Remote.Helper.Special ( Remote/Helper/Special.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Special.o )+ [ 72 of 183] Compiling Logs.Presence ( Logs/Presence.hs, dist/build/git-annex/git-annex-tmp/Logs/Presence.o )+ [ 73 of 183] Compiling Logs.Location ( Logs/Location.hs, dist/build/git-annex/git-annex-tmp/Logs/Location.o )+ [ 74 of 183] Compiling Logs.Web ( Logs/Web.hs, dist/build/git-annex/git-annex-tmp/Logs/Web.o )+ [ 75 of 183] Compiling Annex.LockPool ( Annex/LockPool.hs, dist/build/git-annex/git-annex-tmp/Annex/LockPool.o )+ [ 76 of 183] Compiling Backend.SHA ( Backend/SHA.hs, dist/build/git-annex/git-annex-tmp/Backend/SHA.o )+ [ 77 of 183] Compiling Backend.WORM ( Backend/WORM.hs, dist/build/git-annex/git-annex-tmp/Backend/WORM.o )+ [ 78 of 183] Compiling Backend.URL ( Backend/URL.hs, dist/build/git-annex/git-annex-tmp/Backend/URL.o )+ [ 79 of 183] Compiling Assistant.ThreadedMonad ( Assistant/ThreadedMonad.hs, dist/build/git-annex/git-annex-tmp/Assistant/ThreadedMonad.o )+ [ 80 of 183] Compiling Logs.UUIDBased ( Logs/UUIDBased.hs, dist/build/git-annex/git-annex-tmp/Logs/UUIDBased.o )+ [ 81 of 183] Compiling Logs.Remote ( Logs/Remote.hs, dist/build/git-annex/git-annex-tmp/Logs/Remote.o )+ [ 82 of 183] Compiling Utility.DiskFree ( Utility/DiskFree.hs, dist/build/git-annex/git-annex-tmp/Utility/DiskFree.o )+ [ 83 of 183] Compiling Utility.Url ( Utility/Url.hs, dist/build/git-annex/git-annex-tmp/Utility/Url.o )+ [ 84 of 183] Compiling Utility.CopyFile ( Utility/CopyFile.hs, dist/build/git-annex/git-annex-tmp/Utility/CopyFile.o )+ [ 85 of 183] Compiling Git.LsFiles ( Git/LsFiles.hs, dist/build/git-annex/git-annex-tmp/Git/LsFiles.o )+ [ 86 of 183] Compiling Git.AutoCorrect ( Git/AutoCorrect.hs, dist/build/git-annex/git-annex-tmp/Git/AutoCorrect.o )+ [ 87 of 183] Compiling Git.CurrentRepo ( Git/CurrentRepo.hs, dist/build/git-annex/git-annex-tmp/Git/CurrentRepo.o )+ [ 88 of 183] Compiling Utility.Daemon ( Utility/Daemon.hs, dist/build/git-annex/git-annex-tmp/Utility/Daemon.o )+ [ 89 of 183] Compiling Utility.LogFile ( Utility/LogFile.hs, dist/build/git-annex/git-annex-tmp/Utility/LogFile.o )+ [ 90 of 183] Compiling Utility.ThreadScheduler ( Utility/ThreadScheduler.hs, dist/build/git-annex/git-annex-tmp/Utility/ThreadScheduler.o )+ [ 91 of 183] Compiling Assistant.DaemonStatus ( Assistant/DaemonStatus.hs, dist/build/git-annex/git-annex-tmp/Assistant/DaemonStatus.o )+ [ 92 of 183] Compiling Utility.Types.DirWatcher ( Utility/Types/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/Types/DirWatcher.o )+ [ 93 of 183] Compiling Utility.INotify ( Utility/INotify.hs, dist/build/git-annex/git-annex-tmp/Utility/INotify.o )+ [ 94 of 183] Compiling Utility.DirWatcher ( Utility/DirWatcher.hs, dist/build/git-annex/git-annex-tmp/Utility/DirWatcher.o )+ [ 95 of 183] Compiling Utility.Lsof ( Utility/Lsof.hs, dist/build/git-annex/git-annex-tmp/Utility/Lsof.o )+ [ 96 of 183] Compiling Git.Merge ( Git/Merge.hs, dist/build/git-annex/git-annex-tmp/Git/Merge.o )+ [ 97 of 183] Compiling Git.Filename ( Git/Filename.hs, dist/build/git-annex/git-annex-tmp/Git/Filename.o )+ [ 98 of 183] Compiling Git.LsTree ( Git/LsTree.hs, dist/build/git-annex/git-annex-tmp/Git/LsTree.o )+ [ 99 of 183] Compiling Config ( Config.hs, dist/build/git-annex/git-annex-tmp/Config.o )+ [100 of 183] Compiling Annex.UUID ( Annex/UUID.hs, dist/build/git-annex/git-annex-tmp/Annex/UUID.o )+ [101 of 183] Compiling Logs.UUID ( Logs/UUID.hs, dist/build/git-annex/git-annex-tmp/Logs/UUID.o )+ [102 of 183] Compiling Backend ( Backend.hs, dist/build/git-annex/git-annex-tmp/Backend.o )+ [103 of 183] Compiling Remote.Helper.Hooks ( Remote/Helper/Hooks.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Hooks.o )+ [104 of 183] Compiling Remote.Helper.Encryptable ( Remote/Helper/Encryptable.hs, dist/build/git-annex/git-annex-tmp/Remote/Helper/Encryptable.o )+ [105 of 183] Compiling Annex.Queue ( Annex/Queue.hs, dist/build/git-annex/git-annex-tmp/Annex/Queue.o )+ [106 of 183] Compiling Annex.Content ( Annex/Content.hs, dist/build/git-annex/git-annex-tmp/Annex/Content.o )+ [107 of 183] Compiling Remote.S3 ( Remote/S3.hs, dist/build/git-annex/git-annex-tmp/Remote/S3.o )+ [108 of 183] Compiling Remote.Directory ( Remote/Directory.hs, dist/build/git-annex/git-annex-tmp/Remote/Directory.o )+ [109 of 183] Compiling Remote.Rsync ( Remote/Rsync.hs, dist/build/git-annex/git-annex-tmp/Remote/Rsync.o )+ [110 of 183] Compiling Remote.Web ( Remote/Web.hs, dist/build/git-annex/git-annex-tmp/Remote/Web.o )+ [111 of 183] Compiling Remote.Hook ( Remote/Hook.hs, dist/build/git-annex/git-annex-tmp/Remote/Hook.o )+ [112 of 183] Compiling Upgrade.V2 ( Upgrade/V2.hs, dist/build/git-annex/git-annex-tmp/Upgrade/V2.o )+ [113 of 183] Compiling Assistant.Changes ( Assistant/Changes.hs, dist/build/git-annex/git-annex-tmp/Assistant/Changes.o )+ + Assistant/Changes.hs:73:30:+ Not in scope: `tryReadTChan'+ Perhaps you meant `readTChan' (imported from Control.Concurrent.STM)+ cabal: Error: some packages failed to install:+ git-annex-3.20120624 failed during the building phase. The exception was:+ ExitFailure 1++This is using haskell-platform 2012.1.0.0~debian1 on Ubuntu 12.04.++> Turns out it needs version 2.3 of the STM library. (libghc-stm-dev+> package). I've made cabal detect an older version and skip building+> the new `git annex watch` command, so you'll be able to build the next+> release. [[done]] --[[Joey]]
+ doc/bugs/git-annex:_Cannot_decode_byte___39____92__xfc__39__.mdwn view
@@ -0,0 +1,34 @@+What steps will reproduce the problem?++ alip@hayalet /tmp/aaa (git)-[master] % git annex init aaa+ init aaa ok+ (Recording state in git...)+ alip@hayalet /tmp/aaa (git)-[master] % git remote add çüş /tmp/çüş+ alip@hayalet /tmp/aaa (git)-[master] % git annex sync --debug+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","symbolic-ref","HEAD"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","show-ref","git-annex"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","show-ref","--hash","refs/heads/git-annex"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","log","refs/heads/git-annex..bc45cd9c2cb7c9b0c7a12a4c0210fe6a262abac9","--oneline","-n1"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","log","refs/heads/git-annex..9220bfedd1e13b2d791c918e2d59901af353825f","--oneline","-n1"]+ (merging origin/git-annex into git-annex...)+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","cat-file","--batch"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","update-index","-z","--index-info"]+ git ["--git-dir=/tmp/aaa/.git","--work-tree=/tmp/aaa","diff-index","--raw","-z","-r","--no-renames","-l0","--cached","9220bfedd1e13b2d791c918e2d59901af353825f"]+ git-annex: Cannot decode byte '\xfc': Data.Text.Encoding.decodeUtf8: Invalid UTF-8 stream+ 1 alip@hayalet /tmp/aaa (git)-[master] % ++What is the expected output? What do you see instead?++Syncing a repository under a path with utf-8 characters in its name fails.++What version of git-annex are you using? On what operating system?++git-annex version: 3.20120624++On Exherbo, linux-3.4++Please provide any additional information below.++'\xfc' is valid UTF-8: 'LATIN SMALL LETTER U WITH DIAERESIS'++> closing as non-reproducible and presumably fixed. [[done]] --[[Joey]]
+ doc/bugs/undefined.mdwn view
@@ -0,0 +1,5 @@+Trying to move files from a local remote that is not mounted:++ git-annex: Prelude.undefined++> [[fixed|done]] --[[Joey]]
+ doc/bugs/watcher_commits_unlocked_files.mdwn view
@@ -0,0 +1,28 @@+When having "git annex watch" running, unlocking files causes the watcher+to immediately lock/commit them.++----++Possible approaches:++* The watcher could detect unlocked files by checking if newly added files+ are a typechange of a file already in git. But this would add git overhead+ to every file add.+* `git annex unlock` could add some type of flag file, which the assistant+ could check. This would work fine, for users who want to use `git annex+ unlock` with the assistant. That's probably not simple enough for most+ users, though.+* There could be a UI in the assistant to pick a file and unlock it.+ The assistant would have its own list of files it knows are unlocked.+ But I'm trying to avoid mandatory UI to use the assistant.+* Perhaps instead, have a directory, like "edit". The assistant could notice+ when files move into this special directory, and automatically unlock them.+ Then when they're moved out, automatically commit them.+* Alternatively, files that are moved out of the repository entirely could be+ automatically unlocked, and then when they're moved back in, it would+ automatically do the right thing. This may be worth implementing in+ combination with the "edit" directory, as different use cases would work+ better with one or the other. However, I don't currently get inotify+ events when files are moved out of the repository (well, I do, but it+ just says "file moved", with no forwarding address, so I don't know + how to find the file to unlock it.
+ doc/design/assistant/.syncing.mdwn.swp view
binary file changed (absent → 20480 bytes)
+ doc/design/assistant/blog/day_16__more_robust_syncing.mdwn view
@@ -0,0 +1,44 @@+I released a version of git-annex over the weekend that includes the `git+annex watch` command. There's a minor issue installing it from cabal on+OSX, which I've fixed in my tree. Nice timing: At least the watch command+should be shipped in the next Debian release, which freezes at the end of+the month.++Jimmy found out how kqueue [[blows+up|bugs/Issue_on_OSX_with_some_system_limits]] when there are too many+directories to keep all open. I'm not surprised this happens, but it's nice+to see exactly how. Odd that it happened to him at just 512 directories;+I'd have guessed more. I have plans to fork watcher programs that each+watch 512 directories (or whatever the ulimit is), to deal with this. What+a pitiful interface is kqueue.. I have not thought yet about how the watcher+programs would communicate back to the main program.++----++Back on the assistant front, I've worked today on making git syncing more+robust. Now when a push fails, it tries a pull, and a merge, and repushes.+That ensures that the push is, almost always, a fast-forward. Unless+something else gets in a push first, anyway!++If a push still fails, there's Yet Another Thread, added today, that will+wake up after 30 minutes and retry the push. It currently keeps retrying+every 30 minutes until the push finally gets though. This will deal, to+some degree, with those situations where a remote is only sometimes+available.++I need to refine the code a bit, to avoid it keeping an ever-growing queue+of failed pushes, if a remote is just dead. And to clear old failed pushes+from the queue when a later push succeeds.++I also need to write a git merge driver that handles conflicts in the tree.+If two conflicting versions of a file `foo` are saved, this would merge+them, renaming them to `foo.X` and `foo.Y`. Probably X and Y are the+git-annex keys for the content of the files; this way all clones will+resolve the conflict in a way that leads to the same tree. It's also+possible to get a conflict by one repo deleting a file, and another+modifying it. In this case, renaming the deleted file to `foo.Y` may+be the right approach, I am not sure.++I glanced through some Haskell dbus bindings today. I belive there are dbus+events available to detect when drives are mounted, and on Linux this would+let git-annex notice and sync to usb drives, etc.
+ doc/design/assistant/blog/day_17__push_queue_prune.mdwn view
@@ -0,0 +1,19 @@+Not much available time today, only a few hours.++Main thing I did was fixed up the failed push tracking to use a better data+structure. No need for a queue of failed pushes, all it needs is a map of+remotes that have an outstanding failed push, and a timestamp. Now it+won't grow in memory use forever anymore. :)++Finding the right thread mutex type for this turned out to be a bit of a+challenge. I ended up with a STM TMVar, which is left empty when there are+no pushes to retry, so the thread using it blocks until there are some. And,+it can be updated transactionally, without races.++I also fixed a bug outside the git-annex assistant code. It was possible to+crash git-annex if a local git repository was configured as a remote, and+the repository was not available on startup. git-annex now ignores such+remotes. This does impact the assistant, since it is a long running process+and git repositories will come and go. Now it ignores any that+were not available when it started up. This will need to be dealt with when+making it support removable drives.
+ doc/design/assistant/blog/day_18__merging.mdwn view
@@ -0,0 +1,82 @@+Worked on automatic merge conflict resolution today. I had expected to be+able to use git's merge driver interface for this, but that interface is+not sufficient. There are two problems with it:++1. The merge program is run when git is in the middle of an operation+ that locks the index. So it cannot delete or stage files. I need to+ do both as part of my conflict resolution strategy.+2. The merge program is not run at all when the merge conflict is caused+ by one side deleting a file, and the other side modifying it. This is+ an important case to handle.++So, instead, git-annex will use a regular `git merge`, and if it fails, it+will fix up the conflicts.++That presented its own difficully, of finding which files in the tree+conflict. `git ls-files --unmerged` is the way to do that, but its output+is a quite raw form:++ 120000 3594e94c04db171e2767224db355f514b13715c5 1 foo+ 120000 35ec3b9d7586b46c0fd3450ba21e30ef666cfcd6 3 foo+ 100644 1eabec834c255a127e2e835dadc2d7733742ed9a 2 bar+ 100644 36902d4d842a114e8b8912c02d239b2d7059c02b 3 bar++I had to stare at the rather inpenetrable documentation for hours and+write a lot of parsing and processing code to get from that to these mostly+self expanatory data types:++ data Conflicting v = Conflicting+ { valUs :: Maybe v+ , valThem :: Maybe v+ } deriving (Show)++ data Unmerged = Unmerged+ { unmergedFile :: FilePath+ , unmergedBlobType :: Conflicting BlobType+ , unmergedSha :: Conflicting Sha+ } deriving (Show)++Not the first time I've whined here about time spent parsing unix command+output, is it? :)++From there, it was relatively easy to write the actual conflict cleanup+code, and make `git annex sync` use it. Here's how it looks:++ $ ls -1+ foo.png+ bar.png+ $ git annex sync+ commit + # On branch master+ nothing to commit (working directory clean)+ ok+ merge synced/master + CONFLICT (modify/delete): bar.png deleted in refs/heads/synced/master and modified in HEAD. Version HEAD of bar.png left in tree.+ Automatic merge failed; fix conflicts and then commit the result.+ bar.png: needs merge+ (Recording state in git...)+ [master 0354a67] git-annex automatic merge conflict fix+ ok+ $ ls -1+ foo.png+ bar.variant-a1fe.png+ bar.variant-93a1.png++There are very few options for ways for the conflict resolution code to+name conflicting variants of files. The conflict resolver can only use data+present in git to generate the names, because the same conflict needs to +be resolved the same everywhere.++So I had to choose between using the full key name in the filenames produced+when resolving a merge, and using a shorter checksum of the key, that would be+more user-friendly, but could theoretically collide with another key. +I chose the checksum, and weakened it horribly by only using 32 bits of it!++Surprisingly, I think this is a safe choice. The worst that can+happens if such a collision happens is another conflict, and the conflict+resolution code will work on conflicts produced by the conflict resolution+code! In such a case, it does fall back to putting the whole key in+the filename:+"bar.variant-SHA256-s2550--2c09deac21fa93607be0844fefa870b2878a304a7714684c4cc8f800fda5e16b.png"++Still need to hook this code into `git annex assistant`.
+ doc/design/assistant/blog/day_19__random_improvements.mdwn view
@@ -0,0 +1,50 @@+Random improvements day..++Got the merge conflict resolution code working in `git annex assistant`.++Did some more fixes to the pushing and pulling code, covering some cases+I missed earlier. ++Git syncing seems to work well for me now; I've seen it recover+from a variety of error conditions, including merge conflicts and repos+that were temporarily unavailable.++----++There is definitely a MVar deadlock if the merger thread's inotify event+handler tries to run code in the Annex monad. Luckily, it doesn't+currently seem to need to do that, so I have put off debugging what's going+on there.++Reworked how the inotify thread runs, to avoid the two inotify threads+in the assistant now from both needing to wait for program termination,+in a possibly conflicting manner.++Hmm, that *seems* to have fixed the MVar deadlock problem.++----++Been thinking about how to fix [[bugs/watcher_commits_unlocked_files]].+Posted some thoughts there.++It's about time to move on to data [[syncing]]. While eventually that will+need to build a map of the repo network to efficiently sync data over the+fastest paths, I'm thinking that I'll first write a dumb version. So, two+more threads:++1. Uploads new data to every configured remote. Triggered by the watcher+ thread when it adds content. Easy; just use a `TSet` of Keys to send.++2. Downloads new data from the cheapest remote that has it. COuld be + triggered by the+ merger thread, after it merges in a git sync. Rather hard; how does it+ work out what new keys are in the tree without scanning it all? Scan+ through the git history to find newly created files? Maybe the watcher+ triggers this thread instead, when it sees a new symlink, without data,+ appear.++Both threads will need to be able to be stopped, and restarted, as needed+to control the data transfer. And a lot of other control smarts will+eventually be needed, but my first pass will be to do a straightforward+implementation. Once it's done, the git annex assistant will be basically+usable.
doc/design/assistant/inotify.mdwn view
@@ -8,13 +8,15 @@ * 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.- See [[blog/day_7__bugfixes]]+ See [[blog/day_7__bugfixes]]. * When you `git annex unlock` a file, it will immediately be re-locked.+ See [[bugs/watcher_commits_unlocked_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. I may need to fork off multiple watcher processes to handle this.+ See [[bugs/Issue_on_OSX_with_some_system_limits]]. ## beyond Linux @@ -42,6 +44,8 @@ * [man page](http://www.freebsd.org/cgi/man.cgi?query=kqueue&apropos=0&sektion=0&format=html) * <https://github.com/gorakhargosh/watchdog/blob/master/src/watchdog/observers/kqueue.py> (good example program) + *kqueue is now supported*+ * hfsevents ([haskell bindings](http://hackage.haskell.org/package/hfsevents)) is OSX specific. @@ -71,9 +75,6 @@ - honor .gitignore, not adding files it excludes (difficult, probably needs my own .gitignore parser to avoid excessive running of git commands to check for ignored files)-- Possibly, when a directory is moved out of the annex location,- unannex its contents. (Does inotify tell us where the directory moved- to so we can access it?) ## the races @@ -124,6 +125,17 @@ Not a problem; The removal event removes the old file from the index, and the add event adds the new one.++* Symlink appears, but is then deleted before it can be processed.++ Leads to an ugly message, otherwise no problem:++ ./me: readSymbolicLink: does not exist (No such file or directory)++ Here `me` is a file that was in a conflicted merge, which got+ removed as part of the resolution. This is probably coming from the watcher+ thread, which sees the newly added symlink (created by the git merge),+ but finds it deleted (by the conflict resolver) by the time it processes it. ## done
doc/design/assistant/syncing.mdwn view
@@ -13,10 +13,11 @@ [The watching can be done with the existing inotify code! This avoids needing any special mechanism to notify a remote that it's been synced to.] **done**-1. Periodically retry pushes that failed. Also, detect if a push failed- due to not being up-to-date, pull, and repush.+1. Periodically retry pushes that failed. **done** (every half an hour)+1. Also, detect if a push failed due to not being up-to-date, pull,+ and repush. **done** 2. Use a git merge driver that adds both conflicting files,- so conflicts never break a sync.+ so conflicts never break a sync. **done** 3. Investigate the XMPP approach like dvcs-autosync does, or other ways of signaling a change out of band. 4. Add a hook, so when there's a change to sync, a program can be run@@ -38,10 +39,52 @@ This probably will need lots of refinements to get working well. +### first pass: flood syncing++Before mapping the network, the best we can do is flood all files out to every+reachable remote. This is worth doing first, since it's the simplest way to+get the basic functionality of the assistant to work. And we'll need this+anyway.++### transfer tracking++ data ToTransfer = ToUpload Key | ToDownload Key+ type ToTransferChan = TChan [ToTransfer]++* ToUpload added by the watcher thread when it adds content.+* ToDownload added by the watcher thread when it seens new symlinks+ that lack content.++Transfer threads started/stopped as necessary to move data.+May sometimes want multiple threads downloading, or uploading, or even both.++ data TransferID = TransferThread ThreadID | TransferProcess Pid+ data Direction = Uploading | Downloading+ data Transfer = Transfer Direction Key TransferID EpochTime Integer+ -- add [Transfer] to DaemonStatus++The assistant needs to find out when `git-annex-shell` is receiving or+sending (triggered by another remote), so it can add data for those too.+This is important to avoid uploading content to a remote that is already+downloading it from us, or vice versa, as well as to in future let the web+app manage transfers as user desires. ++For files being received, it can see the temp file, but other than lsof+there's no good way to find the pid (and I'd rather not kill blindly).++For files being sent, there's no filesystem indication. So git-annex-shell+(and other git-annex transfer processes) should write a status file to disk.++Can use file locking on these status files to claim upload/download rights,+which will avoid races.++This status file can also be updated periodically to show amount of transfer+complete (necessary for tracking uploads).+ ## other considerations It would be nice if, when a USB drive is connected,-syncing starts automatically.+syncing starts automatically. Use dbus on Linux? This assumes the network is connected. It's often not, so the [[cloud]] needs to be used to bridge between LANs.
+ doc/forum/Wishlist:_getting_the_disk_used_by_a_subtree_of_files.mdwn view
@@ -0,0 +1,10 @@+I'm not sure if this _feature_ exists already wrapped or provided as a recipe for users or not yet. But it would be nice to be able to do a++ git annex du [PATH]++Such that the output that git annex would return is the total disk used locally in the PATH and the theoretical disk used by the PATH if it was fully populated locally. e.g.++ $ git annex du FSL0001_ANALYSIS+ $ Local: 1000kb, Annex: 2000kb++or something along the lines of that?
doc/git-annex-shell.mdwn view
@@ -46,7 +46,7 @@ This runs rsync in server mode to transfer out the content of a key. -* commit+* commit directory This commits any staged changes to the git-annex branch. It also runs the annex-content hook.
doc/git-annex.mdwn view
@@ -135,6 +135,11 @@ commands to do each of those steps by hand, or if you don't want to worry about the details, you can use sync. + Merge conflicts are automatically resolved by sync. When two conflicting+ versions of a file have been committed, both will be added to the tree,+ under different filenames. For example, file "foo" would be replaced+ with "foo.somekey" and "foo.otherkey".+ Note that syncing with a remote will not update the remote's working tree with changes made to the local repository. However, those changes are pushed to the remote, so can be merged into its working tree
doc/install.mdwn view
@@ -37,12 +37,13 @@ * [TestPack](http://hackage.haskell.org/cgi-bin/hackage-scripts/package/testpack) * [QuickCheck 2](http://hackage.haskell.org/package/QuickCheck) * [HTTP](http://hackage.haskell.org/package/HTTP)- * [hS3](http://hackage.haskell.org/package/hS3) (optional) * [json](http://hackage.haskell.org/package/json) * [IfElse](http://hackage.haskell.org/package/IfElse) * [bloomfilter](http://hackage.haskell.org/package/bloomfilter) * [edit-distance](http://hackage.haskell.org/package/edit-distance)+ * [hS3](http://hackage.haskell.org/package/hS3) (optional) * [stm](http://hackage.haskell.org/package/stm)+ (optional; version 2.3 or newer) * [hinotify](http://hackage.haskell.org/package/hinotify) (optional; Linux only) * Shell commands
+ doc/install/OSX/comment_10_798000aab19af2944b6e44dbc550c6fe._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="4.153.2.25"+ subject="comment 10"+ date="2012-06-25T15:38:44Z"+ content="""+@Agustin you should be able to work around that with: cabal install git-annex --flags=-Inotify++I've fixed it properly for the next release, it should only be using that library on Linux.+"""]]
+ doc/install/OSX/comment_11_707a1a27a15b2de8dfc8d1a30420ab4c._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwR9uOA38yi5kEUvcEWNtRiZwpxXskayE"+ nickname="Agustin"+ subject="comment 11"+ date="2012-06-27T08:54:52Z"+ content="""+Hi @joey! Perfect!... I'll do that then!++Thanks for your time man!+"""]]
+ doc/install/OSX/comment_8_a93ad4b67c5df4243268bcf32562f6be._comment view
@@ -0,0 +1,39 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwR9uOA38yi5kEUvcEWNtRiZwpxXskayE"+ nickname="Agustin"+ subject="Installation not working on OS X 10.6.8"+ date="2012-06-25T02:21:40Z"+ content="""+I try installing with brew because I already had brew setup in my machine, but all run ok but when I try to run cabal install git-annex I got an error with the hinotify-0.3.2 library complaining about a header file.++Full trace:++~~~+sudo cabal install git-annex+Resolving dependencies...+Configuring hinotify-0.3.2...+Building hinotify-0.3.2...+Preprocessing library hinotify-0.3.2...+INotify.hsc:35:25: error: sys/inotify.h: No such file or directory+INotify.hsc: In function ‘main’:+INotify.hsc:259: error: invalid use of undefined type ‘struct inotify_event’+INotify.hsc:260: error: invalid use of undefined type ‘struct inotify_event’+INotify.hsc:261: error: invalid use of undefined type ‘struct inotify_event’+INotify.hsc:262: error: invalid use of undefined type ‘struct inotify_event’+INotify.hsc:265: error: invalid use of undefined type ‘struct inotify_event’+INotify.hsc:266: error: invalid application of ‘sizeof’ to incomplete type ‘struct inotify_event’ +compiling dist/build/System/INotify_hsc_make.c failed (exit code 1)+command was: /usr/bin/gcc -c dist/build/System/INotify_hsc_make.c -o dist/build/System/INotify_hsc_make.o -m64 -fno-stack-protector -m64 -D__GLASGOW_HASKELL__=704 -Ddarwin_BUILD_OS -Ddarwin_HOST_OS -Dx86_64_BUILD_ARCH -Dx86_64_HOST_ARCH -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/directory-1.1.0.2/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/unix-2.5.1.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/old-time-1.1.0.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/bytestring-0.9.2.1/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/base-4.5.0.0/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/include -Idist/build/autogen -include dist/build/autogen/cabal_macros.h -I/usr/local/Cellar/ghc/7.4.1/lib/ghc-7.4.1/include/+cabal: Error: some packages failed to install:+git-annex-3.20120624 depends on hinotify-0.3.2 which failed to install.+hinotify-0.3.2 failed during the building phase. The exception was:+ExitFailure 1+~~~++Anyone has an idea how can I solve this.++Thanks for the time!++Agustin++"""]]
+ doc/install/OSX/comment_9_ae3ed5345bc84f57e44251d2e6c39342._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkwR9uOA38yi5kEUvcEWNtRiZwpxXskayE"+ nickname="Agustin"+ subject="For the moment"+ date="2012-06-25T02:51:10Z"+ content="""+Hi Joey! I just comment that I could not install it but the issue is with the last version (the one you just release today, so no problem!! man on sunday?? you're awesome!!!) so I installed the previous one and no problem at all++Thanks for all the efford and if you need me to try os whatever, feel free to ask!++Thanks again++Agustin+"""]]
− doc/news/version_3.20120605.mdwn
@@ -1,11 +0,0 @@-git-annex 3.20120605 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * sync: Show a nicer message if a user tries to sync to a special remote.- * lock: Reset unlocked file to index, rather than to branch head.- * import: New subcommand, pulls files from a directory outside the annex- and adds them.- * Fix display of warning message when encountering a file that uses an- unsupported backend.- * Require that the SHA256 backend can be used when building, since it's the- default.- * Preserve parent environment when running hooks of the hook special remote."""]]
+ doc/news/version_3.20120629.mdwn view
@@ -0,0 +1,12 @@+git-annex 3.20120629 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * cabal: Only try to use inotify on Linux.+ * Version build dependency on STM, and allow building without it,+ which disables the watch command.+ * Avoid ugly failure mode when moving content from a local repository+ that is not available.+ * Got rid of the last place that did utf8 decoding.+ * Accept arbitrarily encoded repository filepaths etc when reading+ git config output. This fixes support for remotes with unusual characters+ in their names.+ * sync: Automatically resolves merge conflicts."""]]
+ doc/upgrades/SHA_size/comment_1_20f9b7b75786075de666b2146dc13a60._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkjvjLHW9Omza7x1VEzIFQ8Z5honhRB90I"+ nickname="Asheesh"+ subject="The fact that the keys changed causes merge conflicts"+ date="2012-06-25T00:28:59Z"+ content="""+FYI, I have run into a problem where if you 'git annex sync' between various 'git annex v3' repositories, if the different repositories are using different encodings of the SHA1 information (one including size, one not), then the 'git merge' will declare that they conflict.++There's no indication that 'git annex migrate' is the right tool to run, except from perusing the 'git annex' man page. In my opinion this is a major user interface problem.++-- Asheesh.+"""]]
git-annex-shell.1 view
@@ -38,7 +38,7 @@ .IP "sendkey directory key" This runs rsync in server mode to transfer out the content of a key. .IP-.IP "commit"+.IP "commit directory" This commits any staged changes to the git\-annex branch. It also runs the annex\-content hook. .IP
git-annex.1 view
@@ -122,6 +122,11 @@ commands to do each of those steps by hand, or if you don't want to worry about the details, you can use sync. .IP+Merge conflicts are automatically resolved by sync. When two conflicting+versions of a file have been committed, both will be added to the tree,+under different filenames. For example, file "foo" would be replaced+with "foo.somekey" and "foo.otherkey".+.IP Note that syncing with a remote will not update the remote's working tree with changes made to the local repository. However, those changes are pushed to the remote, so can be merged into its working tree
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 3.20120624+Version: 3.20120629 Cabal-Version: >= 1.8 License: GPL Maintainer: Joey Hess <joey@kitenet.net>@@ -31,13 +31,16 @@ Flag Inotify Description: Enable inotify support +Flag Assistant+ Description: Enable git-annex assistant and watch command+ Executable git-annex Main-Is: git-annex.hs Build-Depends: MissingH, hslogger, directory, filepath, unix, containers, utf8-string, network, mtl, bytestring, old-locale, time, pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP, base == 4.5.*, monad-control, transformers-base, lifted-base,- IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, stm+ IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance -- Need to list this because it's generated from a .hsc file. Other-Modules: Utility.Touch C-Sources: Utility/libdiskfree.c@@ -47,7 +50,11 @@ Build-Depends: hS3 CPP-Options: -DWITH_S3 - if flag(Inotify)+ if flag(Assistant)+ Build-Depends: stm >= 2.3+ CPP-Options: -DWITH_ASSISTANT++ if os(linux) && flag(Inotify) Build-Depends: hinotify CPP-Options: -DWITH_INOTIFY @@ -58,7 +65,7 @@ unix, containers, utf8-string, network, mtl, bytestring, old-locale, time, pcre-light, extensible-exceptions, dataenc, SHA, process, json, HTTP, base == 4.5.*, monad-control, transformers-base, lifted-base,- IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance, stm+ IfElse, text, QuickCheck >= 2.1, bloomfilter, edit-distance Other-Modules: Utility.Touch C-Sources: Utility/libdiskfree.c Extensions: CPP