1
0
Fork 0
mirror of https://code.sup39.dev/repos/Wqawg synced 2024-12-29 13:24:51 +09:00

Plan for parsing Darcs patch for patch view

This commit is contained in:
fr33domlover 2018-07-07 16:05:10 +00:00
parent 5a7811b067
commit c8b085fbc8
3 changed files with 45 additions and 1 deletions

View file

@ -18,6 +18,7 @@ module Vervis.Darcs
, readWikiView , readWikiView
, readChangesView , readChangesView
, lastChange , lastChange
, readPatch
) )
where where
@ -55,6 +56,7 @@ import Data.Text.UTF8.Local (decodeStrict)
import Data.Time.Clock.Local () import Data.Time.Clock.Local ()
import Vervis.Changes import Vervis.Changes
import Vervis.Foundation (Widget) import Vervis.Foundation (Widget)
import Vervis.Patch
import Vervis.Readme import Vervis.Readme
import Vervis.SourceTree import Vervis.SourceTree
import Vervis.Wiki (WikiView (..)) import Vervis.Wiki (WikiView (..))
@ -218,3 +220,41 @@ lastChange path now = fmap maybeRight $ runExceptT $ do
intervalToEventTime $ intervalToEventTime $
FriendlyConvert $ FriendlyConvert $
now `diffUTCTime` piTime pi now `diffUTCTime` piTime pi
-- TODO
readPatch :: FilePath -> Text -> IO (Maybe Patch)
readPatch path hash = error "Not implemented"
-- I'm not sure what's the fastest way to find a patch file given its info
-- hash, maybe Darcs keeps some cache or something. But assuming there are
-- no tricks like that, here's an idea how to grab the patch:
--
-- (1) Start going over the whole inventory, whose order is from latest to
-- oldest, looking for a patch with the given hash.
-- (2) Once found, determine the patch filename from its size and content
-- hash
-- (3) Run the patch parser on that file, through a zlib decompressor
-- though (check how I did that for the inventories parser)
--
-- TODO idea: Use hints to speed up finding the patch! In the repo history
-- log page, embed hints into the hyperlinks to the patches, and in the
-- patch page handler, use the hint to figure out the patch location.
-- Actually, since the inventory file contains patch content hashes, I can
-- use that as a hint and skip the whole step of looking for the patch!
--
-- TODO maybe start by finding the patch hash in patch_ids and use the
-- position as a hint to its location in the inventories
--
-- TODO maybe I can figure out from darcs source code how a given patch
-- hash is found? Just in case there's a faster way
--
-- TODO find out what's the index and patch_index files under _darcs and
-- maybe other files there, possibly there's a way to patch the info hash
-- with the content hash.
--
-- UPDATE: I read about index and patch_index, looks like they won't help.
-- But possibly the global cache system will? However interesting note:
-- Vervis on my laptop has a patch_index, but on the server it doesn't.
-- Probably because `darcs log` never runs on the server since I parse
-- patches manually. If I end up using the patch index for something, it
-- may be a good idea to trigger its generation, so that it's available
-- when people browser repo pages.

View file

@ -263,7 +263,7 @@ getRepoPatchR :: ShrIdent -> RpIdent -> Text -> Handler Html
getRepoPatchR shr rp ref = do getRepoPatchR shr rp ref = do
repository <- runDB $ selectRepo shr rp repository <- runDB $ selectRepo shr rp
case repoVcs repository of case repoVcs repository of
VCSDarcs -> error "Not implemented yet" -- getDarcsPatch shr rp ref VCSDarcs -> getDarcsPatch shr rp ref
VCSGit -> getGitPatch shr rp ref VCSGit -> getGitPatch shr rp ref
getRepoDevsR :: ShrIdent -> RpIdent -> Handler Html getRepoDevsR :: ShrIdent -> RpIdent -> Handler Html

View file

@ -18,6 +18,7 @@ module Vervis.Handler.Repo.Darcs
, getDarcsRepoHeadChanges , getDarcsRepoHeadChanges
, getDarcsRepoChanges , getDarcsRepoChanges
, getDarcsDownloadR , getDarcsDownloadR
, getDarcsPatch
) )
where where
@ -106,3 +107,6 @@ getDarcsDownloadR shar repo dir = do
if exists if exists
then sendFile typeOctet filePath then sendFile typeOctet filePath
else notFound else notFound
getDarcsPatch :: ShrIdent -> RpIdent -> Text -> Handler Html
getDarcsPatch shr rp ref = error "Not implemented"