Improve startup time for commands that do not operate on remotes
And for tab completion, by not unnessessarily statting paths to remotes, which used to cause eg, spin-up of removable drives. Got rid of the remotes member of Git.Repo. This was a bit painful. Remote.Git modifies the list of remotes as it reads their configs, so still need a persistent list of remotes. So, put it in as Annex.gitremotes. It's only populated by getGitRemotes, so commands like examinekey that don't care about remotes won't do so. This commit was sponsored by Jake Vosloo on Patreon.
This commit is contained in:
parent
d0fe4d7308
commit
2b66492d6e
22 changed files with 148 additions and 70 deletions
|
@ -16,6 +16,7 @@ import qualified Remote.Rsync as Rsync
|
|||
import qualified Remote.GCrypt as GCrypt
|
||||
import qualified Git
|
||||
import qualified Git.Command
|
||||
import qualified Annex
|
||||
import qualified Annex.SpecialRemote
|
||||
import Logs.UUID
|
||||
import Logs.Remote
|
||||
|
@ -122,26 +123,26 @@ makeGitRemote basename location = makeRemote basename location $ \name ->
|
|||
- Returns the name of the remote. -}
|
||||
makeRemote :: String -> String -> (RemoteName -> Annex ()) -> Annex RemoteName
|
||||
makeRemote basename location a = do
|
||||
g <- gitRepo
|
||||
if not (any samelocation $ Git.remotes g)
|
||||
rs <- Annex.getGitRemotes
|
||||
if not (any samelocation rs)
|
||||
then do
|
||||
let name = uniqueRemoteName basename 0 g
|
||||
let name = uniqueRemoteName basename 0 rs
|
||||
a name
|
||||
return name
|
||||
else return basename
|
||||
where
|
||||
samelocation x = Git.repoLocation x == location
|
||||
|
||||
{- Generate an unused name for a remote, adding a number if
|
||||
- necessary.
|
||||
{- Given a list of all remotes, generate an unused name for a new
|
||||
- remote, adding a number if necessary.
|
||||
-
|
||||
- Ensures that the returned name is a legal git remote name. -}
|
||||
uniqueRemoteName :: String -> Int -> Git.Repo -> RemoteName
|
||||
uniqueRemoteName basename n r
|
||||
uniqueRemoteName :: String -> Int -> [Git.Repo] -> RemoteName
|
||||
uniqueRemoteName basename n rs
|
||||
| null namecollision = name
|
||||
| otherwise = uniqueRemoteName legalbasename (succ n) r
|
||||
| otherwise = uniqueRemoteName legalbasename (succ n) rs
|
||||
where
|
||||
namecollision = filter samename (Git.remotes r)
|
||||
namecollision = filter samename rs
|
||||
samename x = Git.remoteName x == Just name
|
||||
name
|
||||
| n == 0 = legalbasename
|
||||
|
|
|
@ -94,7 +94,7 @@ setRepoConfig uuid mremote oldc newc = do
|
|||
void uuidMapLoad
|
||||
when nameChanged $ do
|
||||
liftAnnex $ do
|
||||
name <- fromRepo $ uniqueRemoteName (legalName newc) 0
|
||||
name <- uniqueRemoteName (legalName newc) 0 <$> Annex.getGitRemotes
|
||||
{- git remote rename expects there to be a
|
||||
- remote.<name>.fetch, and exits nonzero if
|
||||
- there's not. Special remotes don't normally
|
||||
|
|
|
@ -69,7 +69,7 @@ withNewSecretKey use = do
|
|||
-}
|
||||
getGCryptRemoteName :: UUID -> String -> Annex RemoteName
|
||||
getGCryptRemoteName u repoloc = do
|
||||
tmpremote <- uniqueRemoteName "tmpgcryptremote" 0 <$> gitRepo
|
||||
tmpremote <- uniqueRemoteName "tmpgcryptremote" 0 <$> Annex.getGitRemotes
|
||||
void $ inRepo $ Git.Command.runBool
|
||||
[ Param "remote"
|
||||
, Param "add"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue