diff --git a/go.mod b/go.mod index c0b9d39..f78918a 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,8 @@ module github.com/cidverse/normalizeci go 1.20 require ( - github.com/Masterminds/semver/v3 v3.2.1 github.com/bwmarrin/snowflake v0.3.0 - github.com/go-git/go-git/v5 v5.7.0 + github.com/cidverse/go-vcs v0.0.0-20230529213837-4a8cf1f1f85c github.com/go-playground/validator/v10 v10.14.0 github.com/google/go-github/v52 v52.0.0 github.com/gosimple/slug v1.13.1 @@ -18,8 +17,9 @@ require ( ) require ( + github.com/Masterminds/semver/v3 v3.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230528122434-6f98819771a1 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/cloudflare/circl v1.3.3 // indirect github.com/davecgh/go-spew v1.1.1 // indirect @@ -27,6 +27,7 @@ require ( github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.4.1 // indirect + github.com/go-git/go-git/v5 v5.7.0 // indirect github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -35,12 +36,12 @@ require ( github.com/gosimple/unidecode v1.0.1 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-retryablehttp v0.7.2 // indirect - github.com/imdario/mergo v0.3.15 // indirect + github.com/imdario/mergo v0.3.16 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.18 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect diff --git a/go.sum b/go.sum index 678895d..bce2b89 100644 --- a/go.sum +++ b/go.sum @@ -3,21 +3,17 @@ github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYr github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g= -github.com/ProtonMail/go-crypto v0.0.0-20230426101702-58e86b294756 h1:L6S7kR7SlhQKplIBpkra3s6yhcZV51lhRnXmYc4HohI= -github.com/ProtonMail/go-crypto v0.0.0-20230426101702-58e86b294756/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= -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/ProtonMail/go-crypto v0.0.0-20230528122434-6f98819771a1 h1:JMDGhoQvXNTqH6Y3MC0IUw6tcZvaUdujNqzK2HYWZc8= +github.com/ProtonMail/go-crypto v0.0.0-20230528122434-6f98819771a1/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= 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= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= 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/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cidverse/go-vcs v0.0.0-20230529213837-4a8cf1f1f85c h1:rTl/W4vKHxrbJOmCORDoWan+Suw2b9QLGDQ+Cati/zw= +github.com/cidverse/go-vcs v0.0.0-20230529213837-4a8cf1f1f85c/go.mod h1:A159VrCa6PamRrQWvQSrc5liTdKPMHkn988phWbs1wc= github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -25,23 +21,17 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 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/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= 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/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE= github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -49,8 +39,6 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ= -github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4= github.com/go-playground/validator/v10 v10.14.0 h1:vgvQWe3XCz3gIeFDm/HnTIbj6UGmg/+t63MyGU2n5js= github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -63,7 +51,6 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 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/google/go-github/v52 v52.0.0 h1:uyGWOY+jMQ8GVGSX8dkSwCzlehU3WfdxQ7GweO/JP7M= github.com/google/go-github/v52 v52.0.0/go.mod h1:WJV6VEEUPuMo5pXqqa2ZCZEdbQqua4zAk2MZTIo+m+4= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= @@ -78,14 +65,12 @@ github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxC github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0= github.com/hashicorp/go-retryablehttp v0.7.2/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= -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/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= 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/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= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -104,10 +89,9 @@ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxec github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/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/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -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= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= @@ -120,11 +104,9 @@ github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 h1:OkMGxebDjyw0ULyrTYWeN0UNCCkmCWfjPnIA2W6oviI= github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06/go.mod h1:+ePHsJ1keEjQtpvf9HHw0f4ZeJ0TLRsxhunSI2hYJSs= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -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= @@ -134,10 +116,8 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= @@ -146,19 +126,14 @@ github.com/xanzy/go-gitlab v0.83.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -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-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/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.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= 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.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= @@ -167,10 +142,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 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/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= @@ -182,22 +155,17 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -205,8 +173,7 @@ 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.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.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= @@ -225,7 +192,6 @@ golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= -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/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= @@ -239,16 +205,12 @@ google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cn google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= 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-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= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 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.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -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/mocks/Client.go b/mocks/Client.go deleted file mode 100644 index 9d0d90a..0000000 --- a/mocks/Client.go +++ /dev/null @@ -1,242 +0,0 @@ -// Code generated by mockery v2.26.1. DO NOT EDIT. - -package mocks - -import ( - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" - "github.com/stretchr/testify/mock" -) - -// Client is an autogenerated mock type for the Client type -type Client struct { - mock.Mock -} - -// Check provides a mock function with given fields: -func (_m *Client) Check() bool { - ret := _m.Called() - - var r0 bool - if rf, ok := ret.Get(0).(func() bool); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(bool) - } - - return r0 -} - -// FindCommitByHash provides a mock function with given fields: hash, includeChanges -func (_m *Client) FindCommitByHash(hash string, includeChanges bool) (vcsapi.Commit, error) { - ret := _m.Called(hash, includeChanges) - - var r0 vcsapi.Commit - var r1 error - if rf, ok := ret.Get(0).(func(string, bool) (vcsapi.Commit, error)); ok { - return rf(hash, includeChanges) - } - if rf, ok := ret.Get(0).(func(string, bool) vcsapi.Commit); ok { - r0 = rf(hash, includeChanges) - } else { - r0 = ret.Get(0).(vcsapi.Commit) - } - - if rf, ok := ret.Get(1).(func(string, bool) error); ok { - r1 = rf(hash, includeChanges) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FindCommitsBetween provides a mock function with given fields: from, to, includeChanges, limit -func (_m *Client) FindCommitsBetween(from *vcsapi.VCSRef, to *vcsapi.VCSRef, includeChanges bool, limit int) ([]vcsapi.Commit, error) { - ret := _m.Called(from, to, includeChanges, limit) - - var r0 []vcsapi.Commit - var r1 error - if rf, ok := ret.Get(0).(func(*vcsapi.VCSRef, *vcsapi.VCSRef, bool, int) ([]vcsapi.Commit, error)); ok { - return rf(from, to, includeChanges, limit) - } - if rf, ok := ret.Get(0).(func(*vcsapi.VCSRef, *vcsapi.VCSRef, bool, int) []vcsapi.Commit); ok { - r0 = rf(from, to, includeChanges, limit) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]vcsapi.Commit) - } - } - - if rf, ok := ret.Get(1).(func(*vcsapi.VCSRef, *vcsapi.VCSRef, bool, int) error); ok { - r1 = rf(from, to, includeChanges, limit) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FindLatestRelease provides a mock function with given fields: stable -func (_m *Client) FindLatestRelease(stable bool) (vcsapi.VCSRelease, error) { - ret := _m.Called(stable) - - var r0 vcsapi.VCSRelease - var r1 error - if rf, ok := ret.Get(0).(func(bool) (vcsapi.VCSRelease, error)); ok { - return rf(stable) - } - if rf, ok := ret.Get(0).(func(bool) vcsapi.VCSRelease); ok { - r0 = rf(stable) - } else { - r0 = ret.Get(0).(vcsapi.VCSRelease) - } - - if rf, ok := ret.Get(1).(func(bool) error); ok { - r1 = rf(stable) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// GetTags provides a mock function with given fields: -func (_m *Client) GetTags() []vcsapi.VCSRef { - ret := _m.Called() - - var r0 []vcsapi.VCSRef - if rf, ok := ret.Get(0).(func() []vcsapi.VCSRef); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]vcsapi.VCSRef) - } - } - - return r0 -} - -// GetTagsByHash provides a mock function with given fields: hash -func (_m *Client) GetTagsByHash(hash string) []vcsapi.VCSRef { - ret := _m.Called(hash) - - var r0 []vcsapi.VCSRef - if rf, ok := ret.Get(0).(func(string) []vcsapi.VCSRef); ok { - r0 = rf(hash) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]vcsapi.VCSRef) - } - } - - return r0 -} - -// VCSHead provides a mock function with given fields: -func (_m *Client) VCSHead() (vcsapi.VCSRef, error) { - ret := _m.Called() - - var r0 vcsapi.VCSRef - var r1 error - if rf, ok := ret.Get(0).(func() (vcsapi.VCSRef, error)); ok { - return rf() - } - if rf, ok := ret.Get(0).(func() vcsapi.VCSRef); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(vcsapi.VCSRef) - } - - if rf, ok := ret.Get(1).(func() error); ok { - r1 = rf() - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// VCSHostServer provides a mock function with given fields: remote -func (_m *Client) VCSHostServer(remote string) string { - ret := _m.Called(remote) - - var r0 string - if rf, ok := ret.Get(0).(func(string) string); ok { - r0 = rf(remote) - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// VCSHostType provides a mock function with given fields: server -func (_m *Client) VCSHostType(server string) string { - ret := _m.Called(server) - - var r0 string - if rf, ok := ret.Get(0).(func(string) string); ok { - r0 = rf(server) - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// VCSRefToInternalRef provides a mock function with given fields: ref -func (_m *Client) VCSRefToInternalRef(ref vcsapi.VCSRef) string { - ret := _m.Called(ref) - - var r0 string - if rf, ok := ret.Get(0).(func(vcsapi.VCSRef) string); ok { - r0 = rf(ref) - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// VCSRemote provides a mock function with given fields: -func (_m *Client) VCSRemote() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// VCSType provides a mock function with given fields: -func (_m *Client) VCSType() string { - ret := _m.Called() - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -type mockConstructorTestingTNewClient interface { - mock.TestingT - Cleanup(func()) -} - -// NewClient creates a new instance of Client. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -func NewClient(t mockConstructorTestingTNewClient) *Client { - mock := &Client{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/pkg/normalizer/api/common.go b/pkg/normalizer/api/common.go index 5e11fef..38a72e9 100644 --- a/pkg/normalizer/api/common.go +++ b/pkg/normalizer/api/common.go @@ -1,7 +1,6 @@ package api import ( - "errors" "net/url" "os" "path/filepath" @@ -74,29 +73,6 @@ func GetWorkingDirectory() string { return dir } -// GetProjectDirectory will try to find the project directory based on repository folders (.git) -func GetProjectDirectory() (string, error) { - currentDirectory := GetWorkingDirectory() - var projectDirectory = "" - directoryParts := strings.Split(currentDirectory, string(os.PathSeparator)) - - for projectDirectory == "" { - // git repository - if _, err := os.Stat(filepath.Join(currentDirectory, "/.git")); err == nil { - return currentDirectory, nil - } - - // cancel at root path - if directoryParts[0]+"\\" == currentDirectory || currentDirectory == "/" { - return "", errors.New("didn't find any repositories for the current working directory") - } - - currentDirectory = filepath.Dir(currentDirectory) - } - - return "", errors.New("didn't find any repositories for the current working directory") -} - // GetDirectoryNameFromPath gets the directory name from a path func GetDirectoryNameFromPath(path string) string { dir := filepath.Dir(path) diff --git a/pkg/normalizer/azuredevops/common_test.go b/pkg/normalizer/azuredevops/common_test.go index 5f7aaf8..f70c5d3 100644 --- a/pkg/normalizer/azuredevops/common_test.go +++ b/pkg/normalizer/azuredevops/common_test.go @@ -4,8 +4,8 @@ import ( "os" "testing" - "github.com/cidverse/normalizeci/mocks" - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" + "github.com/cidverse/go-vcs/mocks" + "github.com/cidverse/go-vcs/vcsapi" "github.com/rs/zerolog" ) diff --git a/pkg/normalizer/azuredevops/normalize.go b/pkg/normalizer/azuredevops/normalize.go index 4bf1666..ffbb70d 100644 --- a/pkg/normalizer/azuredevops/normalize.go +++ b/pkg/normalizer/azuredevops/normalize.go @@ -5,9 +5,9 @@ import ( "runtime" "time" + "github.com/cidverse/go-vcs/vcsutil" "github.com/cidverse/normalizeci/pkg/ncispec/common" v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" - "github.com/cidverse/normalizeci/pkg/normalizer/api" "github.com/cidverse/normalizeci/pkg/projectdetails" "github.com/cidverse/normalizeci/pkg/vcsrepository" "github.com/gosimple/slug" @@ -53,7 +53,7 @@ func (n Normalizer) Normalize(env map[string]string) v1.Spec { nci.Pipeline.Url = fmt.Sprintf("%s%s/_build/results?buildId=%s", env["SYSTEM_TEAMFOUNDATIONSERVERURI"], env["SYSTEM_TEAMPROJECT"], env["BUILD_BUILDID"]) // repository - projectDir := vcsrepository.FindRepositoryDirectory(api.GetWorkingDirectory()) + projectDir, _ := vcsutil.FindProjectDirectory() vcsData, addDataErr := vcsrepository.GetVCSRepositoryInformation(projectDir) if addDataErr != nil { panic(addDataErr) diff --git a/pkg/normalizer/azuredevops/normalize_test.go b/pkg/normalizer/azuredevops/normalize_test.go index 657962b..1b864ac 100644 --- a/pkg/normalizer/azuredevops/normalize_test.go +++ b/pkg/normalizer/azuredevops/normalize_test.go @@ -4,12 +4,12 @@ import ( "runtime" "testing" - "github.com/cidverse/normalizeci/pkg/vcsrepository" + "github.com/cidverse/go-vcs" "github.com/stretchr/testify/assert" ) func TestNormalizer_Normalize_Common(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{}) @@ -20,7 +20,7 @@ func TestNormalizer_Normalize_Common(t *testing.T) { } func TestNormalizer_Normalize_Worker(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "AGENT_ID": "9", @@ -39,7 +39,7 @@ func TestNormalizer_Normalize_Worker(t *testing.T) { } func TestNormalizer_Normalize_Pipeline(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "SYSTEM_PHASEID": "a11efe29-9b58-5a6c-3fa4-3e36996dcbd8", diff --git a/pkg/normalizer/githubactions/common_test.go b/pkg/normalizer/githubactions/common_test.go index 4445fdb..8773778 100644 --- a/pkg/normalizer/githubactions/common_test.go +++ b/pkg/normalizer/githubactions/common_test.go @@ -4,8 +4,8 @@ import ( "os" "testing" - "github.com/cidverse/normalizeci/mocks" - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" + "github.com/cidverse/go-vcs/mocks" + "github.com/cidverse/go-vcs/vcsapi" "github.com/rs/zerolog" ) diff --git a/pkg/normalizer/githubactions/normalize.go b/pkg/normalizer/githubactions/normalize.go index 310abc4..0fd9a9f 100644 --- a/pkg/normalizer/githubactions/normalize.go +++ b/pkg/normalizer/githubactions/normalize.go @@ -8,10 +8,10 @@ import ( "strings" "time" + "github.com/cidverse/go-vcs/vcsutil" "github.com/cidverse/normalizeci/pkg/ncispec/common" v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" "github.com/cidverse/normalizeci/pkg/nciutil" - "github.com/cidverse/normalizeci/pkg/normalizer/api" "github.com/cidverse/normalizeci/pkg/projectdetails" "github.com/cidverse/normalizeci/pkg/vcsrepository" "github.com/google/go-github/v52/github" @@ -60,7 +60,7 @@ func (n Normalizer) Normalize(env map[string]string) v1.Spec { } // repository - projectDir := vcsrepository.FindRepositoryDirectory(api.GetWorkingDirectory()) + projectDir, _ := vcsutil.FindProjectDirectory() vcsData, addDataErr := vcsrepository.GetVCSRepositoryInformation(projectDir) if addDataErr != nil { panic(addDataErr) @@ -92,11 +92,14 @@ func (n Normalizer) Normalize(env map[string]string) v1.Spec { // pull request event if pullRequestEvent, ok := githubEvent.(*github.PullRequestEvent); ok { - nci.MergeRequest.Id = fmt.Sprintf("%d", pullRequestEvent.PullRequest.GetNumber()) - nci.MergeRequest.SourceBranchName = pullRequestEvent.PullRequest.Head.GetRef() - nci.MergeRequest.SourceHash = pullRequestEvent.PullRequest.Head.GetSHA() - nci.MergeRequest.TargetBranchName = pullRequestEvent.PullRequest.Base.GetRef() - nci.MergeRequest.TargetHash = pullRequestEvent.PullRequest.Base.GetSHA() + nci.MergeRequest = v1.MergeRequest{ + Id: fmt.Sprintf("%d", pullRequestEvent.PullRequest.GetNumber()), + Title: pullRequestEvent.PullRequest.GetTitle(), + SourceBranchName: pullRequestEvent.PullRequest.Head.GetRef(), + SourceHash: pullRequestEvent.PullRequest.Head.GetSHA(), + TargetBranchName: pullRequestEvent.PullRequest.Base.GetRef(), + TargetHash: pullRequestEvent.PullRequest.Base.GetSHA(), + } } // workflow dispatch event can have custom input parameters diff --git a/pkg/normalizer/githubactions/normalize_test.go b/pkg/normalizer/githubactions/normalize_test.go index 715de31..95e8163 100644 --- a/pkg/normalizer/githubactions/normalize_test.go +++ b/pkg/normalizer/githubactions/normalize_test.go @@ -6,13 +6,13 @@ import ( "runtime" "testing" - "github.com/cidverse/normalizeci/pkg/vcsrepository" + "github.com/cidverse/go-vcs" "github.com/jarcoal/httpmock" "github.com/stretchr/testify/assert" ) func TestNormalizer_Normalize_Common(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{}) @@ -23,7 +23,7 @@ func TestNormalizer_Normalize_Common(t *testing.T) { } func TestNormalizer_Normalize_Worker(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "RUNNER_TRACKING_ID": "github_969396af-1899-4849-9318-7807141c54e9", @@ -40,7 +40,7 @@ func TestNormalizer_Normalize_Worker(t *testing.T) { } func TestNormalizer_Normalize_Pipeline(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "GITHUB_RUN_ID": "2303126757", @@ -64,7 +64,7 @@ func TestNormalizer_Normalize_Pipeline(t *testing.T) { } func TestNormalizer_Normalize_Project(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "GITHUB_SERVER_URL": "https://github.com", @@ -75,7 +75,7 @@ func TestNormalizer_Normalize_Project(t *testing.T) { } func TestNormalizer_Normalize_WorkflowAPI(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) githubMockClient = &http.Client{} httpmock.ActivateNonDefault(githubMockClient) defer httpmock.DeactivateAndReset() diff --git a/pkg/normalizer/gitlabci/common_test.go b/pkg/normalizer/gitlabci/common_test.go index 817d8ba..3a5584d 100644 --- a/pkg/normalizer/gitlabci/common_test.go +++ b/pkg/normalizer/gitlabci/common_test.go @@ -4,8 +4,8 @@ import ( "os" "testing" - "github.com/cidverse/normalizeci/mocks" - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" + "github.com/cidverse/go-vcs/mocks" + "github.com/cidverse/go-vcs/vcsapi" "github.com/rs/zerolog" ) diff --git a/pkg/normalizer/gitlabci/normalize.go b/pkg/normalizer/gitlabci/normalize.go index ac8fc2e..271b465 100644 --- a/pkg/normalizer/gitlabci/normalize.go +++ b/pkg/normalizer/gitlabci/normalize.go @@ -3,10 +3,10 @@ package gitlabci import ( "runtime" + "github.com/cidverse/go-vcs/vcsutil" "github.com/cidverse/normalizeci/pkg/ncispec/common" v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" "github.com/cidverse/normalizeci/pkg/nciutil" - "github.com/cidverse/normalizeci/pkg/normalizer/api" "github.com/cidverse/normalizeci/pkg/projectdetails" "github.com/cidverse/normalizeci/pkg/vcsrepository" "github.com/gosimple/slug" @@ -49,7 +49,7 @@ func (n Normalizer) Normalize(env map[string]string) v1.Spec { } // repository - projectDir := vcsrepository.FindRepositoryDirectory(api.GetWorkingDirectory()) + projectDir, _ := vcsutil.FindProjectDirectory() vcsData, addDataErr := vcsrepository.GetVCSRepositoryInformation(projectDir) if addDataErr != nil { panic(addDataErr) diff --git a/pkg/normalizer/gitlabci/normalize_test.go b/pkg/normalizer/gitlabci/normalize_test.go index 5e7780d..483a0a2 100644 --- a/pkg/normalizer/gitlabci/normalize_test.go +++ b/pkg/normalizer/gitlabci/normalize_test.go @@ -5,12 +5,12 @@ import ( "runtime" "testing" - "github.com/cidverse/normalizeci/pkg/vcsrepository" + "github.com/cidverse/go-vcs" "github.com/stretchr/testify/assert" ) func TestNormalizer_Normalize_Common(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{}) @@ -21,7 +21,7 @@ func TestNormalizer_Normalize_Common(t *testing.T) { } func TestNormalizer_Normalize_Worker(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "CI_RUNNER_ID": "12270837", @@ -37,7 +37,7 @@ func TestNormalizer_Normalize_Worker(t *testing.T) { } func TestNormalizer_Normalize_Pipeline(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "CI_PIPELINE_ID": "535898514", @@ -62,7 +62,7 @@ func TestNormalizer_Normalize_Pipeline(t *testing.T) { } func TestNormalizer_Normalize_MergeRequest(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "CI_MERGE_REQUEST_IID": "153", @@ -76,7 +76,7 @@ func TestNormalizer_Normalize_MergeRequest(t *testing.T) { } func TestNormalizer_Normalize_Project(t *testing.T) { - vcsrepository.MockClient = MockVCSClient(t) + vcs.MockClient = MockVCSClient(t) var normalizer = NewNormalizer() var normalized = normalizer.Normalize(map[string]string{ "CI_PROJECT_ID": "35974876", diff --git a/pkg/normalizer/localgit/localgit.go b/pkg/normalizer/localgit/localgit.go index bee1887..0aa2008 100644 --- a/pkg/normalizer/localgit/localgit.go +++ b/pkg/normalizer/localgit/localgit.go @@ -4,10 +4,10 @@ import ( "runtime" "time" + "github.com/cidverse/go-vcs/vcsutil" "github.com/cidverse/normalizeci/pkg/ncispec/common" v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" "github.com/cidverse/normalizeci/pkg/nciutil" - "github.com/cidverse/normalizeci/pkg/normalizer/api" "github.com/cidverse/normalizeci/pkg/projectdetails" "github.com/cidverse/normalizeci/pkg/vcsrepository" ) @@ -59,7 +59,7 @@ func (n Normalizer) Normalize(env map[string]string) v1.Spec { nci.Pipeline.Attempt = "1" // repository - projectDir := vcsrepository.FindRepositoryDirectory(api.GetWorkingDirectory()) + projectDir, _ := vcsutil.FindProjectDirectory() vcsData, addDataErr := vcsrepository.GetVCSRepositoryInformation(projectDir) if addDataErr != nil { panic(addDataErr) diff --git a/pkg/vcsrepository/git/client_git.go b/pkg/vcsrepository/git/client_git.go deleted file mode 100644 index fc81d50..0000000 --- a/pkg/vcsrepository/git/client_git.go +++ /dev/null @@ -1,322 +0,0 @@ -package gitclient - -import ( - "errors" - "net/url" - "os" - "path" - "path/filepath" - "regexp" - "strings" - - "github.com/Masterminds/semver/v3" - "github.com/cidverse/normalizeci/pkg/normalizer/api" - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/go-git/go-git/v5/plumbing/object" - "github.com/go-git/go-git/v5/utils/merkletrie" - "github.com/rs/zerolog/log" -) - -const REF_TAGS = "refs/tags/" -const REF_HEADS = "refs/heads/" -const REF_REMOTES = "refs/remotes/" -const TAGS = "tags/" - -type GitClient struct { - dir string - repo *git.Repository - isShallow bool - tags []vcsapi.VCSRef - tagsByHash map[string][]vcsapi.VCSRef -} - -func NewGitClient(dir string) (vcsapi.Client, error) { - c := GitClient{dir: dir} - if !c.Check() { - return nil, errors.New("is not a git repository") - } - - repo, err := git.PlainOpen(dir) - if err != nil { - return nil, errors.New("failed to open git repository at " + dir + ": " + err.Error()) - } - c.repo = repo - c.isShallow = fileExists(filepath.Join(dir, ".git", "shallow")) - - return c, nil -} - -func (c GitClient) Check() bool { - if _, err := os.Stat(path.Join(c.dir, ".git")); !os.IsNotExist(err) { - return true - } - - return false -} - -func (c GitClient) VCSType() string { - return "git" -} - -func (c GitClient) VCSRemote() string { - remote, remoteErr := c.repo.Remote("origin") - if remoteErr == nil && remote != nil && remote.Config() != nil && len(remote.Config().URLs) > 0 { - return remote.Config().URLs[0] - } - - return "local" -} - -func (c GitClient) VCSHostServer(remote string) string { - if remote != "local" { - // git over ssh - if strings.HasPrefix(remote, "git@") { - re := regexp.MustCompile(`(?i)^git@([^:]+):`) - host := re.FindStringSubmatch(remote)[1] - return host - } - - u, err := url.Parse(remote) - if err != nil { - log.Warn().Err(err).Msg("error parsing URL") - return "" - } - - return u.Host - } - - return "" -} - -func (c GitClient) VCSHostType(server string) string { - if server == "github.com" { - return "github" - } else if server == "gitlab.com" || strings.Contains(server, "gitlab.") { - return "gitlab" - } else if len(os.Getenv(api.ToEnvName(server)+"_TYPE")) > 0 { - os.Getenv(api.ToEnvName(server) + "_TYPE") - } - - return "" -} - -func (c GitClient) VCSRefToInternalRef(ref vcsapi.VCSRef) string { - if ref.Type == "branch" { - return REF_HEADS + ref.Value - } else if ref.Type == "tag" { - return REF_TAGS + strings.TrimPrefix(ref.Value, "tags/") - } - - return ref.Hash -} - -func (c GitClient) VCSHead() (vcsHead vcsapi.VCSRef, err error) { - // head reference - ref, err := c.repo.Head() - if err != nil { - return vcsapi.VCSRef{}, err - } - - if strings.HasPrefix(ref.Name().String(), REF_TAGS) { - tagName := ref.Name().String()[len(REF_TAGS):] - return vcsapi.VCSRef{Type: "tag", Value: tagName, Hash: ref.Hash().String()}, nil - } else if strings.HasPrefix(ref.Name().String(), REF_HEADS) { - branchName := ref.Name().String()[11:] - return vcsapi.VCSRef{Type: "branch", Value: branchName, Hash: ref.Hash().String()}, nil - } else if ref.Name().String() == "HEAD" { - // detached HEAD, check git reflog for the true reference - gitRefLogFile := filepath.Join(c.dir, ".git", "logs", "HEAD") - lastLine := readLastLine(gitRefLogFile) - return ParseGitRefLogLine(lastLine, ref.Hash().String()), nil - } - - return vcsapi.VCSRef{}, errors.New("can't determinate repo head") -} - -func ParseGitRefLogLine(line string, hash string) vcsapi.VCSRef { - pattern := regexp.MustCompile(`.*checkout: moving from (?P.*) to (?P.*)$`) - match := pattern.FindStringSubmatch(line) - - if strings.HasPrefix(match[2], REF_REMOTES+"pull") { - // handle github merge request as virtual branch - return vcsapi.VCSRef{Type: "branch", Value: match[2][13:], Hash: hash} - } else if len(match[2]) == 40 { - return vcsapi.VCSRef{Type: "branch", Value: match[1], Hash: hash} - } else if strings.HasPrefix(match[2], REF_TAGS) { - return vcsapi.VCSRef{Type: "tag", Value: match[2][10:], Hash: hash} - } else if strings.HasPrefix(match[2], TAGS) { // checkout: moving from develop to tags/v1.0.0 - return vcsapi.VCSRef{Type: "tag", Value: match[2][len(TAGS):], Hash: hash} - } else { - return vcsapi.VCSRef{Type: "branch", Value: match[2], Hash: hash} - } -} - -func (c GitClient) GetTags() []vcsapi.VCSRef { - if c.tags == nil { - var tags []vcsapi.VCSRef - - iter, err := c.repo.Tags() - if err == nil { - iter.ForEach(func(r *plumbing.Reference) error { - if r.Name().IsTag() { - t := vcsapi.VCSRef{ - Type: "tag", - Value: strings.TrimPrefix(r.Name().String(), REF_TAGS), - Hash: r.Hash().String(), - } - tags = append(tags, t) - } - - return nil - }) - } - - c.tags = tags - } - - return c.tags -} - -func (c GitClient) GetTagsByHash(hash string) []vcsapi.VCSRef { - if c.tagsByHash == nil { - c.tagsByHash = make(map[string][]vcsapi.VCSRef) - - iter, err := c.repo.Tags() - if err == nil { - iter.ForEach(func(r *plumbing.Reference) error { - if r.Name().IsTag() { - t := vcsapi.VCSRef{ - Type: "tag", - Value: strings.TrimPrefix(r.Name().String(), REF_TAGS), - Hash: r.Hash().String(), - } - - c.tagsByHash[r.Hash().String()] = append(c.tagsByHash[r.Hash().String()], t) - } - - return nil - }) - } - } - - return c.tagsByHash[hash] -} - -func (c GitClient) FindCommitByHash(hash string, includeChanges bool) (vcsapi.Commit, error) { - cIter, _ := c.repo.Log(&git.LogOptions{All: true}) - for { - commit, commitErr := cIter.Next() - if commitErr != nil { - return vcsapi.Commit{}, commitErr - } - - // check - if hash == commit.Hash.String() || hash == commit.Hash.String()[:7] { - // return commit - return gitCommitToVCSCommit(commit, c.GetTagsByHash(commit.Hash.String()), includeChanges), nil - } - } -} - -func (c GitClient) FindCommitsBetween(from *vcsapi.VCSRef, to *vcsapi.VCSRef, includeChanges bool, limit int) ([]vcsapi.Commit, error) { - // from reference - var fromHash plumbing.Hash - if from == nil { - head, headErr := c.repo.Head() - if headErr != nil { - return nil, headErr - } - fromHash = head.Hash() - } else { - fromHash, _ = refToHash(c.repo, c.VCSRefToInternalRef(*from)) - } - - // to reference - var toHash plumbing.Hash - if to != nil { - toHash, _ = refToHash(c.repo, c.VCSRefToInternalRef(*to)) - } - - // commit iterator - cIter, _ := c.repo.Log(&git.LogOptions{From: fromHash}) - var commits []vcsapi.Commit - for { - commit, commitErr := cIter.Next() - if commitErr != nil { - break - } - - // check - if to != nil && toHash.String() == commit.Hash.String() { - break - } - - // limit - if limit != 0 && len(commits) >= limit { - break - } - - commits = append(commits, gitCommitToVCSCommit(commit, c.GetTagsByHash(commit.Hash.String()), includeChanges)) - } - - return commits, nil -} - -func (c GitClient) FindLatestRelease(stable bool) (vcsapi.VCSRelease, error) { - var latestVersion, _ = semver.NewVersion("0.0.0") - var latest vcsapi.VCSRelease - - tags := c.GetTags() - for _, tag := range tags { - version, versionErr := semver.NewVersion(tag.Value) - if versionErr == nil { - if version.Compare(latestVersion) > 0 { - if (stable && len(version.Prerelease()) == 0) || !stable { - latestVersion = version - latest = vcsapi.VCSRelease{ - Type: tag.Type, - Value: tag.Value, - Hash: tag.Hash, - Version: version.String(), - } - } - } - } - } - - return latest, nil -} - -func gitFileActionToText(input merkletrie.Action) string { - if input == merkletrie.Insert { - return "create" - } else if input == merkletrie.Modify { - return "update" - } else if input == merkletrie.Delete { - return "delete" - } - - return "" -} - -func refToHash(repo *git.Repository, ref string) (hash plumbing.Hash, err error) { - if strings.HasPrefix(ref, "refs/") { - var pRef *plumbing.Reference - pRef, err = repo.Reference(plumbing.ReferenceName(ref), true) - if err != nil { - return hash, err - } - hash = pRef.Hash() - } else { - var commit *object.Commit - commit, err = repo.CommitObject(plumbing.NewHash(ref)) - if err != nil { - return hash, err - } - hash = commit.Hash - } - - return hash, err -} diff --git a/pkg/vcsrepository/git/client_git_test.go b/pkg/vcsrepository/git/client_git_test.go deleted file mode 100644 index f4d3f2a..0000000 --- a/pkg/vcsrepository/git/client_git_test.go +++ /dev/null @@ -1,158 +0,0 @@ -package gitclient - -import ( - "strings" - "testing" - - "github.com/cidverse/normalizeci/pkg/normalizer/api" - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" - "github.com/stretchr/testify/assert" -) - -func TestGetCommitByHashWithChanges(t *testing.T) { - projectDir, _ := api.GetProjectDirectory() - - client, clientErr := NewGitClient(projectDir) - assert.NoError(t, clientErr) - assert.NotNil(t, client) - - commit, commitErr := client.FindCommitByHash("93591c7d4d56d961b09d44ec6a866e4c53a2b947", true) - assert.NoError(t, commitErr) - assert.NotNil(t, commit) - - assert.Equal(t, "93591c7", commit.ShortHash) - assert.Equal(t, "93591c7d4d56d961b09d44ec6a866e4c53a2b947", commit.Hash) - assert.Equal(t, "chore(deps): update module github.com/xanzy/go-gitlab to v0.76.0 (#20)", commit.Message) - assert.Equal(t, "Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>", commit.Description) - assert.Equal(t, "renovate[bot]", commit.Author.Name) - assert.Equal(t, "29139614+renovate[bot]@users.noreply.github.com", commit.Author.Email) - assert.Equal(t, "GitHub", commit.Committer.Name) - assert.Equal(t, "noreply@github.com", commit.Committer.Email) - assert.Nil(t, commit.Context) - - assert.Equal(t, "update", commit.Changes[0].Type) - assert.Equal(t, "go.mod", commit.Changes[0].FileFrom.Name) - assert.Equal(t, "48f397f4b543c87e1c80992b0ff4ddc881a42eae", commit.Changes[0].FileFrom.Hash) - assert.Equal(t, "go.mod", commit.Changes[0].FileTo.Name) - assert.Equal(t, "3489cc8928678653ceadf47954a1c2f5d8f01e0c", commit.Changes[0].FileTo.Hash) - assert.NotNil(t, commit.Changes[0].Patch) -} - -func TestFindGitCommitsBetweenRefs(t *testing.T) { - projectDir, _ := api.GetProjectDirectory() - - client, clientErr := NewGitClient(projectDir) - assert.NoError(t, clientErr) - assert.NotNil(t, client) - - commits, commitsErr := client.FindCommitsBetween(&vcsapi.VCSRef{Type: "tag", Value: "v1.0.0"}, &vcsapi.VCSRef{Type: "tag", Value: "v0.9.0"}, false, 0) - assert.NoError(t, commitsErr) - assert.NotNil(t, commits) - assert.Equal(t, 2, len(commits)) - - // commit 1 - assert.Equal(t, "chore: update workflow script", commits[0].Message) - assert.Equal(t, "", commits[0].Description) - assert.Equal(t, "Philipp Heuer", commits[0].Author.Name) - assert.Equal(t, "git@philippheuer.me", commits[0].Author.Email) - assert.Equal(t, "Philipp Heuer", commits[0].Committer.Name) - assert.Equal(t, "git@philippheuer.me", commits[0].Committer.Email) - assert.Equal(t, "c1604a3", commits[0].ShortHash) - assert.Equal(t, "c1604a3bf7b1b686608616206e357b1aae07ec45", commits[0].Hash) - assert.Equal(t, int64(1578348804000000000), commits[0].AuthoredAt.UnixNano()) - assert.Equal(t, 1, len(commits[0].Tags)) - assert.Equal(t, "tag", commits[0].Tags[0].Type) - assert.Equal(t, "v1.0.0", commits[0].Tags[0].Value) - assert.Nil(t, commits[0].Context) - - // commit 2 - assert.Equal(t, "fix: escape special chars in commit title / message and set default values for empty repos", commits[1].Message) - assert.Equal(t, "", commits[1].Description) - assert.Equal(t, "Philipp Heuer", commits[1].Author.Name) - assert.Equal(t, "git@philippheuer.me", commits[1].Author.Email) - assert.Equal(t, "Philipp Heuer", commits[1].Committer.Name) - assert.Equal(t, "git@philippheuer.me", commits[1].Committer.Email) - assert.Equal(t, "f3d7bd7", commits[1].ShortHash) - assert.Equal(t, "f3d7bd736652725711fc4dc1dab0b3206ec4d3ae", commits[1].Hash) - assert.Equal(t, int64(1578348473000000000), commits[1].AuthoredAt.UnixNano()) - assert.Equal(t, 0, len(commits[1].Tags)) - assert.Nil(t, commits[1].Context) -} - -func TestFindGitCommitsBetweenHashRefs(t *testing.T) { - projectDir, _ := api.GetProjectDirectory() - - client, clientErr := NewGitClient(projectDir) - assert.NoError(t, clientErr) - assert.NotNil(t, client) - - commits, commitsErr := client.FindCommitsBetween(&vcsapi.VCSRef{Type: "hash", Hash: "c1604a3bf7b1b686608616206e357b1aae07ec45"}, &vcsapi.VCSRef{Type: "tag", Value: "v0.9.0"}, false, 0) - assert.NoError(t, commitsErr) - assert.NotNil(t, commits) - assert.Equal(t, 2, len(commits)) - - // commit 1 - assert.Equal(t, "chore: update workflow script", commits[0].Message) - assert.Equal(t, "", commits[0].Description) - assert.Equal(t, "Philipp Heuer", commits[0].Author.Name) - assert.Equal(t, "git@philippheuer.me", commits[0].Author.Email) - assert.Equal(t, "Philipp Heuer", commits[0].Committer.Name) - assert.Equal(t, "git@philippheuer.me", commits[0].Committer.Email) - assert.Equal(t, "c1604a3", commits[0].ShortHash) - assert.Equal(t, "c1604a3bf7b1b686608616206e357b1aae07ec45", commits[0].Hash) - assert.Equal(t, int64(1578348804000000000), commits[0].AuthoredAt.UnixNano()) - assert.Equal(t, 1, len(commits[0].Tags)) - assert.Equal(t, "tag", commits[0].Tags[0].Type) - assert.Equal(t, "v1.0.0", commits[0].Tags[0].Value) - assert.Nil(t, commits[0].Context) - - // commit 2 - assert.Equal(t, "fix: escape special chars in commit title / message and set default values for empty repos", commits[1].Message) - assert.Equal(t, "", commits[1].Description) - assert.Equal(t, "Philipp Heuer", commits[1].Author.Name) - assert.Equal(t, "git@philippheuer.me", commits[1].Author.Email) - assert.Equal(t, "Philipp Heuer", commits[1].Committer.Name) - assert.Equal(t, "git@philippheuer.me", commits[1].Committer.Email) - assert.Equal(t, "f3d7bd7", commits[1].ShortHash) - assert.Equal(t, "f3d7bd736652725711fc4dc1dab0b3206ec4d3ae", commits[1].Hash) - assert.Equal(t, int64(1578348473000000000), commits[1].AuthoredAt.UnixNano()) - assert.Equal(t, 0, len(commits[1].Tags)) - assert.Nil(t, commits[1].Context) -} - -func TestFindLatestGitReleaseFromCommit(t *testing.T) { - projectDir, _ := api.GetProjectDirectory() - - client, clientErr := NewGitClient(projectDir) - assert.NoError(t, clientErr) - assert.NotNil(t, client) - - release, releaseErr := client.FindLatestRelease(true) - assert.NoError(t, releaseErr) - assert.NotNil(t, release) - assert.Equal(t, "tag", release.Type) - assert.True(t, true, strings.HasPrefix(release.Value, "v")) - assert.Regexp(t, "v[0-9]+.[0-9]+.[0-9]+", release.Value) - assert.Regexp(t, "[0-9]+.[0-9]+.[0-9]+", release.Version) -} - -func TestParseGitRefLogLine_Tag(t *testing.T) { - vcsRef := ParseGitRefLogLine("0000000000000000000000000000000000000000 1cafbbdb80ce27304ac92a9e2fde6c3df8119a19 runner 1679700466 +0000\tcheckout: moving from master to refs/tags/v2.0.0-alpha.1", "1cafbbdb80ce27304ac92a9e2fde6c3df8119a19") - assert.Equal(t, "1cafbbdb80ce27304ac92a9e2fde6c3df8119a19", vcsRef.Hash) - assert.Equal(t, "tag", vcsRef.Type) - assert.Equal(t, "v2.0.0-alpha.1", vcsRef.Value) -} - -func TestParseGitRefLogLine_LocalBranch(t *testing.T) { - vcsRef := ParseGitRefLogLine("0000000000000000000000000000000000000000 1cafbbdb80ce27304ac92a9e2fde6c3df8119a19 runner 1679700466 +0000\tcheckout: moving from master to feature-branch", "1cafbbdb80ce27304ac92a9e2fde6c3df8119a19") - assert.Equal(t, "1cafbbdb80ce27304ac92a9e2fde6c3df8119a19", vcsRef.Hash) - assert.Equal(t, "branch", vcsRef.Type) - assert.Equal(t, "feature-branch", vcsRef.Value) -} - -func TestParseGitRefLogLine_Hash(t *testing.T) { - vcsRef := ParseGitRefLogLine("0000000000000000000000000000000000000000 1cafbbdb80ce27304ac92a9e2fde6c3df8119a19 runner 1679700466 +0000\tcheckout: moving from master to 1cafbbdb80ce27304ac92a9e2fde6c3df8119a19", "1cafbbdb80ce27304ac92a9e2fde6c3df8119a19") - assert.Equal(t, "1cafbbdb80ce27304ac92a9e2fde6c3df8119a19", vcsRef.Hash) - assert.Equal(t, "branch", vcsRef.Type) - assert.Equal(t, "master", vcsRef.Value) -} diff --git a/pkg/vcsrepository/git/convert.go b/pkg/vcsrepository/git/convert.go deleted file mode 100644 index 963dec9..0000000 --- a/pkg/vcsrepository/git/convert.go +++ /dev/null @@ -1,116 +0,0 @@ -package gitclient - -import ( - "strings" - - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" - "github.com/go-git/go-git/v5/plumbing/object" - "github.com/rs/zerolog/log" -) - -func gitCommitToVCSCommit(commit *object.Commit, tags []vcsapi.VCSRef, withContent bool) vcsapi.Commit { - // commit title and description - commitInfo := strings.SplitN(commit.Message, "\n", 2) - var commitDescription string - if len(commitInfo) == 2 { - commitDescription = commitInfo[1] - commitDescription = strings.Trim(strings.Trim(commitDescription, "\r\n"), "\n") - } - - // changes - var changes []vcsapi.CommitChange - if withContent { - var err error - changes, err = gitCommitChangeToVCSCommitChange(commit) - log.Debug().Err(err).Str("hash", commit.Hash.String()).Msg("failed to get changes for commit") - } - - return vcsapi.Commit{ - ShortHash: commit.Hash.String()[:7], - Hash: commit.Hash.String(), - Message: commitInfo[0], - Description: commitDescription, - Author: vcsapi.CommitAuthor{ - Name: commit.Author.Name, - Email: commit.Author.Email, - }, - Committer: vcsapi.CommitAuthor{ - Name: commit.Committer.Name, - Email: commit.Committer.Email, - }, - Tags: tags, - AuthoredAt: commit.Author.When, - CommittedAt: commit.Committer.When, - Context: nil, - Changes: changes, - } -} - -func gitCommitChangeToVCSCommitChange(commit *object.Commit) (result []vcsapi.CommitChange, err error) { - currentDirState, err := commit.Tree() - if err != nil { - return nil, err - } - - // get Previous Directory state - prevCommitObject, err := commit.Parents().Next() - if err != nil { - return nil, err - } - - prevDirState, err := prevCommitObject.Tree() - if err != nil { - return nil, err - } - - changes, err := prevDirState.Diff(currentDirState) - if err != nil { - return nil, err - } - - for _, change := range changes { - // Ignore deleted files - action, cErr := change.Action() - if cErr != nil { - return nil, cErr - } - - // file change - from, to, err := change.Files() - if err != nil { - return nil, err - } - var fromFile vcsapi.CommitFile - if from != nil { - fromFile = vcsapi.CommitFile{ - Name: from.Name, - Size: from.Size, - Hash: from.Hash.String(), - } - } - var toFile vcsapi.CommitFile - if to != nil { - toFile = vcsapi.CommitFile{ - Name: to.Name, - Size: to.Size, - Hash: to.Hash.String(), - } - } - - // content patch - patch, err := change.Patch() - if err != nil { - return nil, err - } - - // append to change list - result = append(result, vcsapi.CommitChange{ - Type: gitFileActionToText(action), - FileFrom: fromFile, - FileTo: toFile, - Patch: patch.String(), - }) - } - - return result, err -} diff --git a/pkg/vcsrepository/git/util.go b/pkg/vcsrepository/git/util.go deleted file mode 100644 index cba7e02..0000000 --- a/pkg/vcsrepository/git/util.go +++ /dev/null @@ -1,67 +0,0 @@ -package gitclient - -import ( - "bufio" - "io" - "os" - "path" - - "github.com/Masterminds/semver/v3" -) - -func hasGitDirectory(dir string) bool { - if _, err := os.Stat(path.Join(dir, ".git")); !os.IsNotExist(err) { - return true - } - - return false -} - -// fileExists checks if the file exists and returns a boolean -func fileExists(filename string) bool { - info, err := os.Stat(filename) - if err != nil { - return false - } - - return !info.IsDir() -} - -// isVersionStable checks if the specified version is a stable release version (semver) -func isVersionStable(versionStr string) bool { - version, err := semver.NewVersion(versionStr) - - // no unparsable versions - if err != nil { - return false - } - - // no prereleases - if len(version.Prerelease()) > 0 { - return false - } - - return true -} - -// readLastLine gets the last line from a file, used to parse the git reflog -func readLastLine(filename string) string { - file, err := os.Open(filename) - if err != nil { - panic(err) - } - - defer file.Close() - reader := bufio.NewReader(file) - - lastLine := "" - for { - line, _, err := reader.ReadLine() - if err == io.EOF { - break - } - lastLine = string(line) - } - - return lastLine -} diff --git a/pkg/vcsrepository/repository.go b/pkg/vcsrepository/repository.go index d976353..004c7fb 100644 --- a/pkg/vcsrepository/repository.go +++ b/pkg/vcsrepository/repository.go @@ -1,58 +1,14 @@ package vcsrepository import ( - "errors" - "os" - "path" - "path/filepath" "strconv" "strings" + "github.com/cidverse/go-vcs" v1 "github.com/cidverse/normalizeci/pkg/ncispec/v1" - gitclient "github.com/cidverse/normalizeci/pkg/vcsrepository/git" - "github.com/cidverse/normalizeci/pkg/vcsrepository/vcsapi" "github.com/gosimple/slug" ) -var MockClient vcsapi.Client - -func GetVCSClient(dir string) (vcsapi.Client, error) { - // mocked client - if MockClient != nil { - return MockClient, nil - } - - // git - cg, _ := gitclient.NewGitClient(dir) - if cg.Check() { - return cg, nil - } - - return nil, errors.New("directory is not a vcs repository") -} - -func FindRepositoryDirectory(currentDirectory string) string { - var projectDirectory = "" - directoryParts := strings.Split(currentDirectory, string(os.PathSeparator)) - - for projectDirectory == "" { - // GIT - if _, err := os.Stat(path.Join(currentDirectory, ".git")); !os.IsNotExist(err) { - return currentDirectory - } - - // abort when we reach the root directory, no repository found - if directoryParts[0]+"\\" == currentDirectory || currentDirectory == "/" { - return "" - } - - // check parent directory in next iteration - currentDirectory = filepath.Dir(currentDirectory) - } - - return "" -} - type RepositoryInformation struct { Repository v1.Repository Commit v1.Commit @@ -74,7 +30,8 @@ func GetVCSRepositoryInformation(dir string) (RepositoryInformation, error) { } // supported repository type - client, clientErr := GetVCSClient(dir) + client, clientErr := vcs.GetVCSClient(dir) + if client == nil { return result, clientErr } @@ -145,3 +102,11 @@ func GetVCSRepositoryInformation(dir string) (RepositoryInformation, error) { return result, nil } + +func getReleaseName(input string) string { + input = slug.Substitute(input, map[string]string{ + "/": "-", + }) + + return strings.TrimLeft(input, "v") +} diff --git a/pkg/vcsrepository/util.go b/pkg/vcsrepository/util.go deleted file mode 100644 index 7ddd705..0000000 --- a/pkg/vcsrepository/util.go +++ /dev/null @@ -1,26 +0,0 @@ -package vcsrepository - -import ( - "os" - "strings" - - "github.com/gosimple/slug" -) - -// fileExists checks if the file exists and returns a boolean -func fileExists(filename string) bool { - info, err := os.Stat(filename) - if err != nil { - return false - } - - return !info.IsDir() -} - -func getReleaseName(input string) string { - input = slug.Substitute(input, map[string]string{ - "/": "-", - }) - - return strings.TrimLeft(input, "v") -} diff --git a/pkg/vcsrepository/vcsapi/client.go b/pkg/vcsrepository/vcsapi/client.go deleted file mode 100644 index 702570e..0000000 --- a/pkg/vcsrepository/vcsapi/client.go +++ /dev/null @@ -1,67 +0,0 @@ -package vcsapi - -import ( - "fmt" - "strings" -) - -// Client is the common interface for all vcs repo implementations -type Client interface { - // Check will verify that the repository type is supported by this implementation - Check() bool - - // VCSType returns the version control system type (git, ...) - VCSType() string - - // VCSRemote returns the primary remote (server) - VCSRemote() string - - // VCSHostServer returns the host of the primary remote - VCSHostServer(remote string) string - - // VCSHostType returns the type of the host - VCSHostType(server string) string - - // VCSRefToInternalRef converts the reference to the internal notation used by the VCS - VCSRefToInternalRef(ref VCSRef) string - - // VCSHead returns the current head of the repository (refType and refName) - VCSHead() (ref VCSRef, err error) - - // GetTags returns all tags - GetTags() (tags []VCSRef) - - // GetTagsByHash returns all tags of the given commit hash - GetTagsByHash(hash string) []VCSRef - - // FindCommitByHash will query a commit by hash, additionally includes changes made by the commit - FindCommitByHash(hash string, includeChanges bool) (Commit, error) - - // FindCommitsBetween finds all commits between two references (might need to use GetReference to get the proper ref name) - FindCommitsBetween(from *VCSRef, to *VCSRef, includeChanges bool, limit int) ([]Commit, error) - - // FindLatestRelease finds the latest release starting from the current repo HEAD - FindLatestRelease(stable bool) (VCSRelease, error) -} - -// NewVCSRefFromString parses the input string and returns a VCSRef -func NewVCSRefFromString(input string) (*VCSRef, error) { - if input == "" { - return nil, nil - } - - inputParts := strings.SplitN(input, "/", 2) - if len(inputParts) != 2 { - return nil, fmt.Errorf("%s is not a valid vcs ref", input) - } - - if inputParts[0] == "tag" { - return &VCSRef{Type: "tag", Value: inputParts[1]}, nil - } else if inputParts[0] == "branch" { - return &VCSRef{Type: "branch", Value: inputParts[1]}, nil - } else if inputParts[0] == "hash" { - return &VCSRef{Type: "hash", Hash: inputParts[1]}, nil - } - - return nil, fmt.Errorf("%s is not a valid vcs ref", input) -} diff --git a/pkg/vcsrepository/vcsapi/client_test.go b/pkg/vcsrepository/vcsapi/client_test.go deleted file mode 100644 index 590e98e..0000000 --- a/pkg/vcsrepository/vcsapi/client_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package vcsapi - -import ( - "errors" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestVCSRefEmpty(t *testing.T) { - ref, err := NewVCSRefFromString("") - - assert.Nil(t, ref) - assert.NoError(t, err) -} - -func TestVCSRefTag(t *testing.T) { - ref, err := NewVCSRefFromString("tag/v1.0.0") - - assert.Equal(t, "tag", ref.Type) - assert.Equal(t, "v1.0.0", ref.Value) - assert.NoError(t, err) -} - -func TestVCSRefBranch(t *testing.T) { - ref, err := NewVCSRefFromString("branch/main") - - assert.Equal(t, "branch", ref.Type) - assert.Equal(t, "main", ref.Value) - assert.NoError(t, err) -} - -func TestVCSRefHash(t *testing.T) { - ref, err := NewVCSRefFromString("hash/7793ba4898570d41baf4299accf950e517f76db9") - - assert.Equal(t, "hash", ref.Type) - assert.Equal(t, "7793ba4898570d41baf4299accf950e517f76db9", ref.Hash) - assert.NoError(t, err) -} - -func TestVCSRefErr(t *testing.T) { - ref, err := NewVCSRefFromString("invalid-ref") - - assert.Nil(t, ref) - if assert.Error(t, err) { - assert.Equal(t, errors.New("invalid-ref is not a valid vcs ref"), err) - } -} diff --git a/pkg/vcsrepository/vcsapi/types.go b/pkg/vcsrepository/vcsapi/types.go deleted file mode 100644 index 6e3fac6..0000000 --- a/pkg/vcsrepository/vcsapi/types.go +++ /dev/null @@ -1,50 +0,0 @@ -package vcsapi - -import ( - "time" -) - -type Commit struct { - ShortHash string `json:"hash_short"` - Hash string `json:"hash"` - Message string `json:"message"` - Description string `json:"description"` - Author CommitAuthor `json:"author"` - Committer CommitAuthor `json:"committer"` - Changes []CommitChange `json:"changes,omitempty"` - Tags []VCSRef `json:"tags"` - AuthoredAt time.Time `json:"authored_at"` - CommittedAt time.Time `json:"committed_at"` - Context map[string]string `json:"context,omitempty"` -} - -type CommitChange struct { - Type string `json:"type"` - FileFrom CommitFile `json:"file_from"` - FileTo CommitFile `json:"file_to"` - Patch string `json:"patch"` -} - -type CommitFile struct { - Name string `json:"name"` - Size int64 `json:"size"` - Hash string `json:"hash"` -} - -type CommitAuthor struct { - Name string `json:"name"` - Email string `json:"email"` -} - -type VCSRef struct { - Type string `json:"type"` - Value string `json:"value"` - Hash string `json:"hash,omitempty"` -} - -type VCSRelease struct { - Type string `json:"type"` - Value string `json:"value"` - Version string `json:"version"` - Hash string `json:"hash,omitempty"` -}