Repository : ssh://darcs.haskell.org//srv/darcs/packages/Cabal

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/2370af158a0cdae8f8ccd168fe8ed0919c2a1d09

>---------------------------------------------------------------

commit 2370af158a0cdae8f8ccd168fe8ed0919c2a1d09
Author: Lemmih <[email protected]>
Date:   Sun Aug 10 00:04:46 2008 +0000

    Support legacy download and upload urls.

>---------------------------------------------------------------

 cabal-install/Distribution/Client/Fetch.hs     |   12 ++++++++++--
 cabal-install/Distribution/Client/HttpUtils.hs |   12 +++++++++++-
 cabal-install/Distribution/Client/Upload.hs    |   22 +++++++++++++---------
 cabal-install/Main.hs                          |    1 +
 4 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/cabal-install/Distribution/Client/Fetch.hs 
b/cabal-install/Distribution/Client/Fetch.hs
index 1f2f792..1429f3c 100644
--- a/cabal-install/Distribution/Client/Fetch.hs
+++ b/cabal-install/Distribution/Client/Fetch.hs
@@ -30,7 +30,7 @@ import Distribution.Client.Dependency
 import Distribution.Client.IndexUtils as IndexUtils
          ( getAvailablePackages, disambiguateDependencies )
 import qualified Distribution.Client.InstallPlan as InstallPlan
-import Distribution.Client.HttpUtils (getHTTP)
+import Distribution.Client.HttpUtils (getHTTP, isOldHackageURI)
 
 import Distribution.Package
          ( PackageIdentifier(..) )
@@ -59,7 +59,7 @@ import System.FilePath
 import qualified System.FilePath.Posix as FilePath.Posix
          ( combine, joinPath )
 import Network.URI
-         ( URI(uriScheme, uriPath) )
+         ( URI(uriPath, uriScheme) )
 import Network.HTTP
          ( ConnError(..), Response(..) )
 
@@ -170,6 +170,14 @@ packageDir repo pkgid = repoLocalDir repo
 
 -- | Generate the URI of the tarball for a given package.
 packageURI :: RemoteRepo -> PackageIdentifier -> URI
+packageURI repo pkgid | isOldHackageURI (remoteRepoURI repo) =
+  (remoteRepoURI repo) {
+    uriPath = FilePath.Posix.joinPath
+      [uriPath (remoteRepoURI repo)
+      ,pkgName pkgid
+      ,display (pkgVersion pkgid)
+      ,display pkgid <.> "tar.gz"]
+  }
 packageURI repo pkgid =
   (remoteRepoURI repo) {
     uriPath = FilePath.Posix.joinPath
diff --git a/cabal-install/Distribution/Client/HttpUtils.hs 
b/cabal-install/Distribution/Client/HttpUtils.hs
index 396244d..ac9aafc 100644
--- a/cabal-install/Distribution/Client/HttpUtils.hs
+++ b/cabal-install/Distribution/Client/HttpUtils.hs
@@ -2,7 +2,7 @@
 -----------------------------------------------------------------------------
 -- | Separate module for HTTP actions, using a proxy server if one exists 
 -----------------------------------------------------------------------------
-module Distribution.Client.HttpUtils (getHTTP, proxy) where
+module Distribution.Client.HttpUtils (getHTTP, proxy, isOldHackageURI) where
 
 import Network.HTTP
          ( Request (..), Response (..), RequestMethod (..)
@@ -34,6 +34,8 @@ import Distribution.Verbosity (Verbosity)
 import Distribution.Simple.Utils (warn, debug)
 import Distribution.Text
          ( display )
+import qualified System.FilePath.Posix as FilePath.Posix
+         ( splitDirectories )
 
 -- FIXME: all this proxy stuff is far too complicated, especially parsing
 -- the proxy strings. Network.Browser should have a way to pick up the
@@ -133,3 +135,11 @@ getHTTP verbosity uri = do
                                 setProxy p
                                 request req
                  return (Right resp)
+
+-- Utility function for legacy support.
+isOldHackageURI :: URI -> Bool
+isOldHackageURI uri
+    = case uriAuthority uri of
+        Just (URIAuth {uriRegName = "hackage.haskell.org"}) ->
+            FilePath.Posix.splitDirectories (uriPath uri) == 
["/","packages","archive"]
+        _ -> False
diff --git a/cabal-install/Distribution/Client/Upload.hs 
b/cabal-install/Distribution/Client/Upload.hs
index 8daa119..856998c 100644
--- a/cabal-install/Distribution/Client/Upload.hs
+++ b/cabal-install/Distribution/Client/Upload.hs
@@ -4,7 +4,7 @@
 module Distribution.Client.Upload (check, upload, report) where
 
 import Distribution.Client.Types (Username(..), 
Password(..),Repo(..),RemoteRepo(..))
-import Distribution.Client.HttpUtils (proxy)
+import Distribution.Client.HttpUtils (proxy, isOldHackageURI)
 
 import Distribution.Simple.Utils (debug, notice, warn, info)
 import Distribution.Verbosity (Verbosity)
@@ -22,7 +22,7 @@ import Network.Browser
 import Network.HTTP
          ( Header(..), HeaderName(..)
          , Request(..), RequestMethod(..), Response(..) )
-import Network.URI (URI, parseURI)
+import Network.URI (URI(uriPath), parseURI)
 
 import Data.Char        (intToDigit)
 import Numeric          (showHex)
@@ -31,22 +31,25 @@ import System.IO        (hFlush, stdin, stdout, hGetEcho, 
hSetEcho
 import Control.Exception (bracket)
 import System.Random    (randomRIO)
 import System.FilePath
+import qualified System.FilePath.Posix as FilePath.Posix
 import System.Directory
 import Control.Monad (forM_)
 
 
 --FIXME: how do we find this path for an arbitrary hackage server?
 -- is it always at some fixed location relative to the server root?
-uploadURI :: URI
-Just uploadURI = parseURI 
"http://hackage.haskell.org/cgi-bin/hackage-scripts/protected/upload-pkg";
+legacyUploadURI :: URI
+Just legacyUploadURI = parseURI 
"http://hackage.haskell.org/cgi-bin/hackage-scripts/protected/upload-pkg";
 
 checkURI :: URI
 Just checkURI = parseURI 
"http://hackage.haskell.org/cgi-bin/hackage-scripts/check-pkg";
 
 
-upload :: Verbosity -> Maybe Username -> Maybe Password -> [FilePath] -> IO ()
-upload verbosity mUsername mPassword paths = do
-
+upload :: Verbosity -> [Repo] -> Maybe Username -> Maybe Password -> 
[FilePath] -> IO ()
+upload verbosity repos mUsername mPassword paths = do
+          let uploadURI = if isOldHackageURI targetRepoURI
+                          then legacyUploadURI
+                          else targetRepoURI{uriPath = uriPath targetRepoURI 
`FilePath.Posix.combine` "upload"}
           Username username <- maybe promptUsername return mUsername
           Password password <- maybe promptPassword return mPassword
           let auth = addAuthority AuthBasic {
@@ -55,12 +58,11 @@ upload verbosity mUsername mPassword paths = do
                        auPassword = password,
                        auSite     = uploadURI
                      }
-
           flip mapM_ paths $ \path -> do
             notice verbosity $ "Uploading " ++ path ++ "... "
             handlePackage verbosity uploadURI auth path
-
   where
+    targetRepoURI = remoteRepoURI $ selectUploadRepo [ remoteRepo | Left 
remoteRepo <- map repoKind repos ]
     promptUsername :: IO Username
     promptUsername = do
       putStr "Hackage username: "
@@ -76,6 +78,8 @@ upload verbosity mUsername mPassword paths = do
         hSetEcho stdin False  -- no echoing for entering the password
         fmap Password getLine
 
+selectUploadRepo = last -- Use head?
+
 report :: Verbosity -> [Repo] -> IO ()
 report verbosity repos
     = forM_ repos $ \repo ->
diff --git a/cabal-install/Main.hs b/cabal-install/Main.hs
index 4e4134e..e8e2994 100644
--- a/cabal-install/Main.hs
+++ b/cabal-install/Main.hs
@@ -236,6 +236,7 @@ uploadAction flags extraArgs = do
   if fromFlag (uploadCheck flags)
     then Upload.check  verbosity tarfiles
     else upload verbosity 
+                (configRepos config)
                 (flagToMaybe $ configUploadUsername config
                      `mappend` uploadUsername flags)
                 (flagToMaybe $ configUploadPassword config



_______________________________________________
Cvs-libraries mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-libraries

Reply via email to