Skip to content

Commit d48fc6e

Browse files
authored
Merge pull request #10 from matmanjs/bugfix_increase_cov
Bugfix increase cov
2 parents 572139c + 25b0622 commit d48fc6e

File tree

4 files changed

+72
-29
lines changed

4 files changed

+72
-29
lines changed

package-lock.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "incremental-coverage",
3-
"version": "2.6.0",
3+
"version": "2.7.0",
44
"description": "Merge lcov.info and get incremental coverage and full coverage",
55
"main": "lib/index.js",
66
"bin": {

src/apis/process/increase.ts

+29-24
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export class IncreaseProcess<T extends keyof Mapper> extends BaseProcess<T> {
2121
stream: {},
2222
};
2323

24-
private firstGitMessage: CommitInfo = {};
24+
private baseDiffCommitInfo: CommitInfo | undefined;
2525

2626
constructor(lcovPath: string | string[], opts: IncreaseProcessOpts<T> = { stream: {} }) {
2727
super();
@@ -45,11 +45,14 @@ export class IncreaseProcess<T extends keyof Mapper> extends BaseProcess<T> {
4545
}
4646

4747
async exec(): Promise<IncreaseResult> {
48-
// 得到本次 diff 信息
48+
// 如果传递了 hash,则得到该提交记录
4949
if (this.opts.hash) {
50-
await this.getInfoByHash(this.opts.hash);
51-
} else {
52-
await this.getLog();
50+
this.baseDiffCommitInfo = await this.getCommitInfoByHash(this.opts.hash);
51+
}
52+
53+
// 如果通过 hash 无法获得,则自动获取指定日期的那次代码提交
54+
if (!this.baseDiffCommitInfo) {
55+
this.baseDiffCommitInfo = await this.getCommitInfoByLogSince();
5356
}
5457

5558
if (!this.opts.cwd) {
@@ -59,9 +62,6 @@ export class IncreaseProcess<T extends keyof Mapper> extends BaseProcess<T> {
5962
// 将首次提交的代码信息当做创建信息
6063
const createInfo = await this.getCreateInfo() as CommitInfo;
6164

62-
// 得到创建信息
63-
this.firstGitMessage = createInfo;
64-
6565
// 得到增量合并结果
6666
await this.getLcov();
6767

@@ -70,14 +70,14 @@ export class IncreaseProcess<T extends keyof Mapper> extends BaseProcess<T> {
7070
if (this.opts.output) {
7171
this.output({
7272
data: this.formatData,
73-
commit: this.firstGitMessage,
73+
commit: this.baseDiffCommitInfo,
7474
createInfo,
7575
});
7676
}
7777

7878
return {
7979
data: this.formatData,
80-
commit: this.firstGitMessage,
80+
commit: this.baseDiffCommitInfo as CommitInfo,
8181
createInfo,
8282
gitRepoInfo: this.getGitRepoInfo()
8383
};
@@ -90,36 +90,41 @@ export class IncreaseProcess<T extends keyof Mapper> extends BaseProcess<T> {
9090
// 解析获得 lcov.info 的信息,这里是全量覆盖率信息
9191
const res = await getLcovFile(this.lcovPath);
9292

93-
this.lcov = (
94-
await new IncreaseConcat({
95-
cwd: this.opts.cwd,
96-
hash: this.firstGitMessage?.hash,
97-
}).concat(...res)
98-
).getRes();
93+
// 合并多个 lcov 文件
94+
const increaseConcat = await new IncreaseConcat({
95+
cwd: this.opts.cwd,
96+
hash: this.baseDiffCommitInfo?.hash,
97+
}).concat(...res);
98+
99+
// 获得合并结果
100+
this.lcov = increaseConcat.getRes();
99101
}
100102

101103
/**
102-
* 得到 GitLog 结果
104+
* 通过 GitLog 的 since 值得到本次提交的记录
103105
*/
104-
private async getLog() {
106+
private async getCommitInfoByLogSince(): Promise<(CommitInfo | undefined)> {
107+
// 获得当月1号
105108
const subDate = dayjs(this.opts.since).subtract(1, 'day').format('YYYY-MM-DD');
106109

107110
const res = await new LogParser({
108111
repo: this.opts.cwd as string,
109-
until: subDate,
112+
113+
// before: 该日期之前的记录,更新的排在前面
114+
// after: 该日期之后的记录,更新的排在前面
115+
before: subDate,
110116
}).run();
111117

112-
[this.firstGitMessage] = res;
118+
// 返回第一个值
119+
return res[0];
113120
}
114121

115122
/**
116123
* 通过 hash 值得到本次提交的记录
117124
*/
118-
private async getInfoByHash(hash: string) {
125+
private async getCommitInfoByHash(hash: string): Promise<(CommitInfo | undefined)> {
119126
const result = await getGitRepoCommitInfoByHash(hash, this.opts.cwd);
120127

121-
if (result) {
122-
this.firstGitMessage = result;
123-
}
128+
return result || undefined;
124129
}
125130
}

src/concat/increaseConcat.ts

+41-3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ export interface IncreaseConcatOpts {
1414
hash?: string;
1515
}
1616

17+
interface LineNumberCheckItem {
18+
delete?: string,
19+
insert?: string,
20+
normal?: string,
21+
}
22+
1723
export class IncreaseConcat implements Concat {
1824
// 配置
1925
private opts: IncreaseConcatOpts = {};
@@ -101,15 +107,47 @@ export class IncreaseConcat implements Concat {
101107
};
102108

103109
// 统计变换了的行号
104-
const diffLineArr: Array<number> = [];
110+
const diffInsertLineArr: Array<number> = [];
111+
const lineNumberCheckMap: { [key: number]: LineNumberCheckItem } = {};
112+
105113
diffItem.hunks.forEach((hunk) => {
106114
hunk.changes.forEach((change) => {
107-
if (change.type === 'insert' && change.lineNumber) {
108-
diffLineArr.push(change.lineNumber);
115+
if (!change.lineNumber) {
116+
return;
117+
}
118+
119+
// 以行号为key,缓存下该行号 insert 或 delete 时的内容
120+
const lineNumberCheckItem: LineNumberCheckItem = lineNumberCheckMap[change.lineNumber] || {};
121+
lineNumberCheckItem[change.type] = change.content;
122+
lineNumberCheckMap[change.lineNumber] = lineNumberCheckItem;
123+
124+
// 只需要判断 insert 类型且有行号的的结果即可,
125+
// 毕竟计算增量的目的是为了看存在,所以 delete 类型的不需要计算
126+
if ((change.type === 'insert')) {
127+
diffInsertLineArr.push(change.lineNumber);
109128
}
110129
});
111130
});
112131

132+
// 注意一种特殊情况,如果某行既是 insert 且又是 delete,且 content 内容还是一模一样,则忽略该情况
133+
// 公司内的增量覆盖率算法为上述处理策略,因此此处做统一,
134+
// 虽然个人觉得不太合理,感觉只要是 delete 和 insert 应该都算增量变化,但需进一步研究
135+
// 统计变换了的行号
136+
const diffLineArr: Array<number> = [];
137+
diffInsertLineArr.forEach((lineNumber) => {
138+
const lineNumberCheckItem: LineNumberCheckItem = lineNumberCheckMap[lineNumber];
139+
140+
if (!lineNumberCheckItem) {
141+
return;
142+
}
143+
144+
if (lineNumberCheckItem.insert && lineNumberCheckItem.delete && (lineNumberCheckItem.insert === lineNumberCheckItem.delete)) {
145+
return;
146+
}
147+
148+
diffLineArr.push(lineNumber);
149+
});
150+
113151
// 统计每行对应的hit数
114152
const lcovLineHit: Record<string, number> = {};
115153

0 commit comments

Comments
 (0)