From 067d79c7b46a4f466292c4cadad41d2facffae93 Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Fri, 22 May 2026 21:28:14 +0800 Subject: [PATCH 1/2] fix: fix CI errors --- adapter_test.go | 117 +++++++++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 52 deletions(-) diff --git a/adapter_test.go b/adapter_test.go index 78ab397..21fe47b 100644 --- a/adapter_test.go +++ b/adapter_test.go @@ -22,6 +22,18 @@ func (s *AdapterTestSuite) assertPolicy(expected, res [][]string) { s.Assert().True(util.Array2DEquals(expected, res), "Policy Got: %v, supposed to be %v", res, expected) } +func (s *AdapterTestSuite) getPolicy(e *casbin.Enforcer) [][]string { + policy, err := e.GetPolicy() + s.Require().NoError(err) + return policy +} + +func (s *AdapterTestSuite) getGroupingPolicy(e *casbin.Enforcer) [][]string { + policy, err := e.GetGroupingPolicy() + s.Require().NoError(err) + return policy +} + func (s *AdapterTestSuite) dropCasbinDB() { opts, err := pg.ParseURL(os.Getenv("PG_CONN")) s.Require().NoError(err) @@ -58,7 +70,7 @@ func (s *AdapterTestSuite) TestSaveLoad() { s.Assert().False(s.e.IsFiltered()) s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) } @@ -77,7 +89,7 @@ func (s *AdapterTestSuite) TestAutoSave() { // This is still the original policy. s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) // Now we enable the AutoSave. @@ -93,7 +105,7 @@ func (s *AdapterTestSuite) TestAutoSave() { // The policy has a new rule: {"alice", "data1", "write"}. s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) // Aditional AddPolicy have no effect @@ -103,7 +115,7 @@ func (s *AdapterTestSuite) TestAutoSave() { s.Require().NoError(err) s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data1", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) _, err = s.e.AddPolicies([][]string{ @@ -131,7 +143,7 @@ func (s *AdapterTestSuite) TestAutoSave() { {"bob", "data1", "write"}, {"bob", "data1", "read"}, }, - s.e.GetPolicy(), + s.getPolicy(s.e), ) s.Require().NoError(err) @@ -150,7 +162,7 @@ func (s *AdapterTestSuite) TestConstructorOptions() { s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) } @@ -160,7 +172,7 @@ func (s *AdapterTestSuite) TestRemovePolicy() { s.assertPolicy( [][]string{{"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) err = s.e.LoadPolicy() @@ -168,7 +180,7 @@ func (s *AdapterTestSuite) TestRemovePolicy() { s.assertPolicy( [][]string{{"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) _, err = s.e.RemovePolicies([][]string{ @@ -179,7 +191,7 @@ func (s *AdapterTestSuite) TestRemovePolicy() { s.assertPolicy( [][]string{{"bob", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) } @@ -189,7 +201,7 @@ func (s *AdapterTestSuite) TestRemoveFilteredPolicy() { s.assertPolicy( [][]string{{"alice", "data1", "read"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) err = s.e.LoadPolicy() @@ -197,7 +209,7 @@ func (s *AdapterTestSuite) TestRemoveFilteredPolicy() { s.assertPolicy( [][]string{{"alice", "data1", "read"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) } @@ -212,7 +224,7 @@ func (s *AdapterTestSuite) TestLoadFilteredPolicy() { s.Assert().True(e.IsFiltered()) s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"data2_admin", "data2", "read"}}, - e.GetPolicy(), + s.getPolicy(e), ) } @@ -225,7 +237,7 @@ func (s *AdapterTestSuite) TestLoadFilteredGroupingPolicy() { }) s.Require().NoError(err) s.Assert().True(e.IsFiltered()) - s.assertPolicy([][]string{}, e.GetGroupingPolicy()) + s.assertPolicy([][]string{}, s.getGroupingPolicy(e)) e, err = casbin.NewEnforcer("examples/rbac_model.conf", s.a) s.Require().NoError(err) @@ -235,7 +247,7 @@ func (s *AdapterTestSuite) TestLoadFilteredGroupingPolicy() { }) s.Require().NoError(err) s.Assert().True(e.IsFiltered()) - s.assertPolicy([][]string{{"alice", "data2_admin"}}, e.GetGroupingPolicy()) + s.assertPolicy([][]string{{"alice", "data2_admin"}}, s.getGroupingPolicy(e)) } func (s *AdapterTestSuite) TestLoadFilteredPolicyNilFilter() { @@ -248,20 +260,20 @@ func (s *AdapterTestSuite) TestLoadFilteredPolicyNilFilter() { s.Assert().False(e.IsFiltered()) s.assertPolicy( [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) } func (s *AdapterTestSuite) TestSavePolicyClearPreviousData() { s.e.EnableAutoSave(false) - policies := s.e.GetPolicy() + policies := s.getPolicy(s.e) // clone slice to avoid shufling elements policies = append(policies[:0:0], policies...) for _, p := range policies { _, err := s.e.RemovePolicy(p) s.Require().NoError(err) } - policies = s.e.GetGroupingPolicy() + policies = s.getGroupingPolicy(s.e) policies = append(policies[:0:0], policies...) for _, p := range policies { _, err := s.e.RemoveGroupingPolicy(p) @@ -269,7 +281,7 @@ func (s *AdapterTestSuite) TestSavePolicyClearPreviousData() { } s.assertPolicy( [][]string{}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) err := s.e.SavePolicy() @@ -279,7 +291,7 @@ func (s *AdapterTestSuite) TestSavePolicyClearPreviousData() { s.Require().NoError(err) s.assertPolicy( [][]string{}, - s.e.GetPolicy(), + s.getPolicy(s.e), ) } @@ -299,7 +311,7 @@ func (s *AdapterTestSuite) TestUpdatePolicy() { err = s.e.LoadPolicy() s.Require().NoError(err) - s.assertPolicy(s.e.GetPolicy(), [][]string{{"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"bob", "data1", "read"}, {"alice", "data2", "write"}}) + s.assertPolicy(s.getPolicy(s.e), [][]string{{"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"bob", "data1", "read"}, {"alice", "data2", "write"}}) } func (s *AdapterTestSuite) TestUpdatePolicyWithLoadFilteredPolicy() { @@ -315,13 +327,14 @@ func (s *AdapterTestSuite) TestUpdatePolicyWithLoadFilteredPolicy() { err = s.e.LoadFilteredPolicy(&Filter{P: []string{"data2_admin"}}) s.Require().NoError(err) - _, err = s.e.UpdatePolicies(s.e.GetPolicy(), [][]string{{"bob", "data2", "read"}, {"alice", "data2", "write"}}) + currentPolicy := s.getPolicy(s.e) + _, err = s.e.UpdatePolicies(currentPolicy, [][]string{{"bob", "data2", "read"}, {"alice", "data2", "write"}}) s.Require().NoError(err) err = s.e.LoadPolicy() s.Require().NoError(err) - s.assertPolicy(s.e.GetPolicy(), [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"bob", "data2", "read"}, {"alice", "data2", "write"}}) + s.assertPolicy(s.getPolicy(s.e), [][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"bob", "data2", "read"}, {"alice", "data2", "write"}}) } func (s *AdapterTestSuite) TestUpdateFilteredPolicies() { @@ -343,35 +356,35 @@ func (s *AdapterTestSuite) TestUpdateFilteredPolicies() { err = s.e.LoadPolicy() s.Require().NoError(err) - s.assertPolicy(s.e.GetPolicy(), [][]string{{"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data2", "write"}, {"bob", "data1", "read"}}) + s.assertPolicy(s.getPolicy(s.e), [][]string{{"data2_admin", "data2", "read"}, {"data2_admin", "data2", "write"}, {"alice", "data2", "write"}, {"bob", "data1", "read"}}) } func (s *AdapterTestSuite) TestEmptyStringSupport() { // Test that empty strings in the middle of rules are properly stored and retrieved // Note: Casbin trims trailing empty strings, so we focus on empty strings in the middle var err error - + // Add policies with empty strings in the middle _, err = s.e.AddPolicy("alice", "", "read") s.Require().NoError(err) - + _, err = s.e.AddPolicy("bob", "", "write") s.Require().NoError(err) - + // Reload to ensure they were saved correctly err = s.e.LoadPolicy() s.Require().NoError(err) - + // Check that all policies including empty strings are present - policies := s.e.GetPolicy() - + policies := s.getPolicy(s.e) + // Should have original 4 policies plus 2 new ones with empty strings s.Assert().Len(policies, 6) - + // Verify the new policies with empty strings exist hasAliceEmpty := false hasBobEmpty := false - + for _, p := range policies { if len(p) == 3 && p[0] == "alice" && p[1] == "" && p[2] == "read" { hasAliceEmpty = true @@ -380,35 +393,35 @@ func (s *AdapterTestSuite) TestEmptyStringSupport() { hasBobEmpty = true } } - + s.Assert().True(hasAliceEmpty, "Policy with alice and empty string in middle not found") s.Assert().True(hasBobEmpty, "Policy with bob and empty string in middle not found") - + // Test removing a policy with empty string _, err = s.e.RemovePolicy("alice", "", "read") s.Require().NoError(err) - + err = s.e.LoadPolicy() s.Require().NoError(err) - - policies = s.e.GetPolicy() + + policies = s.getPolicy(s.e) s.Assert().Len(policies, 5) - + // Verify alice policy with empty string was removed for _, p := range policies { if len(p) == 3 && p[0] == "alice" && p[1] == "" && p[2] == "read" { s.Fail("Policy with alice and empty string should have been removed") } } - + // Test updating a policy with empty string _, err = s.e.UpdatePolicy([]string{"bob", "", "write"}, []string{"bob", "", "read"}) s.Require().NoError(err) - + err = s.e.LoadPolicy() s.Require().NoError(err) - - policies = s.e.GetPolicy() + + policies = s.getPolicy(s.e) hasBobEmptyRead := false for _, p := range policies { if len(p) == 3 && p[0] == "bob" && p[1] == "" && p[2] == "read" { @@ -425,24 +438,24 @@ func (s *AdapterTestSuite) TestEmptyStringSupport() { func (s *AdapterTestSuite) TestEmptyStringVsWildcard() { // Test that empty strings in rules are different from wildcards in filters var err error - + // Add a policy with an empty string _, err = s.e.AddPolicy("user1", "", "write") s.Require().NoError(err) - + // Add a policy with a non-empty value _, err = s.e.AddPolicy("user1", "resource1", "write") s.Require().NoError(err) - + // Reload err = s.e.LoadPolicy() s.Require().NoError(err) - + // Both should exist - policies := s.e.GetPolicy() + policies := s.getPolicy(s.e) hasEmpty := false hasNonEmpty := false - + for _, p := range policies { if len(p) >= 3 && p[0] == "user1" && p[2] == "write" { if p[1] == "" { @@ -452,18 +465,18 @@ func (s *AdapterTestSuite) TestEmptyStringVsWildcard() { } } } - + s.Assert().True(hasEmpty, "Policy with empty string should exist") s.Assert().True(hasNonEmpty, "Policy with resource1 should exist") - + // Remove using wildcard (empty string in filter) should remove both _, err = s.e.RemoveFilteredPolicy(0, "user1", "", "write") s.Require().NoError(err) - + err = s.e.LoadPolicy() s.Require().NoError(err) - - policies = s.e.GetPolicy() + + policies = s.getPolicy(s.e) for _, p := range policies { if len(p) >= 3 && p[0] == "user1" && p[2] == "write" { s.Fail("Policies with user1 and write should have been removed by wildcard filter") From 50e7dc4d15465253676301169a3e36f276acd773 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 May 2026 13:29:46 +0000 Subject: [PATCH 2/2] build(deps): bump github.com/go-pg/pg/v10 from 10.12.0 to 10.15.0 Bumps [github.com/go-pg/pg/v10](https://github.com/go-pg/pg) from 10.12.0 to 10.15.0. - [Release notes](https://github.com/go-pg/pg/releases) - [Changelog](https://github.com/go-pg/pg/blob/v10/CHANGELOG.md) - [Commits](https://github.com/go-pg/pg/compare/v10.12.0...v10.15.0) --- updated-dependencies: - dependency-name: github.com/go-pg/pg/v10 dependency-version: 10.15.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 8 ++++---- go.sum | 27 +++++++++++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 093e371..8ab9e4c 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,10 @@ module github.com/casbin/casbin-pg-adapter -go 1.18 +go 1.23.0 require ( github.com/casbin/casbin/v3 v3.10.0 - github.com/go-pg/pg/v10 v10.12.0 + github.com/go-pg/pg/v10 v10.15.0 github.com/mmcloughlin/meow v0.0.0-20181112033425-871e50784daf github.com/stretchr/testify v1.7.0 ) @@ -22,8 +22,8 @@ require ( github.com/vmihailenco/msgpack/v5 v5.3.4 // indirect github.com/vmihailenco/tagparser v0.1.2 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.36.0 // indirect + golang.org/x/sys v0.31.0 // indirect gopkg.in/yaml.v3 v3.0.0 // indirect mellium.im/sasl v0.3.1 // indirect ) diff --git a/go.sum b/go.sum index 43b8a70..eb5793d 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,9 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/go-pg/pg/v10 v10.12.0 h1:rBmfDDHTN7FQW0OemYmcn5UuBy6wkYWgh/Oqt1OBEB8= -github.com/go-pg/pg/v10 v10.12.0/go.mod h1:USA08CdIasAn0F6wC1nBf5nQhMHewVQodWoH89RPXaI= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/go-pg/pg/v10 v10.15.0 h1:6DQwbaxJz/e4wvgzbxBkBLiL/Uuk87MGgHhkURtzx24= +github.com/go-pg/pg/v10 v10.15.0/go.mod h1:FIn/x04hahOf9ywQ1p68rXqaDVbTRLYlu4MQR0lhoB8= github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU= github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -23,9 +24,13 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mmcloughlin/meow v0.0.0-20181112033425-871e50784daf h1:bD6uvpTs5gpzCesUWCGmlEUnU2OINvCQHri8geYwuv0= github.com/mmcloughlin/meow v0.0.0-20181112033425-871e50784daf/go.mod h1:uxCZJI8Z1PD2WRnSJtVJGHCyxC5qWhz5lOsx3Bx1NXo= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -43,19 +48,25 @@ github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vb github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=