-
Notifications
You must be signed in to change notification settings - Fork 1k
Expand file tree
/
Copy pathrelease-notes.R
More file actions
146 lines (111 loc) · 5.03 KB
/
Copy pathrelease-notes.R
File metadata and controls
146 lines (111 loc) · 5.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
library(fs)
library(stringr)
library(glue)
library(jsonlite)
library(gh)
library(yaml12)
downloads <- path("docs", "download")
# Current versions -------------------------------------------------------
# Based on updated download files
new_release <- read_json(path(downloads, "_download.json"))$version
new_prerelease <- read_json(path(downloads, "_prerelease.json"))$version
# Old version from Git history -------------------------------------------
# Need version at two commits ago
previous_commit <- gh("https://api.github.com/repos/:owner/:repo/commits",
owner = "quarto-dev", repo = "quarto-web",
path = "docs/download/_download.json",
per_page = 2)
previous_commit_ref <- previous_commit[[2]]$sha
previous_contents <- gh("/repos/{owner}/{repo}/contents/{path}",
owner = "quarto-dev", repo = "quarto-web",
path = "docs/download/_download.json",
ref = previous_commit_ref,
.accept = "application/vnd.github.raw+json")
previous_contents_json <- parse_json(previous_contents$message)
old_release <- previous_contents_json$version
old_release_date <- previous_contents_json$created
# Version numbers
extract_major <- function(x){
str_extract(x, "(\\d+)\\.(\\d+)")
}
new_release_major <- extract_major(new_release)
new_prerelease_major <- extract_major(new_prerelease)
major_version <- extract_major(old_release)
cat("Release:", old_release, "->", new_release, "\n")
cat("Prerelease:", new_release_major, "->", new_prerelease_major, "\n")
# Create new changelog content -------------------------------------------
changelog_url <- paste0("https://github.com/quarto-dev/quarto-cli/releases/download/v",
old_release, "/changelog.md")
changelog_dir <- dir_create(path(downloads, "changelog", major_version))
changelog_file <- path(changelog_dir, "_changelog", ext = "md")
download_status <- download.file(changelog_url, changelog_file)
stopifnot(!download_status)
# escape shortcodes on changelog files as we don't want them processed on website
# changelog.md is not supposed to have shortcodes that are meant to be resolved as they
# are not .qmd files, but regular markdown files.
# # Pattern that matches {{< >}} but NOT {{{< >}}} (already escaped): "(?<!\\{)(\\{\\{<[^>]*>\\}\\})(?!\\})"
xfun::gsub_file(changelog_file, pattern = "(?<!\\{)(\\{\\{<[^>]*>\\}\\})(?!\\})", replacement = "{\\1}", perl = TRUE)
glue("
---
title: {major_version} Release Notes
format: html
---
{{{{< include _changelog.md >}}}}
") |>
writeLines(path(changelog_dir, "index", ext = "qmd"))
# Increment versions of aliases ------------------------------------------
release_page <- path(downloads, "release", ext = "qmd")
prerelease_page <- path(downloads, "prerelease", ext = "qmd")
aliases <- paste0("changelog/",
c(major_version, new_release_major, new_prerelease_major),
"/")
readLines(release_page) |>
str_replace(aliases[1], aliases[2]) |>
writeLines(release_page)
readLines(prerelease_page) |>
str_replace(aliases[2], aliases[3]) |>
writeLines(prerelease_page)
# Update listing ------------------------------------------------
old_abbr <- str_split(major_version, "\\.")[[1]] |> paste0(collapse = "")
# Add or update item in download-older listing
older_file <- path(downloads, "_download-older.yml")
# Preserve comment header, parse YAML data
file_lines <- readLines(older_file)
comment_lines <- file_lines[startsWith(file_lines, "#")]
yaml_text <- file_lines[!startsWith(file_lines, "#")]
entries <- parse_yaml(paste(yaml_text, collapse = "\n"))
new_entry <- list(
id = paste0("version", old_abbr),
title = old_release,
date = format(as.Date(old_release_date), "%Y-%m-%d"),
path = paste0("https://github.com/quarto-dev/quarto-cli/releases/tag/v", old_release),
changelog = paste0("[Release Notes](changelog/", major_version, "/)")
)
# Upsert: update existing entry or append new one
existing_idx <- which(vapply(entries, function(e) identical(e$title, old_release), logical(1)))
if (length(existing_idx) > 0) {
entries[[existing_idx[1]]] <- new_entry
cat("Updated version", old_release, "in _download-older.yml\n")
} else {
entries <- c(entries, list(new_entry))
cat("Added version", old_release, "to _download-older.yml\n")
}
# Write back: comments + formatted YAML
writeLines(
c(comment_lines, format_yaml(entries)),
older_file
)
# Update version for prerelease-docs-url shortcode -------------------------
# _quarto.yml tracks the stable release version. Bumping it here on the
# prerelease branch means it propagates to main when prerelease is merged,
# so the shortcode resolves blog post links to quarto.org.
# _quarto-prerelease-docs.yml is bumped to the next prerelease for the
# announcement banner on the prerelease site.
readLines("_quarto.yml") |>
str_replace("^version: .*", paste0("version: '", new_release_major, "'")) |>
writeLines("_quarto.yml")
readLines("_quarto-prerelease-docs.yml") |>
str_replace("^version: .*", paste0("version: '", new_prerelease_major, "'")) |>
writeLines("_quarto-prerelease-docs.yml")
cat("Version: _quarto.yml ->", new_release_major,
", _quarto-prerelease-docs.yml ->", new_prerelease_major, "\n")