@@ -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