1// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2 3package saver2v1 4 5import ( 6 "fmt" 7 "io" 8 "sort" 9 "strings" 10 11 "github.com/spdx/tools-golang/spdx/common" 12 "github.com/spdx/tools-golang/spdx/v2_1" 13) 14 15func renderPackage2_1(pkg *v2_1.Package, w io.Writer) error { 16 if pkg.PackageName != "" { 17 fmt.Fprintf(w, "PackageName: %s\n", pkg.PackageName) 18 } 19 if pkg.PackageSPDXIdentifier != "" { 20 fmt.Fprintf(w, "SPDXID: %s\n", common.RenderElementID(pkg.PackageSPDXIdentifier)) 21 } 22 if pkg.PackageVersion != "" { 23 fmt.Fprintf(w, "PackageVersion: %s\n", pkg.PackageVersion) 24 } 25 if pkg.PackageFileName != "" { 26 fmt.Fprintf(w, "PackageFileName: %s\n", pkg.PackageFileName) 27 } 28 if pkg.PackageSupplier != nil && pkg.PackageSupplier.Supplier != "" { 29 if pkg.PackageSupplier.SupplierType == "" { 30 fmt.Fprintf(w, "PackageSupplier: %s\n", pkg.PackageSupplier.Supplier) 31 } else { 32 fmt.Fprintf(w, "PackageSupplier: %s: %s\n", pkg.PackageSupplier.SupplierType, pkg.PackageSupplier.Supplier) 33 } 34 } 35 if pkg.PackageOriginator != nil && pkg.PackageOriginator.Originator != "" { 36 if pkg.PackageOriginator.OriginatorType == "" { 37 fmt.Fprintf(w, "PackageOriginator: %s\n", pkg.PackageOriginator.Originator) 38 } else { 39 fmt.Fprintf(w, "PackageOriginator: %s: %s\n", pkg.PackageOriginator.OriginatorType, pkg.PackageOriginator.Originator) 40 } 41 } 42 if pkg.PackageDownloadLocation != "" { 43 fmt.Fprintf(w, "PackageDownloadLocation: %s\n", pkg.PackageDownloadLocation) 44 } 45 if pkg.FilesAnalyzed == true { 46 if pkg.IsFilesAnalyzedTagPresent == true { 47 fmt.Fprintf(w, "FilesAnalyzed: true\n") 48 } 49 } else { 50 fmt.Fprintf(w, "FilesAnalyzed: false\n") 51 } 52 if pkg.PackageVerificationCode.Value != "" && pkg.FilesAnalyzed == true { 53 if len(pkg.PackageVerificationCode.ExcludedFiles) == 0 { 54 fmt.Fprintf(w, "PackageVerificationCode: %s\n", pkg.PackageVerificationCode.Value) 55 } else { 56 fmt.Fprintf(w, "PackageVerificationCode: %s (excludes: %s)\n", pkg.PackageVerificationCode.Value, strings.Join(pkg.PackageVerificationCode.ExcludedFiles, ", ")) 57 } 58 } 59 60 for _, checksum := range pkg.PackageChecksums { 61 fmt.Fprintf(w, "PackageChecksum: %s: %s\n", checksum.Algorithm, checksum.Value) 62 } 63 64 if pkg.PackageHomePage != "" { 65 fmt.Fprintf(w, "PackageHomePage: %s\n", pkg.PackageHomePage) 66 } 67 if pkg.PackageSourceInfo != "" { 68 fmt.Fprintf(w, "PackageSourceInfo: %s\n", textify(pkg.PackageSourceInfo)) 69 } 70 if pkg.PackageLicenseConcluded != "" { 71 fmt.Fprintf(w, "PackageLicenseConcluded: %s\n", pkg.PackageLicenseConcluded) 72 } 73 if pkg.FilesAnalyzed == true { 74 for _, s := range pkg.PackageLicenseInfoFromFiles { 75 fmt.Fprintf(w, "PackageLicenseInfoFromFiles: %s\n", s) 76 } 77 } 78 if pkg.PackageLicenseDeclared != "" { 79 fmt.Fprintf(w, "PackageLicenseDeclared: %s\n", pkg.PackageLicenseDeclared) 80 } 81 if pkg.PackageLicenseComments != "" { 82 fmt.Fprintf(w, "PackageLicenseComments: %s\n", textify(pkg.PackageLicenseComments)) 83 } 84 if pkg.PackageCopyrightText != "" { 85 fmt.Fprintf(w, "PackageCopyrightText: %s\n", textify(pkg.PackageCopyrightText)) 86 } 87 if pkg.PackageSummary != "" { 88 fmt.Fprintf(w, "PackageSummary: %s\n", textify(pkg.PackageSummary)) 89 } 90 if pkg.PackageDescription != "" { 91 fmt.Fprintf(w, "PackageDescription: %s\n", textify(pkg.PackageDescription)) 92 } 93 if pkg.PackageComment != "" { 94 fmt.Fprintf(w, "PackageComment: %s\n", textify(pkg.PackageComment)) 95 } 96 for _, s := range pkg.PackageExternalReferences { 97 fmt.Fprintf(w, "ExternalRef: %s %s %s\n", s.Category, s.RefType, s.Locator) 98 if s.ExternalRefComment != "" { 99 fmt.Fprintf(w, "ExternalRefComment: %s\n", textify(s.ExternalRefComment)) 100 } 101 } 102 103 fmt.Fprintf(w, "\n") 104 105 // also render any files for this package 106 sort.Slice(pkg.Files, func(i, j int) bool { 107 return pkg.Files[i].FileSPDXIdentifier < pkg.Files[j].FileSPDXIdentifier 108 }) 109 for _, fi := range pkg.Files { 110 renderFile2_1(fi, w) 111 } 112 113 return nil 114} 115