From 113d4dfb432c63bc829e27d417058c9f86ddcf64 Mon Sep 17 00:00:00 2001
From: Vladimir Nikishkin <>
Date: Thu, 26 Oct 2023 13:11:23 +0800
Subject: [PATCH] Allow serving cabal files with package name in the file name.
Allow serving url like this:
https://hackage.haskell.org/package/pkg-2.6/revision/pkg-2.6-1.cabal
---
datafiles/templates/Html/revisions.html.st | 2 +-
src/Distribution/Server/Features/Core.hs | 22 ++++++++++++++++++++++
2 files changed, 23 insertions(+), 1 deletion(-)
diff --git a/datafiles/templates/Html/revisions.html.st b/datafiles/templates/Html/revisions.html.st
index 69cf2b75a..98c875c29 100644
--- a/datafiles/templates/Html/revisions.html.st
+++ b/datafiles/templates/Html/revisions.html.st
@@ -25,7 +25,7 @@ stored separately.
$revisions:{revision|
- -r$revision.number$ |
+ -r$revision.number$ ($pkgid$-r$revision.number$) |
$revision.htmltime$ |
$revision.user$ |
$revision.sha256$
diff --git a/src/Distribution/Server/Features/Core.hs b/src/Distribution/Server/Features/Core.hs
index 6aec793ab..e32e247e2 100644
--- a/src/Distribution/Server/Features/Core.hs
+++ b/src/Distribution/Server/Features/Core.hs
@@ -225,6 +225,7 @@ data CoreResource = CoreResource {
corePackageTarball :: Resource,
-- | A Cabal file metatada revision.
coreCabalFileRev :: Resource,
+ coreCabalFileRevName :: Resource,
-- Rendering resources.
-- | URI for `corePackagesPage`, given a format (blank for none).
@@ -403,6 +404,7 @@ coreFeature ServerEnv{serverBlobStore = store} UserFeature{..}
, coreCabalFile
, coreCabalFileRevs
, coreCabalFileRev
+ , coreCabalFileRevName
, coreUserDeauth
, coreAdminDeauth
, corePackUserDeauth
@@ -456,6 +458,11 @@ coreFeature ServerEnv{serverBlobStore = store} UserFeature{..}
resourceDesc = [(GET, "Get package .cabal file revision")]
, resourceGet = [("cabal", serveCabalFileRevision)]
}
+ coreCabalFileRevName = (resourceAt "/package/:package/revision/:tarball-:revision.:format") {
+ resourceDesc = [(GET, "Get package .cabal file revision with name")]
+ , resourceGet = [("cabal", serveCabalFileRevisionName)]
+ }
+
coreUserDeauth = (resourceAt "/packages/deauth") {
resourceDesc = [(GET, "Deauth Package user")]
@@ -750,6 +757,21 @@ coreFeature ServerEnv{serverBlobStore = store} UserFeature{..}
Nothing -> errNotFound "Package revision not found"
[MText "Cannot parse revision, or revision out of range."]
+ serveCabalFileRevisionName :: DynamicPath -> ServerPartE Response
+ serveCabalFileRevisionName dpath = do
+ pkgid1 <- packageTarballInPath dpath
+ pkgid2 <- packageInPath dpath
+ guard (pkgVersion pkgid2 == pkgVersion pkgid2)
+ pkginfo <- packageInPath dpath >>= lookupPackageId
+ let mrev = lookup "revision" dpath >>= fromReqURI
+ revisions = pkgMetadataRevisions pkginfo
+ case mrev >>= \rev -> revisions Vec.!? rev of
+ Just (fileRev, (utime, _uid)) -> return $ toResponse cabalfile
+ where
+ cabalfile = Resource.CabalFile (cabalFileByteString fileRev) utime
+ Nothing -> errNotFound "Package revision not found"
+ [MText "Cannot parse revision, or revision out of range."]
+
deauth :: DynamicPath -> ServerPartE Response
deauth _ = do
|