github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/packager/creator/differential.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package creator contains functions for creating Jackal packages.
     5  package creator
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  
    11  	"github.com/Racer159/jackal/src/config"
    12  	"github.com/Racer159/jackal/src/internal/packager/git"
    13  	"github.com/Racer159/jackal/src/pkg/layout"
    14  	"github.com/Racer159/jackal/src/pkg/packager/sources"
    15  	"github.com/Racer159/jackal/src/pkg/transform"
    16  	"github.com/Racer159/jackal/src/pkg/utils"
    17  	"github.com/Racer159/jackal/src/types"
    18  	"github.com/go-git/go-git/v5/plumbing"
    19  )
    20  
    21  // loadDifferentialData sets any images and repos from the existing reference package in the DifferentialData and returns it.
    22  func loadDifferentialData(diffPkgPath string) (diffData *types.DifferentialData, err error) {
    23  	tmpdir, err := utils.MakeTempDir(config.CommonOptions.TempDirectory)
    24  	if err != nil {
    25  		return nil, err
    26  	}
    27  
    28  	diffLayout := layout.New(tmpdir)
    29  	defer os.RemoveAll(diffLayout.Base)
    30  
    31  	src, err := sources.New(&types.JackalPackageOptions{
    32  		PackageSource: diffPkgPath,
    33  	})
    34  	if err != nil {
    35  		return nil, err
    36  	}
    37  
    38  	diffPkg, _, err := src.LoadPackageMetadata(diffLayout, false, false)
    39  	if err != nil {
    40  		return nil, err
    41  	}
    42  
    43  	allIncludedImagesMap := map[string]bool{}
    44  	allIncludedReposMap := map[string]bool{}
    45  
    46  	for _, component := range diffPkg.Components {
    47  		for _, image := range component.Images {
    48  			allIncludedImagesMap[image] = true
    49  		}
    50  		for _, repo := range component.Repos {
    51  			allIncludedReposMap[repo] = true
    52  		}
    53  	}
    54  
    55  	return &types.DifferentialData{
    56  		DifferentialImages:         allIncludedImagesMap,
    57  		DifferentialRepos:          allIncludedReposMap,
    58  		DifferentialPackageVersion: diffPkg.Metadata.Version,
    59  	}, nil
    60  }
    61  
    62  // removeCopiesFromComponents removes any images and repos already present in the reference package components.
    63  func removeCopiesFromComponents(components []types.JackalComponent, loadedDiffData *types.DifferentialData) (diffComponents []types.JackalComponent, err error) {
    64  	for _, component := range components {
    65  		newImageList := []string{}
    66  		newRepoList := []string{}
    67  
    68  		for _, img := range component.Images {
    69  			imgRef, err := transform.ParseImageRef(img)
    70  			if err != nil {
    71  				return nil, fmt.Errorf("unable to parse image ref %s: %s", img, err.Error())
    72  			}
    73  
    74  			imgTag := imgRef.TagOrDigest
    75  			includeImage := imgTag == ":latest" || imgTag == ":stable" || imgTag == ":nightly"
    76  			if includeImage || !loadedDiffData.DifferentialImages[img] {
    77  				newImageList = append(newImageList, img)
    78  			}
    79  		}
    80  
    81  		for _, repoURL := range component.Repos {
    82  			_, refPlain, err := transform.GitURLSplitRef(repoURL)
    83  			if err != nil {
    84  				return nil, err
    85  			}
    86  
    87  			var ref plumbing.ReferenceName
    88  			if refPlain != "" {
    89  				ref = git.ParseRef(refPlain)
    90  			}
    91  
    92  			includeRepo := ref == "" || (!ref.IsTag() && !plumbing.IsHash(refPlain))
    93  			if includeRepo || !loadedDiffData.DifferentialRepos[repoURL] {
    94  				newRepoList = append(newRepoList, repoURL)
    95  			}
    96  		}
    97  
    98  		component.Images = newImageList
    99  		component.Repos = newRepoList
   100  		diffComponents = append(diffComponents, component)
   101  	}
   102  
   103  	return diffComponents, nil
   104  }