Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 20 additions & 20 deletions lib/src/commit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ class Commit {
final commits = <String, Commit>{};

while (!scanner.isDone) {
if (scanner.scan(RegExp(r'\r?\n'))) {
continue;
}
final tuple = _parse(scanner, true);
commits[tuple.sha!] = tuple.commit;
}
Expand All @@ -57,37 +60,34 @@ class Commit {
final headers = <String, List<String>>{};

final startSpot = scanner.position;
var lastLine = scanner.readNextLine();

while (lastLine != null && lastLine.isNotEmpty) {
final allHeaderMatches = headerRegExp.allMatches(lastLine);
if (allHeaderMatches.isNotEmpty) {
final match = allHeaderMatches.single;
assert(match.groupCount == 2);
final header = match.group(1)!;
final value = match.group(2)!;

headers.putIfAbsent(header, () => <String>[]).add(value);
}
while (scanner.scan(headerRegExp)) {
final match = scanner.lastMatch!;
final header = match.group(1)!;
final value = match.group(2)!;

lastLine = scanner.readNextLine()!;
headers.putIfAbsent(header, () => <String>[]).add(value);
}

assert(lastLine!.isEmpty);
// consume the blank line but it might not exist if the commit has no body
// at all, or might be empty.
scanner.scan(RegExp(r'\r?\n'));

String message;
var message = '';

if (isRevParse) {
final msgLines = <String>[];
lastLine = scanner.readNextLine();

const revParseMessagePrefix = ' ';
while (lastLine != null && lastLine.startsWith(revParseMessagePrefix)) {
msgLines.add(lastLine.substring(revParseMessagePrefix.length));
lastLine = scanner.readNextLine();
while (scanner.scan(RegExp(r' ([^\r\n]*)(?:\r?\n|$)'))) {
msgLines.add(scanner.lastMatch!.group(1)!);
if (!scanner.lastMatch!.group(0)!.endsWith('\n')) {
break;
}
}

message = msgLines.join('\n');
if (msgLines.isNotEmpty) {
message = msgLines.join('\n');
}
} else {
message = scanner.rest;
scanner.position = scanner.string.length;
Expand Down
12 changes: 5 additions & 7 deletions lib/src/tag.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,17 @@ class Tag {

final scanner = StringScanner(content);

var lastLine = scanner.readNextLine()!;

while (lastLine.isNotEmpty) {
final match = headerRegExp.allMatches(lastLine).single;
assert(match.groupCount == 2);
while (scanner.scan(headerRegExp)) {
final match = scanner.lastMatch!;
final header = match.group(1)!;
final value = match.group(2)!;

headers.putIfAbsent(header, () => <String>[]).add(value);

lastLine = scanner.readNextLine()!;
}

// consume the blank line that separates headers from message
scanner.scan(RegExp(r'\r?\n'));

String objectSha;
String type;
String tag;
Expand Down
21 changes: 4 additions & 17 deletions lib/src/util.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import 'package:string_scanner/string_scanner.dart';

import 'bot.dart';
import 'top_level.dart';

const shaRegexPattern = '[a-f0-9]{40}';

final headerRegExp = RegExp(r'^([a-z]+) (.+)$');
final headerRegExp = RegExp(
r'^([a-z]+) ((?:[^\r\n]|\r?\n[ \t])+)\r?\n',
multiLine: true,
);

void requireArgumentValidSha1(String value, String argName) {
metaRequireArgumentNotNullOrEmpty(argName);
Expand All @@ -16,17 +17,3 @@ void requireArgumentValidSha1(String value, String argName) {
throw ArgumentError.value(value, argName, message);
}
}

extension StringScannerX on StringScanner {
String? readNextLine() {
if (isDone) return null;
if (scan(_lineRegexp)) {
return lastMatch![1];
}
final restStr = rest;
position = string.length;
return restStr;
}
}

final _lineRegexp = RegExp(r'([^\r\n]*)\r?\n');