URL decoding for username and path
authorJoey Hess <joeyh@joeyh.name>
Wed, 2 Apr 2025 19:29:46 +0000 (15:29 -0400)
committerJoey Hess <joeyh@joeyh.name>
Wed, 2 Apr 2025 19:29:46 +0000 (15:29 -0400)
* 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
Git/Url.hs

index d172c1b8976290aeb6fd45c754ff12bf52aa0621..c579827738cb06c39d8b945289d990f6db35a67a 100644 (file)
--- 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 <id@joeyh.name>  Fri, 21 Mar 2025 12:27:11 -0400
 
index af13f5839187260b2e1ef780ef08710f9bcef473..3114d1db0a65bcfaef27566f25db081761199d0d 100644 (file)
@@ -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