@donativo/roux 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +1 -0
- package/dist/app.js +5 -1
- package/dist/app.js.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/git.d.ts +1 -0
- package/dist/git.js +3 -1
- package/dist/git.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/parsers/git.js +10 -3
- package/dist/parsers/git.js.map +1 -1
- package/dist/parsers/git2.js +7 -1
- package/dist/parsers/git2.js.map +1 -1
- package/dist/parsers/rename.d.ts +15 -0
- package/dist/parsers/rename.js +39 -0
- package/dist/parsers/rename.js.map +1 -0
- package/dist/parsers/types.d.ts +1 -0
- package/dist/transforms/rename-tracker.d.ts +11 -0
- package/dist/transforms/rename-tracker.js +44 -0
- package/dist/transforms/rename-tracker.js.map +1 -0
- package/package.json +3 -3
package/dist/app.d.ts
CHANGED
package/dist/app.js
CHANGED
|
@@ -8,12 +8,13 @@ import { generateGitLog } from "./git";
|
|
|
8
8
|
import { parseGroupConfig, applyGrouping } from "./transforms/grouper";
|
|
9
9
|
import { parseTeamConfig, applyTeamMapping } from "./transforms/team-mapper";
|
|
10
10
|
import { applyTemporalGrouping } from "./transforms/temporal-grouper";
|
|
11
|
+
import { applyRenameTracking } from "./transforms/rename-tracker";
|
|
11
12
|
function getLogText(opts) {
|
|
12
13
|
if (opts.input)
|
|
13
14
|
return opts.input;
|
|
14
15
|
if (opts.log)
|
|
15
16
|
return readFileSync(opts.log, "utf-8");
|
|
16
|
-
return generateGitLog({ repo: opts.repo, after: opts.after, before: opts.before, rev: opts.rev });
|
|
17
|
+
return generateGitLog({ repo: opts.repo, after: opts.after, before: opts.before, rev: opts.rev, followRenames: opts.followRenames });
|
|
17
18
|
}
|
|
18
19
|
export function run(opts) {
|
|
19
20
|
const analysisFn = analyses[opts.analysis];
|
|
@@ -31,6 +32,9 @@ export function run(opts) {
|
|
|
31
32
|
throw new Error(`Unknown log format "${format}". Available: ${Object.keys(parsers).join(", ")}`);
|
|
32
33
|
}
|
|
33
34
|
let modifications = parser(text);
|
|
35
|
+
if (opts.followRenames !== false) {
|
|
36
|
+
modifications = applyRenameTracking(modifications);
|
|
37
|
+
}
|
|
34
38
|
if (options.groupFile) {
|
|
35
39
|
const specs = parseGroupConfig(options.groupFile);
|
|
36
40
|
modifications = applyGrouping(modifications, specs);
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -26,7 +26,8 @@ function addSharedOptions(cmd) {
|
|
|
26
26
|
.option("-c, --format <format>", "Input log format: git2 or git", "git2")
|
|
27
27
|
.option("--after <date>", "Only commits after date (YYYY-MM-DD)")
|
|
28
28
|
.option("--before <date>", "Only commits before date (YYYY-MM-DD)")
|
|
29
|
-
.option("--rev <range>", "Git revision range (e.g. v1.0..v2.0)")
|
|
29
|
+
.option("--rev <range>", "Git revision range (e.g. v1.0..v2.0)")
|
|
30
|
+
.option("--no-follow-renames", "Disable rename tracking (treat renames as delete + add)");
|
|
30
31
|
}
|
|
31
32
|
// Check if stdin has data (pipe mode)
|
|
32
33
|
async function readStdin() {
|
|
@@ -66,6 +67,7 @@ for (const name of Object.keys(analyses)) {
|
|
|
66
67
|
after: opts.after,
|
|
67
68
|
before: opts.before,
|
|
68
69
|
rev: opts.rev,
|
|
70
|
+
followRenames: opts.followRenames,
|
|
69
71
|
});
|
|
70
72
|
process.stdout.write(output);
|
|
71
73
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,MAAM,CAAC;KACZ,WAAW,CAAC,uCAAuC,CAAC;KACpD,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,8CAA8C;AAC9C,SAAS,gBAAgB,CAAC,GAAY;IACpC,OAAO,GAAG;SACP,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC;SAC/E,MAAM,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SACrD,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,QAAQ,CAAC;SACjE,MAAM,CAAC,2BAA2B,EAAE,sBAAsB,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,QAAQ,CAAC;SAC5D,MAAM,CAAC,wBAAwB,EAAE,gBAAgB,EAAE,QAAQ,CAAC;SAC5D,MAAM,CAAC,8BAA8B,EAAE,oBAAoB,EAAE,QAAQ,CAAC;SACtE,MAAM,CAAC,8BAA8B,EAAE,4BAA4B,EAAE,KAAK,CAAC;SAC3E,MAAM,CAAC,oBAAoB,EAAE,wCAAwC,CAAC;SACtE,MAAM,CAAC,uBAAuB,EAAE,8BAA8B,CAAC;SAC/D,MAAM,CAAC,8BAA8B,EAAE,yBAAyB,EAAE,QAAQ,CAAC;SAC3E,MAAM,CAAC,2BAA2B,EAAE,8CAA8C,CAAC;SACnF,MAAM,CAAC,mCAAmC,EAAE,4BAA4B,CAAC;SACzE,MAAM,CAAC,uBAAuB,EAAE,+BAA+B,EAAE,MAAM,CAAC;SACxE,MAAM,CAAC,gBAAgB,EAAE,sCAAsC,CAAC;SAChE,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;SAClE,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/git.d.ts
CHANGED
package/dist/git.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { execSync } from "child_process";
|
|
2
2
|
export function generateGitLog(opts = {}) {
|
|
3
3
|
const cwd = opts.repo ?? process.cwd();
|
|
4
|
+
const followRenames = opts.followRenames !== false;
|
|
4
5
|
const args = [
|
|
5
6
|
"--all", "--numstat", "--date=short",
|
|
6
|
-
"--pretty=format:'--%h--%ad--%aN--%s'",
|
|
7
|
+
"--pretty=format:'--%h--%ad--%aN--%s'",
|
|
8
|
+
followRenames ? "-M" : "--no-renames",
|
|
7
9
|
];
|
|
8
10
|
if (opts.after)
|
|
9
11
|
args.push(`--after=${opts.after}`);
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAUzC,MAAM,UAAU,cAAc,CAAC,OAAsB,EAAE;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,KAAK,KAAK,CAAC;IACnD,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,WAAW,EAAE,cAAc;QACpC,sCAAsC;QACtC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc;KACtC,CAAC;IACF,IAAI,IAAI,CAAC,KAAK;QAAG,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpD,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;QAC3C,GAAG;QACH,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;KAC7B,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,3 +6,5 @@ export type { GitLogOptions } from "./git";
|
|
|
6
6
|
export { analyses } from "./analysis";
|
|
7
7
|
export type { Modification } from "./parsers/types";
|
|
8
8
|
export type { AnalysisFn, AnalysisOptions } from "./analysis/types";
|
|
9
|
+
export { applyRenameTracking, buildRenameMap } from "./transforms/rename-tracker";
|
|
10
|
+
export { parseRenamePath } from "./parsers/rename";
|
package/dist/index.js
CHANGED
|
@@ -3,4 +3,6 @@ export { run as analyze } from "./app";
|
|
|
3
3
|
export { parseGit2Log as parseGitLog } from "./parsers/git2";
|
|
4
4
|
export { generateGitLog } from "./git";
|
|
5
5
|
export { analyses } from "./analysis";
|
|
6
|
+
export { applyRenameTracking, buildRenameMap } from "./transforms/rename-tracker";
|
|
7
|
+
export { parseRenamePath } from "./parsers/rename";
|
|
6
8
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/parsers/git.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseRenamePath } from "./rename";
|
|
1
2
|
// [hash] author YYYY-MM-DD message
|
|
2
3
|
// The date is the FIRST occurrence of YYYY-MM-DD pattern after the "]"
|
|
3
4
|
const HEADER_RE = /^\[([a-f0-9]+)\]\s+(.+?)\s+(\d{4}-\d{2}-\d{2})\s+(.*)$/;
|
|
@@ -25,15 +26,21 @@ export function parseGitLog(text) {
|
|
|
25
26
|
if (numstatMatch && currentRev) {
|
|
26
27
|
const added = numstatMatch[1];
|
|
27
28
|
const deleted = numstatMatch[2];
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
const rawPath = numstatMatch[3];
|
|
30
|
+
const rename = parseRenamePath(rawPath);
|
|
31
|
+
const mod = {
|
|
32
|
+
entity: rename ? rename.newPath : rawPath,
|
|
30
33
|
author: currentAuthor,
|
|
31
34
|
rev: currentRev,
|
|
32
35
|
date: currentDate,
|
|
33
36
|
locAdded: added === "-" ? -1 : parseInt(added, 10),
|
|
34
37
|
locDeleted: deleted === "-" ? -1 : parseInt(deleted, 10),
|
|
35
38
|
message: currentMessage,
|
|
36
|
-
}
|
|
39
|
+
};
|
|
40
|
+
if (rename) {
|
|
41
|
+
mod.renamedFrom = rename.oldPath;
|
|
42
|
+
}
|
|
43
|
+
result.push(mod);
|
|
37
44
|
}
|
|
38
45
|
}
|
|
39
46
|
return result;
|
package/dist/parsers/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/parsers/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/parsers/git.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,mCAAmC;AACnC,uEAAuE;AACvE,MAAM,SAAS,GAAG,wDAAwD,CAAC;AAC3E,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC5B,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC/B,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,cAAc,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,YAAY,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,GAAG,GAAiB;gBACxB,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBACzC,MAAM,EAAE,aAAa;gBACrB,GAAG,EAAE,UAAU;gBACf,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;gBAClD,UAAU,EAAE,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxD,OAAO,EAAE,cAAc;aACxB,CAAC;YACF,IAAI,MAAM,EAAE,CAAC;gBACX,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;YACnC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/parsers/git2.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseRenamePath } from "./rename";
|
|
1
2
|
const DELIM = "--";
|
|
2
3
|
const NUMSTAT_RE = /^(\d+|-)\t(\d+|-)\t(.+)$/;
|
|
3
4
|
function parseHeader(line) {
|
|
@@ -53,8 +54,10 @@ export function parseGit2Log(text) {
|
|
|
53
54
|
if (numstatMatch && currentRev) {
|
|
54
55
|
const added = numstatMatch[1];
|
|
55
56
|
const deleted = numstatMatch[2];
|
|
57
|
+
const rawPath = numstatMatch[3];
|
|
58
|
+
const rename = parseRenamePath(rawPath);
|
|
56
59
|
const mod = {
|
|
57
|
-
entity:
|
|
60
|
+
entity: rename ? rename.newPath : rawPath,
|
|
58
61
|
author: currentAuthor,
|
|
59
62
|
rev: currentRev,
|
|
60
63
|
date: currentDate,
|
|
@@ -64,6 +67,9 @@ export function parseGit2Log(text) {
|
|
|
64
67
|
if (currentMessage !== undefined) {
|
|
65
68
|
mod.message = currentMessage;
|
|
66
69
|
}
|
|
70
|
+
if (rename) {
|
|
71
|
+
mod.renamedFrom = rename.oldPath;
|
|
72
|
+
}
|
|
67
73
|
result.push(mod);
|
|
68
74
|
}
|
|
69
75
|
}
|
package/dist/parsers/git2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git2.js","sourceRoot":"","sources":["../../src/parsers/git2.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git2.js","sourceRoot":"","sources":["../../src/parsers/git2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse git numstat rename path formats into old/new path pairs.
|
|
3
|
+
*
|
|
4
|
+
* Supported formats:
|
|
5
|
+
* prefix/{old => new}/suffix — renamed within a directory
|
|
6
|
+
* {old => new}/suffix — no prefix
|
|
7
|
+
* prefix/{old => new} — no suffix
|
|
8
|
+
* prefix/{ => new}/suffix — moved into subdirectory
|
|
9
|
+
* prefix/{old => }/suffix — moved out of subdirectory
|
|
10
|
+
* old => new — full path rename
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseRenamePath(filepath: string): {
|
|
13
|
+
oldPath: string;
|
|
14
|
+
newPath: string;
|
|
15
|
+
} | null;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse git numstat rename path formats into old/new path pairs.
|
|
3
|
+
*
|
|
4
|
+
* Supported formats:
|
|
5
|
+
* prefix/{old => new}/suffix — renamed within a directory
|
|
6
|
+
* {old => new}/suffix — no prefix
|
|
7
|
+
* prefix/{old => new} — no suffix
|
|
8
|
+
* prefix/{ => new}/suffix — moved into subdirectory
|
|
9
|
+
* prefix/{old => }/suffix — moved out of subdirectory
|
|
10
|
+
* old => new — full path rename
|
|
11
|
+
*/
|
|
12
|
+
const BRACE_RE = /^(.*?)\{(.*?) => (.*?)\}(.*)$/;
|
|
13
|
+
const ARROW_RE = /^(.+) => (.+)$/;
|
|
14
|
+
function normalizePath(p) {
|
|
15
|
+
// Collapse consecutive slashes and strip leading/trailing slashes
|
|
16
|
+
return p.replace(/\/+/g, "/").replace(/^\/|\/$/g, "");
|
|
17
|
+
}
|
|
18
|
+
export function parseRenamePath(filepath) {
|
|
19
|
+
const braceMatch = filepath.match(BRACE_RE);
|
|
20
|
+
if (braceMatch) {
|
|
21
|
+
const prefix = braceMatch[1];
|
|
22
|
+
const oldPart = braceMatch[2];
|
|
23
|
+
const newPart = braceMatch[3];
|
|
24
|
+
const suffix = braceMatch[4];
|
|
25
|
+
return {
|
|
26
|
+
oldPath: normalizePath(prefix + oldPart + suffix),
|
|
27
|
+
newPath: normalizePath(prefix + newPart + suffix),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
const arrowMatch = filepath.match(ARROW_RE);
|
|
31
|
+
if (arrowMatch) {
|
|
32
|
+
return {
|
|
33
|
+
oldPath: normalizePath(arrowMatch[1]),
|
|
34
|
+
newPath: normalizePath(arrowMatch[2]),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/parsers/rename.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,QAAQ,GAAG,+BAA+B,CAAC;AACjD,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AAElC,SAAS,aAAa,CAAC,CAAS;IAC9B,kEAAkE;IAClE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;YACjD,OAAO,EAAE,aAAa,CAAC,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,UAAU,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SACtC,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/parsers/types.d.ts
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Modification } from "../parsers/types";
|
|
2
|
+
/**
|
|
3
|
+
* Build a map from old paths to their final (most recent) path,
|
|
4
|
+
* resolving chains like A→B→C so that A and B both map to C.
|
|
5
|
+
*/
|
|
6
|
+
export declare function buildRenameMap(data: Modification[]): Map<string, string>;
|
|
7
|
+
/**
|
|
8
|
+
* Rewrite all Modification entities so that renamed files use their
|
|
9
|
+
* most recent path. Returns the original array reference if no renames exist.
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyRenameTracking(data: Modification[]): Modification[];
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a map from old paths to their final (most recent) path,
|
|
3
|
+
* resolving chains like A→B→C so that A and B both map to C.
|
|
4
|
+
*/
|
|
5
|
+
export function buildRenameMap(data) {
|
|
6
|
+
// Collect rename pairs in chronological order (oldest first)
|
|
7
|
+
const sorted = [...data]
|
|
8
|
+
.filter((m) => m.renamedFrom)
|
|
9
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
10
|
+
// Forward map: oldPath → immediate newPath
|
|
11
|
+
const forward = new Map();
|
|
12
|
+
for (const m of sorted) {
|
|
13
|
+
forward.set(m.renamedFrom, m.entity);
|
|
14
|
+
}
|
|
15
|
+
// Resolve chains: follow forward links to find the final path
|
|
16
|
+
const resolved = new Map();
|
|
17
|
+
for (const oldPath of forward.keys()) {
|
|
18
|
+
let current = oldPath;
|
|
19
|
+
const visited = new Set();
|
|
20
|
+
while (forward.has(current) && !visited.has(current)) {
|
|
21
|
+
visited.add(current);
|
|
22
|
+
current = forward.get(current);
|
|
23
|
+
}
|
|
24
|
+
resolved.set(oldPath, current);
|
|
25
|
+
}
|
|
26
|
+
return resolved;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Rewrite all Modification entities so that renamed files use their
|
|
30
|
+
* most recent path. Returns the original array reference if no renames exist.
|
|
31
|
+
*/
|
|
32
|
+
export function applyRenameTracking(data) {
|
|
33
|
+
const renameMap = buildRenameMap(data);
|
|
34
|
+
if (renameMap.size === 0)
|
|
35
|
+
return data;
|
|
36
|
+
return data.map((m) => {
|
|
37
|
+
const finalPath = renameMap.get(m.entity);
|
|
38
|
+
if (finalPath && finalPath !== m.entity) {
|
|
39
|
+
return { ...m, entity: finalPath };
|
|
40
|
+
}
|
|
41
|
+
return m;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=rename-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-tracker.js","sourceRoot":"","sources":["../../src/transforms/rename-tracker.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,6DAA6D;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;SAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,2CAA2C;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QAClC,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACtD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACpB,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,SAAS,IAAI,SAAS,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YACxC,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@donativo/roux",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Mine and analyze git history — find hotspots, coupling, ownership patterns, and team dynamics",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"roux": "
|
|
7
|
+
"roux": "dist/cli.js"
|
|
8
8
|
},
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"types": "dist/index.d.ts",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"license": "MIT",
|
|
37
37
|
"repository": {
|
|
38
38
|
"type": "git",
|
|
39
|
-
"url": "https://github.com/chefmarvin/roux.git"
|
|
39
|
+
"url": "git+https://github.com/chefmarvin/roux.git"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
42
|
"commander": "^14"
|