go1.16 and embed
This commit is contained in:
parent
0a55030ae5
commit
82fd34b288
42 changed files with 95 additions and 1236 deletions
13
Makefile
13
Makefile
|
|
@ -11,16 +11,16 @@ all: $(PROGRAM)
|
||||||
setup:
|
setup:
|
||||||
$(CC) get -u github.com/client9/misspell
|
$(CC) get -u github.com/client9/misspell
|
||||||
|
|
||||||
release: clean generate gofmt codeqa
|
release: clean gofmt codeqa
|
||||||
$(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS)
|
$(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
release-vendor: clean generate gofmt codeqa
|
release-vendor: clean gofmt codeqa
|
||||||
$(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS)
|
$(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
vendor: clean generate gofmt
|
vendor: clean gofmt
|
||||||
$(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS)
|
$(ENV) $(CC) $(BUILD) -mod=vendor $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
$(PROGRAM): clean generate gofmt
|
$(PROGRAM): clean gofmt
|
||||||
$(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS)
|
$(ENV) $(CC) $(BUILD) $(GCFLAGS) $(LDFLAGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|
@ -28,9 +28,6 @@ clean:
|
||||||
|
|
||||||
codeqa: misspell golint test
|
codeqa: misspell golint test
|
||||||
|
|
||||||
generate:
|
|
||||||
$(CC) generate
|
|
||||||
|
|
||||||
gofmt:
|
gofmt:
|
||||||
gofmt -w pkg/ main.go
|
gofmt -w pkg/ main.go
|
||||||
|
|
||||||
|
|
@ -51,4 +48,4 @@ else
|
||||||
$(info skipping tests of other platforms)
|
$(info skipping tests of other platforms)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: setup release release-vendor vendor build clean codeqa generate gofmt golint misspell test
|
.PHONY: setup release release-vendor vendor build clean codeqa gofmt golint misspell test
|
||||||
|
|
|
||||||
2
go.mod
2
go.mod
|
|
@ -1,6 +1,6 @@
|
||||||
module git.giftfish.de/ston1th/gowiki
|
module git.giftfish.de/ston1th/gowiki
|
||||||
|
|
||||||
go 1.13
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.giftfish.de/ston1th/godrop/v2 v2.1.0
|
git.giftfish.de/ston1th/godrop/v2 v2.1.0
|
||||||
|
|
|
||||||
2
main.go
2
main.go
|
|
@ -1,7 +1,5 @@
|
||||||
// Copyright (C) 2020 Marius Schellenberger
|
// Copyright (C) 2020 Marius Schellenberger
|
||||||
|
|
||||||
//go:generate ./templates.sh
|
|
||||||
|
|
||||||
// +build go1.12
|
// +build go1.12
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,5 @@ const (
|
||||||
UsersURI = "/users"
|
UsersURI = "/users"
|
||||||
UserURI = "/user"
|
UserURI = "/user"
|
||||||
ViewURI = "/view"
|
ViewURI = "/view"
|
||||||
|
StaticURI = "/static"
|
||||||
BootstrapCSS = "/bootstrap.css"
|
|
||||||
CustomCSS = "/custom.css"
|
|
||||||
Favicon = "/favicon.ico"
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
// Copyright (C) 2020 Marius Schellenberger
|
||||||
|
|
||||||
package core
|
package core
|
||||||
|
|
||||||
// Contains checks if slice a contains string str
|
// Contains checks if slice a contains string str
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,7 @@ var reservedURIs = []string{
|
||||||
core.UsersURI,
|
core.UsersURI,
|
||||||
core.UserURI,
|
core.UserURI,
|
||||||
core.ViewURI,
|
core.ViewURI,
|
||||||
|
core.StaticURI,
|
||||||
}
|
}
|
||||||
|
|
||||||
var reservedNames []string
|
var reservedNames []string
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,9 @@ func (db *DB) SectionExists(section string) error {
|
||||||
|
|
||||||
func (db *DB) CreateSection(section string, members []string, user bool) error {
|
func (db *DB) CreateSection(section string, members []string, user bool) error {
|
||||||
section = userRe.ReplaceAllString(section, "")
|
section = userRe.ReplaceAllString(section, "")
|
||||||
|
if _, ok := core.Contains(section, reservedNames); ok {
|
||||||
|
return fmt.Errorf("%s: %s", errNameReserved, section)
|
||||||
|
}
|
||||||
if err := db.SectionExists(section); err == nil {
|
if err := db.SectionExists(section); err == nil {
|
||||||
return errSectionExists
|
return errSectionExists
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -103,24 +103,6 @@ func authHandler(h ctxHandler) ctxHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func staticHandler(ctx *Context) {
|
|
||||||
var err error
|
|
||||||
ctx.SetHeader("Content-Type", "text/css; charset=utf-8")
|
|
||||||
ctx.SetHeader("Expires", time.Now().UTC().Add(max).Format(http.TimeFormat))
|
|
||||||
switch ctx.Path() {
|
|
||||||
case core.BootstrapCSS:
|
|
||||||
err = ctx.Write(ctx.Srv.res["bootstrap.css"])
|
|
||||||
case core.CustomCSS:
|
|
||||||
err = ctx.Write(ctx.Srv.res["custom.css"])
|
|
||||||
case core.Favicon:
|
|
||||||
ctx.SetHeader("Content-Type", "image/x-icon")
|
|
||||||
err = ctx.Write(ctx.Srv.res["favicon.ico"])
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
log.Println("static:", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func indexHandler(ctx *Context) {
|
func indexHandler(ctx *Context) {
|
||||||
ctx.Redirect(core.IndexURI, http.StatusFound)
|
ctx.Redirect(core.IndexURI, http.StatusFound)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,24 +10,6 @@ type route struct {
|
||||||
Methods []string
|
Methods []string
|
||||||
}
|
}
|
||||||
|
|
||||||
var static = []route{
|
|
||||||
{
|
|
||||||
core.Favicon,
|
|
||||||
staticHandler,
|
|
||||||
[]string{"GET"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
core.BootstrapCSS,
|
|
||||||
staticHandler,
|
|
||||||
[]string{"GET"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
core.CustomCSS,
|
|
||||||
staticHandler,
|
|
||||||
[]string{"GET"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var routes = []route{
|
var routes = []route{
|
||||||
{
|
{
|
||||||
core.RootURI,
|
core.RootURI,
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ package server
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"embed"
|
||||||
"errors"
|
"errors"
|
||||||
"git.giftfish.de/ston1th/godrop/v2"
|
"git.giftfish.de/ston1th/godrop/v2"
|
||||||
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
"git.giftfish.de/ston1th/gowiki/pkg/core"
|
||||||
|
|
@ -78,17 +79,19 @@ func (s *HTTPServer) Stop() error {
|
||||||
return s.srv.Shutdown(ctx)
|
return s.srv.Shutdown(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//go:embed static/*
|
||||||
|
var static embed.FS
|
||||||
|
|
||||||
func (s *HTTPServer) buildRoutes() http.Handler {
|
func (s *HTTPServer) buildRoutes() http.Handler {
|
||||||
m := mux.NewRouter()
|
m := mux.NewRouter()
|
||||||
m.NotFoundHandler = ¬FoundHandler{s}
|
m.NotFoundHandler = ¬FoundHandler{s}
|
||||||
for _, v := range static {
|
m.Handle("/static/{file}", http.StripPrefix("/", http.FileServer(http.FS(static))))
|
||||||
m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...)
|
|
||||||
}
|
|
||||||
for _, v := range routes {
|
for _, v := range routes {
|
||||||
m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...)
|
m.HandleFunc(v.Path, s.contextWrapper(v.Handler)).Methods(v.Methods...)
|
||||||
}
|
}
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *HTTPServer) contextWrapper(h ctxHandler) http.HandlerFunc {
|
func (s *HTTPServer) contextWrapper(h ctxHandler) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
h(newContext(w, r, s))
|
h(newContext(w, r, s))
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
File diff suppressed because one or more lines are too long
|
|
@ -2,9 +2,9 @@
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>GoWiki | {{.Title}}</title>
|
<title>GoWiki | {{.Title}}</title>
|
||||||
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" integrity="sha256-bgotk/IPq4Yvt6s8AQGPTM5ZjPjQ6rrBRa2EyxpnFSc="></link>
|
<link rel="shortcut icon" type="image/x-icon" href="/static/favicon.ico" integrity="sha256-bgotk/IPq4Yvt6s8AQGPTM5ZjPjQ6rrBRa2EyxpnFSc="></link>
|
||||||
<link rel="stylesheet" type="text/css" href="/bootstrap.css" media="screen" integrity="sha256-3YeveuySvBgp2GItUS8eV1R/9T1zcPMyvw22SyVf8qo="></link>
|
<link rel="stylesheet" type="text/css" href="/static/bootstrap.css" media="screen" integrity="sha256-3YeveuySvBgp2GItUS8eV1R/9T1zcPMyvw22SyVf8qo="></link>
|
||||||
<link rel="stylesheet" type="text/css" href="/custom.css" media="screen" integrity="sha256-IwnADqysqqVpTpQ4sbG3Bz7v8FM4lqMiozQPozsFBUQ="></link>
|
<link rel="stylesheet" type="text/css" href="/static/custom.css" media="screen" integrity="sha256-IwnADqysqqVpTpQ4sbG3Bz7v8FM4lqMiozQPozsFBUQ="></link>
|
||||||
<meta name="theme-color" content="#375a7f">
|
<meta name="theme-color" content="#375a7f">
|
||||||
<meta name="description" content="{{.Title}}">
|
<meta name="description" content="{{.Title}}">
|
||||||
</head>
|
</head>
|
||||||
114
templates.sh
114
templates.sh
|
|
@ -1,114 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# Copyright (C) 2020 Marius Schellenberger
|
|
||||||
|
|
||||||
# this file generates Go source code for the gowiki
|
|
||||||
# it contains html and css and uses the contents
|
|
||||||
# of the templates directory
|
|
||||||
|
|
||||||
templates_go="pkg/server/templates.go"
|
|
||||||
echo "Generating ${templates_go}"
|
|
||||||
|
|
||||||
if [ ! -d templates ]; then
|
|
||||||
echo "error: templates directory not found" 1>&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat << EOF > ${templates_go}
|
|
||||||
// Copyright (C) 2020 Marius Schellenberger
|
|
||||||
|
|
||||||
// This file is auto-generated by templates.sh
|
|
||||||
// using the contents of the templates directory
|
|
||||||
|
|
||||||
package server
|
|
||||||
|
|
||||||
import (
|
|
||||||
"encoding/base64"
|
|
||||||
"errors"
|
|
||||||
"git.giftfish.de/ston1th/gowiki/pkg/log"
|
|
||||||
"html/template"
|
|
||||||
)
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo "const (" >> ${templates_go}
|
|
||||||
|
|
||||||
for f in $(ls templates/*.html); do
|
|
||||||
fname=${f/templates\//}
|
|
||||||
fname=${fname/.html/}
|
|
||||||
echo " ${fname} = \`$(cat ${f})\`" >> ${templates_go}
|
|
||||||
done
|
|
||||||
|
|
||||||
for f in $(ls templates/*.css); do
|
|
||||||
fname=${f/templates\//}
|
|
||||||
fname=${fname/.css/CSS}
|
|
||||||
echo " ${fname} = \`$(cat ${f})\`" >> ${templates_go}
|
|
||||||
done
|
|
||||||
|
|
||||||
echo " favicon = \"$(base64 -w 0 templates/favicon.ico)\"" >> ${templates_go}
|
|
||||||
|
|
||||||
cat << EOF >> ${templates_go}
|
|
||||||
)
|
|
||||||
|
|
||||||
func (s *HTTPServer) loadTemplates() {
|
|
||||||
var fatal bool
|
|
||||||
s.templ = make(map[string]*template.Template)
|
|
||||||
s.res = make(map[string][]byte)
|
|
||||||
parse := func(html ...string) (temp *template.Template) {
|
|
||||||
var err error
|
|
||||||
temp = template.New("")
|
|
||||||
for _, s := range html {
|
|
||||||
temp, err = temp.Parse(s)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("parse:", err)
|
|
||||||
fatal = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// resources
|
|
||||||
s.res["bootstrap.css"] = []byte(bootstrapCSS)
|
|
||||||
s.res["custom.css"] = []byte(customCSS)
|
|
||||||
fav, err := base64.StdEncoding.DecodeString(favicon)
|
|
||||||
if err != nil {
|
|
||||||
log.Println("favicon:", err)
|
|
||||||
fatal = true
|
|
||||||
}
|
|
||||||
s.res["favicon.ico"] = fav
|
|
||||||
|
|
||||||
// pages
|
|
||||||
s.templ["notFoundHandler"] = parse(index, menu, notFound)
|
|
||||||
s.templ["forbiddenHandler"] = parse(index, menu, forbidden)
|
|
||||||
s.templ["loginHandler"] = parse(index, menu, login)
|
|
||||||
s.templ["loginTotpHandler"] = parse(index, menu, loginTotp)
|
|
||||||
s.templ["searchHandler"] = parse(index, menu, search)
|
|
||||||
s.templ["pageHandler"] = parse(index, menu, page)
|
|
||||||
s.templ["pageNewHandler"] = parse(index, menu, pageNew)
|
|
||||||
s.templ["pageEditHandler"] = parse(index, menu, pageEdit)
|
|
||||||
s.templ["pageViewHandler"] = parse(index, menu, pageView)
|
|
||||||
s.templ["pageMDHandler"] = parse(index, menu, pageMD)
|
|
||||||
s.templ["pageShareHandler"] = parse(index, menu, pageShare)
|
|
||||||
s.templ["pageBlacklistHandler"] = parse(index, menu, pageBlacklist)
|
|
||||||
s.templ["pageDelHandler"] = parse(index, menu, pageDel)
|
|
||||||
// sections
|
|
||||||
s.templ["sectionHandler"] = parse(index, menu, section)
|
|
||||||
s.templ["sectionsHandler"] = parse(index, menu, sections)
|
|
||||||
s.templ["sectionNewHandler"] = parse(index, menu, sectionNew)
|
|
||||||
s.templ["sectionEditHandler"] = parse(index, menu, sectionEdit)
|
|
||||||
s.templ["sectionDelHandler"] = parse(index, menu, sectionDel)
|
|
||||||
// users
|
|
||||||
s.templ["usersHandler"] = parse(index, menu, users)
|
|
||||||
s.templ["userNewHandler"] = parse(index, menu, userNew)
|
|
||||||
s.templ["userEditHandler"] = parse(index, menu, userEdit)
|
|
||||||
s.templ["userDelHandler"] = parse(index, menu, userDel)
|
|
||||||
// totp
|
|
||||||
s.templ["userTotpHandler"] = parse(index, menu, userTotp)
|
|
||||||
// stats
|
|
||||||
s.templ["statsHandler"] = parse(index, menu, stats)
|
|
||||||
|
|
||||||
if fatal {
|
|
||||||
log.Fatal("parse: ", errors.New("parsing templates failed"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
37
vendor/modules.txt
vendored
37
vendor/modules.txt
vendored
|
|
@ -1,10 +1,14 @@
|
||||||
# git.giftfish.de/ston1th/godrop/v2 v2.1.0
|
# git.giftfish.de/ston1th/godrop/v2 v2.1.0
|
||||||
|
## explicit
|
||||||
git.giftfish.de/ston1th/godrop/v2
|
git.giftfish.de/ston1th/godrop/v2
|
||||||
# git.giftfish.de/ston1th/jwt/v3 v3.2.0
|
# git.giftfish.de/ston1th/jwt/v3 v3.2.0
|
||||||
|
## explicit
|
||||||
git.giftfish.de/ston1th/jwt/v3
|
git.giftfish.de/ston1th/jwt/v3
|
||||||
# github.com/RoaringBitmap/roaring v0.5.5
|
# github.com/RoaringBitmap/roaring v0.5.5
|
||||||
|
## explicit
|
||||||
github.com/RoaringBitmap/roaring
|
github.com/RoaringBitmap/roaring
|
||||||
# github.com/blevesearch/bleve v1.0.12
|
# github.com/blevesearch/bleve v1.0.12
|
||||||
|
## explicit
|
||||||
github.com/blevesearch/bleve
|
github.com/blevesearch/bleve
|
||||||
github.com/blevesearch/bleve/analysis
|
github.com/blevesearch/bleve/analysis
|
||||||
github.com/blevesearch/bleve/analysis/analyzer/custom
|
github.com/blevesearch/bleve/analysis/analyzer/custom
|
||||||
|
|
@ -73,45 +77,78 @@ github.com/couchbase/vellum/levenshtein
|
||||||
github.com/couchbase/vellum/regexp
|
github.com/couchbase/vellum/regexp
|
||||||
github.com/couchbase/vellum/utf8
|
github.com/couchbase/vellum/utf8
|
||||||
# github.com/cpuguy83/go-md2man/v2 v2.0.0
|
# github.com/cpuguy83/go-md2man/v2 v2.0.0
|
||||||
|
## explicit
|
||||||
github.com/cpuguy83/go-md2man/v2/md2man
|
github.com/cpuguy83/go-md2man/v2/md2man
|
||||||
|
# github.com/cznic/b v0.0.0-20181122101859-a26611c4d92d
|
||||||
|
## explicit
|
||||||
|
# github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548
|
||||||
|
## explicit
|
||||||
|
# github.com/cznic/strutil v0.0.0-20181122101858-275e90344537
|
||||||
|
## explicit
|
||||||
|
# github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51
|
||||||
|
## explicit
|
||||||
|
# github.com/facebookgo/stack v0.0.0-20160209184415-751773369052
|
||||||
|
## explicit
|
||||||
|
# github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870
|
||||||
|
## explicit
|
||||||
# github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a
|
# github.com/glycerine/go-unsnap-stream v0.0.0-20190901134440-81cf024a9e0a
|
||||||
|
## explicit
|
||||||
github.com/glycerine/go-unsnap-stream
|
github.com/glycerine/go-unsnap-stream
|
||||||
# github.com/golang/protobuf v1.4.3
|
# github.com/golang/protobuf v1.4.3
|
||||||
|
## explicit
|
||||||
github.com/golang/protobuf/proto
|
github.com/golang/protobuf/proto
|
||||||
# github.com/golang/snappy v0.0.2
|
# github.com/golang/snappy v0.0.2
|
||||||
|
## explicit
|
||||||
github.com/golang/snappy
|
github.com/golang/snappy
|
||||||
# github.com/gorilla/mux v1.7.4
|
# github.com/gorilla/mux v1.7.4
|
||||||
|
## explicit
|
||||||
github.com/gorilla/mux
|
github.com/gorilla/mux
|
||||||
|
# github.com/jmhodges/levigo v1.0.0
|
||||||
|
## explicit
|
||||||
# github.com/mschoch/smat v0.2.0
|
# github.com/mschoch/smat v0.2.0
|
||||||
github.com/mschoch/smat
|
github.com/mschoch/smat
|
||||||
# github.com/philhofer/fwd v1.1.0
|
# github.com/philhofer/fwd v1.1.0
|
||||||
github.com/philhofer/fwd
|
github.com/philhofer/fwd
|
||||||
# github.com/pquerna/otp v1.3.0
|
# github.com/pquerna/otp v1.3.0
|
||||||
|
## explicit
|
||||||
github.com/pquerna/otp
|
github.com/pquerna/otp
|
||||||
github.com/pquerna/otp/hotp
|
github.com/pquerna/otp/hotp
|
||||||
github.com/pquerna/otp/totp
|
github.com/pquerna/otp/totp
|
||||||
|
# github.com/remyoudompheng/bigfft v0.0.0-20190512091148-babf20351dd7
|
||||||
|
## explicit
|
||||||
# github.com/russross/blackfriday v1.6.0-pre.1
|
# github.com/russross/blackfriday v1.6.0-pre.1
|
||||||
|
## explicit
|
||||||
github.com/russross/blackfriday
|
github.com/russross/blackfriday
|
||||||
# github.com/russross/blackfriday/v2 v2.1.0
|
# github.com/russross/blackfriday/v2 v2.1.0
|
||||||
|
## explicit
|
||||||
github.com/russross/blackfriday/v2
|
github.com/russross/blackfriday/v2
|
||||||
# github.com/steveyen/gtreap v0.1.0
|
# github.com/steveyen/gtreap v0.1.0
|
||||||
github.com/steveyen/gtreap
|
github.com/steveyen/gtreap
|
||||||
|
# github.com/tecbot/gorocksdb v0.0.0-20181010114359-8752a9433481
|
||||||
|
## explicit
|
||||||
# github.com/tinylib/msgp v1.1.4
|
# github.com/tinylib/msgp v1.1.4
|
||||||
|
## explicit
|
||||||
github.com/tinylib/msgp/msgp
|
github.com/tinylib/msgp/msgp
|
||||||
# github.com/urfave/cli v1.22.5
|
# github.com/urfave/cli v1.22.5
|
||||||
|
## explicit
|
||||||
github.com/urfave/cli
|
github.com/urfave/cli
|
||||||
# github.com/willf/bitset v1.1.11
|
# github.com/willf/bitset v1.1.11
|
||||||
|
## explicit
|
||||||
github.com/willf/bitset
|
github.com/willf/bitset
|
||||||
# go.etcd.io/bbolt v1.3.5
|
# go.etcd.io/bbolt v1.3.5
|
||||||
|
## explicit
|
||||||
go.etcd.io/bbolt
|
go.etcd.io/bbolt
|
||||||
# golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9
|
# golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9
|
||||||
|
## explicit
|
||||||
golang.org/x/crypto/bcrypt
|
golang.org/x/crypto/bcrypt
|
||||||
golang.org/x/crypto/blowfish
|
golang.org/x/crypto/blowfish
|
||||||
# golang.org/x/sys v0.0.0-20201112073958-5cba982894dd
|
# golang.org/x/sys v0.0.0-20201112073958-5cba982894dd
|
||||||
|
## explicit
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
golang.org/x/sys/windows
|
golang.org/x/sys/windows
|
||||||
# google.golang.org/protobuf v1.25.0
|
# google.golang.org/protobuf v1.25.0
|
||||||
|
## explicit
|
||||||
google.golang.org/protobuf/encoding/prototext
|
google.golang.org/protobuf/encoding/prototext
|
||||||
google.golang.org/protobuf/encoding/protowire
|
google.golang.org/protobuf/encoding/protowire
|
||||||
google.golang.org/protobuf/internal/descfmt
|
google.golang.org/protobuf/internal/descfmt
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue