Update to Go 1.16. Embed ./web/ dir.

main
Leonid Maslakov 11 months ago
parent e43c6e4420
commit edc78fd253

@ -1,3 +1,6 @@
GO ?= go
GOFMT ?= gofmt
NAME = lenpaste
MAIN_GO = ./cmd/*.go
@ -9,15 +12,12 @@ LDFLAGS = -w -s -X "main.Version=$(shell git describe --tags --always | sed 's/-
all:
mkdir -p ./dist/bin/
mkdir -p ./dist/share/$(NAME)
go build -trimpath -ldflags="$(LDFLAGS)" -o ./dist/bin/$(NAME) $(MAIN_GO)
$(GO) build -trimpath -ldflags="$(LDFLAGS)" -o ./dist/bin/$(NAME) $(MAIN_GO)
chmod +x ./dist/bin/$(NAME)
cp -r ./web ./dist/share/$(NAME)
fmt:
@gofmt -w $(shell find ./ -type f -name '*.go')
@$(GO) -w $(shell find ./ -type f -name '*.go')
clean:
rm -rf ./dist/

@ -30,7 +30,6 @@ import (
"io/ioutil"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"time"
@ -80,7 +79,6 @@ func printHelp(noErrors bool) {
println("Usage:", os.Args[0], "[-db-source] [OPTION]...")
println("")
println(" -address ADDRESS:PORT (default: :80)")
println(" -web-dir Dir with page templates and static content")
println(" -db-driver Currently supported drivers: 'sqlite3' and 'postgres' (default: sqlite3)")
println(" -db-source DB source.")
println(" -db-cleanup-period Interval at which the DB is cleared of expired but not yet deleted pastes. (default: 3h)")
@ -169,27 +167,12 @@ func parseDuration(s string) (int64, error) {
}
func main() {
// Get ./bin/ dir
binFile, err := os.Executable()
if err != nil {
exitOnError(err)
}
binFile, err = filepath.EvalSymlinks(binFile)
if err != nil {
exitOnError(err)
}
binDir := filepath.Dir(binFile)
// Get ./share/lenpaste/web dir
defaultWebDir := filepath.Join(binDir, "../share/lenpaste/web")
var err error
// Read cmd args
flag.Usage = func() { printHelp(false) }
flagAddress := flag.String("address", ":80", "")
flagWebDir := flag.String("web-dir", defaultWebDir, "")
flagDbDriver := flag.String("db-driver", "sqlite3", "")
flagDbSource := flag.String("db-source", "", "")
flagDbCleanupPeriod := flag.String("db-cleanup-period", "3h", "")
@ -315,7 +298,7 @@ func main() {
}
// Load pages
webData, err := web.Load(cfg, *flagWebDir)
webData, err := web.Load(cfg)
if err != nil {
exitOnError(err)
}

@ -1,6 +1,6 @@
module git.lcomrade.su/root/lenpaste
go 1.11
go 1.16
replace git.lcomrade.su/root/lenpaste/internal => ./internal

@ -19,28 +19,9 @@
package web
import (
"io/ioutil"
"net/http"
"os"
)
func readFile(path string) ([]byte, error) {
// Open file
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
// Read file
fileByte, err := ioutil.ReadAll(file)
if err != nil {
return nil, err
}
return fileByte, nil
}
func getCookie(req *http.Request, name string) string {
cookie, err := req.Cookie(name)
if err != nil {

@ -24,10 +24,13 @@ import (
"git.lcomrade.su/root/lenpaste/internal/storage"
chromaLexers "github.com/alecthomas/chroma/lexers"
"html/template"
"path/filepath"
"embed"
textTemplate "text/template"
)
//go:embed data/*
var embFS embed.FS
type Data struct {
DB storage.DB
Log logger.Config
@ -80,7 +83,7 @@ type Data struct {
UiDefaultLifeTime *string
}
func Load(cfg config.Config, webDir string) (Data, error) {
func Load(cfg config.Config) (Data, error) {
var data Data
var err error
@ -116,7 +119,7 @@ func Load(cfg config.Config, webDir string) (Data, error) {
data.Lexers = &lexers
// Load locales
locales, err := loadLocales(filepath.Join(webDir, "locale"))
locales, err := loadLocales(embFS, "data/locale")
if err != nil {
return data, err
}
@ -132,167 +135,123 @@ func Load(cfg config.Config, webDir string) (Data, error) {
data.LocaleSelector = &localeSelector
// style.css file
styleCSS, err := readFile(filepath.Join(webDir, "style.css"))
styleCSS, err := embFS.ReadFile("data/style.css")
if err != nil {
return data, err
}
data.StyleCSS = &styleCSS
// main.tmpl
data.Main, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "main.tmpl"),
)
data.Main, err = template.ParseFS(embFS, "data/base.tmpl", "data/main.tmpl")
if err != nil {
return data, err
}
// main.js
mainJS, err := readFile(filepath.Join(webDir, "main.js"))
mainJS, err := embFS.ReadFile("data/main.js")
if err != nil {
return data, err
}
data.MainJS = &mainJS
// history.js
data.HistoryJS, err = textTemplate.ParseFiles(filepath.Join(webDir, "history.js"))
data.HistoryJS, err = textTemplate.ParseFS(embFS, "data/history.js")
if err != nil {
return data, err
}
// code.js
data.CodeJS, err = textTemplate.ParseFiles(filepath.Join(webDir, "code.js"))
data.CodeJS, err = textTemplate.ParseFS(embFS, "data/code.js")
if err != nil {
return data, err
}
// paste.tmpl
data.PastePage, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "paste.tmpl"),
)
data.PastePage, err = template.ParseFS(embFS, "data/base.tmpl", "data/paste.tmpl")
if err != nil {
return data, err
}
// paste.js
data.PasteJS, err = textTemplate.ParseFiles(filepath.Join(webDir, "paste.js"))
data.PasteJS, err = textTemplate.ParseFS(embFS, "data/paste.js")
if err != nil {
return data, err
}
// paste_continue.tmpl
data.PasteContinue, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "paste_continue.tmpl"),
)
data.PasteContinue, err = template.ParseFS(embFS, "data/base.tmpl", "data/paste_continue.tmpl")
if err != nil {
return data, err
}
// settings.tmpl
data.Settings, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "settings.tmpl"),
)
data.Settings, err = template.ParseFS(embFS, "data/base.tmpl", "data/settings.tmpl")
if err != nil {
return data, err
}
// about.tmpl
data.About, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "about.tmpl"),
)
data.About, err = template.ParseFS(embFS, "data/base.tmpl", "data/about.tmpl")
if err != nil {
return data, err
}
// terms.tmpl
data.TermsOfUse, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "terms.tmpl"),
)
data.TermsOfUse, err = template.ParseFS(embFS, "data/base.tmpl", "data/terms.tmpl")
if err != nil {
return data, err
}
// authors.tmpl
data.Authors, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "authors.tmpl"),
)
data.Authors, err = template.ParseFS(embFS, "data/base.tmpl", "data/authors.tmpl")
if err != nil {
return data, err
}
// license.tmpl
data.License, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "license.tmpl"),
)
data.License, err = template.ParseFS(embFS, "data/base.tmpl", "data/license.tmpl")
if err != nil {
return data, err
}
// source_code.tmpl
data.SourceCodePage, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "source_code.tmpl"),
)
data.SourceCodePage, err = template.ParseFS(embFS, "data/base.tmpl", "data/source_code.tmpl")
if err != nil {
return data, err
}
// docs.tmpl
data.Docs, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "docs.tmpl"),
)
data.Docs, err = template.ParseFS(embFS, "data/base.tmpl", "data/docs.tmpl")
if err != nil {
return data, err
}
// docs_apiv1.tmpl
data.DocsApiV1, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "docs_apiv1.tmpl"),
)
data.DocsApiV1, err = template.ParseFS(embFS, "data/base.tmpl", "data/docs_apiv1.tmpl")
if err != nil {
return data, err
}
// docs_api_libs.tmpl
data.DocsApiLibs, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "docs_api_libs.tmpl"),
)
data.DocsApiLibs, err = template.ParseFS(embFS, "data/base.tmpl", "data/docs_api_libs.tmpl")
if err != nil {
return data, err
}
// error.tmpl
data.ErrorPage, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "error.tmpl"),
)
data.ErrorPage, err = template.ParseFS(embFS, "data/base.tmpl", "data/error.tmpl")
if err != nil {
return data, err
}
// emb.tmpl
data.EmbeddedPage, err = template.ParseFiles(
filepath.Join(webDir, "emb.tmpl"),
)
data.EmbeddedPage, err = template.ParseFS(embFS, "data/emb.tmpl")
if err != nil {
return data, err
}
// emb_help.tmpl
data.EmbeddedHelpPage, err = template.ParseFiles(
filepath.Join(webDir, "base.tmpl"),
filepath.Join(webDir, "emb_help.tmpl"),
)
data.EmbeddedHelpPage, err = template.ParseFS(embFS, "data/base.tmpl", "data/emb_help.tmpl")
if err != nil {
return data, err
}

@ -23,21 +23,21 @@ import (
"errors"
"fmt"
"html/template"
"io/ioutil"
"net/http"
"path/filepath"
"strconv"
"strings"
"embed"
)
type Locale map[string]string
type Locales map[string]*Locale
func loadLocales(localeDir string) (Locales, error) {
func loadLocales(f embed.FS, localeDir string) (Locales, error) {
locales := make(Locales)
// Get locale files list
files, err := ioutil.ReadDir(localeDir)
files, err := f.ReadDir(localeDir)
if err != nil {
return locales, err
}
@ -56,7 +56,7 @@ func loadLocales(localeDir string) (Locales, error) {
// Read file
filePath := filepath.Join(localeDir, fileName)
fileByte, err := readFile(filePath)
fileByte, err := f.ReadFile(filePath)
if err != nil {
return locales, err
}

Loading…
Cancel
Save