Merge branch 'develop' into chorus
This commit is contained in:
commit
ca388d6536
48
Makefile
48
Makefile
|
@ -7,6 +7,7 @@ GOBUILD=$(GOCMD) build $(LDFLAGS)
|
||||||
GOTEST=$(GOCMD) test $(LDFLAGS)
|
GOTEST=$(GOCMD) test $(LDFLAGS)
|
||||||
GOGET=$(GOCMD) get
|
GOGET=$(GOCMD) get
|
||||||
BINARY_NAME=writefreely
|
BINARY_NAME=writefreely
|
||||||
|
BUILDPATH=build/$(BINARY_NAME)
|
||||||
DOCKERCMD=docker
|
DOCKERCMD=docker
|
||||||
IMAGE_NAME=writeas/writefreely
|
IMAGE_NAME=writeas/writefreely
|
||||||
TMPBIN=./tmp
|
TMPBIN=./tmp
|
||||||
|
@ -69,39 +70,40 @@ install : build
|
||||||
cd less/; $(MAKE) install $(MFLAGS)
|
cd less/; $(MAKE) install $(MFLAGS)
|
||||||
|
|
||||||
release : clean ui assets
|
release : clean ui assets
|
||||||
mkdir build
|
mkdir -p $(BUILDPATH)
|
||||||
cp -r templates build
|
cp -r templates $(BUILDPATH)
|
||||||
cp -r pages build
|
cp -r pages $(BUILDPATH)
|
||||||
cp -r static build
|
cp -r static $(BUILDPATH)
|
||||||
mkdir build/keys
|
mkdir $(BUILDPATH)/keys
|
||||||
$(MAKE) build-linux
|
$(MAKE) build-linux
|
||||||
mv build/$(BINARY_NAME)-linux-amd64 build/$(BINARY_NAME)
|
mv build/$(BINARY_NAME)-linux-amd64 $(BUILDPATH)/$(BINARY_NAME)
|
||||||
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz *
|
tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz -C build $(BINARY_NAME)
|
||||||
rm build/$(BINARY_NAME)
|
rm $(BUILDPATH)/$(BINARY_NAME)
|
||||||
$(MAKE) build-arm7
|
$(MAKE) build-arm7
|
||||||
mv build/$(BINARY_NAME)-linux-arm-7 build/$(BINARY_NAME)
|
mv build/$(BINARY_NAME)-linux-arm-7 $(BUILDPATH)/$(BINARY_NAME)
|
||||||
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_arm7.tar.gz *
|
tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_arm7.tar.gz -C build $(BINARY_NAME)
|
||||||
rm build/$(BINARY_NAME)
|
rm $(BUILDPATH)/$(BINARY_NAME)
|
||||||
$(MAKE) build-darwin
|
$(MAKE) build-darwin
|
||||||
mv build/$(BINARY_NAME)-darwin-10.6-amd64 build/$(BINARY_NAME)
|
mv build/$(BINARY_NAME)-darwin-10.6-amd64 $(BUILDPATH)/$(BINARY_NAME)
|
||||||
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_macos_amd64.tar.gz *
|
tar -cvzf $(BINARY_NAME)_$(GITREV)_macos_amd64.tar.gz -C build $(BINARY_NAME)
|
||||||
rm build/$(BINARY_NAME)
|
rm $(BUILDPATH)/$(BINARY_NAME)
|
||||||
$(MAKE) build-windows
|
$(MAKE) build-windows
|
||||||
mv build/$(BINARY_NAME)-windows-4.0-amd64.exe build/$(BINARY_NAME).exe
|
mv build/$(BINARY_NAME)-windows-4.0-amd64.exe $(BUILDPATH)/$(BINARY_NAME).exe
|
||||||
cd build; zip -r ../$(BINARY_NAME)_$(GITREV)_windows_amd64.zip ./*
|
cd build; zip -r ../$(BINARY_NAME)_$(GITREV)_windows_amd64.zip ./$(BINARY_NAME)
|
||||||
|
rm $(BUILDPATH)/$(BINARY_NAME)
|
||||||
$(MAKE) build-docker
|
$(MAKE) build-docker
|
||||||
$(MAKE) release-docker
|
$(MAKE) release-docker
|
||||||
|
|
||||||
# This assumes you're on linux/amd64
|
# This assumes you're on linux/amd64
|
||||||
release-linux : clean ui
|
release-linux : clean ui
|
||||||
mkdir build
|
mkdir -p $(BUILDPATH)
|
||||||
cp -r templates build
|
cp -r templates $(BUILDPATH)
|
||||||
cp -r pages build
|
cp -r pages $(BUILDPATH)
|
||||||
cp -r static build
|
cp -r static $(BUILDPATH)
|
||||||
mkdir build/keys
|
mkdir $(BUILDPATH)/keys
|
||||||
$(MAKE) build-no-sqlite
|
$(MAKE) build-no-sqlite
|
||||||
mv cmd/writefreely/$(BINARY_NAME) build/$(BINARY_NAME)
|
mv cmd/writefreely/$(BINARY_NAME) $(BUILDPATH)/$(BINARY_NAME)
|
||||||
cd build; tar -cvzf ../$(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz *
|
tar -cvzf $(BINARY_NAME)_$(GITREV)_linux_amd64.tar.gz -C build $(BINARY_NAME)
|
||||||
|
|
||||||
release-docker :
|
release-docker :
|
||||||
$(DOCKERCMD) push $(IMAGE_NAME)
|
$(DOCKERCMD) push $(IMAGE_NAME)
|
||||||
|
|
21
account.go
21
account.go
|
@ -13,6 +13,13 @@ package writefreely
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/gorilla/sessions"
|
"github.com/gorilla/sessions"
|
||||||
"github.com/guregu/null/zero"
|
"github.com/guregu/null/zero"
|
||||||
|
@ -23,12 +30,6 @@ import (
|
||||||
"github.com/writeas/writefreely/author"
|
"github.com/writeas/writefreely/author"
|
||||||
"github.com/writeas/writefreely/config"
|
"github.com/writeas/writefreely/config"
|
||||||
"github.com/writeas/writefreely/page"
|
"github.com/writeas/writefreely/page"
|
||||||
"html/template"
|
|
||||||
"net/http"
|
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
@ -551,7 +552,7 @@ func getVerboseAuthUser(app *App, token string, u *User, verbose bool) *AuthUser
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("Login: Unable to get user posts: %v", err)
|
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 {
|
if err != nil {
|
||||||
log.Error("Login: Unable to get user collections: %v", err)
|
log.Error("Login: Unable to get user collections: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -721,7 +722,7 @@ func viewMyCollectionsAPI(app *App, u *User, w http.ResponseWriter, r *http.Requ
|
||||||
return ErrBadRequestedType
|
return ErrBadRequestedType
|
||||||
}
|
}
|
||||||
|
|
||||||
p, err := app.db.GetCollections(u)
|
p, err := app.db.GetCollections(u, app.cfg.App.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -744,7 +745,7 @@ func viewArticles(app *App, u *User, w http.ResponseWriter, r *http.Request) err
|
||||||
log.Error("unable to fetch flashes: %v", 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 {
|
if err != nil {
|
||||||
log.Error("unable to fetch collections: %v", err)
|
log.Error("unable to fetch collections: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -767,7 +768,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 {
|
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 {
|
if err != nil {
|
||||||
log.Error("unable to fetch collections: %v", err)
|
log.Error("unable to fetch collections: %v", err)
|
||||||
return fmt.Errorf("No collections")
|
return fmt.Errorf("No collections")
|
||||||
|
|
11
admin.go
11
admin.go
|
@ -13,16 +13,17 @@ package writefreely
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"runtime"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gogits/gogs/pkg/tool"
|
"github.com/gogits/gogs/pkg/tool"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/writeas/impart"
|
"github.com/writeas/impart"
|
||||||
"github.com/writeas/web-core/auth"
|
"github.com/writeas/web-core/auth"
|
||||||
"github.com/writeas/web-core/log"
|
"github.com/writeas/web-core/log"
|
||||||
"github.com/writeas/writefreely/config"
|
"github.com/writeas/writefreely/config"
|
||||||
"net/http"
|
|
||||||
"runtime"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
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")
|
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 {
|
if err != nil {
|
||||||
return impart.HTTPError{http.StatusInternalServerError, fmt.Sprintf("Could not get user's collections: %v", err)}
|
return impart.HTTPError{http.StatusInternalServerError, fmt.Sprintf("Could not get user's collections: %v", err)}
|
||||||
}
|
}
|
||||||
|
|
7
app.go
7
app.go
|
@ -503,9 +503,14 @@ func ConnectToDatabase(app *App) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FormatVersion constructs the version string for the application
|
||||||
|
func FormatVersion() string {
|
||||||
|
return serverSoftware + " " + softwareVer
|
||||||
|
}
|
||||||
|
|
||||||
// OutputVersion prints out the version of the application.
|
// OutputVersion prints out the version of the application.
|
||||||
func OutputVersion() {
|
func OutputVersion() {
|
||||||
fmt.Println(serverSoftware + " " + softwareVer)
|
fmt.Println(FormatVersion())
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewApp creates a new app instance.
|
// NewApp creates a new app instance.
|
||||||
|
|
|
@ -113,6 +113,7 @@ func main() {
|
||||||
|
|
||||||
// Initialize the application
|
// Initialize the application
|
||||||
var err error
|
var err error
|
||||||
|
log.Info("Starting %s...", writefreely.FormatVersion())
|
||||||
app, err = writefreely.Initialize(app, *debugPtr)
|
app, err = writefreely.Initialize(app, *debugPtr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("%s", err)
|
log.Error("%s", err)
|
||||||
|
|
|
@ -726,6 +726,8 @@ func handleViewCollection(app *App, w http.ResponseWriter, r *http.Request) erro
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.hostName = app.cfg.App.Host
|
||||||
|
|
||||||
// Serve ActivityStreams data now, if requested
|
// Serve ActivityStreams data now, if requested
|
||||||
if strings.Contains(r.Header.Get("Accept"), "application/activity+json") {
|
if strings.Contains(r.Header.Get("Accept"), "application/activity+json") {
|
||||||
ac := c.PersonObject()
|
ac := c.PersonObject()
|
||||||
|
@ -766,7 +768,7 @@ func handleViewCollection(app *App, w http.ResponseWriter, r *http.Request) erro
|
||||||
owner = u
|
owner = u
|
||||||
displayPage.CanPin = true
|
displayPage.CanPin = true
|
||||||
|
|
||||||
pubColls, err := app.db.GetPublishableCollections(owner)
|
pubColls, err := app.db.GetPublishableCollections(owner, app.cfg.App.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("unable to fetch collections: %v", err)
|
log.Error("unable to fetch collections: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -867,7 +869,7 @@ func handleViewCollectionTag(app *App, w http.ResponseWriter, r *http.Request) e
|
||||||
owner = u
|
owner = u
|
||||||
displayPage.CanPin = true
|
displayPage.CanPin = true
|
||||||
|
|
||||||
pubColls, err := app.db.GetPublishableCollections(owner)
|
pubColls, err := app.db.GetPublishableCollections(owner, app.cfg.App.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("unable to fetch collections: %v", err)
|
log.Error("unable to fetch collections: %v", err)
|
||||||
}
|
}
|
||||||
|
|
11
database.go
11
database.go
|
@ -65,8 +65,8 @@ type writestore interface {
|
||||||
ChangeSettings(app *App, u *User, s *userSettings) error
|
ChangeSettings(app *App, u *User, s *userSettings) error
|
||||||
ChangePassphrase(userID int64, sudo bool, curPass string, hashedPass []byte) error
|
ChangePassphrase(userID int64, sudo bool, curPass string, hashedPass []byte) error
|
||||||
|
|
||||||
GetCollections(u *User) (*[]Collection, error)
|
GetCollections(u *User, hostName string) (*[]Collection, error)
|
||||||
GetPublishableCollections(u *User) (*[]Collection, error)
|
GetPublishableCollections(u *User, hostName string) (*[]Collection, error)
|
||||||
GetMeStats(u *User) userMeStats
|
GetMeStats(u *User) userMeStats
|
||||||
GetTotalCollections() (int64, error)
|
GetTotalCollections() (int64, error)
|
||||||
GetTotalPosts() (int64, error)
|
GetTotalPosts() (int64, error)
|
||||||
|
@ -1559,7 +1559,7 @@ func (db *datastore) GetPinnedPosts(coll *CollectionObj) (*[]PublicPost, error)
|
||||||
return &posts, nil
|
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)
|
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 {
|
if err != nil {
|
||||||
log.Error("Failed selecting from collections: %v", err)
|
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)
|
log.Error("Failed scanning row: %v", err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
c.hostName = hostName
|
||||||
c.URL = c.CanonicalURL()
|
c.URL = c.CanonicalURL()
|
||||||
c.Public = c.IsPublic()
|
c.Public = c.IsPublic()
|
||||||
|
|
||||||
|
@ -1588,8 +1589,8 @@ func (db *datastore) GetCollections(u *User) (*[]Collection, error) {
|
||||||
return &colls, nil
|
return &colls, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (db *datastore) GetPublishableCollections(u *User) (*[]Collection, error) {
|
func (db *datastore) GetPublishableCollections(u *User, hostName string) (*[]Collection, error) {
|
||||||
c, err := db.GetCollections(u)
|
c, err := db.GetCollections(u, hostName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ func compileFullExport(app *App, u *User) *ExportUser {
|
||||||
User: u,
|
User: u,
|
||||||
}
|
}
|
||||||
|
|
||||||
colls, err := app.db.GetCollections(u)
|
colls, err := app.db.GetCollections(u, app.cfg.App.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("unable to fetch collections: %v", err)
|
log.Error("unable to fetch collections: %v", err)
|
||||||
}
|
}
|
||||||
|
|
14
pad.go
14
pad.go
|
@ -11,12 +11,13 @@
|
||||||
package writefreely
|
package writefreely
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
"github.com/writeas/impart"
|
"github.com/writeas/impart"
|
||||||
"github.com/writeas/web-core/log"
|
"github.com/writeas/web-core/log"
|
||||||
"github.com/writeas/writefreely/page"
|
"github.com/writeas/writefreely/page"
|
||||||
"net/http"
|
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error {
|
func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error {
|
||||||
|
@ -47,23 +48,20 @@ func handleViewPad(app *App, w http.ResponseWriter, r *http.Request) error {
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
if appData.User != nil {
|
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 {
|
if err != nil {
|
||||||
log.Error("Unable to get user's blogs for Pad: %v", err)
|
log.Error("Unable to get user's blogs for Pad: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
padTmpl := app.cfg.App.Editor
|
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"
|
padTmpl = "pad"
|
||||||
}
|
}
|
||||||
|
|
||||||
if action == "" && slug == "" {
|
if action == "" && slug == "" {
|
||||||
// Not editing any post; simply render the Pad
|
// 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 {
|
if err = templates[padTmpl].ExecuteTemplate(w, "pad", appData); err != nil {
|
||||||
log.Error("Unable to execute template: %v", err)
|
log.Error("Unable to execute template: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,18 +12,19 @@ package writefreely
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"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/config"
|
|
||||||
"github.com/writeas/writefreely/parse"
|
|
||||||
"html"
|
"html"
|
||||||
"html/template"
|
"html/template"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
"unicode/utf8"
|
"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/config"
|
||||||
|
"github.com/writeas/writefreely/parse"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -37,6 +38,7 @@ var (
|
||||||
|
|
||||||
func (p *Post) formatContent(cfg *config.Config, c *Collection, isOwner bool) {
|
func (p *Post) formatContent(cfg *config.Config, c *Collection, isOwner bool) {
|
||||||
baseURL := c.CanonicalURL()
|
baseURL := c.CanonicalURL()
|
||||||
|
// TODO: redundant
|
||||||
if !isSingleUser {
|
if !isSingleUser {
|
||||||
baseURL = "/" + c.Alias + "/"
|
baseURL = "/" + c.Alias + "/"
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue