@@ -214,18 +214,42 @@ def add_to_changelog_file(crate: str, content: str, version: str) -> None:
214214 file .write (content )
215215
216216
217+ def calc_commit_range (new_version : str ) -> str :
218+ parts = new_version .split ("." )
219+ assert len (parts ) == 3 , "Expected version to be on the format X.Y.Z"
220+ major = int (parts [0 ])
221+ minor = int (parts [1 ])
222+ patch = int (parts [2 ])
223+
224+ if 0 < patch :
225+ # A patch release.
226+ # Include changes since last patch release.
227+ # This assumes we've cherry-picked stuff for this release.
228+ diff_since_version = f"0.{ minor } .{ patch - 1 } "
229+ elif 0 < minor :
230+ # A minor release
231+ # The diff should span everything since the last minor release.
232+ # The script later excludes duplicated automatically, so we don't include stuff that
233+ # was part of intervening patch releases.
234+ diff_since_version = f"{ major } .{ minor - 1 } .0"
235+ else :
236+ # A major release
237+ # The diff should span everything since the last major release.
238+ # The script later excludes duplicated automatically, so we don't include stuff that
239+ # was part of intervening minor/patch releases.
240+ diff_since_version = f"{ major - 1 } .{ minor } .0"
241+
242+ return f"{ diff_since_version } ..HEAD"
243+
244+
217245def main () -> None :
218246 parser = argparse .ArgumentParser (description = "Generate a changelog." )
219- parser .add_argument ("--commit-range " , help = "e.g. 0.24.0..HEAD " , required = True )
247+ parser .add_argument ("--version " , help = "What release is this? " , required = True )
220248 parser .add_argument (
221249 "--write" , help = "Write into the different changelogs?" , action = "store_true"
222250 )
223- parser .add_argument ("--version" , help = "What release is this?" )
224251 args = parser .parse_args ()
225-
226- if args .write and not args .version :
227- print ("ERROR: --version is required when --write is used" )
228- sys .exit (1 )
252+ commit_range = calc_commit_range (args .version )
229253
230254 crate_names = [
231255 "ecolor" ,
@@ -251,7 +275,7 @@ def main() -> None:
251275 all_changelogs += file .read ()
252276
253277 repo = Repo ("." )
254- commits = list (repo .iter_commits (args . commit_range ))
278+ commits = list (repo .iter_commits (commit_range ))
255279 commits .reverse () # Most recent last
256280 commit_infos = list (map (get_commit_info , commits ))
257281
@@ -307,7 +331,7 @@ def main() -> None:
307331 unsorted_prs .append (pr_summary (pr_info ))
308332
309333 print ()
310- print (f"Full diff at https://github.com/emilk/egui/compare/{ args . commit_range } " )
334+ print (f"Full diff at https://github.com/emilk/egui/compare/{ commit_range } " )
311335 print ()
312336 for crate in crate_names :
313337 if crate in crate_sections :
0 commit comments