:wip: PR support

This commit is contained in:
Yann Esposito (Yogsototh) 2018-10-06 15:55:21 +02:00
parent f52312b731
commit 82dad71eca
Signed by untrusted user who does not match committer: yogsototh
GPG key ID: 7B19A4C650D59646
7 changed files with 116 additions and 10 deletions

View file

@ -161,4 +161,36 @@ could all work together.
- minimal web interface to navigate your project files, commits, branches, etc...
- identity handling so hand in hand with hook handle and web interface provide
the ability to manage how contributor can access your tool
-
** Identfy users, allow access and trust them
With this system it will be more about a pull from other than wait for them to push.
The identity system should be decentralized and based on GPG keys.
Mainly each user should sign their commit with their GPG key.
Each user could then keep serving their local repo (see instaweb).
And more importantly, there will be "known" repositories, known packages and libraries.
It will be enough to sign all those activities and to publish them on some page automatically.
Or to search for the fingerprint of the GPG on the web via a search engine.
You'll then see all the activities related to that key.
Typically:
- OSS contributions
- web blog articles
- micro blog messages
- comments
- etc...
One great advantage of that, is that each user will be able to manage different
GPG key pairs for dealing with different aspect of their lives.
This solution won't need common consensus network à la bitcoin, or any
decentralized smart contract system. And from my point of view, this is a lot
better. Because most of those decentralized system want you to adopt their
centralized system, their software, their ecosystem. While just providing a
website with a list of links where the user could simply grab them and check all
link correspond to a signed activies is clearly totally open source compliant
and does not require any software choice on any parties. This is yet again, just
a text file somewhere and a simple web service. With minimal tooling that could
be coded in any language in not much time.

View file

@ -41,6 +41,7 @@ library
, protolude
, text
, turtle
, directory
default-language: Haskell2010
executable gpm

View file

@ -7,14 +7,20 @@ License : Public Domain
Maintainer : yann.esposito@gmail.com
-}
module GPM.Helpers
(debug,debug_,inGPM,getCurrentGitBranch,getGitUser)
( debug
, debug_
, getCurrentGitBranch
, getGPMCacheDir
, getGitUser
, inGPM
)
where
import Protolude hiding (die)
import qualified Control.Foldl as Fold
import Protolude hiding (die)
import qualified System.Directory as Directory
import Turtle
import qualified Control.Foldl as Fold
-- | execute a shell script and return the last line as text
-- but also log the command to the console to minimize surprise
debug :: Text -> IO (Maybe Text)
@ -48,3 +54,8 @@ inGPM = bracket safeChangeBranch safeReturnBranch
safeReturnBranch oldbr = do
debug_ ("git checkout " <> oldbr)
debug_ "git stash pop"
-- | Retrieve the cache directory to save temporary files in gpm
getGPMCacheDir :: IO Turtle.FilePath
getGPMCacheDir = fromString <$> Directory.getXdgDirectory Directory.XdgCache "gpm"

View file

@ -18,7 +18,7 @@ module GPM.Issue
)
where
import Protolude hiding (ask,die)
import Protolude hiding (ask, die)
import Turtle
import Data.FileEmbed (embedStringFile)

View file

@ -1,5 +1,6 @@
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-|
@ -16,11 +17,12 @@ module GPM.Review
)
where
import Protolude hiding (die, (%))
import Protolude hiding (ask, die, (%))
import Turtle
import Data.FileEmbed (embedStringFile)
import GPM.Helpers (debug_)
import GPM.Helpers (getGPMCacheDir, debug_)
import Text.Mustache
data ReviewCommand = ReviewStart (Maybe Text)
| ReviewStop (Maybe Text)
@ -54,3 +56,58 @@ handleReview ReviewAccept _ = die "TODO"
handleReview ReviewFeedback _ = die "TODO"
handleReview ReviewQuestion _ = die "TODO"
handleReview ReviewReject _ = die "TODO"
data NewReview =
NewReview { status :: Text
, title :: Text
, user :: Maybe User
, branch :: Maybe Text
, reviewer :: Maybe User
, description :: Maybe Text
}
type User = Text
instance ToMustache NewReview where
toMustache NewReview{..} = object
[ "status" ~> status
, "title" ~> title
, "user" ~> user
, "branch" ~> branch
, "reviewer" ~> reviewer
, "description" ~> description
]
createTmpNewReview :: NewReview -> IO ()
createTmpNewReview nr = do
ecompiled <- automaticCompile ["./templates"] "new-review.org"
case ecompiled of
Left pe -> do
print pe
die "Parse ERROR, check your template ./templates/new-review.org"
Right compiled -> do
cacheDir <- getGPMCacheDir
let reviewName = cacheDir </> "review-feedback.org"
writeFile (toS (format fp reviewName)) (substitute compiled nr)
interactiveNewReview :: NewReview -> IO NewReview
interactiveNewReview nr =
NewReview
<$> (fromMaybe (status nr)
<$> ask "status" (status nr) identity)
<*> (fromMaybe (title nr)
<$> ask "title" (title nr) identity)
<*> (maybe (user nr) Just
<$>
ask "user" (fromMaybe "your name" (user nr)) identity)
<*> (maybe (branch nr) Just
<$> ask "branch" (fromMaybe "related branch" (branch nr)) identity)
<*> (maybe (reviewer nr) Just
<$> ask "reviewer" "a single nick" identity)
<*> (maybe (description nr) Just
<$> ask "description" "the long description" identity)
where
ask :: Text -> Text -> (Text -> a) -> IO (Maybe a)
ask field ex tr = do
putText $ "Please enter " <> field <> "("<> ex <>"): "
fmap (tr . lineToText) <$> readline

6
templates/new-review.org Normal file
View file

@ -0,0 +1,6 @@
**** {{status}} {{title}}
:PROPERTIES:
:REVIEWER: {{user}}
{{#branch}}:BRANCH: {{branch}}{{/branch}}
:END:
{{description}}

View file

@ -1,5 +1,4 @@
* FEEDBACK
* FEEDBACK
[[file:~/y/gpm/gpm::initDocs]]
* QUESTION What about creating a new branch for doc?
[[file:~/y/gpm/gpm::initDocs]]