Show snapshot diff on feed

This commit is contained in:
Michael Snoyman 2015-10-12 14:03:43 +00:00
parent e74080d5c8
commit fcc36a3a81
4 changed files with 74 additions and 15 deletions

View File

@ -2,15 +2,20 @@ module Handler.Feed where
import Import import Import
import Stackage.Database import Stackage.Database
import Data.These
import Stackage.Snapshot.Diff
import qualified Data.HashMap.Strict as HashMap
getFeedR :: Handler TypedContent getFeedR :: Handler TypedContent
getFeedR = do getFeedR = do
(_, snaps) <- getSnapshots 20 0 (_, snaps) <- getSnapshots 20 0
let entries = flip map snaps $ \snap -> FeedEntry entries <- forM snaps $ \(Entity snapid snap) -> do
content <- getContent snapid snap
return FeedEntry
{ feedEntryLink = SnapshotR (snapshotName snap) StackageHomeR { feedEntryLink = SnapshotR (snapshotName snap) StackageHomeR
, feedEntryUpdated = UTCTime (snapshotCreated snap) 0 , feedEntryUpdated = UTCTime (snapshotCreated snap) 0
, feedEntryTitle = prettyName (snapshotName snap) (snapshotGhc snap) , feedEntryTitle = prettyName (snapshotName snap) (snapshotGhc snap)
, feedEntryContent = "" , feedEntryContent = content
} }
updated <- updated <-
case entries of case entries of
@ -26,3 +31,38 @@ getFeedR = do
, feedUpdated = updated , feedUpdated = updated
, feedEntries = entries , feedEntries = entries
} }
getContent :: SnapshotId -> Snapshot -> Handler Html
getContent sid2 snap = do
mprev <-
case snapshotName snap of
SNLts x y -> ltsBefore x y
SNNightly day -> nightlyBefore day
case mprev of
Nothing -> return "No previous snapshot found for comparison"
Just (sid1, name1) -> do
snapDiff <- getSnapshotDiff sid1 sid2
return
[shamlet|
<p>Difference between #{prettyNameShort name1} and #{prettyNameShort $ snapshotName snap}
<table border=1 cellpadding=5>
<thead>
<tr>
<th align=right>Package name
<th align=right>Old
<th align=left>New
<tbody>
$forall (name, VersionChange verChange) <- sortOn (toCaseFold . fst) $ HashMap.toList snapDiff
<tr>
<th align=right>#{name}
$case verChange
$of This oldVersion
<td align=right>#{oldVersion}
<td>
$of That newVersion
<td align=right>
<td>#{newVersion}
$of These oldVersion newVersion
<td align=right>#{oldVersion}
<td>#{newVersion}
|]

View File

@ -24,7 +24,7 @@ getAllSnapshotsR = do
currentPageMay <- lookupGetParam "page" currentPageMay <- lookupGetParam "page"
let currentPage :: Int let currentPage :: Int
currentPage = fromMaybe 1 (currentPageMay >>= readMay) currentPage = fromMaybe 1 (currentPageMay >>= readMay)
(totalCount, snapshots) <- getSnapshots (totalCount, map entityVal -> snapshots) <- getSnapshots
snapshotsPerPage snapshotsPerPage
((fromIntegral currentPage - 1) * snapshotsPerPage) ((fromIntegral currentPage - 1) * snapshotsPerPage)
let groups = groupUp now' snapshots let groups = groupUp now' snapshots

View File

@ -17,7 +17,7 @@ import Stackage.Snapshot.Diff
getStackageHomeR :: SnapName -> Handler Html getStackageHomeR :: SnapName -> Handler Html
getStackageHomeR name = do getStackageHomeR name = do
Entity sid snapshot <- lookupSnapshot name >>= maybe notFound return Entity sid snapshot <- lookupSnapshot name >>= maybe notFound return
snapNames <- map snapshotName . snd <$> getSnapshots 0 0 snapNames <- map (snapshotName . entityVal) . snd <$> getSnapshots 0 0
let hoogleForm = let hoogleForm =
let queryText = "" :: Text let queryText = "" :: Text
exact = False exact = False
@ -32,7 +32,7 @@ getStackageDiffR :: SnapName -> SnapName -> Handler Html
getStackageDiffR name1 name2 = do getStackageDiffR name1 name2 = do
Entity sid1 _ <- lookupSnapshot name1 >>= maybe notFound return Entity sid1 _ <- lookupSnapshot name1 >>= maybe notFound return
Entity sid2 _ <- lookupSnapshot name2 >>= maybe notFound return Entity sid2 _ <- lookupSnapshot name2 >>= maybe notFound return
snapNames <- map snapshotName . snd <$> getSnapshots 0 0 snapNames <- map (snapshotName . entityVal) . snd <$> getSnapshots 0 0
let (ltsSnaps, nightlySnaps) = partition isLts $ reverse $ sort snapNames let (ltsSnaps, nightlySnaps) = partition isLts $ reverse $ sort snapNames
snapDiff <- getSnapshotDiff sid1 sid2 snapDiff <- getSnapshotDiff sid1 sid2
defaultLayout $ do defaultLayout $ do

View File

@ -8,6 +8,8 @@ module Stackage.Database
, newestLTSMajor , newestLTSMajor
, ltsMajorVersions , ltsMajorVersions
, newestNightly , newestNightly
, nightlyBefore
, ltsBefore
, lookupSnapshot , lookupSnapshot
, snapshotTitle , snapshotTitle
, PackageListingInfo (..) , PackageListingInfo (..)
@ -28,6 +30,7 @@ module Stackage.Database
, Package (..) , Package (..)
, getPackage , getPackage
, prettyName , prettyName
, prettyNameShort
, getSnapshotsForPackage , getSnapshotsForPackage
, getSnapshots , getSnapshots
, currentSchema , currentSchema
@ -422,6 +425,22 @@ newestNightly :: GetStackageDatabase m => m (Maybe Day)
newestNightly = newestNightly =
run $ liftM (fmap $ nightlyDay . entityVal) $ selectFirst [] [Desc NightlyDay] run $ liftM (fmap $ nightlyDay . entityVal) $ selectFirst [] [Desc NightlyDay]
nightlyBefore :: GetStackageDatabase m => Day -> m (Maybe (SnapshotId, SnapName))
nightlyBefore day = do
run $ liftM (fmap go) $ selectFirst [NightlyDay <. day] [Desc NightlyDay]
where
go (Entity _ nightly) = (nightlySnap nightly, SNNightly $ nightlyDay nightly)
ltsBefore :: GetStackageDatabase m => Int -> Int -> m (Maybe (SnapshotId, SnapName))
ltsBefore x y = do
run $ liftM (fmap go) $ selectFirst
( [LtsMajor <=. x, LtsMinor <. y] ||.
[LtsMajor <. x]
)
[Desc LtsMajor, Desc LtsMinor]
where
go (Entity _ lts) = (ltsSnap lts, SNLts (ltsMajor lts) (ltsMinor lts))
lookupSnapshot :: GetStackageDatabase m => SnapName -> m (Maybe (Entity Snapshot)) lookupSnapshot :: GetStackageDatabase m => SnapName -> m (Maybe (Entity Snapshot))
lookupSnapshot name = run $ getBy $ UniqueSnapshot name lookupSnapshot name = run $ getBy $ UniqueSnapshot name
@ -429,13 +448,13 @@ snapshotTitle :: Snapshot -> Text
snapshotTitle s = prettyName (snapshotName s) (snapshotGhc s) snapshotTitle s = prettyName (snapshotName s) (snapshotGhc s)
prettyName :: SnapName -> Text -> Text prettyName :: SnapName -> Text -> Text
prettyName name ghc = prettyName name ghc = concat [prettyNameShort name, " - GHC ", ghc]
concat [base, " - GHC ", ghc]
where prettyNameShort :: SnapName -> Text
base = prettyNameShort name =
case name of case name of
SNLts x y -> concat ["LTS Haskell ", tshow x, ".", tshow y] SNLts x y -> concat ["LTS Haskell ", tshow x, ".", tshow y]
SNNightly d -> "Stackage Nightly " ++ tshow d SNNightly d -> "Stackage Nightly " ++ tshow d
getAllPackages :: GetStackageDatabase m => m [(Text, Text, Text)] -- FIXME add information on whether included in LTS and Nightly getAllPackages :: GetStackageDatabase m => m [(Text, Text, Text)] -- FIXME add information on whether included in LTS and Nightly
getAllPackages = liftM (map toPair) $ run $ do getAllPackages = liftM (map toPair) $ run $ do
@ -640,12 +659,12 @@ getSnapshots
:: GetStackageDatabase m :: GetStackageDatabase m
=> Int -- ^ limit => Int -- ^ limit
-> Int -- ^ offset -> Int -- ^ offset
-> m (Int, [Snapshot]) -> m (Int, [Entity Snapshot])
getSnapshots l o = run $ (,) getSnapshots l o = run $ (,)
<$> count ([] :: [Filter Snapshot]) <$> count ([] :: [Filter Snapshot])
<*> fmap (map entityVal) (selectList <*> selectList
[] []
[LimitTo l, OffsetBy o, Desc SnapshotCreated]) [LimitTo l, OffsetBy o, Desc SnapshotCreated]
last5Lts5Nightly :: GetStackageDatabase m => m [SnapName] last5Lts5Nightly :: GetStackageDatabase m => m [SnapName]
last5Lts5Nightly = run $ do last5Lts5Nightly = run $ do