Support unescaped repository urls, like git does.
Turns out that git will accept a .git/config containing an url with eg, spaces in its name. Handle this by escaping the url if it's not valid. This also fixes support for urls containing escaped characters like %20 for space. Before, the path from the url was not unescaped properly.
This commit is contained in:
parent
3e3ed62bdf
commit
0b27e6baa0
3 changed files with 23 additions and 7 deletions
4
Git.hs
4
Git.hs
|
@ -29,7 +29,7 @@ module Git (
|
||||||
|
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
import Data.Char
|
import Data.Char
|
||||||
import Network.URI (uriPath, uriScheme)
|
import Network.URI (uriPath, uriScheme, unEscapeString)
|
||||||
|
|
||||||
import Common
|
import Common
|
||||||
import Git.Types
|
import Git.Types
|
||||||
|
@ -107,7 +107,7 @@ gitDir repo
|
||||||
-
|
-
|
||||||
- Note that for URL repositories, this is the path on the remote host. -}
|
- Note that for URL repositories, this is the path on the remote host. -}
|
||||||
workTree :: Repo -> FilePath
|
workTree :: Repo -> FilePath
|
||||||
workTree Repo { location = Url u } = uriPath u
|
workTree Repo { location = Url u } = unEscapeString $ uriPath u
|
||||||
workTree Repo { location = Dir d } = d
|
workTree Repo { location = Dir d } = d
|
||||||
workTree Repo { location = Unknown } = undefined
|
workTree Repo { location = Unknown } = undefined
|
||||||
|
|
||||||
|
|
|
@ -60,14 +60,23 @@ fromAbsPath dir
|
||||||
where
|
where
|
||||||
ret = return . newFrom . Dir
|
ret = return . newFrom . Dir
|
||||||
|
|
||||||
{- Remote Repo constructor. Throws exception on invalid url. -}
|
{- Remote Repo constructor. Throws exception on invalid url.
|
||||||
|
-
|
||||||
|
- Git is somewhat forgiving about urls to repositories, allowing
|
||||||
|
- eg spaces that are not normally allowed unescaped in urls.
|
||||||
|
-}
|
||||||
fromUrl :: String -> IO Repo
|
fromUrl :: String -> IO Repo
|
||||||
fromUrl url
|
fromUrl url
|
||||||
|
| not (isURI url) = fromUrlStrict $ escapeURIString isUnescapedInURI url
|
||||||
|
| otherwise = fromUrlStrict url
|
||||||
|
|
||||||
|
fromUrlStrict :: String -> IO Repo
|
||||||
|
fromUrlStrict url
|
||||||
| startswith "file://" url = fromAbsPath $ uriPath u
|
| startswith "file://" url = fromAbsPath $ uriPath u
|
||||||
| otherwise = return $ newFrom $ Url u
|
| otherwise = return $ newFrom $ Url u
|
||||||
where
|
where
|
||||||
u = fromMaybe bad $ parseURI url
|
u = fromMaybe bad $ parseURI url
|
||||||
bad = error $ "bad url " ++ url
|
bad = error $ "bad url " ++ url
|
||||||
|
|
||||||
{- Creates a repo that has an unknown location. -}
|
{- Creates a repo that has an unknown location. -}
|
||||||
fromUnknown :: IO Repo
|
fromUnknown :: IO Repo
|
||||||
|
@ -117,7 +126,7 @@ fromRemoteLocation s repo = gen $ calcloc s
|
||||||
where
|
where
|
||||||
gen v
|
gen v
|
||||||
| scpstyle v = fromUrl $ scptourl v
|
| scpstyle v = fromUrl $ scptourl v
|
||||||
| isURI v = fromUrl v
|
| urlstyle v = fromUrl v
|
||||||
| otherwise = fromRemotePath v repo
|
| otherwise = fromRemotePath v repo
|
||||||
-- insteadof config can rewrite remote location
|
-- insteadof config can rewrite remote location
|
||||||
calcloc l
|
calcloc l
|
||||||
|
@ -137,6 +146,7 @@ fromRemoteLocation s repo = gen $ calcloc s
|
||||||
M.toList $ fullconfig repo
|
M.toList $ fullconfig repo
|
||||||
splitconfigs (k, vs) = map (\v -> (k, v)) vs
|
splitconfigs (k, vs) = map (\v -> (k, v)) vs
|
||||||
(prefix, suffix) = ("url." , ".insteadof")
|
(prefix, suffix) = ("url." , ".insteadof")
|
||||||
|
urlstyle v = isURI v || ":" `isInfixOf` v && "//" `isInfixOf` v
|
||||||
-- git remotes can be written scp style -- [user@]host:dir
|
-- git remotes can be written scp style -- [user@]host:dir
|
||||||
scpstyle v = ":" `isInfixOf` v && not ("//" `isInfixOf` v)
|
scpstyle v = ":" `isInfixOf` v && not ("//" `isInfixOf` v)
|
||||||
scptourl v = "ssh://" ++ host ++ slash dir
|
scptourl v = "ssh://" ++ host ++ slash dir
|
||||||
|
|
6
debian/changelog
vendored
6
debian/changelog
vendored
|
@ -1,3 +1,9 @@
|
||||||
|
git-annex (3.20120106) UNRELEASED; urgency=low
|
||||||
|
|
||||||
|
* Support unescaped repository urls, like git does.
|
||||||
|
|
||||||
|
-- Joey Hess <joeyh@debian.org> Thu, 05 Jan 2012 14:29:30 -0400
|
||||||
|
|
||||||
git-annex (3.20120105) unstable; urgency=low
|
git-annex (3.20120105) unstable; urgency=low
|
||||||
|
|
||||||
* Added annex-web-options configuration settings, which can be
|
* Added annex-web-options configuration settings, which can be
|
||||||
|
|
Loading…
Reference in a new issue