Skip to content

Commit

Permalink
Merge pull request #53 from mattpolzin/whoami-command
Browse files Browse the repository at this point in the history
Add and document a new whoami command.
  • Loading branch information
mattpolzin authored Jul 13, 2022
2 parents be877af + b087c78 commit 831e2e4
Show file tree
Hide file tree
Showing 12 changed files with 108 additions and 43 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ diff-repo
Creating config...
```

Once configured, Harmony supports the following commands: `branch`, `pr`, `assign`, `contribute`, `reflect`, `list`, `graph`, `config`, and `sync`.
Once configured, Harmony supports the following commands: `branch`, `pr`, `assign`, `contribute`, `whoami`, `reflect`, `list`, `graph`, `config`, and `sync`.

### Branch
Running `harmony branch` will print the URI for accessing the currently checked out branch on GitHub.
Expand Down Expand Up @@ -129,6 +129,9 @@ Retrieve a URI for a PR to contribute a review and check the git branch out as w
harmony contribute --checkout
```

### Who Am I
Running `harmony whoami` will print information about the currently configured and authenticated user.

### Reflect
Running `harmony reflect` will show a summary of your review requests and authored pull requests.

Expand Down
2 changes: 1 addition & 1 deletion harmony.ipkg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package harmony
version = 0.6.0
version = 0.7.0
authors = "Mathew Polzin"
license = "MIT"
-- brief =
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@mattpolzin/harmony",
"version": "0.6.0",
"version": "0.7.0",
"publishConfig": {
"access": "public"
},
Expand Down
2 changes: 1 addition & 1 deletion src/AppVersion.idr
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module AppVersion

export
appVersion : String
appVersion = "0.6.0"
appVersion = "0.7.0"

export
printVersion : HasIO io => io ()
Expand Down
1 change: 1 addition & 0 deletions src/BashCompletion.idr
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ allRootCmds = [
, "reflect"
, "sync"
, "version"
, "whoami"
]

||| Attempt to handle completions for root commands but
Expand Down
10 changes: 10 additions & 0 deletions src/FFI/Git.idr
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,13 @@ remoteTrackingBranch @{G ptr} =
StrNil => Nothing
(StrCons x xs) => Just str

%foreign git_ffi "user_email"
prim__userEmail : Ptr GitRef
-> (onSuccess : String -> PrimIO ())
-> (onFailure : String -> PrimIO ())
-> PrimIO ()

export
userEmail : Git => Promise String
userEmail @{G ptr} = promiseIO $ prim__userEmail ptr

39 changes: 25 additions & 14 deletions src/FFI/GitHub.idr
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ getRepoDefaultBranch : Octokit =>
(org : String)
-> (repo : String)
-> Promise String
getRepoDefaultBranch @{(Kit ptr)} org repo = promiseIO $ prim__getRepoDefaultBranch ptr org repo
getRepoDefaultBranch @{Kit ptr} org repo = promiseIO $ prim__getRepoDefaultBranch ptr org repo

%foreign okit_ffi "list_teams"
prim__listTeams : Ptr OctokitRef
Expand All @@ -54,9 +54,20 @@ prim__listTeams : Ptr OctokitRef

export
listTeams : Octokit => (org : String) -> Promise (List String)
listTeams @{(Kit ptr)} org =
listTeams @{Kit ptr} org =
lines <$> (promiseIO $ prim__listTeams ptr org)

%foreign okit_ffi "list_my_teams"
prim__listMyTeams : Ptr OctokitRef
-> (onSuccess : String -> PrimIO ())
-> (onFailure : String -> PrimIO ())
-> PrimIO ()

export
listMyTeams : Octokit => Promise (List String)
listMyTeams @{Kit ptr} =
lines <$> (promiseIO $ prim__listMyTeams ptr)

%foreign okit_ffi "list_prs"
prim__listPRsForBranch : Ptr OctokitRef
-> (owner : String)
Expand All @@ -72,7 +83,7 @@ listPRsForBranch : Octokit =>
-> (repo : String)
-> (branch : String)
-> Promise (List PullRequest)
listPRsForBranch @{(Kit ptr)} owner repo branch =
listPRsForBranch @{Kit ptr} owner repo branch =
either . parsePullRequestsString =<< (promiseIO $ prim__listPRsForBranch ptr owner repo branch)

%foreign okit_ffi "create_pr"
Expand All @@ -96,7 +107,7 @@ createPR : Octokit =>
-> (title : String)
-> (description : String)
-> Promise PullRequest
createPR @{(Kit ptr)} owner repo head base title description =
createPR @{Kit ptr} owner repo head base title description =
either . parsePullRequestString =<< (promiseIO $ prim__createPR ptr owner repo head base title description)

%foreign okit_ffi "create_comment"
Expand All @@ -116,7 +127,7 @@ createComment : Octokit =>
-> (issueOrPrNumber : Integer)
-> (message : String)
-> Promise ()
createComment @{(Kit ptr)} owner repo issueOrPrNumber message =
createComment @{Kit ptr} owner repo issueOrPrNumber message =
ignore . promiseIO $ prim__createComment ptr owner repo issueOrPrNumber message

pullRequestStateFilter : Maybe PRState -> String
Expand All @@ -141,7 +152,7 @@ listPullReviewers : Octokit =>
-> (stateFilter : Maybe PRState)
-> (pageLimit : Fin 101)
-> Promise (List String)
listPullReviewers @{(Kit ptr)} owner repo stateFilter pageLimit =
listPullReviewers @{Kit ptr} owner repo stateFilter pageLimit =
lines <$> (promiseIO $ prim__listPullReviewers ptr owner repo (pullRequestStateFilter stateFilter) (cast $ finToNat pageLimit))

%foreign okit_ffi "list_pull_requests"
Expand All @@ -163,7 +174,7 @@ listPullRequestsJsonStr : Octokit =>
-> (pageLimit : Fin 101)
-> {default 0 page : Nat}
-> Promise String
listPullRequestsJsonStr @{(Kit ptr)} owner repo stateFilter pageLimit {page} =
listPullRequestsJsonStr @{Kit ptr} owner repo stateFilter pageLimit {page} =
let filter = pullRequestStateFilter stateFilter
pgLimit = cast $ finToNat pageLimit
pg = cast (S page)
Expand All @@ -184,7 +195,7 @@ listPullRequests : Octokit =>
-> (pageLimit : Fin 101)
-> {default 0 page : Nat}
-> Promise (List PullRequest)
listPullRequests @{(Kit ptr)} owner repo stateFilter pageLimit {page} =
listPullRequests @{Kit ptr} owner repo stateFilter pageLimit {page} =
either . parsePullRequestsString =<< listPullRequestsJsonStr owner repo stateFilter pageLimit {page}

-- reviewers and teamReviewers should be comma separated values encoded in a string.
Expand All @@ -211,7 +222,7 @@ addPullReviewers : Octokit =>
-> (reviewers : List String)
-> (teamReviewers : List String)
-> Promise (List String)
addPullReviewers @{(Kit ptr)} owner repo pullNumber reviewers teamReviewers =
addPullReviewers @{Kit ptr} owner repo pullNumber reviewers teamReviewers =
lines <$> (promiseIO $ prim__addPullReviewers ptr owner repo pullNumber (join "," reviewers) (join "," teamReviewers))

%foreign okit_ffi "list_pr_reviews"
Expand All @@ -229,7 +240,7 @@ listPullReviewsJsonStr : Octokit =>
-> (repo : String)
-> (pullNumber : Integer)
-> Promise String
listPullReviewsJsonStr @{(Kit ptr)} owner repo pullNumber =
listPullReviewsJsonStr @{Kit ptr} owner repo pullNumber =
promiseIO $ prim__listPullReviews ptr owner repo pullNumber

export
Expand All @@ -254,7 +265,7 @@ listTeamMembers : Octokit =>
(org : String)
-> (teamSlug : String)
-> Promise (List String)
listTeamMembers @{(Kit ptr)} org teamSlug =
listTeamMembers @{Kit ptr} org teamSlug =
lines <$> (promiseIO $ prim__listTeamMembers ptr org teamSlug)

%foreign okit_ffi "list_org_members"
Expand All @@ -266,7 +277,7 @@ prim__listOrgMembers : Ptr OctokitRef

export
listOrgMembers : Octokit => (org : String) -> Promise (List String)
listOrgMembers @{(Kit ptr)} org =
listOrgMembers @{Kit ptr} org =
lines <$> (promiseIO $ prim__listOrgMembers ptr org)

%foreign okit_ffi "get_user"
Expand All @@ -278,7 +289,7 @@ prim__getUser : Ptr OctokitRef

export
getUser : Octokit => (username : String) -> Promise User
getUser @{(Kit ptr)} = either . parseUserString <=< promiseIO . prim__getUser ptr
getUser @{Kit ptr} = either . parseUserString <=< promiseIO . prim__getUser ptr

%foreign okit_ffi "get_self"
prim__getSelf : Ptr OctokitRef
Expand All @@ -288,5 +299,5 @@ prim__getSelf : Ptr OctokitRef

export
getSelf : Octokit => Promise User
getSelf @{(Kit ptr)} = either . parseUserString =<< promiseIO (prim__getSelf ptr)
getSelf @{Kit ptr} = either . parseUserString =<< promiseIO (prim__getSelf ptr)

2 changes: 2 additions & 0 deletions src/Help.idr
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ harmony \{subcommand "<subcommand>"}
\{subcommand "contribute"} [\{argument "-c/--checkout"}] [\{argument "-<num>"}]
- Contribute to an open PR. Prints a URL. Prioritizes PRs you are
requested to review but will also return other PRs.
\{subcommand "whoami"}
- Print information about the configured and authenticated user.
\{subcommand "reflect"}
- Reflect on the current state of ones own PRs and review requests.
\{subcommand "list"} {\{argument "<team-slug>"}}
Expand Down
2 changes: 2 additions & 0 deletions src/Main.idr
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,8 @@ handleConfiguredArgs @{config} ["user", "--json", username] =
print $ json !(getUser username)

-- user-facing commands:
handleConfiguredArgs ["whoami"] =
printInfoOnSelf
handleConfiguredArgs ["sync"] =
ignore $ syncConfig True
handleConfiguredArgs ["branch"] =
Expand Down
69 changes: 45 additions & 24 deletions src/User.idr
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import Data.Review
import Data.String
import Data.User
import FFI.GitHub
import FFI.Git
import PullRequest
import Text.PrettyPrint.Prettyprinter
import Text.PrettyPrint.Prettyprinter.Render.Terminal
Expand Down Expand Up @@ -109,28 +110,48 @@ namespace Reflect
export
reflectOnSelf : Config => Octokit =>
Promise ()
reflectOnSelf =
do prs <- listPartitionedPRs prCount {pageBreaks=4}
myLogin <- login <$> getSelf
reviews <- reviewsForUser myLogin (take (cast reviewDetailsCount) . reverse . sortBy (compare `on` createdAt) $ combined prs)
let mostRecentReview = map submittedAt . head' $ sortBy (compare `on` submittedAt) reviews
let history = tuple prs
let (openAuthored, closedAuthored) =
mapHom (filter ((== myLogin) . author)) history
let (openRequested, closedRequested) =
mapHom (filter (any (== myLogin) . reviewers)) history
let (earliestOpenAuth, earliestOpenReq) =
mapHom (head' . sort . map createdAt) (openAuthored, openRequested)
-- TODO: get Terminal width from somewhere to set the page width
-- to the min of the Terminal width or the intro length.
putStrLn . renderString $
print (length intro)
(length reviews)
(length openRequested)
(length closedRequested)
(length closedAuthored)
(length openAuthored)
mostRecentReview
earliestOpenAuth
earliestOpenReq
reflectOnSelf = do
prs <- listPartitionedPRs prCount {pageBreaks=4}
myLogin <- login <$> getSelf
reviews <- reviewsForUser myLogin (take (cast reviewDetailsCount) . reverse . sortBy (compare `on` createdAt) $ combined prs)
let mostRecentReview = map submittedAt . head' $ sortBy (compare `on` submittedAt) reviews
let history = tuple prs
let (openAuthored, closedAuthored) =
mapHom (filter ((== myLogin) . author)) history
let (openRequested, closedRequested) =
mapHom (filter (any (== myLogin) . reviewers)) history
let (earliestOpenAuth, earliestOpenReq) =
mapHom (head' . sort . map createdAt) (openAuthored, openRequested)
-- TODO: get Terminal width from somewhere to set the page width
-- to the min of the Terminal width or the intro length.
putStrLn . renderString $
print (length intro)
(length reviews)
(length openRequested)
(length closedRequested)
(length closedAuthored)
(length openAuthored)
mostRecentReview
earliestOpenAuth
earliestOpenReq

namespace Me
export
printInfoOnSelf : Config => Octokit => Git =>
Promise ()
printInfoOnSelf = do
gitEmail <- handleUnsetEmail <$> userEmail
githubUser <- getSelf
githubTeams <- sort <$> listMyTeams
putStrLn "Git Email: \{gitEmail}"
putStrLn ""
putStrLn "GitHub Name: \{githubUser.name}"
putStrLn "GitHub Login: \{githubUser.login}"
putStrLn ""
putStrLn "GitHub Teams:"
traverse_ putStrLn githubTeams
where
handleUnsetEmail : String -> String
handleUnsetEmail "" = "Not set"
handleUnsetEmail e = e

7 changes: 7 additions & 0 deletions support/js/git.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,10 @@ const git_remote_tracking_branch = (git, onSuccess, onFailure) =>
onFailure
)

const git_user_email = (git, onSuccess, onFailure) =>
idris__git_unpromisify(
git.raw('config', '--get', 'user.email'),
r => onSuccess(r.trim()),
onFailure
)

10 changes: 9 additions & 1 deletion support/js/okit.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,22 @@ const okit_get_repo_default_branch = (octokit, org, repo, onSuccess, onFailure)
const digTeams = teamsJson =>
teamsJson.map(t => t.slug)

// Executes callback with [String]
// Executes callback with [String] (string array)
const okit_list_teams = (octokit, org, onSuccess, onFailure) =>
idris__okit_unpromisify(
octokit.rest.teams.list({ org, per_page: 100 }),
r => onSuccess(newline_delimited(digTeams(r.data))),
idris__okit_stringify_error(onFailure)
)

// Executes callback with [String] (string array)
const okit_list_my_teams = (octokit, onSuccess, onFailure) =>
idris__okit_unpromisify(
octokit.rest.teams.listForAuthenticatedUser({per_page: 100}),
r => onSuccess(newline_delimited(digTeams(r.data))),
idris__okit_stringify_error(onFailure)
)

// list PRs for branch
const digPr = pr => {
return {
Expand Down

0 comments on commit 831e2e4

Please sign in to comment.