Browse Source

Fixes #1131 - "Search Commits" allows free term at search end

main
Git-Lior 3 years ago
committed by Eric Amodio
parent
commit
126ebf0b4f
1 changed files with 42 additions and 51 deletions
  1. +42
    -51
      src/git/search.ts

+ 42
- 51
src/git/search.ts View File

@ -39,10 +39,9 @@ export interface SearchPattern {
export namespace SearchPattern {
const emptyStr = '';
const searchMessageOperationRegex = /(?=(.*?)\s?(?:(?:=:|message:|@:|author:|#:|commit:|\?:|file:|~:|change:)|$))/;
const searchMessageValuesRegex = /(".+"|[^\b\s]+)/g;
const searchOperationRegex =
/((?:=|message|@|author|#|commit|\?|file|~|change):)\s?(?=(.*?)\s?(?:(?:=:|message:|@:|author:|#:|commit:|\?:|file:|~:|change:)|$))/g;
/((?:=|message|@|author|#|commit|\?|file|~|change):)\s?(.*?)(?=\s?(?:(?:=:|message:|@:|author:|#:|commit:|\?:|file:|~:|change:)|$))/g;
export function fromCommit(ref: string): string;
export function fromCommit(commit: GitRevisionReference): string;
@ -61,79 +60,71 @@ export namespace SearchPattern {
let op;
let value;
let freeTextTerm;
let match = searchMessageOperationRegex.exec(search);
if (match != null && match[1] !== '') {
[, value] = match;
let match = searchOperationRegex.exec(search);
if (GitRevision.isSha(value)) {
let values = operations.get('commit:');
if (values === undefined) {
values = [value];
operations.set('commit:', values);
} else {
values.push(value);
}
} else {
parseSearchMessageOperations(value, operations);
}
if (match == null || match.index > 0) {
freeTextTerm = search.substring(0, match?.index).trimEnd();
}
do {
match = searchOperationRegex.exec(search);
if (match == null) break;
while (match != null) {
[, op, value] = match;
if (op !== undefined) {
op = normalizeSearchOperatorsMap.get(op as SearchOperators)!;
let firstMessageMatch;
if (op === 'message:') {
parseSearchMessageOperations(value, operations);
} else if (
!freeTextTerm &&
match.index + match[0].length === search.length &&
(firstMessageMatch = new RegExp(searchMessageValuesRegex).exec(value)) != null
) {
const [, firstMessage] = firstMessageMatch;
addSearchOperationValue(op, firstMessage, operations);
freeTextTerm = value.substring(firstMessage.length).trimStart();
} else {
let values = operations.get(op);
if (values === undefined) {
values = [value];
operations.set(op, values);
} else {
values.push(value);
}
addSearchOperationValue(op, value, operations);
}
}
} while (true);
match = searchOperationRegex.exec(search);
}
if (freeTextTerm) {
if (GitRevision.isSha(freeTextTerm)) {
addSearchOperationValue('commit:', freeTextTerm, operations);
} else {
parseSearchMessageOperations(freeTextTerm, operations);
}
}
return operations;
}
function parseSearchMessageOperations(message: string, operations: Map<string, string[]>) {
let values = operations.get('message:');
function addSearchOperationValue(op: SearchOperators, value: string, operations: Map<string, string[]>) {
let values = operations.get(op);
if (values === undefined) {
values = [value];
operations.set(op, values);
} else {
values.push(value);
}
}
function parseSearchMessageOperations(message: string, operations: Map<string, string[]>) {
if (message === emptyStr) {
if (values === undefined) {
values = [''];
operations.set('message:', values);
} else {
values.push('');
}
addSearchOperationValue('message:', emptyStr, operations);
return;
}
let match;
let value;
do {
match = searchMessageValuesRegex.exec(message);
if (match == null) break;
[, value] = match;
if (values === undefined) {
values = [value];
operations.set('message:', values);
} else {
values.push(value);
}
} while (true);
while ((match = searchMessageValuesRegex.exec(message)) != null) {
const [, value] = match;
addSearchOperationValue('message:', value, operations);
}
}
export function toKey(search: SearchPattern) {

Loading…
Cancel
Save