@yuki-no/plugin-batch-pr
Version:
Batch PR plugin for yuki-no - Collects opened Yuki-no translation issues and creates a single pull request
76 lines (75 loc) • 3.15 kB
JavaScript
import { FILE_STATUS_REGEX } from '../constants';
import { splitByNewline } from '@yuki-no/plugin-sdk/utils/input';
import { formatError, log } from '@yuki-no/plugin-sdk/utils/log';
export const parseFileStatuses = (statusString, fileNameFilter) => {
const statusLines = splitByNewline(statusString);
log('I', `parseFileStatuses :: Processing ${statusLines.length} status lines`);
const statuses = [];
let excludedCount = 0;
for (const statusLine of statusLines) {
const fileStatus = parseFileStatus(statusLine);
let shouldInclude = fileNameFilter(fileStatus.headFileName);
if (fileStatus.status === 'R' || fileStatus.status === 'C') {
shouldInclude = fileNameFilter(fileStatus.nextHeadFileName);
}
if (shouldInclude) {
statuses.push(fileStatus);
}
else {
excludedCount++;
}
}
log('I', `parseFileStatuses :: Filtered ${statuses.length} files (${excludedCount} excluded)`);
log('S', `parseFileStatuses :: Successfully parsed ${statuses.length} file statuses`);
return statuses;
};
const parseFileStatus = (statusLine) => {
try {
const renamedMatch = statusLine.match(FILE_STATUS_REGEX.RENAMED);
if (renamedMatch) {
const [, similarityStr, headFileName, nextHeadFileName] = renamedMatch;
log('I', `parseFileStatus :: Parsed RENAMED: ${headFileName} -> ${nextHeadFileName}`);
return {
status: 'R',
headFileName,
nextHeadFileName,
similarity: parseInt(similarityStr, 10),
};
}
const copiedMatch = statusLine.match(FILE_STATUS_REGEX.COPIED);
if (copiedMatch) {
const [, similarityStr, headFileName, nextHeadFileName] = copiedMatch;
log('I', `parseFileStatus :: Parsed COPIED: ${headFileName} -> ${nextHeadFileName}`);
return {
status: 'C',
headFileName,
nextHeadFileName,
similarity: parseInt(similarityStr, 10),
};
}
const typeChangedMatch = statusLine.match(FILE_STATUS_REGEX.TYPE_CHANGED);
if (typeChangedMatch) {
const [, headFileName] = typeChangedMatch;
log('I', `parseFileStatus :: Parsed TYPE_CHANGED: ${headFileName}`);
return {
status: 'T',
headFileName,
};
}
const regularMatch = statusLine.match(FILE_STATUS_REGEX.MODIFIED_ADDED_DELETED);
if (regularMatch) {
const [, status, headFileName] = regularMatch;
log('I', `parseFileStatus :: Parsed ${status}: ${headFileName}`);
return {
status: status,
headFileName,
};
}
log('E', `parseFileStatus :: Unable to parse status line: ${statusLine}`);
throw new Error(`Unable to parse status line: ${statusLine}`);
}
catch (error) {
log('E', `parseFileStatus :: Error parsing line "${statusLine}": ${formatError(error)}`);
throw error;
}
};