| 
					
				 | 
			
			
				@@ -11,8 +11,10 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/go-xorm/xorm" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	log "gopkg.in/clog.v1" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/gogits/git-module" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	api "github.com/gogits/go-gogs-client" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/gogits/gogs/modules/process" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -21,6 +23,7 @@ import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type Release struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	ID               int64 `xorm:"pk autoincr"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	RepoID           int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Repo             *Repository `xorm:"-"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	PublisherID      int64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Publisher        *User `xorm:"-"` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	TagName          string 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -52,6 +55,13 @@ func (r *Release) AfterSet(colName string, _ xorm.Cell) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (r *Release) loadAttributes(e Engine) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if r.Repo == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		r.Repo, err = getRepositoryByID(e, r.RepoID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return fmt.Errorf("getRepositoryByID [repo_id: %d]: %v", r.RepoID, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if r.Publisher == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		r.Publisher, err = getUserByID(e, r.PublisherID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		if err != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -59,7 +69,7 @@ func (r *Release) loadAttributes(e Engine) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				r.PublisherID = -1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				r.Publisher = NewGhostUser() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-				return fmt.Errorf("getUserByID.(Publisher) [%d]: %v", r.PublisherID, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				return fmt.Errorf("getUserByID.(Publisher) [publisher_id: %d]: %v", r.PublisherID, err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -71,6 +81,22 @@ func (r *Release) LoadAttributes() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return r.loadAttributes(x) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// This method assumes some fields assigned with values: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Required - Publisher 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (r *Release) APIFormat() *api.Release { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return &api.Release{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ID:              r.ID, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TagName:         r.TagName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TargetCommitish: r.Target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Name:            r.Title, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Body:            r.Note, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Draft:           r.IsDraft, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Prerelease:      r.IsPrerelease, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Author:          r.Publisher.APIFormat(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Created:         r.Created, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // IsReleaseExist returns true if release with given tag name already exists. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func IsReleaseExist(repoID int64, tagName string) (bool, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if len(tagName) == 0 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -113,6 +139,17 @@ func createTag(gitRepo *git.Repository, r *Release) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (r *Release) preparePublishWebhooks() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err := PrepareWebhooks(r.Repo, HOOK_EVENT_RELEASE, &api.ReleasePayload{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Action:     api.HOOK_RELEASE_PUBLISHED, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Release:    r.APIFormat(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Repository: r.Repo.APIFormat(nil), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Sender:     r.Publisher.APIFormat(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	}); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Error(2, "PrepareWebhooks: %v", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // CreateRelease creates a new release of repository. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func CreateRelease(gitRepo *git.Repository, r *Release) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	isExist, err := IsReleaseExist(r.RepoID, r.TagName) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -126,8 +163,20 @@ func CreateRelease(gitRepo *git.Repository, r *Release) error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	r.LowerTagName = strings.ToLower(r.TagName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	_, err = x.InsertOne(r) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if _, err = x.Insert(r); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return fmt.Errorf("Insert: %v", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// Only send webhook when actually published, skip drafts 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if r.IsDraft { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	r, err = GetReleaseByID(r.ID) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return fmt.Errorf("GetReleaseByID: %v", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	r.preparePublishWebhooks() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // GetRelease returns release by given ID. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -205,12 +254,22 @@ func SortReleases(rels []*Release) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // UpdateRelease updates information of a release. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func UpdateRelease(gitRepo *git.Repository, rel *Release) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if err = createTag(gitRepo, rel); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func UpdateRelease(doer *User, gitRepo *git.Repository, r *Release, isPublish bool) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err = createTag(gitRepo, r); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return fmt.Errorf("createTag: %v", err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	r.PublisherID = doer.ID 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if _, err = x.Id(r.ID).AllCols().Update(r); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	_, err = x.Id(rel.ID).AllCols().Update(rel) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if !isPublish { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	r.Publisher = doer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	r.preparePublishWebhooks() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // DeleteReleaseOfRepoByID deletes a release and corresponding Git tag by given ID. 
			 |