Skip to content

Commit 4169be5

Browse files
committed
ci: tolerate rspm binary build revisions
1 parent ec02542 commit 4169be5

4 files changed

Lines changed: 59 additions & 12 deletions

File tree

.github/workflows/ci.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ jobs:
2828
uses: r-lib/actions/setup-r@v2
2929
with:
3030
r-version: "4.5.2"
31-
use-public-rspm: false
31+
use-public-rspm: true
3232

3333
- name: Restore renv packages
3434
uses: r-lib/actions/setup-renv@v2
@@ -40,9 +40,7 @@ jobs:
4040
run: git diff --exit-code renv.lock
4141

4242
- name: Check renv status
43-
run: >
44-
Rscript -e 's <- renv::status();
45-
if (is.list(s) && !isTRUE(s$synchronized)) quit(status = 1)'
43+
run: Rscript dev/check_renv_status.R
4644

4745
- name: Lint
4846
run: Rscript dev/lint.R
@@ -73,7 +71,7 @@ jobs:
7371
uses: r-lib/actions/setup-r@v2
7472
with:
7573
r-version: "4.5.2"
76-
use-public-rspm: false
74+
use-public-rspm: true
7775

7876
- name: Restore renv packages
7977
uses: r-lib/actions/setup-renv@v2

000_install_dependencies.R

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,7 @@ if (!requireNamespace("renv", quietly = TRUE)) {
2525
message("Restoring packages from renv.lock...")
2626
renv::restore(prompt = FALSE)
2727

28-
status_output <- capture.output(status <- renv::status(), type = "output")
29-
if (!isTRUE(status$synchronized)) {
30-
if (length(status_output) > 0) {
31-
message(paste(status_output, collapse = "\n"))
32-
}
33-
stop("renv restore completed, but the project library is still not synchronized.")
34-
}
28+
source("dev/renv_status.R")
29+
assert_renv_synchronized()
3530

3631
message("\nDone. Run: Rscript run_all.R")

dev/check_renv_status.R

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/usr/bin/env Rscript
2+
3+
source("dev/renv_status.R")
4+
assert_renv_synchronized()

dev/renv_status.R

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
escape_regex <- function(value) {
2+
gsub("([][{}()+*^$|\\\\?.])", "\\\\\\1", value)
3+
}
4+
5+
is_binary_build_revision_only <- function(status_output) {
6+
lines <- trimws(status_output)
7+
mismatch_lines <- grep("^-\\s+\\S+\\s+\\[repo:", lines, value = TRUE)
8+
if (length(mismatch_lines) == 0) {
9+
return(FALSE)
10+
}
11+
12+
all(vapply(mismatch_lines, function(line) {
13+
match <- regexec(
14+
"^-\\s+(\\S+)\\s+\\[repo: CRAN != RSPM; ver: (\\S+) != (\\S+)\\]$",
15+
line
16+
)
17+
parts <- regmatches(line, match)[[1]]
18+
if (length(parts) != 4) {
19+
return(FALSE)
20+
}
21+
22+
lock_version <- parts[[3]]
23+
library_version <- parts[[4]]
24+
grepl(
25+
paste0("^", escape_regex(lock_version), "-[0-9]+$"),
26+
library_version
27+
)
28+
}, logical(1)))
29+
}
30+
31+
assert_renv_synchronized <- function() {
32+
status_output <- capture.output(status <- renv::status(), type = "output")
33+
if (is.list(status) && isTRUE(status$synchronized)) {
34+
message("renv library is synchronized with renv.lock.")
35+
return(invisible(TRUE))
36+
}
37+
38+
if (is_binary_build_revision_only(status_output)) {
39+
message(
40+
"renv library differs only by Posit Package Manager binary build ",
41+
"revision suffixes; lockfile package versions are otherwise synchronized."
42+
)
43+
return(invisible(TRUE))
44+
}
45+
46+
if (length(status_output) > 0) {
47+
message(paste(status_output, collapse = "\n"))
48+
}
49+
stop("renv restore completed, but the project library is still not synchronized.")
50+
}

0 commit comments

Comments
 (0)