mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-12 21:03:05 -07:00
feat(telemetry): Add character counts to diff stats (#7619)
Co-authored-by: Shnatu <snatu@google.com> Co-authored-by: cornmander <shikhman@google.com>
This commit is contained in:
@@ -18,12 +18,16 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 0,
|
ai_added_lines: 0,
|
||||||
ai_removed_lines: 0,
|
ai_removed_lines: 0,
|
||||||
|
model_added_chars: 0,
|
||||||
|
model_removed_chars: 0,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should correctly report AI additions', () => {
|
it('should correctly report model additions', () => {
|
||||||
const oldStr = 'line1\nline2\n';
|
const oldStr = 'line1\nline2\n';
|
||||||
const aiStr = 'line1\nline2\nline3\n';
|
const aiStr = 'line1\nline2\nline3\n';
|
||||||
const userStr = 'line1\nline2\nline3\n';
|
const userStr = 'line1\nline2\nline3\n';
|
||||||
@@ -31,12 +35,16 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 0,
|
ai_removed_lines: 0,
|
||||||
|
model_added_chars: 5,
|
||||||
|
model_removed_chars: 0,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should correctly report AI removals', () => {
|
it('should correctly report model removals', () => {
|
||||||
const oldStr = 'line1\nline2\nline3\n';
|
const oldStr = 'line1\nline2\nline3\n';
|
||||||
const aiStr = 'line1\nline3\n';
|
const aiStr = 'line1\nline3\n';
|
||||||
const userStr = 'line1\nline3\n';
|
const userStr = 'line1\nline3\n';
|
||||||
@@ -44,12 +52,16 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 0,
|
ai_added_lines: 0,
|
||||||
ai_removed_lines: 1,
|
ai_removed_lines: 1,
|
||||||
|
model_added_chars: 0,
|
||||||
|
model_removed_chars: 5,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should correctly report AI modifications', () => {
|
it('should correctly report model modifications', () => {
|
||||||
const oldStr = 'line1\nline2\nline3\n';
|
const oldStr = 'line1\nline2\nline3\n';
|
||||||
const aiStr = 'line1\nline_two\nline3\n';
|
const aiStr = 'line1\nline_two\nline3\n';
|
||||||
const userStr = 'line1\nline_two\nline3\n';
|
const userStr = 'line1\nline_two\nline3\n';
|
||||||
@@ -57,8 +69,12 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 1,
|
ai_removed_lines: 1,
|
||||||
|
model_added_chars: 8,
|
||||||
|
model_removed_chars: 5,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -70,8 +86,12 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 0,
|
ai_removed_lines: 0,
|
||||||
|
model_added_chars: 5,
|
||||||
|
model_removed_chars: 0,
|
||||||
user_added_lines: 1,
|
user_added_lines: 1,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 5,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -83,8 +103,12 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 0,
|
ai_removed_lines: 0,
|
||||||
|
model_added_chars: 5,
|
||||||
|
model_removed_chars: 0,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 1,
|
user_removed_lines: 1,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 5,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -96,12 +120,16 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 0,
|
ai_removed_lines: 0,
|
||||||
|
model_added_chars: 5,
|
||||||
|
model_removed_chars: 0,
|
||||||
user_added_lines: 1,
|
user_added_lines: 1,
|
||||||
user_removed_lines: 1,
|
user_removed_lines: 1,
|
||||||
|
user_added_chars: 10,
|
||||||
|
user_removed_chars: 5,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should handle complex changes from both AI and user', () => {
|
it('should handle complex changes from both model and user', () => {
|
||||||
const oldStr = 'line1\nline2\nline3\nline4\n';
|
const oldStr = 'line1\nline2\nline3\nline4\n';
|
||||||
const aiStr = 'line_one\nline2\nline_three\nline4\n';
|
const aiStr = 'line_one\nline2\nline_three\nline4\n';
|
||||||
const userStr = 'line_one\nline_two\nline_three\nline4\nline5\n';
|
const userStr = 'line_one\nline_two\nline_three\nline4\nline5\n';
|
||||||
@@ -109,8 +137,12 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 2,
|
ai_added_lines: 2,
|
||||||
ai_removed_lines: 2,
|
ai_removed_lines: 2,
|
||||||
|
model_added_chars: 18,
|
||||||
|
model_removed_chars: 10,
|
||||||
user_added_lines: 2,
|
user_added_lines: 2,
|
||||||
user_removed_lines: 1,
|
user_removed_lines: 1,
|
||||||
|
user_added_chars: 13,
|
||||||
|
user_removed_chars: 5,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -122,8 +154,12 @@ describe('getDiffStat', () => {
|
|||||||
expect(diffStat).toEqual({
|
expect(diffStat).toEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 1,
|
ai_removed_lines: 1,
|
||||||
|
model_added_chars: 14,
|
||||||
|
model_removed_chars: 11,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -18,22 +18,27 @@ export function getDiffStat(
|
|||||||
aiStr: string,
|
aiStr: string,
|
||||||
userStr: string,
|
userStr: string,
|
||||||
): DiffStat {
|
): DiffStat {
|
||||||
const countLines = (patch: Diff.ParsedDiff) => {
|
const getStats = (patch: Diff.ParsedDiff) => {
|
||||||
let added = 0;
|
let addedLines = 0;
|
||||||
let removed = 0;
|
let removedLines = 0;
|
||||||
|
let addedChars = 0;
|
||||||
|
let removedChars = 0;
|
||||||
|
|
||||||
patch.hunks.forEach((hunk: Diff.Hunk) => {
|
patch.hunks.forEach((hunk: Diff.Hunk) => {
|
||||||
hunk.lines.forEach((line: string) => {
|
hunk.lines.forEach((line: string) => {
|
||||||
if (line.startsWith('+')) {
|
if (line.startsWith('+')) {
|
||||||
added++;
|
addedLines++;
|
||||||
|
addedChars += line.length - 1;
|
||||||
} else if (line.startsWith('-')) {
|
} else if (line.startsWith('-')) {
|
||||||
removed++;
|
removedLines++;
|
||||||
|
removedChars += line.length - 1;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return { added, removed };
|
return { addedLines, removedLines, addedChars, removedChars };
|
||||||
};
|
};
|
||||||
|
|
||||||
const patch = Diff.structuredPatch(
|
const modelPatch = Diff.structuredPatch(
|
||||||
fileName,
|
fileName,
|
||||||
fileName,
|
fileName,
|
||||||
oldStr,
|
oldStr,
|
||||||
@@ -42,7 +47,7 @@ export function getDiffStat(
|
|||||||
'Proposed',
|
'Proposed',
|
||||||
DEFAULT_DIFF_OPTIONS,
|
DEFAULT_DIFF_OPTIONS,
|
||||||
);
|
);
|
||||||
const { added: aiAddedLines, removed: aiRemovedLines } = countLines(patch);
|
const modelStats = getStats(modelPatch);
|
||||||
|
|
||||||
const userPatch = Diff.structuredPatch(
|
const userPatch = Diff.structuredPatch(
|
||||||
fileName,
|
fileName,
|
||||||
@@ -53,13 +58,16 @@ export function getDiffStat(
|
|||||||
'User',
|
'User',
|
||||||
DEFAULT_DIFF_OPTIONS,
|
DEFAULT_DIFF_OPTIONS,
|
||||||
);
|
);
|
||||||
const { added: userAddedLines, removed: userRemovedLines } =
|
const userStats = getStats(userPatch);
|
||||||
countLines(userPatch);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ai_added_lines: aiAddedLines,
|
ai_added_lines: modelStats.addedLines,
|
||||||
ai_removed_lines: aiRemovedLines,
|
ai_removed_lines: modelStats.removedLines,
|
||||||
user_added_lines: userAddedLines,
|
model_added_chars: modelStats.addedChars,
|
||||||
user_removed_lines: userRemovedLines,
|
model_removed_chars: modelStats.removedChars,
|
||||||
|
user_added_lines: userStats.addedLines,
|
||||||
|
user_removed_lines: userStats.removedLines,
|
||||||
|
user_added_chars: userStats.addedChars,
|
||||||
|
user_removed_chars: userStats.removedChars,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -530,8 +530,12 @@ describe('EditTool', () => {
|
|||||||
expect((result.returnDisplay as FileDiff).diffStat).toStrictEqual({
|
expect((result.returnDisplay as FileDiff).diffStat).toStrictEqual({
|
||||||
ai_added_lines: 3,
|
ai_added_lines: 3,
|
||||||
ai_removed_lines: 3,
|
ai_removed_lines: 3,
|
||||||
|
model_added_chars: 24,
|
||||||
|
model_removed_chars: 24,
|
||||||
user_added_lines: 0,
|
user_added_lines: 0,
|
||||||
user_removed_lines: 0,
|
user_removed_lines: 0,
|
||||||
|
user_added_chars: 0,
|
||||||
|
user_removed_chars: 0,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -591,8 +595,12 @@ describe('EditTool', () => {
|
|||||||
expect((result.returnDisplay as FileDiff).diffStat).toStrictEqual({
|
expect((result.returnDisplay as FileDiff).diffStat).toStrictEqual({
|
||||||
ai_added_lines: 1,
|
ai_added_lines: 1,
|
||||||
ai_removed_lines: 1,
|
ai_removed_lines: 1,
|
||||||
|
model_added_chars: 7,
|
||||||
|
model_removed_chars: 8,
|
||||||
user_added_lines: 1,
|
user_added_lines: 1,
|
||||||
user_removed_lines: 1,
|
user_removed_lines: 1,
|
||||||
|
user_added_chars: 8,
|
||||||
|
user_removed_chars: 7,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -443,10 +443,14 @@ export interface FileDiff {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface DiffStat {
|
export interface DiffStat {
|
||||||
ai_removed_lines: number;
|
|
||||||
ai_added_lines: number;
|
ai_added_lines: number;
|
||||||
|
ai_removed_lines: number;
|
||||||
|
model_added_chars: number;
|
||||||
|
model_removed_chars: number;
|
||||||
user_added_lines: number;
|
user_added_lines: number;
|
||||||
user_removed_lines: number;
|
user_removed_lines: number;
|
||||||
|
user_added_chars: number;
|
||||||
|
user_removed_chars: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ToolEditConfirmationDetails {
|
export interface ToolEditConfirmationDetails {
|
||||||
|
|||||||
Reference in New Issue
Block a user