From 2980ca009586c4373b127ce688694bd84674625a Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 18 Sep 2017 14:24:42 -0400 Subject: update ExportTree table efficiently Use same diff and key lookup except when the whole tree has to be scanned. This commit was sponsored by Peter Hogg on Patreon. --- Database/Export.hs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'Database') diff --git a/Database/Export.hs b/Database/Export.hs index 7dae408fa..ad106f84e 100644 --- a/Database/Export.hs +++ b/Database/Export.hs @@ -22,7 +22,10 @@ module Database.Export ( getExportedLocation, isExportDirectoryEmpty, getExportTree, + addExportTree, + removeExportTree, updateExportTree, + updateExportTree', ExportedId, ExportTreeId, ExportedDirectoryId, @@ -183,18 +186,22 @@ updateExportTree h old new = do (diff, cleanup) <- inRepo $ Git.DiffTree.diffTreeRecursive old new forM_ diff $ \i -> do - let loc = mkExportLocation $ getTopFilePath $ - Git.DiffTree.file i srcek <- getek (Git.DiffTree.srcsha i) - case srcek of - Nothing -> return () - Just k -> liftIO $ removeExportTree h (asKey k) loc dstek <- getek (Git.DiffTree.dstsha i) - case dstek of - Nothing -> return () - Just k -> liftIO $ addExportTree h (asKey k) loc + updateExportTree' h srcek dstek i void $ liftIO cleanup where getek sha | sha == nullSha = return Nothing | otherwise = Just <$> exportKey sha + +updateExportTree' :: ExportHandle -> Maybe ExportKey -> Maybe ExportKey -> Git.DiffTree.DiffTreeItem-> Annex () +updateExportTree' h srcek dstek i = do + case srcek of + Nothing -> return () + Just k -> liftIO $ removeExportTree h (asKey k) loc + case dstek of + Nothing -> return () + Just k -> liftIO $ addExportTree h (asKey k) loc + where + loc = mkExportLocation $ getTopFilePath $ Git.DiffTree.file i -- cgit v1.2.3