diff --git a/go.mod b/go.mod index fcd60d7..e3e4336 100644 --- a/go.mod +++ b/go.mod @@ -5,12 +5,12 @@ go 1.15 require ( github.com/gosuri/uilive v0.0.3 // indirect github.com/gosuri/uiprogress v0.0.1 - github.com/linuxsuren/cobra-extension v0.0.1 + github.com/linuxsuren/cobra-extension v0.0.10 + github.com/linuxsuren/http-downloader v0.0.10 github.com/mattn/go-isatty v0.0.12 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/pkg/errors v0.9.1 github.com/spf13/cobra v1.1.1 - github.com/stretchr/testify v1.6.1 // indirect golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 golang.org/x/text v0.3.4 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 diff --git a/go.sum b/go.sum index 7552c75..2a08f20 100644 --- a/go.sum +++ b/go.sum @@ -11,10 +11,13 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AlecAivazis/survey/v2 v2.2.2/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -22,24 +25,30 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 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/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chai2010/gettext-go v0.0.0-20170215093142-bf70f2a70fb1/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= 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= @@ -61,6 +70,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -88,6 +98,10 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github/v29 v29.0.3 h1:IktKCTwU//aFHnpA+2SLIi7Oo9uhAzgsdZNbcAqhgdc= +github.com/google/go-github/v29 v29.0.3/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E= +github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -96,6 +110,7 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosuri/uilive v0.0.3 h1:kvo6aB3pez9Wbudij8srWo4iY6SFTTxTKOkb+uRCE8I= github.com/gosuri/uilive v0.0.3/go.mod h1:qkLSc0A5EXSP6B04TrN4oQoxqFI7A8XvoXSlJi8cwk8= @@ -116,6 +131,7 @@ github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerX github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -124,11 +140,14 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 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/jenkins-zh/jenkins-cli v0.0.32/go.mod h1:uE1mH9PNITrg0sugv6HXuM/CSddg0zxXoYu3w57I3JY= +github.com/jenkins-zh/jenkins-formulas v0.0.5/go.mod h1:zS8fm8u5L6FcjZM0QznXsLV9T2UtSVK+hT6Sm76iUZ4= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -136,6 +155,7 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -145,18 +165,31 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/linuxsuren/cobra-extension v0.0.1 h1:e288zsm1iWUaAOjfiw42hiWJsrrXZnJ0vKApWPyTfkQ= github.com/linuxsuren/cobra-extension v0.0.1/go.mod h1:UqHi31q7Dj+46nzcVWNZz5Z1JcHBJcmCyPAZRoM8LXo= +github.com/linuxsuren/cobra-extension v0.0.6/go.mod h1:qcEJv7BbL0UpK6MbrTESP/nKf1+z1wQdMAnE1NBl3QQ= +github.com/linuxsuren/cobra-extension v0.0.10 h1:ciZDb2Bp/aAFqr4YoeVuH2uyBaBFfO6pwz1WBih7R4A= +github.com/linuxsuren/cobra-extension v0.0.10/go.mod h1:nDsXgvm0lSWVV+byAEfwhIGFDoIp0Sq9wkfNUDBp5do= +github.com/linuxsuren/http-downloader v0.0.2-0.20201207132639-19888a6beaec/go.mod h1:zRZY9FCDBuYNDxbI2Ny5suasZsMk7J6q9ecQ3V3PIqI= +github.com/linuxsuren/http-downloader v0.0.6/go.mod h1:xxgh2OE7WGL9TwDE9L8Gh7Lqq9fFPuHbh5tofUitEfE= +github.com/linuxsuren/http-downloader v0.0.10 h1:LavSzwPzHvxSp1b3hnP4IVNiP79p8VqDHnKU5q2mFjA= +github.com/linuxsuren/http-downloader v0.0.10/go.mod h1:4hVRWYnIifme60jM0gCoEzglPdjUt7fBwXRwYs/rwwE= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -181,9 +214,11 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.10.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -217,38 +252,51 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 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/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= 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/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/zalando/go-keyring v0.0.0-20200121091418-667557018717/go.mod h1:RaxNwUITJaHVdQ0VC7pELPZ3tOWn13nr0gZMZEhpVU0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -286,6 +334,7 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= @@ -293,6 +342,8 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M= golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -310,10 +361,12 @@ golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -355,6 +408,8 @@ golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDq golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -380,6 +435,7 @@ google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBr google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -408,6 +464,7 @@ 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.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +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.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -420,4 +477,5 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +moul.io/http2curl v1.0.0/go.mod h1:f6cULg+e4Md/oW1cYmwW4IWQOVl2lGbmCNGOHvzX2kE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/pkg/cmd/completion.go b/pkg/cmd/completion.go index 1c4d1d2..f2ec16c 100644 --- a/pkg/cmd/completion.go +++ b/pkg/cmd/completion.go @@ -7,9 +7,9 @@ import ( ) // ValidPluginNames returns the valid plugin name list -func ValidPluginNames(cmd *cobra.Command, args []string, prefix string) (pluginNames []string, directive cobra.ShellCompDirective) { +func ValidPluginNames(cmd *cobra.Command, args []string, prefix, pluginOrg, pluginRepo string) (pluginNames []string, directive cobra.ShellCompDirective) { directive = cobra.ShellCompDirectiveNoFileComp - if plugins, err := pkg.FindPlugins(); err == nil { + if plugins, err := pkg.FindPlugins(pluginOrg, pluginRepo); err == nil { pluginNames = make([]string, 0) for i := range plugins { plugin := plugins[i] diff --git a/pkg/cmd/fetch.go b/pkg/cmd/fetch.go index ef11cdb..42e3a37 100644 --- a/pkg/cmd/fetch.go +++ b/pkg/cmd/fetch.go @@ -56,7 +56,7 @@ func (c *jcliPluginFetchCmd) Run(cmd *cobra.Command, args []string) (err error) return } - pluginRepoCache := fmt.Sprintf("%s/.jenkins-cli/plugins-repo", userHome) + pluginRepoCache := fmt.Sprintf("%s/.%s/plugins-repo", userHome, c.PluginRepoName) c.output = cmd.OutOrStdout() cmd.Printf("start to fetch metadata from '%s', cache to '%s'\n", c.PluginRepo, pluginRepoCache) diff --git a/pkg/cmd/install.go b/pkg/cmd/install.go index d039599..ffbe6d7 100644 --- a/pkg/cmd/install.go +++ b/pkg/cmd/install.go @@ -5,6 +5,7 @@ import ( "compress/gzip" "fmt" "github.com/linuxsuren/go-cli-plugin/pkg" + hd "github.com/linuxsuren/http-downloader/pkg" "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "gopkg.in/yaml.v2" @@ -18,23 +19,27 @@ import ( // NewConfigPluginInstallCmd create a command for fetching plugin metadata func NewConfigPluginInstallCmd(pluginOrg, pluginRepo string) (cmd *cobra.Command) { pluginInstallCmd := jcliPluginInstallCmd{ - PluginOrg: pluginOrg, - PluginRepo: pluginRepo, + PluginOrg: pluginOrg, + PluginRepo: pluginRepo, + PluginRepoName: pluginRepo, } cmd = &cobra.Command{ - Use: "install", - Short: "install a jcli plugin", - Long: "install a jcli plugin", - Args: cobra.MinimumNArgs(1), - ValidArgsFunction: ValidPluginNames, - RunE: pluginInstallCmd.Run, + Use: "install", + Short: "install a jcli plugin", + Long: "install a jcli plugin", + Args: cobra.MinimumNArgs(1), + ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) (strings []string, directive cobra.ShellCompDirective) { + return ValidPluginNames(cmd, args, toComplete, pluginOrg, pluginRepo) + }, + RunE: pluginInstallCmd.Run, } // add flags flags := cmd.Flags() flags.BoolVarP(&pluginInstallCmd.ShowProgress, "show-progress", "", true, "If you want to show the progress of download") + flags.IntVarP(&pluginInstallCmd.Thread, "thread", "t", 4, "Using multi-thread to download plugin") return } @@ -47,7 +52,7 @@ func (c *jcliPluginInstallCmd) Run(cmd *cobra.Command, args []string) (err error } var data []byte - pluginsMetadataFile := fmt.Sprintf("%s/.%s/plugins-repo/%s.yaml", userHome, c.PluginRepo, name) + pluginsMetadataFile := fmt.Sprintf("%s/.%s/plugins-repo/%s.yaml", userHome, c.PluginRepoName, name) if data, err = ioutil.ReadFile(pluginsMetadataFile); err == nil { plugin := pkg.Plugin{} if err = yaml.Unmarshal(data, &plugin); err == nil { @@ -56,7 +61,7 @@ func (c *jcliPluginInstallCmd) Run(cmd *cobra.Command, args []string) (err error } if err == nil { - cachedMetadataFile := pkg.GetJCLIPluginPath(userHome, name, true) + cachedMetadataFile := pkg.GetJCLIPluginPath(userHome, c.PluginRepoName, name, true) err = ioutil.WriteFile(cachedMetadataFile, data, 0664) } return @@ -69,15 +74,22 @@ func (c *jcliPluginInstallCmd) download(plu pkg.Plugin) (err error) { } link := c.getDownloadLink(plu) - output := fmt.Sprintf("%s/.%s/plugins/%s.tar.gz", userHome, c.PluginOrg,plu.Main) + output := fmt.Sprintf("%s/.%s/plugins-repo/%s.tar.gz", userHome, c.PluginRepoName, plu.Main) - downloader := pkg.HTTPDownloader{ - RoundTripper: c.RoundTripper, - TargetFilePath: output, - URL: link, - ShowProgress: c.ShowProgress, + fmt.Printf("start to download from '%s' to '%s'\n", link, output) + if c.Thread > 1 { + err = hd.DownloadFileWithMultipleThread(link, output, c.Thread, c.ShowProgress) + } else { + downloader := hd.HTTPDownloader{ + RoundTripper: c.RoundTripper, + TargetFilePath: output, + URL: link, + ShowProgress: c.ShowProgress, + } + err = downloader.DownloadFile() } - if err = downloader.DownloadFile(); err == nil { + + if err == nil { err = c.extractFiles(plu, output) } return diff --git a/pkg/cmd/list.go b/pkg/cmd/list.go index 136e9f7..215c228 100644 --- a/pkg/cmd/list.go +++ b/pkg/cmd/list.go @@ -6,8 +6,12 @@ import ( ) // NewConfigPluginListCmd create a command for list all jcli plugins -func NewConfigPluginListCmd() (cmd *cobra.Command) { - configPluginListCmd := &configPluginListCmd{} +func NewConfigPluginListCmd(pluginOrg, pluginRepo string) (cmd *cobra.Command) { + configPluginListCmd := &configPluginListCmd{ + PluginOrg: pluginOrg, + PluginRepo: pluginRepo, + PluginRepoName: pluginRepo, + } cmd = &cobra.Command{ Use: "list", @@ -25,7 +29,7 @@ func NewConfigPluginListCmd() (cmd *cobra.Command) { func (c *configPluginListCmd) RunE(cmd *cobra.Command, args []string) (err error) { c.Writer = cmd.OutOrStdout() var plugins []pkg.Plugin - if plugins, err = pkg.FindPlugins(); err == nil { + if plugins, err = pkg.FindPlugins(c.PluginOrg, c.PluginRepoName); err == nil { err = c.OutputV2(plugins) } return diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go index 95272b2..0292e57 100644 --- a/pkg/cmd/root.go +++ b/pkg/cmd/root.go @@ -6,8 +6,8 @@ import ( // AppendPluginCmd create a command as root of config plugin func AppendPluginCmd(root *cobra.Command, pluginOrg, pluginRepo string) { - root.AddCommand(NewConfigPluginListCmd(), + root.AddCommand(NewConfigPluginListCmd(pluginOrg, pluginRepo), NewConfigPluginFetchCmd(pluginOrg, pluginRepo), NewConfigPluginInstallCmd(pluginOrg, pluginRepo), - NewConfigPluginUninstallCmd()) + NewConfigPluginUninstallCmd(pluginOrg, pluginRepo)) } diff --git a/pkg/cmd/type.go b/pkg/cmd/type.go index c90aa42..f2206d8 100644 --- a/pkg/cmd/type.go +++ b/pkg/cmd/type.go @@ -9,6 +9,9 @@ import ( type ( configPluginListCmd struct { cobra_ext.OutputOption + PluginOrg string + PluginRepo string + PluginRepoName string } jcliPluginFetchCmd struct { @@ -27,15 +30,31 @@ type ( jcliPluginInstallCmd struct { RoundTripper http.RoundTripper ShowProgress bool + Thread int - output io.Writer - PluginOrg string - PluginRepo string + output io.Writer + PluginOrg string + PluginRepo string + PluginRepoName string } jcliPluginUninstallCmd struct { + RoundTripper http.RoundTripper + ShowProgress bool + + output io.Writer + PluginOrg string + PluginRepo string + PluginRepoName string } jcliPluginUpdateCmd struct { + RoundTripper http.RoundTripper + ShowProgress bool + + output io.Writer + PluginOrg string + PluginRepo string + PluginRepoName string } ) diff --git a/pkg/cmd/uninstall.go b/pkg/cmd/uninstall.go index f4d4104..00861e1 100644 --- a/pkg/cmd/uninstall.go +++ b/pkg/cmd/uninstall.go @@ -10,8 +10,12 @@ import ( ) // NewConfigPluginUninstallCmd create a command to uninstall a plugin -func NewConfigPluginUninstallCmd() (cmd *cobra.Command) { - jcliPluginUninstallCmd := jcliPluginUninstallCmd{} +func NewConfigPluginUninstallCmd(pluginOrg, pluginRepo string) (cmd *cobra.Command) { + jcliPluginUninstallCmd := jcliPluginUninstallCmd{ + PluginOrg: pluginOrg, + PluginRepo: pluginRepo, + PluginRepoName: pluginRepo, + } cmd = &cobra.Command{ Use: "uninstall", @@ -19,7 +23,9 @@ func NewConfigPluginUninstallCmd() (cmd *cobra.Command) { Long: "Remove a plugin", Args: cobra.MinimumNArgs(1), RunE: jcliPluginUninstallCmd.RunE, - ValidArgsFunction: ValidPluginNames, + ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) (strings []string, directive cobra.ShellCompDirective) { + return ValidPluginNames(cmd, args, toComplete, pluginOrg, pluginRepo) + }, } return } @@ -32,13 +38,13 @@ func (c *jcliPluginUninstallCmd) RunE(cmd *cobra.Command, args []string) (err er } name := args[0] - cachedMetadataFile := pkg.GetJCLIPluginPath(userHome, name, false) + cachedMetadataFile := pkg.GetJCLIPluginPath(userHome, c.PluginRepoName, name, false) var data []byte if data, err = ioutil.ReadFile(cachedMetadataFile); err == nil { plugin := &pkg.Plugin{} if err = yaml.Unmarshal(data, plugin); err == nil { - mainFile := pkg.GetJCLIPluginPath(userHome, plugin.Main, true) + mainFile := pkg.GetJCLIPluginPath(userHome, c.PluginRepoName, plugin.Main, true) os.Remove(cachedMetadataFile) os.Remove(mainFile) diff --git a/pkg/core.go b/pkg/core.go index 88c45ca..a17258e 100644 --- a/pkg/core.go +++ b/pkg/core.go @@ -29,14 +29,14 @@ type PluginError struct { code int } -func FindPlugins() (plugins []Plugin, err error) { +func FindPlugins(pluginOrg, pluginRepo string) (plugins []Plugin, err error) { var userHome string if userHome, err = homedir.Dir(); err != nil { return } plugins = make([]Plugin, 0) - pluginsDir := fmt.Sprintf("%s/.jenkins-cli/plugins-repo/*.yaml", userHome) + pluginsDir := fmt.Sprintf("%s/.%s/plugins-repo/*.yaml", userHome, pluginRepo) //fmt.Println("start to parse plugin file from dir", pluginsDir) var files []string if files, err = filepath.Glob(pluginsDir); err == nil { @@ -51,7 +51,7 @@ func FindPlugins() (plugins []Plugin, err error) { plugin.Main = fmt.Sprintf("jcli-%s-Plugin", plugin.Use) } - if _, fileErr := os.Stat(GetJCLIPluginPath(userHome, plugin.Main, true)); !os.IsNotExist(fileErr) { + if _, fileErr := os.Stat(GetJCLIPluginPath(userHome, pluginRepo, plugin.Main, true)); !os.IsNotExist(fileErr) { plugin.Installed = true } plugins = append(plugins, plugin) @@ -65,10 +65,10 @@ func FindPlugins() (plugins []Plugin, err error) { } // LoadPlugins loads the plugins -func LoadPlugins(cmd *cobra.Command) { +func LoadPlugins(cmd *cobra.Command, pluginOrg, pluginRepo string) { var plugins []Plugin var err error - if plugins, err = FindPlugins(); err != nil { + if plugins, err = FindPlugins(pluginOrg, pluginRepo); err != nil { cmd.PrintErrln("Cannot load plugins successfully") return } @@ -118,7 +118,7 @@ func LoadPlugins(cmd *cobra.Command) { return } - pluginExec := GetJCLIPluginPath(userHome, cmd.Annotations["main"], true) + pluginExec := GetJCLIPluginPath(userHome, pluginRepo, cmd.Annotations["main"], true) err = callPluginExecutable(cmd, pluginExec, args, cmd.OutOrStdout()) return }, @@ -127,11 +127,11 @@ func LoadPlugins(cmd *cobra.Command) { } } -//GetJCLIPluginPath returns the path of a jcli plugin -func GetJCLIPluginPath(userHome, name string, binary bool) string { +// GetJCLIPluginPath returns the path of a jcli plugin +func GetJCLIPluginPath(userHome, pluginRepoName, name string, binary bool) string { suffix := ".yaml" if binary { suffix = "" } - return fmt.Sprintf("%s/.jenkins-cli/plugins/%s%s", userHome, name, suffix) + return fmt.Sprintf("%s/.%s/plugins-repo/%s%s", userHome, pluginRepoName, name, suffix) } diff --git a/pkg/net.go b/pkg/net.go index cbfbcb3..aef7aea 100644 --- a/pkg/net.go +++ b/pkg/net.go @@ -1,205 +1,205 @@ package pkg - -import ( - "crypto/tls" - "encoding/base64" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "os" - "path" - "strconv" - - "github.com/gosuri/uiprogress" -) - -// HTTPDownloader is the downloader for http request -type HTTPDownloader struct { - TargetFilePath string - URL string - ShowProgress bool - InsecureSkipVerify bool - - UserName string - Password string - - Proxy string - ProxyAuth string - - Debug bool - RoundTripper http.RoundTripper -} - -// DownloadFile download a file with the progress -func (h *HTTPDownloader) DownloadFile() error { - filepath, downloadURL, showProgress := h.TargetFilePath, h.URL, h.ShowProgress - // Get the data - req, err := http.NewRequest(http.MethodGet, downloadURL, nil) - if err != nil { - return err - } - - if h.UserName != "" && h.Password != "" { - req.SetBasicAuth(h.UserName, h.Password) - } - var tr http.RoundTripper - if h.RoundTripper != nil { - tr = h.RoundTripper - } else { - trp := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: h.InsecureSkipVerify}, - } - h.fetchProxyFromEnv(req.URL.Scheme) - if err = SetProxy(h.Proxy, h.ProxyAuth, trp); err != nil { - return err - } - - if h.Proxy != "" { - basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(h.ProxyAuth)) - req.Header.Add("Proxy-Authorization", basicAuth) - } - tr = trp - } - client := &http.Client{Transport: tr} - var resp *http.Response - - if resp, err = client.Do(req); err != nil { - return err - } - - if resp.StatusCode != 200 { - if h.Debug { - if data, err := ioutil.ReadAll(resp.Body); err == nil { - ioutil.WriteFile("debug-download.html", data, 0664) - } - } - return fmt.Errorf("invalidate status code: %d", resp.StatusCode) - } - - writer := &ProgressIndicator{ - Title: "Downloading", - } - if showProgress { - if total, ok := resp.Header["Content-Length"]; ok && len(total) > 0 { - fileLength, err := strconv.ParseInt(total[0], 10, 64) - if err == nil { - writer.Total = float64(fileLength) - } - } - } - - if err := os.MkdirAll(path.Dir(filepath), os.FileMode(0755)); err != nil { - return err - } - - // Create the file - out, err := os.Create(filepath) - if err != nil { - return err - } - defer out.Close() - - writer.Writer = out - - if showProgress { - writer.Init() - } - - // Write the body to file - _, err = io.Copy(writer, resp.Body) - return err -} - -// SetProxy set the proxy for a http -func SetProxy(proxy, proxyAuth string, tr *http.Transport) (err error) { - if proxy == "" { - return - } - - var proxyURL *url.URL - if proxyURL, err = url.Parse(proxy); err != nil { - return - } - - tr.Proxy = http.ProxyURL(proxyURL) - - if proxyAuth != "" { - basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(proxyAuth)) - tr.ProxyConnectHeader = http.Header{} - tr.ProxyConnectHeader.Add("Proxy-Authorization", basicAuth) - } - return -} - -func (h *HTTPDownloader) fetchProxyFromEnv(scheme string) { - allProxy := os.Getenv("all_proxy") - httpProxy := os.Getenv("http_proxy") - httpsProxy := os.Getenv("https_proxy") - - if allProxy != "" { - h.Proxy = allProxy - } else { - switch scheme { - case "http": - if httpProxy != "" { - h.Proxy = httpProxy - } - case "https": - if httpsProxy != "" { - h.Proxy = httpsProxy - } - } - } -} - -// ProgressIndicator hold the progress of io operation -type ProgressIndicator struct { - Writer io.Writer - Reader io.Reader - Title string - - // bytes.Buffer - Total float64 - count float64 - bar *uiprogress.Bar -} - -// Init set the default value for progress indicator -func (i *ProgressIndicator) Init() { - uiprogress.Start() // start rendering - i.bar = uiprogress.AddBar(100) // Add a new bar - - // optionally, append and prepend completion and elapsed time - i.bar.AppendCompleted() - // i.bar.PrependElapsed() - - if i.Title != "" { - i.bar.PrependFunc(func(_ *uiprogress.Bar) string { - return fmt.Sprintf("%s: ", i.Title) - }) - } -} - -// Write writes the progress -func (i *ProgressIndicator) Write(p []byte) (n int, err error) { - n, err = i.Writer.Write(p) - i.setBar(n) - return -} - -// Read reads the progress -func (i *ProgressIndicator) Read(p []byte) (n int, err error) { - n, err = i.Reader.Read(p) - i.setBar(n) - return -} - -func (i *ProgressIndicator) setBar(n int) { - i.count += float64(n) - - if i.bar != nil { - i.bar.Set((int)(i.count * 100 / i.Total)) - } -} +// +//import ( +// "crypto/tls" +// "encoding/base64" +// "fmt" +// "io" +// "io/ioutil" +// "net/http" +// "net/url" +// "os" +// "path" +// "strconv" +// +// "github.com/gosuri/uiprogress" +//) +// +//// HTTPDownloader is the downloader for http request +//type HTTPDownloader struct { +// TargetFilePath string +// URL string +// ShowProgress bool +// InsecureSkipVerify bool +// +// UserName string +// Password string +// +// Proxy string +// ProxyAuth string +// +// Debug bool +// RoundTripper http.RoundTripper +//} +// +//// DownloadFile download a file with the progress +//func (h *HTTPDownloader) DownloadFile() error { +// filepath, downloadURL, showProgress := h.TargetFilePath, h.URL, h.ShowProgress +// // Get the data +// req, err := http.NewRequest(http.MethodGet, downloadURL, nil) +// if err != nil { +// return err +// } +// +// if h.UserName != "" && h.Password != "" { +// req.SetBasicAuth(h.UserName, h.Password) +// } +// var tr http.RoundTripper +// if h.RoundTripper != nil { +// tr = h.RoundTripper +// } else { +// trp := &http.Transport{ +// TLSClientConfig: &tls.Config{InsecureSkipVerify: h.InsecureSkipVerify}, +// } +// h.fetchProxyFromEnv(req.URL.Scheme) +// if err = SetProxy(h.Proxy, h.ProxyAuth, trp); err != nil { +// return err +// } +// +// if h.Proxy != "" { +// basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(h.ProxyAuth)) +// req.Header.Add("Proxy-Authorization", basicAuth) +// } +// tr = trp +// } +// client := &http.Client{Transport: tr} +// var resp *http.Response +// +// if resp, err = client.Do(req); err != nil { +// return err +// } +// +// if resp.StatusCode != 200 { +// if h.Debug { +// if data, err := ioutil.ReadAll(resp.Body); err == nil { +// ioutil.WriteFile("debug-download.html", data, 0664) +// } +// } +// return fmt.Errorf("invalidate status code: %d", resp.StatusCode) +// } +// +// writer := &ProgressIndicator{ +// Title: "Downloading", +// } +// if showProgress { +// if total, ok := resp.Header["Content-Length"]; ok && len(total) > 0 { +// fileLength, err := strconv.ParseInt(total[0], 10, 64) +// if err == nil { +// writer.Total = float64(fileLength) +// } +// } +// } +// +// if err := os.MkdirAll(path.Dir(filepath), os.FileMode(0755)); err != nil { +// return err +// } +// +// // Create the file +// out, err := os.Create(filepath) +// if err != nil { +// return err +// } +// defer out.Close() +// +// writer.Writer = out +// +// if showProgress { +// writer.Init() +// } +// +// // Write the body to file +// _, err = io.Copy(writer, resp.Body) +// return err +//} +// +//// SetProxy set the proxy for a http +//func SetProxy(proxy, proxyAuth string, tr *http.Transport) (err error) { +// if proxy == "" { +// return +// } +// +// var proxyURL *url.URL +// if proxyURL, err = url.Parse(proxy); err != nil { +// return +// } +// +// tr.Proxy = http.ProxyURL(proxyURL) +// +// if proxyAuth != "" { +// basicAuth := "Basic " + base64.StdEncoding.EncodeToString([]byte(proxyAuth)) +// tr.ProxyConnectHeader = http.Header{} +// tr.ProxyConnectHeader.Add("Proxy-Authorization", basicAuth) +// } +// return +//} +// +//func (h *HTTPDownloader) fetchProxyFromEnv(scheme string) { +// allProxy := os.Getenv("all_proxy") +// httpProxy := os.Getenv("http_proxy") +// httpsProxy := os.Getenv("https_proxy") +// +// if allProxy != "" { +// h.Proxy = allProxy +// } else { +// switch scheme { +// case "http": +// if httpProxy != "" { +// h.Proxy = httpProxy +// } +// case "https": +// if httpsProxy != "" { +// h.Proxy = httpsProxy +// } +// } +// } +//} +// +//// ProgressIndicator hold the progress of io operation +//type ProgressIndicator struct { +// Writer io.Writer +// Reader io.Reader +// Title string +// +// // bytes.Buffer +// Total float64 +// count float64 +// bar *uiprogress.Bar +//} +// +//// Init set the default value for progress indicator +//func (i *ProgressIndicator) Init() { +// uiprogress.Start() // start rendering +// i.bar = uiprogress.AddBar(100) // Add a new bar +// +// // optionally, append and prepend completion and elapsed time +// i.bar.AppendCompleted() +// // i.bar.PrependElapsed() +// +// if i.Title != "" { +// i.bar.PrependFunc(func(_ *uiprogress.Bar) string { +// return fmt.Sprintf("%s: ", i.Title) +// }) +// } +//} +// +//// Write writes the progress +//func (i *ProgressIndicator) Write(p []byte) (n int, err error) { +// n, err = i.Writer.Write(p) +// i.setBar(n) +// return +//} +// +//// Read reads the progress +//func (i *ProgressIndicator) Read(p []byte) (n int, err error) { +// n, err = i.Reader.Read(p) +// i.setBar(n) +// return +//} +// +//func (i *ProgressIndicator) setBar(n int) { +// i.count += float64(n) +// +// if i.bar != nil { +// i.bar.Set((int)(i.count * 100 / i.Total)) +// } +//}