#' Create a new release on GitHub repo
#'
#' @param repo Repository name in format "owner/repo". Will guess
#' the current repo if not specified.
#' @param tag tag to create for this release
#' @param commit Specifies the commit-ish value that
#' determines where the Git tag is created from.
#' Can be any branch or full commit SHA (not the short hash). Unused if the
#' git tag already exists. Default: the repository's
#' default branch (usually `master`).
#' @param name The name of the release. Defaults to tag.
#' @param body Text describing the contents of the tag.
#' default text is "Data release".
#' @param draft default `FALSE`. Set to `TRUE` to create
#' a draft (unpublished) release.
#' @param prerelease default `FALSE`. Set to `TRUE` to
#' identify the release as a pre-release.
#' @param .token GitHub authentication token, see `[gh::gh_token()]`
#' @family release_management
#' @aliases pb_new_release
#' @export
#' @examples \dontrun{
#' pb_release_create("cboettig/piggyback-tests", "v0.0.5")
#' }
pb_release_create <- function(repo = guess_repo(),
tag,
commit = NULL,
name = tag,
body = "Data release",
draft = FALSE,
prerelease = FALSE,
.token = gh::gh_token()) {
releases <- pb_releases(repo = repo, .token = .token, verbose = FALSE)
# if no releases exist, pb_releases returns a dataframe of releases
if(nrow(releases) > 0 && tag %in% releases$tag_name){
cli::cli_warn("Failed to create release: {.val {tag}} already exists!")
return(invisible(releases[tag %in% releases$tag_name,]))
}
r <- parse_repo(repo)
payload <- compact(list(
tag_name = tag,
target_commitish = commit,
name = name,
body = body,
draft = draft,
prerelease = prerelease
))
## gh fails to pass body correctly?
# gh("/repos/:owner/:repo/releases", owner = r[[1]], repo = r[[2]],
# .method = "POST", body = toJSON(payload,auto_unbox = TRUE), encode="json")
resp <- httr::RETRY(
verb = "POST",
url = glue::glue("https://api.github.com/repos/{r[[1]]}/{r[[2]]}/releases"),
httr::add_headers(Authorization = paste("token",.token)),
body = jsonlite::toJSON(payload, auto_unbox = TRUE),
terminate_on = c(400, 401, 403, 404, 422)
)
if(httr::http_error(resp)) {
cli::cli_warn(
c("!"="Failed to create release: HTTP error {.val {httr::status_code(resp)}}.",
"See returned error messages for more details"))
return(httr::content(resp))
}
## Release info changed, so break caches
.pb_cache_clear()
release <- httr::content(resp)
cli::cli_alert_success("Created new release {.val {name}}.")
return(invisible(release))
}
#' @export
pb_new_release <- pb_release_create
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.