xref: /aosp_15_r20/external/spdx-tools/builder/builder2v2/build_package.go (revision ba677afa8f67bb56cbc794f4d0e378e0da058e16)
1*ba677afaSXin Li// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
2*ba677afaSXin Li
3*ba677afaSXin Lipackage builder2v2
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_2"
13*ba677afaSXin Li	"github.com/spdx/tools-golang/utils"
14*ba677afaSXin Li)
15*ba677afaSXin Li
16*ba677afaSXin Li// BuildPackageSection2_2 creates an SPDX Package (version 2.2), 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_2(packageName string, dirRoot string, pathsIgnore []string) (*v2_2.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	osType := runtime.GOOS
26*ba677afaSXin Li
27*ba677afaSXin Li	if err != nil {
28*ba677afaSXin Li		return nil, err
29*ba677afaSXin Li	}
30*ba677afaSXin Li
31*ba677afaSXin Li	re, ok := regexp.Compile("/+")
32*ba677afaSXin Li	if ok != nil {
33*ba677afaSXin Li		return nil, err
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_2.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_2(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
57*ba677afaSXin Li	// get the verification code
58*ba677afaSXin Li	code, err := utils.GetVerificationCode2_2(files, "")
59*ba677afaSXin Li	if err != nil {
60*ba677afaSXin Li		return nil, err
61*ba677afaSXin Li	}
62*ba677afaSXin Li
63*ba677afaSXin Li	// now build the package section
64*ba677afaSXin Li	pkg := &v2_2.Package{
65*ba677afaSXin Li		PackageName:                 packageName,
66*ba677afaSXin Li		PackageSPDXIdentifier:       common.ElementID(fmt.Sprintf("Package-%s", packageName)),
67*ba677afaSXin Li		PackageDownloadLocation:     "NOASSERTION",
68*ba677afaSXin Li		FilesAnalyzed:               true,
69*ba677afaSXin Li		IsFilesAnalyzedTagPresent:   true,
70*ba677afaSXin Li		PackageVerificationCode:     code,
71*ba677afaSXin Li		PackageLicenseConcluded:     "NOASSERTION",
72*ba677afaSXin Li		PackageLicenseInfoFromFiles: []string{},
73*ba677afaSXin Li		PackageLicenseDeclared:      "NOASSERTION",
74*ba677afaSXin Li		PackageCopyrightText:        "NOASSERTION",
75*ba677afaSXin Li		Files:                       files,
76*ba677afaSXin Li	}
77*ba677afaSXin Li
78*ba677afaSXin Li	return pkg, nil
79*ba677afaSXin Li}
80