From 113f3627e51aabe7519afb59a28770344e4ebde5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABlle=20Salmon?= Date: Wed, 7 Nov 2018 12:18:38 +0100 Subject: [PATCH] add untested GitHub repo creation --- R/createAnalysisProject.R | 6 ++ R/createBasicProject.R | 9 +++ R/createPackageProject.R | 12 +++- R/createTrainingProject.R | 6 ++ R/utils.R | 67 ++++++++------------ man/createAnalysisProject.Rd | 12 +++- man/createBasicProject.Rd | 11 +++- man/createPackageProject.Rd | 10 ++- man/createTrainingProject.Rd | 10 ++- tests/testthat/test-AAA-createBasicProject.R | 6 +- tests/testthat/test-createAnalysisProject.R | 3 +- tests/testthat/test-createPackageProject.R | 6 +- tests/testthat/test-createTrainingProject.R | 9 ++- 13 files changed, 110 insertions(+), 57 deletions(-) diff --git a/R/createAnalysisProject.R b/R/createAnalysisProject.R index c57bd98..2708350 100644 --- a/R/createAnalysisProject.R +++ b/R/createAnalysisProject.R @@ -16,6 +16,9 @@ createAnalysisProject <- function(name, folder = getwd(), travis = TRUE, packagedeps = "packrat", git = TRUE, + github = gh::gh_whoami()$login, + private = FALSE, + protocol = "ssh", readme = TRUE, dirs = c("data", "analysis", "outputs")) { packagedeps <- match.arg(packagedeps, okpackagedeps()) @@ -24,6 +27,9 @@ createAnalysisProject <- function(name, folder = getwd(), travis = travis, packagedeps = packagedeps, git = git, + github = github, + private = private, + protocol = protocal, readme = readme) createdirs(dirs) invisible(TRUE) diff --git a/R/createBasicProject.R b/R/createBasicProject.R index 9c8ded7..666928a 100644 --- a/R/createBasicProject.R +++ b/R/createBasicProject.R @@ -5,6 +5,10 @@ #' @param travis Configure Travis-CI #' @param packagedeps Set a tool for package reproducibility #' @param git Configure Git +#' @param github username or organization name to use for GitHub. +#' If NULL, no GitHub repo is created. +#' @param private whether to make the created GitHub repo private +#' @param protocol "ssh" or "https", protocol to use for GitHub #' @param readme Include a README #' #' @export @@ -20,6 +24,9 @@ createBasicProject <- function(name, folder = getwd(), travis = TRUE, packagedeps = "packrat", git = TRUE, + github = gh::gh_whoami()$login, + private = FALSE, + protocol = "ssh", readme = TRUE) { packagedeps <- match.arg(packagedeps, okpackagedeps()) @@ -50,6 +57,8 @@ createBasicProject <- function(name, folder = getwd(), if (git) usethis::use_git() if (readme) usethis::use_readme_rmd(open = FALSE) + if (!is.null(github)) setup_repo(username = github, + private, protocol) } , diff --git a/R/createPackageProject.R b/R/createPackageProject.R index 2b3744b..4d4781c 100644 --- a/R/createPackageProject.R +++ b/R/createPackageProject.R @@ -5,7 +5,10 @@ #' @param folder Folder under which to create the project #' @param bestPractices Run additional best practice commands #' @param coverage What code coverage platform to use, "codecov" or "coveralls". -#' @param private Whether to create the GH repo as private +#' @param github username or organization name to use for GitHub. +#' If NULL, no GitHub repo is created. +#' @param private whether to make the created GitHub repo private +#' @param protocol "ssh" or "https", protocol to use for GitHub #' #' @export #' @@ -19,7 +22,9 @@ createPackageProject <- function(name, folder = getwd(), bestPractices = TRUE, coverage = "codecov", - private = TRUE) { + github = gh::gh_whoami()$login, + private = FALSE, + protocol = "ssh") { if (is_available(name)) { tryCatch({ @@ -61,7 +66,8 @@ createPackageProject <- function(name, folder = getwd(), usethis::use_testthat() usethis::use_vignette(name) usethis::use_git() - #use_github(private = private) + if (!is.null(github)) setup_repo(username = github, + private, protocol) } } diff --git a/R/createTrainingProject.R b/R/createTrainingProject.R index ed21e94..81531c4 100644 --- a/R/createTrainingProject.R +++ b/R/createTrainingProject.R @@ -23,6 +23,9 @@ createTrainingProject <- function(name, folder = getwd(), travis = TRUE, packagedeps = "packrat", git = TRUE, + github = gh::gh_whoami()$login, + private = FALSE, + protocol = "ssh", readme = TRUE) { packagedeps <- match.arg(packagedeps, okpackagedeps()) @@ -46,6 +49,9 @@ createTrainingProject <- function(name, folder = getwd(), folder = folder, travis = travis, packagedeps = "none", + github = github, + private = private, + protocol = protocal, git = git, readme = readme) createdirs(dirs) diff --git a/R/utils.R b/R/utils.R index ac190f3..457bdf5 100644 --- a/R/utils.R +++ b/R/utils.R @@ -67,51 +67,38 @@ is_available <- function(name) { invisible(TRUE) } -# from usethis since pushing doesn't work yet, -# removed pushing -use_github <- function (organisation = NULL, private = TRUE, - protocol = "ssh", - host = NULL) -{ - auth_token <- usethis:::gh_token() - usethis:::check_gh_token(auth_token) - - pkg <- usethis:::project_data() - repo_name <- pkg$Project %||% gsub("\n", " ", pkg$Package) - repo_desc <- pkg$Title %||% "" +is_org <- function(username){ + info <- gh::gh("GET /users/:username", username = username) + info$type == "Organization" +} - usethis:::done("Creating GitHub repository") - if (is.null(organisation)) { - create <- gh::gh("POST /user/repos", name = repo_name, - description = repo_desc, private = private, .api_url = host, - .token = auth_token) +# very much inspired by usethis! +setup_repo <- function(username, private, protocol){ + # create repo + if(is_org(username)){ + endpoint <- "POST /orgs/:org/repos" + }else{ + endpoint <- "POST /user/repos" } - else { - create <- gh::gh("POST /orgs/:org/repos", org = organisation, - name = repo_name, description = repo_desc, private = private, - .api_url = host, .token = auth_token) - } - usethis:::done("Adding GitHub remote") + create <- gh::gh(endpoint, + org = username, + name = as.character( + fs::path_file(usethis::proj_get())), + description = as.character( + desc::desc(usethis::proj_get())$get("Title")), + private = tolower(as.character(private))) + r <- git2r::repository(usethis::proj_get()) - protocol <- match.arg(protocol) origin_url <- switch(protocol, https = create$clone_url, ssh = create$ssh_url) git2r::remote_add(r, "origin", origin_url) - if (usethis:::is_package()) { - usethis:::done("Adding GitHub links to DESCRIPTION") - use_github_links(auth_token = auth_token, host = host) - if (git_uncommitted()) { - git2r::add(r, "DESCRIPTION") - git2r::commit(r, "Add GitHub links to DESCRIPTION") - } - } - usethis:::done("Setting remote tracking branch") - - git2r::branch_set_upstream(git2r::repository_head(r), "origin/master") - view_url(create$html_url) - invisible(NULL) + git2r::checkout(r, "master") + #git2r::branch_set_upstream(git2r::repository_head(r), + # "origin/master") + desc::desc_set("URL", create$html_url, + file = usethis::proj_get()) + desc::desc_set("BugReports", + paste0(create$html_url, "/issues"), + file = usethis::proj_get()) } -# https://github.com/r-lib/usethis/blob/1e3c6a66e8b2d2790ee6d7e6d5651c52fb61abfc/R/utils.R#L100 -"%||%" <- function(a, b) if (!is.null(a)) a else b - diff --git a/man/createAnalysisProject.Rd b/man/createAnalysisProject.Rd index b6a5c8e..5120a90 100644 --- a/man/createAnalysisProject.Rd +++ b/man/createAnalysisProject.Rd @@ -5,8 +5,9 @@ \title{Create a project laid out for an analysis project} \usage{ createAnalysisProject(name, folder = getwd(), travis = TRUE, - packagedeps = "packrat", git = TRUE, readme = TRUE, - dirs = c("data", "analysis", "outputs")) + packagedeps = "packrat", git = TRUE, + github = gh::gh_whoami()$login, private = FALSE, protocol = "ssh", + readme = TRUE, dirs = c("data", "analysis", "outputs")) } \arguments{ \item{name}{Project} @@ -19,6 +20,13 @@ createAnalysisProject(name, folder = getwd(), travis = TRUE, \item{git}{Configure Git} +\item{github}{username or organization name to use for GitHub. +If NULL, no GitHub repo is created.} + +\item{private}{whether to make the created GitHub repo private} + +\item{protocol}{"ssh" or "https", protocol to use for GitHub} + \item{readme}{Include a README} \item{dirs}{Directories to create} diff --git a/man/createBasicProject.Rd b/man/createBasicProject.Rd index 9e8559e..8bf1d27 100644 --- a/man/createBasicProject.Rd +++ b/man/createBasicProject.Rd @@ -5,7 +5,9 @@ \title{Create a very basic project directory} \usage{ createBasicProject(name, folder = getwd(), travis = TRUE, - packagedeps = "packrat", git = TRUE, readme = TRUE) + packagedeps = "packrat", git = TRUE, + github = gh::gh_whoami()$login, private = FALSE, protocol = "ssh", + readme = TRUE) } \arguments{ \item{name}{Project} @@ -18,6 +20,13 @@ createBasicProject(name, folder = getwd(), travis = TRUE, \item{git}{Configure Git} +\item{github}{username or organization name to use for GitHub. +If NULL, no GitHub repo is created.} + +\item{private}{whether to make the created GitHub repo private} + +\item{protocol}{"ssh" or "https", protocol to use for GitHub} + \item{readme}{Include a README} } \description{ diff --git a/man/createPackageProject.Rd b/man/createPackageProject.Rd index ea5eae9..832b23e 100644 --- a/man/createPackageProject.Rd +++ b/man/createPackageProject.Rd @@ -6,7 +6,8 @@ commands executed to save you hassle} \usage{ createPackageProject(name, folder = getwd(), bestPractices = TRUE, - coverage = "codecov", private = TRUE) + coverage = "codecov", github = gh::gh_whoami()$login, + private = FALSE, protocol = "ssh") } \arguments{ \item{name}{Project / package name} @@ -17,7 +18,12 @@ createPackageProject(name, folder = getwd(), bestPractices = TRUE, \item{coverage}{What code coverage platform to use, "codecov" or "coveralls".} -\item{private}{Whether to create the GH repo as private} +\item{github}{username or organization name to use for GitHub. +If NULL, no GitHub repo is created.} + +\item{private}{whether to make the created GitHub repo private} + +\item{protocol}{"ssh" or "https", protocol to use for GitHub} } \description{ Create a package the usethis way with a number of infrastructure diff --git a/man/createTrainingProject.Rd b/man/createTrainingProject.Rd index 1f685b8..1b75c8f 100644 --- a/man/createTrainingProject.Rd +++ b/man/createTrainingProject.Rd @@ -7,7 +7,8 @@ createTrainingProject(name, folder = getwd(), dirs = c("data", "handouts", "slides"), handoutEngine = "rmarkdown", slideEngine = "rmarkdown", travis = TRUE, packagedeps = "packrat", - git = TRUE, readme = TRUE) + git = TRUE, github = gh::gh_whoami()$login, private = FALSE, + protocol = "ssh", readme = TRUE) } \arguments{ \item{name}{Project} @@ -26,6 +27,13 @@ createTrainingProject(name, folder = getwd(), dirs = c("data", \item{git}{Configure Git} +\item{github}{username or organization name to use for GitHub. +If NULL, no GitHub repo is created.} + +\item{private}{whether to make the created GitHub repo private} + +\item{protocol}{"ssh" or "https", protocol to use for GitHub} + \item{readme}{Include a README} } \description{ diff --git a/tests/testthat/test-AAA-createBasicProject.R b/tests/testthat/test-AAA-createBasicProject.R index 8f0ef73..983a62a 100644 --- a/tests/testthat/test-AAA-createBasicProject.R +++ b/tests/testthat/test-AAA-createBasicProject.R @@ -9,7 +9,8 @@ project_name <- "basicProject" test_that("createBasicProject() creates as expected when using defaults", { createBasicProject(project_name, folder = tmp, - packagedeps = "packrat") + packagedeps = "packrat", + github = NULL) expect_true(file.exists(file.path(tmp, project_name, paste0(project_name, ".Rproj")))) expect_true(file.exists(file.path(tmp, project_name, "DESCRIPTION"))) @@ -46,7 +47,8 @@ usethis::proj_set(getwd()) test_that("createBasicProject() cleans if there was an error", { m <- mockery::mock(stop()) with_mock(dir.create = m, { - expect_message(createBasicProject("blablabla"), + expect_message(createBasicProject("blablabla", + github = NULL), "Oops") }) diff --git a/tests/testthat/test-createAnalysisProject.R b/tests/testthat/test-createAnalysisProject.R index 1401a04..7d53e3a 100644 --- a/tests/testthat/test-createAnalysisProject.R +++ b/tests/testthat/test-createAnalysisProject.R @@ -8,7 +8,8 @@ project_name <- "analysisProject" test_that("createAnalysisProject() creates as expected when using defaults",{ - createAnalysisProject(project_name, folder = tmp) + createAnalysisProject(project_name, folder = tmp, + github = NULL) #expect_true(file.exists(file.path(tmp, project_name, paste0(project_name, ".Rproj")))) expect_true(file.exists(file.path(tmp, project_name, "DESCRIPTION"))) diff --git a/tests/testthat/test-createPackageProject.R b/tests/testthat/test-createPackageProject.R index f1ff6c0..26dd6a8 100644 --- a/tests/testthat/test-createPackageProject.R +++ b/tests/testthat/test-createPackageProject.R @@ -16,7 +16,8 @@ project_name <- "packageProject2" test_that("createPackageProject() creates as expected when using defaults",{ - createPackageProject(project_name, folder = tmp) + createPackageProject(project_name, folder = tmp, + github = NULL) expect_true(file.exists(file.path(tmp, project_name, paste0(project_name, ".Rproj")))) #expect_true(file.exists(file.path(tmp, project_name, "codecov.yml"))) expect_true(file.exists(file.path(tmp, project_name, "CODE_OF_CONDUCT.md"))) @@ -40,7 +41,8 @@ usethis::proj_set(getwd()) test_that("createPackageProject() cleans if there was an error", { m <- mockery::mock(stop()) with_mock(dir.create = m, { - expect_message(createPackageProject("blablabla"), + expect_message(createPackageProject("reallynotapkgnameplease", + github = NULL), "Oops") }) }) diff --git a/tests/testthat/test-createTrainingProject.R b/tests/testthat/test-createTrainingProject.R index 1653710..6bf76cc 100644 --- a/tests/testthat/test-createTrainingProject.R +++ b/tests/testthat/test-createTrainingProject.R @@ -8,7 +8,8 @@ project_name <- "trainingProject2" test_that("createTrainingProject() creates as expected when using defaults",{ createTrainingProject(project_name, folder = tmp, - packagedeps = "none") + packagedeps = "none", + github = NULL) expect_true(file.exists(file.path(tmp, project_name, paste0(project_name, ".Rproj")))) expect_true(file.exists(file.path(tmp, project_name, "DESCRIPTION"))) expect_true(file.exists(file.path(tmp, project_name, "R"))) @@ -29,7 +30,8 @@ test_that("createTrainingProject() creates as expected when using bookdown and r createTrainingProject(project_name, folder = tmp, handoutEngine = "bookdown", slideEngine = "revealjs", - packagedeps = "none") + packagedeps = "none", + github = NULL) expect_true(file.exists(file.path(tmp, project_name, paste0(project_name, ".Rproj")))) expect_true(file.exists(file.path(tmp, project_name, "DESCRIPTION"))) expect_true(file.exists(file.path(tmp, project_name, "R"))) @@ -50,7 +52,8 @@ usethis::proj_set(getwd()) test_that("createTrainingProject() creates as expected when using tufte and xaringan",{ createTrainingProject(project_name, folder = tmp, handoutEngine = "tufte", slideEngine = "xaringan", - packagedeps = "none") + packagedeps = "none", + github = NULL) expect_true(file.exists(file.path(tmp, project_name, paste0(project_name, ".Rproj")))) expect_true(file.exists(file.path(tmp, project_name, "DESCRIPTION")))