From 5e1221ad530fbc9bb63cc4f5997485fc5494c6fe Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 21 May 2019 11:32:54 -0400 Subject: [PATCH] Improve shape of commit tree when importing from unversioned special remotes Make the import have the previous import as a parent, so eg `git log --stat` displays a useful diff. Also a minor optimisation, only calculate the depth of the imported history once. --- Annex/Import.hs | 38 ++++++++++++------- CHANGELOG | 2 + ...ort_from_special_remote_large_git_log.mdwn | 2 + 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/Annex/Import.hs b/Annex/Import.hs index 006bd02999..2e152a0f7a 100644 --- a/Annex/Import.hs +++ b/Annex/Import.hs @@ -163,40 +163,44 @@ buildImportCommit remote importtreeconfig importcommitconfig importable = buildImportCommit' :: ImportCommitConfig -> Maybe Sha -> History Sha -> Annex (Maybe Sha) buildImportCommit' importcommitconfig mtrackingcommit imported@(History ti _) = case mtrackingcommit of - Nothing -> Just <$> mkcommits imported + Nothing -> Just <$> mkcommitsunconnected imported Just trackingcommit -> do -- Get history of tracking branch to at most -- one more level deep than what was imported, -- so we'll have enough history to compare, -- but not spend too much time getting it. - let maxdepth = succ (historyDepth imported) + let maxdepth = succ importeddepth inRepo (getHistoryToDepth maxdepth trackingcommit) >>= go trackingcommit where - go _ Nothing = Just <$> mkcommits imported + go _ Nothing = Just <$> mkcommitsunconnected imported go trackingcommit (Just h) -- If the tracking branch head is a merge commit -- with a tree that matches the head of the history, -- and one side of the merge matches the history, -- nothing new needs to be committed. - | t == ti && any (sametodepth imported) (S.toList s) = return Nothing + | t == ti && any sametodepth (S.toList s) = return Nothing -- If the tracking branch matches the history, -- nothing new needs to be committed. -- (This is unlikely to happen.) - | sametodepth imported h' = return Nothing + | sametodepth h' = return Nothing | otherwise = do importedcommit <- case getRemoteTrackingBranchImportHistory h of - Nothing -> - mkcommits imported - Just oldimported@(History oldhc _) -> do - let oldimportedtrees = mapHistory historyCommitTree oldimported - mknewcommits oldhc oldimportedtrees imported + Nothing -> mkcommitsunconnected imported + Just oldimported@(History oldhc _) + | importeddepth == 1 -> + mkcommitconnected imported oldimported + | otherwise -> do + let oldimportedtrees = mapHistory historyCommitTree oldimported + mknewcommits oldhc oldimportedtrees imported Just <$> makeRemoteTrackingBranchMergeCommit' trackingcommit importedcommit ti where h'@(History t s) = mapHistory historyCommitTree h - sametodepth a b = a == truncateHistoryToDepth (historyDepth a) b + importeddepth = historyDepth imported + + sametodepth b = imported == truncateHistoryToDepth importeddepth b mkcommit parents tree = inRepo $ Git.Branch.commitTree (importCommitMode importcommitconfig) @@ -204,8 +208,16 @@ buildImportCommit' importcommitconfig mtrackingcommit imported@(History ti _) = parents tree - mkcommits (History importedtree hs) = do - parents <- mapM mkcommits (S.toList hs) + -- Start a new history of import commits, not connected to any + -- prior import commits. + mkcommitsunconnected (History importedtree hs) = do + parents <- mapM mkcommitsunconnected (S.toList hs) + mkcommit parents importedtree + + -- Commit the new history connected with the old history. + -- Used when the import is not versioned, so the history depth is 1. + mkcommitconnected (History importedtree _) (History oldhc _) = do + let parents = [historyCommit oldhc] mkcommit parents importedtree -- Reuse the commits from the old imported History when possible. diff --git a/CHANGELOG b/CHANGELOG index dbcab637ee..bb47c69098 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,8 @@ git-annex (7.20190508) UNRELEASED; urgency=medium * Makefile: Added install-completions to install target. * Added the ability to run one job per CPU (core), by setting annex.jobs=cpus, or using option --jobs=cpus or -Jcpus. + * Improve shape of commit tree when importing from unversioned special + remotes. -- Joey Hess Mon, 06 May 2019 13:52:02 -0400 diff --git a/doc/todo/import_from_special_remote_large_git_log.mdwn b/doc/todo/import_from_special_remote_large_git_log.mdwn index f1b43221fa..5949367156 100644 --- a/doc/todo/import_from_special_remote_large_git_log.mdwn +++ b/doc/todo/import_from_special_remote_large_git_log.mdwn @@ -18,3 +18,5 @@ and adds more commits on top of those, so this is mostly not a problem there. If the old and new imported histories are disjoint, a commit or commits will be made with no parent, but that seems acceptable; it's an edge case and it's replicating the information from the remote. + +> [[done]] --[[Joey]]