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