q247-models-core
Version:
Models for effort/calories in q247 plugin
83 lines (81 loc) • 2.76 kB
JavaScript
/**
* Will calculate diff information (resulting code, and original code)
* for each file from a provided git diff (unified diff format)
* @param diffText
* @returns
*/
const parseGitDiff = (diffText) => {
const files = {};
const lines = diffText.split('\n');
let currentFile = null;
let original = [];
let resulting = [];
let changed = [];
let inHunk = false;
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
// New file diff
if (line.startsWith('diff --git')) {
inHunk = false;
original = [];
resulting = [];
changed = [];
const match = line.match(/^diff --git a\/(.+?) b\/(.+)$/);
if (match) {
currentFile = match[1]; // original file path
files[currentFile] = { original: '', resulting: '', changed: [] };
}
continue;
}
// Hunk header
if (line.startsWith('@@')) {
inHunk = true;
continue;
}
if (!inHunk || !currentFile)
continue;
// Actual diff content
if (line.startsWith('-')) {
const content = line.slice(1);
original.push(content);
changed.push({ type: 'removed', line: content });
}
else if (line.startsWith('+')) {
const content = line.slice(1);
resulting.push(content);
changed.push({ type: 'added', line: content });
}
else if (line.startsWith(' ')) {
const content = line.slice(1);
original.push(content);
resulting.push(content);
}
}
// Save file output
if (currentFile) {
files[currentFile].original = original.join('\n');
files[currentFile].resulting = resulting.join('\n');
files[currentFile].changed = changed;
}
return files;
};
/**
* This is a FMW factor function that applies following modification to the score:
* - Is linear when score < upper
* - Smoothly flattens and asymptotically approaches border for score ≥ upper
*
* f(x)=border−(border−upper)⋅e^(−(x−upper/L)
* @param score original score <0, inf)
* @param upper up to upper we do not modify the score, after upper we asymptotically reach border
* @param border asymptotic border for scores that are greater than upper
* @param L the bigger the L the slower approach towards border
* @returns modified score <0, border)
*/
const fmwFactor = (score, upper = 377, border = 610, L = 100) => {
if (score < upper) {
return score;
}
const factor = border - (border - upper) / (1 + (score - upper) / L);
return factor;
};
export { fmwFactor, parseGitDiff };