diff --git a/go.mod b/go.mod index fda6880..75b1162 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,12 @@ module credo -go 1.22.2 +go 1.23.0 + +toolchain go1.23.2 require ( + github.com/CREDOProject/go-dnf v0.1.4 + github.com/CREDOProject/go-osinfo v1.0.0 github.com/CREDOProject/go-pip v0.1.1 github.com/CREDOProject/go-rdepends v0.1.2 github.com/CREDOProject/sharedutils v0.1.2 @@ -12,43 +16,42 @@ require ( require ( github.com/CREDOProject/go-anticonf-parser v0.0.2 // indirect github.com/aquasecurity/go-pep440-version v0.0.0-20210121094942-22b2f8951d46 // indirect - github.com/aquasecurity/go-version v0.0.0-20210121072130-637058cfe492 // indirect + github.com/aquasecurity/go-version v0.0.0-20240603093900-cf8a8d29271d // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect pault.ag/go/debian v0.16.0 // indirect pault.ag/go/topsort v0.1.1 // indirect ) require ( - dario.cat/mergo v1.0.0 // indirect + dario.cat/mergo v1.0.1 // indirect github.com/CREDOProject/go-apt-client v0.4.2 github.com/CREDOProject/go-conda v0.1.1 github.com/CREDOProject/go-isgiturl v1.0.0 - github.com/CREDOProject/go-osinfo v0.0.1 github.com/CREDOProject/go-pythonvenv v0.1.2 - github.com/CREDOProject/go-rcran v0.6.4 + github.com/CREDOProject/go-rcran v0.6.5 github.com/CREDOProject/go-rscript v0.0.1 github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProtonMail/go-crypto v1.0.0 // indirect - github.com/cloudflare/circl v1.3.8 // indirect - github.com/cyphar/filepath-securejoin v0.2.5 // indirect + github.com/cloudflare/circl v1.5.0 // indirect + github.com/cyphar/filepath-securejoin v0.3.4 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect + github.com/go-git/go-billy/v5 v5.6.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect - github.com/spf13/cobra v1.8.0 + github.com/skeema/knownhosts v1.3.0 // indirect + github.com/spf13/cobra v1.8.1 github.com/xanzy/ssh-agent v0.3.3 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/net v0.25.0 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/crypto v0.28.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/sys v0.26.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index e0f6639..1e82d34 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/CREDOProject/go-anticonf-parser v0.0.2 h1:XazKnAcrJqDvMWZ2pt+i4X4G//GKTcjITLqp9FPC4NQ= github.com/CREDOProject/go-anticonf-parser v0.0.2/go.mod h1:LAa2IRV/7NE7Nejpe2QF4UknDMcwDvti1EDkDmgUH9E= @@ -7,10 +9,20 @@ github.com/CREDOProject/go-apt-client v0.4.2 h1:EkOf4wbFH8fqooGx9aUSZpEGHQxS2BtX github.com/CREDOProject/go-apt-client v0.4.2/go.mod h1:/45lmC3Re33I2WJ8JjGaRo8h7v6/HTc5LsPAv0ZLNJk= github.com/CREDOProject/go-conda v0.1.1 h1:oniGCr6lZKr3kxXQjxeofewVuDIfl/a+Oi4P5uphkKY= github.com/CREDOProject/go-conda v0.1.1/go.mod h1:d2YeiK6GMTTa+ve8rD6wRVc9O7kxxqpEHJ37L6RlCuI= +github.com/CREDOProject/go-dnf v0.0.0-20241018071505-3e11ba8cdd9b h1:Btr1j9WbQZ+Q68AK51Z2QSm0zoYCMut6B7oRX6jI2jw= +github.com/CREDOProject/go-dnf v0.0.0-20241018071505-3e11ba8cdd9b/go.mod h1:IT1dUorl7/BaoQtvr/nIPMw1TbezhGok+j6AsuLC+Do= +github.com/CREDOProject/go-dnf v0.0.0-20241018074941-712a4b203673 h1:gRaCxQpm+HL0Sk0cWw/l8TNUf+4bbbwwarFtgJEAcOA= +github.com/CREDOProject/go-dnf v0.0.0-20241018074941-712a4b203673/go.mod h1:IT1dUorl7/BaoQtvr/nIPMw1TbezhGok+j6AsuLC+Do= +github.com/CREDOProject/go-dnf v0.0.0-20241021113554-c1e5604b3469 h1:kh5Bfe0Np44/59+aKQYi9hRaA9904dyQvq/+5K1gQx0= +github.com/CREDOProject/go-dnf v0.0.0-20241021113554-c1e5604b3469/go.mod h1:IT1dUorl7/BaoQtvr/nIPMw1TbezhGok+j6AsuLC+Do= +github.com/CREDOProject/go-dnf v0.0.0-20241022081729-78c9dea28fc9 h1:+oD6QzxsQHSHsYZvqn4LiwKLHhTn5QwPDDCWesaBLXI= +github.com/CREDOProject/go-dnf v0.0.0-20241022081729-78c9dea28fc9/go.mod h1:IT1dUorl7/BaoQtvr/nIPMw1TbezhGok+j6AsuLC+Do= +github.com/CREDOProject/go-dnf v0.1.4 h1:Co/l8Wv1/5P0cIuEsiXdhapRRnvIly+XSLLCq6S2rVI= +github.com/CREDOProject/go-dnf v0.1.4/go.mod h1:IT1dUorl7/BaoQtvr/nIPMw1TbezhGok+j6AsuLC+Do= github.com/CREDOProject/go-isgiturl v1.0.0 h1:ssQzcz46ZUE0waMJaqFimoYuvuRXp5KoIa6+PzTtEpA= github.com/CREDOProject/go-isgiturl v1.0.0/go.mod h1:piuq92nTv3rEpyouSYNf7YMOafHQFaoK/pvFWMIUAG8= -github.com/CREDOProject/go-osinfo v0.0.1 h1:D+wUmSwueGGURJpEkD2ab79EnYYfB4TRw/Jtuyp6ELI= -github.com/CREDOProject/go-osinfo v0.0.1/go.mod h1:iY7wsiIncIlkLB5gGMfU3iJY3hUObZ+XL6TDTJgXUj0= +github.com/CREDOProject/go-osinfo v1.0.0 h1:T1Th6d8SZXYU1JedK88igcIoEi4oxJFBPheetgYSAss= +github.com/CREDOProject/go-osinfo v1.0.0/go.mod h1:iY7wsiIncIlkLB5gGMfU3iJY3hUObZ+XL6TDTJgXUj0= github.com/CREDOProject/go-pip v0.1.0 h1:iLtpsqxn9cowX5DxtTBdmCxYw8vs2Ax9Yp3IxwQQEDo= github.com/CREDOProject/go-pip v0.1.0/go.mod h1:DUkOb7tx/nnoWDOe+bVSOWPbWiXV0jUNsnBD7IN2Fhc= github.com/CREDOProject/go-pip v0.1.1 h1:qV0IMBMtOkJl3zhhN8TR07C2ozP/Vl0HNU8BLCZTP5Q= @@ -19,6 +31,8 @@ github.com/CREDOProject/go-pythonvenv v0.1.2 h1:69HushZb4OwAw3j7S6WoYTragKRB+fuz github.com/CREDOProject/go-pythonvenv v0.1.2/go.mod h1:DMv641yuosSrGjXIcIAMlk0DOm29MJBb1mIShpEqq6Q= github.com/CREDOProject/go-rcran v0.6.4 h1:d6+Wto8zcKtXsTt6nHhIYeKugSHQcdose7dr0dk/5Xo= github.com/CREDOProject/go-rcran v0.6.4/go.mod h1:A/7t+hzSwjTQBpwI+1+ML39VY71h2AODcElKd9O7MtQ= +github.com/CREDOProject/go-rcran v0.6.5 h1:OVBHzbr3EruJzYyAE1VK2NiPloVNx20VFDbCPh3wJvE= +github.com/CREDOProject/go-rcran v0.6.5/go.mod h1:A/7t+hzSwjTQBpwI+1+ML39VY71h2AODcElKd9O7MtQ= github.com/CREDOProject/go-rdepends v0.0.2 h1:BxaIVR9c6TXEiqhbLJA1fSnZSSGFDTBvaOYg9RAEQFQ= github.com/CREDOProject/go-rdepends v0.0.2/go.mod h1:L/VDVrv4SwFIyh+Vssz+SMpM84/S5m9fyNxwyN/FoqM= github.com/CREDOProject/go-rdepends v0.1.0 h1:kbsLdHlnarGrHYW6nLnVXls1PdPfKHfS7pIX7Q7s92A= @@ -42,18 +56,29 @@ github.com/aquasecurity/go-pep440-version v0.0.0-20210121094942-22b2f8951d46 h1: github.com/aquasecurity/go-pep440-version v0.0.0-20210121094942-22b2f8951d46/go.mod h1:olhPNdiiAAMiSujemd1O/sc6GcyePr23f/6uGKtthNg= github.com/aquasecurity/go-version v0.0.0-20210121072130-637058cfe492 h1:rcEG5HI490FF0a7zuvxOxen52ddygCfNVjP0XOCMl+M= github.com/aquasecurity/go-version v0.0.0-20210121072130-637058cfe492/go.mod h1:9Beu8XsUNNfzml7WBf3QmyPToP1wm1Gj/Vc5UJKqTzU= +github.com/aquasecurity/go-version v0.0.0-20240603093900-cf8a8d29271d h1:4zour5Sh9chOg+IqIinIcJ3qtr3cIf8FdFY6aArlXBw= +github.com/aquasecurity/go-version v0.0.0-20240603093900-cf8a8d29271d/go.mod h1:1cPOp4BaQZ1G2F5fnw4dFz6pkOyXJI9KTuak8ghIl3U= 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.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cloudflare/circl v1.4.0 h1:BV7h5MgrktNzytKmWjpOtdYrf0lkkbF8YMlBGPhJQrY= +github.com/cloudflare/circl v1.4.0/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= +github.com/cloudflare/circl v1.5.0 h1:hxIWksrX6XN5a1L2TI/h53AGPhNHoUBo+TD1ms9+pys= +github.com/cloudflare/circl v1.5.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.3.3 h1:lofZkCEVFIBe0KcdQOzFs8Soy9oaHOWl4gGtPI+gCFc= +github.com/cyphar/filepath-securejoin v0.3.3/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= +github.com/cyphar/filepath-securejoin v0.3.4 h1:VBWugsJh2ZxJmLFSM06/0qzQyiQX2Qs0ViKrUAcqdZ8= +github.com/cyphar/filepath-securejoin v0.3.4/go.mod h1:8s/MCNJREmFK0H02MF6Ihv1nakJe4L/w3WZLHNkvlYM= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -68,6 +93,8 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66D github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= +github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZtys= @@ -91,6 +118,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -108,8 +136,12 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -131,6 +163,10 @@ golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -144,6 +180,10 @@ golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/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= @@ -164,6 +204,10 @@ golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -172,6 +216,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= 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= @@ -182,6 +228,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= 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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -190,6 +238,8 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= 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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/modules/apt.go b/modules/apt.go index 92f3cc7..9685e67 100644 --- a/modules/apt.go +++ b/modules/apt.go @@ -36,10 +36,16 @@ func init() { "ubuntu": {}, "debian": {}, } - if _, ok := supportedDistributions[osinfo.Distribution]; !ok { + for _, distribution := range osinfo.Like { + if _, ok := supportedDistributions[distribution]; ok { + Register(aptModuleName, func() Module { return &aptModule{} }) + return + } + } + if _, ok := supportedDistributions[osinfo.Distribution]; ok { + Register(aptModuleName, func() Module { return &aptModule{} }) return } - Register(aptModuleName, func() Module { return &aptModule{} }) } // aptModule is used to manage the apt scope in the credospell configuration. diff --git a/modules/config.go b/modules/config.go index aa7d214..9728b99 100644 --- a/modules/config.go +++ b/modules/config.go @@ -5,6 +5,7 @@ type Config struct { Git []gitSpell `yaml:"git,omitempty"` Pip []pipSpell `yaml:"pip,omitempty"` Apt []aptSpell `yaml:"apt,omitempty"` + Dnf []dnfSpell `yaml:"dnf,omitempty"` Conda []condaSpell `yaml:"conda,omitempty"` Cran []cranSpell `yaml:"cran,omitempty"` } diff --git a/modules/cran.go b/modules/cran.go index 1cbd92f..ff451d8 100644 --- a/modules/cran.go +++ b/modules/cran.go @@ -397,7 +397,7 @@ func (c *cranModule) getDependencies(rscriptBin string, s cranSpell) ([]cranSpel func (c *cranModule) dependencyFunction(bioconductor bool) func( o *gorcran.InstallOptions) (string, error) { if bioconductor { - return gorcran.GetBioconductorDepenencies + return gorcran.GetBioconductorDependencies } return gorcran.GetDependencies } diff --git a/modules/dnf.go b/modules/dnf.go new file mode 100644 index 0000000..b29aa4f --- /dev/null +++ b/modules/dnf.go @@ -0,0 +1,197 @@ +package modules + +import ( + "credo/cache" + "credo/logger" + "fmt" + "os" + "strings" + + dnf "github.com/CREDOProject/go-dnf" + goosinfo "github.com/CREDOProject/go-osinfo" + "github.com/spf13/cobra" +) + +const dnfModuleName = "dnf" + +const dnfModuleShort = "Retrieves a dnf package and its dependencies" + +const dnfModuleExample = ` +Install a dnf package + credo dnf vim +` + +// Registers the dnfModule. +func init() { + osinfo, err := goosinfo.Retrieve() + if err != nil { + logger.Get().Fatal(err) + } + supportedDistributions := map[string]struct{}{ + "rhel": {}, + "centos": {}, + "fedora": {}, + } + for _, dist := range osinfo.Like { + if _, ok := supportedDistributions[dist]; ok { + Register(dnfModuleName, func() Module { return &dnfModule{} }) + return + } + } + if _, ok := supportedDistributions[osinfo.Distribution]; ok { + Register(dnfModuleName, func() Module { return &dnfModule{} }) + return + } +} + +// dnfModule is used to manage the dnf scope in the credospell configuration. +type dnfModule struct{} + +type dnfSpell struct { + Name string `yaml:"name"` + Optional bool `yaml:"optional,omitempty"` + Dependencies []dnfSpell `yaml:"dependencies,omitempty"` + ExternalDependencies Config `yaml:"external_dependencies,omitempty"` +} + +// Function used to check if two dnfSpell objects are equal. +func (d dnfSpell) equals(t equatable) bool { + o, ok := t.(dnfSpell) + if !ok { + return false + } + if strings.Compare(o.Name, d.Name) != 0 { + return false + } + if o.Optional != d.Optional { + return false + } + if len(o.Dependencies) != len(d.Dependencies) { + return false + } + for i := range o.Dependencies { + if !d.Dependencies[i].equals(o.Dependencies[i]) { + return false + } + } + return true +} + +// Apply implements Module. +func (d *dnfModule) Apply(any) error { + panic("unimplemented") +} + +// BulkApply implements Module. +func (d *dnfModule) BulkApply(config *Config) error { + panic("unimplemented") +} + +// BulkSave implements Module. +func (d *dnfModule) BulkSave(config *Config) error { + panic("unimplemented") +} + +// CliConfig implements Module. +func (d *dnfModule) CliConfig(config *Config) *cobra.Command { + return &cobra.Command{ + Args: d.cobraArgs(), + Example: dnfModuleExample, + Run: d.cobraRun(config), + Short: dnfModuleShort, + Use: dnfModuleName, + } +} + +// Function used to run the module from the command line. +// It serves as an entry point to the bare run of the dnfModule. +// +// Intended to be used by cobra. +func (d *dnfModule) cobraRun(config *Config) func(*cobra.Command, []string) { + return func(cmd *cobra.Command, args []string) { + name := args[0] + spell, err := d.bareRun(&dnfSpell{Name: name}) + if err != nil { + logger.Get().Fatal(err) + } + err = d.Commit(config, spell) + if err != nil && err != ErrAlreadyPresent { + logger.Get().Fatal(err) + } + } +} + +// Function used to validate the arguments passed to the dnf command. +// If no arguments are passed, it returns an error. +// Otherwise it returns nil. +// +// Intended to be used by cobra. +func (*dnfModule) cobraArgs() func(*cobra.Command, []string) error { + return func(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("%s module requires at least one argument.", + aptModuleName) + } + return nil + } +} + +// Commit implements Module. +func (d *dnfModule) Commit(config *Config, result any) error { + newEntry, ok := result.(*dnfSpell) + if !ok { + return ErrConverting + } + if Contains(config.Dnf, *newEntry) { + return ErrAlreadyPresent + } + config.Dnf = append(config.Dnf, *newEntry) + return nil +} + +// Save implements Module. +func (d *dnfModule) Save(any) error { + panic("unimplemented") +} + +func (m *dnfModule) bareRun(d *dnfSpell) (*dnfSpell, error) { + if spell := cache.Retrieve(dnfModuleName, d.Name); spell != nil { + if newSpell, ok := spell.(dnfSpell); ok { + return &newSpell, nil + } + } + lDnf := m.getDnf() + dependencies, err := lDnf.Depends(d.Name, &dnf.Options{ + Verbose: false, + DryRun: true, + Output: os.Stdout, + }) + if err != nil { + return nil, fmt.Errorf(`[dnf.bareRun]: %v`, err) + } + if len(dependencies) < 1 { + return nil, fmt.Errorf(`[dnf.bareRun]: Package %s found.`, d.Name) + } + for _, dependency := range dependencies[1:] { + d.Dependencies = append( + d.Dependencies, + dnfSpell{ + Name: dependency.Name, + }, + ) + } + err = lDnf.Install(dependencies[0].Name, + &dnf.Options{DryRun: true, + Output: os.Stdout}) + if err != nil { + return nil, fmt.Errorf(`dnf.bareRun]: %v`, err) + } + d.Name = dependencies[0].Name + _ = cache.Insert(dnfModuleName, d.Name, &d) + return d, nil +} + +func (*dnfModule) getDnf() *dnf.Dnf { + // Passing an empty string to autodetect dnf in system path. + return dnf.New("") +}