-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdetect.go
More file actions
100 lines (80 loc) · 2.54 KB
/
detect.go
File metadata and controls
100 lines (80 loc) · 2.54 KB
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// SPDX-FileCopyrightText: © 2025 Idiap Research Institute <contact@idiap.ch>
// SPDX-FileContributor: Samuel Gaist <samuel.gaist@idiap.ch>
//
// SPDX-License-Identifier: Apache-2.0
package pythoninstallers
import (
"github.com/paketo-buildpacks/packit/v2"
"github.com/paketo-buildpacks/packit/v2/scribe"
miniconda "github.com/paketo-buildpacks/python-installers/pkg/installers/miniconda"
pip "github.com/paketo-buildpacks/python-installers/pkg/installers/pip"
pipenv "github.com/paketo-buildpacks/python-installers/pkg/installers/pipenv"
pixi "github.com/paketo-buildpacks/python-installers/pkg/installers/pixi"
poetry "github.com/paketo-buildpacks/python-installers/pkg/installers/poetry"
uv "github.com/paketo-buildpacks/python-installers/pkg/installers/uv"
)
// Detect will return a packit.DetectFunc that will be invoked during the
// detect phase of the buildpack lifecycle.
//
// If this buildpack detects files that indicate your app is a Python project,
// it will pass detection.
func Detect(logger scribe.Emitter, pyProjectParser poetry.PyProjectParser) packit.DetectFunc {
return func(context packit.DetectContext) (packit.DetectResult, error) {
plans := []packit.BuildPlan{}
pipResult, err := pip.Detect()(context)
if err == nil {
plans = append(plans, pipResult.Plan)
} else {
logger.Detail("%s", err)
}
minicondaResult, err := miniconda.Detect()(context)
if err == nil {
plans = append(plans, minicondaResult.Plan)
} else {
logger.Detail("%s", err)
}
pipenvResult, err := pipenv.Detect()(context)
if err == nil {
plans = append(plans, pipenvResult.Plan)
} else {
logger.Detail("%s", err)
}
poetryResult, err := poetry.Detect(pyProjectParser)(context)
if err == nil {
plans = append(plans, poetryResult.Plan)
} else {
logger.Detail("%s", err)
}
uvResult, err := uv.Detect()(context)
if err == nil {
plans = append(plans, uvResult.Plan)
} else {
logger.Detail("%s", err)
}
pixiResult, err := pixi.Detect()(context)
if err == nil {
plans = append(plans, pixiResult.Plan)
} else {
logger.Detail("%s", err)
}
if len(plans) == 0 {
return packit.DetectResult{}, packit.Fail.WithMessage("No python packager manager related files found")
}
return packit.DetectResult{
Plan: Or(plans...),
}, nil
}
}
func Or(plans ...packit.BuildPlan) packit.BuildPlan {
if len(plans) < 1 {
return packit.BuildPlan{}
}
combinedPlan := plans[0]
for i := range plans {
if i == 0 {
continue
}
combinedPlan.Or = append(combinedPlan.Or, plans[i])
}
return combinedPlan
}