225 lines
8.3 KiB
Go
225 lines
8.3 KiB
Go
// Package builder is used to create tools-golang data structures for a given
|
|
// directory path's contents, with hashes, etc. filled in and with empty
|
|
// license data.
|
|
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
package builder
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/spdx/tools-golang/builder/builder2v1"
|
|
"github.com/spdx/tools-golang/builder/builder2v2"
|
|
"github.com/spdx/tools-golang/builder/builder2v3"
|
|
"github.com/spdx/tools-golang/spdx/common"
|
|
"github.com/spdx/tools-golang/spdx/v2_1"
|
|
"github.com/spdx/tools-golang/spdx/v2_2"
|
|
"github.com/spdx/tools-golang/spdx/v2_3"
|
|
)
|
|
|
|
// ===== 2.1 builder =====
|
|
|
|
// Config2_1 is a collection of configuration settings for builder
|
|
// (for version 2.1 SPDX Documents). A few mandatory fields are set here
|
|
// so that they can be repeatedly reused in multiple calls to Build2_1.
|
|
type Config2_1 struct {
|
|
// NamespacePrefix should be a URI representing a prefix for the
|
|
// namespace with which the SPDX Document will be associated.
|
|
// It will be used in the DocumentNamespace field in the CreationInfo
|
|
// section, followed by the per-Document package name and a random UUID.
|
|
NamespacePrefix string
|
|
|
|
// CreatorType should be one of "Person", "Organization" or "Tool".
|
|
// If not one of those strings, it will be interpreted as "Person".
|
|
CreatorType string
|
|
|
|
// Creator will be filled in for the given CreatorType.
|
|
Creator string
|
|
|
|
// PathsIgnored lists certain paths to be omitted from the built document.
|
|
// Each string should be a path, relative to the package's dirRoot,
|
|
// to a specific file or (for all files in a directory) ending in a slash.
|
|
// Prefix the string with "**" to omit all instances of that file /
|
|
// directory, regardless of where it is in the file tree.
|
|
PathsIgnored []string
|
|
|
|
// TestValues is used to pass fixed values for testing purposes
|
|
// only, and should be set to nil for production use. It is only
|
|
// exported so that it will be accessible within builder2v1.
|
|
TestValues map[string]string
|
|
}
|
|
|
|
// Build2_1 creates an SPDX Document (version 2.1), returning that document or
|
|
// error if any is encountered. Arguments:
|
|
// - packageName: name of package / directory
|
|
// - dirRoot: path to directory to be analyzed
|
|
// - config: Config object
|
|
func Build2_1(packageName string, dirRoot string, config *Config2_1) (*v2_1.Document, error) {
|
|
// build Package section first -- will include Files and make the
|
|
// package verification code available
|
|
pkg, err := builder2v1.BuildPackageSection2_1(packageName, dirRoot, config.PathsIgnored)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ci, err := builder2v1.BuildCreationInfoSection2_1(config.CreatorType, config.Creator, config.TestValues)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rln, err := builder2v1.BuildRelationshipSection2_1(packageName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
doc := &v2_1.Document{
|
|
SPDXVersion: "SPDX-2.1",
|
|
DataLicense: "CC0-1.0",
|
|
SPDXIdentifier: common.ElementID("DOCUMENT"),
|
|
DocumentName: packageName,
|
|
DocumentNamespace: fmt.Sprintf("%s%s-%s", config.NamespacePrefix, packageName, pkg.PackageVerificationCode),
|
|
CreationInfo: ci,
|
|
Packages: []*v2_1.Package{pkg},
|
|
Relationships: []*v2_1.Relationship{rln},
|
|
}
|
|
|
|
return doc, nil
|
|
}
|
|
|
|
// ===== 2.2 builder =====
|
|
|
|
// Config2_2 is a collection of configuration settings for builder
|
|
// (for version 2.2 SPDX Documents). A few mandatory fields are set here
|
|
// so that they can be repeatedly reused in multiple calls to Build2_2.
|
|
type Config2_2 struct {
|
|
// NamespacePrefix should be a URI representing a prefix for the
|
|
// namespace with which the SPDX Document will be associated.
|
|
// It will be used in the DocumentNamespace field in the CreationInfo
|
|
// section, followed by the per-Document package name and a random UUID.
|
|
NamespacePrefix string
|
|
|
|
// CreatorType should be one of "Person", "Organization" or "Tool".
|
|
// If not one of those strings, it will be interpreted as "Person".
|
|
CreatorType string
|
|
|
|
// Creator will be filled in for the given CreatorType.
|
|
Creator string
|
|
|
|
// PathsIgnored lists certain paths to be omitted from the built document.
|
|
// Each string should be a path, relative to the package's dirRoot,
|
|
// to a specific file or (for all files in a directory) ending in a slash.
|
|
// Prefix the string with "**" to omit all instances of that file /
|
|
// directory, regardless of where it is in the file tree.
|
|
PathsIgnored []string
|
|
|
|
// TestValues is used to pass fixed values for testing purposes
|
|
// only, and should be set to nil for production use. It is only
|
|
// exported so that it will be accessible within builder2v2.
|
|
TestValues map[string]string
|
|
}
|
|
|
|
// Build2_2 creates an SPDX Document (version 2.2), returning that document or
|
|
// error if any is encountered. Arguments:
|
|
// - packageName: name of package / directory
|
|
// - dirRoot: path to directory to be analyzed
|
|
// - config: Config object
|
|
func Build2_2(packageName string, dirRoot string, config *Config2_2) (*v2_2.Document, error) {
|
|
// build Package section first -- will include Files and make the
|
|
// package verification code available
|
|
pkg, err := builder2v2.BuildPackageSection2_2(packageName, dirRoot, config.PathsIgnored)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ci, err := builder2v2.BuildCreationInfoSection2_2(config.CreatorType, config.Creator, config.TestValues)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rln, err := builder2v2.BuildRelationshipSection2_2(packageName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
doc := &v2_2.Document{
|
|
SPDXVersion: "SPDX-2.2",
|
|
DataLicense: "CC0-1.0",
|
|
SPDXIdentifier: common.ElementID("DOCUMENT"),
|
|
DocumentName: packageName,
|
|
DocumentNamespace: fmt.Sprintf("%s%s-%s", config.NamespacePrefix, packageName, pkg.PackageVerificationCode),
|
|
CreationInfo: ci,
|
|
Packages: []*v2_2.Package{pkg},
|
|
Relationships: []*v2_2.Relationship{rln},
|
|
}
|
|
|
|
return doc, nil
|
|
}
|
|
|
|
// ===== 2.3 builder =====
|
|
|
|
// Config2_3 is a collection of configuration settings for builder
|
|
// (for version 2.3 SPDX Documents). A few mandatory fields are set here
|
|
// so that they can be repeatedly reused in multiple calls to Build2_3.
|
|
type Config2_3 struct {
|
|
// NamespacePrefix should be a URI representing a prefix for the
|
|
// namespace with which the SPDX Document will be associated.
|
|
// It will be used in the DocumentNamespace field in the CreationInfo
|
|
// section, followed by the per-Document package name and a random UUID.
|
|
NamespacePrefix string
|
|
|
|
// CreatorType should be one of "Person", "Organization" or "Tool".
|
|
// If not one of those strings, it will be interpreted as "Person".
|
|
CreatorType string
|
|
|
|
// Creator will be filled in for the given CreatorType.
|
|
Creator string
|
|
|
|
// PathsIgnored lists certain paths to be omitted from the built document.
|
|
// Each string should be a path, relative to the package's dirRoot,
|
|
// to a specific file or (for all files in a directory) ending in a slash.
|
|
// Prefix the string with "**" to omit all instances of that file /
|
|
// directory, regardless of where it is in the file tree.
|
|
PathsIgnored []string
|
|
|
|
// TestValues is used to pass fixed values for testing purposes
|
|
// only, and should be set to nil for production use. It is only
|
|
// exported so that it will be accessible within builder2v3.
|
|
TestValues map[string]string
|
|
}
|
|
|
|
// Build2_3 creates an SPDX Document (version 2.3), returning that document or
|
|
// error if any is encountered. Arguments:
|
|
// - packageName: name of package / directory
|
|
// - dirRoot: path to directory to be analyzed
|
|
// - config: Config object
|
|
func Build2_3(packageName string, dirRoot string, config *Config2_3) (*v2_3.Document, error) {
|
|
// build Package section first -- will include Files and make the
|
|
// package verification code available
|
|
pkg, err := builder2v3.BuildPackageSection2_3(packageName, dirRoot, config.PathsIgnored)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ci, err := builder2v3.BuildCreationInfoSection2_3(config.CreatorType, config.Creator, config.TestValues)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rln, err := builder2v3.BuildRelationshipSection2_3(packageName)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
doc := &v2_3.Document{
|
|
SPDXVersion: "SPDX-2.3",
|
|
DataLicense: "CC0-1.0",
|
|
SPDXIdentifier: common.ElementID("DOCUMENT"),
|
|
DocumentName: packageName,
|
|
DocumentNamespace: fmt.Sprintf("%s%s-%s", config.NamespacePrefix, packageName, pkg.PackageVerificationCode),
|
|
CreationInfo: ci,
|
|
Packages: []*v2_3.Package{pkg},
|
|
Relationships: []*v2_3.Relationship{rln},
|
|
}
|
|
|
|
return doc, nil
|
|
}
|