Skip to content

Commit b25e348

Browse files
committed
Auto merge of rust-lang#12028 - lnicola:fix-changelog, r=lnicola
internal: Fix changelog generation after repo move
2 parents 838cc9d + d4dcb16 commit b25e348

File tree

1 file changed

+59
-49
lines changed

1 file changed

+59
-49
lines changed

xtask/src/release/changelog.rs

+59-49
Original file line numberDiff line numberDiff line change
@@ -11,56 +11,53 @@ pub(crate) fn get_changelog(
1111
prev_tag: &str,
1212
today: &str,
1313
) -> anyhow::Result<String> {
14-
let git_log = cmd!(sh, "git log {prev_tag}..HEAD --merges --reverse").read()?;
14+
let token = match env::var("GITHUB_TOKEN") {
15+
Ok(token) => token,
16+
Err(_) => bail!("Please obtain a personal access token from https://github.com/settings/tokens and set the `GITHUB_TOKEN` environment variable."),
17+
};
18+
19+
let git_log = cmd!(sh, "git log {prev_tag}..HEAD --reverse").read()?;
1520
let mut features = String::new();
1621
let mut fixes = String::new();
1722
let mut internal = String::new();
1823
let mut others = String::new();
1924
for line in git_log.lines() {
2025
let line = line.trim_start();
21-
if let Some(p) = line.find(':') {
22-
let pr = &line[..p];
23-
if let Ok(pr_num) = pr.parse::<u32>() {
24-
let accept = "Accept: application/vnd.github.v3+json";
25-
let token = match env::var("GITHUB_TOKEN") {
26-
Ok(token) => token,
27-
Err(_) => bail!("Please obtain a personal access token from https://github.com/settings/tokens and set the `GITHUB_TOKEN` environment variable."),
28-
};
29-
let authorization = format!("Authorization: token {}", token);
30-
let pr_url = "https://api.github.com/repos/rust-analyzer/rust-analyzer/issues";
31-
32-
// we don't use an HTTPS client or JSON parser to keep the build times low
33-
let pr_json =
34-
cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}").read()?;
35-
let pr_title = cmd!(sh, "jq .title").stdin(&pr_json).read()?;
36-
let pr_title = unescape(&pr_title[1..pr_title.len() - 1]);
37-
let pr_comment = cmd!(sh, "jq .body").stdin(pr_json).read()?;
38-
39-
let comments_json =
40-
cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}/comments")
41-
.read()?;
42-
let pr_comments = cmd!(sh, "jq .[].body").stdin(comments_json).read()?;
43-
44-
let l = iter::once(pr_comment.as_str())
45-
.chain(pr_comments.lines())
46-
.rev()
47-
.find_map(|it| {
48-
let it = unescape(&it[1..it.len() - 1]);
49-
it.lines().find_map(parse_changelog_line)
50-
})
51-
.into_iter()
52-
.next()
53-
.unwrap_or_else(|| parse_title_line(&pr_title));
54-
let s = match l.kind {
55-
PrKind::Feature => &mut features,
56-
PrKind::Fix => &mut fixes,
57-
PrKind::Internal => &mut internal,
58-
PrKind::Other => &mut others,
59-
PrKind::Skip => continue,
60-
};
61-
writeln!(s, "* pr:{}[] {}", pr_num, l.message.as_deref().unwrap_or(&pr_title))
62-
.unwrap();
63-
}
26+
if let Some(pr_num) = parse_pr_number(&line) {
27+
let accept = "Accept: application/vnd.github.v3+json";
28+
let authorization = format!("Authorization: token {}", token);
29+
let pr_url = "https://api.github.com/repos/rust-lang/rust-analyzer/issues";
30+
31+
// we don't use an HTTPS client or JSON parser to keep the build times low
32+
let pr = pr_num.to_string();
33+
let pr_json =
34+
cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}").read()?;
35+
let pr_title = cmd!(sh, "jq .title").stdin(&pr_json).read()?;
36+
let pr_title = unescape(&pr_title[1..pr_title.len() - 1]);
37+
let pr_comment = cmd!(sh, "jq .body").stdin(pr_json).read()?;
38+
39+
let comments_json =
40+
cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}/comments").read()?;
41+
let pr_comments = cmd!(sh, "jq .[].body").stdin(comments_json).read()?;
42+
43+
let l = iter::once(pr_comment.as_str())
44+
.chain(pr_comments.lines())
45+
.rev()
46+
.find_map(|it| {
47+
let it = unescape(&it[1..it.len() - 1]);
48+
it.lines().find_map(parse_changelog_line)
49+
})
50+
.into_iter()
51+
.next()
52+
.unwrap_or_else(|| parse_title_line(&pr_title));
53+
let s = match l.kind {
54+
PrKind::Feature => &mut features,
55+
PrKind::Fix => &mut fixes,
56+
PrKind::Internal => &mut internal,
57+
PrKind::Other => &mut others,
58+
PrKind::Skip => continue,
59+
};
60+
writeln!(s, "* pr:{}[] {}", pr_num, l.message.as_deref().unwrap_or(&pr_title)).unwrap();
6461
}
6562
}
6663

@@ -73,11 +70,6 @@ pub(crate) fn get_changelog(
7370
Commit: commit:{}[] +
7471
Release: release:{}[]
7572
76-
== Sponsors
77-
78-
**Become a sponsor:** On https://opencollective.com/rust-analyzer/[OpenCollective] or
79-
https://github.com/sponsors/rust-analyzer[GitHub Sponsors].
80-
8173
== New Features
8274
8375
{}
@@ -117,6 +109,24 @@ fn unescape(s: &str) -> String {
117109
s.replace(r#"\""#, "").replace(r#"\n"#, "\n").replace(r#"\r"#, "")
118110
}
119111

112+
fn parse_pr_number(s: &str) -> Option<u32> {
113+
const BORS_PREFIX: &str = "Merge #";
114+
const HOMU_PREFIX: &str = "Auto merge of #";
115+
if s.starts_with(BORS_PREFIX) {
116+
let s = &s[BORS_PREFIX.len()..];
117+
s.parse().ok()
118+
} else if s.starts_with(HOMU_PREFIX) {
119+
let s = &s[HOMU_PREFIX.len()..];
120+
if let Some(space) = s.find(' ') {
121+
s[..space].parse().ok()
122+
} else {
123+
None
124+
}
125+
} else {
126+
None
127+
}
128+
}
129+
120130
fn parse_changelog_line(s: &str) -> Option<PrInfo> {
121131
let parts = s.splitn(3, ' ').collect::<Vec<_>>();
122132
if parts.len() < 2 || parts[0] != "changelog" {

0 commit comments

Comments
 (0)