diff options
Diffstat (limited to 'report.go')
| -rw-r--r-- | report.go | 99 |
1 files changed, 94 insertions, 5 deletions
@@ -6,20 +6,109 @@ package spdxconv import ( "bytes" "encoding/csv" + "errors" "fmt" + "io" "os" + "strconv" + "strings" ) // ReportFile contains the list of files that will be converted or inserted // with SPDX identifiers. const ReportFile = `spdxconv.report` +const reportMetaPrefix = `//spdxconv:` + +const ( + reportGroupRegular = `regular` + reportGroupBinary = `binary` + reportGroupUnknown = `unknown` +) + +const v1FieldsPerRecord = 4 + type report struct { listRegular []*file listBinary []*file listUnknown []*file } +// loadReport load the [ReportFile] from the current directory. +func loadReport() (rep *report, err error) { + var logp = `loadReport` + var content []byte + content, err = os.ReadFile(ReportFile) + if err != nil { + return nil, fmt.Errorf(`%s: %w`, logp, err) + } + + br := bytes.NewReader(content) + csvr := csv.NewReader(br) + csvr.FieldsPerRecord = v1FieldsPerRecord + csvr.ReuseRecord = true + csvr.TrimLeadingSpace = true + + rep = &report{} + var group string + var record []string + var fields []string + var f *file + var n int + + record, err = csvr.Read() + for !errors.Is(err, io.EOF) { + if errors.Is(err, csv.ErrFieldCount) { + if !strings.HasPrefix(record[0], reportMetaPrefix) { + goto next + } + group = strings.TrimPrefix(record[0], reportMetaPrefix) + switch group { + case reportGroupRegular, reportGroupBinary, reportGroupUnknown: + // OK + default: + group = `` + } + goto next + } + + f = &file{ + path: record[0], + copyrightYear: record[2], + } + fields = strings.Split(record[1], `:`) + f.licenseID = fields[0] + if len(fields) == 2 && fields[0] == valExist { + f.idxLicenseID, err = strconv.Atoi(fields[1]) + if err != nil { + return nil, fmt.Errorf(`%s: line %d: %w`, logp, n, err) + } + } + fields = strings.Split(record[3], `:`) + f.copyrightText = fields[0] + if len(fields) == 2 && fields[0] == valExist { + f.idxCopyrightText, err = strconv.Atoi(fields[1]) + if err != nil { + return nil, fmt.Errorf(`%s: line %d: %w`, logp, n, err) + } + } + + switch group { + case reportGroupRegular: + rep.listRegular = append(rep.listRegular, f) + case reportGroupBinary: + rep.listBinary = append(rep.listBinary, f) + case reportGroupUnknown: + rep.listUnknown = append(rep.listUnknown, f) + } + next: + record, err = csvr.Read() + n++ + } + + return rep, nil +} + func newReport() (rep *report) { rep = &report{} return rep @@ -48,13 +137,13 @@ func (rep *report) scan(conv *SPDXConv, listFile []string) (err error) { func (rep *report) write() (err error) { var buf bytes.Buffer - buf.WriteString("//spdxconv:version:v1\n") - buf.WriteString("//spdxconv:header:path,license_id,year,copyright_id\n") + buf.WriteString(reportMetaPrefix + "version:v1\n") + buf.WriteString(reportMetaPrefix + "header:path,license_id,year,copyright_id\n") var csvw = csv.NewWriter(&buf) var record = make([]string, 4) - buf.WriteString("//spdxconv:regular\n") + buf.WriteString(reportMetaPrefix + reportGroupRegular + "\n") for _, file := range rep.listRegular { record[0] = file.path record[1] = file.licenseID @@ -67,7 +156,7 @@ func (rep *report) write() (err error) { } csvw.Flush() - buf.WriteString("//spdxconv:binary\n") + buf.WriteString(reportMetaPrefix + reportGroupBinary + "\n") for _, file := range rep.listBinary { record[0] = file.path record[1] = file.licenseID @@ -80,7 +169,7 @@ func (rep *report) write() (err error) { } csvw.Flush() - buf.WriteString("//spdxconv:unknown\n") + buf.WriteString(reportMetaPrefix + reportGroupUnknown + "\n") for _, file := range rep.listUnknown { record[0] = file.path record[1] = file.licenseID |
