about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-04-19 06:09:32 +0000
committerbors <bors@rust-lang.org>2022-04-19 06:09:32 +0000
commitb25e34837ac286824ee03ec38462ed59fd1cd2ce (patch)
treebb23884349ee762a4b58d9a665799e5b8f535bc5
parent838cc9d3cc4de0abb52263a1fa2e9a6f0191a151 (diff)
parentd4dcb16a02fa0f12f2c1d22836ffe88928f9ab79 (diff)
downloadrust-b25e34837ac286824ee03ec38462ed59fd1cd2ce.tar.gz
rust-b25e34837ac286824ee03ec38462ed59fd1cd2ce.zip
Auto merge of #12028 - lnicola:fix-changelog, r=lnicola
internal: Fix changelog generation after repo move
-rw-r--r--xtask/src/release/changelog.rs108
1 files changed, 59 insertions, 49 deletions
diff --git a/xtask/src/release/changelog.rs b/xtask/src/release/changelog.rs
index ceef9fac2d6..2647f7794f2 100644
--- a/xtask/src/release/changelog.rs
+++ b/xtask/src/release/changelog.rs
@@ -11,56 +11,53 @@ pub(crate) fn get_changelog(
     prev_tag: &str,
     today: &str,
 ) -> anyhow::Result<String> {
-    let git_log = cmd!(sh, "git log {prev_tag}..HEAD --merges --reverse").read()?;
+    let token = match env::var("GITHUB_TOKEN") {
+        Ok(token) => token,
+        Err(_) => bail!("Please obtain a personal access token from https://github.com/settings/tokens and set the `GITHUB_TOKEN` environment variable."),
+    };
+
+    let git_log = cmd!(sh, "git log {prev_tag}..HEAD --reverse").read()?;
     let mut features = String::new();
     let mut fixes = String::new();
     let mut internal = String::new();
     let mut others = String::new();
     for line in git_log.lines() {
         let line = line.trim_start();
-        if let Some(p) = line.find(':') {
-            let pr = &line[..p];
-            if let Ok(pr_num) = pr.parse::<u32>() {
-                let accept = "Accept: application/vnd.github.v3+json";
-                let token = match env::var("GITHUB_TOKEN") {
-                    Ok(token) => token,
-                    Err(_) => bail!("Please obtain a personal access token from https://github.com/settings/tokens and set the `GITHUB_TOKEN` environment variable."),
-                };
-                let authorization = format!("Authorization: token {}", token);
-                let pr_url = "https://api.github.com/repos/rust-analyzer/rust-analyzer/issues";
-
-                // we don't use an HTTPS client or JSON parser to keep the build times low
-                let pr_json =
-                    cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}").read()?;
-                let pr_title = cmd!(sh, "jq .title").stdin(&pr_json).read()?;
-                let pr_title = unescape(&pr_title[1..pr_title.len() - 1]);
-                let pr_comment = cmd!(sh, "jq .body").stdin(pr_json).read()?;
-
-                let comments_json =
-                    cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}/comments")
-                        .read()?;
-                let pr_comments = cmd!(sh, "jq .[].body").stdin(comments_json).read()?;
-
-                let l = iter::once(pr_comment.as_str())
-                    .chain(pr_comments.lines())
-                    .rev()
-                    .find_map(|it| {
-                        let it = unescape(&it[1..it.len() - 1]);
-                        it.lines().find_map(parse_changelog_line)
-                    })
-                    .into_iter()
-                    .next()
-                    .unwrap_or_else(|| parse_title_line(&pr_title));
-                let s = match l.kind {
-                    PrKind::Feature => &mut features,
-                    PrKind::Fix => &mut fixes,
-                    PrKind::Internal => &mut internal,
-                    PrKind::Other => &mut others,
-                    PrKind::Skip => continue,
-                };
-                writeln!(s, "* pr:{}[] {}", pr_num, l.message.as_deref().unwrap_or(&pr_title))
-                    .unwrap();
-            }
+        if let Some(pr_num) = parse_pr_number(&line) {
+            let accept = "Accept: application/vnd.github.v3+json";
+            let authorization = format!("Authorization: token {}", token);
+            let pr_url = "https://api.github.com/repos/rust-lang/rust-analyzer/issues";
+
+            // we don't use an HTTPS client or JSON parser to keep the build times low
+            let pr = pr_num.to_string();
+            let pr_json =
+                cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}").read()?;
+            let pr_title = cmd!(sh, "jq .title").stdin(&pr_json).read()?;
+            let pr_title = unescape(&pr_title[1..pr_title.len() - 1]);
+            let pr_comment = cmd!(sh, "jq .body").stdin(pr_json).read()?;
+
+            let comments_json =
+                cmd!(sh, "curl -s -H {accept} -H {authorization} {pr_url}/{pr}/comments").read()?;
+            let pr_comments = cmd!(sh, "jq .[].body").stdin(comments_json).read()?;
+
+            let l = iter::once(pr_comment.as_str())
+                .chain(pr_comments.lines())
+                .rev()
+                .find_map(|it| {
+                    let it = unescape(&it[1..it.len() - 1]);
+                    it.lines().find_map(parse_changelog_line)
+                })
+                .into_iter()
+                .next()
+                .unwrap_or_else(|| parse_title_line(&pr_title));
+            let s = match l.kind {
+                PrKind::Feature => &mut features,
+                PrKind::Fix => &mut fixes,
+                PrKind::Internal => &mut internal,
+                PrKind::Other => &mut others,
+                PrKind::Skip => continue,
+            };
+            writeln!(s, "* pr:{}[] {}", pr_num, l.message.as_deref().unwrap_or(&pr_title)).unwrap();
         }
     }
 
@@ -73,11 +70,6 @@ pub(crate) fn get_changelog(
 Commit: commit:{}[] +
 Release: release:{}[]
 
-== Sponsors
-
-**Become a sponsor:** On https://opencollective.com/rust-analyzer/[OpenCollective] or
-https://github.com/sponsors/rust-analyzer[GitHub Sponsors].
-
 == New Features
 
 {}
@@ -117,6 +109,24 @@ fn unescape(s: &str) -> String {
     s.replace(r#"\""#, "").replace(r#"\n"#, "\n").replace(r#"\r"#, "")
 }
 
+fn parse_pr_number(s: &str) -> Option<u32> {
+    const BORS_PREFIX: &str = "Merge #";
+    const HOMU_PREFIX: &str = "Auto merge of #";
+    if s.starts_with(BORS_PREFIX) {
+        let s = &s[BORS_PREFIX.len()..];
+        s.parse().ok()
+    } else if s.starts_with(HOMU_PREFIX) {
+        let s = &s[HOMU_PREFIX.len()..];
+        if let Some(space) = s.find(' ') {
+            s[..space].parse().ok()
+        } else {
+            None
+        }
+    } else {
+        None
+    }
+}
+
 fn parse_changelog_line(s: &str) -> Option<PrInfo> {
     let parts = s.splitn(3, ' ').collect::<Vec<_>>();
     if parts.len() < 2 || parts[0] != "changelog" {