Skip to content

Commit c0c5422

Browse files
lrstanleydaveshanley
authored andcommitted
feat: support base commit-based checks
Signed-off-by: Liam Stanley <liam@liam.sh>
1 parent 2e429fe commit c0c5422

File tree

8 files changed

+69
-51
lines changed

8 files changed

+69
-51
lines changed

cmd/console.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func GetConsoleCommand() *cobra.Command {
4141
limitFlag, _ := cmd.Flags().GetInt("limit")
4242
limitTimeFlag, _ := cmd.Flags().GetInt("limit-time")
4343
baseFlag, _ := cmd.Flags().GetString("base")
44+
baseCommitFlag, _ := cmd.Flags().GetString("base-commit")
4445
remoteFlag, _ := cmd.Flags().GetBool("remote")
4546
extRefs, _ := cmd.Flags().GetBool("ext-refs")
4647

@@ -146,7 +147,7 @@ func GetConsoleCommand() *cobra.Command {
146147
<-doneChan
147148
return err
148149
}
149-
commits, e := runGithubHistoryConsole(user, repo, filePath, latestFlag, limitFlag, limitTimeFlag, updateChan,
150+
commits, e := runGithubHistoryConsole(user, repo, filePath, baseCommitFlag, latestFlag, limitFlag, limitTimeFlag, updateChan,
150151
errorChan, baseFlag, remoteFlag, extRefs)
151152

152153
// wait for things to be completed.
@@ -211,7 +212,7 @@ func GetConsoleCommand() *cobra.Command {
211212

212213
go listenForUpdates(updateChan, errorChan)
213214

214-
commits, errs := runGitHistoryConsole(args[0], args[1], latestFlag, globalRevisionsFlag, limitFlag, limitTimeFlag,
215+
commits, errs := runGitHistoryConsole(args[0], args[1], baseCommitFlag, latestFlag, globalRevisionsFlag, limitFlag, limitTimeFlag,
215216
updateChan, errorChan, baseFlag, remoteFlag, extRefs)
216217

217218
// wait.
@@ -273,10 +274,10 @@ func GetConsoleCommand() *cobra.Command {
273274
}
274275

275276
// TODO: we have got to clean up these methods and replace with a message based design.
276-
func runGithubHistoryConsole(username, repo, filePath string, latest bool, limit int, limitTime int,
277+
func runGithubHistoryConsole(username, repo, filePath, baseCommit string, latest bool, limit int, limitTime int,
277278
progressChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, extRefs bool) ([]*model.Commit, []error) {
278279

279-
commitHistory, errs := git.ProcessGithubRepo(username, repo, filePath, progressChan, errorChan, true, limit, limitTime, base, remote, extRefs)
280+
commitHistory, errs := git.ProcessGithubRepo(username, repo, filePath, baseCommit, progressChan, errorChan, true, limit, limitTime, base, remote, extRefs)
280281

281282
if latest && len(commitHistory) > 1 {
282283
commitHistory = commitHistory[:1]
@@ -308,7 +309,7 @@ func runGithubHistoryConsole(username, repo, filePath string, latest bool, limit
308309
return commitHistory, nil
309310
}
310311

311-
func runGitHistoryConsole(gitPath, filePath string, latest bool, globalRevisions bool, limit int, limitTime int,
312+
func runGitHistoryConsole(gitPath, filePath, baseCommit string, latest bool, globalRevisions bool, limit int, limitTime int,
312313
updateChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, extRefs bool) ([]*model.Commit, []error) {
313314

314315
if gitPath == "" || filePath == "" {
@@ -322,7 +323,7 @@ func runGitHistoryConsole(gitPath, filePath string, latest bool, globalRevisions
322323
filePath, gitPath), false, updateChan)
323324

324325
// build commit history.
325-
commitHistory, err := git.ExtractHistoryFromFile(gitPath, filePath, updateChan, errorChan, globalRevisions, limit, limitTime)
326+
commitHistory, err := git.ExtractHistoryFromFile(gitPath, filePath, baseCommit, updateChan, errorChan, globalRevisions, limit, limitTime)
326327

327328
if err != nil {
328329
close(updateChan)

cmd/html_report.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ func GetHTMLReportCommand() *cobra.Command {
3838
doneChan := make(chan bool)
3939
failed := false
4040
baseFlag, _ := cmd.Flags().GetString("base")
41+
baseCommitFlag, _ := cmd.Flags().GetString("base-commit")
4142
noColorFlag, _ := cmd.Flags().GetBool("no-color")
4243
cdnFlag, _ := cmd.Flags().GetBool("use-cdn")
4344
latestFlag, _ := cmd.Flags().GetBool("top")
@@ -170,7 +171,7 @@ func GetHTMLReportCommand() *cobra.Command {
170171
<-doneChan
171172
return err
172173
}
173-
report, _, er := RunGithubHistoryHTMLReport(user, repo, filePath, latestFlag, cdnFlag,
174+
report, _, er := RunGithubHistoryHTMLReport(user, repo, filePath, baseCommitFlag, latestFlag, cdnFlag,
174175
false, updateChan, errorChan, limitFlag, limitTimeFlag, baseFlag, remoteFlag, extRefs)
175176

176177
// wait for things to be completed.
@@ -221,7 +222,7 @@ func GetHTMLReportCommand() *cobra.Command {
221222
}
222223
go listenForUpdates(updateChan, errorChan)
223224

224-
report, _, er := RunGitHistoryHTMLReport(args[0], args[1], latestFlag, cdnFlag,
225+
report, _, er := RunGitHistoryHTMLReport(args[0], args[1], baseCommitFlag, latestFlag, cdnFlag,
225226
updateChan, errorChan, baseFlag, remoteFlag, extRefs, globalRevisionsFlag, limitFlag, limitTimeFlag)
226227
<-doneChan
227228
if er != nil {
@@ -301,7 +302,7 @@ func ExtractGithubDetailsFromURL(url *url.URL) (string, string, string, error) {
301302
}
302303
}
303304

304-
func RunGitHistoryHTMLReport(gitPath, filePath string, latest, useCDN bool,
305+
func RunGitHistoryHTMLReport(gitPath, filePath, baseCommit string, latest, useCDN bool,
305306
progressChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, extRefs bool, globalRevisions bool, limit int, limitTime int) ([]byte, []*model.Report, []error) {
306307
if gitPath == "" || filePath == "" {
307308
err := errors.New("please supply a path to a git repo via -r, and a path to a file via -f")
@@ -312,7 +313,7 @@ func RunGitHistoryHTMLReport(gitPath, filePath string, latest, useCDN bool,
312313
}
313314

314315
// build commit history.
315-
commitHistory, err := git.ExtractHistoryFromFile(gitPath, filePath, progressChan, errorChan, globalRevisions, limit, limitTime)
316+
commitHistory, err := git.ExtractHistoryFromFile(gitPath, filePath, baseCommit, progressChan, errorChan, globalRevisions, limit, limitTime)
316317
if err != nil {
317318
model.SendFatalError("extraction",
318319
fmt.Sprintf("cannot extract history %s", errors.Join(err...)), errorChan)
@@ -351,10 +352,10 @@ func RunGitHistoryHTMLReport(gitPath, filePath string, latest, useCDN bool,
351352
return generator.GenerateReport(false, useCDN, false), reports, nil
352353
}
353354

354-
func RunGithubHistoryHTMLReport(username, repo, filePath string, latest, useCDN, embeddedMode bool,
355+
func RunGithubHistoryHTMLReport(username, repo, filePath, baseCommit string, latest, useCDN, embeddedMode bool,
355356
progressChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, limit int, limitTime int, base string, remote, extRefs bool) ([]byte, []*model.Report, []error) {
356357

357-
commitHistory, errs := git.ProcessGithubRepo(username, repo, filePath, progressChan, errorChan, true, limit, limitTime, base, remote, extRefs)
358+
commitHistory, errs := git.ProcessGithubRepo(username, repo, filePath, baseCommit, progressChan, errorChan, true, limit, limitTime, base, remote, extRefs)
358359
if latest && len(commitHistory) > 1 {
359360
commitHistory = commitHistory[:1]
360361
}

cmd/report.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func GetReportCommand() *cobra.Command {
3636
doneChan := make(chan bool)
3737
failed := false
3838
latestFlag, _ := cmd.Flags().GetBool("top")
39+
baseCommitFlag, _ := cmd.Flags().GetString("base-commit")
3940
globalRevisionsFlag, _ := cmd.Flags().GetBool("global-revisions")
4041
limitFlag, _ := cmd.Flags().GetInt("limit")
4142
limitTimeFlag, _ := cmd.Flags().GetInt("limit-time")
@@ -93,7 +94,7 @@ func GetReportCommand() *cobra.Command {
9394
<-doneChan
9495
return err
9596
}
96-
report, er := runGithubHistoryReport(user, repo, filePath, latestFlag, limitFlag, limitTimeFlag, updateChan,
97+
report, er := runGithubHistoryReport(user, repo, filePath, baseCommitFlag, latestFlag, limitFlag, limitTimeFlag, updateChan,
9798
errorChan, baseFlag, remoteFlag, extRefs)
9899

99100
// wait for things to be completed.
@@ -158,7 +159,7 @@ func GetReportCommand() *cobra.Command {
158159

159160
go listenForUpdates(updateChan, errorChan)
160161

161-
report, er := runGitHistoryReport(repo, p, latestFlag, updateChan, errorChan, baseFlag,
162+
report, er := runGitHistoryReport(repo, p, baseCommitFlag, latestFlag, updateChan, errorChan, baseFlag,
162163
remoteFlag, extRefs, globalRevisionsFlag, limitFlag, limitTimeFlag)
163164

164165
<-doneChan
@@ -229,7 +230,7 @@ func GetReportCommand() *cobra.Command {
229230
return cmd
230231
}
231232

232-
func runGitHistoryReport(gitPath, filePath string, latest bool,
233+
func runGitHistoryReport(gitPath, filePath, baseCommit string, latest bool,
233234
updateChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, extRefs bool, globalRevisions bool, limit int, limitTime int) (*model.HistoricalReport, []error) {
234235

235236
if gitPath == "" || filePath == "" {
@@ -244,7 +245,7 @@ func runGitHistoryReport(gitPath, filePath string, latest bool,
244245
filePath, gitPath), false, updateChan)
245246

246247
// build commit history.
247-
commitHistory, err := git.ExtractHistoryFromFile(gitPath, filePath, updateChan, errorChan, globalRevisions, limit, limitTime)
248+
commitHistory, err := git.ExtractHistoryFromFile(gitPath, filePath, baseCommit, updateChan, errorChan, globalRevisions, limit, limitTime)
248249
if err != nil {
249250
model.SendProgressError("git", fmt.Sprintf("%d errors found building history", len(err)), errorChan)
250251
close(updateChan)
@@ -284,10 +285,10 @@ func runGitHistoryReport(gitPath, filePath string, latest bool,
284285

285286
}
286287

287-
func runGithubHistoryReport(username, repo, filePath string, latest bool, limit int, limitTime int,
288+
func runGithubHistoryReport(username, repo, filePath, baseCommit string, latest bool, limit int, limitTime int,
288289
progressChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, extRefs bool) (*model.HistoricalReport, []error) {
289290

290-
commitHistory, errs := git.ProcessGithubRepo(username, repo, filePath, progressChan, errorChan,
291+
commitHistory, errs := git.ProcessGithubRepo(username, repo, filePath, baseCommit, progressChan, errorChan,
291292
false, limit, limitTime, base, remote, extRefs)
292293
if errs != nil {
293294
model.SendProgressError("git", errors.Join(errs...).Error(), errorChan)

cmd/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ func init() {
6666
rootCmd.PersistentFlags().IntP("limit-time", "d", -1, "Limit history to number of days. Supersedes limit argument if present.")
6767
rootCmd.PersistentFlags().BoolP("no-logo", "b", false, "Don't print the big purple pb33f banner")
6868
rootCmd.PersistentFlags().StringP("base", "p", "", "Base URL or path to use for resolving relative or remote references")
69+
rootCmd.PersistentFlags().StringP("base-commit", "", "", "Base commit to compare against (will check until commit is found or limit is reached -- make sure to not shallow clone)")
6970
rootCmd.PersistentFlags().BoolP("remote", "r", true, "Allow remote reference (URLs and files) to be auto resolved, without a base URL or path (default is on)")
7071
rootCmd.PersistentFlags().BoolP("ext-refs", "", false, "Turn on $ref lookups and resolving for extensions (x-) objects")
7172
}

cmd/summary.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func GetSummaryCommand() *cobra.Command {
4141
doneChan := make(chan bool)
4242
failed := false
4343
baseFlag, _ := cmd.Flags().GetString("base")
44+
baseCommitFlag, _ := cmd.Flags().GetString("base-commit")
4445
latestFlag, _ := cmd.Flags().GetBool("top")
4546
noColorFlag, _ := cmd.Flags().GetBool("no-color")
4647
globalRevisionsFlag, _ := cmd.Flags().GetBool("global-revisions")
@@ -182,7 +183,7 @@ func GetSummaryCommand() *cobra.Command {
182183
return err
183184
}
184185

185-
er := runGithubHistorySummary(user, repo, filePath, latestFlag, limitFlag, limitTimeFlag, updateChan,
186+
er := runGithubHistorySummary(user, repo, filePath, baseCommitFlag, latestFlag, limitFlag, limitTimeFlag, updateChan,
186187
errorChan, baseFlag, remoteFlag, markdownFlag, extRefs, errOnDiff)
187188
// wait for things to be completed.
188189
<-doneChan
@@ -237,7 +238,7 @@ func GetSummaryCommand() *cobra.Command {
237238

238239
go listenForUpdates(updateChan, errorChan)
239240

240-
err = runGitHistorySummary(args[0], args[1], latestFlag, updateChan, errorChan,
241+
err = runGitHistorySummary(args[0], args[1], baseCommitFlag, latestFlag, updateChan, errorChan,
241242
baseFlag, remoteFlag, markdownFlag, extRefs, errOnDiff, globalRevisionsFlag, limitFlag, limitTimeFlag)
242243

243244
<-doneChan
@@ -385,9 +386,9 @@ func runLeftRightSummary(left, right string, updateChan chan *model.ProgressUpda
385386
return nil
386387
}
387388

388-
func runGithubHistorySummary(username, repo, filePath string, latest bool, limit int, limitTime int,
389+
func runGithubHistorySummary(username, repo, filePath, baseCommit string, latest bool, limit int, limitTime int,
389390
progressChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, markdown, extRefs, errOnDiff bool) error {
390-
commitHistory, _ := git.ProcessGithubRepo(username, repo, filePath, progressChan, errorChan,
391+
commitHistory, _ := git.ProcessGithubRepo(username, repo, filePath, baseCommit, progressChan, errorChan,
391392
false, limit, limitTime, base, remote, extRefs)
392393

393394
if latest {
@@ -402,7 +403,7 @@ func runGithubHistorySummary(username, repo, filePath string, latest bool, limit
402403
return printSummaryDetails(commitHistory, markdown, errOnDiff)
403404
}
404405

405-
func runGitHistorySummary(gitPath, filePath string, latest bool,
406+
func runGitHistorySummary(gitPath, filePath, baseCommit string, latest bool,
406407
updateChan chan *model.ProgressUpdate, errorChan chan model.ProgressError, base string, remote, markdown, extRefs, errOnDiff bool,
407408
globalRevisions bool, limit int, limitTime int) error {
408409

@@ -417,7 +418,7 @@ func runGitHistorySummary(gitPath, filePath string, latest bool,
417418
filePath, gitPath), false, updateChan)
418419

419420
// build commit history.
420-
commitHistory, errs := git.ExtractHistoryFromFile(gitPath, filePath, updateChan, errorChan, globalRevisions, limit, limitTime)
421+
commitHistory, errs := git.ExtractHistoryFromFile(gitPath, filePath, baseCommit, updateChan, errorChan, globalRevisions, limit, limitTime)
421422
if errs != nil {
422423
model.SendProgressError("git", fmt.Sprintf("%d errors found extracting history", len(errs)), errorChan)
423424
close(updateChan)

git/github.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ import (
77
"encoding/json"
88
"errors"
99
"fmt"
10-
"github.com/araddon/dateparse"
11-
"github.com/pb33f/openapi-changes/model"
1210
"io"
1311
"net"
1412
"net/http"
@@ -17,6 +15,9 @@ import (
1715
"path/filepath"
1816
"strings"
1917
"time"
18+
19+
"github.com/araddon/dateparse"
20+
"github.com/pb33f/openapi-changes/model"
2021
)
2122

2223
const GithubRepoAPI = "https://api.github.com/repos/"
@@ -49,7 +50,7 @@ type APIFile struct {
4950
Bytes []byte `json:"-"`
5051
}
5152

52-
func GetCommitsForGithubFile(user, repo, path string,
53+
func GetCommitsForGithubFile(user, repo, path string, baseCommit string,
5354
progressChan chan *model.ProgressUpdate, progressErrorChan chan model.ProgressError,
5455
forceCutoff bool, limit int, limitTime int) ([]*APICommit, error) {
5556

@@ -121,7 +122,7 @@ func GetCommitsForGithubFile(user, repo, path string,
121122
errString := fmt.Sprintf("HTTP error %d, cannot proceed: %s", res.StatusCode, string(b))
122123
model.SendProgressError(fmt.Sprintf("fetching commit %s via API", commit.Hash),
123124
err.Error(), progressErrorChan)
124-
e <- fmt.Errorf(errString)
125+
e <- errors.New(errString)
125126
return
126127
}
127128
b, er := io.ReadAll(res.Body)
@@ -169,7 +170,7 @@ func GetCommitsForGithubFile(user, repo, path string,
169170
errMsg := fmt.Sprintf("HTTP error %d, cannot proceed: %s", res.StatusCode, string(k))
170171
model.SendProgressError(fmt.Sprintf("reading commit %s file at %s via API",
171172
commit.Hash, commit.Files[x].RawURL), errMsg, progressErrorChan)
172-
e <- fmt.Errorf(errMsg)
173+
e <- errors.New(errMsg)
173174
return
174175
}
175176
b, er = io.ReadAll(res.Body)
@@ -222,6 +223,10 @@ func GetCommitsForGithubFile(user, repo, path string,
222223
fmt.Sprintf("commit %s being fetched from %s", commits[x].Hash[0:6], u), false, progressChan)
223224
go extractFilesFromCommit(user, repo, path, commits[x], sigChan, errChan)
224225
b++
226+
if baseCommit != "" && (commits[x].Hash == baseCommit || strings.HasPrefix(commits[x].Hash, baseCommit)) {
227+
totalCommits = b
228+
break
229+
}
225230
if limit > 0 && b > limit {
226231
break
227232
}
@@ -292,7 +297,7 @@ func ConvertGithubCommitsIntoModel(ghCommits []*APICommit,
292297
return normalized, errs
293298
}
294299

295-
func ProcessGithubRepo(username string, repo string, filePath string,
300+
func ProcessGithubRepo(username, repo, filePath, baseCommit string,
296301
progressChan chan *model.ProgressUpdate, errorChan chan model.ProgressError,
297302
forceCutoff bool, limit int, limitTime int, base string, remote, extRefs bool) ([]*model.Commit, []error) {
298303

@@ -302,7 +307,7 @@ func ProcessGithubRepo(username string, repo string, filePath string,
302307
return nil, []error{err}
303308
}
304309

305-
githubCommits, err := GetCommitsForGithubFile(username, repo, filePath, progressChan, errorChan, forceCutoff, limit, limitTime)
310+
githubCommits, err := GetCommitsForGithubFile(username, repo, filePath, baseCommit, progressChan, errorChan, forceCutoff, limit, limitTime)
306311

307312
if err != nil {
308313
return nil, []error{err}

0 commit comments

Comments
 (0)