diff options
author | Joey Hess <joey@kitenet.net> | 2012-08-22 14:51:11 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-08-22 15:05:57 -0400 |
commit | 5c3e14649ee7c404f86a1b82b648d896762cbbc2 (patch) | |
tree | 832bbe820a62a9fec50a5a179c114c9a8767006c /Annex/Branch.hs | |
parent | 5d577c32a946a070c70ddba192f3d8cf4229b7fa (diff) |
avoid unnecessary transfer scans when syncing a disconnected remote
Found a very cheap way to determine when a disconnected remote has
diverged, and has new content that needs to be transferred: Piggyback on
the git-annex branch update, which already checks for divergence.
However, this does not check if new content has appeared locally while
disconnected, that should be transferred to the remote.
Also, this does not handle cases where the two git repos are in sync,
but their content syncing has not caught up yet.
This code could have its efficiency improved:
* When multiple remotes are synced, if any one has diverged, they're
all queued for transfer scans.
* The transfer scanner could be told whether the remote has new content,
the local repo has new content, or both, and could optimise its scan
accordingly.
Diffstat (limited to 'Annex/Branch.hs')
-rw-r--r-- | Annex/Branch.hs | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/Annex/Branch.hs b/Annex/Branch.hs index 8e7f45a4a..a832efada 100644 --- a/Annex/Branch.hs +++ b/Annex/Branch.hs @@ -90,10 +90,10 @@ getBranch = maybe (hasOrigin >>= go >>= use) return =<< branchsha - called before data is read from it. Runs only once per git-annex run. -} update :: Annex () -update = runUpdateOnce $ updateTo =<< siblingBranches +update = runUpdateOnce $ void $ updateTo =<< siblingBranches {- Forces an update even if one has already been run. -} -forceUpdate :: Annex () +forceUpdate :: Annex Bool forceUpdate = updateTo =<< siblingBranches {- Merges the specified Refs into the index, if they have any changes not @@ -111,8 +111,10 @@ forceUpdate = updateTo =<< siblingBranches - - The branch is fast-forwarded if possible, otherwise a merge commit is - made. + - + - Returns True if any refs were merged in, False otherwise. -} -updateTo :: [(Git.Ref, Git.Branch)] -> Annex () +updateTo :: [(Git.Ref, Git.Branch)] -> Annex Bool updateTo pairs = do -- ensure branch exists, and get its current ref branchref <- getBranch @@ -139,6 +141,7 @@ updateTo pairs = do else commitBranch branchref merge_desc (nub $ fullname:refs) invalidateCache + return $ not $ null refs where isnewer (r, _) = inRepo $ Git.Branch.changed fullname r |