From bb04d1e71fe4a9c50c7e34a65a5687aca62e3ed5 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 2 Apr 2025 15:29:46 -0400 Subject: [PATCH] URL decoding for username and path * Support git remotes that use an url with a user name that is URL encoded. * Fix git-lfs special remote ssh endpoint discovery when the repository path is URL encoded. In the previous commit, Git.Url.host was made to do URL decoding. That made me wonder, what about URL encoded username and path? And so to these two additional fixes. Note that Git.Url.authority remains URL encoded. That seems ok given how it's used. --- CHANGELOG | 3 +++ Git/Url.hs | 11 +++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d172c1b897..c579827738 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,9 @@ git-annex (10.20250321) UNRELEASED; urgency=medium * migrate: Fix --remove-size to work when a file is not present. Fixes reversion introduced in version 10.20231129. * Support git remotes that use a IPV6 link-local address with a zone ID. + * Support git remotes that use an url with a user name that is URL encoded. + * Fix git-lfs special remote ssh endpoint discovery when the repository + path is URL encoded. -- Joey Hess Fri, 21 Mar 2025 12:27:11 -0400 diff --git a/Git/Url.hs b/Git/Url.hs index af13f58391..3114d1db0a 100644 --- a/Git/Url.hs +++ b/Git/Url.hs @@ -54,10 +54,13 @@ port r = Just (':':p) -> readish p Just _ -> Nothing -{- Hostname of an URL repo, including any username (ie, "user@host") -} +{- Hostname of an URL repo, including any username (ie, "user@host") + - + - Both the username and hostname are URI-decoded. + -} hostuser :: Repo -> Maybe String hostuser r = (++) - <$> authpart uriUserInfo r + <$> authpart (unEscapeString . uriUserInfo) r <*> host r {- The full authority portion an URL repo. (ie, "user@host:port") -} @@ -71,7 +74,7 @@ authpart :: (URIAuth -> a) -> Repo -> Maybe a authpart a Repo { location = Url u } = a <$> uriAuthority u authpart _ _ = Nothing -{- Path part of an URL repo. -} +{- Path part of an URL repo. It is URI-decoded. -} path :: Repo -> Maybe FilePath -path Repo { location = Url u } = Just (uriPath u) +path Repo { location = Url u } = Just $ unEscapeString $ uriPath u path _ = Nothing