| // Copyright 2024 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package main | |
| import ( | |
| "context" | |
| "fmt" | |
| "golang.org/x/vulndb/internal/gitrepo" | |
| "golang.org/x/vulndb/internal/report" | |
| ) | |
| type setDates struct { | |
| dates map[string]gitrepo.Dates | |
| *filenameParser | |
| *fileWriter | |
| noSkip | |
| } | |
| func (setDates) name() string { return "set-dates" } | |
| func (setDates) usage() (string, string) { | |
| const desc = "sets PublishDate of YAML reports" | |
| return filenameArgs, desc | |
| } | |
| func (sd *setDates) setup(ctx context.Context, env environment) error { | |
| repo, err := env.ReportRepo(ctx) | |
| if err != nil { | |
| return err | |
| } | |
| dates, err := gitrepo.AllCommitDates(repo, gitrepo.MainReference, report.YAMLDir) | |
| if err != nil { | |
| return err | |
| } | |
| sd.dates = dates | |
| sd.filenameParser = new(filenameParser) | |
| sd.fileWriter = new(fileWriter) | |
| return setupAll(ctx, env, sd.filenameParser, sd.fileWriter) | |
| } | |
| func (sd *setDates) close() error { return nil } | |
| // setDates sets the PublishedDate of the report at filename to the oldest | |
| // commit date in the repo that contains that file. (It may someday also set a | |
| // last-modified date, hence the plural.) Since it looks at the commits from | |
| // origin/master, it will only work for reports that are already submitted. Thus | |
| // it isn't useful to run when you're working on a report, only at a later time. | |
| // | |
| // It isn't crucial to run this for every report, because the same logic exists | |
| // in gendb, ensuring that every report has a PublishedDate before being | |
| // transformed into a DB entry. The advantage of using this command is that | |
| // the dates become permanent (if you create and submit a CL after running it). | |
| // | |
| // This intentionally does not set the LastModified of the report: While the | |
| // publication date of a report may be expected not to change, the modification | |
| // date can. Always using the git history as the source of truth for the | |
| // last-modified date avoids confusion if the report YAML and the git history | |
| // disagree. | |
| func (sd *setDates) run(ctx context.Context, input any) (err error) { | |
| r := input.(*yamlReport) | |
| if !r.Published.IsZero() { | |
| return nil | |
| } | |
| d, ok := sd.dates[r.Filename] | |
| if !ok { | |
| return fmt.Errorf("can't find git repo commit dates for %q", r.Filename) | |
| } | |
| r.Published = d.Oldest | |
| return sd.write(r) | |
| } |