summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CmdLine/GitAnnexShell.hs3
-rw-r--r--CmdLine/GitAnnexShell/Fields.hs3
-rw-r--r--Command/ConfigList.hs8
-rw-r--r--Command/Sync.hs17
-rw-r--r--Remote.hs1
-rw-r--r--Remote/BitTorrent.hs4
-rw-r--r--Remote/Bup.hs2
-rw-r--r--Remote/Ddar.hs2
-rw-r--r--Remote/Directory.hs2
-rw-r--r--Remote/External.hs2
-rw-r--r--Remote/GCrypt.hs2
-rw-r--r--Remote/Git.hs25
-rw-r--r--Remote/Glacier.hs2
-rw-r--r--Remote/Hook.hs2
-rw-r--r--Remote/List.hs19
-rw-r--r--Remote/Rsync.hs2
-rw-r--r--Remote/S3.hs2
-rw-r--r--Remote/Tahoe.hs2
-rw-r--r--Remote/Web.hs4
-rw-r--r--Remote/WebDAV.hs2
-rw-r--r--Types/Remote.hs3
-rw-r--r--debian/changelog6
-rw-r--r--doc/git-annex-shell.mdwn5
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
diff --git a/Remote.hs b/Remote.hs
index d425fc918..57a22f36b 100644
--- a/Remote.hs
+++ b/Remote.hs
@@ -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