diff options
-rw-r--r-- | CmdLine/GitAnnexShell.hs | 3 | ||||
-rw-r--r-- | CmdLine/GitAnnexShell/Fields.hs | 3 | ||||
-rw-r--r-- | Command/ConfigList.hs | 8 | ||||
-rw-r--r-- | Command/Sync.hs | 17 | ||||
-rw-r--r-- | Remote.hs | 1 | ||||
-rw-r--r-- | Remote/BitTorrent.hs | 4 | ||||
-rw-r--r-- | Remote/Bup.hs | 2 | ||||
-rw-r--r-- | Remote/Ddar.hs | 2 | ||||
-rw-r--r-- | Remote/Directory.hs | 2 | ||||
-rw-r--r-- | Remote/External.hs | 2 | ||||
-rw-r--r-- | Remote/GCrypt.hs | 2 | ||||
-rw-r--r-- | Remote/Git.hs | 25 | ||||
-rw-r--r-- | Remote/Glacier.hs | 2 | ||||
-rw-r--r-- | Remote/Hook.hs | 2 | ||||
-rw-r--r-- | Remote/List.hs | 19 | ||||
-rw-r--r-- | Remote/Rsync.hs | 2 | ||||
-rw-r--r-- | Remote/S3.hs | 2 | ||||
-rw-r--r-- | Remote/Tahoe.hs | 2 | ||||
-rw-r--r-- | Remote/Web.hs | 4 | ||||
-rw-r--r-- | Remote/WebDAV.hs | 2 | ||||
-rw-r--r-- | Types/Remote.hs | 3 | ||||
-rw-r--r-- | debian/changelog | 6 | ||||
-rw-r--r-- | doc/git-annex-shell.mdwn | 5 |
23 files changed, 75 insertions, 45 deletions
diff --git a/CmdLine/GitAnnexShell.hs b/CmdLine/GitAnnexShell.hs index 074257ac5..170548d1c 100644 --- a/CmdLine/GitAnnexShell.hs +++ b/CmdLine/GitAnnexShell.hs @@ -34,7 +34,7 @@ import qualified Command.GCryptSetup cmds_readonly :: [Command] cmds_readonly = - [ gitAnnexShellCheck Command.ConfigList.cmd + [ Command.ConfigList.cmd , gitAnnexShellCheck Command.InAnnex.cmd , gitAnnexShellCheck Command.SendKey.cmd , gitAnnexShellCheck Command.TransferInfo.cmd @@ -146,6 +146,7 @@ checkField (field, val) | field == fieldName remoteUUID = fieldCheck remoteUUID val | field == fieldName associatedFile = fieldCheck associatedFile val | field == fieldName direct = fieldCheck direct val + | field == fieldName autoInit = fieldCheck autoInit val | otherwise = False failure :: IO () diff --git a/CmdLine/GitAnnexShell/Fields.hs b/CmdLine/GitAnnexShell/Fields.hs index 93b048040..bc26df73f 100644 --- a/CmdLine/GitAnnexShell/Fields.hs +++ b/CmdLine/GitAnnexShell/Fields.hs @@ -34,3 +34,6 @@ associatedFile = Field "associatedfile" $ \f -> direct :: Field direct = Field "direct" $ \f -> f == "1" + +autoInit :: Field +autoInit = Field "autoinit" $ \f -> f == "1" diff --git a/Command/ConfigList.hs b/Command/ConfigList.hs index 95498ba20..e65d0f033 100644 --- a/Command/ConfigList.hs +++ b/Command/ConfigList.hs @@ -14,9 +14,10 @@ import Annex.Init import qualified Annex.Branch import qualified Git.Config import Remote.GCrypt (coreGCryptId) +import qualified CmdLine.GitAnnexShell.Fields as Fields cmd :: Command -cmd = noCommit $ +cmd = noCommit $ dontCheck repoExists $ command "configlist" SectionPlumbing "outputs relevant git configuration" paramNothing (withParams seek) @@ -34,13 +35,14 @@ start = do showConfig k v = liftIO $ putStrLn $ k ++ "=" ++ v {- The repository may not yet have a UUID; automatically initialize it - - when there's a git-annex branch available. -} + - when there's a git-annex branch available or if the autoinit field was + - set. -} findOrGenUUID :: Annex UUID findOrGenUUID = do u <- getUUID if u /= NoUUID then return u - else ifM Annex.Branch.hasSibling + else ifM (Annex.Branch.hasSibling <||> (isJust <$> Fields.getField Fields.autoInit)) ( do initialize Nothing getUUID diff --git a/Command/Sync.hs b/Command/Sync.hs index 3411c9405..9a2417568 100644 --- a/Command/Sync.hs +++ b/Command/Sync.hs @@ -137,19 +137,24 @@ remoteBranch :: Remote -> Git.Ref -> Git.Ref remoteBranch remote = Git.Ref.underBase $ "refs/remotes/" ++ Remote.name remote syncRemotes :: [String] -> Annex [Remote] -syncRemotes rs = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted ) +syncRemotes ps = do + -- Get remote list first, doing automatic initialization + -- of remotes when possible. + syncRemotes' ps =<< Remote.remoteList' True + +syncRemotes' :: [String] -> [Remote] -> Annex [Remote] +syncRemotes' ps remotelist = ifM (Annex.getState Annex.fast) ( nub <$> pickfast , wanted ) where - pickfast = (++) <$> listed <*> (filterM good =<< fastest <$> available) + pickfast = (++) <$> listed <*> (filterM good (fastest available)) wanted - | null rs = filterM good =<< concat . Remote.byCost <$> available + | null ps = filterM good (concat $ Remote.byCost available) | otherwise = listed - listed = concat <$> mapM Remote.byNameOrGroup rs + listed = concat <$> mapM Remote.byNameOrGroup ps available = filter (remoteAnnexSync . Remote.gitconfig) - . filter (not . Remote.isXMPPRemote) - <$> Remote.remoteList + $ filter (not . Remote.isXMPPRemote) remotelist good r | Remote.gitSyncableRemote r = Remote.Git.repoAvail $ Remote.repo r @@ -20,6 +20,7 @@ module Remote ( remoteTypes, remoteList, + remoteList', gitSyncableRemote, remoteMap, remoteMap', diff --git a/Remote/BitTorrent.hs b/Remote/BitTorrent.hs index a4ec11bf1..d3963a918 100644 --- a/Remote/BitTorrent.hs +++ b/Remote/BitTorrent.hs @@ -43,8 +43,8 @@ remote = RemoteType { } -- There is only one bittorrent remote, and it always exists. -list :: Annex [Git.Repo] -list = do +list :: Bool -> Annex [Git.Repo] +list _autoinit = do r <- liftIO $ Git.Construct.remoteNamed "bittorrent" (pure Git.Construct.fromUnknown) return [r] diff --git a/Remote/Bup.hs b/Remote/Bup.hs index 0c156345e..92ff7ab68 100644 --- a/Remote/Bup.hs +++ b/Remote/Bup.hs @@ -36,7 +36,7 @@ type BupRepo = String remote :: RemoteType remote = RemoteType { typename = "bup", - enumerate = findSpecialRemotes "buprepo", + enumerate = const (findSpecialRemotes "buprepo"), generate = gen, setup = bupSetup } diff --git a/Remote/Ddar.hs b/Remote/Ddar.hs index a24960935..b616093a3 100644 --- a/Remote/Ddar.hs +++ b/Remote/Ddar.hs @@ -31,7 +31,7 @@ data DdarRepo = DdarRepo remote :: RemoteType remote = RemoteType { typename = "ddar", - enumerate = findSpecialRemotes "ddarrepo", + enumerate = const (findSpecialRemotes "ddarrepo"), generate = gen, setup = ddarSetup } diff --git a/Remote/Directory.hs b/Remote/Directory.hs index c0bbcf544..ab4137d75 100644 --- a/Remote/Directory.hs +++ b/Remote/Directory.hs @@ -33,7 +33,7 @@ import Utility.Metered remote :: RemoteType remote = RemoteType { typename = "directory", - enumerate = findSpecialRemotes "directory", + enumerate = const (findSpecialRemotes "directory"), generate = gen, setup = directorySetup } diff --git a/Remote/External.hs b/Remote/External.hs index d09e1f9b3..6c36d879a 100644 --- a/Remote/External.hs +++ b/Remote/External.hs @@ -34,7 +34,7 @@ import qualified Data.Map as M remote :: RemoteType remote = RemoteType { typename = "external", - enumerate = findSpecialRemotes "externaltype", + enumerate = const (findSpecialRemotes "externaltype"), generate = gen, setup = externalSetup } diff --git a/Remote/GCrypt.hs b/Remote/GCrypt.hs index 8a1dcc41a..51dfed4f4 100644 --- a/Remote/GCrypt.hs +++ b/Remote/GCrypt.hs @@ -54,7 +54,7 @@ remote = RemoteType { typename = "gcrypt", -- Remote.Git takes care of enumerating gcrypt remotes too, -- and will call our gen on them. - enumerate = return [], + enumerate = const (return []), generate = gen, setup = gCryptSetup } diff --git a/Remote/Git.hs b/Remote/Git.hs index 5ac79df6d..4505c14ff 100644 --- a/Remote/Git.hs +++ b/Remote/Git.hs @@ -67,11 +67,11 @@ remote = RemoteType { setup = gitSetup } -list :: Annex [Git.Repo] -list = do +list :: Bool -> Annex [Git.Repo] +list autoinit = do c <- fromRepo Git.config rs <- mapM (tweakurl c) =<< fromRepo Git.remotes - mapM configRead rs + mapM (configRead autoinit) rs where annexurl n = "remote." ++ n ++ ".annexurl" tweakurl c r = do @@ -116,14 +116,14 @@ gitSetup (Just u) _ c = do - - Conversely, the config of an URL remote is only read when there is no - cached UUID value. -} -configRead :: Git.Repo -> Annex Git.Repo -configRead r = do +configRead :: Bool -> Git.Repo -> Annex Git.Repo +configRead autoinit r = do gc <- Annex.getRemoteGitConfig r u <- getRepoUUID r case (repoCheap r, remoteAnnexIgnore gc, u) of (_, True, _) -> return r - (True, _, _) -> tryGitConfigRead r - (False, _, NoUUID) -> tryGitConfigRead r + (True, _, _) -> tryGitConfigRead autoinit r + (False, _, NoUUID) -> tryGitConfigRead autoinit r _ -> return r gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote) @@ -196,11 +196,12 @@ repoAvail r {- Tries to read the config for a specified remote, updates state, and - returns the updated repo. -} -tryGitConfigRead :: Git.Repo -> Annex Git.Repo -tryGitConfigRead r +tryGitConfigRead :: Bool -> Git.Repo -> Annex Git.Repo +tryGitConfigRead autoinit r | haveconfig r = return r -- already read | Git.repoIsSsh r = store $ do - v <- Ssh.onRemote r (pipedconfig, return (Left $ error "configlist failed")) "configlist" [] [] + liftIO $ print autoinit + v <- Ssh.onRemote r (pipedconfig, return (Left $ error "configlist failed")) "configlist" [] configlistfields case v of Right r' | haveconfig r' -> return r' @@ -302,6 +303,10 @@ tryGitConfigRead r Annex.BranchState.disableUpdate void $ tryNonAsync $ ensureInitialized Annex.getState Annex.repo + + configlistfields = if autoinit + then [(Fields.autoInit, "1")] + else [] {- Checks if a given remote has the content for a key in its annex. -} inAnnex :: Remote -> Key -> Annex Bool diff --git a/Remote/Glacier.hs b/Remote/Glacier.hs index 75b264bac..98b7d6fad 100644 --- a/Remote/Glacier.hs +++ b/Remote/Glacier.hs @@ -31,7 +31,7 @@ type Archive = FilePath remote :: RemoteType remote = RemoteType { typename = "glacier", - enumerate = findSpecialRemotes "glacier", + enumerate = const (findSpecialRemotes "glacier"), generate = gen, setup = glacierSetup } diff --git a/Remote/Hook.hs b/Remote/Hook.hs index 9abc4e303..259a44bcd 100644 --- a/Remote/Hook.hs +++ b/Remote/Hook.hs @@ -27,7 +27,7 @@ type HookName = String remote :: RemoteType remote = RemoteType { typename = "hook", - enumerate = findSpecialRemotes "hooktype", + enumerate = const (findSpecialRemotes "hooktype"), generate = gen, setup = hookSetup } diff --git a/Remote/List.hs b/Remote/List.hs index 49b0a35f2..5472059bd 100644 --- a/Remote/List.hs +++ b/Remote/List.hs @@ -72,14 +72,19 @@ remoteList :: Annex [Remote] remoteList = do rs <- Annex.getState Annex.remotes if null rs - then do - m <- readRemoteLog - rs' <- concat <$> mapM (process m) remoteTypes - Annex.changeState $ \s -> s { Annex.remotes = rs' } - return rs' + then remoteList' False else return rs + +remoteList' :: Bool -> Annex [Remote] +remoteList' autoinit = do + m <- readRemoteLog + rs <- concat <$> mapM (process m) remoteTypes + Annex.changeState $ \s -> s { Annex.remotes = rs } + return rs where - process m t = enumerate t >>= mapM (remoteGen m t) >>= return . catMaybes + process m t = enumerate t autoinit + >>= mapM (remoteGen m t) + >>= return . catMaybes {- Forces the remoteList to be re-generated, re-reading the git config. -} remoteListRefresh :: Annex [Remote] @@ -109,7 +114,7 @@ updateRemote remote = do where updaterepo r | Git.repoIsLocal r || Git.repoIsLocalUnknown r = - Remote.Git.configRead r + Remote.Git.configRead False r | otherwise = return r {- Checks if a remote is syncable using git. -} diff --git a/Remote/Rsync.hs b/Remote/Rsync.hs index c610938a9..be9629b26 100644 --- a/Remote/Rsync.hs +++ b/Remote/Rsync.hs @@ -44,7 +44,7 @@ import qualified Data.Map as M remote :: RemoteType remote = RemoteType { typename = "rsync", - enumerate = findSpecialRemotes "rsyncurl", + enumerate = const (findSpecialRemotes "rsyncurl"), generate = gen, setup = rsyncSetup } diff --git a/Remote/S3.hs b/Remote/S3.hs index 0e7606139..1290e784a 100644 --- a/Remote/S3.hs +++ b/Remote/S3.hs @@ -54,7 +54,7 @@ type BucketName = String remote :: RemoteType remote = RemoteType { typename = "S3", - enumerate = findSpecialRemotes "s3", + enumerate = const (findSpecialRemotes "s3"), generate = gen, setup = s3Setup } diff --git a/Remote/Tahoe.hs b/Remote/Tahoe.hs index f2649fa4b..1357a0183 100644 --- a/Remote/Tahoe.hs +++ b/Remote/Tahoe.hs @@ -53,7 +53,7 @@ type Capability = String remote :: RemoteType remote = RemoteType { typename = "tahoe", - enumerate = findSpecialRemotes "tahoe", + enumerate = const (findSpecialRemotes "tahoe"), generate = gen, setup = tahoeSetup } diff --git a/Remote/Web.hs b/Remote/Web.hs index 102972b02..9892f4c98 100644 --- a/Remote/Web.hs +++ b/Remote/Web.hs @@ -36,8 +36,8 @@ remote = RemoteType { -- There is only one web remote, and it always exists. -- (If the web should cease to exist, remove this module and redistribute -- a new release to the survivors by carrier pigeon.) -list :: Annex [Git.Repo] -list = do +list :: Bool -> Annex [Git.Repo] +list _autoinit = do r <- liftIO $ Git.Construct.remoteNamed "web" (pure Git.Construct.fromUnknown) return [r] diff --git a/Remote/WebDAV.hs b/Remote/WebDAV.hs index 3c414f003..6cc53964e 100644 --- a/Remote/WebDAV.hs +++ b/Remote/WebDAV.hs @@ -36,7 +36,7 @@ import Remote.WebDAV.DavLocation remote :: RemoteType remote = RemoteType { typename = "webdav", - enumerate = findSpecialRemotes "webdav", + enumerate = const (findSpecialRemotes "webdav"), generate = gen, setup = webdavSetup } diff --git a/Types/Remote.hs b/Types/Remote.hs index 4237f5e00..4b4732a51 100644 --- a/Types/Remote.hs +++ b/Types/Remote.hs @@ -40,7 +40,8 @@ data RemoteTypeA a = RemoteType { -- human visible type name typename :: String, -- enumerates remotes of this type - enumerate :: a [Git.Repo], + -- The Bool is True if automatic initialization of remotes is desired + enumerate :: Bool -> a [Git.Repo], -- generates a remote of this type generate :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> a (Maybe (RemoteA a)), -- initializes or changes a remote diff --git a/debian/changelog b/debian/changelog index f6ea3c467..1943e3974 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,6 +22,12 @@ git-annex (5.20150732) UNRELEASED; urgency=medium * Linux standalone: Work around problem that prevented it from working properly if unpacked into a directory that contains ":" or ";" in its name. + * Simplify setup process for a ssh remote. Now it suffices to run git + remote add, followed by git-annex sync. Now the remote is automatically + initialized for use by git-annex, where before the git-annex branch had + to manually be pushed before using git-annex sync. Note that this + involved changes to git-annex-shell, so if the remote is using an old + version, the manual push is still needed. -- Joey Hess <id@joeyh.name> Fri, 31 Jul 2015 12:31:39 -0400 diff --git a/doc/git-annex-shell.mdwn b/doc/git-annex-shell.mdwn index 1a7e85570..d0e0930c5 100644 --- a/doc/git-annex-shell.mdwn +++ b/doc/git-annex-shell.mdwn @@ -31,7 +31,8 @@ first "/~/" or "/~user/" is expanded to the specified home directory. When run in a repository that does not yet have an annex.uuid, one will be created, as long as a git-annex branch has already been pushed to - the repository. + the repository, or if the autoinit= flag is used to indicate + initialization is desired. * inannex directory [key ...] @@ -95,7 +96,7 @@ to git-annex-shell are: on new dashed options). Currently used fields include remoteuuid=, associatedfile=, - and direct= + direct=, and autoinit= # HOOK |