Skip to content

Commit a631cca

Browse files
committed
Add pip to dbotconf
requirements.txt files will now be tracked with dependabot. This is related to open-telemetry/opentelemetry-go#3996.
1 parent fefc7ef commit a631cca

File tree

7 files changed

+187
-83
lines changed

7 files changed

+187
-83
lines changed

dbotconf/internal/conf.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@ const (
1919
ghPkgEco = "github-actions"
2020
dockerPkgEco = "docker"
2121
gomodPkgEco = "gomod"
22+
pipPkgEco = "pip"
2223
)
2324

2425
var (
2526
weeklySchedule = schedule{Interval: "weekly", Day: "sunday"}
2627
actionLabels = []string{"dependencies", "actions", "Skip Changelog"}
2728
dockerLabels = []string{"dependencies", "docker", "Skip Changelog"}
2829
goLabels = []string{"dependencies", "go", "Skip Changelog"}
30+
pipLabels = []string{"dependencies", "pip", "Skip Changelog"}
2931
)
3032

3133
type dependabotConfig struct {

dbotconf/internal/generate.go

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const header = "# File generated by dbotconf; DO NOT EDIT."
3030
var buildConfigFunc = buildConfig
3131

3232
// buildConfig constructs a dependabotConfig for all modules in the repo.
33-
func buildConfig(root string, mods []*modfile.File, dockerFiles []string) (*dependabotConfig, error) {
33+
func buildConfig(root string, mods []*modfile.File, dockerFiles []string, pipFiles []string) (*dependabotConfig, error) {
3434
c := &dependabotConfig{
3535
Version: version2,
3636
Updates: []update{
@@ -70,6 +70,21 @@ func buildConfig(root string, mods []*modfile.File, dockerFiles []string) (*depe
7070
Schedule: weeklySchedule,
7171
})
7272
}
73+
74+
for _, p := range pipFiles {
75+
local, err := localPath(root, p)
76+
if err != nil {
77+
return nil, err
78+
}
79+
80+
c.Updates = append(c.Updates, update{
81+
PackageEcosystem: pipPkgEco,
82+
Directory: local,
83+
Labels: pipLabels,
84+
Schedule: weeklySchedule,
85+
})
86+
}
87+
7388
return c, nil
7489
}
7590

@@ -88,7 +103,12 @@ func generate() error {
88103
return err
89104
}
90105

91-
c, err := buildConfigFunc(root, mods, dockerFiles)
106+
pipFiles, err := allPipFunc(root)
107+
if err != nil {
108+
return err
109+
}
110+
111+
c, err := buildConfigFunc(root, mods, dockerFiles, pipFiles)
92112
if err != nil {
93113
return err
94114
}

dbotconf/internal/generate_test.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,11 @@ func TestBuildConfig(t *testing.T) {
6969
"/home/user/repo/a/",
7070
"/home/user/repo/b/",
7171
}
72+
pipFiles := []string{
73+
"/home/user/repo/requirements.txt",
74+
}
7275

73-
got, err := buildConfig(root, mods, dockerFiles)
76+
got, err := buildConfig(root, mods, dockerFiles, pipFiles)
7477
require.NoError(t, err)
7578
assert.Equal(t, &dependabotConfig{
7679
Version: version2,
@@ -82,6 +85,7 @@ func TestBuildConfig(t *testing.T) {
8285
newUpdate(gomodPkgEco, "/", goLabels),
8386
newUpdate(gomodPkgEco, "/a", goLabels),
8487
newUpdate(gomodPkgEco, "/b", goLabels),
88+
newUpdate(pipPkgEco, "/", pipLabels),
8589
},
8690
}, got)
8791
}
@@ -119,11 +123,17 @@ func TestRunGenerateReturnBuildConfigError(t *testing.T) {
119123
allDockerFunc = func(string) ([]string, error) {
120124
return nil, nil
121125
}
126+
t.Cleanup(func(f func(string) ([]string, error)) func() {
127+
return func() { allPipFunc = f }
128+
}(allPipFunc))
129+
allPipFunc = func(string) ([]string, error) {
130+
return nil, nil
131+
}
122132

123-
t.Cleanup(func(f func(string, []*modfile.File, []string) (*dependabotConfig, error)) func() {
133+
t.Cleanup(func(f func(string, []*modfile.File, []string, []string) (*dependabotConfig, error)) func() {
124134
return func() { buildConfigFunc = f }
125135
}(buildConfigFunc))
126-
buildConfigFunc = func(string, []*modfile.File, []string) (*dependabotConfig, error) {
136+
buildConfigFunc = func(string, []*modfile.File, []string, []string) (*dependabotConfig, error) {
127137
return nil, assert.AnError
128138
}
129139
assert.ErrorIs(t, generate(), assert.AnError)

dbotconf/internal/mods.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
var (
2828
allModsFunc = allMods
2929
allDockerFunc = allDocker
30+
allPipFunc = allPip
3031
configuredUpdatesFunc = configuredUpdates
3132
)
3233

@@ -51,6 +52,10 @@ func allDocker(root string) ([]string, error) {
5152
return repo.FindFilePatternDirs(root, "*Dockerfile*")
5253
}
5354

55+
func allPip(root string) ([]string, error) {
56+
return repo.FindFilePatternDirs(root, "*requirements.txt")
57+
}
58+
5459
// localModPath returns the dependabot appropriate directory name for module
5560
// mod that resides in a repo with root.
5661
func localModPath(root string, mod *modfile.File) (string, error) {
Lines changed: 63 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,66 @@
11
# File generated by dbotconf; DO NOT EDIT.
22
version: 2
33
updates:
4-
- package-ecosystem: github-actions
5-
directory: /
6-
labels:
7-
- dependencies
8-
- actions
9-
- Skip Changelog
10-
schedule:
11-
interval: weekly
12-
day: sunday
13-
- package-ecosystem: docker
14-
directory: /
15-
labels:
16-
- dependencies
17-
- docker
18-
- Skip Changelog
19-
schedule:
20-
interval: weekly
21-
day: sunday
22-
- package-ecosystem: docker
23-
directory: /a/b/example
24-
labels:
25-
- dependencies
26-
- docker
27-
- Skip Changelog
28-
schedule:
29-
interval: weekly
30-
day: sunday
31-
- package-ecosystem: gomod
32-
directory: /
33-
labels:
34-
- dependencies
35-
- actions
36-
- Skip Changelog
37-
schedule:
38-
interval: weekly
39-
day: sunday
40-
- package-ecosystem: gomod
41-
directory: /a
42-
labels:
43-
- dependencies
44-
- actions
45-
- Skip Changelog
46-
schedule:
47-
interval: weekly
48-
day: sunday
49-
- package-ecosystem: gomod
50-
directory: /a/b
51-
labels:
52-
- dependencies
53-
- actions
54-
- Skip Changelog
55-
schedule:
56-
interval: weekly
57-
day: sunday
4+
- package-ecosystem: github-actions
5+
directory: /
6+
labels:
7+
- dependencies
8+
- actions
9+
- Skip Changelog
10+
schedule:
11+
interval: weekly
12+
day: sunday
13+
- package-ecosystem: docker
14+
directory: /
15+
labels:
16+
- dependencies
17+
- docker
18+
- Skip Changelog
19+
schedule:
20+
interval: weekly
21+
day: sunday
22+
- package-ecosystem: docker
23+
directory: /a/b/example
24+
labels:
25+
- dependencies
26+
- docker
27+
- Skip Changelog
28+
schedule:
29+
interval: weekly
30+
day: sunday
31+
- package-ecosystem: gomod
32+
directory: /
33+
labels:
34+
- dependencies
35+
- actions
36+
- Skip Changelog
37+
schedule:
38+
interval: weekly
39+
day: sunday
40+
- package-ecosystem: gomod
41+
directory: /a
42+
labels:
43+
- dependencies
44+
- actions
45+
- Skip Changelog
46+
schedule:
47+
interval: weekly
48+
day: sunday
49+
- package-ecosystem: gomod
50+
directory: /a/b
51+
labels:
52+
- dependencies
53+
- actions
54+
- Skip Changelog
55+
schedule:
56+
interval: weekly
57+
day: sunday
58+
- package-ecosystem: pip
59+
directory: /
60+
labels:
61+
- dependencies
62+
- pip
63+
- Skip Changelog
64+
schedule:
65+
interval: weekly
66+
day: sunday

dbotconf/internal/verify.go

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,41 @@ var (
2929
errNotEnoughArg = errors.New("path argument required")
3030
)
3131

32-
// configuredUpdates returns the set of Go modules and Dockerfiles dependabot
32+
// configuredUpdates returns the set of Go modules, Dockerfiles, Pip requirements dependabot
3333
// is configured to check updates for.
34-
func configuredUpdates(path string) (mods map[string]struct{}, docker map[string]struct{}, err error) {
34+
func configuredUpdates(path string) (mods map[string]struct{}, docker map[string]struct{}, pip map[string]struct{}, err error) {
3535
f, err := os.Open(filepath.Clean(path))
3636
if errors.Is(err, os.ErrNotExist) {
37-
return nil, nil, fmt.Errorf("dependabot configuration file does not exist: %s", path)
37+
return nil, nil, nil, fmt.Errorf("dependabot configuration file does not exist: %s", path)
3838
}
3939
if err != nil {
40-
return nil, nil, fmt.Errorf("failed to read dependabot configuration file: %s", path)
40+
return nil, nil, nil, fmt.Errorf("failed to read dependabot configuration file: %s", path)
4141
}
4242

4343
var c dependabotConfig
4444
if err := yaml.NewDecoder(f).Decode(&c); err != nil {
45-
return nil, nil, fmt.Errorf("invalid dependabot configuration: %w", err)
45+
return nil, nil, nil, fmt.Errorf("invalid dependabot configuration: %w", err)
4646
}
4747

4848
mods = make(map[string]struct{})
4949
docker = make(map[string]struct{})
50+
pip = make(map[string]struct{})
5051
for _, u := range c.Updates {
5152
if u.PackageEcosystem == dockerPkgEco {
5253
docker[u.Directory] = struct{}{}
5354
}
5455
if u.PackageEcosystem == gomodPkgEco {
5556
mods[u.Directory] = struct{}{}
5657
}
58+
if u.PackageEcosystem == pipPkgEco {
59+
pip[u.Directory] = struct{}{}
60+
}
5761
}
58-
return mods, docker, nil
62+
return mods, docker, pip, nil
5963
}
6064

61-
// verify ensures dependabot configuration contains a check for all modules and
62-
// Dockerfiles.
65+
// verify ensures dependabot configuration contains a check for all modules,
66+
// Dockerfiles, and requirements.txt files.
6367
func verify(args []string) error {
6468
switch len(args) {
6569
case 0:
@@ -80,7 +84,12 @@ func verify(args []string) error {
8084
return err
8185
}
8286

83-
modUp, dockerUp, err := configuredUpdatesFunc(args[0])
87+
pipFiles, err := allPipFunc(root)
88+
if err != nil {
89+
return err
90+
}
91+
92+
modUp, dockerUp, pipUp, err := configuredUpdatesFunc(args[0])
8493
if err != nil {
8594
return err
8695
}
@@ -107,15 +116,29 @@ func verify(args []string) error {
107116
missingDocker = append(missingDocker, local)
108117
}
109118
}
119+
var missingPip []string
120+
for _, p := range pipFiles {
121+
local, err := localPath(root, p)
122+
if err != nil {
123+
return err
124+
}
125+
126+
if _, ok := pipUp[local]; !ok {
127+
missingPip = append(missingPip, local)
128+
}
129+
}
110130

111-
if len(missingMod) > 0 || len(missingDocker) > 0 {
131+
if len(missingMod) > 0 || len(missingDocker) > 0 || len(missingPip) > 0 {
112132
msg := "missing update check(s):"
113133
if len(missingMod) > 0 {
114134
msg = fmt.Sprintf("%s\n- Go mod files: %s", msg, strings.Join(missingMod, ", "))
115135
}
116136
if len(missingDocker) > 0 {
117137
msg = fmt.Sprintf("%s\n- Dockerfiles: %s", msg, strings.Join(missingDocker, ", "))
118138
}
139+
if len(missingPip) > 0 {
140+
msg = fmt.Sprintf("%s\n- Pip files: %s", msg, strings.Join(missingPip, ", "))
141+
}
119142
msg += "\n"
120143
return errors.New(msg)
121144
}

0 commit comments

Comments
 (0)