summaryrefslogtreecommitdiff
path: root/Assistant/Threads/Merger.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Assistant/Threads/Merger.hs')
-rw-r--r--Assistant/Threads/Merger.hs29
1 files changed, 27 insertions, 2 deletions
diff --git a/Assistant/Threads/Merger.hs b/Assistant/Threads/Merger.hs
index 1488a2f0d..d88cf00bd 100644
--- a/Assistant/Threads/Merger.hs
+++ b/Assistant/Threads/Merger.hs
@@ -10,12 +10,18 @@ module Assistant.Threads.Merger where
import Assistant.Common
import Assistant.TransferQueue
import Assistant.BranchChange
+import Assistant.DaemonStatus
+import Assistant.ScanRemotes
import Utility.DirWatcher
import Utility.Types.DirWatcher
import qualified Annex.Branch
import qualified Git
import qualified Git.Branch
import qualified Command.Sync
+import Annex.TaggedPush
+import Remote (remoteFromUUID)
+
+import qualified Data.Set as S
{- This thread watches for changes to .git/refs/, and handles incoming
- pushes. -}
@@ -64,13 +70,16 @@ onAdd file
| ".lock" `isSuffixOf` file = noop
| isAnnexBranch file = do
branchChanged
- whenM (liftAnnex Annex.Branch.forceUpdate) $
- queueDeferredDownloads "retrying deferred download" Later
+ diverged <- liftAnnex Annex.Branch.forceUpdate
+ when diverged $
+ unlessM handleDesynced $
+ queueDeferredDownloads "retrying deferred download" Later
| "/synced/" `isInfixOf` file = do
mergecurrent =<< liftAnnex (inRepo Git.Branch.current)
| otherwise = noop
where
changedbranch = fileToBranch file
+
mergecurrent (Just current)
| equivBranches changedbranch current = do
debug
@@ -80,6 +89,22 @@ onAdd file
void $ liftAnnex $ Command.Sync.mergeFrom changedbranch
mergecurrent _ = noop
+ handleDesynced = case branchTaggedBy changedbranch of
+ Nothing -> return False
+ Just u -> do
+ s <- desynced <$> getDaemonStatus
+ if S.member u s
+ then do
+ modifyDaemonStatus_ $ \st -> st
+ { desynced = S.delete u s }
+ mr <- liftAnnex $ remoteFromUUID u
+ case mr of
+ Just r -> do
+ addScanRemotes True [r]
+ return True
+ Nothing -> return False
+ else return False
+
equivBranches :: Git.Ref -> Git.Ref -> Bool
equivBranches x y = base x == base y
where