diff --git a/config/routes b/config/routes index 607946c..d6a8f71 100644 --- a/config/routes +++ b/config/routes @@ -16,40 +16,41 @@ -- Yesod misc -- ---------------------------------------------------------------------------- -/static StaticR Static appStatic -/favicon.ico FaviconR GET -/robots.txt RobotsR GET +/static StaticR Static appStatic +/favicon.ico FaviconR GET +/robots.txt RobotsR GET -- ---------------------------------------------------------------------------- -- User login -- ---------------------------------------------------------------------------- -/auth AuthR Auth getAuth +/auth AuthR Auth getAuth -- ---------------------------------------------------------------------------- -- Everything else... -- ---------------------------------------------------------------------------- -/ HomeR GET +/ HomeR GET -/u PeopleR GET POST -/u/!new PersonNewR GET -/u/#Text PersonR GET +/u PeopleR GET POST +/u/!new PersonNewR GET +/u/#Text PersonR GET -/u/#Text/k KeysR GET POST -/u/#Text/k/!new KeyNewR GET -/u/#Text/k/#Text KeyR GET +/u/#Text/k KeysR GET POST +/u/#Text/k/!new KeyNewR GET +/u/#Text/k/#Text KeyR GET -/u/#Text/p ProjectsR GET POST -/u/#Text/p/!new ProjectNewR GET -/u/#Text/p/#Text ProjectR GET +/u/#Text/p ProjectsR GET POST +/u/#Text/p/!new ProjectNewR GET +/u/#Text/p/#Text ProjectR GET -- IDEA: if there's /u/john/p/proj/r/repo, then make /u/john/r/proj-repo -- redirect there. consider having a clean way to refer to repos -- independently of projects... -/u/#Text/p/#Text/r ReposR GET POST -/u/#Text/p/#Text/r/!new RepoNewR GET -/u/#Text/p/#Text/r/#Text RepoR GET +/u/#Text/p/#Text/r ReposR GET POST +/u/#Text/p/#Text/r/!new RepoNewR GET +/u/#Text/p/#Text/r/#Text RepoR GET +/u/#Text/p/#Text/r/#Text/c RepoCommitsR GET -- /u/#Text/p/#Text/t TicketsR GET -- /u/#Text/p/#Text/t/#TicketId TicketR GET diff --git a/src/Vervis/Handler/Repo.hs b/src/Vervis/Handler/Repo.hs index f2cc40b..98b5d37 100644 --- a/src/Vervis/Handler/Repo.hs +++ b/src/Vervis/Handler/Repo.hs @@ -18,6 +18,7 @@ module Vervis.Handler.Repo , postReposR , getRepoNewR , getRepoR + , getRepoCommitsR ) where @@ -140,3 +141,33 @@ getRepoR user proj repo = do setTitle $ toHtml $ intercalate " > " $ ["Vervis", "People", user, "Projects", proj, "Repos", repo] $(widgetFile "repo/repo") + +getRepoCommitsR :: Text -> Text -> Text -> Handler Html +getRepoCommitsR user proj repo = do + repository <- runDB $ do + Entity sid _s <- getBy404 $ UniqueSharerIdent user + Entity pid _p <- getBy404 $ UniqueProject proj sid + Entity _rid r <- getBy404 $ UniqueRepo repo pid + return r + path <- askRepoDir user proj repo + pairs <- liftIO $ withRepo (fromString path) $ \ git -> do + oid <- resolveName git $ unpack $ repoMainBranch repository + graph <- loadCommitGraphPT git [oid] + let mnodes = topsortUnmixOrder graph (NodeStack [noNodes graph]) + nodes = case mnodes of + Nothing -> error "commit graph contains a cycle" + Just ns -> ns + return $ D.toList $ fmap (nodeLabel graph) nodes + now <- liftIO dateCurrent + let toText = decodeUtf8With lenientDecode + mkrow oid commit = + ( toText $ personName $ commitAuthor commit + , toText $ toHex $ unObjId oid + , toText $ takeLine $ commitMessage commit + , timeAgo' now (timeConvert $ personTime $ commitAuthor commit) + ) + rows = map (uncurry mkrow) pairs + defaultLayout $ do + setTitle $ toHtml $ intercalate " > " $ + ["Vervis", "People", user, "Projects", proj, "Repos", repo, "Commits"] + $(widgetFile "repo/commits")