From 130116092113e17f76fdec327c2e7f3fa3bface0 Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Fri, 9 Aug 2019 11:15:36 -0700 Subject: [PATCH 1/7] fix tar bombs this changes the release targets in the Makefile to use a subdirectory of the format BINARYNAME_GITREV so extracting the archive results in a single directory. --- Makefile | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/Makefile b/Makefile index c88ac79..66fb4c5 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ GOBUILD=$(GOCMD) build $(LDFLAGS) GOTEST=$(GOCMD) test $(LDFLAGS) GOGET=$(GOCMD) get BINARY_NAME=writefreely +TAR_NAME=$(BINARY_NAME)_$(GITREV) DOCKERCMD=docker IMAGE_NAME=writeas/writefreely TMPBIN=./tmp @@ -69,39 +70,40 @@ install : build cd less/; $(MAKE) install $(MFLAGS) release : clean ui assets - mkdir build - cp -r templates build - cp -r pages build - cp -r static build - mkdir build/keys + mkdir -p build/$(TAR_NAME) + cp -r templates build/$(TAR_NAME) + cp -r pages build/$(TAR_NAME) + cp -r static build/$(TAR_NAME) + mkdir build/$(TAR_NAME)/keys $(MAKE) build-linux - mv build/$(BINARY_NAME)-linux-amd64 build/$(BINARY_NAME) - cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz * - rm build/$(BINARY_NAME) + mv build/$(BINARY_NAME)-linux-amd64 build/$(TAR_NAME)/$(BINARY_NAME) + tar -cvzf $(TAR_NAME)_linux_amd64.tar.gz -C build $(TAR_NAME) + rm build/$(TAR_NAME)/$(BINARY_NAME) $(MAKE) build-arm7 - mv build/$(BINARY_NAME)-linux-arm-7 build/$(BINARY_NAME) - cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_arm7.tar.gz * - rm build/$(BINARY_NAME) + mv build/$(BINARY_NAME)-linux-arm-7 build/$(TAR_NAME)/$(BINARY_NAME) + tar -cvzf $(TAR_NAME)_linux_arm7.tar.gz -C build $(TAR_NAME) + rm build/$(TAR_NAME)/$(BINARY_NAME) $(MAKE) build-darwin - mv build/$(BINARY_NAME)-darwin-10.6-amd64 build/$(BINARY_NAME) - cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_macos_amd64.tar.gz * - rm build/$(BINARY_NAME) + mv build/$(BINARY_NAME)-darwin-10.6-amd64 build/$(TAR_NAME)/$(BINARY_NAME) + tar -cvzf $(TAR_NAME)_macos_amd64.tar.gz -C build $(TAR_NAME) + rm build/$(TAR_NAME)/$(BINARY_NAME) $(MAKE) build-windows - mv build/$(BINARY_NAME)-windows-4.0-amd64.exe build/$(BINARY_NAME).exe - cd build; zip -r ../$(BINARY_NAME)_$(GITREV)_windows_amd64.zip ./* + mv build/$(BINARY_NAME)-windows-4.0-amd64.exe build/$(TAR_NAME)/$(BINARY_NAME).exe + cd build; zip -r ../$(TAR_NAME)_windows_amd64.zip ./$(TAR_NAME) + rm build/$(TAR_NAME)/$(BINARY_NAME) $(MAKE) build-docker $(MAKE) release-docker # This assumes you're on linux/amd64 release-linux : clean ui - mkdir build - cp -r templates build - cp -r pages build - cp -r static build - mkdir build/keys + mkdir -p build/$(TAR_NAME) + cp -r templates build/$(TAR_NAME) + cp -r pages build/$(TAR_NAME) + cp -r static build/$(TAR_NAME) + mkdir build/$(TAR_NAME)/keys $(MAKE) build-no-sqlite - mv cmd/writefreely/$(BINARY_NAME) build/$(BINARY_NAME) - cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz * + mv cmd/writefreely/$(BINARY_NAME) build/$(TAR_NAME)/$(BINARY_NAME) + tar -cvzf $(TAR_NAME)_linux_amd64.tar.gz -C build $(TAR_NAME) release-docker : $(DOCKERCMD) push $(IMAGE_NAME) From 7a53af355e57f0730891ac3782e17e35629f95b9 Mon Sep 17 00:00:00 2001 From: Daniel Watkins Date: Sat, 10 Aug 2019 12:02:38 -0400 Subject: [PATCH 2/7] Emit the server software and version to the log on startup --- app.go | 7 ++++++- cmd/writefreely/main.go | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app.go b/app.go index dec0ef2..c52f59d 100644 --- a/app.go +++ b/app.go @@ -486,9 +486,14 @@ func ConnectToDatabase(app *App) error { return nil } +// FormatVersion constructs the version string for the application +func FormatVersion() string { + return serverSoftware + " " + softwareVer +} + // OutputVersion prints out the version of the application. func OutputVersion() { - fmt.Println(serverSoftware + " " + softwareVer) + fmt.Println(FormatVersion()) } // NewApp creates a new app instance. diff --git a/cmd/writefreely/main.go b/cmd/writefreely/main.go index 10cd7d6..48993c7 100644 --- a/cmd/writefreely/main.go +++ b/cmd/writefreely/main.go @@ -113,6 +113,7 @@ func main() { // Initialize the application var err error + log.Info("Starting %s...", writefreely.FormatVersion()) app, err = writefreely.Initialize(app, *debugPtr) if err != nil { log.Error("%s", err) From ca957c4b6d59a1d32eae911ba30571d064d53b61 Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Mon, 12 Aug 2019 12:35:17 -0700 Subject: [PATCH 3/7] fix missing collection hostname GetCollections and GetPublishableCollections now take a hostname parameter to allow setting the collecion hostname. All collections used in memory now have their hostname set. --- account.go | 21 +++++++++++---------- admin.go | 11 ++++++----- collections.go | 6 ++++-- database.go | 11 ++++++----- export.go | 2 +- go.mod | 2 +- pad.go | 7 ++++--- postrender.go | 12 +++++++----- 8 files changed, 40 insertions(+), 32 deletions(-) diff --git a/account.go b/account.go index 1cf259b..c69e2fe 100644 --- a/account.go +++ b/account.go @@ -13,6 +13,13 @@ package writefreely import ( "encoding/json" "fmt" + "html/template" + "net/http" + "regexp" + "strings" + "sync" + "time" + "github.com/gorilla/mux" "github.com/gorilla/sessions" "github.com/guregu/null/zero" @@ -22,12 +29,6 @@ import ( "github.com/writeas/web-core/log" "github.com/writeas/writefreely/author" "github.com/writeas/writefreely/page" - "html/template" - "net/http" - "regexp" - "strings" - "sync" - "time" ) type ( @@ -546,7 +547,7 @@ func getVerboseAuthUser(app *App, token string, u *User, verbose bool) *AuthUser if err != nil { log.Error("Login: Unable to get user posts: %v", err) } - colls, err := app.db.GetCollections(u) + colls, err := app.db.GetCollections(u, app.cfg.App.Host) if err != nil { log.Error("Login: Unable to get user collections: %v", err) } @@ -716,7 +717,7 @@ func viewMyCollectionsAPI(app *App, u *User, w http.ResponseWriter, r *http.Requ return ErrBadRequestedType } - p, err := app.db.GetCollections(u) + p, err := app.db.GetCollections(u, app.cfg.App.Host) if err != nil { return err } @@ -739,7 +740,7 @@ func viewArticles(app *App, u *User, w http.ResponseWriter, r *http.Request) err log.Error("unable to fetch flashes: %v", err) } - c, err := app.db.GetPublishableCollections(u) + c, err := app.db.GetPublishableCollections(u, app.cfg.App.Host) if err != nil { log.Error("unable to fetch collections: %v", err) } @@ -762,7 +763,7 @@ func viewArticles(app *App, u *User, w http.ResponseWriter, r *http.Request) err } func viewCollections(app *App, u *User, w http.ResponseWriter, r *http.Request) error { - c, err := app.db.GetCollections(u) + c, err := app.db.GetCollections(u, app.cfg.App.Host) if err != nil { log.Error("unable to fetch collections: %v", err) return fmt.Errorf("No collections") diff --git a/admin.go b/admin.go index fe19ad5..a27a068 100644 --- a/admin.go +++ b/admin.go @@ -13,16 +13,17 @@ package writefreely import ( "database/sql" "fmt" + "net/http" + "runtime" + "strconv" + "time" + "github.com/gogits/gogs/pkg/tool" "github.com/gorilla/mux" "github.com/writeas/impart" "github.com/writeas/web-core/auth" "github.com/writeas/web-core/log" "github.com/writeas/writefreely/config" - "net/http" - "runtime" - "strconv" - "time" ) var ( @@ -195,7 +196,7 @@ func handleViewAdminUser(app *App, u *User, w http.ResponseWriter, r *http.Reque p.LastPost = lp.Format("January 2, 2006, 3:04 PM") } - colls, err := app.db.GetCollections(p.User) + colls, err := app.db.GetCollections(p.User, app.cfg.App.Host) if err != nil { return impart.HTTPError{http.StatusInternalServerError, fmt.Sprintf("Could not get user's collections: %v", err)} } diff --git a/collections.go b/collections.go index aee74f7..997d4d7 100644 --- a/collections.go +++ b/collections.go @@ -724,6 +724,8 @@ func handleViewCollection(app *App, w http.ResponseWriter, r *http.Request) erro return err } + c.hostName = app.cfg.App.Host + // Serve ActivityStreams data now, if requested if strings.Contains(r.Header.Get("Accept"), "application/activity+json") { ac := c.PersonObject() @@ -762,7 +764,7 @@ func handleViewCollection(app *App, w http.ResponseWriter, r *http.Request) erro owner = u displayPage.CanPin = true - pubColls, err := app.db.GetPublishableCollections(owner) + pubColls, err := app.db.GetPublishableCollections(owner, app.cfg.App.Host) if err != nil { log.Error("unable to fetch collections: %v", err) } @@ -859,7 +861,7 @@ func handleViewCollectionTag(app *App, w http.ResponseWriter, r *http.Request) e owner = u displayPage.CanPin = true - pubColls, err := app.db.GetPublishableCollections(owner) + pubColls, err := app.db.GetPublishableCollections(owner, app.cfg.App.Host) if err != nil { log.Error("unable to fetch collections: %v", err) } diff --git a/database.go b/database.go index 34c5234..c980225 100644 --- a/database.go +++ b/database.go @@ -65,8 +65,8 @@ type writestore interface { ChangeSettings(app *App, u *User, s *userSettings) error ChangePassphrase(userID int64, sudo bool, curPass string, hashedPass []byte) error - GetCollections(u *User) (*[]Collection, error) - GetPublishableCollections(u *User) (*[]Collection, error) + GetCollections(u *User, hostName string) (*[]Collection, error) + GetPublishableCollections(u *User, hostName string) (*[]Collection, error) GetMeStats(u *User) userMeStats GetTotalCollections() (int64, error) GetTotalPosts() (int64, error) @@ -1559,7 +1559,7 @@ func (db *datastore) GetPinnedPosts(coll *CollectionObj) (*[]PublicPost, error) return &posts, nil } -func (db *datastore) GetCollections(u *User) (*[]Collection, error) { +func (db *datastore) GetCollections(u *User, hostName string) (*[]Collection, error) { rows, err := db.Query("SELECT id, alias, title, description, privacy, view_count FROM collections WHERE owner_id = ? ORDER BY id ASC", u.ID) if err != nil { log.Error("Failed selecting from collections: %v", err) @@ -1575,6 +1575,7 @@ func (db *datastore) GetCollections(u *User) (*[]Collection, error) { log.Error("Failed scanning row: %v", err) break } + c.hostName = hostName c.URL = c.CanonicalURL() c.Public = c.IsPublic() @@ -1588,8 +1589,8 @@ func (db *datastore) GetCollections(u *User) (*[]Collection, error) { return &colls, nil } -func (db *datastore) GetPublishableCollections(u *User) (*[]Collection, error) { - c, err := db.GetCollections(u) +func (db *datastore) GetPublishableCollections(u *User, hostName string) (*[]Collection, error) { + c, err := db.GetCollections(u, hostName) if err != nil { return nil, err } diff --git a/export.go b/export.go index 47a2603..86855e2 100644 --- a/export.go +++ b/export.go @@ -104,7 +104,7 @@ func compileFullExport(app *App, u *User) *ExportUser { User: u, } - colls, err := app.db.GetCollections(u) + colls, err := app.db.GetCollections(u, app.cfg.App.Host) if err != nil { log.Error("unable to fetch collections: %v", err) } diff --git a/go.mod b/go.mod index cc5fc57..5e040ba 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/writeas/slug v1.2.0 github.com/writeas/web-core v1.0.0 github.com/writefreely/go-nodeinfo v1.2.0 - golang.org/x/crypto v0.0.0-20190208162236-193df9c0f06f // indirect + golang.org/x/crypto v0.0.0-20190208162236-193df9c0f06f golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1 // indirect golang.org/x/net v0.0.0-20190206173232-65e2d4e15006 // indirect golang.org/x/sys v0.0.0-20190209173611-3b5209105503 // indirect diff --git a/pad.go b/pad.go index 1545b4f..b806615 100644 --- a/pad.go +++ b/pad.go @@ -11,12 +11,13 @@ package writefreely import ( + "net/http" + "strings" + "github.com/gorilla/mux" "github.com/writeas/impart" "github.com/writeas/web-core/log" "github.com/writeas/writefreely/page" - "net/http" - "strings" ) func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error { @@ -47,7 +48,7 @@ func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error { } var err error if appData.User != nil { - appData.Blogs, err = app.db.GetPublishableCollections(appData.User) + appData.Blogs, err = app.db.GetPublishableCollections(appData.User, app.cfg.App.Host) if err != nil { log.Error("Unable to get user's blogs for Pad: %v", err) } diff --git a/postrender.go b/postrender.go index af715be..93c2089 100644 --- a/postrender.go +++ b/postrender.go @@ -12,17 +12,18 @@ package writefreely import ( "fmt" - "github.com/microcosm-cc/bluemonday" - stripmd "github.com/writeas/go-strip-markdown" - "github.com/writeas/saturday" - "github.com/writeas/web-core/stringmanip" - "github.com/writeas/writefreely/parse" "html" "html/template" "regexp" "strings" "unicode" "unicode/utf8" + + "github.com/microcosm-cc/bluemonday" + stripmd "github.com/writeas/go-strip-markdown" + blackfriday "github.com/writeas/saturday" + "github.com/writeas/web-core/stringmanip" + "github.com/writeas/writefreely/parse" ) var ( @@ -36,6 +37,7 @@ var ( func (p *Post) formatContent(c *Collection, isOwner bool) { baseURL := c.CanonicalURL() + // TODO: redundant if !isSingleUser { baseURL = "/" + c.Alias + "/" } From 1d80e47e074a32d480e4fe65f59f08d27b437f0d Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Mon, 12 Aug 2019 13:51:29 -0700 Subject: [PATCH 4/7] change subdirectory to writefreely instead of writefreely_versionstring --- Makefile | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 66fb4c5..c85cf6f 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ GOBUILD=$(GOCMD) build $(LDFLAGS) GOTEST=$(GOCMD) test $(LDFLAGS) GOGET=$(GOCMD) get BINARY_NAME=writefreely -TAR_NAME=$(BINARY_NAME)_$(GITREV) +BUILDPATH=build/$(BINARY_NAME) DOCKERCMD=docker IMAGE_NAME=writeas/writefreely TMPBIN=./tmp @@ -70,40 +70,40 @@ install : build cd less/; $(MAKE) install $(MFLAGS) release : clean ui assets - mkdir -p build/$(TAR_NAME) - cp -r templates build/$(TAR_NAME) - cp -r pages build/$(TAR_NAME) - cp -r static build/$(TAR_NAME) - mkdir build/$(TAR_NAME)/keys + mkdir -p $(BUILDPATH) + cp -r templates $(BUILDPATH) + cp -r pages $(BUILDPATH) + cp -r static $(BUILDPATH) + mkdir $(BUILDPATH)/keys $(MAKE) build-linux - mv build/$(BINARY_NAME)-linux-amd64 build/$(TAR_NAME)/$(BINARY_NAME) - tar -cvzf $(TAR_NAME)_linux_amd64.tar.gz -C build $(TAR_NAME) - rm build/$(TAR_NAME)/$(BINARY_NAME) + mv build/$(BINARY_NAME)-linux-amd64 $(BUILDPATH)/$(BINARY_NAME) + tar -cvzf $(BINARY_NAME)_$(GIT_REV)_linux_amd64.tar.gz -C build $(BINARY_NAME) + rm $(BUILDPATH)/$(BINARY_NAME) $(MAKE) build-arm7 - mv build/$(BINARY_NAME)-linux-arm-7 build/$(TAR_NAME)/$(BINARY_NAME) - tar -cvzf $(TAR_NAME)_linux_arm7.tar.gz -C build $(TAR_NAME) - rm build/$(TAR_NAME)/$(BINARY_NAME) + mv build/$(BINARY_NAME)-linux-arm-7 $(BUILDPATH)/$(BINARY_NAME) + tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_arm7.tar.gz -C build $(BINARY_NAME) + rm $(BUILDPATH)/$(BINARY_NAME) $(MAKE) build-darwin - mv build/$(BINARY_NAME)-darwin-10.6-amd64 build/$(TAR_NAME)/$(BINARY_NAME) - tar -cvzf $(TAR_NAME)_macos_amd64.tar.gz -C build $(TAR_NAME) - rm build/$(TAR_NAME)/$(BINARY_NAME) + mv build/$(BINARY_NAME)-darwin-10.6-amd64 $(BUILDPATH)/$(BINARY_NAME) + tar -cvzf $(BINARY_NAME)_$(GITREV)_macos_amd64.tar.gz -C build $(BINARY_NAME) + rm $(BUILDPATH)/$(BINARY_NAME) $(MAKE) build-windows - mv build/$(BINARY_NAME)-windows-4.0-amd64.exe build/$(TAR_NAME)/$(BINARY_NAME).exe - cd build; zip -r ../$(TAR_NAME)_windows_amd64.zip ./$(TAR_NAME) - rm build/$(TAR_NAME)/$(BINARY_NAME) + mv build/$(BINARY_NAME)-windows-4.0-amd64.exe $(BUILDPATH)/$(BINARY_NAME).exe + cd build; zip -r ../$(BINARY_NAME)_$(GITREV)_windows_amd64.zip ./$(BINARY_NAME) + rm $(BUILDPATH)/$(BINARY_NAME) $(MAKE) build-docker $(MAKE) release-docker # This assumes you're on linux/amd64 -release-linux : clean ui - mkdir -p build/$(TAR_NAME) - cp -r templates build/$(TAR_NAME) - cp -r pages build/$(TAR_NAME) - cp -r static build/$(TAR_NAME) - mkdir build/$(TAR_NAME)/keys +release-linux : clean + mkdir -p $(BUILDPATH) + cp -r templates $(BUILDPATH) + cp -r pages $(BUILDPATH) + cp -r static $(BUILDPATH) + mkdir $(BUILDPATH)/keys $(MAKE) build-no-sqlite - mv cmd/writefreely/$(BINARY_NAME) build/$(TAR_NAME)/$(BINARY_NAME) - tar -cvzf $(TAR_NAME)_linux_amd64.tar.gz -C build $(TAR_NAME) + mv cmd/writefreely/$(BINARY_NAME) $(BUILDPATH)/$(BINARY_NAME) + tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz -C build $(BINARY_NAME) release-docker : $(DOCKERCMD) push $(IMAGE_NAME) From 42a22193355b6cbcf9e7d31bc93f52f63916721c Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Thu, 22 Aug 2019 10:48:58 -0700 Subject: [PATCH 5/7] add ui back to target release linux --- Makefile | 2 +- go.mod | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c85cf6f..f1a99b8 100644 --- a/Makefile +++ b/Makefile @@ -95,7 +95,7 @@ release : clean ui assets $(MAKE) release-docker # This assumes you're on linux/amd64 -release-linux : clean +release-linux : clean ui mkdir -p $(BUILDPATH) cp -r templates $(BUILDPATH) cp -r pages $(BUILDPATH) diff --git a/go.mod b/go.mod index cc5fc57..5e040ba 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/writeas/slug v1.2.0 github.com/writeas/web-core v1.0.0 github.com/writefreely/go-nodeinfo v1.2.0 - golang.org/x/crypto v0.0.0-20190208162236-193df9c0f06f // indirect + golang.org/x/crypto v0.0.0-20190208162236-193df9c0f06f golang.org/x/lint v0.0.0-20181217174547-8f45f776aaf1 // indirect golang.org/x/net v0.0.0-20190206173232-65e2d4e15006 // indirect golang.org/x/sys v0.0.0-20190209173611-3b5209105503 // indirect From 6e9000659c4a93e40034773f8b2b4f02c3962359 Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Thu, 22 Aug 2019 12:16:37 -0700 Subject: [PATCH 6/7] fix typo in Makefile GITREV release target --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f1a99b8..757bcfd 100644 --- a/Makefile +++ b/Makefile @@ -77,7 +77,7 @@ release : clean ui assets mkdir $(BUILDPATH)/keys $(MAKE) build-linux mv build/$(BINARY_NAME)-linux-amd64 $(BUILDPATH)/$(BINARY_NAME) - tar -cvzf $(BINARY_NAME)_$(GIT_REV)_linux_amd64.tar.gz -C build $(BINARY_NAME) + tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz -C build $(BINARY_NAME) rm $(BUILDPATH)/$(BINARY_NAME) $(MAKE) build-arm7 mv build/$(BINARY_NAME)-linux-arm-7 $(BUILDPATH)/$(BINARY_NAME) From 6396749f314bee72f351525696a9afd3411d6690 Mon Sep 17 00:00:00 2001 From: Rob Loranger Date: Fri, 6 Sep 2019 19:49:15 -0700 Subject: [PATCH 7/7] default pad tempate on all pad renders this fixes a bug where if the `editor` config is set to an unsupported value there is a nil pointer error and the pad fails to render when editing only, not on a new post. --- pad.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/pad.go b/pad.go index 1545b4f..3857e38 100644 --- a/pad.go +++ b/pad.go @@ -11,12 +11,13 @@ package writefreely import ( + "net/http" + "strings" + "github.com/gorilla/mux" "github.com/writeas/impart" "github.com/writeas/web-core/log" "github.com/writeas/writefreely/page" - "net/http" - "strings" ) func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error { @@ -54,16 +55,13 @@ func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error { } padTmpl := app.cfg.App.Editor - if padTmpl == "" { + if templates[padTmpl] == nil { + log.Info("No template '%s' found. Falling back to default 'pad' template.", padTmpl) padTmpl = "pad" } if action == "" && slug == "" { // Not editing any post; simply render the Pad - if templates[padTmpl] == nil { - log.Info("No template '%s' found. Falling back to default 'pad' template.", padTmpl) - padTmpl = "pad" - } if err = templates[padTmpl].ExecuteTemplate(w, "pad", appData); err != nil { log.Error("Unable to execute template: %v", err) }