diff --git a/history/operations.go b/history/operations.go
index e16c367..fdc64af 100644
--- a/history/operations.go
+++ b/history/operations.go
@@ -121,6 +121,7 @@ func (hop *HistoryOp) WithMsg(userMsg string) *HistoryOp {
// WithUser sets a user for the commit.
func (hop *HistoryOp) WithUser(u *user.User) *HistoryOp {
+ u = u.OrAnon()
if u.Group != user.UserAnon {
hop.name = u.Name
hop.email = u.Name + "@mycorrhiza"
diff --git a/http_mutators.go b/http_mutators.go
index 1283f59..f1cd5da 100644
--- a/http_mutators.go
+++ b/http_mutators.go
@@ -96,7 +96,7 @@ func handlerDeleteConfirm(w http.ResponseWriter, rq *http.Request) {
hyphaData, isOld = HyphaStorage[hyphaName]
u = user.FromRequest(rq)
)
- if !u.CanProceed("delete-confirm") {
+ if !user.CanProceed(rq, "delete-confirm") {
HttpErr(w, http.StatusForbidden, hyphaName, "Not enough rights", "You must be a moderator to delete pages.")
log.Println("Rejected", rq.URL)
return
diff --git a/hypha.go b/hypha.go
index 5280639..c9f2612 100644
--- a/hypha.go
+++ b/hypha.go
@@ -11,6 +11,7 @@ import (
"strings"
"github.com/bouncepaw/mycorrhiza/history"
+ "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/markup"
"github.com/bouncepaw/mycorrhiza/user"
"github.com/bouncepaw/mycorrhiza/util"
@@ -84,6 +85,7 @@ func uploadHelp(hop *history.HistoryOp, hyphaName, ext string, data []byte, u *u
// New hyphae must be added to the hypha storage
if !isOld {
HyphaStorage[hyphaName] = hyphaData
+ hyphae.IncrementCount()
}
*originalFullPath = fullPath
return hop.WithFiles(fullPath).
@@ -121,6 +123,7 @@ func (hd *HyphaData) DeleteHypha(hyphaName string, u *user.User) *history.Histor
Apply()
if len(hop.Errs) == 0 {
delete(HyphaStorage, hyphaName)
+ hyphae.DecrementCount()
}
return hop
}
@@ -218,7 +221,7 @@ func binaryHtmlBlock(hyphaName string, hd *HyphaData) string {
default:
return fmt.Sprintf(`
-
This hypha's media cannot be rendered. Access it directly
+
This hypha's media cannot be rendered. Download it
`, hyphaName)
}
@@ -250,6 +253,7 @@ func Index(path string) {
} else {
hyphaData = &HyphaData{}
HyphaStorage[hyphaName] = hyphaData
+ hyphae.IncrementCount()
}
if isText {
hyphaData.textPath = hyphaPartPath
diff --git a/hypha/count.go b/hypha/count.go
deleted file mode 100644
index 3c9aef4..0000000
--- a/hypha/count.go
+++ /dev/null
@@ -1,33 +0,0 @@
-package hypha
-
-import (
- "sync"
-)
-
-type count struct {
- value uint
- sync.Mutex
-}
-
-// Count is a global variable. Its value is number of all existing hyphae. Hypha mutators are expected to manipulate the value. It is concurrent-safe.
-var Count = count{}
-
-// Increment the value of Count.
-func (c *count) Increment() {
- c.Lock()
- c.value++
- c.Unlock()
-}
-
-// Decrement the value of Count.
-func (c *count) Decrement() {
- c.Lock()
- c.value--
- c.Unlock()
-}
-
-// Get value of Count.
-func (c *count) Value() uint {
- // it is concurrent-safe to not lock here, right?
- return c.value
-}
diff --git a/hyphae/count.go b/hyphae/count.go
new file mode 100644
index 0000000..2c1d5f1
--- /dev/null
+++ b/hyphae/count.go
@@ -0,0 +1,31 @@
+package hyphae
+
+import (
+ "sync"
+)
+
+// Its value is number of all existing hyphae. Hypha mutators are expected to manipulate the value. It is concurrent-safe.
+var count = struct {
+ value int
+ sync.Mutex
+}{}
+
+// Increment the value of hyphae count.
+func IncrementCount() {
+ count.Lock()
+ count.value++
+ count.Unlock()
+}
+
+// Decrement the value of hyphae count.
+func DecrementCount() {
+ count.Lock()
+ count.value--
+ count.Unlock()
+}
+
+// Count how many hyphae there are.
+func Count() int {
+ // it is concurrent-safe to not lock here, right?
+ return count.value
+}
diff --git a/hypha/hypha.go b/hyphae/hypha.go
similarity index 53%
rename from hypha/hypha.go
rename to hyphae/hypha.go
index 2ca5ffc..be82302 100644
--- a/hypha/hypha.go
+++ b/hyphae/hypha.go
@@ -1,4 +1,4 @@
-package hypha
+package hyphae
import (
"errors"
@@ -25,40 +25,35 @@ var schema = &memdb.DBSchema{
"hyphae": &memdb.TableSchema{
Name: "hyphae",
Indexes: map[string]*memdb.IndexSchema{
- "name": &memdb.IndexSchema{
- Name: "name",
+ "id": &memdb.IndexSchema{
+ Name: "id",
Unique: true,
Indexer: &memdb.StringFieldIndex{Field: "Name"},
},
"exists": &memdb.IndexSchema{
- Name: "exists",
- Unique: false,
- AllowEmpty: true,
- Indexer: &memdb.BoolFieldIndex{Field: "Exists"},
+ Name: "exists",
+ Unique: false,
+ Indexer: &memdb.BoolFieldIndex{Field: "Exists"},
},
"text-path": &memdb.IndexSchema{
- Name: "text-path",
- Unique: true,
- AllowEmpty: true,
- Indexer: &memdb.StringFieldIndex{Field: "TextPath"},
+ Name: "text-path",
+ Unique: true,
+ Indexer: &memdb.StringFieldIndex{Field: "TextPath"},
},
"binary-path": &memdb.IndexSchema{
- Name: "binary-path",
- Unique: true,
- AllowEmpty: true,
- Indexer: &memdb.StringFieldIndex{Field: "BinaryPath"},
+ Name: "binary-path",
+ Unique: true,
+ Indexer: &memdb.StringFieldIndex{Field: "BinaryPath"},
},
"out-links": &memdb.IndexSchema{
- Name: "out-links",
- Unique: false,
- AllowEmpty: true,
- Indexer: &memdb.StringSliceFieldIndex{Field: "OutLinks"},
+ Name: "out-links",
+ Unique: false,
+ Indexer: &memdb.StringSliceFieldIndex{Field: "OutLinks"},
},
"back-links": &memdb.IndexSchema{
- Name: "back-links",
- Unique: false,
- AllowEmpty: true,
- Indexer: &memdb.StringSliceFieldIndex{Field: "BackLinks"},
+ Name: "back-links",
+ Unique: false,
+ Indexer: &memdb.StringSliceFieldIndex{Field: "BackLinks"},
},
},
},
diff --git a/main.go b/main.go
index 0caa1d5..ae1aa0f 100644
--- a/main.go
+++ b/main.go
@@ -14,6 +14,7 @@ import (
"strings"
"github.com/bouncepaw/mycorrhiza/history"
+ "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/templates"
"github.com/bouncepaw/mycorrhiza/user"
"github.com/bouncepaw/mycorrhiza/util"
@@ -50,7 +51,7 @@ func handlerList(w http.ResponseWriter, rq *http.Request) {
log.Println(rq.URL)
var (
tbody string
- pageCount = len(HyphaStorage)
+ pageCount = hyphae.Count()
)
for hyphaName, data := range HyphaStorage {
tbody += templates.HyphaListRowHTML(hyphaName, ExtensionToMime(filepath.Ext(data.binaryPath)), data.binaryPath != "")
@@ -73,14 +74,14 @@ func handlerReindex(w http.ResponseWriter, rq *http.Request) {
log.Println("Wiki storage directory is", WikiDir)
log.Println("Start indexing hyphae...")
Index(WikiDir)
- log.Println("Indexed", len(HyphaStorage), "hyphae")
+ log.Println("Indexed", hyphae.Count(), "hyphae")
}
// Redirect to a random hypha.
func handlerRandom(w http.ResponseWriter, rq *http.Request) {
log.Println(rq.URL)
var randomHyphaName string
- i := rand.Intn(len(HyphaStorage))
+ i := rand.Intn(hyphae.Count())
for hyphaName := range HyphaStorage {
if i == 0 {
randomHyphaName = hyphaName
@@ -148,7 +149,7 @@ func main() {
log.Println("Wiki storage directory is", WikiDir)
log.Println("Start indexing hyphae...")
Index(WikiDir)
- log.Println("Indexed", len(HyphaStorage), "hyphae")
+ log.Println("Indexed", hyphae.Count(), "hyphae")
history.Start(WikiDir)