syft/syft/pkg/conda.go
Alex Goodman a77d24e379
Improve struct and field comments and incorporate into json schema (#4252)
* improve struct and field comments and incorporate into json schema

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>

* address review feedback

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>

---------

Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com>
2025-10-03 17:01:56 +00:00

122 lines
4.1 KiB
Go

package pkg
import (
"sort"
"github.com/scylladb/go-set/strset"
)
// CondaPathData represents metadata for a single file within a Conda package from the paths.json file.
type CondaPathData struct {
// Path is the file path relative to the Conda environment root.
Path string `json:"_path"`
// PathType indicates the link type for the file (e.g., "hardlink", "softlink", "directory").
PathType string `json:"path_type"`
// SHA256 is the SHA-256 hash of the file contents.
SHA256 string `json:"sha256"`
// SHA256InPrefix is the SHA-256 hash of the file after prefix replacement during installation.
SHA256InPrefix string `json:"sha256_in_prefix"`
// SizeInBytes is the file size in bytes.
SizeInBytes int64 `json:"size_in_bytes"`
}
// CondaPathsData represents the paths.json file structure from a Conda package containing file metadata.
type CondaPathsData struct {
// PathsVersion is the schema version of the paths data format.
PathsVersion int `json:"paths_version"`
// Paths is the list of file metadata entries for all files in the package.
Paths []CondaPathData `json:"paths"`
}
// CondaLink represents link metadata from a Conda package's link.json file describing package installation source.
type CondaLink struct {
// Source is the original path where the package was extracted from cache.
Source string `json:"source"`
// Type indicates the link type (1 for hard link, 2 for soft link, 3 for copy).
Type int `json:"type"`
}
// CondaMetaPackage represents metadata for a Conda package extracted from the conda-meta/*.json files.
type CondaMetaPackage struct {
// Arch is the target CPU architecture for the package (e.g., "arm64", "x86_64").
Arch string `json:"arch,omitempty"`
// Name is the package name as found in the conda-meta JSON file.
Name string `json:"name"`
// Version is the package version as found in the conda-meta JSON file.
Version string `json:"version"`
// Build is the build string identifier (e.g., "h90dfc92_1014").
Build string `json:"build"`
// BuildNumber is the sequential build number for this version.
BuildNumber int `json:"build_number"`
// Channel is the Conda channel URL where the package was retrieved from.
Channel string `json:"channel,omitempty"`
// Subdir is the subdirectory within the channel (e.g., "osx-arm64", "linux-64").
Subdir string `json:"subdir,omitempty"`
// Noarch indicates if the package is platform-independent (e.g., "python", "generic").
Noarch string `json:"noarch,omitempty"`
// License is the package license identifier.
License string `json:"license,omitempty"`
// LicenseFamily is the general license category (e.g., "MIT", "Apache", "GPL").
LicenseFamily string `json:"license_family,omitempty"`
// MD5 is the MD5 hash of the package archive.
MD5 string `json:"md5,omitempty"`
// SHA256 is the SHA-256 hash of the package archive.
SHA256 string `json:"sha256,omitempty"`
// Size is the package archive size in bytes.
Size int64 `json:"size,omitempty"`
// Timestamp is the Unix timestamp when the package was built.
Timestamp int64 `json:"timestamp,omitempty"`
// Filename is the original package archive filename (e.g., "zlib-1.2.11-h90dfc92_1014.tar.bz2").
Filename string `json:"fn,omitempty"`
// URL is the full download URL for the package archive.
URL string `json:"url,omitempty"`
// ExtractedPackageDir is the local cache directory where the package was extracted.
ExtractedPackageDir string `json:"extracted_package_dir,omitempty"`
// Depends is the list of runtime dependencies with version constraints.
Depends []string `json:"depends,omitempty"`
// Files is the list of files installed by this package.
Files []string `json:"files,omitempty"`
// PathsData contains detailed file metadata from the paths.json file.
PathsData *CondaPathsData `json:"paths_data,omitempty"`
// Link contains installation source metadata from the link.json file.
Link *CondaLink `json:"link,omitempty"`
}
func (m CondaMetaPackage) OwnedFiles() (result []string) {
s := strset.New()
for _, f := range m.Files {
if f != "" {
s.Add(f)
}
}
result = s.List()
sort.Strings(result)
return result
}