1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 2*ba677afaSXin Li 3*ba677afaSXin Lipackage builder2v1 4*ba677afaSXin Li 5*ba677afaSXin Liimport ( 6*ba677afaSXin Li "fmt" 7*ba677afaSXin Li "path/filepath" 8*ba677afaSXin Li "regexp" 9*ba677afaSXin Li "runtime" 10*ba677afaSXin Li 11*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/common" 12*ba677afaSXin Li "github.com/spdx/tools-golang/spdx/v2_1" 13*ba677afaSXin Li "github.com/spdx/tools-golang/utils" 14*ba677afaSXin Li) 15*ba677afaSXin Li 16*ba677afaSXin Li// BuildPackageSection2_1 creates an SPDX Package (version 2.1), returning 17*ba677afaSXin Li// that package or error if any is encountered. Arguments: 18*ba677afaSXin Li// - packageName: name of package / directory 19*ba677afaSXin Li// - dirRoot: path to directory to be analyzed 20*ba677afaSXin Li// - pathsIgnore: slice of strings for filepaths to ignore 21*ba677afaSXin Lifunc BuildPackageSection2_1(packageName string, dirRoot string, pathsIgnore []string) (*v2_1.Package, error) { 22*ba677afaSXin Li // build the file section first, so we'll have it available 23*ba677afaSXin Li // for calculating the package verification code 24*ba677afaSXin Li filepaths, err := utils.GetAllFilePaths(dirRoot, pathsIgnore) 25*ba677afaSXin Li if err != nil { 26*ba677afaSXin Li return nil, err 27*ba677afaSXin Li } 28*ba677afaSXin Li osType := runtime.GOOS 29*ba677afaSXin Li 30*ba677afaSXin Li re, ok := regexp.Compile("/+") 31*ba677afaSXin Li if ok != nil { 32*ba677afaSXin Li return nil, err 33*ba677afaSXin Li } 34*ba677afaSXin Li 35*ba677afaSXin Li dirRootLen := 0 36*ba677afaSXin Li if osType == "windows" { 37*ba677afaSXin Li dirRootLen = len(dirRoot) 38*ba677afaSXin Li } 39*ba677afaSXin Li 40*ba677afaSXin Li files := []*v2_1.File{} 41*ba677afaSXin Li fileNumber := 0 42*ba677afaSXin Li for _, fp := range filepaths { 43*ba677afaSXin Li newFilePatch := "" 44*ba677afaSXin Li if osType == "windows" { 45*ba677afaSXin Li newFilePatch = filepath.FromSlash("." + fp[dirRootLen:]) 46*ba677afaSXin Li } else { 47*ba677afaSXin Li newFilePatch = filepath.FromSlash("./" + fp) 48*ba677afaSXin Li } 49*ba677afaSXin Li newFile, err := BuildFileSection2_1(re.ReplaceAllLiteralString(newFilePatch, string(filepath.Separator)), dirRoot, fileNumber) 50*ba677afaSXin Li if err != nil { 51*ba677afaSXin Li return nil, err 52*ba677afaSXin Li } 53*ba677afaSXin Li files = append(files, newFile) 54*ba677afaSXin Li fileNumber++ 55*ba677afaSXin Li } 56*ba677afaSXin Li // get the verification code 57*ba677afaSXin Li code, err := utils.GetVerificationCode2_1(files, "") 58*ba677afaSXin Li if err != nil { 59*ba677afaSXin Li return nil, err 60*ba677afaSXin Li } 61*ba677afaSXin Li 62*ba677afaSXin Li // now build the package section 63*ba677afaSXin Li pkg := &v2_1.Package{ 64*ba677afaSXin Li PackageName: packageName, 65*ba677afaSXin Li PackageSPDXIdentifier: common.ElementID(fmt.Sprintf("Package-%s", packageName)), 66*ba677afaSXin Li PackageDownloadLocation: "NOASSERTION", 67*ba677afaSXin Li FilesAnalyzed: true, 68*ba677afaSXin Li IsFilesAnalyzedTagPresent: true, 69*ba677afaSXin Li PackageVerificationCode: code, 70*ba677afaSXin Li PackageLicenseConcluded: "NOASSERTION", 71*ba677afaSXin Li PackageLicenseInfoFromFiles: []string{}, 72*ba677afaSXin Li PackageLicenseDeclared: "NOASSERTION", 73*ba677afaSXin Li PackageCopyrightText: "NOASSERTION", 74*ba677afaSXin Li Files: files, 75*ba677afaSXin Li } 76*ba677afaSXin Li 77*ba677afaSXin Li return pkg, nil 78*ba677afaSXin Li} 79