anchor.diff:  
       bool isDevBuild(String tagName) => tagName.contains('dev');
       bool isCherryPickRelease(String tagName) => tagName.contains('+');
  -    String nameOf(tag) => tag['name'];
  +    String nameOf(tag) => tag[_nameKey];
   
       Map<String, dynamic>? closestTag;
       if (sinceTag != null) {
  
positive.code:       );
    }
  
    // You can authorize your access if you run into a github rate limit.
    // Don't check in your passwords or auth tokens.
    static const auth = '';
  
negative.code:       }).first;
      }
  
      final commitInfo = closestTag[_commitKey] as Map<String, dynamic>;
      print(
        'Getting the date of the tagged commit for ${closestTag[_nameKey]}...',
      );
      final taggedCommit = jsonDecode((await http.get(Uri.https(
        '${auth}api.github.com',
        '/repos/flutter/devtools/commits/${commitInfo[_shaKey]}',
      )))
          .body);
  
      final commitDate = taggedCommit[_commitKey][_authorKey][_dateKey];
      print(
        'Adding entries to the changelog for all commits since $commitDate...',
      );
  
      final changes = <String>[];
  
      // TODO(kenz): consider traversing pages properly instead of using a while
      // loop.
      // See https://docs.github.com/en/rest/guides/traversing-with-pagination
      const maxPerPage = 100;
      var requestPage = 0;
      bool lastPageReceived = false;
      while (!lastPageReceived) {
        final uri = Uri.https(
          '${auth}api.github.com',
          '/repos/flutter/devtools/commits',
          {
            'since': commitDate,
            'per_page': '$maxPerPage',
            'page': '$requestPage',
          },
        );
        final githubResponse = await http.get(uri);
        final commits = jsonDecode(githubResponse.body);
        for (final commit in commits) {
          if (commit[_shaKey] == taggedCommit[_shaKey]) {
            print(
              'Skipping commit ${commit[_shaKey]} because this is the commit of '
              'the previous tag',
            );
            continue;
          }
          final message = commit[_commitKey][_messageKey];
          if (_shouldSkip(commit[_commitKey][_messageKey])) {
            print('Skipping commit marked to be ignored: $message');
            continue;
          }
          final entry = '* ' + _sanitize(commit[_commitKey][_messageKey]);
          changes.add(entry);
        }
  
        requestPage++;
        if (commits.length < maxPerPage) {
          lastPageReceived = true;
        }
      }
  
      if (nextVersion != null) {
  