We keep track of bugfixes done to curl. All bugfixes ever done. A while
  back I also went back and populated the lists with details from all the
  releases to the pre-cursors of curl: httpget and urlget. All and every
  change made since November 1996.

  The bugfixes are all listed on the [1]curl changelog page. The bugfix
  counter can be found on [2]the release log page.

  The rate of bugfixes has been increasing over the years. I think in
  terms of actual bugs being squashed and fixes being merged, but also
  partly because we have gotten much better at keeping meticulous logs
  and do better release notes.

  A bugfix can be a single letter typo fix in a document, a spell-fix in
  a source code comment or it can fix a serious security vulnerability.
  From high to low, from important to a small subtle detail. The counter
  does not value, it is just a counter.

  When we shipped the recent curl version, 8.6.0, the counter said 9,888
  shipped bugfixes. The other day, when [3]8.7.0 and 8.7.1 shipped, the
  counter was upped to surpass 10,000 and now says: 10,051.

  These bugfixes happened thanks to 3,134 contributors, out of which
  1,252 persons have authored commits merged into the curl source
  repository.

  This journey started with httpget. The first ever release of httpget
  0.1 that was made public happened on November 11 1996. Today, that is
  exactly 10,000 days ago.

  We only have git commits stored from late 1999, but that counter is
  almost at 32,000 now. Making a little less than every third commit ever
  done a logged bugfix.

How I do the release notes

  This is highly scripted task.

  It starts with: every commit of the RELEASE-NOTES file in git that
  makes it up-to-date needs to use the single word “synced” as commit
  message. The commit that syncs it.

  Further, I have an alias in my ~/.gitconfig file that says:
[alias]
 latest = log @^{/RELEASE-NOTES:.synced}..

  This allows me to invoke git latest to get a list of the latest changes
  done in the repository since I most recently synced the RELEASE-NOTES.

Sync

  When that list starts to grow, typically roughly every four to ten days
  something, I invoke the release-notes.pl script we have in the curl git
  repository. This scripts gets all the changes since the most previous
  sync and inserts them into the RELEASE-NOTES file, complete with a
  correct reference to the associated GitHub issue or pull-request.

  The actual bullet point text it inserts comes from the first line of
  the corresponding commit message. The links comes from parsing commit
  messages and finding keywords and links according to how the project
  dictates how they should be used. This is one reason why it is
  important to do good commit messages following the correct style in the
  project. It makes the release notes job easier and the results better.

  The script does not know what’s a change, what’s a bugfix or what’s not
  even worthy of mentioning. It just adds all changes to top the list of
  changes (and includes a convenient separator so that it is easy to spot
  the newly added ones) and the next step for me is then to manually go
  over the list and delete the ones that aren’t intended to be mentioned
  there and move the few changes into the correct section of the release
  notes.

  I run release-notes.pl cleanup which then sorts the lists
  alphabetically and removes dangling references (which are leftovers
  from the lines I removed).

Contributors

  We keep track, try to say thanks to and give credit to every
  contributor that helps out in the project. No matter the size of the
  contribution. When someone has reported a bug. the reporter is credited
  in the commit message of the bugfix. We also give credit to co-authors
  and people assisting in solving the issues etc. To make sure we mention
  and give credit to the contributors and keep track of them beyond what
  git itself does.

  We can also add names manually to the release notes file, like if we
  had forgotten to mention them in a commit message. Then I run the
  contributors.sh script. It reads the list of names currently in the
  RELEASE-NOTES and then scans all the git changes since the previous
  sync and generates an updated list of all git authors, committers and
  everyone else who are credited, and it outputs an updated list (and
  contributor counter). That updated list is then pasted into
  RELEASE-NOTES.

  In recent years, in a normal eight week release cycle, we typically
  feature 60 to 80 named contributors in this file. Of course, top
  contributors in the project tend to get mentioned in just about every
  release notes file, as they just have to help out and contribute once
  every 56 days to appear there.

  On release days, we update the docs/THANKS file (using the
  contrithanks.sh script) where all contributors who ever helped out are
  mentioned and saved for the future. That list of people is also made
  visible on [4]the thanks page on the curl website.

Counters

  At the top of the release notes we have a few counters displayed. It
  looks similar to:
Public curl releases:         255
Command line options:         258
curl_easy_setopt() options:   304
Public functions in libcurl:  93
Contributors:                 3119

  After the list of contributors have been pasted into the current
  release notes, I invoke the delta script, which shows a lot of curl git
  repository statistics since the most previous release tag. That input
  includes the numbers shown in the release notes top, so if they are
  different now I update the release notes accordingly with the updated
  data. Most frequently, the contributor counter has been bumped.

Commit

    * included the lists of bugfixes and changes
    * updated contributors
    * updated the counters

  The RELEASE-NOTES file is then committed to git using “synced” as
  commit message. Until it is time to sync it again.

  Because of this work, we can offer [5]the pending release notes on the
  website, as it is the work in progress file with the changes we have
  already logged that is targeted to be included in the next release.

Release

  Of course, on release days I make sure to do a final update so that all
  the last changes get into the file before release as then the file ends
  up in the release tarball, that is locked, signed and stored the
  archives.

  After a release, I just manually erase the lists from the file and
  clear the list of names and commit. Then we start rebuilding it again
  with new stuff in the new release cycle.

References

  1. https://curl.se/changes.html
  2. https://curl.se/docs/releases.html
  3. https://daniel.haxx.se/blog/2024/03/27/curl-8-7-0/
  4. https://curl.se/docs/thanks.html
  5. https://curl.se/dev/release-notes.html