@@ -11,56 +11,53 @@ pub(crate) fn get_changelog(
11
11
prev_tag : & str ,
12
12
today : & str ,
13
13
) -> 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 ( ) ?;
15
20
let mut features = String :: new ( ) ;
16
21
let mut fixes = String :: new ( ) ;
17
22
let mut internal = String :: new ( ) ;
18
23
let mut others = String :: new ( ) ;
19
24
for line in git_log. lines ( ) {
20
25
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 ( ) ;
64
61
}
65
62
}
66
63
@@ -73,11 +70,6 @@ pub(crate) fn get_changelog(
73
70
Commit: commit:{}[] +
74
71
Release: release:{}[]
75
72
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
-
81
73
== New Features
82
74
83
75
{}
@@ -117,6 +109,24 @@ fn unescape(s: &str) -> String {
117
109
s. replace ( r#"\""# , "" ) . replace ( r#"\n"# , "\n " ) . replace ( r#"\r"# , "" )
118
110
}
119
111
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
+
120
130
fn parse_changelog_line ( s : & str ) -> Option < PrInfo > {
121
131
let parts = s. splitn ( 3 , ' ' ) . collect :: < Vec < _ > > ( ) ;
122
132
if parts. len ( ) < 2 || parts[ 0 ] != "changelog" {
0 commit comments