|
@@ -10,10 +10,8 @@ import (
|
|
|
"fmt"
|
|
|
"io/ioutil"
|
|
|
"strings"
|
|
|
- "sync"
|
|
|
"time"
|
|
|
|
|
|
- "github.com/Unknwon/com"
|
|
|
"github.com/go-xorm/xorm"
|
|
|
gouuid "github.com/satori/go.uuid"
|
|
|
|
|
@@ -22,8 +20,11 @@ import (
|
|
|
"github.com/gogits/gogs/modules/httplib"
|
|
|
"github.com/gogits/gogs/modules/log"
|
|
|
"github.com/gogits/gogs/modules/setting"
|
|
|
+ "github.com/gogits/gogs/modules/sync"
|
|
|
)
|
|
|
|
|
|
+var HookQueue = sync.NewUniqueQueue(setting.Webhook.QueueLength)
|
|
|
+
|
|
|
type HookContentType int
|
|
|
|
|
|
const (
|
|
@@ -500,64 +501,6 @@ func PrepareWebhooks(repo *Repository, event HookEventType, p api.Payloader) err
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-// UniqueQueue represents a queue that guarantees only one instance of same ID is in the line.
|
|
|
-type UniqueQueue struct {
|
|
|
- lock sync.Mutex
|
|
|
- ids map[string]bool
|
|
|
-
|
|
|
- queue chan string
|
|
|
-}
|
|
|
-
|
|
|
-func (q *UniqueQueue) Queue() <-chan string {
|
|
|
- return q.queue
|
|
|
-}
|
|
|
-
|
|
|
-func NewUniqueQueue(queueLength int) *UniqueQueue {
|
|
|
- if queueLength <= 0 {
|
|
|
- queueLength = 100
|
|
|
- }
|
|
|
-
|
|
|
- return &UniqueQueue{
|
|
|
- ids: make(map[string]bool),
|
|
|
- queue: make(chan string, queueLength),
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func (q *UniqueQueue) Remove(id interface{}) {
|
|
|
- q.lock.Lock()
|
|
|
- defer q.lock.Unlock()
|
|
|
- delete(q.ids, com.ToStr(id))
|
|
|
-}
|
|
|
-
|
|
|
-func (q *UniqueQueue) AddFunc(id interface{}, fn func()) {
|
|
|
- newid := com.ToStr(id)
|
|
|
-
|
|
|
- if q.Exist(id) {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- q.lock.Lock()
|
|
|
- q.ids[newid] = true
|
|
|
- if fn != nil {
|
|
|
- fn()
|
|
|
- }
|
|
|
- q.lock.Unlock()
|
|
|
- q.queue <- newid
|
|
|
-}
|
|
|
-
|
|
|
-func (q *UniqueQueue) Add(id interface{}) {
|
|
|
- q.AddFunc(id, nil)
|
|
|
-}
|
|
|
-
|
|
|
-func (q *UniqueQueue) Exist(id interface{}) bool {
|
|
|
- q.lock.Lock()
|
|
|
- defer q.lock.Unlock()
|
|
|
-
|
|
|
- return q.ids[com.ToStr(id)]
|
|
|
-}
|
|
|
-
|
|
|
-var HookQueue = NewUniqueQueue(setting.Webhook.QueueLength)
|
|
|
-
|
|
|
func (t *HookTask) deliver() {
|
|
|
t.IsDelivered = true
|
|
|
|