From 0e5ac87ebf2d9d05f7f1677f97b102c576adaf89 Mon Sep 17 00:00:00 2001 From: rvflash Date: Tue, 30 May 2023 19:34:08 +0200 Subject: [PATCH 1/2] Adds support of netrc file to allow auto-login with basic authentification --- go.mod | 9 +-- go.sum | 88 ++++++++++++++++++---------- internal/app/app.go | 20 ++++++- internal/log/logger.go | 3 +- internal/netrc/netrc.go | 53 +++++++++++++++++ internal/vcs/git/vcs.go | 20 +++++-- internal/vcs/git/vcs_test.go | 91 ++++++++++++++++++++++------- internal/vcs/vcs.go | 11 ++++ pkg/goup/goup.go | 3 +- testdata/mock/mod/file.go | 91 +++++++++++++++-------------- testdata/mock/mod/module.go | 57 +++++++++--------- testdata/mock/vcs/vcs.go | 110 +++++++++++++++++++++++------------ 12 files changed, 384 insertions(+), 172 deletions(-) create mode 100644 internal/netrc/netrc.go diff --git a/go.mod b/go.mod index 0e37f09..26ad9e7 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,11 @@ go 1.14 require ( github.com/fatih/color v1.15.0 - github.com/go-git/go-git/v5 v5.6.1 + github.com/go-git/go-git/v5 v5.7.0 github.com/golang/mock v1.7.0-rc.1 + github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 github.com/matryer/is v1.4.1 - github.com/mattn/go-isatty v0.0.18 - github.com/rvflash/workr v0.1.0 - golang.org/x/mod v0.9.0 + github.com/mattn/go-isatty v0.0.19 + github.com/rvflash/workr v1.0.0 + golang.org/x/mod v0.10.0 ) diff --git a/go.sum b/go.sum index 93c8dda..e6e2483 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= +github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 h1:ZK3C5DtzV2nVAQTx5S5jQvMeDqWtD1By5mOoyY/xJek= +github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= @@ -9,35 +9,45 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuW github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0= +github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.3.1 h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlKnXHuzrfjTQ= -github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.6.1 h1:q4ZRqQl4pR/ZJHc1L5CFjGA1a10u76aV1iC+nh+bHsk= -github.com/go-git/go-git/v5 v5.6.1/go.mod h1:mvyoL6Unz0PiTQrGQfSfiLFhBH1c1e84ylC2MDs4ee8= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= +github.com/go-git/go-git/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE= +github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 h1:2uT3aivO7NVpUPGcQX7RbHijHMyWix/yCnIrCWc+5co= +github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= @@ -49,15 +59,14 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= -github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= @@ -66,13 +75,14 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 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/rvflash/workr v0.1.0 h1:OuKS6HxjYHq9PdnnyorkQU58E4NUGZZxGdPfSGFai54= -github.com/rvflash/workr v0.1.0/go.mod h1:+73H2ffuDh/1+GKcLh5VCOCjlH0AzNJ2UlZ0AgVToq4= +github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= +github.com/rvflash/workr v1.0.0 h1:Fvjggx4VmCiCu0l4xdO1IVj0G75Oufel30JGds8MJLQ= +github.com/rvflash/workr v1.0.0/go.mod h1:5T0C9utSdPnBWf4HOGO6Mbg1P1pRBlKsV7yjmj4DoFA= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= -github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= +github.com/skeema/knownhosts v1.1.1 h1:MTk78x9FPgDFVFkDLTrsnnfCJl7g1C/nnKvePgrIngE= +github.com/skeema/knownhosts v1.1.1/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -86,17 +96,20 @@ golang.org/x/arch v0.1.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= +golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -105,12 +118,16 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -129,34 +146,45 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -164,6 +192,6 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/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= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/internal/app/app.go b/internal/app/app.go index 3e695d8..0207505 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -7,11 +7,14 @@ package app import ( "context" + "fmt" "os" "path/filepath" "github.com/rvflash/goup/internal/errors" "github.com/rvflash/goup/internal/log" + "github.com/rvflash/goup/internal/netrc" + "github.com/rvflash/goup/internal/vcs" "github.com/rvflash/goup/pkg/goup" "github.com/rvflash/goup/pkg/mod" ) @@ -32,7 +35,7 @@ func WithChecker(f goup.Checker) Configurator { } // WithLogger defines the logger used to print events. -// By default we use a DevNull. +// By default, we use a DevNull. func WithLogger(l log.Printer) Configurator { return func(a *App) error { if l == nil { @@ -55,6 +58,18 @@ func WithParser(f mod.Parser) Configurator { } } +// WithNetrc parses netrc file to allow auto-login with basic authentication. +func WithNetrc() Configurator { + return func(a *App) error { + rc, err := netrc.Parse() + if err != nil { + return fmt.Errorf("netrc: %w: %w", err, errors.ErrRepository) + } + a.autologin = rc + return nil + } +} + // Open tries to create a new instance of App. func Open(version string, opts ...Configurator) (*App, error) { a := &App{ @@ -62,6 +77,7 @@ func Open(version string, opts ...Configurator) (*App, error) { } opts = append([]Configurator{ WithLogger(log.DevNull()), + WithNetrc(), WithParser(mod.Parse), WithChecker(goup.Check), }, opts...) @@ -79,6 +95,7 @@ type App struct { goup.Config check goup.Checker + autologin vcs.BasicAuthentifier parse mod.Parser logger log.Printer buildVersion string @@ -100,6 +117,7 @@ func (a *App) Check(ctx context.Context, paths []string) (failure bool) { return false } } + a.Config.BasicAuth = a.autologin for _, path := range checkPaths(paths) { f, err := a.parse(path) if err != nil { diff --git a/internal/log/logger.go b/internal/log/logger.go index 8fd44db..8c7d312 100644 --- a/internal/log/logger.go +++ b/internal/log/logger.go @@ -99,7 +99,8 @@ func (l *Logger) printf(format string, color func(a ...interface{}) string, args func colors(f func(a ...interface{}) string, args []interface{}) []interface{} { for k, v := range args { - args[k] = f(v) + arg := v + args[k] = f(arg) } return args } diff --git a/internal/netrc/netrc.go b/internal/netrc/netrc.go new file mode 100644 index 0000000..88cd714 --- /dev/null +++ b/internal/netrc/netrc.go @@ -0,0 +1,53 @@ +// Package netrc provides methods to handle basic authentification used by the auto-login process in .netrc f. +// See https://www.gnu.org/software/inetutils/manual/html_node/The-_002enetrc-file.html. +package netrc + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/jdxcode/netrc" + "github.com/rvflash/goup/internal/vcs" +) + +// File represents a netrc f. +type File struct { + f *netrc.Netrc +} + +// Parse the netrc f behind the NETRC environment variable. +// If undefined, we try to find the .netrc f in the user home directory. +func Parse() (rc File, err error) { + path := os.Getenv("NETRC") + if path == "" { + path, err = os.UserHomeDir() + if err != nil { + return rc, fmt.Errorf("user home directory: %w", err) + } + path = filepath.Join(path, ".netrc") + } + f, err := netrc.Parse(path) + if err != nil { + if os.IsNotExist(err) { + return rc, nil + } + return rc, fmt.Errorf("netrc parsing %q: %w", path, err) + } + return File{f: f}, nil +} + +// BasicAuth returns if available the basic auth information for this hostname. +func (c File) BasicAuth(host string) *vcs.BasicAuth { + if c.f == nil { + return nil + } + h := c.f.Machine(host) + if h == nil { + return nil + } + return &vcs.BasicAuth{ + Username: h.Get("login"), + Password: h.Get("password"), + } +} diff --git a/internal/vcs/git/vcs.go b/internal/vcs/git/vcs.go index 247a067..763cac4 100644 --- a/internal/vcs/git/vcs.go +++ b/internal/vcs/git/vcs.go @@ -14,6 +14,7 @@ import ( "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing" + "github.com/go-git/go-git/v5/plumbing/transport/http" "github.com/go-git/go-git/v5/storage" "github.com/go-git/go-git/v5/storage/memory" "github.com/rvflash/goup/internal/errors" @@ -30,13 +31,15 @@ const ( // VCS is a Git PrintVersion Control VCS. type VCS struct { + auth vcs.BasicAuthentifier client vcs.ClientChooser storage storage.Storer } // New returns a new instance of VCS. -func New(client vcs.ClientChooser) *VCS { +func New(client vcs.ClientChooser, auth vcs.BasicAuthentifier) *VCS { return &VCS{ + auth: auth, client: client, storage: memory.NewStorage(), } @@ -110,8 +113,17 @@ func (s *VCS) fetch(rawURL string) *reference { URLs: []string{u.String()}, }) // Retrieves the releases list of the repository. - var res []*plumbing.Reference - res, err = rem.List(&git.ListOptions{}) + var ( + res []*plumbing.Reference + rfs = &git.ListOptions{} + ) + if ba := s.auth.BasicAuth(u.Host); ba != nil { + rfs.Auth = &http.BasicAuth{ + Username: ba.Username, + Password: ba.Password, + } + } + res, err = rem.List(rfs) if err != nil { ref.err = vcs.Errorf(Name, errors.ErrFetch, err) return ref @@ -128,7 +140,7 @@ func (s *VCS) fetch(rawURL string) *reference { } func (s *VCS) ready(ctx context.Context) bool { - return ctx != nil && s.storage != nil && s.client != nil + return ctx != nil && s.storage != nil && s.client != nil && s.auth != nil } type reference struct { diff --git a/internal/vcs/git/vcs_test.go b/internal/vcs/git/vcs_test.go index 68ce57a..854008c 100644 --- a/internal/vcs/git/vcs_test.go +++ b/internal/vcs/git/vcs_test.go @@ -19,9 +19,10 @@ import ( ) const ( - pkgName = "github.com/src-d/go-git" - repoURL = "https://github.com/src-d/go-git" - unsafeURL = "http://github.com/src-d/go-git" + hostname = "github.com" + pkgName = hostname + "/src-d/go-git" + repoURL = "https://" + pkgName + unsafeURL = "http://" + pkgName ) func TestVCS_CanFetch(t *testing.T) { @@ -39,21 +40,38 @@ func TestVCS_FetchPath(t *testing.T) { var ( are = is.New(t) dt = map[string]struct { - cli vcs.ClientChooser - ctx context.Context - in string - err error + cli vcs.ClientChooser + auth vcs.BasicAuthentifier + ctx context.Context + in string + err error }{ - "default": {err: errup.ErrSystem}, - "missing context": {cli: mockvcs.NewMockClientChooser(ctrl), in: pkgName, err: errup.ErrSystem}, - "missing path": {cli: mockvcs.NewMockClientChooser(ctrl), ctx: ctx, err: errup.ErrRepository}, - "ok": {cli: newMockClientChooser(ctrl), ctx: ctx, in: pkgName}, + "Default": {err: errup.ErrSystem}, + "Missing authentifier": {cli: mockvcs.NewMockClientChooser(ctrl), err: errup.ErrSystem}, + "Missing context": { + cli: mockvcs.NewMockClientChooser(ctrl), + auth: mockvcs.NewMockBasicAuthentifier(ctrl), + in: pkgName, + err: errup.ErrSystem, + }, + "Missing path": { + cli: mockvcs.NewMockClientChooser(ctrl), + auth: mockvcs.NewMockBasicAuthentifier(ctrl), + ctx: ctx, + err: errup.ErrRepository, + }, + "OK": { + cli: newMockClientChooser(ctrl), + auth: newMockBasicAuthentifier(ctrl), + ctx: ctx, + in: pkgName, + }, } ) for name, ts := range dt { tt := ts t.Run(name, func(t *testing.T) { - s := git.New(tt.cli) + s := git.New(tt.cli, tt.auth) _, err := s.FetchPath(tt.ctx, tt.in) are.True(errors.Is(err, tt.err)) // mismatch error }) @@ -69,22 +87,45 @@ func TestVCS_FetchURL(t *testing.T) { var ( are = is.New(t) dt = map[string]struct { - cli vcs.ClientChooser - ctx context.Context - in string - err error + cli vcs.ClientChooser + auth vcs.BasicAuthentifier + ctx context.Context + in string + err error }{ - "Default": {err: errup.ErrSystem}, - "Missing context": {cli: mockvcs.NewMockClientChooser(ctrl), in: repoURL, err: errup.ErrSystem}, - "Missing url": {cli: mockvcs.NewMockClientChooser(ctrl), ctx: ctx, err: errup.ErrRepository}, - "Invalid": {cli: newMockClientChooser(ctrl), ctx: ctx, in: unsafeURL, err: errup.ErrRepository}, - "Ok": {cli: mockvcs.NewMockClientChooser(ctrl), ctx: ctx, in: repoURL}, + "Default": {err: errup.ErrSystem}, + "Missing authentifier": {cli: mockvcs.NewMockClientChooser(ctrl), err: errup.ErrSystem}, + "Missing context": { + cli: mockvcs.NewMockClientChooser(ctrl), + auth: mockvcs.NewMockBasicAuthentifier(ctrl), + in: repoURL, + err: errup.ErrSystem, + }, + "Missing url": { + cli: mockvcs.NewMockClientChooser(ctrl), + auth: mockvcs.NewMockBasicAuthentifier(ctrl), + ctx: ctx, + err: errup.ErrRepository, + }, + "Invalid": { + cli: newMockClientChooser(ctrl), + auth: mockvcs.NewMockBasicAuthentifier(ctrl), + ctx: ctx, + in: unsafeURL, + err: errup.ErrRepository, + }, + "OK": { + cli: mockvcs.NewMockClientChooser(ctrl), + auth: newMockBasicAuthentifier(ctrl), + ctx: ctx, + in: repoURL, + }, } ) for name, ts := range dt { tt := ts t.Run(name, func(t *testing.T) { - s := git.New(tt.cli) + s := git.New(tt.cli, tt.auth) _, err := s.FetchURL(tt.ctx, tt.in) are.True(errors.Is(err, tt.err)) // mismatch error }) @@ -96,3 +137,9 @@ func newMockClientChooser(ctrl *gomock.Controller) *mockvcs.MockClientChooser { c.EXPECT().AllowInsecure(pkgName).Return(false).AnyTimes() return c } + +func newMockBasicAuthentifier(ctrl *gomock.Controller) *mockvcs.MockBasicAuthentifier { + m := mockvcs.NewMockBasicAuthentifier(ctrl) + m.EXPECT().BasicAuth(hostname).Return(nil).AnyTimes() + return m +} diff --git a/internal/vcs/vcs.go b/internal/vcs/vcs.go index 750c8c9..eb21f16 100644 --- a/internal/vcs/vcs.go +++ b/internal/vcs/vcs.go @@ -22,6 +22,17 @@ type System interface { FetchURL(ctx context.Context, url string) (semver.Tags, error) } +// BasicAuth contains basic auth properties. +type BasicAuth struct { + Username string + Password string +} + +// BasicAuthentifier must be implemented to allow request with basic host by hostname. +type BasicAuthentifier interface { + BasicAuth(host string) *BasicAuth +} + // Client must be implemented by any HTTP client. type Client interface { Do(req *http.Request) (*http.Response, error) diff --git a/pkg/goup/goup.go b/pkg/goup/goup.go index a7aec28..194be60 100644 --- a/pkg/goup/goup.go +++ b/pkg/goup/goup.go @@ -34,6 +34,7 @@ type Config struct { InsecurePatterns string OnlyReleases string Timeout time.Duration + BasicAuth vcs.BasicAuthentifier } // Checker must be implemented to checkFile updates on go.mod file or module. @@ -54,7 +55,7 @@ func newGoUp(conf Config, sets ...setter) *goUp { log: make(chan Message), } httpClient = vcs.NewHTTPClient(conf.Timeout, conf.InsecurePatterns) - gitVCS = git.New(httpClient) + gitVCS = git.New(httpClient, conf.BasicAuth) ) sets = append([]setter{ setGit(gitVCS), diff --git a/testdata/mock/mod/file.go b/testdata/mock/mod/file.go index 16c6c02..8e26426 100644 --- a/testdata/mock/mod/file.go +++ b/testdata/mock/mod/file.go @@ -5,91 +5,93 @@ package mock_mod import ( + reflect "reflect" + gomock "github.com/golang/mock/gomock" mod "github.com/rvflash/goup/pkg/mod" - reflect "reflect" ) -// MockMod is a mock of Mod interface +// MockMod is a mock of Mod interface. type MockMod struct { ctrl *gomock.Controller recorder *MockModMockRecorder } -// MockModMockRecorder is the mock recorder for MockMod +// MockModMockRecorder is the mock recorder for MockMod. type MockModMockRecorder struct { mock *MockMod } -// NewMockMod creates a new mock instance +// NewMockMod creates a new mock instance. func NewMockMod(ctrl *gomock.Controller) *MockMod { mock := &MockMod{ctrl: ctrl} mock.recorder = &MockModMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockMod) EXPECT() *MockModMockRecorder { return m.recorder } -// Module mocks base method -func (m *MockMod) Module() string { +// Dependencies mocks base method. +func (m *MockMod) Dependencies() []mod.Module { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Module") - ret0, _ := ret[0].(string) + ret := m.ctrl.Call(m, "Dependencies") + ret0, _ := ret[0].([]mod.Module) return ret0 } -// Module indicates an expected call of Module -func (mr *MockModMockRecorder) Module() *gomock.Call { +// Dependencies indicates an expected call of Dependencies. +func (mr *MockModMockRecorder) Dependencies() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Module", reflect.TypeOf((*MockMod)(nil).Module)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Dependencies", reflect.TypeOf((*MockMod)(nil).Dependencies)) } -// Name mocks base method -func (m *MockMod) Name() string { +// Format mocks base method. +func (m *MockMod) Format() ([]byte, error) { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Name") - ret0, _ := ret[0].(string) - return ret0 + ret := m.ctrl.Call(m, "Format") + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 } -// Name indicates an expected call of Name -func (mr *MockModMockRecorder) Name() *gomock.Call { +// Format indicates an expected call of Format. +func (mr *MockModMockRecorder) Format() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockMod)(nil).Name)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Format", reflect.TypeOf((*MockMod)(nil).Format)) } -// Dependencies mocks base method -func (m *MockMod) Dependencies() []mod.Module { +// Module mocks base method. +func (m *MockMod) Module() string { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Dependencies") - ret0, _ := ret[0].([]mod.Module) + ret := m.ctrl.Call(m, "Module") + ret0, _ := ret[0].(string) return ret0 } -// Dependencies indicates an expected call of Dependencies -func (mr *MockModMockRecorder) Dependencies() *gomock.Call { +// Module indicates an expected call of Module. +func (mr *MockModMockRecorder) Module() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Dependencies", reflect.TypeOf((*MockMod)(nil).Dependencies)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Module", reflect.TypeOf((*MockMod)(nil).Module)) } -// UpdateRequire mocks base method -func (m *MockMod) UpdateRequire(path, version string) error { +// Name mocks base method. +func (m *MockMod) Name() string { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpdateRequire", path, version) - ret0, _ := ret[0].(error) + ret := m.ctrl.Call(m, "Name") + ret0, _ := ret[0].(string) return ret0 } -// UpdateRequire indicates an expected call of UpdateRequire -func (mr *MockModMockRecorder) UpdateRequire(path, version interface{}) *gomock.Call { +// Name indicates an expected call of Name. +func (mr *MockModMockRecorder) Name() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequire", reflect.TypeOf((*MockMod)(nil).UpdateRequire), path, version) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Name", reflect.TypeOf((*MockMod)(nil).Name)) } -// UpdateReplace mocks base method +// UpdateReplace mocks base method. func (m *MockMod) UpdateReplace(oldPath, newVersion string) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "UpdateReplace", oldPath, newVersion) @@ -97,23 +99,22 @@ func (m *MockMod) UpdateReplace(oldPath, newVersion string) error { return ret0 } -// UpdateReplace indicates an expected call of UpdateReplace +// UpdateReplace indicates an expected call of UpdateReplace. func (mr *MockModMockRecorder) UpdateReplace(oldPath, newVersion interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateReplace", reflect.TypeOf((*MockMod)(nil).UpdateReplace), oldPath, newVersion) } -// Format mocks base method -func (m *MockMod) Format() ([]byte, error) { +// UpdateRequire mocks base method. +func (m *MockMod) UpdateRequire(path, version string) error { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "Format") - ret0, _ := ret[0].([]byte) - ret1, _ := ret[1].(error) - return ret0, ret1 + ret := m.ctrl.Call(m, "UpdateRequire", path, version) + ret0, _ := ret[0].(error) + return ret0 } -// Format indicates an expected call of Format -func (mr *MockModMockRecorder) Format() *gomock.Call { +// UpdateRequire indicates an expected call of UpdateRequire. +func (mr *MockModMockRecorder) UpdateRequire(path, version interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Format", reflect.TypeOf((*MockMod)(nil).Format)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpdateRequire", reflect.TypeOf((*MockMod)(nil).UpdateRequire), path, version) } diff --git a/testdata/mock/mod/module.go b/testdata/mock/mod/module.go index c533691..8c36ba9 100644 --- a/testdata/mock/mod/module.go +++ b/testdata/mock/mod/module.go @@ -5,35 +5,51 @@ package mock_mod import ( + reflect "reflect" + gomock "github.com/golang/mock/gomock" semver "github.com/rvflash/goup/internal/semver" - reflect "reflect" ) -// MockModule is a mock of Module interface +// MockModule is a mock of Module interface. type MockModule struct { ctrl *gomock.Controller recorder *MockModuleMockRecorder } -// MockModuleMockRecorder is the mock recorder for MockModule +// MockModuleMockRecorder is the mock recorder for MockModule. type MockModuleMockRecorder struct { mock *MockModule } -// NewMockModule creates a new mock instance +// NewMockModule creates a new mock instance. func NewMockModule(ctrl *gomock.Controller) *MockModule { mock := &MockModule{ctrl: ctrl} mock.recorder = &MockModuleMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockModule) EXPECT() *MockModuleMockRecorder { return m.recorder } -// Indirect mocks base method +// ExcludeVersion mocks base method. +func (m *MockModule) ExcludeVersion() (semver.Tag, bool) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ExcludeVersion") + ret0, _ := ret[0].(semver.Tag) + ret1, _ := ret[1].(bool) + return ret0, ret1 +} + +// ExcludeVersion indicates an expected call of ExcludeVersion. +func (mr *MockModuleMockRecorder) ExcludeVersion() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExcludeVersion", reflect.TypeOf((*MockModule)(nil).ExcludeVersion)) +} + +// Indirect mocks base method. func (m *MockModule) Indirect() bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Indirect") @@ -41,13 +57,13 @@ func (m *MockModule) Indirect() bool { return ret0 } -// Indirect indicates an expected call of Indirect +// Indirect indicates an expected call of Indirect. func (mr *MockModuleMockRecorder) Indirect() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Indirect", reflect.TypeOf((*MockModule)(nil).Indirect)) } -// Path mocks base method +// Path mocks base method. func (m *MockModule) Path() string { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Path") @@ -55,13 +71,13 @@ func (m *MockModule) Path() string { return ret0 } -// Path indicates an expected call of Path +// Path indicates an expected call of Path. func (mr *MockModuleMockRecorder) Path() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Path", reflect.TypeOf((*MockModule)(nil).Path)) } -// Replacement mocks base method +// Replacement mocks base method. func (m *MockModule) Replacement() bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Replacement") @@ -69,13 +85,13 @@ func (m *MockModule) Replacement() bool { return ret0 } -// Replacement indicates an expected call of Replacement +// Replacement indicates an expected call of Replacement. func (mr *MockModuleMockRecorder) Replacement() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Replacement", reflect.TypeOf((*MockModule)(nil).Replacement)) } -// Version mocks base method +// Version mocks base method. func (m *MockModule) Version() semver.Tag { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Version") @@ -83,23 +99,8 @@ func (m *MockModule) Version() semver.Tag { return ret0 } -// Version indicates an expected call of Version +// Version indicates an expected call of Version. func (mr *MockModuleMockRecorder) Version() *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockModule)(nil).Version)) } - -// ExcludeVersion mocks base method -func (m *MockModule) ExcludeVersion() (semver.Tag, bool) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ExcludeVersion") - ret0, _ := ret[0].(semver.Tag) - ret1, _ := ret[1].(bool) - return ret0, ret1 -} - -// ExcludeVersion indicates an expected call of ExcludeVersion -func (mr *MockModuleMockRecorder) ExcludeVersion() *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ExcludeVersion", reflect.TypeOf((*MockModule)(nil).ExcludeVersion)) -} diff --git a/testdata/mock/vcs/vcs.go b/testdata/mock/vcs/vcs.go index 1c1bd69..811883d 100644 --- a/testdata/mock/vcs/vcs.go +++ b/testdata/mock/vcs/vcs.go @@ -6,37 +6,38 @@ package mock_vcs import ( context "context" + http "net/http" + reflect "reflect" + gomock "github.com/golang/mock/gomock" semver "github.com/rvflash/goup/internal/semver" vcs "github.com/rvflash/goup/internal/vcs" - http "net/http" - reflect "reflect" ) -// MockSystem is a mock of System interface +// MockSystem is a mock of System interface. type MockSystem struct { ctrl *gomock.Controller recorder *MockSystemMockRecorder } -// MockSystemMockRecorder is the mock recorder for MockSystem +// MockSystemMockRecorder is the mock recorder for MockSystem. type MockSystemMockRecorder struct { mock *MockSystem } -// NewMockSystem creates a new mock instance +// NewMockSystem creates a new mock instance. func NewMockSystem(ctrl *gomock.Controller) *MockSystem { mock := &MockSystem{ctrl: ctrl} mock.recorder = &MockSystemMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockSystem) EXPECT() *MockSystemMockRecorder { return m.recorder } -// CanFetch mocks base method +// CanFetch mocks base method. func (m *MockSystem) CanFetch(path string) bool { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "CanFetch", path) @@ -44,13 +45,13 @@ func (m *MockSystem) CanFetch(path string) bool { return ret0 } -// CanFetch indicates an expected call of CanFetch +// CanFetch indicates an expected call of CanFetch. func (mr *MockSystemMockRecorder) CanFetch(path interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CanFetch", reflect.TypeOf((*MockSystem)(nil).CanFetch), path) } -// FetchPath mocks base method +// FetchPath mocks base method. func (m *MockSystem) FetchPath(ctx context.Context, path string) (semver.Tags, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchPath", ctx, path) @@ -59,13 +60,13 @@ func (m *MockSystem) FetchPath(ctx context.Context, path string) (semver.Tags, e return ret0, ret1 } -// FetchPath indicates an expected call of FetchPath +// FetchPath indicates an expected call of FetchPath. func (mr *MockSystemMockRecorder) FetchPath(ctx, path interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchPath", reflect.TypeOf((*MockSystem)(nil).FetchPath), ctx, path) } -// FetchURL mocks base method +// FetchURL mocks base method. func (m *MockSystem) FetchURL(ctx context.Context, url string) (semver.Tags, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "FetchURL", ctx, url) @@ -74,36 +75,73 @@ func (m *MockSystem) FetchURL(ctx context.Context, url string) (semver.Tags, err return ret0, ret1 } -// FetchURL indicates an expected call of FetchURL +// FetchURL indicates an expected call of FetchURL. func (mr *MockSystemMockRecorder) FetchURL(ctx, url interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FetchURL", reflect.TypeOf((*MockSystem)(nil).FetchURL), ctx, url) } -// MockClient is a mock of Client interface +// MockBasicAuthentifier is a mock of BasicAuthentifier interface. +type MockBasicAuthentifier struct { + ctrl *gomock.Controller + recorder *MockBasicAuthentifierMockRecorder +} + +// MockBasicAuthentifierMockRecorder is the mock recorder for MockBasicAuthentifier. +type MockBasicAuthentifierMockRecorder struct { + mock *MockBasicAuthentifier +} + +// NewMockBasicAuthentifier creates a new mock instance. +func NewMockBasicAuthentifier(ctrl *gomock.Controller) *MockBasicAuthentifier { + mock := &MockBasicAuthentifier{ctrl: ctrl} + mock.recorder = &MockBasicAuthentifierMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockBasicAuthentifier) EXPECT() *MockBasicAuthentifierMockRecorder { + return m.recorder +} + +// BasicAuth mocks base method. +func (m *MockBasicAuthentifier) BasicAuth(host string) *vcs.BasicAuth { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BasicAuth", host) + ret0, _ := ret[0].(*vcs.BasicAuth) + return ret0 +} + +// BasicAuth indicates an expected call of BasicAuth. +func (mr *MockBasicAuthentifierMockRecorder) BasicAuth(host interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BasicAuth", reflect.TypeOf((*MockBasicAuthentifier)(nil).BasicAuth), host) +} + +// MockClient is a mock of Client interface. type MockClient struct { ctrl *gomock.Controller recorder *MockClientMockRecorder } -// MockClientMockRecorder is the mock recorder for MockClient +// MockClientMockRecorder is the mock recorder for MockClient. type MockClientMockRecorder struct { mock *MockClient } -// NewMockClient creates a new mock instance +// NewMockClient creates a new mock instance. func NewMockClient(ctrl *gomock.Controller) *MockClient { mock := &MockClient{ctrl: ctrl} mock.recorder = &MockClientMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockClient) EXPECT() *MockClientMockRecorder { return m.recorder } -// Do mocks base method +// Do mocks base method. func (m *MockClient) Do(req *http.Request) (*http.Response, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Do", req) @@ -112,59 +150,59 @@ func (m *MockClient) Do(req *http.Request) (*http.Response, error) { return ret0, ret1 } -// Do indicates an expected call of Do +// Do indicates an expected call of Do. func (mr *MockClientMockRecorder) Do(req interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Do", reflect.TypeOf((*MockClient)(nil).Do), req) } -// MockClientChooser is a mock of ClientChooser interface +// MockClientChooser is a mock of ClientChooser interface. type MockClientChooser struct { ctrl *gomock.Controller recorder *MockClientChooserMockRecorder } -// MockClientChooserMockRecorder is the mock recorder for MockClientChooser +// MockClientChooserMockRecorder is the mock recorder for MockClientChooser. type MockClientChooserMockRecorder struct { mock *MockClientChooser } -// NewMockClientChooser creates a new mock instance +// NewMockClientChooser creates a new mock instance. func NewMockClientChooser(ctrl *gomock.Controller) *MockClientChooser { mock := &MockClientChooser{ctrl: ctrl} mock.recorder = &MockClientChooserMockRecorder{mock} return mock } -// EXPECT returns an object that allows the caller to indicate expected use +// EXPECT returns an object that allows the caller to indicate expected use. func (m *MockClientChooser) EXPECT() *MockClientChooserMockRecorder { return m.recorder } -// ClientFor mocks base method -func (m *MockClientChooser) ClientFor(path string) vcs.Client { +// AllowInsecure mocks base method. +func (m *MockClientChooser) AllowInsecure(path string) bool { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "ClientFor", path) - ret0, _ := ret[0].(vcs.Client) + ret := m.ctrl.Call(m, "AllowInsecure", path) + ret0, _ := ret[0].(bool) return ret0 } -// ClientFor indicates an expected call of ClientFor -func (mr *MockClientChooserMockRecorder) ClientFor(path interface{}) *gomock.Call { +// AllowInsecure indicates an expected call of AllowInsecure. +func (mr *MockClientChooserMockRecorder) AllowInsecure(path interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientFor", reflect.TypeOf((*MockClientChooser)(nil).ClientFor), path) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllowInsecure", reflect.TypeOf((*MockClientChooser)(nil).AllowInsecure), path) } -// AllowInsecure mocks base method -func (m *MockClientChooser) AllowInsecure(path string) bool { +// ClientFor mocks base method. +func (m *MockClientChooser) ClientFor(path string) vcs.Client { m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "AllowInsecure", path) - ret0, _ := ret[0].(bool) + ret := m.ctrl.Call(m, "ClientFor", path) + ret0, _ := ret[0].(vcs.Client) return ret0 } -// AllowInsecure indicates an expected call of AllowInsecure -func (mr *MockClientChooserMockRecorder) AllowInsecure(path interface{}) *gomock.Call { +// ClientFor indicates an expected call of ClientFor. +func (mr *MockClientChooserMockRecorder) ClientFor(path interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AllowInsecure", reflect.TypeOf((*MockClientChooser)(nil).AllowInsecure), path) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientFor", reflect.TypeOf((*MockClientChooser)(nil).ClientFor), path) } From 42b93529eabce2b97123eb2d714d7376e33f2d4e Mon Sep 17 00:00:00 2001 From: rvflash Date: Tue, 30 May 2023 19:45:12 +0200 Subject: [PATCH 2/2] errors.join implies go1.20 as minimum go version --- .github/workflows/go-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go-build.yml b/.github/workflows/go-build.yml index c9f7fa5..ef8d119 100644 --- a/.github/workflows/go-build.yml +++ b/.github/workflows/go-build.yml @@ -26,7 +26,7 @@ jobs: test: strategy: matrix: - go-version: [1.17.x, 1.18.x, 1.19.x, 1.20.x] + go-version: [1.20.x] platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} steps: