|  | @@ -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
 | 
	
		
			
				|  |  |  
 |