generateReleaseNotes method

void generateReleaseNotes(
  1. Version? newVersion,
  2. Version? currentVersion, {
  3. required bool autoAnswer,
  4. required bool dryrun,
})

Implementation

void generateReleaseNotes(Version? newVersion, Version? currentVersion,
    {required bool autoAnswer, required bool dryrun}) {
  // see https://blogs.sap.com/2018/06/22/generating-release-notes-from-git-commit-messages-using-basic-shell-commands-gitgrep/
  // for better ideas.

  if (!exists(changeLogPath)) {
    touch(changeLogPath, create: true);
  }

  /// we use a .md as then user can preview the mark down.
  final tmpReleaseNotes = join(pathToPackageRoot, 'release.notes.tmp.md');
  // ignore: cascade_invocations
  tmpReleaseNotes.write('# ${newVersion.toString()}');
  final git = Git(pathToPackageRoot);
  final usingGit = git.usingGit;

  /// add commit messages to release notes.
  if (usingGit) {
    final lastTag = git.getLatestTag();

    // just the messages from each commit
    final messages = git.getCommitMessages(lastTag);

    for (final message in messages) {
      tmpReleaseNotes.append('- $message');
    }
    tmpReleaseNotes.append('');
  }

  /// append the changelog to the new release notes
  read(changeLogPath).toList().forEach(tmpReleaseNotes.append);

  // give the user a chance to clean up the change log.
  if (!autoAnswer &&
      !dryrun &&
      confirm('Would you like to edit the $changeLogPath notes')) {
    showEditor(tmpReleaseNotes);
  }

  // write the edited commit messages to the change log.
  final backup = '$changeLogPath.bak';

  /// move the change log out of the way.
  move(changeLogPath, backup);

  /// replace the newly updated change log over the old one.
  move(tmpReleaseNotes, changeLogPath);

  delete(backup);
}