Skip to content

Commit 0ebcb78

Browse files
committed
Add check for forgotten library.properties version bump
1 parent 5a56b42 commit 0ebcb78

File tree

9 files changed

+259
-0
lines changed

9 files changed

+259
-0
lines changed

Diff for: check/checkconfigurations/checkconfigurations.go

+15
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,21 @@ var configurations = []Type{
371371
ErrorModes: []checkmode.Type{checkmode.Strict},
372372
CheckFunction: checkfunctions.LibraryPropertiesVersionFieldNonSemver,
373373
},
374+
{
375+
ProjectType: projecttype.Library,
376+
Category: "library.properties",
377+
Subcategory: "version field",
378+
ID: "",
379+
Brief: "tag mismatch",
380+
Description: "The Library Manager indexer will reject any tag that has a library.properties version equal to a previous tag in the index.",
381+
MessageTemplate: "The latest Git tag appears to be greater than the library.properties version value: {{.}}. You must update the version value before making the tag.",
382+
DisableModes: []checkmode.Type{checkmode.Default},
383+
EnableModes: []checkmode.Type{checkmode.LibraryManagerIndexed},
384+
InfoModes: nil,
385+
WarningModes: []checkmode.Type{checkmode.Default},
386+
ErrorModes: []checkmode.Type{checkmode.Strict},
387+
CheckFunction: checkfunctions.LibraryPropertiesVersionFieldBehindTag,
388+
},
374389
{
375390
ProjectType: projecttype.Library,
376391
Category: "library.properties",

Diff for: check/checkfunctions/library.go

+98
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package checkfunctions
1818
// The check functions for libraries.
1919

2020
import (
21+
"fmt"
2122
"net/http"
2223
"os"
2324
"path/filepath"
@@ -33,7 +34,11 @@ import (
3334
"github.com/arduino/arduino-cli/arduino/libraries"
3435
"github.com/arduino/arduino-cli/arduino/utils"
3536
"github.com/arduino/go-properties-orderedmap"
37+
"github.com/go-git/go-git/v5"
38+
"github.com/go-git/go-git/v5/plumbing"
39+
"github.com/go-git/go-git/v5/plumbing/object"
3640
"github.com/sirupsen/logrus"
41+
semver "go.bug.st/relaxed-semver"
3742
)
3843

3944
// LibraryPropertiesFormat checks for invalid library.properties format.
@@ -381,6 +386,99 @@ func LibraryPropertiesVersionFieldNonSemver() (result checkresult.Type, output s
381386
return checkresult.Pass, ""
382387
}
383388

389+
// LibraryPropertiesVersionFieldBehindTag checks whether a release tag was made without first bumping the library.properties version value.
390+
func LibraryPropertiesVersionFieldBehindTag() (result checkresult.Type, output string) {
391+
if checkdata.ProjectType() != checkdata.SuperProjectType() {
392+
return checkresult.NotRun, "Not relevant for subprojects"
393+
}
394+
395+
if checkdata.LibraryPropertiesLoadError() != nil {
396+
return checkresult.NotRun, "Couldn't load library.properties"
397+
}
398+
399+
versionString, ok := checkdata.LibraryProperties().GetOk("version")
400+
if !ok {
401+
return checkresult.NotRun, "Field not present"
402+
}
403+
404+
version, err := semver.Parse(versionString)
405+
if err != nil {
406+
return checkresult.NotRun, "Can't parse version value"
407+
}
408+
logrus.Tracef("version value: %s", version)
409+
410+
repository, err := git.PlainOpen(checkdata.ProjectPath().String())
411+
if err != nil {
412+
return checkresult.NotRun, "Project path is not a repository"
413+
}
414+
415+
headRef, err := repository.Head()
416+
if err != nil {
417+
panic(err)
418+
}
419+
420+
headCommit, err := repository.CommitObject(headRef.Hash())
421+
if err != nil {
422+
panic(err)
423+
}
424+
425+
commits := object.NewCommitIterCTime(headCommit, nil, nil) // Get iterator for the head commit and all its parents in chronological commit time order.
426+
427+
tagRefs, err := repository.Tags() // Get an iterator of the refs of the repository's tags. These are not in a useful order, so it's necessary to cross-reference them against the commits, which are.
428+
429+
for { // Iterate over all commits in reverse chronological order.
430+
commit, err := commits.Next()
431+
if err != nil {
432+
// Reached end of commits.
433+
break
434+
}
435+
436+
for { // Iterate over all tag refs.
437+
tagRef, err := tagRefs.Next()
438+
if err != nil {
439+
// Reached end of tags
440+
break
441+
}
442+
443+
// Annotated tags have their own hash, different from the commit hash, so they must be resolved before comparing with the commit.
444+
resolvedTagRef, err := repository.ResolveRevision(plumbing.Revision(tagRef.Hash().String()))
445+
if err != nil {
446+
panic(err)
447+
}
448+
449+
if commit.Hash == *resolvedTagRef {
450+
logrus.Tracef("Found tag: %s", tagRef.Name())
451+
452+
tagName := strings.TrimPrefix(tagRef.Name().String(), "refs/tags/")
453+
tagName = strings.TrimPrefix(tagName, "v") // It's common practice to prefix release tag names with "v".
454+
tagVersion, err := semver.Parse(tagName)
455+
if err != nil {
456+
// The normalized tag name is not a recognizable "relaxed semver" version.
457+
logrus.Tracef("Can't parse tag name.")
458+
break // Disregard unparsable tags.
459+
}
460+
logrus.Tracef("Tag version: %s", tagVersion)
461+
462+
if tagVersion.GreaterThan(version) {
463+
logrus.Tracef("Tag is greater.")
464+
465+
if strings.Contains(tagVersion.String(), "-") {
466+
// The lack of version bump may have been intentional.
467+
logrus.Tracef("Tag is pre-release.")
468+
break
469+
}
470+
471+
return checkresult.Fail, fmt.Sprintf("%s vs %s", tagName, versionString)
472+
}
473+
474+
return checkresult.Pass, "" // Tag is less than or equal to version field value, all is well.
475+
}
476+
}
477+
}
478+
479+
return checkresult.Pass, "" // No problems were found.
480+
}
481+
384482
// LibraryPropertiesAuthorFieldMissing checks for missing library.properties "author" field.
385483
func LibraryPropertiesAuthorFieldMissing() (result checkresult.Type, output string) {
386484
if checkdata.LibraryPropertiesLoadError() != nil {

Diff for: check/checkfunctions/library_test.go

+107
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ import (
1919
"os"
2020
"regexp"
2121
"testing"
22+
"time"
2223

2324
"github.com/arduino/arduino-check/check/checkdata"
2425
"github.com/arduino/arduino-check/check/checkresult"
2526
"github.com/arduino/arduino-check/project"
2627
"github.com/arduino/arduino-check/project/projecttype"
2728
"github.com/arduino/go-paths-helper"
29+
"github.com/go-git/go-git/v5"
30+
"github.com/go-git/go-git/v5/plumbing/object"
2831
"github.com/stretchr/testify/assert"
2932
"github.com/stretchr/testify/require"
3033
)
@@ -152,6 +155,110 @@ func TestLibraryPropertiesNameFieldHeaderMismatch(t *testing.T) {
152155
checkLibraryCheckFunction(LibraryPropertiesNameFieldHeaderMismatch, testTables, t)
153156
}
154157

158+
func TestLibraryPropertiesVersionFieldBehindTag(t *testing.T) {
159+
// Set up the test repository folders.
160+
TagPrereleaseGreaterPath := librariesTestDataPath.Join("TagPrereleaseGreater")
161+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(TagPrereleaseGreaterPath))
162+
defer TagPrereleaseGreaterPath.RemoveAll()
163+
164+
TagGreaterPath := librariesTestDataPath.Join("TagGreater")
165+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(TagGreaterPath))
166+
defer TagGreaterPath.RemoveAll()
167+
168+
LightweightTagGreaterPath := librariesTestDataPath.Join("LightweightTagGreater")
169+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(LightweightTagGreaterPath))
170+
defer LightweightTagGreaterPath.RemoveAll()
171+
172+
TagMatchPath := librariesTestDataPath.Join("TagMatch")
173+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(TagMatchPath))
174+
defer TagMatchPath.RemoveAll()
175+
176+
LightweightTagMatchPath := librariesTestDataPath.Join("LightweightTagMatch")
177+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(LightweightTagMatchPath))
178+
defer LightweightTagMatchPath.RemoveAll()
179+
180+
TagMatchWithPrefixPath := librariesTestDataPath.Join("TagMatchWithPrefix")
181+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(TagMatchWithPrefixPath))
182+
defer TagMatchWithPrefixPath.RemoveAll()
183+
184+
TagLessThanPath := librariesTestDataPath.Join("TagLessThan")
185+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(TagLessThanPath))
186+
defer TagLessThanPath.RemoveAll()
187+
188+
TagNotVersionPath := librariesTestDataPath.Join("TagNotVersion")
189+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(TagNotVersionPath))
190+
defer TagNotVersionPath.RemoveAll()
191+
192+
NoTagsPath := librariesTestDataPath.Join("NoTags")
193+
require.Nil(t, librariesTestDataPath.Join("Recursive").CopyDirTo(NoTagsPath))
194+
defer NoTagsPath.RemoveAll()
195+
196+
// Test repositories are generated on the fly.
197+
gitInitAndTag := func(t *testing.T, repositoryPath *paths.Path, tagName string, annotated bool) string {
198+
repository, err := git.PlainInit(repositoryPath.String(), false)
199+
require.Nil(t, err)
200+
worktree, err := repository.Worktree()
201+
require.Nil(t, err)
202+
_, err = worktree.Add(".")
203+
require.Nil(t, err)
204+
205+
signature := &object.Signature{
206+
Name: "Jane Developer",
207+
208+
When: time.Now(),
209+
}
210+
211+
_, err = worktree.Commit(
212+
"Test commit message",
213+
&git.CommitOptions{
214+
Author: signature,
215+
},
216+
)
217+
require.Nil(t, err)
218+
219+
headRef, err := repository.Head()
220+
require.Nil(t, err)
221+
222+
if tagName != "" {
223+
// Annotated and lightweight tags are significantly different, so it's important to ensure the check code works correctly with both.
224+
if annotated {
225+
_, err = repository.CreateTag(
226+
tagName,
227+
headRef.Hash(),
228+
&git.CreateTagOptions{
229+
Tagger: signature,
230+
Message: tagName,
231+
},
232+
)
233+
} else {
234+
_, err = repository.CreateTag(tagName, headRef.Hash(), nil)
235+
}
236+
require.Nil(t, err)
237+
}
238+
239+
return repositoryPath.Base()
240+
}
241+
242+
testTables := []libraryCheckFunctionTestTable{
243+
// TODO: Test NotRun if subproject
244+
{"Unable to load", "InvalidLibraryProperties", checkresult.NotRun, ""},
245+
{"Legacy", "Legacy", checkresult.NotRun, ""},
246+
{"Unparsable version", "VersionFormatInvalid", checkresult.NotRun, ""},
247+
{"Not repo", "Recursive", checkresult.NotRun, ""},
248+
{"Tag name not a version", gitInitAndTag(t, TagNotVersionPath, "foo", true), checkresult.Pass, ""},
249+
{"Match w/ tag prefix", gitInitAndTag(t, TagMatchWithPrefixPath, "1.0.0", true), checkresult.Pass, ""},
250+
{"Pre-release tag greater", gitInitAndTag(t, TagPrereleaseGreaterPath, "1.0.1-rc1", true), checkresult.Pass, ""},
251+
{"Tag greater", gitInitAndTag(t, TagGreaterPath, "1.0.1", true), checkresult.Fail, ""},
252+
{"Lightweight tag greater", gitInitAndTag(t, LightweightTagGreaterPath, "1.0.1", false), checkresult.Fail, ""},
253+
{"Tag matches", gitInitAndTag(t, TagMatchPath, "1.0.0", true), checkresult.Pass, ""},
254+
{"Lightweight tag matches", gitInitAndTag(t, LightweightTagMatchPath, "1.0.0", false), checkresult.Pass, ""},
255+
{"Tag less than version", gitInitAndTag(t, TagLessThanPath, "0.1.0", true), checkresult.Pass, ""},
256+
{"No tags", gitInitAndTag(t, NoTagsPath, "", true), checkresult.Pass, ""},
257+
}
258+
259+
checkLibraryCheckFunction(LibraryPropertiesVersionFieldBehindTag, testTables, t)
260+
}
261+
155262
func TestLibraryPropertiesSentenceFieldSpellCheck(t *testing.T) {
156263
testTables := []libraryCheckFunctionTestTable{
157264
{"Unable to load", "InvalidLibraryProperties", checkresult.NotRun, ""},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=Version1.0.0
2+
version=1.0.0
3+
author=Cristian Maglie <[email protected]>, Pippo Pluto <[email protected]>
4+
maintainer=Cristian Maglie <[email protected]>
5+
sentence=A library that makes coding a web server a breeze.
6+
paragraph=Supports HTTP1.1 and you can do GET and POST.
7+
category=Communication
8+
url=http://example.com/
9+
architectures=avr

Diff for: check/checkfunctions/testdata/libraries/Version1.0.0/src/Version1.0.0.h

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name=VersionFormatInvalid
2+
version=foo
3+
author=Cristian Maglie <[email protected]>, Pippo Pluto <[email protected]>
4+
maintainer=Cristian Maglie <[email protected]>
5+
sentence=A library that makes coding a web server a breeze.
6+
paragraph=Supports HTTP1.1 and you can do GET and POST.
7+
category=Communication
8+
url=http://example.com/
9+
architectures=avr

Diff for: check/checkfunctions/testdata/libraries/VersionFormatInvalid/src/VersionFormatInvalid.h

Whitespace-only changes.

Diff for: go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ require (
77
github.com/arduino/go-paths-helper v1.3.2
88
github.com/arduino/go-properties-orderedmap v1.4.0
99
github.com/client9/misspell v0.3.4
10+
github.com/go-git/go-git/v5 v5.2.0
1011
github.com/ory/jsonschema/v3 v3.0.1
1112
github.com/sirupsen/logrus v1.6.0
1213
github.com/spf13/cobra v1.0.1-0.20200710201246-675ae5f5a98c
1314
github.com/spf13/pflag v1.0.3
1415
github.com/stretchr/testify v1.6.1
1516
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415
1617
github.com/xeipuuv/gojsonschema v1.2.0
18+
go.bug.st/relaxed-semver v0.0.0-20190922224835-391e10178d18
1719
)

Diff for: go.sum

+19
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,11 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8
2020
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
2121
github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
2222
github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
23+
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs=
2324
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
2425
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
2526
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
27+
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA=
2628
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
2729
github.com/arduino/arduino-cli v0.0.0-20201124150942-8d026eddbfb4 h1:JwDx5LSWigpw6GZK+1iYSrkh3PDsAeZZ0fDWaUehKD8=
2830
github.com/arduino/arduino-cli v0.0.0-20201124150942-8d026eddbfb4/go.mod h1:PpHwX4OKp/PFumezvkSRixh5N9uLiCASm3gqK/Da5is=
@@ -40,6 +42,7 @@ github.com/arduino/go-timeutils v0.0.0-20171220113728-d1dd9e313b1b/go.mod h1:uwG
4042
github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b h1:3PjgYG5gVPA7cipp7vIR2lF96KkEJIFBJ+ANnuv6J20=
4143
github.com/arduino/go-win32-utils v0.0.0-20180330194947-ed041402e83b/go.mod h1:iIPnclBMYm1g32Q5kXoqng4jLhMStReIP7ZxaoUC2y8=
4244
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
45+
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
4346
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
4447
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
4548
github.com/aws/aws-sdk-go v1.23.19/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
@@ -110,12 +113,22 @@ github.com/fluxio/iohelpers v0.0.0-20160419043813-3a4dd67a94d2 h1:C6sOwknxwWfLBE
110113
github.com/fluxio/iohelpers v0.0.0-20160419043813-3a4dd67a94d2/go.mod h1:c7sGIpDbBo0JZZ1tKyC1p5smWf8QcUjK4bFtZjHAecg=
111114
github.com/fluxio/multierror v0.0.0-20160419044231-9c68d39025e5 h1:R8jFW6G/bjoXjWPFrEfw9G5YQDlYhwV4AC+Eonu6wmk=
112115
github.com/fluxio/multierror v0.0.0-20160419044231-9c68d39025e5/go.mod h1:BEUDl7FG1cc76sM0J0x8dqr6RhiL4uqvk6oFkwuNyuM=
116+
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ=
113117
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
114118
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
115119
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
116120
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
121+
github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0=
117122
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
118123
github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo=
124+
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
125+
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
126+
github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM=
127+
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
128+
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M=
129+
github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
130+
github.com/go-git/go-git/v5 v5.2.0 h1:YPBLG/3UK1we1ohRkncLjaXWLW+HKp5QNM/jTli2JgI=
131+
github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs=
119132
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
120133
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
121134
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
@@ -355,6 +368,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
355368
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
356369
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
357370
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
371+
github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg=
372+
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
358373
github.com/imjasonmiller/godice v0.1.2 h1:T1/sW/HoDzFeuwzOOuQjmeMELz9CzZ53I2CnD+08zD4=
359374
github.com/imjasonmiller/godice v0.1.2/go.mod h1:8cTkdnVI+NglU2d6sv+ilYcNaJ5VSTBwvMbFULJd/QQ=
360375
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
@@ -685,6 +700,7 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
685700
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
686701
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
687702
golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
703+
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
688704
golang.org/x/crypto v0.0.0-20200406173513-056763e48d71 h1:DOmugCavvUtnUD114C1Wh+UgTgQZ4pMLzXxi1pSt+/Y=
689705
golang.org/x/crypto v0.0.0-20200406173513-056763e48d71/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
690706
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -727,6 +743,7 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
727743
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
728744
golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
729745
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
746+
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
730747
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k=
731748
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
732749
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -773,6 +790,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w
773790
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
774791
golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
775792
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
793+
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
776794
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
777795
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009 h1:W0lCpv29Hv0UaM1LXb9QlBHLNP8UFfcKjblhVCWftOM=
778796
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -884,6 +902,7 @@ gopkg.in/square/go-jose.v2 v2.1.9/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76
884902
gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
885903
gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg=
886904
gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98=
905+
gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg=
887906
gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g=
888907
gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE=
889908
gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8=

0 commit comments

Comments
 (0)