From 81ed7b203d1c1af7a9c7a52c939eb0797fa16ab7 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Sun, 9 Oct 2011 14:58:32 -0400 Subject: Now supports git's insteadOf configuration, to modify the url used to access a remote. Note that pushInsteadOf is not used; that and pushurl are reserved for actual git pushes. Closes: #644278 --- Git.hs | 22 ++++++++++++++++++---- debian/changelog | 3 +++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Git.hs b/Git.hs index 7a3d55dea..b87f2a265 100644 --- a/Git.hs +++ b/Git.hs @@ -496,15 +496,29 @@ configParse s = M.fromList $ map pair $ lines s configRemotes :: Repo -> IO [Repo] configRemotes repo = mapM construct remotepairs where - remotepairs = M.toList $ filterremotes $ config repo - filterremotes = M.filterWithKey (\k _ -> isremote k) + filterconfig f = filter f $ M.toList $ config repo + filterkeys f = filterconfig (\(k,_) -> f k) + remotepairs = filterkeys isremote isremote k = startswith "remote." k && endswith ".url" k construct (k,v) = do - r <- gen v + r <- gen $ calcloc v return $ repoRemoteNameSet r k - gen v | scpstyle v = repoFromUrl $ scptourl v + gen v + | scpstyle v = repoFromUrl $ scptourl v | isURI v = repoFromUrl v | otherwise = repoFromRemotePath v repo + -- insteadof config can rewrite remote location + calcloc l + | null insteadofs = l + | otherwise = replacement ++ drop (length replacement) l + where + replacement = take (length bestkey - length prefix) bestkey + bestkey = fst $ maximumBy longestvalue insteadofs + longestvalue (_, a) (_, b) = compare b a + insteadofs = filterconfig $ \(k, v) -> + endswith prefix k && + startswith v l + prefix = ".insteadof" -- git remotes can be written scp style -- [user@]host:dir scpstyle v = ":" `isInfixOf` v && not ("//" `isInfixOf` v) scptourl v = "ssh://" ++ host ++ slash dir diff --git a/debian/changelog b/debian/changelog index 6a08d62e8..a72a85a8a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -18,6 +18,9 @@ git-annex (3.20110929) UNRELEASED; urgency=low the expected repository. * Note that this git-annex will not interoperate with remotes using older versions of git-annex-shell. + * Now supports git's insteadOf configuration, to modify the url + used to access a remote. Note that pushInsteadOf is not used; + that and pushurl are reserved for actual git pushes. Closes: #644278 -- Joey Hess Thu, 29 Sep 2011 18:58:53 -0400 -- cgit v1.2.3