Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support gist:// scheme #787

Merged
merged 4 commits into from
Feb 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
module github.com/k1LoW/runn

go 1.21

toolchain go1.21.5
go 1.21.7

require (
github.com/Songmu/axslogparser v1.4.0
Expand All @@ -25,6 +23,7 @@ require (
github.com/goccy/go-yaml v1.11.2
github.com/golang-sql/sqlexp v0.1.0
github.com/google/go-cmp v0.6.0
github.com/google/go-github/v58 v58.0.0
github.com/googleapis/go-sql-spanner v1.1.1
github.com/jhump/protoreflect/v2 v2.0.0-20230705224148-00680b949112
github.com/juliangruber/go-intersect v1.1.0
Expand All @@ -34,6 +33,7 @@ require (
github.com/k1LoW/exec v0.2.0
github.com/k1LoW/expand v0.11.0
github.com/k1LoW/ghfs v1.1.0
github.com/k1LoW/go-github-client/v58 v58.0.11
github.com/k1LoW/grpcstub v0.13.0
github.com/k1LoW/grpcurlreq v0.1.2
github.com/k1LoW/httpstub v0.12.0
Expand Down Expand Up @@ -80,7 +80,7 @@ require (
github.com/Songmu/go-ltsv v0.1.0 // indirect
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
github.com/benbjohnson/clock v1.3.5 // indirect
github.com/bradleyfalzon/ghinstallation/v2 v2.7.0 // indirect
github.com/bradleyfalzon/ghinstallation/v2 v2.9.0 // indirect
github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 // indirect
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
Expand Down Expand Up @@ -109,7 +109,7 @@ require (
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-github/v53 v53.2.0 // indirect
github.com/google/go-github/v55 v55.0.0 // indirect
github.com/google/go-github/v57 v57.0.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/s2a-go v0.1.7 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
Expand Down
29 changes: 13 additions & 16 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -616,7 +616,6 @@ github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE=
github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
github.com/ScaleFT/sshkeys v1.2.0 h1:5BRp6rTVIhJzXT3VcUQrKgXR8zWA3sOsNeuyW15WUA8=
Expand Down Expand Up @@ -651,15 +650,14 @@ github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4Yn
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/bradleyfalzon/ghinstallation/v2 v2.7.0 h1:ranXaC3Zz/F6G/f0Joj3LrFp2OzOKfJZev5Q7OaMc88=
github.com/bradleyfalzon/ghinstallation/v2 v2.7.0/go.mod h1:ymxfmloxXBFXvvF1KpeUhOQM6Dfz9NYtfvTiJyk82UE=
github.com/bradleyfalzon/ghinstallation/v2 v2.9.0 h1:HmxIYqnxubRYcYGRc5v3wUekmo5Wv2uX3gukmWJ0AFk=
github.com/bradleyfalzon/ghinstallation/v2 v2.9.0/go.mod h1:wmkTDJf8CmVypxE8ijIStFnKoTa6solK5QfdmJrP9KI=
github.com/brianvoe/gofakeit/v6 v6.23.2 h1:lVde18uhad5wII/f5RMVFLtdQNE0HaGFuBUXmYKk8i8=
github.com/brianvoe/gofakeit/v6 v6.23.2/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8=
github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY=
github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE=
github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251 h1:k6UDF1uPYOs0iy1HPeotNa155qXRWrzKnqAaGXHLZCE=
github.com/buildkite/interpolate v0.0.0-20200526001904-07f35b4ae251/go.mod h1:gbPR1gPu9dB96mucYIR7T3B7p/78hRVSOuzIWLHK2Y4=
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/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
Expand All @@ -685,7 +683,6 @@ github.com/cli/go-gh/v2 v2.4.0/go.mod h1:h3salfqqooVpzKmHp6aUdeNx62UmxQRpLbagFSH
github.com/cli/safeexec v1.0.1 h1:e/C79PbXF4yYTN/wauC4tviMxEV13BwljGj0N9j+N00=
github.com/cli/safeexec v1.0.1/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
Expand Down Expand Up @@ -867,8 +864,12 @@ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI=
github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao=
github.com/google/go-github/v55 v55.0.0 h1:4pp/1tNMB9X/LuAhs5i0KQAE40NmiR/y6prLNb9x9cg=
github.com/google/go-github/v55 v55.0.0/go.mod h1:JLahOTA1DnXzhxEymmFF5PP2tSS9JVNj68mSZNDwskA=
github.com/google/go-github/v56 v56.0.0 h1:TysL7dMa/r7wsQi44BjqlwaHvwlFlqkK8CtBWCX3gb4=
github.com/google/go-github/v56 v56.0.0/go.mod h1:D8cdcX98YWJvi7TLo7zM4/h8ZTx6u6fwGEkCdisopo0=
github.com/google/go-github/v57 v57.0.0 h1:L+Y3UPTY8ALM8x+TV0lg+IEBI+upibemtBD8Q9u7zHs=
github.com/google/go-github/v57 v57.0.0/go.mod h1:s0omdnye0hvK/ecLvpsGfJMiRt85PimQh4oygmLIxHw=
github.com/google/go-github/v58 v58.0.0 h1:Una7GGERlF/37XfkPwpzYJe0Vp4dt2k1kCjlxwjIvzw=
github.com/google/go-github/v58 v58.0.0/go.mod h1:k4hxDKEfoWpSqFlc8LTpGd9fu2KrV1YAa6Hi6FmDNY4=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
Expand Down Expand Up @@ -979,6 +980,8 @@ github.com/k1LoW/ghfs v1.1.0 h1:kbl2B9sX7FMuUMXWUbP2nVp6A9Ts/HMJ3aIsH9Xw2UU=
github.com/k1LoW/ghfs v1.1.0/go.mod h1:7XRzYncVd8Xm61Zhat47L0Sr5Xy1P3NiOvB2Q61x00E=
github.com/k1LoW/go-github-client/v53 v53.2.11 h1:3EpAdfUjTQUtjZF5vPY4dxTWs9NiP/uyqW15jbOqQ60=
github.com/k1LoW/go-github-client/v53 v53.2.11/go.mod h1:ZGCmYsG2ulDF+2qYzjH9ZpC5MhyYYb83UMTQWjBNmIQ=
github.com/k1LoW/go-github-client/v58 v58.0.11 h1:PiftW/ZFjSAsl8DHJFCort28qmHFcZjS1Iusos9TZ8Y=
github.com/k1LoW/go-github-client/v58 v58.0.11/go.mod h1:z2Z+nGDNWdewQlURnxZBI84b2fzVHEPni/EYV2AAbk8=
github.com/k1LoW/grpcstub v0.13.0 h1:LJp4/uuHR7CuGEZy2PHrVfFVnk8O8AcOT2BQpTETb0s=
github.com/k1LoW/grpcstub v0.13.0/go.mod h1:wTSNK5TFCypFDY2gD//AOT6nYNe9FC3djc6kH9rAAD0=
github.com/k1LoW/grpcurlreq v0.1.2 h1:OWi2RYuqYhgVN7KSmYRCxG8tPKnHqfZRqQ8VNYQenAo=
Expand Down Expand Up @@ -1044,8 +1047,8 @@ github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lL
github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/migueleliasweb/go-github-mock v0.0.19 h1:z/88f6wPqZVFnE7s9DbwXMhCtmV/0FofNxc4M7FuSdU=
github.com/migueleliasweb/go-github-mock v0.0.19/go.mod h1:dBoCB3W9NjzyABhoGkfI0iSlFpzulAXhI7M+9A4ONYI=
github.com/migueleliasweb/go-github-mock v0.0.22 h1:iUvUKmYd7sFq/wrb9TrbEdvc30NaYxLZNtz7Uv2D+AQ=
github.com/migueleliasweb/go-github-mock v0.0.22/go.mod h1:UVvZ3S9IdTTRqThr1lgagVaua3Jl1bmY4E+C/Vybbn4=
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
github.com/minio/pkg v1.7.5 h1:UOUJjewE5zoaDPlCMJtNx/swc1jT1ZR+IajT7hrLd44=
Expand Down Expand Up @@ -1193,7 +1196,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
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.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
Expand Down Expand Up @@ -1314,7 +1316,6 @@ 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.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
Expand Down Expand Up @@ -1448,8 +1449,6 @@ golang.org/x/sys v0.4.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=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
Expand All @@ -1460,8 +1459,6 @@ golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
Expand All @@ -1480,14 +1477,14 @@ golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
Expand Down
99 changes: 94 additions & 5 deletions path.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package runn

import (
"context"
"errors"
"fmt"
"io"
Expand All @@ -12,18 +13,22 @@ import (
"strings"

"github.com/bmatcuk/doublestar/v4"
"github.com/google/go-github/v58/github"
"github.com/k1LoW/ghfs"
"github.com/k1LoW/go-github-client/v58/factory"
"github.com/k1LoW/urlfilepath"
)

const (
schemeHttps = "https"
schemeGitHub = "github"
schemeGist = "gist"
)

const (
prefixHttps = schemeHttps + "://"
prefixGitHub = schemeGitHub + "://"
prefixGist = schemeGist + "://"
)

// hasRemotePrefix returns true if the path has remote file prefix.
Expand Down Expand Up @@ -59,7 +64,7 @@ func fetchPaths(pathp string) ([]string, error) {
for _, pp := range listp {
base, pattern := doublestar.SplitPattern(filepath.ToSlash(pp))
switch {
case strings.HasPrefix(base, prefixHttps):
case strings.HasPrefix(pp, prefixHttps):
// https://
if !globalScopes.readRemote {
return nil, fmt.Errorf("scope error: remote file not allowed. 'read:remote' scope is required : %s", pp)
Expand All @@ -72,7 +77,7 @@ func fetchPaths(pathp string) ([]string, error) {
return nil, err
}
paths = append(paths, p)
case strings.HasPrefix(base, prefixGitHub):
case strings.HasPrefix(pp, prefixGitHub):
// github://
if !globalScopes.readRemote {
return nil, fmt.Errorf("scope error: remote file not allowed. 'read:remote' scope is required : %s", pp)
Expand Down Expand Up @@ -102,6 +107,19 @@ func fetchPaths(pathp string) ([]string, error) {
return nil, err
}
paths = append(paths, ps...)
case strings.HasPrefix(pp, prefixGist):
// gist://
if !globalScopes.readRemote {
return nil, fmt.Errorf("scope error: remote file not allowed. 'read:remote' scope is required : %s", pp)
}
if strings.Contains(pattern, "*") {
return nil, fmt.Errorf("gist scheme does not support wildcard: %s", pp)
}
p, err := fetchPathViaGist(pp)
if err != nil {
return nil, err
}
paths = append(paths, p)
default:
// Local file or cache

Expand Down Expand Up @@ -316,6 +334,77 @@ func fetchPathsViaGitHub(fsys fs.FS, base, pattern string) ([]string, error) {
return paths, nil
}

func fetchPathViaGist(urlstr string) (string, error) {
splitted := strings.Split(strings.TrimPrefix(urlstr, prefixGist), "/")
if len(splitted) > 2 {
return "", fmt.Errorf("invalid url: %s", urlstr)
}
id := splitted[0]
client, err := factory.NewGithubClient()
if err != nil {
return "", err
}
gist, _, err := client.Gists.Get(context.Background(), id)
if err != nil {
return "", err
}
if len(gist.Files) == 0 {
return "", fmt.Errorf("no files in the gist: %s", id)
}
var (
filename string
gf github.GistFile
)
switch {
case len(splitted) == 1:
if len(gist.Files) > 1 {
return "", fmt.Errorf("multiple files in the gist: %s", id)
}
for _, g := range gist.Files {
gf = g
}
case len(splitted) > 1:
filename = splitted[1]
for f, g := range gist.Files {
if string(f) == filename {
gf = g
break
}
}
if gf.GetRawURL() == "" {
return "", fmt.Errorf("invalid filename: %s", filename)
}
}
cd, err := cacheDir()
if err != nil {
return "", err
}

// Write cache using https://gist.github.com/USERNAME/ID/raw/REVISION/FILENAME
u, err := url.Parse(gf.GetRawURL())
if err != nil {
return "", err
}

ep, err := urlfilepath.Encode(u)
if err != nil {
return "", err
}
p := filepath.Join(cd, ep)
if err := os.MkdirAll(filepath.Dir(p), os.ModePerm); err != nil {
return "", err
}
n, err := os.Create(p)
if err != nil {
return "", err
}
defer n.Close()
if _, err := n.WriteString(gf.GetContent()); err != nil {
return "", err
}
return p, nil
}

func readFileViaHTTPS(urlstr string) ([]byte, error) {
u, err := url.Parse(urlstr)
if err != nil {
Expand Down Expand Up @@ -356,8 +445,8 @@ func readFileViaGitHub(urlstr string) ([]byte, error) {

// splitList splits the path list by os.PathListSeparator while keeping schemes.
func splitList(pathp string) []string {
rep := strings.NewReplacer(prefixHttps, repKey(prefixHttps), prefixGitHub, repKey(prefixGitHub))
per := strings.NewReplacer(repKey(prefixHttps), prefixHttps, repKey(prefixGitHub), prefixGitHub)
rep := strings.NewReplacer(prefixHttps, repKey(prefixHttps), prefixGitHub, repKey(prefixGitHub), prefixGist, repKey(prefixGist))
per := strings.NewReplacer(repKey(prefixHttps), prefixHttps, repKey(prefixGitHub), prefixGitHub, repKey(prefixGist), prefixGist)
var listp []string
for _, p := range filepath.SplitList(rep.Replace(pathp)) {
listp = append(listp, per.Replace(p))
Expand All @@ -367,7 +456,7 @@ func splitList(pathp string) []string {

func splitKeyAndPath(kp string) (string, string) {
const sep = ":"
if !strings.Contains(kp, sep) || strings.HasPrefix(kp, prefixHttps) || strings.HasPrefix(kp, prefixGitHub) {
if !strings.Contains(kp, sep) || strings.HasPrefix(kp, prefixHttps) || strings.HasPrefix(kp, prefixGitHub) || strings.HasPrefix(kp, prefixGist) {
return "", kp
}
pair := strings.SplitN(kp, sep, 2)
Expand Down
18 changes: 18 additions & 0 deletions path_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package runn

import (
"os"
"testing"
)

Expand All @@ -21,6 +22,23 @@ func TestFetchPaths(t *testing.T) {
{"github://k1LoW/runn/testdata/book/runn_*", 4, false},
{"https://raw.githubusercontent.com/k1LoW/runn/main/testdata/book/book.yml", 1, false},
}

if os.Getenv("CI") == "" {
// GITHUB_TOKEN for GitHub Actions does not have permission to access Gist
tests = append(tests, []struct {
pathp string
want int
wantErr bool
}{
// Single file
{"gist://b908ae0721300ca45f4e8b81b6be246d", 1, false},
{"gist://b908ae0721300ca45f4e8b81b6be246d/book.yml", 1, false},
// Multiple files
{"gist://def6fa739fba3fcf211b018f41630adc", 0, true},
{"gist://def6fa739fba3fcf211b018f41630adc/book.yml", 1, false},
}...)
}

t.Cleanup(func() {
if err := RemoveCacheDir(); err != nil {
t.Fatal(err)
Expand Down