refactor!: v2
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
decentral1se 2024-07-23 14:56:44 +02:00
parent d36cebc299
commit b9272e7a61
Signed by: decentral1se
GPG Key ID: 03789458B3D0C410
9 changed files with 574 additions and 1074 deletions

18
.drone.yml Normal file
View File

@ -0,0 +1,18 @@
---
kind: pipeline
name: coopcloud.tech/abra
steps:
- name: make check
image: golang:1.21
commands:
- make check
- name: make test
image: golang:1.21
commands:
- make test
depends_on:
- make check
volumes:
- name: deps
temp: {}

View File

@ -1,24 +1,25 @@
--- ---
project_name: distribusi project_name: distribusi
version: 2
gitea_urls:
api: https://git.vvvvvvaria.org/api/v1
download: https://git.vvvvvvaria.org/
skip_tls_verify: false
before: before:
hooks: hooks:
- go mod tidy - go mod tidy
- go generate ./...
upx:
- enabled: true
compress: best
lzma: true
builds: builds:
- env: - id: distribusi
binary: distribusi
env:
- CGO_ENABLED=0 - CGO_ENABLED=0
goos: goos:
- linux
- windows
- darwin - darwin
- linux
goarch: goarch:
- 386 - 386
- amd64 - amd64
@ -28,33 +29,3 @@ builds:
- 5 - 5
- 6 - 6
- 7 - 7
ldflags:
- "-X 'main.Version={{ .Version }}'"
- "-X 'main.Commit={{ .Commit }}'"
archives:
- replacements:
darwin: Darwin
linux: Linux
windows: Windows
386: i386
amd64: x86_64
format: binary
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ incpatch .Version }}-alpha"
changelog:
sort: asc
filters:
exclude:
- "^Revert"
- "^build:"
- "^docs:"
- "^refactor:"
- "^test:"
- "^tests:"
- "^wip:"

36
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,36 @@
## Hacking
You'll need [Go] >= 1.11 installed.
Run `make` to build a new `./distribusi` executable.
[Go]: https://go.dev
### Tests
```
make test
```
### Generating the logo
```
cat contrib/logo/LOGO | lolcat -F 0.1
```
### Release
Currently, you have to be `@decentral1se` to do this:
```bash
git tag <version>
VERSION=<version> make release
```
You can build a local-only release by running this:
```bash
goreleaser release --snapshot --clean
```
Binaries are in `dist`.

View File

@ -1,24 +1,36 @@
COMMIT := $(shell git rev-list -1 HEAD) COMMIT := $(shell git rev-list -1 HEAD)
LDFLAGS := "-X 'main.Commit=$(COMMIT)'" GCFLAGS := -gcflags="all=-l -B"
DIST_LDFLAGS := $(LDFLAGS)" -s -w" LDFLAGS := -ldflags="-X 'main.Commit=$(COMMIT)' -s -w"
ALLFLAGS := $(GCFLAGS) $(LDFLAGS)
default: build default: build
build: check:
@go build -ldflags=$(LDFLAGS) . @test -z $$(gofmt -l .) || \
(echo "gofmt: formatting issue - run 'make format' to resolve" && exit 1)
format:
@gofmt -s -w .
build: check
@go build $(ALLFLAGS) .
install: install:
@go install -ldflags=$(LDFLAGS) . @go install $(ALLFLAGS) .
test: test:
@go test ./... -cover -v @go test ./... -cover -v
clean: clean:
@rm -f /tmp/distribusi-go* && rm ./distribusi @rm ./distribusi
upx:
@upx --lzma ./distribusi
release: release:
@goreleaser release --snapshot --rm-dist && \ @goreleaser release --snapshot --clean
ssh varia.zone mkdir -p public_html/distribusi-go/$(VERSION) && \
scp -r dist/* varia.zone:public_html/distribusi-go/$(VERSION)
.PHONY: build install test clean release deps:
@go get -t -u ./...
.PHONY: check format build install test clean upx release deps

216
README.md
View File

@ -1,203 +1,22 @@
# distribusi-go # distribusi-go
[![Build Status](https://build.coopcloud.tech/api/badges/coop-cloud/distribusi-go/status.svg?ref=refs/heads/main)](https://build.coopcloud.tech/coop-cloud/distribusi-go)
[![Go Report Card](https://goreportcard.com/badge/git.coopcloud.tech/coop-cloud/distribusi-go)](https://goreportcard.com/report/git.coopcloud.tech/coop-cloud/distribusi-go)
[![Go Reference](https://pkg.go.dev/badge/coopcloud.tech/distribusi-go.svg)](https://pkg.go.dev/coopcloud.tech/distribusi-go)
<p align="center"> <p align="center">
<img src="./contrib/logo/logo.png" /> <img src="./contrib/logo/logo.png" />
</p> </p>
An implementation of [distribusi] in [a faster programming language]. `distribusi` is a low-tech content management system for the web that produces
static index pages based on folders in the filesystem. It is inspired by the
automatic index functions featured in several web servers.
`distribusi` is a content management system for the web that produces static A re-implementation of [`varia/distribusi`](https://git.vvvvvvaria.org/varia/distribusi) in a faster programming language.
index pages based on folders in the filesystem. It is inspired by the automatic
index functions featured in several web servers. It works by traversing the
file system and directory hierarchy to automatically list all the files in the
directory and providing them with html classes and tags for easy styling.
If you're coming from the Python version, [here are the differences].
## Install
> Current release: **0.1.1-alpha**
Enterprise :tm: cross-platform support is available :champagne: If your
platform isn't listed below, please see [the entire listing]. If you can't find
it there, we can probably add support for it (see `$GOOS`/`$GOARCH` [on
go.dev]), please [open a ticket]. Package manager installation methods are
planned for Some Time Soon :tm: (e.g. `apt install distribusi`, see [this
ticket] to track).
### GNU/Linux
#### GNU/Linux (amd64)
```
curl https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_linux_amd64/distribusi -o distribusi
chmod +x distribusi
./distribusi -h # check things work
```
#### GNU/Linux (386)
```
curl https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_linux_386/distribusi -o distribusi
chmod +x distribusi
./distribusi -h # check things work
```
#### GNU/Linux (arm64)
```
curl https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_linux_arm64/distribusi -o distribusi
chmod +x distribusi
./distribusi -h # check things work
```
### Mac OS X
#### Mac OS X (amd64)
```
curl https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_darwin_amd64/distribusi -o distribusi
chmod +x distribusi
./distribusi -h # check things work
```
#### Mac OS X (arm64)
```
curl https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_darwin_arm64/distribusi -o distribusi
chmod +x distribusi
./distribusi -h # check things work
```
### Windows
I've no idea how you even install this on Windoze! Maybe you can help by
sending a documentation patch? 🙏
#### Windows (amd64)
> https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_windows_amd64/distribusi.exe
#### Windows (386)
> https://vvvvvvaria.org/~decentral1se/distribusi-go/0.1.1-alpha/distribusi_windows_386/distribusi.exe
## Quick start
Run `distribusi-go` on `<path>` and serve it locally for viewing:
```bash
./distribusi -p <path> -s
```
If you want to ignore certain paths, you can use `-i/--ignore`:
```bash
./distribusi -p <path> -i '*.gif, *.md, mydir'
```
It supports a list of patterns in a comma separated list, wildcards work, more [on pkg.go.dev].
If you run into issues, run with `-d/--debug`. All debug logs are stored in a time stamped log file under `/tmp/`.
```bash
ls /tmp/ | grep -i distribusi
distribusi-go-20-25-492637114356
```
If you have SSH access to a server, you can publish your files with `-P/--publish`.
The syntax works just like [scp] and it uses SSH to transfer the files under the hood:
```
./distribusi -p <path> -P <server>:<remote-path>
```
See [this short guide](#ssh-guide-for-p-publish) for help with SSH connection issues.
:v:
## Hacking ## Hacking
You'll need [Go] >= 1.11 installed. Run `make` to build a new `./distribusi` executable. [`CONTRIBUTING.md`](./CONTRIBUTING.md)
If you wanna learn Go, I've got [this book], feel free to take a loan of it :grinning:
## Tips
### SSH guide for `-P/--publish`
`distribusi-go` only supports one connection method right now: SSH public key
authentication using `ssh-agent`. This is mostly for simplicity, there was a
discussion running [over here] for a while.
Let's take a practical example. First, make sure your `ssh-agent` is running
and your SSH key is loaded:
```
eval $(ssh-agent -s)
ssh-add ~/.ssh/<ssh-secret-key-part>
ssh-add -L # see loaded keys
```
Now, when you type `-P <server>:...`, `distribusi-go` will look up an entry in
your `~/.ssh/config` with a matching `<server>` value. I.e. if you want to run
`./distribusi -p <path> -P varia.zone:/var/www/`, then a matching
`~/.ssh/config` entry might look like this:
```ssh
Host varia.zone
Hostname varia.zone
User decentral1se
Port 22
IdentityFile ~/.ssh/<ssh-secret-key-part>
```
`distribusi-go` will read the `User` and `Port` values from this configuration.
It won't try to parse private key files or prompt for passwords, it will simply
interface with `ssh-agent` which handles all that. If there is no
`~/.ssh/config` entry, default values will be attempted.
If all else fails, try `-d/--debug` for extra help figuring out what SSH
connection details are used. You can [open a ticket] for support also.
### Generating the logo
```
cat contrib/logo/LOGO | lolcat -F 0.1
```
## Differences compared to the Python version
- It's simpler to install on your computer, just download the binary, `chmod
+x` and run it 🎉 There is no need to install [Pillow] for handling images,
that is now built-in. The only external dependency is [exiftool] for image
captions from embedded metadata. If you don't have `exiftool` installed, then
it gracefully skips that feature.
- The command-line interface is quite different. There are less optional flags
and more defaults. I shuffled a number of things around according to my
preferences (open to changes, please [open a ticket]). For example, I always
like my images to be thumbnail'd.
Continue with the [install instructions].
## Release
Currently, you have to be `@decentral1se` to do this:
```bash
git tag <version>
VERSION=<version> make release
```
You can build a local-only release by running this:
```bash
goreleaser release --snapshot --rm-dist
```
Binaries are in `dist`.
## Acknowledgements ## Acknowledgements
@ -208,20 +27,3 @@ Binaries are in `dist`.
<a href="https://git.vvvvvvaria.org/decentral1se/distribusi-go/src/branch/main/LICENSE"> <a href="https://git.vvvvvvaria.org/decentral1se/distribusi-go/src/branch/main/LICENSE">
<img src="https://www.gnu.org/graphics/gplv3-or-later.png" /> <img src="https://www.gnu.org/graphics/gplv3-or-later.png" />
</a> </a>
[a faster programming language]: https://go.dev
[Pillow]: https://pillow.readthedocs.io/en/stable/installation.html#external-libraries
[distribusi]: https://git.vvvvvvaria.org/varia/distribusi
[exiftool]: https://exiftool.org/
[here are the differences]: #differences-compared-to-the-python-version
[install instructions]: #install
[Go]: https://go.dev
[on go.dev]: https://go.dev/doc/install/source#environment
[on pkg.go.dev]: https://pkg.go.dev/path/filepath#Match
[open a ticket]: https://git.vvvvvvaria.org/decentral1se/distribusi-go/issues/new/choose
[over here]: https://git.vvvvvvaria.org/decentral1se/distribusi-go/issues/4
[report issues]: https://git.vvvvvvaria.org/decentral1se/distribusi-go/issues/new/choose
[scp]: https://linux.die.net/man/1/scp
[the entire listing]: https://vvvvvvaria.org/~decentral1se/distribusi-go/
[this book]: https://www.gopl.io/
[this ticket]: https://git.vvvvvvaria.org/decentral1se/distribusi-go/issues/1

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,9 @@
package main package main
import ( import (
"os"
"path/filepath"
"strings"
"testing" "testing"
) )
func TestTrimFinalNewline(t *testing.T) {
trimmed := trimFinalNewline([]byte("foo\n"))
if trimmed != "foo" {
t.Fatalf("failed to trimmed new line from 'foo\\n'")
}
}
func TestTrimAllNewlines(t *testing.T) { func TestTrimAllNewlines(t *testing.T) {
trimmed := trimAllNewlines("\nfoo\n") trimmed := trimAllNewlines("\nfoo\n")
if trimmed != "foo" { if trimmed != "foo" {
@ -43,23 +33,3 @@ func TestParseMtype(t *testing.T) {
t.Fatalf("failed to error out correctly parsing %s", mtype) t.Fatalf("failed to error out correctly parsing %s", mtype)
} }
} }
func TestGetLogFile(t *testing.T) {
f, err := getLogFile()
if err != nil {
t.Fatalf("failed to create log file, saw: %s", err)
}
if !strings.Contains(f.Name(), "distribusi-go") {
t.Fatalf("log file named incorrectly: %s", f.Name())
}
absPath, err := filepath.Abs(f.Name())
if err != nil {
t.Fatalf("failed to read absoluate path of %s", f.Name())
}
if err := os.Remove(absPath); err != nil {
t.Fatalf("unable to remove %s", absPath)
}
}

25
go.mod
View File

@ -1,32 +1,13 @@
module varia.zone/distribusi module varia.zone/distribusi
go 1.18 go 1.21
require ( require (
github.com/Gurpartap/logrus-stack v0.0.0-20170710170904-89c00d8a28f4
github.com/barasher/go-exiftool v1.7.0
github.com/disintegration/imaging v1.6.2
github.com/gabriel-vasile/mimetype v1.4.0 github.com/gabriel-vasile/mimetype v1.4.0
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 github.com/prplecake/go-thumbnail v0.1.6
github.com/kevinburke/ssh_config v1.1.0
github.com/povsister/scp v0.0.0-20210427074412-33febfd9f13e
github.com/schollz/progressbar/v3 v3.8.6
github.com/sirupsen/logrus v1.8.1
github.com/urfave/cli/v2 v2.3.0
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838
) )
require ( require (
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d // indirect golang.org/x/image v0.0.0-20220302094943-723b81ca9867 // indirect
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.13 // indirect
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
github.com/rivo/uniseg v0.2.0 // indirect
github.com/russross/blackfriday/v2 v2.0.1 // indirect
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 // indirect
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
) )

65
go.sum
View File

@ -1,71 +1,14 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Gurpartap/logrus-stack v0.0.0-20170710170904-89c00d8a28f4 h1:vdT7QwBhJJEVNFMBNhRSFDRCB6O16T28VhvqRgqFyn8=
github.com/Gurpartap/logrus-stack v0.0.0-20170710170904-89c00d8a28f4/go.mod h1:SvXOG8ElV28oAiG9zv91SDe5+9PfIr7PPccpr8YyXNs=
github.com/barasher/go-exiftool v1.7.0 h1:EOGb5D6TpWXmqsnEjJ0ai6+tIW2gZFwIoS9O/33Nixs=
github.com/barasher/go-exiftool v1.7.0/go.mod h1:F9s/a3uHSM8YniVfwF+sbQUtP8Gmh9nyzigNF+8vsWo=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
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/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c=
github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4=
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A=
github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg=
github.com/gabriel-vasile/mimetype v1.4.0 h1:Cn9dkdYsMIu56tGho+fqzh7XmvY2YyGU0FnbhiOsEro= github.com/gabriel-vasile/mimetype v1.4.0 h1:Cn9dkdYsMIu56tGho+fqzh7XmvY2YyGU0FnbhiOsEro=
github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8=
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= github.com/prplecake/go-thumbnail v0.1.6 h1:6mBLXL2/79QHYRCvrciiLtT6vAJfOaMAvNhmjsyLX1c=
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/prplecake/go-thumbnail v0.1.6/go.mod h1:v8PaF1YrWlJjdkROeoDgDil5nFycVdH7taPOl/NS830=
github.com/kevinburke/ssh_config v1.1.0 h1:pH/t1WS9NzT8go394IqZeJTMHVm6Cr6ZJ6AQ+mdNo/o= golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4=
github.com/kevinburke/ssh_config v1.1.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/povsister/scp v0.0.0-20210427074412-33febfd9f13e h1:VtsDti2SgX7M7jy0QAyGgb162PeHLrOaNxmcYOtaGsY=
github.com/povsister/scp v0.0.0-20210427074412-33febfd9f13e/go.mod h1:i1Au86ZXK0ZalQNyBp2njCcyhSCR/QP/AMfILip+zNI=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/schollz/progressbar/v3 v3.8.6 h1:QruMUdzZ1TbEP++S1m73OqRJk20ON11m6Wqv4EoGg8c=
github.com/schollz/progressbar/v3 v3.8.6/go.mod h1:W5IEwbJecncFGBvuEh4A7HT1nZZ6WNIL2i3qbnI0WKY=
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 h1:71vQrMauZZhcTVK6KdYM+rklehEEwb3E+ZhaE5jrPrE=
golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/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-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=