blob: 1cccb6cdd9a299bf2a5787803f4b9af3b18f3b09 [file] [log] [blame]
// Copyright 2024 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
class RevertInfoCollection {
RevertInfoCollection();
// tags that appear in the revert issue body.
// Fields in the revert information in the body appears as
// <!-- start_tag -->
// key: value
// <!-- end_tag -->
final String startOriginalPrLinkTag = '<!-- start_original_pr_link -->';
final String endOriginalPrLinkTag = '<!-- end_original_pr_link -->';
final String startInitiatingAuthorTag = '<!-- start_initiating_author -->';
final String endInitiatingAuthorTag = '<!-- end_initiating_author -->';
final String startRevertReasonTag = '<!-- start_revert_reason -->';
final String endRevertReasonTag = '<!-- end_revert_reason -->';
final String startOriginalPrAuthorTag = '<!-- start_original_pr_author -->';
final String endOriginalPrAuthorTag = '<!-- end_original_pr_author -->';
final String startReviewersTag = '<!-- start_reviewers -->';
final String endReviewersTag = '<!-- end_reviewers -->';
final String startRevertBodyTag = '<!-- start_revert_body -->';
final String endRevertBodyTag = '<!-- end_revert_body -->';
String? extractOriginalPrLink(String text) {
return _extract(startOriginalPrLinkTag, endOriginalPrLinkTag, text);
}
String? extractInitiatingAuthor(String text) {
return _extract(startInitiatingAuthorTag, endInitiatingAuthorTag, text);
}
String? extractRevertReason(String text) {
return _extract(startRevertReasonTag, endRevertReasonTag, text);
}
String? extractOriginalPrAuthor(String text) {
return _extract(startOriginalPrAuthorTag, endOriginalPrAuthorTag, text);
}
String? extractReviewers(String text) {
return _extract(startReviewersTag, endReviewersTag, text);
}
String? extractRevertBody(String text) {
return _extract(startRevertBodyTag, endRevertBodyTag, text);
}
String? extractWithTags(String text, String startTag, String endTag) {
return _extract(startTag, endTag, text);
}
String? _extract(String startTag, String endTag, String text) {
String? match;
var pattern = '$startTag([\\S\\s]*)$endTag';
pattern = pattern.replaceAll('<', '\\<');
pattern = pattern.replaceAll('>', '\\>');
pattern = pattern.replaceAll('-', '\\-');
pattern = pattern.replaceAll('!', '\\!');
final regExp = RegExp(pattern, multiLine: true);
if (regExp.hasMatch(text)) {
final matches = regExp.allMatches(text);
final Match m = matches.first;
match = m.group(1);
}
final foundMatch = match!.trim();
// Explicit assignment for debugging.
// Each entry we are interested in is of the form 'key: value' where value
// is a block of text that contain links. We want to preserve the link so we
// take text after the first colon ':' to avoid destroying information with
// a split.
final matchedText = foundMatch
.substring(foundMatch.indexOf(':') + 1)
.trim();
return matchedText;
}
}