aboutsummaryrefslogtreecommitdiff
path: root/report.go
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2026-01-10 17:07:21 +0700
committerShulhan <ms@kilabit.info>2026-01-10 17:07:21 +0700
commit6b1ee0dbb0e0801afbf98199e0ca0dd5b2dbe3cb (patch)
tree3cd60402c254f40bc1a00a322a5ff835c51184c5 /report.go
parent813039a51f150c3f25e8596a7d4b480967e12bf5 (diff)
downloadspdxconv-6b1ee0dbb0e0801afbf98199e0ca0dd5b2dbe3cb.tar.xz
report: add method loadReport
The loadReport method load the ReportFile from the current directory, as written by [report.write] method.
Diffstat (limited to 'report.go')
-rw-r--r--report.go99
1 files changed, 94 insertions, 5 deletions
diff --git a/report.go b/report.go
index 5ac725e..eb68b6c 100644
--- a/report.go
+++ b/report.go
@@ -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