Skip to content

Commit 7147d3b

Browse files
authored
Implement check-depends (#171)
* Initial commit * Base implementation * Add pault.ag/go/debian * Now parse d/control dependencies * Finalize parseGoModDependencies implementation * s/log/fmt * Add unit test * Use XS-Go-Import-Path to resolve module * Last fixes * Ignore .idea * check-depends: use vcs.RepoRootForImportPath This allows us to translate i.e from github.com/google/go-github/v38 to github.com/google/go-github. * Run gofmt
1 parent 04307a0 commit 7147d3b

File tree

6 files changed

+323
-7
lines changed

6 files changed

+323
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ dh-make-golang
22
_build/
33
*~
44
*.sw[op]
5+
.idea

check_depends.go

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"golang.org/x/mod/modfile"
6+
"golang.org/x/tools/go/vcs"
7+
"io/ioutil"
8+
"log"
9+
"os"
10+
"path/filepath"
11+
"pault.ag/go/debian/control"
12+
"strings"
13+
)
14+
15+
type dependency struct {
16+
importPath string
17+
packageName string
18+
// todo version?
19+
}
20+
21+
func execCheckDepends(args []string) {
22+
cwd, err := os.Getwd()
23+
if err != nil {
24+
log.Fatalf("error while getting current directory: %s", err)
25+
}
26+
27+
// Load the already packaged Go modules
28+
golangBinaries, err := getGolangBinaries()
29+
if err != nil {
30+
log.Fatalf("error while getting packaged Go modules: %s", err)
31+
}
32+
33+
// Load the dependencies defined in the Go module (go.mod)
34+
goModDepds, err := parseGoModDependencies(cwd, golangBinaries)
35+
if err != nil {
36+
log.Fatalf("error while parsing go.mod: %s", err)
37+
}
38+
39+
// Load the dependencies defined in the Debian packaging (d/control)
40+
packageDeps, err := parseDebianControlDependencies(cwd)
41+
if err != nil {
42+
log.Fatalf("error while parsing d/control: %s", err)
43+
}
44+
45+
hasChanged := false
46+
47+
// Check for newly introduced dependencies (defined in go.mod but not in d/control)
48+
for _, goModDep := range goModDepds {
49+
found := false
50+
51+
if goModDep.packageName == "" {
52+
fmt.Printf("NEW dependency %s is NOT yet packaged in Debian\n", goModDep.importPath)
53+
continue
54+
}
55+
56+
for _, packageDep := range packageDeps {
57+
if packageDep.packageName == goModDep.packageName {
58+
found = true
59+
break
60+
}
61+
}
62+
63+
if !found {
64+
hasChanged = true
65+
fmt.Printf("NEW dependency %s (%s)\n", goModDep.importPath, goModDep.packageName)
66+
}
67+
}
68+
69+
// Check for now unused dependencies (defined in d/control but not in go.mod)
70+
for _, packageDep := range packageDeps {
71+
found := false
72+
73+
for _, goModDep := range goModDepds {
74+
if goModDep.packageName == packageDep.packageName {
75+
found = true
76+
break
77+
}
78+
}
79+
80+
if !found {
81+
hasChanged = true
82+
fmt.Printf("RM dependency %s (%s)\n", packageDep.importPath, packageDep.packageName)
83+
}
84+
}
85+
86+
if !hasChanged {
87+
fmt.Printf("go.mod and d/control are in sync\n")
88+
}
89+
}
90+
91+
// parseGoModDependencies parse ALL dependencies listed in go.mod
92+
// i.e. it returns the one defined in go.mod as well as the transitively ones
93+
// TODO: this may not be the best way of doing thing since it requires the package to be converted to go module
94+
func parseGoModDependencies(directory string, goBinaries map[string]string) ([]dependency, error) {
95+
b, err := ioutil.ReadFile(filepath.Join(directory, "go.mod"))
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
modFile, err := modfile.Parse("go.mod", b, nil)
101+
if err != nil {
102+
return nil, err
103+
}
104+
105+
var dependencies []dependency
106+
for _, require := range modFile.Require {
107+
if !require.Indirect {
108+
packageName := ""
109+
110+
// Translate all packages to the root of their repository
111+
rr, err := vcs.RepoRootForImportPath(require.Mod.Path, false)
112+
if err != nil {
113+
log.Printf("Could not determine repo path for import path %q: %v\n", require.Mod.Path, err)
114+
continue
115+
}
116+
117+
if val, exists := goBinaries[rr.Root]; exists {
118+
packageName = val
119+
}
120+
121+
dependencies = append(dependencies, dependency{
122+
importPath: rr.Root,
123+
packageName: packageName,
124+
})
125+
}
126+
}
127+
128+
return dependencies, nil
129+
}
130+
131+
// parseDebianControlDependencies parse the Build-Depends defined in d/control
132+
func parseDebianControlDependencies(directory string) ([]dependency, error) {
133+
ctrl, err := control.ParseControlFile(filepath.Join(directory, "debian", "control"))
134+
if err != nil {
135+
return nil, err
136+
}
137+
138+
var dependencies []dependency
139+
140+
for _, bp := range ctrl.Source.BuildDepends.GetAllPossibilities() {
141+
packageName := strings.Trim(bp.Name, "\n")
142+
143+
// Ignore non -dev dependencies (i.e, debhelper-compat, git, cmake, etc...)
144+
if !strings.HasSuffix(packageName, "-dev") {
145+
continue
146+
}
147+
148+
dependencies = append(dependencies, dependency{
149+
importPath: "", // TODO XS-Go-Import-Path?
150+
packageName: packageName,
151+
})
152+
}
153+
154+
return dependencies, nil
155+
}

check_depends_test.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package main
2+
3+
import (
4+
"io/ioutil"
5+
"os"
6+
"path/filepath"
7+
"reflect"
8+
"testing"
9+
)
10+
11+
func TestParseDebianControlDependencies(t *testing.T) {
12+
f := `Source: terminews
13+
Maintainer: Debian Go Packaging Team <[email protected]>
14+
Uploaders:
15+
Aloïs Micard <[email protected]>,
16+
Section: news
17+
Testsuite: autopkgtest-pkg-go
18+
Priority: optional
19+
Build-Depends:
20+
debhelper-compat (= 13),
21+
dh-golang,
22+
golang-any,
23+
golang-github-advancedlogic-goose-dev,
24+
golang-github-fatih-color-dev,
25+
golang-github-jroimartin-gocui-dev,
26+
golang-github-mattn-go-sqlite3-dev,
27+
golang-github-mmcdole-gofeed-dev,
28+
Standards-Version: 4.5.1
29+
Vcs-Browser: https://salsa.debian.org/go-team/packages/terminews
30+
Vcs-Git: https://salsa.debian.org/go-team/packages/terminews.git
31+
Homepage: https://github.com/antavelos/terminews
32+
Rules-Requires-Root: no
33+
XS-Go-Import-Path: github.com/antavelos/terminews
34+
35+
Package: terminews
36+
Architecture: any
37+
Depends:
38+
${misc:Depends},
39+
${shlibs:Depends},
40+
Built-Using:
41+
${misc:Built-Using},
42+
Description: read your RSS feeds from your terminal
43+
Terminews is a terminal based application (TUI)
44+
that allows you to manage RSS resources and display their news feeds.
45+
`
46+
tmpDir, err := ioutil.TempDir("", "dh-make-golang")
47+
if err != nil {
48+
t.Fatalf("Could not create temp dir: %v", err)
49+
}
50+
defer os.RemoveAll(tmpDir)
51+
52+
if err := os.MkdirAll(filepath.Join(tmpDir, "dummy-package", "debian"), 0750); err != nil {
53+
t.Fatalf("Could not create dummy Debian package: %v", err)
54+
}
55+
if err := ioutil.WriteFile(filepath.Join(tmpDir, "dummy-package", "debian", "control"), []byte(f), 0640); err != nil {
56+
t.Fatalf("Could not create dummy Debian package: %v", err)
57+
}
58+
59+
deps, err := parseDebianControlDependencies(filepath.Join(tmpDir, "dummy-package"))
60+
if err != nil {
61+
t.Fatalf("Could not parse Debian package dependencies: %v", err)
62+
63+
}
64+
65+
want := []dependency{
66+
{
67+
importPath: "",
68+
packageName: "golang-github-advancedlogic-goose-dev",
69+
},
70+
{
71+
importPath: "",
72+
packageName: "golang-github-fatih-color-dev",
73+
}, {
74+
importPath: "",
75+
packageName: "golang-github-jroimartin-gocui-dev",
76+
},
77+
{
78+
importPath: "",
79+
packageName: "golang-github-mattn-go-sqlite3-dev",
80+
},
81+
{
82+
importPath: "",
83+
packageName: "golang-github-mmcdole-gofeed-dev",
84+
},
85+
}
86+
87+
if !reflect.DeepEqual(deps, want) {
88+
t.Fatalf("Wrong dependencies returned (got %v want %v)", deps, want)
89+
}
90+
}
91+
92+
func TestParseGoModDependencies(t *testing.T) {
93+
f := `module github.com/Debian/dh-make-golang
94+
95+
go 1.16
96+
97+
require (
98+
github.com/charmbracelet/glamour v0.3.0
99+
github.com/google/go-github/v38 v38.1.0
100+
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79
101+
)`
102+
tmpDir, err := ioutil.TempDir("", "dh-make-golang")
103+
if err != nil {
104+
t.Fatalf("Could not create temp dir: %v", err)
105+
}
106+
defer os.RemoveAll(tmpDir)
107+
108+
if err := os.MkdirAll(filepath.Join(tmpDir, "dummy-package"), 0750); err != nil {
109+
t.Fatalf("Could not create dummy Debian package: %v", err)
110+
}
111+
if err := ioutil.WriteFile(filepath.Join(tmpDir, "dummy-package", "go.mod"), []byte(f), 0640); err != nil {
112+
t.Fatalf("Could not create dummy Debian package: %v", err)
113+
}
114+
115+
deps, err := parseGoModDependencies(filepath.Join(tmpDir, "dummy-package"), map[string]string{
116+
"github.com/charmbracelet/glamour": "golang-github-charmbracelet-glamour-dev",
117+
"github.com/google/go-github": "golang-github-google-go-github-dev",
118+
"github.com/gregjones/httpcache": "golang-github-gregjones-httpcache-dev",
119+
})
120+
if err != nil {
121+
t.Fatalf("Could not parse go.mod dependencies: %v", err)
122+
123+
}
124+
125+
want := []dependency{
126+
{
127+
importPath: "github.com/charmbracelet/glamour",
128+
packageName: "golang-github-charmbracelet-glamour-dev",
129+
},
130+
{
131+
importPath: "github.com/google/go-github",
132+
packageName: "golang-github-google-go-github-dev",
133+
}, {
134+
importPath: "github.com/gregjones/httpcache",
135+
packageName: "golang-github-gregjones-httpcache-dev",
136+
},
137+
}
138+
139+
if !reflect.DeepEqual(deps, want) {
140+
t.Fatalf("Wrong dependencies returned (got %v want %v)", deps, want)
141+
}
142+
}

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ require (
77
github.com/google/go-github/v38 v38.1.0
88
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79
99
github.com/mattn/go-isatty v0.0.12
10+
golang.org/x/mod v0.5.1 // indirect
1011
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c
1112
golang.org/x/sync v0.0.0-20190423024810-112230192c58
12-
golang.org/x/tools v0.0.0-20190731163215-a81e99d7481f
13+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e
14+
pault.ag/go/debian v0.12.0
1315
)

go.sum

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U=
1+
github.com/DataDog/zstd v1.4.8/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
22
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
33
github.com/alecthomas/chroma v0.8.2 h1:x3zkuE2lUk/RIekyAJ3XRqSCP4zwWDfcw/YJCuCAACg=
44
github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM=
5-
github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo=
65
github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0=
76
github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE=
8-
github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY=
97
github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ=
108
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
119
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
@@ -18,7 +16,6 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
1816
github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk=
1917
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
2018
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
21-
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
2219
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
2320
github.com/google/go-github/v38 v38.1.0 h1:C6h1FkaITcBFK7gAmq4eFzt6gbhEhk7L5z6R3Uva+po=
2421
github.com/google/go-github/v38 v38.1.0/go.mod h1:cStvrz/7nFr0FoENgG6GLbp53WaelXucT+BBz/3VKx4=
@@ -28,6 +25,7 @@ github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
2825
github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
2926
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
3027
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
28+
github.com/kjk/lzma v0.0.0-20161016003348-3fd93898850d/go.mod h1:phT/jsRPBAEqjAibu1BurrabCBNTYiVI+zbmyCZJY6Q=
3129
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
3230
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
3331
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
@@ -49,26 +47,32 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE
4947
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
5048
github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY=
5149
github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
52-
github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
5350
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
5451
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
5552
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
5653
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
54+
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
5755
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
5856
github.com/yuin/goldmark v1.3.3 h1:37BdQwPx8VOSic8eDSWee6QL9mRpZRm9VJp/QugNrW0=
5957
github.com/yuin/goldmark v1.3.3/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
6058
github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os=
6159
github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ=
62-
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
6360
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
61+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
62+
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E=
63+
golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
64+
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
65+
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
6466
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
67+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
6568
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
6669
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c h1:KHUzaHIpjWVlVVNh65G3hhuj3KB1HnjY6Cq5cTvRQT8=
6770
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
6871
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
6972
golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
7073
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
7174
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
75+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7276
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7377
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
7478
golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -81,5 +85,14 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
8185
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
8286
golang.org/x/tools v0.0.0-20190731163215-a81e99d7481f h1:vwy91pya0J00SsPf35DrwOUOe/76iE4RbegH6XWNn9I=
8387
golang.org/x/tools v0.0.0-20190731163215-a81e99d7481f/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
88+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e h1:aZzprAO9/8oim3qStq3wc1Xuxx4QmAGriC4VU4ojemQ=
89+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
90+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
91+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
92+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
8493
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
8594
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
95+
pault.ag/go/debian v0.12.0 h1:b8ctSdBSGJ98NE1VLn06aSx70EUpczlP2qqSHEiYYJA=
96+
pault.ag/go/debian v0.12.0/go.mod h1:UbnMr3z/KZepjq7VzbYgBEfz8j4+Pyrm2L5X1fzhy/k=
97+
pault.ag/go/topsort v0.0.0-20160530003732-f98d2ad46e1a h1:WwS7vlB5H2AtwKj1jsGwp2ZLud1x6WXRXh2fXsRqrcA=
98+
pault.ag/go/topsort v0.0.0-20160530003732-f98d2ad46e1a/go.mod h1:INqx0ClF7kmPAMk2zVTX8DRnhZ/yaA/Mg52g8KFKE7k=

0 commit comments

Comments
 (0)