Skip to content

Commit d404262

Browse files
committed
CommitMetadata: special case master_base boundary pr
1 parent 7e775c1 commit d404262

1 file changed

Lines changed: 53 additions & 20 deletions

File tree

src/core/CommitMetadata.ts

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export async function range(commit_group_map?: CommitGroupMap) {
121121

122122
for (let i = 0; i < group_value_list.length; i++) {
123123
const group = group_value_list[i];
124+
const previous_group: undefined | CommitGroup = group_value_list[i - 1];
124125

125126
if (group.id !== UNASSIGNED) {
126127
let pr_result = pr_lookup[group.id];
@@ -164,29 +165,61 @@ export async function range(commit_group_map?: CommitGroupMap) {
164165

165166
if (!group.pr) {
166167
group.dirty = true;
167-
} else if (group.pr.commits.length !== group.commits.length) {
168-
group.dirty = true;
169-
} else if (group.pr.baseRefName !== group.base) {
170-
group.dirty = true;
171-
} else if (group.master_base) {
172-
group.pr.number;
173-
// master_base groups cannot be compared by commit sha
174-
// instead compare the literal diff local against origin
175-
// gh pr diff --color=never 110
176-
// git --no-pager diff --color=never 00c8fe0~1..00c8fe0 | pbcopy
177-
const diff_github = await github.pr_diff(group.pr.number);
178-
const diff_local = await git.get_diff(group.commits);
179-
if (diff_github !== diff_local) {
180-
group.dirty = true;
181-
}
182168
} else {
183-
// comapre literal commit shas in group
184-
for (let i = 0; i < group.pr.commits.length; i++) {
185-
const pr_commit = group.pr.commits[i];
186-
const local_commit = group.commits[i];
169+
if (group.pr.baseRefName !== group.base) {
170+
group.dirty = true;
171+
} else if (group.master_base && i > 0) {
172+
// special case
173+
// master_base groups cannot be compared by commit sha
174+
// instead compare the literal diff local against origin
175+
// gh pr diff --color=never 110
176+
// git --no-pager diff --color=never 00c8fe0~1..00c8fe0
177+
const diff_github = await github.pr_diff(group.pr.number);
178+
const diff_local = await git.get_diff(group.commits);
179+
if (diff_github !== diff_local) {
180+
group.dirty = true;
181+
}
182+
} else if (!group.master_base && previous_group && previous_group.master_base) {
183+
// special case
184+
// boundary between normal commits and master commits
185+
186+
// collect all previous groups for sha comparison
187+
const all_commits: Array<git.Commit> = [];
188+
const previous_groups = group_value_list.slice(0, i);
189+
for (const g of previous_groups) {
190+
for (const c of g.commits) {
191+
all_commits.push(c);
192+
}
193+
}
194+
for (const c of group.commits) {
195+
all_commits.push(c);
196+
}
187197

188-
if (pr_commit.oid !== local_commit.sha) {
198+
// compare all commits against pr commits
199+
if (group.pr.commits.length !== all_commits.length) {
189200
group.dirty = true;
201+
} else {
202+
for (let i = 0; i < group.pr.commits.length; i++) {
203+
const pr_commit = group.pr.commits[i];
204+
const local_commit = all_commits[i];
205+
206+
if (pr_commit.oid !== local_commit.sha) {
207+
group.dirty = true;
208+
}
209+
}
210+
}
211+
} else if (group.pr.commits.length !== group.commits.length) {
212+
group.dirty = true;
213+
} else {
214+
// if we still haven't marked this dirty, check each commit
215+
// comapre literal commit shas in group
216+
for (let i = 0; i < group.pr.commits.length; i++) {
217+
const pr_commit = group.pr.commits[i];
218+
const local_commit = group.commits[i];
219+
220+
if (pr_commit.oid !== local_commit.sha) {
221+
group.dirty = true;
222+
}
190223
}
191224
}
192225
}

0 commit comments

Comments
 (0)