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 }