-
Notifications
You must be signed in to change notification settings - Fork 4
/
output_slicer.go
86 lines (73 loc) · 2.13 KB
/
output_slicer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package dotnetpublish
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/paketo-buildpacks/dotnet-publish/internal"
"github.com/paketo-buildpacks/packit/v2"
)
type namedSlices map[string]map[string]string
func addPath(slices namedSlices, name, element string) namedSlices {
if _, ok := slices[name]; !ok {
slices[name] = map[string]string{}
}
slices[name][element] = ""
return slices
}
type OutputSlicer struct{}
func NewOutputSlicer() OutputSlicer {
return OutputSlicer{}
}
func (s OutputSlicer) Slice(assetsFile string) (pkgs, earlyPkgs, projects packit.Slice, err error) {
contents, err := os.Open(assetsFile)
if err != nil {
return packit.Slice{}, packit.Slice{}, packit.Slice{}, fmt.Errorf("opening assets file to identify output slices: %w", err)
}
defer contents.Close()
var assets internal.ProjectAssetsJSON
dec := json.NewDecoder(contents)
err = dec.Decode(&assets)
if err != nil {
return packit.Slice{}, packit.Slice{}, packit.Slice{}, fmt.Errorf("decoding JSON to identify output slices: %w", err)
}
slices := namedSlices{}
for _, target := range assets.Targets {
for _, dep := range target.Dependencies {
if dep.Type != "package" && dep.Type != "project" {
continue
}
if dep.Type == "package" {
version := strings.Split(dep.Name, "/")[1] // back half of dep name is version
if strings.Contains(version, "-") { // version with dash is a release candidate or beta
dep.Type = "early-package"
}
}
for _, runtime := range dep.RuntimeDependencies {
file := filepath.Base(string(runtime))
if file != "" && file != "_._" {
slices = addPath(slices, dep.Type, file)
}
}
for _, rt := range dep.RuntimeTargets {
slices = addPath(slices, dep.Type, filepath.Base(rt.FileName))
}
}
}
for name, paths := range slices {
var slicePaths *[]string
switch name {
case "package":
slicePaths = &pkgs.Paths
case "early-package":
slicePaths = &earlyPkgs.Paths
case "project":
slicePaths = &projects.Paths
}
for path := range paths {
*slicePaths = append(*slicePaths, path)
}
}
return pkgs, earlyPkgs, projects, nil
}