diff --git a/R/pr.R b/R/pr.R index c486d37b7..c881871e6 100644 --- a/R/pr.R +++ b/R/pr.R @@ -208,7 +208,7 @@ pr_init <- function(branch) { if (!is.na(remref)) { comparison <- git_branch_compare(current_branch, remref) if (comparison$remote_only > 0) { - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = c("pull", "switch branches")) } ui_bullets(c("v" = "Pulling changes from {.val {remref}}.")) git_pull(remref = remref, verbose = FALSE) @@ -258,7 +258,7 @@ pr_resume <- function(branch = NULL) { )) } - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = c("pull", "switch", "compare branches")) ui_bullets(c("v" = "Switching to branch {.val {branch}}.")) gert::git_branch_checkout(branch, repo = repo) @@ -283,7 +283,7 @@ pr_resume <- function(branch = NULL) { pr_fetch <- function(number = NULL, target = c("source", "primary")) { repo <- git_repo() tr <- target_repo(github_get = NA, role = target, ask = FALSE) - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = c("pull", "switch branches")) if (is.null(number)) { ui_bullets(c("i" = "No PR specified ... looking up open PRs.")) @@ -377,7 +377,7 @@ pr_push <- function() { check_for_config(cfg, ok_configs = c("ours", "fork")) default_branch <- git_default_branch() check_pr_branch(default_branch) - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = "push") branch <- git_branch() remref <- git_branch_tracking(branch) @@ -425,7 +425,7 @@ pr_pull <- function() { check_for_config(cfg) default_branch <- git_default_branch() check_pr_branch(default_branch) - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = "pull") git_pull() @@ -440,7 +440,7 @@ pr_pull <- function() { #' @rdname pull-requests pr_merge_main <- function() { tr <- target_repo(github_get = TRUE, ask = FALSE) - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = "pull") remref <- glue("{tr$remote}/{tr$default_branch}") ui_bullets(c("v" = "Pulling changes from {.val {remref}}.")) git_pull(remref, verbose = FALSE) @@ -503,7 +503,7 @@ pr_pause <- function() { )) return(invisible()) } - challenge_uncommitted_changes() + challenge_uncommitted_changes(which = "switch branches") # TODO: what happens here if offline? check_branch_pulled(use = "pr_pull()") diff --git a/R/utils-git.R b/R/utils-git.R index 810988d45..31287a79d 100644 --- a/R/utils-git.R +++ b/R/utils-git.R @@ -181,7 +181,10 @@ git_uncommitted <- function(untracked = FALSE) { nrow(git_status(untracked)) > 0 } -challenge_uncommitted_changes <- function(untracked = FALSE, msg = NULL) { +challenge_uncommitted_changes <- function( + untracked = FALSE, + msg = NULL, + which = c("push", "pull", "switch", "compare branches")) { if (!uses_git()) { return(invisible()) } @@ -190,18 +193,28 @@ challenge_uncommitted_changes <- function(untracked = FALSE, msg = NULL) { rstudioapi::documentSaveAll() } - default_msg <- " - There are uncommitted changes, which may cause problems or be lost when \\ - we push, pull, switch, or compare branches" - msg <- glue(msg %||% default_msg) - if (git_uncommitted(untracked = untracked)) { - if (ui_yep(c( - "!" = msg, - " " = "Do you want to proceed anyway?" - ))) { + default_msg <- + "Uncommitted changes may cause problems or be lost when we {.or {which}}." + msg <- cli::format_inline(msg %||% default_msg) + + uncommited <- git_status(untracked) + if (nrow(uncommited) > 0) { + choice <- utils::menu( + c( + "I want to proceed anyway.", + cli::format_inline( + "I want to take a closer look at {.file {uncommited$file}} first." + ) + ), + title = msg + ) + if (choice == 1) { return(invisible()) } else { - ui_abort("Uncommitted changes. Please commit before continuing.") + ui_abort( + "Uncommitted changes. Please commit before continuing.", + call = caller_env() + ) } } }