Skip to content

Commit

Permalink
feat: add exercise featuring a merge conflict
Browse files Browse the repository at this point in the history
  • Loading branch information
maelle committed Jan 18, 2024
1 parent b5865d8 commit f3d5d12
Show file tree
Hide file tree
Showing 8 changed files with 151 additions and 0 deletions.
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export(exo_bisect)
export(exo_clean_dir)
export(exo_committed_to_main)
export(exo_committed_to_wrong)
export(exo_conflict)
export(exo_latest_message)
export(exo_one_small_change)
export(exo_rebase_i)
Expand Down
75 changes: 75 additions & 0 deletions R/conflict.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
#' "Hey I'd like to see what merge conflicts look like!"
#'
#' @description
#' I made some work in a feature branch and want to merge it.
#' Meanwhile, the main branch advanced.
#' Unfortunately someone touched the same file as I did.
#' Now I need to fix a merge conflict!
#'
#' See also <https://happygitwithr.com/git-branches.html#dealing-with-conflicts>.
#'
#'
#' @inheritParams exo_one_small_change
#'
#' @section Git commands:
#' `git merge`.
#' @return The path to the new project
#' @export
#'
#' @examplesIf interactive()
#' parent_path <- withr::local_tempdir()
#' path <- exo_conflict(parent_path = parent_path)
exo_conflict <- function(parent_path) {

path <- file.path(parent_path, "conflict")

withr::local_options(usethis.quiet = TRUE)

dir_create(path)
original_dir <- getwd()

withr::local_dir(path)
gert::git_init()

file.copy(
system.file("exo_conflict-Rprofile.R", package = "saperlipopette"),
".Rprofile"
)

create_project(path = getwd())
# Ignore Rproj that might otherwise get edited when we open the project
rproj <- fs::dir_ls(glob = "*.Rproj")
usethis::local_project(getwd(), force = TRUE)
usethis::use_git_ignore(rproj)
usethis::use_git_ignore(".Rprofile")
gert::git_add("*")
git_commit("First commit")

new_script <- file.path("R", "script.R")
fs::file_create(new_script)
script_lines <- c("a <- 1", "b <- 2")
brio::write_lines(text = script_lines, path = new_script)
gert::git_add(new_script)
git_commit("feat: add script")


gert::git_branch_create("feature")
brio::write_lines(text = c("a <- 10", "b <- 2", "c <- 3"), path = new_script)
gert::git_add(new_script)
git_commit("feat: improve script")

if ("main" %in% gert::git_branch_list()[["name"]]) {
gert::git_branch_checkout("main")
} else {
gert::git_branch_checkout("master")
}
brio::write_lines(text = c("a <- 11", "b <- 2"), path = new_script)
gert::git_add(new_script)
git_commit("feat: amend script")

usethis::local_project(original_dir, force = TRUE)

cli::cli_alert_info("Follow along in {path}!")

return(path)
}
1 change: 1 addition & 0 deletions _pkgdown.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ reference:
contents:
- exo_split_changes
- exo_clean_dir
- exo_conflict
- exo_rebase_i
- exo_bisect
- title: All exercises at once
Expand Down
22 changes: 22 additions & 0 deletions inst/exo_conflict-Rprofile.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
if (file.exists("~/.Rprofile")) {
base::sys.source("~/.Rprofile", envir = environment())
}

cli::cli_alert_danger('"I want to merge feature into main."')
cli::cli_alert_danger("I will need to fix a merge conflict.")
cli::cli_alert_info("For more help use {.run tip()}")

tip <- function() {
cli::cli_li(
items = c(
"Examine Git history.",
"{.code git merge feature} on the default branch",
"Edit R/script.R to the desired state, remove conflict markers.",
"{.code git add R/script.R}",
"{.code git commit}.",
"See the merge finalize, you might need to edit a commit message.",
"Examine Git history."
)
)

}
33 changes: 33 additions & 0 deletions man/exo_conflict.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions tests/testthat/_snaps/conflict.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# exo_conflict() works

Code
gert::git_log(repo = path)[["commit"]]
Output
[1] "5d871367c8a247a5e63bd0701d7bce830d1dc614"
[2] "2a61d9da6865eb7f7272c9f901f13c1da377a01e"
[3] "e227ecc55e421f70b6e30602e6a2eee02aad42e0"

3 changes: 3 additions & 0 deletions tests/testthat/_snaps/create-all.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
| +-- R
| +-- bla
| \-- fix.txt
+-- conflict
| \-- R
| \-- script.R
+-- latest-message
| +-- R
| \-- bla
Expand Down
7 changes: 7 additions & 0 deletions tests/testthat/test-conflict.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
test_that("exo_conflict() works", {
rlang::local_options(cli.default_handler = function(msg) invisible(NULL))
parent_path <- withr::local_tempdir()
path <- exo_conflict(parent_path = parent_path)
expect_equal(fs::path_file(path), "conflict")
expect_snapshot(gert::git_log(repo = path)[["commit"]])
})

0 comments on commit f3d5d12

Please sign in to comment.