|  | @@ -161,6 +161,13 @@ func GetIssueCountByPoster(uid, rid int64, isClosed bool) int64 {
 | 
	
		
			
				|  |  |  	return count
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// .___                             ____ ___
 | 
	
		
			
				|  |  | +// |   | ______ ________ __   ____ |    |   \______ ___________
 | 
	
		
			
				|  |  | +// |   |/  ___//  ___/  |  \_/ __ \|    |   /  ___// __ \_  __ \
 | 
	
		
			
				|  |  | +// |   |\___ \ \___ \|  |  /\  ___/|    |  /\___ \\  ___/|  | \/
 | 
	
		
			
				|  |  | +// |___/____  >____  >____/  \___  >______//____  >\___  >__|
 | 
	
		
			
				|  |  | +//          \/     \/            \/             \/     \/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // IssueUser represents an issue-user relation.
 | 
	
		
			
				|  |  |  type IssueUser struct {
 | 
	
		
			
				|  |  |  	Id          int64
 | 
	
	
		
			
				|  | @@ -404,6 +411,13 @@ type Label struct {
 | 
	
		
			
				|  |  |  	NumOpenIssues   int `xorm:"-"`
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +//    _____  .__.__                   __
 | 
	
		
			
				|  |  | +//   /     \ |__|  |   ____   _______/  |_  ____   ____   ____
 | 
	
		
			
				|  |  | +//  /  \ /  \|  |  | _/ __ \ /  ___/\   __\/  _ \ /    \_/ __ \
 | 
	
		
			
				|  |  | +// /    Y    \  |  |_\  ___/ \___ \  |  | (  <_> )   |  \  ___/
 | 
	
		
			
				|  |  | +// \____|__  /__|____/\___  >____  > |__|  \____/|___|  /\___  >
 | 
	
		
			
				|  |  | +//         \/             \/     \/                   \/     \/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // Milestone represents a milestone of repository.
 | 
	
		
			
				|  |  |  type Milestone struct {
 | 
	
		
			
				|  |  |  	Id              int64
 | 
	
	
		
			
				|  | @@ -517,7 +531,7 @@ func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ChangeMilestoneAssign changes assignment of milestone for issue.
 | 
	
		
			
				|  |  | -func ChangeMilestoneAssign(oldMid, mid int64, isIssueClosed bool) (err error) {
 | 
	
		
			
				|  |  | +func ChangeMilestoneAssign(oldMid, mid int64, issue *Issue) (err error) {
 | 
	
		
			
				|  |  |  	sess := orm.NewSession()
 | 
	
		
			
				|  |  |  	defer sess.Close()
 | 
	
		
			
				|  |  |  	if err = sess.Begin(); err != nil {
 | 
	
	
		
			
				|  | @@ -531,7 +545,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, isIssueClosed bool) (err error) {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		m.NumIssues--
 | 
	
		
			
				|  |  | -		if isIssueClosed {
 | 
	
		
			
				|  |  | +		if issue.IsClosed {
 | 
	
		
			
				|  |  |  			m.NumClosedIssues--
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		if m.NumIssues > 0 {
 | 
	
	
		
			
				|  | @@ -543,6 +557,12 @@ func ChangeMilestoneAssign(oldMid, mid int64, isIssueClosed bool) (err error) {
 | 
	
		
			
				|  |  |  			sess.Rollback()
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		rawSql := "UPDATE `issue_user` SET milestone_id = 0 WHERE issue_id = ?"
 | 
	
		
			
				|  |  | +		if _, err = sess.Exec(rawSql, issue.Id); err != nil {
 | 
	
		
			
				|  |  | +			sess.Rollback()
 | 
	
		
			
				|  |  | +			return err
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if mid > 0 {
 | 
	
	
		
			
				|  | @@ -551,7 +571,7 @@ func ChangeMilestoneAssign(oldMid, mid int64, isIssueClosed bool) (err error) {
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		m.NumIssues++
 | 
	
		
			
				|  |  | -		if isIssueClosed {
 | 
	
		
			
				|  |  | +		if issue.IsClosed {
 | 
	
		
			
				|  |  |  			m.NumClosedIssues++
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		m.Completeness = m.NumClosedIssues * 100 / m.NumIssues
 | 
	
	
		
			
				|  | @@ -559,6 +579,12 @@ func ChangeMilestoneAssign(oldMid, mid int64, isIssueClosed bool) (err error) {
 | 
	
		
			
				|  |  |  			sess.Rollback()
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		rawSql := "UPDATE `issue_user` SET milestone_id = ? WHERE issue_id = ?"
 | 
	
		
			
				|  |  | +		if _, err = sess.Exec(rawSql, m.Id, issue.Id); err != nil {
 | 
	
		
			
				|  |  | +			sess.Rollback()
 | 
	
		
			
				|  |  | +			return err
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return sess.Commit()
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -587,9 +613,22 @@ func DeleteMilestone(m *Milestone) (err error) {
 | 
	
		
			
				|  |  |  		sess.Rollback()
 | 
	
		
			
				|  |  |  		return err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	rawSql = "UPDATE `issue_user` SET milestone_id = 0 WHERE milestone_id = ?"
 | 
	
		
			
				|  |  | +	if _, err = sess.Exec(rawSql, m.Id); err != nil {
 | 
	
		
			
				|  |  | +		sess.Rollback()
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  	return sess.Commit()
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// _________                                       __
 | 
	
		
			
				|  |  | +// \_   ___ \  ____   _____   _____   ____   _____/  |_
 | 
	
		
			
				|  |  | +// /    \  \/ /  _ \ /     \ /     \_/ __ \ /    \   __\
 | 
	
		
			
				|  |  | +// \     \___(  <_> )  Y Y  \  Y Y  \  ___/|   |  \  |
 | 
	
		
			
				|  |  | +//  \______  /\____/|__|_|  /__|_|  /\___  >___|  /__|
 | 
	
		
			
				|  |  | +//         \/             \/      \/     \/     \/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // Issue types.
 | 
	
		
			
				|  |  |  const (
 | 
	
		
			
				|  |  |  	IT_PLAIN  = iota // Pure comment.
 |