chore(models): rewrite code format. (#14754)
* chore: rewrite format. * chore: update format Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com> * chore: update format Signed-off-by: Bo-Yi Wu <appleboy.tw@gmail.com> * chore: Adjacent parameters with the same type should be grouped together * chore: update format.
This commit is contained in:
		
							parent
							
								
									164e35ead3
								
							
						
					
					
						commit
						167b0f46ef
					
				
					 103 changed files with 474 additions and 460 deletions
				
			
		| 
						 | 
				
			
			@ -121,8 +121,8 @@ func (user *User) GetRepositoryAccesses() (map[*Repository]AccessMode, error) {
 | 
			
		|||
	}
 | 
			
		||||
	defer rows.Close()
 | 
			
		||||
 | 
			
		||||
	var repos = make(map[*Repository]AccessMode, 10)
 | 
			
		||||
	var ownerCache = make(map[int64]*User, 10)
 | 
			
		||||
	repos := make(map[*Repository]AccessMode, 10)
 | 
			
		||||
	ownerCache := make(map[int64]*User, 10)
 | 
			
		||||
	for rows.Next() {
 | 
			
		||||
		var repo repoAccess
 | 
			
		||||
		err = rows.Scan(&repo)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,7 +186,7 @@ func (a *Action) GetRepoLink() string {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// GetRepositoryFromMatch returns a *Repository from a username and repo strings
 | 
			
		||||
func GetRepositoryFromMatch(ownerName string, repoName string) (*Repository, error) {
 | 
			
		||||
func GetRepositoryFromMatch(ownerName, repoName string) (*Repository, error) {
 | 
			
		||||
	var err error
 | 
			
		||||
	refRepo, err := GetRepositoryByOwnerAndName(ownerName, repoName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +218,7 @@ func (a *Action) getCommentLink(e Engine) string {
 | 
			
		|||
	if len(a.GetIssueInfos()) == 0 {
 | 
			
		||||
		return "#"
 | 
			
		||||
	}
 | 
			
		||||
	//Return link to issue
 | 
			
		||||
	// Return link to issue
 | 
			
		||||
	issueIDString := a.GetIssueInfos()[0]
 | 
			
		||||
	issueID, err := strconv.ParseInt(issueIDString, 10, 64)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -322,7 +322,7 @@ func GetFeeds(opts GetFeedsOptions) ([]*Action, error) {
 | 
			
		|||
	return actions, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func activityReadable(user *User, doer *User) bool {
 | 
			
		||||
func activityReadable(user, doer *User) bool {
 | 
			
		||||
	var doerID int64
 | 
			
		||||
	if doer != nil {
 | 
			
		||||
		doerID = doer.ID
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,11 +14,11 @@ import (
 | 
			
		|||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//NoticeType describes the notice type
 | 
			
		||||
// NoticeType describes the notice type
 | 
			
		||||
type NoticeType int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	//NoticeRepository type
 | 
			
		||||
	// NoticeRepository type
 | 
			
		||||
	NoticeRepository NoticeType = iota + 1
 | 
			
		||||
	// NoticeTask type
 | 
			
		||||
	NoticeTask
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,7 +193,7 @@ func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) {
 | 
			
		|||
		return 0, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var ids = make([]int64, 0, len(attachments))
 | 
			
		||||
	ids := make([]int64, 0, len(attachments))
 | 
			
		||||
	for _, a := range attachments {
 | 
			
		||||
		ids = append(ids, a.ID)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +216,6 @@ func DeleteAttachments(attachments []*Attachment, remove bool) (int, error) {
 | 
			
		|||
// DeleteAttachmentsByIssue deletes all attachments associated with the given issue.
 | 
			
		||||
func DeleteAttachmentsByIssue(issueID int64, remove bool) (int, error) {
 | 
			
		||||
	attachments, err := GetAttachmentsByIssueID(issueID)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -227,7 +226,6 @@ func DeleteAttachmentsByIssue(issueID int64, remove bool) (int, error) {
 | 
			
		|||
// DeleteAttachmentsByComment deletes all attachments associated with the given comment.
 | 
			
		||||
func DeleteAttachmentsByComment(commentID int64, remove bool) (int, error) {
 | 
			
		||||
	attachments, err := GetAttachmentsByCommentID(commentID)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -263,7 +261,7 @@ func IterateAttachment(f func(attach *Attachment) error) error {
 | 
			
		|||
	var start int
 | 
			
		||||
	const batchSize = 100
 | 
			
		||||
	for {
 | 
			
		||||
		var attachments = make([]*Attachment, 0, batchSize)
 | 
			
		||||
		attachments := make([]*Attachment, 0, batchSize)
 | 
			
		||||
		if err := x.Limit(batchSize, start).Find(&attachments); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,12 +17,12 @@ func TestUploadAttachment(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	user := AssertExistsAndLoadBean(t, &User{ID: 1}).(*User)
 | 
			
		||||
 | 
			
		||||
	var fPath = "./attachment_test.go"
 | 
			
		||||
	fPath := "./attachment_test.go"
 | 
			
		||||
	f, err := os.Open(fPath)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	defer f.Close()
 | 
			
		||||
 | 
			
		||||
	var buf = make([]byte, 1024)
 | 
			
		||||
	buf := make([]byte, 1024)
 | 
			
		||||
	n, err := f.Read(buf)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	buf = buf[:n]
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +152,6 @@ func TestLinkedRepository(t *testing.T) {
 | 
			
		|||
				assert.Equal(t, tc.expectedRepo.ID, repo.ID)
 | 
			
		||||
			}
 | 
			
		||||
			assert.Equal(t, tc.expectedUnitType, unitType)
 | 
			
		||||
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -176,12 +176,11 @@ func FindRepoRecentCommitStatusContexts(repoID int64, before time.Duration) ([]s
 | 
			
		|||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var contexts = make([]string, 0, len(ids))
 | 
			
		||||
	contexts := make([]string, 0, len(ids))
 | 
			
		||||
	if len(ids) == 0 {
 | 
			
		||||
		return contexts, nil
 | 
			
		||||
	}
 | 
			
		||||
	return contexts, x.Select("context").Table("commit_status").In("id", ids).Find(&contexts)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewCommitStatusOptions holds options for creating a CommitStatus
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,8 +72,7 @@ func (err ErrNameCharsNotAllowed) Error() string {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// ErrSSHDisabled represents an "SSH disabled" error.
 | 
			
		||||
type ErrSSHDisabled struct {
 | 
			
		||||
}
 | 
			
		||||
type ErrSSHDisabled struct{}
 | 
			
		||||
 | 
			
		||||
// IsErrSSHDisabled checks if an error is a ErrSSHDisabled.
 | 
			
		||||
func IsErrSSHDisabled(err error) bool {
 | 
			
		||||
| 
						 | 
				
			
			@ -269,8 +268,7 @@ func (err ErrUserHasOrgs) Error() string {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// ErrUserNotAllowedCreateOrg represents a "UserNotAllowedCreateOrg" kind of error.
 | 
			
		||||
type ErrUserNotAllowedCreateOrg struct {
 | 
			
		||||
}
 | 
			
		||||
type ErrUserNotAllowedCreateOrg struct{}
 | 
			
		||||
 | 
			
		||||
// IsErrUserNotAllowedCreateOrg checks if an error is an ErrUserNotAllowedCreateOrg.
 | 
			
		||||
func IsErrUserNotAllowedCreateOrg(err error) bool {
 | 
			
		||||
| 
						 | 
				
			
			@ -603,8 +601,7 @@ func (err ErrAccessTokenNotExist) Error() string {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// ErrAccessTokenEmpty represents a "AccessTokenEmpty" kind of error.
 | 
			
		||||
type ErrAccessTokenEmpty struct {
 | 
			
		||||
}
 | 
			
		||||
type ErrAccessTokenEmpty struct{}
 | 
			
		||||
 | 
			
		||||
// IsErrAccessTokenEmpty checks if an error is a ErrAccessTokenEmpty.
 | 
			
		||||
func IsErrAccessTokenEmpty(err error) bool {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,6 @@ func ListAccountLinks(user *User) ([]*ExternalLoginUser, error) {
 | 
			
		|||
	err := x.Where("user_id=?", user.ID).
 | 
			
		||||
		Desc("login_source_id").
 | 
			
		||||
		Find(&externalAccounts)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +86,7 @@ func removeAllAccountLinks(e Engine, user *User) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// GetUserIDByExternalUserID get user id according to provider and userID
 | 
			
		||||
func GetUserIDByExternalUserID(provider string, userID string) (int64, error) {
 | 
			
		||||
func GetUserIDByExternalUserID(provider, userID string) (int64, error) {
 | 
			
		||||
	var id int64
 | 
			
		||||
	_, err := x.Table("external_login_user").
 | 
			
		||||
		Select("user_id").
 | 
			
		||||
| 
						 | 
				
			
			@ -147,7 +146,7 @@ type FindExternalUserOptions struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (opts FindExternalUserOptions) toConds() builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if len(opts.Provider) > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"provider": opts.Provider})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,6 @@ import (
 | 
			
		|||
// GetYamlFixturesAccess returns a string containing the contents
 | 
			
		||||
// for the access table, as recalculated using repo.RecalculateAccesses()
 | 
			
		||||
func GetYamlFixturesAccess() (string, error) {
 | 
			
		||||
 | 
			
		||||
	repos := make([]*Repository, 0, 50)
 | 
			
		||||
	if err := x.Find(&repos); err != nil {
 | 
			
		||||
		return "", err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,7 +44,7 @@ type GPGKey struct {
 | 
			
		|||
	CanCertify        bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//GPGKeyImport the original import of key
 | 
			
		||||
// GPGKeyImport the original import of key
 | 
			
		||||
type GPGKeyImport struct {
 | 
			
		||||
	KeyID   string `xorm:"pk CHAR(16) NOT NULL"`
 | 
			
		||||
	Content string `xorm:"TEXT NOT NULL"`
 | 
			
		||||
| 
						 | 
				
			
			@ -118,9 +118,9 @@ func checkArmoredGPGKeyString(content string) (openpgp.EntityList, error) {
 | 
			
		|||
	return list, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//addGPGKey add key, import and subkeys to database
 | 
			
		||||
// addGPGKey add key, import and subkeys to database
 | 
			
		||||
func addGPGKey(e Engine, key *GPGKey, content string) (err error) {
 | 
			
		||||
	//Add GPGKeyImport
 | 
			
		||||
	// Add GPGKeyImport
 | 
			
		||||
	if _, err = e.Insert(GPGKeyImport{
 | 
			
		||||
		KeyID:   key.KeyID,
 | 
			
		||||
		Content: content,
 | 
			
		||||
| 
						 | 
				
			
			@ -140,7 +140,7 @@ func addGPGKey(e Engine, key *GPGKey, content string) (err error) {
 | 
			
		|||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//addGPGSubKey add subkeys to database
 | 
			
		||||
// addGPGSubKey add subkeys to database
 | 
			
		||||
func addGPGSubKey(e Engine, key *GPGKey) (err error) {
 | 
			
		||||
	// Save GPG primary key.
 | 
			
		||||
	if _, err = e.Insert(key); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -177,7 +177,7 @@ func AddGPGKey(ownerID int64, content string) ([]*GPGKey, error) {
 | 
			
		|||
			return nil, ErrGPGKeyIDAlreadyUsed{ekey.PrimaryKey.KeyIdString()}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		//Get DB session
 | 
			
		||||
		// Get DB session
 | 
			
		||||
 | 
			
		||||
		key, err := parseGPGKey(ownerID, ekey)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -192,7 +192,7 @@ func AddGPGKey(ownerID int64, content string) ([]*GPGKey, error) {
 | 
			
		|||
	return keys, sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//base64EncPubKey encode public key content to base 64
 | 
			
		||||
// base64EncPubKey encode public key content to base 64
 | 
			
		||||
func base64EncPubKey(pubkey *packet.PublicKey) (string, error) {
 | 
			
		||||
	var w bytes.Buffer
 | 
			
		||||
	err := pubkey.Serialize(&w)
 | 
			
		||||
| 
						 | 
				
			
			@ -202,18 +202,18 @@ func base64EncPubKey(pubkey *packet.PublicKey) (string, error) {
 | 
			
		|||
	return base64.StdEncoding.EncodeToString(w.Bytes()), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//base64DecPubKey decode public key content from base 64
 | 
			
		||||
// base64DecPubKey decode public key content from base 64
 | 
			
		||||
func base64DecPubKey(content string) (*packet.PublicKey, error) {
 | 
			
		||||
	b, err := readerFromBase64(content)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	//Read key
 | 
			
		||||
	// Read key
 | 
			
		||||
	p, err := packet.Read(b)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	//Check type
 | 
			
		||||
	// Check type
 | 
			
		||||
	pkey, ok := p.(*packet.PublicKey)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, fmt.Errorf("key is not a public key")
 | 
			
		||||
| 
						 | 
				
			
			@ -221,7 +221,7 @@ func base64DecPubKey(content string) (*packet.PublicKey, error) {
 | 
			
		|||
	return pkey, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//GPGKeyToEntity retrieve the imported key and the traducted entity
 | 
			
		||||
// GPGKeyToEntity retrieve the imported key and the traducted entity
 | 
			
		||||
func GPGKeyToEntity(k *GPGKey) (*openpgp.Entity, error) {
 | 
			
		||||
	impKey, err := GetGPGImportByKeyID(k.KeyID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ func GPGKeyToEntity(k *GPGKey) (*openpgp.Entity, error) {
 | 
			
		|||
	return keys[0], err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//parseSubGPGKey parse a sub Key
 | 
			
		||||
// parseSubGPGKey parse a sub Key
 | 
			
		||||
func parseSubGPGKey(ownerID int64, primaryID string, pubkey *packet.PublicKey, expiry time.Time) (*GPGKey, error) {
 | 
			
		||||
	content, err := base64EncPubKey(pubkey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -254,10 +254,10 @@ func parseSubGPGKey(ownerID int64, primaryID string, pubkey *packet.PublicKey, e
 | 
			
		|||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//getExpiryTime extract the expire time of primary key based on sig
 | 
			
		||||
// getExpiryTime extract the expire time of primary key based on sig
 | 
			
		||||
func getExpiryTime(e *openpgp.Entity) time.Time {
 | 
			
		||||
	expiry := time.Time{}
 | 
			
		||||
	//Extract self-sign for expire date based on : https://github.com/golang/crypto/blob/master/openpgp/keys.go#L165
 | 
			
		||||
	// Extract self-sign for expire date based on : https://github.com/golang/crypto/blob/master/openpgp/keys.go#L165
 | 
			
		||||
	var selfSig *packet.Signature
 | 
			
		||||
	for _, ident := range e.Identities {
 | 
			
		||||
		if selfSig == nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -273,12 +273,12 @@ func getExpiryTime(e *openpgp.Entity) time.Time {
 | 
			
		|||
	return expiry
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//parseGPGKey parse a PrimaryKey entity (primary key + subs keys + self-signature)
 | 
			
		||||
// parseGPGKey parse a PrimaryKey entity (primary key + subs keys + self-signature)
 | 
			
		||||
func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) {
 | 
			
		||||
	pubkey := e.PrimaryKey
 | 
			
		||||
	expiry := getExpiryTime(e)
 | 
			
		||||
 | 
			
		||||
	//Parse Subkeys
 | 
			
		||||
	// Parse Subkeys
 | 
			
		||||
	subkeys := make([]*GPGKey, len(e.Subkeys))
 | 
			
		||||
	for i, k := range e.Subkeys {
 | 
			
		||||
		subs, err := parseSubGPGKey(ownerID, pubkey.KeyIdString(), k.PublicKey, expiry)
 | 
			
		||||
| 
						 | 
				
			
			@ -288,7 +288,7 @@ func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) {
 | 
			
		|||
		subkeys[i] = subs
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//Check emails
 | 
			
		||||
	// Check emails
 | 
			
		||||
	userEmails, err := GetEmailAddresses(ownerID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
| 
						 | 
				
			
			@ -308,7 +308,7 @@ func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//In the case no email as been found
 | 
			
		||||
	// In the case no email as been found
 | 
			
		||||
	if len(emails) == 0 {
 | 
			
		||||
		failedEmails := make([]string, 0, len(e.Identities))
 | 
			
		||||
		for _, ident := range e.Identities {
 | 
			
		||||
| 
						 | 
				
			
			@ -340,9 +340,9 @@ func parseGPGKey(ownerID int64, e *openpgp.Entity) (*GPGKey, error) {
 | 
			
		|||
// deleteGPGKey does the actual key deletion
 | 
			
		||||
func deleteGPGKey(e *xorm.Session, keyID string) (int64, error) {
 | 
			
		||||
	if keyID == "" {
 | 
			
		||||
		return 0, fmt.Errorf("empty KeyId forbidden") //Should never happen but just to be sure
 | 
			
		||||
		return 0, fmt.Errorf("empty KeyId forbidden") // Should never happen but just to be sure
 | 
			
		||||
	}
 | 
			
		||||
	//Delete imported key
 | 
			
		||||
	// Delete imported key
 | 
			
		||||
	n, err := e.Where("key_id=?", keyID).Delete(new(GPGKeyImport))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return n, err
 | 
			
		||||
| 
						 | 
				
			
			@ -452,11 +452,11 @@ func extractSignature(s string) (*packet.Signature, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func verifySign(s *packet.Signature, h hash.Hash, k *GPGKey) error {
 | 
			
		||||
	//Check if key can sign
 | 
			
		||||
	// Check if key can sign
 | 
			
		||||
	if !k.CanSign {
 | 
			
		||||
		return fmt.Errorf("key can not sign")
 | 
			
		||||
	}
 | 
			
		||||
	//Decode key
 | 
			
		||||
	// Decode key
 | 
			
		||||
	pkey, err := base64DecPubKey(k.Content)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			@ -465,9 +465,9 @@ func verifySign(s *packet.Signature, h hash.Hash, k *GPGKey) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func hashAndVerify(sig *packet.Signature, payload string, k *GPGKey, committer, signer *User, email string) *CommitVerification {
 | 
			
		||||
	//Generating hash of commit
 | 
			
		||||
	// Generating hash of commit
 | 
			
		||||
	hash, err := populateHash(sig.Hash, []byte(payload))
 | 
			
		||||
	if err != nil { //Skipping failed to generate hash
 | 
			
		||||
	if err != nil { // Skipping failed to generate hash
 | 
			
		||||
		log.Error("PopulateHash: %v", err)
 | 
			
		||||
		return &CommitVerification{
 | 
			
		||||
			CommittingUser: committer,
 | 
			
		||||
| 
						 | 
				
			
			@ -477,7 +477,7 @@ func hashAndVerify(sig *packet.Signature, payload string, k *GPGKey, committer,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if err := verifySign(sig, hash, k); err == nil {
 | 
			
		||||
		return &CommitVerification{ //Everything is ok
 | 
			
		||||
		return &CommitVerification{ // Everything is ok
 | 
			
		||||
			CommittingUser: committer,
 | 
			
		||||
			Verified:       true,
 | 
			
		||||
			Reason:         fmt.Sprintf("%s / %s", signer.Name, k.KeyID),
 | 
			
		||||
| 
						 | 
				
			
			@ -495,7 +495,7 @@ func hashAndVerifyWithSubKeys(sig *packet.Signature, payload string, k *GPGKey,
 | 
			
		|||
		return commitVerification
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//And test also SubsKey
 | 
			
		||||
	// And test also SubsKey
 | 
			
		||||
	for _, sk := range k.SubsKey {
 | 
			
		||||
		commitVerification := hashAndVerify(sig, payload, sk, committer, signer, email)
 | 
			
		||||
		if commitVerification != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -620,9 +620,9 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		|||
	var committer *User
 | 
			
		||||
	if c.Committer != nil {
 | 
			
		||||
		var err error
 | 
			
		||||
		//Find Committer account
 | 
			
		||||
		committer, err = GetUserByEmail(c.Committer.Email) //This finds the user by primary email or activated email so commit will not be valid if email is not
 | 
			
		||||
		if err != nil {                                    //Skipping not user for commiter
 | 
			
		||||
		// Find Committer account
 | 
			
		||||
		committer, err = GetUserByEmail(c.Committer.Email) // This finds the user by primary email or activated email so commit will not be valid if email is not
 | 
			
		||||
		if err != nil {                                    // Skipping not user for commiter
 | 
			
		||||
			committer = &User{
 | 
			
		||||
				Name:  c.Committer.Name,
 | 
			
		||||
				Email: c.Committer.Email,
 | 
			
		||||
| 
						 | 
				
			
			@ -645,14 +645,14 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		|||
	if c.Signature == nil {
 | 
			
		||||
		return &CommitVerification{
 | 
			
		||||
			CommittingUser: committer,
 | 
			
		||||
			Verified:       false,                         //Default value
 | 
			
		||||
			Reason:         "gpg.error.not_signed_commit", //Default value
 | 
			
		||||
			Verified:       false,                         // Default value
 | 
			
		||||
			Reason:         "gpg.error.not_signed_commit", // Default value
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//Parsing signature
 | 
			
		||||
	// Parsing signature
 | 
			
		||||
	sig, err := extractSignature(c.Signature.Signature)
 | 
			
		||||
	if err != nil { //Skipping failed to extract sign
 | 
			
		||||
	if err != nil { // Skipping failed to extract sign
 | 
			
		||||
		log.Error("SignatureRead err: %v", err)
 | 
			
		||||
		return &CommitVerification{
 | 
			
		||||
			CommittingUser: committer,
 | 
			
		||||
| 
						 | 
				
			
			@ -688,7 +688,7 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		|||
	// Now try to associate the signature with the committer, if present
 | 
			
		||||
	if committer.ID != 0 {
 | 
			
		||||
		keys, err := ListGPGKeys(committer.ID, ListOptions{})
 | 
			
		||||
		if err != nil { //Skipping failed to get gpg keys of user
 | 
			
		||||
		if err != nil { // Skipping failed to get gpg keys of user
 | 
			
		||||
			log.Error("ListGPGKeys: %v", err)
 | 
			
		||||
			return &CommitVerification{
 | 
			
		||||
				CommittingUser: committer,
 | 
			
		||||
| 
						 | 
				
			
			@ -698,7 +698,7 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		for _, k := range keys {
 | 
			
		||||
			//Pre-check (& optimization) that emails attached to key can be attached to the commiter email and can validate
 | 
			
		||||
			// Pre-check (& optimization) that emails attached to key can be attached to the commiter email and can validate
 | 
			
		||||
			canValidate := false
 | 
			
		||||
			email := ""
 | 
			
		||||
			for _, e := range k.Emails {
 | 
			
		||||
| 
						 | 
				
			
			@ -709,7 +709,7 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if !canValidate {
 | 
			
		||||
				continue //Skip this key
 | 
			
		||||
				continue // Skip this key
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			commitVerification := hashAndVerifyWithSubKeys(sig, c.Signature.Payload, k, committer, committer, email)
 | 
			
		||||
| 
						 | 
				
			
			@ -753,7 +753,7 @@ func ParseCommitWithSignature(c *git.Commit) *CommitVerification {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &CommitVerification{ //Default at this stage
 | 
			
		||||
	return &CommitVerification{ // Default at this stage
 | 
			
		||||
		CommittingUser: committer,
 | 
			
		||||
		Verified:       false,
 | 
			
		||||
		Warning:        defaultReason != NoKeyFound,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ MkM/fdpyc2hY7Dl/+qFmN5MG5yGmMpQcX+RNNR222ibNC1D3wg==
 | 
			
		|||
 | 
			
		||||
	key, err := checkArmoredGPGKeyString(testGPGArmor)
 | 
			
		||||
	assert.NoError(t, err, "Could not parse a valid GPG public armored rsa key", key)
 | 
			
		||||
	//TODO verify value of key
 | 
			
		||||
	// TODO verify value of key
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCheckArmoredbrainpoolP256r1GPGKeyString(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ OyjLLnFQiVmq7kEA/0z0CQe3ZQiQIq5zrs7Nh1XRkFAo8GlU/SGC9XFFi722
 | 
			
		|||
 | 
			
		||||
	key, err := checkArmoredGPGKeyString(testGPGArmor)
 | 
			
		||||
	assert.NoError(t, err, "Could not parse a valid GPG public armored brainpoolP256r1 key", key)
 | 
			
		||||
	//TODO verify value of key
 | 
			
		||||
	// TODO verify value of key
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestExtractSignature(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			@ -167,19 +167,19 @@ committer Antoine GIRARD <sapk@sapk.fr> 1489013107 +0100
 | 
			
		|||
 | 
			
		||||
Unknown GPG key with good email
 | 
			
		||||
`
 | 
			
		||||
	//Reading Sign
 | 
			
		||||
	// Reading Sign
 | 
			
		||||
	goodSig, err := extractSignature(testGoodSigArmor)
 | 
			
		||||
	assert.NoError(t, err, "Could not parse a valid GPG armored signature", testGoodSigArmor)
 | 
			
		||||
	badSig, err := extractSignature(testBadSigArmor)
 | 
			
		||||
	assert.NoError(t, err, "Could not parse a valid GPG armored signature", testBadSigArmor)
 | 
			
		||||
 | 
			
		||||
	//Generating hash of commit
 | 
			
		||||
	// Generating hash of commit
 | 
			
		||||
	goodHash, err := populateHash(goodSig.Hash, []byte(testGoodPayload))
 | 
			
		||||
	assert.NoError(t, err, "Could not generate a valid hash of payload", testGoodPayload)
 | 
			
		||||
	badHash, err := populateHash(badSig.Hash, []byte(testBadPayload))
 | 
			
		||||
	assert.NoError(t, err, "Could not generate a valid hash of payload", testBadPayload)
 | 
			
		||||
 | 
			
		||||
	//Verify
 | 
			
		||||
	// Verify
 | 
			
		||||
	err = verifySign(goodSig, goodHash, key)
 | 
			
		||||
	assert.NoError(t, err, "Could not validate a good signature")
 | 
			
		||||
	err = verifySign(badSig, badHash, key)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,7 +5,7 @@
 | 
			
		|||
package models
 | 
			
		||||
 | 
			
		||||
func keysInt64(m map[int64]struct{}) []int64 {
 | 
			
		||||
	var keys = make([]int64, 0, len(m))
 | 
			
		||||
	keys := make([]int64, 0, len(m))
 | 
			
		||||
	for k := range m {
 | 
			
		||||
		keys = append(keys, k)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@ func keysInt64(m map[int64]struct{}) []int64 {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func valuesRepository(m map[int64]*Repository) []*Repository {
 | 
			
		||||
	var values = make([]*Repository, 0, len(m))
 | 
			
		||||
	values := make([]*Repository, 0, len(m))
 | 
			
		||||
	for _, v := range m {
 | 
			
		||||
		values = append(values, v)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ func valuesRepository(m map[int64]*Repository) []*Repository {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func valuesUser(m map[int64]*User) []*User {
 | 
			
		||||
	var values = make([]*User, 0, len(m))
 | 
			
		||||
	values := make([]*User, 0, len(m))
 | 
			
		||||
	for _, v := range m {
 | 
			
		||||
		values = append(values, v)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -74,5 +74,4 @@ func FullPushingEnvironment(author, committer *User, repo *Repository, repoName
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	return environ
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,9 +77,11 @@ var (
 | 
			
		|||
	issueTasksDonePat *regexp.Regexp
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const issueTasksRegexpStr = `(^\s*[-*]\s\[[\sxX]\]\s.)|(\n\s*[-*]\s\[[\sxX]\]\s.)`
 | 
			
		||||
const issueTasksDoneRegexpStr = `(^\s*[-*]\s\[[xX]\]\s.)|(\n\s*[-*]\s\[[xX]\]\s.)`
 | 
			
		||||
const issueMaxDupIndexAttempts = 3
 | 
			
		||||
const (
 | 
			
		||||
	issueTasksRegexpStr      = `(^\s*[-*]\s\[[\sxX]\]\s.)|(\n\s*[-*]\s\[[\sxX]\]\s.)`
 | 
			
		||||
	issueTasksDoneRegexpStr  = `(^\s*[-*]\s\[[xX]\]\s.)|(\n\s*[-*]\s\[[xX]\]\s.)`
 | 
			
		||||
	issueMaxDupIndexAttempts = 3
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	issueTasksPat = regexp.MustCompile(issueTasksRegexpStr)
 | 
			
		||||
| 
						 | 
				
			
			@ -714,7 +716,7 @@ func (issue *Issue) ChangeTitle(doer *User, oldTitle string) (err error) {
 | 
			
		|||
		return fmt.Errorf("loadRepo: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:     CommentTypeChangeTitle,
 | 
			
		||||
		Doer:     doer,
 | 
			
		||||
		Repo:     issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -759,7 +761,7 @@ func AddDeletePRBranchComment(doer *User, repo *Repository, issueID int64, branc
 | 
			
		|||
	if err := sess.Begin(); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:   CommentTypeDeleteBranch,
 | 
			
		||||
		Doer:   doer,
 | 
			
		||||
		Repo:   repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -914,7 +916,7 @@ func newIssue(e *xorm.Session, doer *User, opts NewIssueOptions) (err error) {
 | 
			
		|||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var opts = &CreateCommentOptions{
 | 
			
		||||
		opts := &CreateCommentOptions{
 | 
			
		||||
			Type:           CommentTypeMilestone,
 | 
			
		||||
			Doer:           doer,
 | 
			
		||||
			Repo:           opts.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -1083,7 +1085,7 @@ func getIssuesByIDs(e Engine, issueIDs []int64) ([]*Issue, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func getIssueIDsByRepoID(e Engine, repoID int64) ([]int64, error) {
 | 
			
		||||
	var ids = make([]int64, 0, 10)
 | 
			
		||||
	ids := make([]int64, 0, 10)
 | 
			
		||||
	err := e.Table("issue").Where("repo_id = ?", repoID).Find(&ids)
 | 
			
		||||
	return ids, err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1689,7 +1691,7 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// GetRepoIssueStats returns number of open and closed repository issues by given filter mode.
 | 
			
		||||
func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen int64, numClosed int64) {
 | 
			
		||||
func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen, numClosed int64) {
 | 
			
		||||
	countSession := func(isClosed, isPull bool, repoID int64) *xorm.Session {
 | 
			
		||||
		sess := x.
 | 
			
		||||
			Where("is_closed = ?", isClosed).
 | 
			
		||||
| 
						 | 
				
			
			@ -1719,10 +1721,10 @@ func GetRepoIssueStats(repoID, uid int64, filterMode int, isPull bool) (numOpen
 | 
			
		|||
 | 
			
		||||
// SearchIssueIDsByKeyword search issues on database
 | 
			
		||||
func SearchIssueIDsByKeyword(kw string, repoIDs []int64, limit, start int) (int64, []int64, error) {
 | 
			
		||||
	var repoCond = builder.In("repo_id", repoIDs)
 | 
			
		||||
	var subQuery = builder.Select("id").From("issue").Where(repoCond)
 | 
			
		||||
	repoCond := builder.In("repo_id", repoIDs)
 | 
			
		||||
	subQuery := builder.Select("id").From("issue").Where(repoCond)
 | 
			
		||||
	kw = strings.ToUpper(kw)
 | 
			
		||||
	var cond = builder.And(
 | 
			
		||||
	cond := builder.And(
 | 
			
		||||
		repoCond,
 | 
			
		||||
		builder.Or(
 | 
			
		||||
			builder.Like{"UPPER(name)", kw},
 | 
			
		||||
| 
						 | 
				
			
			@ -1738,8 +1740,8 @@ func SearchIssueIDsByKeyword(kw string, repoIDs []int64, limit, start int) (int6
 | 
			
		|||
		),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var ids = make([]int64, 0, limit)
 | 
			
		||||
	var res = make([]struct {
 | 
			
		||||
	ids := make([]int64, 0, limit)
 | 
			
		||||
	res := make([]struct {
 | 
			
		||||
		ID          int64
 | 
			
		||||
		UpdatedUnix int64
 | 
			
		||||
	}, 0, limit)
 | 
			
		||||
| 
						 | 
				
			
			@ -1790,7 +1792,7 @@ func UpdateIssueByAPI(issue *Issue, doer *User) (statusChangeComment *Comment, t
 | 
			
		|||
 | 
			
		||||
	titleChanged = currentIssue.Title != issue.Title
 | 
			
		||||
	if titleChanged {
 | 
			
		||||
		var opts = &CreateCommentOptions{
 | 
			
		||||
		opts := &CreateCommentOptions{
 | 
			
		||||
			Type:     CommentTypeChangeTitle,
 | 
			
		||||
			Doer:     doer,
 | 
			
		||||
			Repo:     issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -1819,7 +1821,6 @@ func UpdateIssueByAPI(issue *Issue, doer *User) (statusChangeComment *Comment, t
 | 
			
		|||
 | 
			
		||||
// UpdateIssueDeadline updates an issue deadline and adds comments. Setting a deadline to 0 means deleting it.
 | 
			
		||||
func UpdateIssueDeadline(issue *Issue, deadlineUnix timeutil.TimeStamp, doer *User) (err error) {
 | 
			
		||||
 | 
			
		||||
	// if the deadline hasn't changed do nothing
 | 
			
		||||
	if issue.DeadlineUnix == deadlineUnix {
 | 
			
		||||
		return nil
 | 
			
		||||
| 
						 | 
				
			
			@ -1879,7 +1880,7 @@ func (issue *Issue) getBlockedByDependencies(e Engine) (issueDeps []*DependencyI
 | 
			
		|||
		Join("INNER", "repository", "repository.id = issue.repo_id").
 | 
			
		||||
		Join("INNER", "issue_dependency", "issue_dependency.dependency_id = issue.id").
 | 
			
		||||
		Where("issue_id = ?", issue.ID).
 | 
			
		||||
		//sort by repo id then created date, with the issues of the same repo at the beginning of the list
 | 
			
		||||
		// sort by repo id then created date, with the issues of the same repo at the beginning of the list
 | 
			
		||||
		OrderBy("CASE WHEN issue.repo_id = " + strconv.FormatInt(issue.RepoID, 10) + " THEN 0 ELSE issue.repo_id END, issue.created_unix DESC").
 | 
			
		||||
		Find(&issueDeps)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1891,7 +1892,7 @@ func (issue *Issue) getBlockingDependencies(e Engine) (issueDeps []*DependencyIn
 | 
			
		|||
		Join("INNER", "repository", "repository.id = issue.repo_id").
 | 
			
		||||
		Join("INNER", "issue_dependency", "issue_dependency.issue_id = issue.id").
 | 
			
		||||
		Where("dependency_id = ?", issue.ID).
 | 
			
		||||
		//sort by repo id then created date, with the issues of the same repo at the beginning of the list
 | 
			
		||||
		// sort by repo id then created date, with the issues of the same repo at the beginning of the list
 | 
			
		||||
		OrderBy("CASE WHEN issue.repo_id = " + strconv.FormatInt(issue.RepoID, 10) + " THEN 0 ELSE issue.repo_id END, issue.created_unix DESC").
 | 
			
		||||
		Find(&issueDeps)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,7 +119,7 @@ func (issue *Issue) toggleAssignee(sess *xorm.Session, doer *User, assigneeID in
 | 
			
		|||
		return false, nil, fmt.Errorf("loadRepo: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:            CommentTypeAssignees,
 | 
			
		||||
		Doer:            doer,
 | 
			
		||||
		Repo:            issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -143,7 +143,6 @@ func (issue *Issue) toggleAssignee(sess *xorm.Session, doer *User, assigneeID in
 | 
			
		|||
 | 
			
		||||
// toggles user assignee state in database
 | 
			
		||||
func toggleUserAssignee(e *xorm.Session, issue *Issue, assigneeID int64) (removed bool, err error) {
 | 
			
		||||
 | 
			
		||||
	// Check if the user exists
 | 
			
		||||
	assignee, err := getUserByID(e, assigneeID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +179,6 @@ func toggleUserAssignee(e *xorm.Session, issue *Issue, assigneeID int64) (remove
 | 
			
		|||
 | 
			
		||||
// MakeIDsFromAPIAssigneesToAdd returns an array with all assignee IDs
 | 
			
		||||
func MakeIDsFromAPIAssigneesToAdd(oneAssignee string, multipleAssignees []string) (assigneeIDs []int64, err error) {
 | 
			
		||||
 | 
			
		||||
	var requestAssignees []string
 | 
			
		||||
 | 
			
		||||
	// Keeping the old assigning method for compatibility reasons
 | 
			
		||||
| 
						 | 
				
			
			@ -188,7 +186,7 @@ func MakeIDsFromAPIAssigneesToAdd(oneAssignee string, multipleAssignees []string
 | 
			
		|||
		requestAssignees = append(requestAssignees, oneAssignee)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//Prevent empty assignees
 | 
			
		||||
	// Prevent empty assignees
 | 
			
		||||
	if len(multipleAssignees) > 0 && multipleAssignees[0] != "" {
 | 
			
		||||
		requestAssignees = append(requestAssignees, multipleAssignees...)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -267,7 +267,6 @@ func (c *Comment) AfterDelete() {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	_, err := DeleteAttachmentsByComment(c.ID, true)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Info("Could not delete files for comment %d on issue #%d: %s", c.ID, c.IssueID, err)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -391,7 +390,6 @@ func (c *Comment) LoadLabel() error {
 | 
			
		|||
 | 
			
		||||
// LoadProject if comment.Type is CommentTypeProject, then load project.
 | 
			
		||||
func (c *Comment) LoadProject() error {
 | 
			
		||||
 | 
			
		||||
	if c.OldProjectID > 0 {
 | 
			
		||||
		var oldProject Project
 | 
			
		||||
		has, err := x.ID(c.OldProjectID).Get(&oldProject)
 | 
			
		||||
| 
						 | 
				
			
			@ -813,7 +811,7 @@ func createDeadlineComment(e *xorm.Session, doer *User, issue *Issue, newDeadlin
 | 
			
		|||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:    commentType,
 | 
			
		||||
		Doer:    doer,
 | 
			
		||||
		Repo:    issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -828,7 +826,7 @@ func createDeadlineComment(e *xorm.Session, doer *User, issue *Issue, newDeadlin
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Creates issue dependency comment
 | 
			
		||||
func createIssueDependencyComment(e *xorm.Session, doer *User, issue *Issue, dependentIssue *Issue, add bool) (err error) {
 | 
			
		||||
func createIssueDependencyComment(e *xorm.Session, doer *User, issue, dependentIssue *Issue, add bool) (err error) {
 | 
			
		||||
	cType := CommentTypeAddDependency
 | 
			
		||||
	if !add {
 | 
			
		||||
		cType = CommentTypeRemoveDependency
 | 
			
		||||
| 
						 | 
				
			
			@ -838,7 +836,7 @@ func createIssueDependencyComment(e *xorm.Session, doer *User, issue *Issue, dep
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// Make two comments, one in each issue
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:             cType,
 | 
			
		||||
		Doer:             doer,
 | 
			
		||||
		Repo:             issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -977,7 +975,7 @@ type FindCommentsOptions struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (opts *FindCommentsOptions) toConds() builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if opts.RepoID > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"issue.repo_id": opts.RepoID})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1149,7 +1147,7 @@ func findCodeComments(e Engine, opts FindCommentsOptions, issue *Issue, currentU
 | 
			
		|||
 | 
			
		||||
	// Find all reviews by ReviewID
 | 
			
		||||
	reviews := make(map[int64]*Review)
 | 
			
		||||
	var ids = make([]int64, 0, len(comments))
 | 
			
		||||
	ids := make([]int64, 0, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if comment.ReviewID != 0 {
 | 
			
		||||
			ids = append(ids, comment.ReviewID)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,9 +24,9 @@ func (comments CommentList) loadPosters(e Engine) error {
 | 
			
		|||
 | 
			
		||||
	posterIDs := comments.getPosterIDs()
 | 
			
		||||
	posterMaps := make(map[int64]*User, len(posterIDs))
 | 
			
		||||
	var left = len(posterIDs)
 | 
			
		||||
	left := len(posterIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ func (comments CommentList) loadPosters(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getCommentIDs() []int64 {
 | 
			
		||||
	var ids = make([]int64, 0, len(comments))
 | 
			
		||||
	ids := make([]int64, 0, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		ids = append(ids, comment.ID)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ func (comments CommentList) getCommentIDs() []int64 {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getLabelIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if _, ok := ids[comment.LabelID]; !ok {
 | 
			
		||||
			ids[comment.LabelID] = struct{}{}
 | 
			
		||||
| 
						 | 
				
			
			@ -75,11 +75,11 @@ func (comments CommentList) loadLabels(e Engine) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var labelIDs = comments.getLabelIDs()
 | 
			
		||||
	var commentLabels = make(map[int64]*Label, len(labelIDs))
 | 
			
		||||
	var left = len(labelIDs)
 | 
			
		||||
	labelIDs := comments.getLabelIDs()
 | 
			
		||||
	commentLabels := make(map[int64]*Label, len(labelIDs))
 | 
			
		||||
	left := len(labelIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -111,7 +111,7 @@ func (comments CommentList) loadLabels(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getMilestoneIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if _, ok := ids[comment.MilestoneID]; !ok {
 | 
			
		||||
			ids[comment.MilestoneID] = struct{}{}
 | 
			
		||||
| 
						 | 
				
			
			@ -131,9 +131,9 @@ func (comments CommentList) loadMilestones(e Engine) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs))
 | 
			
		||||
	var left = len(milestoneIDs)
 | 
			
		||||
	left := len(milestoneIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -154,7 +154,7 @@ func (comments CommentList) loadMilestones(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getOldMilestoneIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if _, ok := ids[comment.OldMilestoneID]; !ok {
 | 
			
		||||
			ids[comment.OldMilestoneID] = struct{}{}
 | 
			
		||||
| 
						 | 
				
			
			@ -174,9 +174,9 @@ func (comments CommentList) loadOldMilestones(e Engine) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs))
 | 
			
		||||
	var left = len(milestoneIDs)
 | 
			
		||||
	left := len(milestoneIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -197,7 +197,7 @@ func (comments CommentList) loadOldMilestones(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getAssigneeIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if _, ok := ids[comment.AssigneeID]; !ok {
 | 
			
		||||
			ids[comment.AssigneeID] = struct{}{}
 | 
			
		||||
| 
						 | 
				
			
			@ -211,11 +211,11 @@ func (comments CommentList) loadAssignees(e Engine) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var assigneeIDs = comments.getAssigneeIDs()
 | 
			
		||||
	var assignees = make(map[int64]*User, len(assigneeIDs))
 | 
			
		||||
	var left = len(assigneeIDs)
 | 
			
		||||
	assigneeIDs := comments.getAssigneeIDs()
 | 
			
		||||
	assignees := make(map[int64]*User, len(assigneeIDs))
 | 
			
		||||
	left := len(assigneeIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -250,7 +250,7 @@ func (comments CommentList) loadAssignees(e Engine) error {
 | 
			
		|||
 | 
			
		||||
// getIssueIDs returns all the issue ids on this comment list which issue hasn't been loaded
 | 
			
		||||
func (comments CommentList) getIssueIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if comment.Issue != nil {
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			@ -264,7 +264,7 @@ func (comments CommentList) getIssueIDs() []int64 {
 | 
			
		|||
 | 
			
		||||
// Issues returns all the issues of comments
 | 
			
		||||
func (comments CommentList) Issues() IssueList {
 | 
			
		||||
	var issues = make(map[int64]*Issue, len(comments))
 | 
			
		||||
	issues := make(map[int64]*Issue, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if comment.Issue != nil {
 | 
			
		||||
			if _, ok := issues[comment.Issue.ID]; !ok {
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ func (comments CommentList) Issues() IssueList {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueList = make([]*Issue, 0, len(issues))
 | 
			
		||||
	issueList := make([]*Issue, 0, len(issues))
 | 
			
		||||
	for _, issue := range issues {
 | 
			
		||||
		issueList = append(issueList, issue)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -285,11 +285,11 @@ func (comments CommentList) loadIssues(e Engine) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueIDs = comments.getIssueIDs()
 | 
			
		||||
	var issues = make(map[int64]*Issue, len(issueIDs))
 | 
			
		||||
	var left = len(issueIDs)
 | 
			
		||||
	issueIDs := comments.getIssueIDs()
 | 
			
		||||
	issues := make(map[int64]*Issue, len(issueIDs))
 | 
			
		||||
	left := len(issueIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -325,7 +325,7 @@ func (comments CommentList) loadIssues(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getDependentIssueIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if comment.DependentIssue != nil {
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			@ -342,11 +342,11 @@ func (comments CommentList) loadDependentIssues(e Engine) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueIDs = comments.getDependentIssueIDs()
 | 
			
		||||
	var issues = make(map[int64]*Issue, len(issueIDs))
 | 
			
		||||
	var left = len(issueIDs)
 | 
			
		||||
	issueIDs := comments.getDependentIssueIDs()
 | 
			
		||||
	issues := make(map[int64]*Issue, len(issueIDs))
 | 
			
		||||
	left := len(issueIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -391,11 +391,11 @@ func (comments CommentList) loadAttachments(e Engine) (err error) {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var attachments = make(map[int64][]*Attachment, len(comments))
 | 
			
		||||
	var commentsIDs = comments.getCommentIDs()
 | 
			
		||||
	var left = len(commentsIDs)
 | 
			
		||||
	attachments := make(map[int64][]*Attachment, len(comments))
 | 
			
		||||
	commentsIDs := comments.getCommentIDs()
 | 
			
		||||
	left := len(commentsIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -429,7 +429,7 @@ func (comments CommentList) loadAttachments(e Engine) (err error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (comments CommentList) getReviewIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(comments))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(comments))
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		if _, ok := ids[comment.ReviewID]; !ok {
 | 
			
		||||
			ids[comment.ReviewID] = struct{}{}
 | 
			
		||||
| 
						 | 
				
			
			@ -443,11 +443,11 @@ func (comments CommentList) loadReviews(e Engine) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var reviewIDs = comments.getReviewIDs()
 | 
			
		||||
	var reviews = make(map[int64]*Review, len(reviewIDs))
 | 
			
		||||
	var left = len(reviewIDs)
 | 
			
		||||
	reviewIDs := comments.getReviewIDs()
 | 
			
		||||
	reviews := make(map[int64]*Review, len(reviewIDs))
 | 
			
		||||
	left := len(reviewIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,7 +71,7 @@ func CreateIssueDependency(user *User, issue, dep *Issue) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// RemoveIssueDependency removes a dependency from an issue
 | 
			
		||||
func RemoveIssueDependency(user *User, issue *Issue, dep *Issue, depType DependencyType) (err error) {
 | 
			
		||||
func RemoveIssueDependency(user *User, issue, dep *Issue, depType DependencyType) (err error) {
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err = sess.Begin(); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ func RemoveIssueDependency(user *User, issue *Issue, dep *Issue, depType Depende
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Check if the dependency already exists
 | 
			
		||||
func issueDepExists(e Engine, issueID int64, depID int64) (bool, error) {
 | 
			
		||||
func issueDepExists(e Engine, issueID, depID int64) (bool, error) {
 | 
			
		||||
	return e.Where("(issue_id = ? AND dependency_id = ?)", issueID, depID).Exist(&IssueDependency{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -256,7 +256,6 @@ func UpdateLabel(l *Label) error {
 | 
			
		|||
 | 
			
		||||
// DeleteLabel delete a label
 | 
			
		||||
func DeleteLabel(id, labelID int64) error {
 | 
			
		||||
 | 
			
		||||
	label, err := GetLabelByID(labelID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if IsErrLabelNotExist(err) {
 | 
			
		||||
| 
						 | 
				
			
			@ -646,7 +645,7 @@ func newIssueLabel(e *xorm.Session, issue *Issue, label *Label, doer *User) (err
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:    CommentTypeLabel,
 | 
			
		||||
		Doer:    doer,
 | 
			
		||||
		Repo:    issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -748,7 +747,7 @@ func deleteIssueLabel(e *xorm.Session, issue *Issue, label *Label, doer *User) (
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opts = &CreateCommentOptions{
 | 
			
		||||
	opts := &CreateCommentOptions{
 | 
			
		||||
		Type:  CommentTypeLabel,
 | 
			
		||||
		Doer:  doer,
 | 
			
		||||
		Repo:  issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -231,7 +231,6 @@ func TestGetLabelsByOrgID(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	_, err = GetLabelsByOrgID(-1, "leastissues", ListOptions{})
 | 
			
		||||
	assert.True(t, IsErrOrgLabelNotExist(err))
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,9 +35,9 @@ func (issues IssueList) loadRepositories(e Engine) ([]*Repository, error) {
 | 
			
		|||
 | 
			
		||||
	repoIDs := issues.getRepoIDs()
 | 
			
		||||
	repoMaps := make(map[int64]*Repository, len(repoIDs))
 | 
			
		||||
	var left = len(repoIDs)
 | 
			
		||||
	left := len(repoIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -79,9 +79,9 @@ func (issues IssueList) loadPosters(e Engine) error {
 | 
			
		|||
 | 
			
		||||
	posterIDs := issues.getPosterIDs()
 | 
			
		||||
	posterMaps := make(map[int64]*User, len(posterIDs))
 | 
			
		||||
	var left = len(posterIDs)
 | 
			
		||||
	left := len(posterIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +108,7 @@ func (issues IssueList) loadPosters(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (issues IssueList) getIssueIDs() []int64 {
 | 
			
		||||
	var ids = make([]int64, 0, len(issues))
 | 
			
		||||
	ids := make([]int64, 0, len(issues))
 | 
			
		||||
	for _, issue := range issues {
 | 
			
		||||
		ids = append(ids, issue.ID)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -125,11 +125,11 @@ func (issues IssueList) loadLabels(e Engine) error {
 | 
			
		|||
		IssueLabel *IssueLabel `xorm:"extends"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueLabels = make(map[int64][]*Label, len(issues)*3)
 | 
			
		||||
	var issueIDs = issues.getIssueIDs()
 | 
			
		||||
	var left = len(issueIDs)
 | 
			
		||||
	issueLabels := make(map[int64][]*Label, len(issues)*3)
 | 
			
		||||
	issueIDs := issues.getIssueIDs()
 | 
			
		||||
	left := len(issueIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +169,7 @@ func (issues IssueList) loadLabels(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (issues IssueList) getMilestoneIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(issues))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(issues))
 | 
			
		||||
	for _, issue := range issues {
 | 
			
		||||
		if _, ok := ids[issue.MilestoneID]; !ok {
 | 
			
		||||
			ids[issue.MilestoneID] = struct{}{}
 | 
			
		||||
| 
						 | 
				
			
			@ -185,9 +185,9 @@ func (issues IssueList) loadMilestones(e Engine) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	milestoneMaps := make(map[int64]*Milestone, len(milestoneIDs))
 | 
			
		||||
	var left = len(milestoneIDs)
 | 
			
		||||
	left := len(milestoneIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -217,11 +217,11 @@ func (issues IssueList) loadAssignees(e Engine) error {
 | 
			
		|||
		Assignee      *User           `xorm:"extends"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var assignees = make(map[int64][]*User, len(issues))
 | 
			
		||||
	var issueIDs = issues.getIssueIDs()
 | 
			
		||||
	var left = len(issueIDs)
 | 
			
		||||
	assignees := make(map[int64][]*User, len(issues))
 | 
			
		||||
	issueIDs := issues.getIssueIDs()
 | 
			
		||||
	left := len(issueIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -259,7 +259,7 @@ func (issues IssueList) loadAssignees(e Engine) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (issues IssueList) getPullIssueIDs() []int64 {
 | 
			
		||||
	var ids = make([]int64, 0, len(issues))
 | 
			
		||||
	ids := make([]int64, 0, len(issues))
 | 
			
		||||
	for _, issue := range issues {
 | 
			
		||||
		if issue.IsPull && issue.PullRequest == nil {
 | 
			
		||||
			ids = append(ids, issue.ID)
 | 
			
		||||
| 
						 | 
				
			
			@ -275,9 +275,9 @@ func (issues IssueList) loadPullRequests(e Engine) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	pullRequestMaps := make(map[int64]*PullRequest, len(issuesIDs))
 | 
			
		||||
	var left = len(issuesIDs)
 | 
			
		||||
	left := len(issuesIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -317,11 +317,11 @@ func (issues IssueList) loadAttachments(e Engine) (err error) {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var attachments = make(map[int64][]*Attachment, len(issues))
 | 
			
		||||
	var issuesIDs = issues.getIssueIDs()
 | 
			
		||||
	var left = len(issuesIDs)
 | 
			
		||||
	attachments := make(map[int64][]*Attachment, len(issues))
 | 
			
		||||
	issuesIDs := issues.getIssueIDs()
 | 
			
		||||
	left := len(issuesIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -362,11 +362,11 @@ func (issues IssueList) loadComments(e Engine, cond builder.Cond) (err error) {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var comments = make(map[int64][]*Comment, len(issues))
 | 
			
		||||
	var issuesIDs = issues.getIssueIDs()
 | 
			
		||||
	var left = len(issuesIDs)
 | 
			
		||||
	comments := make(map[int64][]*Comment, len(issues))
 | 
			
		||||
	issuesIDs := issues.getIssueIDs()
 | 
			
		||||
	left := len(issuesIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -411,18 +411,18 @@ func (issues IssueList) loadTotalTrackedTimes(e Engine) (err error) {
 | 
			
		|||
	if len(issues) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var trackedTimes = make(map[int64]int64, len(issues))
 | 
			
		||||
	trackedTimes := make(map[int64]int64, len(issues))
 | 
			
		||||
 | 
			
		||||
	var ids = make([]int64, 0, len(issues))
 | 
			
		||||
	ids := make([]int64, 0, len(issues))
 | 
			
		||||
	for _, issue := range issues {
 | 
			
		||||
		if issue.Repo.IsTimetrackerEnabled() {
 | 
			
		||||
			ids = append(ids, issue.ID)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var left = len(ids)
 | 
			
		||||
	left := len(ids)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ func updateIssueLock(opts *IssueLockOptions, lock bool) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var opt = &CreateCommentOptions{
 | 
			
		||||
	opt := &CreateCommentOptions{
 | 
			
		||||
		Doer:    opts.Doer,
 | 
			
		||||
		Issue:   opts.Issue,
 | 
			
		||||
		Repo:    opts.Issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -282,7 +282,7 @@ func changeMilestoneAssign(e *xorm.Session, doer *User, issue *Issue, oldMilesto
 | 
			
		|||
			return err
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var opts = &CreateCommentOptions{
 | 
			
		||||
		opts := &CreateCommentOptions{
 | 
			
		||||
			Type:           CommentTypeMilestone,
 | 
			
		||||
			Doer:           doer,
 | 
			
		||||
			Repo:           issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -366,7 +366,7 @@ func DeleteMilestoneByRepoID(repoID, id int64) error {
 | 
			
		|||
type MilestoneList []*Milestone
 | 
			
		||||
 | 
			
		||||
func (milestones MilestoneList) getMilestoneIDs() []int64 {
 | 
			
		||||
	var ids = make([]int64, 0, len(milestones))
 | 
			
		||||
	ids := make([]int64, 0, len(milestones))
 | 
			
		||||
	for _, ms := range milestones {
 | 
			
		||||
		ids = append(ids, ms.ID)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -596,7 +596,7 @@ func (milestones MilestoneList) loadTotalTrackedTimes(e Engine) error {
 | 
			
		|||
	if len(milestones) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
	var trackedTimes = make(map[int64]int64, len(milestones))
 | 
			
		||||
	trackedTimes := make(map[int64]int64, len(milestones))
 | 
			
		||||
 | 
			
		||||
	// Get total tracked time by milestone_id
 | 
			
		||||
	rows, err := e.Table("issue").
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,14 +38,14 @@ type FindReactionsOptions struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (opts *FindReactionsOptions) toConds() builder.Cond {
 | 
			
		||||
	//If Issue ID is set add to Query
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	// If Issue ID is set add to Query
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if opts.IssueID > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"reaction.issue_id": opts.IssueID})
 | 
			
		||||
	}
 | 
			
		||||
	//If CommentID is > 0 add to Query
 | 
			
		||||
	//If it is 0 Query ignore CommentID to select
 | 
			
		||||
	//If it is -1 it explicit search of Issue Reactions where CommentID = 0
 | 
			
		||||
	// If CommentID is > 0 add to Query
 | 
			
		||||
	// If it is 0 Query ignore CommentID to select
 | 
			
		||||
	// If it is -1 it explicit search of Issue Reactions where CommentID = 0
 | 
			
		||||
	if opts.CommentID > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"reaction.comment_id": opts.CommentID})
 | 
			
		||||
	} else if opts.CommentID == -1 {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,8 @@ func (opts *FindReactionsOptions) toConds() builder.Cond {
 | 
			
		|||
func FindCommentReactions(comment *Comment) (ReactionList, error) {
 | 
			
		||||
	return findReactions(x, FindReactionsOptions{
 | 
			
		||||
		IssueID:   comment.IssueID,
 | 
			
		||||
		CommentID: comment.ID})
 | 
			
		||||
		CommentID: comment.ID,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FindIssueReactions returns a ReactionList of all reactions from an issue
 | 
			
		||||
| 
						 | 
				
			
			@ -260,7 +261,7 @@ func (list ReactionList) HasUser(userID int64) bool {
 | 
			
		|||
 | 
			
		||||
// GroupByType returns reactions grouped by type
 | 
			
		||||
func (list ReactionList) GroupByType() map[string]ReactionList {
 | 
			
		||||
	var reactions = make(map[string]ReactionList)
 | 
			
		||||
	reactions := make(map[string]ReactionList)
 | 
			
		||||
	for _, reaction := range list {
 | 
			
		||||
		reactions[reaction.Type] = append(reactions[reaction.Type], reaction)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -314,7 +315,7 @@ func (list ReactionList) LoadUsers(repo *Repository) ([]*User, error) {
 | 
			
		|||
// GetFirstUsers returns first reacted user display names separated by comma
 | 
			
		||||
func (list ReactionList) GetFirstUsers() string {
 | 
			
		||||
	var buffer bytes.Buffer
 | 
			
		||||
	var rem = setting.UI.ReactionMaxUserNum
 | 
			
		||||
	rem := setting.UI.ReactionMaxUserNum
 | 
			
		||||
	for _, reaction := range list {
 | 
			
		||||
		if buffer.Len() > 0 {
 | 
			
		||||
			buffer.WriteString(", ")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ func GetUserStopwatches(userID int64, listOptions ListOptions) ([]*Stopwatch, er
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// StopwatchExists returns true if the stopwatch exists
 | 
			
		||||
func StopwatchExists(userID int64, issueID int64) bool {
 | 
			
		||||
func StopwatchExists(userID, issueID int64) bool {
 | 
			
		||||
	_, exists, _ := getStopwatch(x, userID, issueID)
 | 
			
		||||
	return exists
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +108,7 @@ func CreateOrStopIssueStopwatch(user *User, issue *Issue) error {
 | 
			
		|||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		//if another stopwatch is running: stop it
 | 
			
		||||
		// if another stopwatch is running: stop it
 | 
			
		||||
		exists, sw, err := HasUserStopwatch(user.ID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,7 @@ func TestIssueAPIURL(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
func TestGetIssuesByIDs(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, PrepareTestDatabase())
 | 
			
		||||
	testSuccess := func(expectedIssueIDs []int64, nonExistentIssueIDs []int64) {
 | 
			
		||||
	testSuccess := func(expectedIssueIDs, nonExistentIssueIDs []int64) {
 | 
			
		||||
		issues, err := GetIssuesByIDs(append(expectedIssueIDs, nonExistentIssueIDs...))
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		actualIssueIDs := make([]int64, len(issues))
 | 
			
		||||
| 
						 | 
				
			
			@ -55,7 +55,6 @@ func TestGetIssuesByIDs(t *testing.T) {
 | 
			
		|||
			actualIssueIDs[i] = issue.ID
 | 
			
		||||
		}
 | 
			
		||||
		assert.Equal(t, expectedIssueIDs, actualIssueIDs)
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	testSuccess([]int64{1, 2, 3}, []int64{})
 | 
			
		||||
	testSuccess([]int64{1, 2, 3}, []int64{NonexistentID})
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +86,7 @@ func TestGetParticipantIDsByIssue(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestIssue_ClearLabels(t *testing.T) {
 | 
			
		||||
	var tests = []struct {
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		issueID int64
 | 
			
		||||
		doerID  int64
 | 
			
		||||
	}{
 | 
			
		||||
| 
						 | 
				
			
			@ -342,7 +341,7 @@ func testInsertIssue(t *testing.T, title, content string) {
 | 
			
		|||
	repo := AssertExistsAndLoadBean(t, &Repository{ID: 1}).(*Repository)
 | 
			
		||||
	user := AssertExistsAndLoadBean(t, &User{ID: 2}).(*User)
 | 
			
		||||
 | 
			
		||||
	var issue = Issue{
 | 
			
		||||
	issue := Issue{
 | 
			
		||||
		RepoID:   repo.ID,
 | 
			
		||||
		PosterID: user.ID,
 | 
			
		||||
		Title:    title,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,14 +193,14 @@ func TotalTimes(options FindTrackedTimesOptions) (map[*User]string, error) {
 | 
			
		|||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	//Adding total time per user ID
 | 
			
		||||
	// Adding total time per user ID
 | 
			
		||||
	totalTimesByUser := make(map[int64]int64)
 | 
			
		||||
	for _, t := range trackedTimes {
 | 
			
		||||
		totalTimesByUser[t.UserID] += t.Time
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	totalTimes := make(map[*User]string)
 | 
			
		||||
	//Fetching User and making time human readable
 | 
			
		||||
	// Fetching User and making time human readable
 | 
			
		||||
	for userID, total := range totalTimesByUser {
 | 
			
		||||
		user, err := GetUserByID(userID)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -283,7 +283,6 @@ func DeleteTime(t *TrackedTime) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func deleteTimes(e Engine, opts FindTrackedTimesOptions) (removedTime int64, err error) {
 | 
			
		||||
 | 
			
		||||
	removedTime, err = getTrackedSeconds(e, opts)
 | 
			
		||||
	if err != nil || removedTime == 0 {
 | 
			
		||||
		return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ func TestAddTime(t *testing.T) {
 | 
			
		|||
	issue1, err := GetIssueByID(1)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	//3661 = 1h 1min 1s
 | 
			
		||||
	// 3661 = 1h 1min 1s
 | 
			
		||||
	trackedTime, err := AddTime(user3, issue1, 3661, time.Now())
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, int64(3), trackedTime.UserID)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,7 +119,7 @@ func getIssueWatchers(e Engine, issueID int64, listOptions ListOptions) (IssueWa
 | 
			
		|||
	return watches, sess.Find(&watches)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func removeIssueWatchersByRepoID(e Engine, userID int64, repoID int64) error {
 | 
			
		||||
func removeIssueWatchersByRepoID(e Engine, userID, repoID int64) error {
 | 
			
		||||
	_, err := e.
 | 
			
		||||
		Join("INNER", "issue", "`issue`.id = `issue_watch`.issue_id AND `issue`.repo_id = ?", repoID).
 | 
			
		||||
		Where("`issue_watch`.user_id = ?", userID).
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ type crossReferencesContext struct {
 | 
			
		|||
	RemoveOld   bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func findOldCrossReferences(e Engine, issueID int64, commentID int64) ([]*Comment, error) {
 | 
			
		||||
func findOldCrossReferences(e Engine, issueID, commentID int64) ([]*Comment, error) {
 | 
			
		||||
	active := make([]*Comment, 0, 10)
 | 
			
		||||
	return active, e.Where("`ref_action` IN (?, ?, ?)", references.XRefActionNone, references.XRefActionCloses, references.XRefActionReopens).
 | 
			
		||||
		And("`ref_issue_id` = ?", issueID).
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ func findOldCrossReferences(e Engine, issueID int64, commentID int64) ([]*Commen
 | 
			
		|||
		Find(&active)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func neuterCrossReferences(e Engine, issueID int64, commentID int64) error {
 | 
			
		||||
func neuterCrossReferences(e Engine, issueID, commentID int64) error {
 | 
			
		||||
	active, err := findOldCrossReferences(e, issueID, commentID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +115,7 @@ func (issue *Issue) createCrossReferences(e *xorm.Session, ctx *crossReferencesC
 | 
			
		|||
		if ctx.OrigComment != nil {
 | 
			
		||||
			refCommentID = ctx.OrigComment.ID
 | 
			
		||||
		}
 | 
			
		||||
		var opts = &CreateCommentOptions{
 | 
			
		||||
		opts := &CreateCommentOptions{
 | 
			
		||||
			Type:         ctx.Type,
 | 
			
		||||
			Doer:         ctx.Doer,
 | 
			
		||||
			Repo:         xref.Issue.Repo,
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +194,6 @@ func (issue *Issue) updateCrossReferenceList(list []*crossReference, xref *cross
 | 
			
		|||
// verifyReferencedIssue will check if the referenced issue exists, and whether the doer has permission to do what
 | 
			
		||||
func (issue *Issue) verifyReferencedIssue(e Engine, ctx *crossReferencesContext, repo *Repository,
 | 
			
		||||
	ref references.IssueReference) (*Issue, references.XRefAction, error) {
 | 
			
		||||
 | 
			
		||||
	refIssue := &Issue{RepoID: repo.ID, Index: ref.Index}
 | 
			
		||||
	refAction := ref.Action
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,11 +49,9 @@ type LFSTokenResponse struct {
 | 
			
		|||
	Href   string            `json:"href"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrLFSObjectNotExist is returned from lfs models functions in order
 | 
			
		||||
	// to differentiate between database and missing object errors.
 | 
			
		||||
	ErrLFSObjectNotExist = errors.New("LFS Meta object does not exist")
 | 
			
		||||
)
 | 
			
		||||
// ErrLFSObjectNotExist is returned from lfs models functions in order
 | 
			
		||||
// to differentiate between database and missing object errors.
 | 
			
		||||
var ErrLFSObjectNotExist = errors.New("LFS Meta object does not exist")
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// LFSMetaFileIdentifier is the string appearing at the first line of LFS pointer files.
 | 
			
		||||
| 
						 | 
				
			
			@ -218,7 +216,7 @@ func IterateLFS(f func(mo *LFSMetaObject) error) error {
 | 
			
		|||
	var start int
 | 
			
		||||
	const batchSize = 100
 | 
			
		||||
	for {
 | 
			
		||||
		var mos = make([]*LFSMetaObject, 0, batchSize)
 | 
			
		||||
		mos := make([]*LFSMetaObject, 0, batchSize)
 | 
			
		||||
		if err := x.Limit(batchSize, start).Find(&mos); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -138,7 +138,7 @@ func DeleteLFSLockByID(id int64, u *User, force bool) (*LFSLock, error) {
 | 
			
		|||
	return lock, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//CheckLFSAccessForRepo check needed access mode base on action
 | 
			
		||||
// CheckLFSAccessForRepo check needed access mode base on action
 | 
			
		||||
func CheckLFSAccessForRepo(u *User, repo *Repository, mode AccessMode) error {
 | 
			
		||||
	if u == nil {
 | 
			
		||||
		return ErrLFSUnauthorizedAction{repo.ID, "undefined", mode}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -477,7 +477,7 @@ func LoginViaLDAP(user *User, login, password string, source *LoginSource) (*Use
 | 
			
		|||
		return nil, ErrUserNotExist{0, login, 0}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var isAttributeSSHPublicKeySet = len(strings.TrimSpace(source.LDAP().AttributeSSHPublicKey)) > 0
 | 
			
		||||
	isAttributeSSHPublicKeySet := len(strings.TrimSpace(source.LDAP().AttributeSSHPublicKey)) > 0
 | 
			
		||||
 | 
			
		||||
	// Update User admin flag if exist
 | 
			
		||||
	if isExist, err := IsUserExist(0, sr.Username); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,8 +55,8 @@ func insertIssue(sess *xorm.Session, issue *Issue) error {
 | 
			
		|||
	if _, err := sess.NoAutoTime().Insert(issue); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	var issueLabels = make([]IssueLabel, 0, len(issue.Labels))
 | 
			
		||||
	var labelIDs = make([]int64, 0, len(issue.Labels))
 | 
			
		||||
	issueLabels := make([]IssueLabel, 0, len(issue.Labels))
 | 
			
		||||
	labelIDs := make([]int64, 0, len(issue.Labels))
 | 
			
		||||
	for _, label := range issue.Labels {
 | 
			
		||||
		issueLabels = append(issueLabels, IssueLabel{
 | 
			
		||||
			IssueID: issue.ID,
 | 
			
		||||
| 
						 | 
				
			
			@ -137,7 +137,7 @@ func InsertIssueComments(comments []*Comment) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueIDs = make(map[int64]bool)
 | 
			
		||||
	issueIDs := make(map[int64]bool)
 | 
			
		||||
	for _, comment := range comments {
 | 
			
		||||
		issueIDs[comment.IssueID] = true
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ func updateMigrationServiceTypes(x *xorm.Engine) error {
 | 
			
		|||
	var last int
 | 
			
		||||
	const batchSize = 50
 | 
			
		||||
	for {
 | 
			
		||||
		var results = make([]Repository, 0, batchSize)
 | 
			
		||||
		results := make([]Repository, 0, batchSize)
 | 
			
		||||
		err := x.Where("original_url <> '' AND original_url IS NOT NULL").
 | 
			
		||||
			And("original_service_type = 0 OR original_service_type IS NULL").
 | 
			
		||||
			OrderBy("id").
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +48,7 @@ func updateMigrationServiceTypes(x *xorm.Engine) error {
 | 
			
		|||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
			var serviceType = PlainGitService
 | 
			
		||||
			serviceType := PlainGitService
 | 
			
		||||
			if strings.EqualFold(u.Host, "github.com") {
 | 
			
		||||
				serviceType = GithubService
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func removeLabelUneededCols(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	// Make sure the columns exist before dropping them
 | 
			
		||||
	type Label struct {
 | 
			
		||||
		QueryString string
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addTeamIncludesAllRepositories(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type Team struct {
 | 
			
		||||
		ID                      int64 `xorm:"pk autoincr"`
 | 
			
		||||
		IncludesAllRepositories bool  `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addTemplateToRepo(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type Repository struct {
 | 
			
		||||
		IsTemplate bool  `xorm:"INDEX NOT NULL DEFAULT false"`
 | 
			
		||||
		TemplateID int64 `xorm:"INDEX"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -380,7 +380,7 @@ func addBranchProtectionCanPushAndEnableWhitelist(x *xorm.Engine) error {
 | 
			
		|||
	}
 | 
			
		||||
	totalPages := totalIssues / pageSize
 | 
			
		||||
 | 
			
		||||
	var executeBody = func(page, pageSize int64) error {
 | 
			
		||||
	executeBody := func(page, pageSize int64) error {
 | 
			
		||||
		// Find latest review of each user in each pull request, and set official field if appropriate
 | 
			
		||||
		reviews := []*Review{}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func sanitizeOriginalURL(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type Repository struct {
 | 
			
		||||
		ID          int64
 | 
			
		||||
		OriginalURL string `xorm:"VARCHAR(2048)"`
 | 
			
		||||
| 
						 | 
				
			
			@ -20,7 +19,7 @@ func sanitizeOriginalURL(x *xorm.Engine) error {
 | 
			
		|||
	var last int
 | 
			
		||||
	const batchSize = 50
 | 
			
		||||
	for {
 | 
			
		||||
		var results = make([]Repository, 0, batchSize)
 | 
			
		||||
		results := make([]Repository, 0, batchSize)
 | 
			
		||||
		err := x.Where("original_url <> '' AND original_url IS NOT NULL").
 | 
			
		||||
			And("original_service_type = 0 OR original_service_type IS NULL").
 | 
			
		||||
			OrderBy("id").
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -151,7 +151,7 @@ func copyOldAvatarToNewLocation(userID int64, oldAvatar string) (string, error)
 | 
			
		|||
		return newAvatar, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := ioutil.WriteFile(filepath.Join(setting.Avatar.Path, newAvatar), data, 0666); err != nil {
 | 
			
		||||
	if err := ioutil.WriteFile(filepath.Join(setting.Avatar.Path, newAvatar), data, 0o666); err != nil {
 | 
			
		||||
		return "", fmt.Errorf("ioutil.WriteFile: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func extendTrackedTimes(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type TrackedTime struct {
 | 
			
		||||
		Time    int64 `xorm:"NOT NULL"`
 | 
			
		||||
		Deleted bool  `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addRequireSignedCommits(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type ProtectedBranch struct {
 | 
			
		||||
		RequireSignedCommits bool `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addUserRepoMissingColumns(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type VisibleType int
 | 
			
		||||
	type User struct {
 | 
			
		||||
		PasswdHashAlgo string      `xorm:"NOT NULL DEFAULT 'pbkdf2'"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ func fixMergeBase(x *xorm.Engine) error {
 | 
			
		|||
		MergedCommitID string `xorm:"VARCHAR(40)"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var limit = setting.Database.IterateBufferSize
 | 
			
		||||
	limit := setting.Database.IterateBufferSize
 | 
			
		||||
	if limit <= 0 {
 | 
			
		||||
		limit = 50
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func purgeUnusedDependencies(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	if _, err := x.Exec("DELETE FROM issue_dependency WHERE issue_id NOT IN (SELECT id FROM issue)"); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func expandWebhooks(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type HookEvents struct {
 | 
			
		||||
		Create               bool `json:"create"`
 | 
			
		||||
		Delete               bool `json:"delete"`
 | 
			
		||||
| 
						 | 
				
			
			@ -57,7 +56,7 @@ func expandWebhooks(x *xorm.Engine) error {
 | 
			
		|||
		if err := sess.Begin(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		var results = make([]Webhook, 0, batchSize)
 | 
			
		||||
		results := make([]Webhook, 0, batchSize)
 | 
			
		||||
		err := x.OrderBy("id").
 | 
			
		||||
			Limit(batchSize, last).
 | 
			
		||||
			Find(&results)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ func refixMergeBase(x *xorm.Engine) error {
 | 
			
		|||
		MergedCommitID string `xorm:"VARCHAR(40)"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var limit = setting.Database.IterateBufferSize
 | 
			
		||||
	limit := setting.Database.IterateBufferSize
 | 
			
		||||
	if limit <= 0 {
 | 
			
		||||
		limit = 50
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ func addCommitDivergenceToPulls(x *xorm.Engine) error {
 | 
			
		|||
		if err := sess.Begin(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		var results = make([]*PullRequest, 0, batchSize)
 | 
			
		||||
		results := make([]*PullRequest, 0, batchSize)
 | 
			
		||||
		err := sess.Where("has_merged = ?", false).OrderBy("id").Limit(batchSize, last).Find(&results)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func updateMatrixWebhookHTTPMethod(x *xorm.Engine) error {
 | 
			
		||||
	var matrixHookTaskType = 9 // value comes from the models package
 | 
			
		||||
	matrixHookTaskType := 9 // value comes from the models package
 | 
			
		||||
	type Webhook struct {
 | 
			
		||||
		HTTPMethod string
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addProjectsInfo(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	// Create new tables
 | 
			
		||||
	type (
 | 
			
		||||
		ProjectType      uint8
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ func createReviewsForCodeComments(x *xorm.Engine) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var updateComment = func(comments []*Comment) error {
 | 
			
		||||
	updateComment := func(comments []*Comment) error {
 | 
			
		||||
		sess := x.NewSession()
 | 
			
		||||
		defer sess.Close()
 | 
			
		||||
		if err := sess.Begin(); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -131,10 +131,10 @@ func createReviewsForCodeComments(x *xorm.Engine) error {
 | 
			
		|||
		return sess.Commit()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var start = 0
 | 
			
		||||
	var batchSize = 100
 | 
			
		||||
	start := 0
 | 
			
		||||
	batchSize := 100
 | 
			
		||||
	for {
 | 
			
		||||
		var comments = make([]*Comment, 0, batchSize)
 | 
			
		||||
		comments := make([]*Comment, 0, batchSize)
 | 
			
		||||
		if err := x.Where("review_id = 0 and type = 21").Limit(batchSize, start).Find(&comments); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,6 @@ func userPath(userName string) string {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func fixPublisherIDforTagReleases(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type Release struct {
 | 
			
		||||
		ID          int64
 | 
			
		||||
		RepoID      int64
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func fixRepoTopics(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type Topic struct {
 | 
			
		||||
		ID        int64  `xorm:"pk autoincr"`
 | 
			
		||||
		Name      string `xorm:"UNIQUE VARCHAR(25)"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,10 +51,12 @@ func updateCodeCommentReplies(x *xorm.Engine) error {
 | 
			
		|||
		AND comment.id != first.id
 | 
			
		||||
		AND comment.commit_sha != first.commit_sha`
 | 
			
		||||
 | 
			
		||||
	var sqlCmd string
 | 
			
		||||
	var start = 0
 | 
			
		||||
	var batchSize = 100
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	var (
 | 
			
		||||
		sqlCmd    string
 | 
			
		||||
		start     = 0
 | 
			
		||||
		batchSize = 100
 | 
			
		||||
		sess      = x.NewSession()
 | 
			
		||||
	)
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	for {
 | 
			
		||||
		if err := sess.Begin(); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +70,7 @@ func updateCodeCommentReplies(x *xorm.Engine) error {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var comments = make([]*Comment, 0, batchSize)
 | 
			
		||||
		comments := make([]*Comment, 0, batchSize)
 | 
			
		||||
 | 
			
		||||
		switch {
 | 
			
		||||
		case setting.Database.UseMySQL:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ func convertTaskTypeToString(x *xorm.Engine) error {
 | 
			
		|||
		MATRIX
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var hookTaskTypes = map[int]string{
 | 
			
		||||
	hookTaskTypes := map[int]string{
 | 
			
		||||
		GITEA:    "gitea",
 | 
			
		||||
		GOGS:     "gogs",
 | 
			
		||||
		SLACK:    "slack",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ func convertWebhookTaskTypeToString(x *xorm.Engine) error {
 | 
			
		|||
		MATRIX
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	var hookTaskTypes = map[int]string{
 | 
			
		||||
	hookTaskTypes := map[int]string{
 | 
			
		||||
		GITEA:    "gitea",
 | 
			
		||||
		GOGS:     "gogs",
 | 
			
		||||
		SLACK:    "slack",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addIssueDependencies(x *xorm.Engine) (err error) {
 | 
			
		||||
 | 
			
		||||
	type IssueDependency struct {
 | 
			
		||||
		ID           int64     `xorm:"pk autoincr"`
 | 
			
		||||
		UserID       int64     `xorm:"NOT NULL"`
 | 
			
		||||
| 
						 | 
				
			
			@ -90,7 +89,7 @@ func addIssueDependencies(x *xorm.Engine) (err error) {
 | 
			
		|||
		Created     time.Time              `xorm:"-"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//Updating existing issue units
 | 
			
		||||
	// Updating existing issue units
 | 
			
		||||
	units := make([]*RepoUnit, 0, 100)
 | 
			
		||||
	err = x.Where("`type` = ?", v16UnitTypeIssues).Find(&units)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -79,7 +79,6 @@ func addScratchHash(x *xorm.Engine) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return sess.Commit()
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func hashToken(token, salt string) string {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,7 @@ func addPullRequestRebaseWithMerge(x *xorm.Engine) error {
 | 
			
		|||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//Updating existing issue units
 | 
			
		||||
	// Updating existing issue units
 | 
			
		||||
	units := make([]*RepoUnit, 0, 100)
 | 
			
		||||
	if err := sess.Where("`type` = ?", v16UnitTypePRs).Find(&units); err != nil {
 | 
			
		||||
		return fmt.Errorf("Query repo units: %v", err)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func addCanCloseIssuesViaCommitInAnyBranch(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	type Repository struct {
 | 
			
		||||
		ID                              int64 `xorm:"pk autoincr"`
 | 
			
		||||
		CloseIssuesViaCommitInAnyBranch bool  `xorm:"NOT NULL DEFAULT false"`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,9 +29,9 @@ func addCommitStatusContext(x *xorm.Engine) error {
 | 
			
		|||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
 | 
			
		||||
	var start = 0
 | 
			
		||||
	start := 0
 | 
			
		||||
	for {
 | 
			
		||||
		var statuses = make([]*CommitStatus, 0, 100)
 | 
			
		||||
		statuses := make([]*CommitStatus, 0, 100)
 | 
			
		||||
		err := sess.OrderBy("id").Limit(100, start).Find(&statuses)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func removeLingeringIndexStatus(x *xorm.Engine) error {
 | 
			
		||||
 | 
			
		||||
	_, err := x.Exec(builder.Delete(builder.NotIn("`repo_id`", builder.Select("`id`").From("`repository`"))).From("`repo_indexer_status`"))
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ func deleteOrphanedAttachments(x *xorm.Engine) error {
 | 
			
		|||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
 | 
			
		||||
	var limit = setting.Database.IterateBufferSize
 | 
			
		||||
	limit := setting.Database.IterateBufferSize
 | 
			
		||||
	if limit <= 0 {
 | 
			
		||||
		limit = 50
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +42,7 @@ func deleteOrphanedAttachments(x *xorm.Engine) error {
 | 
			
		|||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		var ids = make([]int64, 0, limit)
 | 
			
		||||
		ids := make([]int64, 0, limit)
 | 
			
		||||
		for _, attachment := range attachements {
 | 
			
		||||
			ids = append(ids, attachment.ID)
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -305,7 +305,7 @@ func Ping() error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// DumpDatabase dumps all data from database according the special database SQL syntax to file system.
 | 
			
		||||
func DumpDatabase(filePath string, dbType string) error {
 | 
			
		||||
func DumpDatabase(filePath, dbType string) error {
 | 
			
		||||
	var tbs []*schemas.Table
 | 
			
		||||
	for _, t := range tables {
 | 
			
		||||
		t, err := x.TableInfo(t)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -182,7 +182,6 @@ func createOrUpdateIssueNotifications(e Engine, issueID, commentID, notification
 | 
			
		|||
	// init
 | 
			
		||||
	var toNotify map[int64]struct{}
 | 
			
		||||
	notifications, err := getNotificationsByIssueID(e, issueID)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -481,7 +480,7 @@ func (nl NotificationList) LoadAttributes() (err error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (nl NotificationList) getPendingRepoIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(nl))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(nl))
 | 
			
		||||
	for _, notification := range nl {
 | 
			
		||||
		if notification.Repository != nil {
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			@ -499,11 +498,11 @@ func (nl NotificationList) LoadRepos() (RepositoryList, []int, error) {
 | 
			
		|||
		return RepositoryList{}, []int{}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var repoIDs = nl.getPendingRepoIDs()
 | 
			
		||||
	var repos = make(map[int64]*Repository, len(repoIDs))
 | 
			
		||||
	var left = len(repoIDs)
 | 
			
		||||
	repoIDs := nl.getPendingRepoIDs()
 | 
			
		||||
	repos := make(map[int64]*Repository, len(repoIDs))
 | 
			
		||||
	left := len(repoIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -532,7 +531,7 @@ func (nl NotificationList) LoadRepos() (RepositoryList, []int, error) {
 | 
			
		|||
 | 
			
		||||
	failed := []int{}
 | 
			
		||||
 | 
			
		||||
	var reposList = make(RepositoryList, 0, len(repoIDs))
 | 
			
		||||
	reposList := make(RepositoryList, 0, len(repoIDs))
 | 
			
		||||
	for i, notification := range nl {
 | 
			
		||||
		if notification.Repository == nil {
 | 
			
		||||
			notification.Repository = repos[notification.RepoID]
 | 
			
		||||
| 
						 | 
				
			
			@ -557,7 +556,7 @@ func (nl NotificationList) LoadRepos() (RepositoryList, []int, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (nl NotificationList) getPendingIssueIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(nl))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(nl))
 | 
			
		||||
	for _, notification := range nl {
 | 
			
		||||
		if notification.Issue != nil {
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			@ -575,11 +574,11 @@ func (nl NotificationList) LoadIssues() ([]int, error) {
 | 
			
		|||
		return []int{}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueIDs = nl.getPendingIssueIDs()
 | 
			
		||||
	var issues = make(map[int64]*Issue, len(issueIDs))
 | 
			
		||||
	var left = len(issueIDs)
 | 
			
		||||
	issueIDs := nl.getPendingIssueIDs()
 | 
			
		||||
	issues := make(map[int64]*Issue, len(issueIDs))
 | 
			
		||||
	left := len(issueIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -643,7 +642,7 @@ func (nl NotificationList) Without(failures []int) NotificationList {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (nl NotificationList) getPendingCommentIDs() []int64 {
 | 
			
		||||
	var ids = make(map[int64]struct{}, len(nl))
 | 
			
		||||
	ids := make(map[int64]struct{}, len(nl))
 | 
			
		||||
	for _, notification := range nl {
 | 
			
		||||
		if notification.CommentID == 0 || notification.Comment != nil {
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			@ -661,11 +660,11 @@ func (nl NotificationList) LoadComments() ([]int, error) {
 | 
			
		|||
		return []int{}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var commentIDs = nl.getPendingCommentIDs()
 | 
			
		||||
	var comments = make(map[int64]*Comment, len(commentIDs))
 | 
			
		||||
	var left = len(commentIDs)
 | 
			
		||||
	commentIDs := nl.getPendingCommentIDs()
 | 
			
		||||
	comments := make(map[int64]*Comment, len(commentIDs))
 | 
			
		||||
	left := len(commentIDs)
 | 
			
		||||
	for left > 0 {
 | 
			
		||||
		var limit = defaultMaxInSize
 | 
			
		||||
		limit := defaultMaxInSize
 | 
			
		||||
		if left < limit {
 | 
			
		||||
			limit = left
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -789,7 +788,6 @@ func getNotificationByID(e Engine, notificationID int64) (*Notification, error)
 | 
			
		|||
	ok, err := e.
 | 
			
		||||
		Where("id = ?", notificationID).
 | 
			
		||||
		Get(notification)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -802,7 +800,7 @@ func getNotificationByID(e Engine, notificationID int64) (*Notification, error)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// UpdateNotificationStatuses updates the statuses of all of a user's notifications that are of the currentStatus type to the desiredStatus
 | 
			
		||||
func UpdateNotificationStatuses(user *User, currentStatus NotificationStatus, desiredStatus NotificationStatus) error {
 | 
			
		||||
func UpdateNotificationStatuses(user *User, currentStatus, desiredStatus NotificationStatus) error {
 | 
			
		||||
	n := &Notification{Status: desiredStatus, UpdatedBy: user.ID}
 | 
			
		||||
	_, err := x.
 | 
			
		||||
		Where("user_id = ? AND status = ?", user.ID, currentStatus).
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,8 @@ var OAuth2Providers = map[string]OAuth2Provider{
 | 
			
		|||
	"bitbucket": {Name: "bitbucket", DisplayName: "Bitbucket", Image: "/img/auth/bitbucket.png"},
 | 
			
		||||
	"dropbox":   {Name: "dropbox", DisplayName: "Dropbox", Image: "/img/auth/dropbox.png"},
 | 
			
		||||
	"facebook":  {Name: "facebook", DisplayName: "Facebook", Image: "/img/auth/facebook.png"},
 | 
			
		||||
	"github": {Name: "github", DisplayName: "GitHub", Image: "/img/auth/github.png",
 | 
			
		||||
	"github": {
 | 
			
		||||
		Name: "github", DisplayName: "GitHub", Image: "/img/auth/github.png",
 | 
			
		||||
		CustomURLMapping: &oauth2.CustomURLMapping{
 | 
			
		||||
			TokenURL:   oauth2.GetDefaultTokenURL("github"),
 | 
			
		||||
			AuthURL:    oauth2.GetDefaultAuthURL("github"),
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +35,8 @@ var OAuth2Providers = map[string]OAuth2Provider{
 | 
			
		|||
			EmailURL:   oauth2.GetDefaultEmailURL("github"),
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	"gitlab": {Name: "gitlab", DisplayName: "GitLab", Image: "/img/auth/gitlab.png",
 | 
			
		||||
	"gitlab": {
 | 
			
		||||
		Name: "gitlab", DisplayName: "GitLab", Image: "/img/auth/gitlab.png",
 | 
			
		||||
		CustomURLMapping: &oauth2.CustomURLMapping{
 | 
			
		||||
			TokenURL:   oauth2.GetDefaultTokenURL("gitlab"),
 | 
			
		||||
			AuthURL:    oauth2.GetDefaultAuthURL("gitlab"),
 | 
			
		||||
| 
						 | 
				
			
			@ -45,14 +47,16 @@ var OAuth2Providers = map[string]OAuth2Provider{
 | 
			
		|||
	"openidConnect": {Name: "openidConnect", DisplayName: "OpenID Connect", Image: "/img/auth/openid_connect.svg"},
 | 
			
		||||
	"twitter":       {Name: "twitter", DisplayName: "Twitter", Image: "/img/auth/twitter.png"},
 | 
			
		||||
	"discord":       {Name: "discord", DisplayName: "Discord", Image: "/img/auth/discord.png"},
 | 
			
		||||
	"gitea": {Name: "gitea", DisplayName: "Gitea", Image: "/img/auth/gitea.png",
 | 
			
		||||
	"gitea": {
 | 
			
		||||
		Name: "gitea", DisplayName: "Gitea", Image: "/img/auth/gitea.png",
 | 
			
		||||
		CustomURLMapping: &oauth2.CustomURLMapping{
 | 
			
		||||
			TokenURL:   oauth2.GetDefaultTokenURL("gitea"),
 | 
			
		||||
			AuthURL:    oauth2.GetDefaultAuthURL("gitea"),
 | 
			
		||||
			ProfileURL: oauth2.GetDefaultProfileURL("gitea"),
 | 
			
		||||
		},
 | 
			
		||||
	},
 | 
			
		||||
	"nextcloud": {Name: "nextcloud", DisplayName: "Nextcloud", Image: "/img/auth/nextcloud.png",
 | 
			
		||||
	"nextcloud": {
 | 
			
		||||
		Name: "nextcloud", DisplayName: "Nextcloud", Image: "/img/auth/nextcloud.png",
 | 
			
		||||
		CustomURLMapping: &oauth2.CustomURLMapping{
 | 
			
		||||
			TokenURL:   oauth2.GetDefaultTokenURL("nextcloud"),
 | 
			
		||||
			AuthURL:    oauth2.GetDefaultAuthURL("nextcloud"),
 | 
			
		||||
| 
						 | 
				
			
			@ -60,7 +64,8 @@ var OAuth2Providers = map[string]OAuth2Provider{
 | 
			
		|||
		},
 | 
			
		||||
	},
 | 
			
		||||
	"yandex": {Name: "yandex", DisplayName: "Yandex", Image: "/img/auth/yandex.png"},
 | 
			
		||||
	"mastodon": {Name: "mastodon", DisplayName: "Mastodon", Image: "/img/auth/mastodon.png",
 | 
			
		||||
	"mastodon": {
 | 
			
		||||
		Name: "mastodon", DisplayName: "Mastodon", Image: "/img/auth/mastodon.png",
 | 
			
		||||
		CustomURLMapping: &oauth2.CustomURLMapping{
 | 
			
		||||
			AuthURL: oauth2.GetDefaultAuthURL("mastodon"),
 | 
			
		||||
		},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,8 +102,8 @@ func FindOrgMembers(opts *FindOrgMembersOpts) (UserList, map[int64]bool, error)
 | 
			
		|||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var ids = make([]int64, len(ous))
 | 
			
		||||
	var idsIsPublic = make(map[int64]bool, len(ous))
 | 
			
		||||
	ids := make([]int64, len(ous))
 | 
			
		||||
	idsIsPublic := make(map[int64]bool, len(ous))
 | 
			
		||||
	for i, ou := range ous {
 | 
			
		||||
		ids[i] = ou.UID
 | 
			
		||||
		idsIsPublic[ou.UID] = ou.IsPublic
 | 
			
		||||
| 
						 | 
				
			
			@ -205,7 +205,7 @@ func CreateOrganization(org, owner *User) (err error) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// insert units for team
 | 
			
		||||
	var units = make([]TeamUnit, 0, len(AllRepoUnitTypes))
 | 
			
		||||
	units := make([]TeamUnit, 0, len(AllRepoUnitTypes))
 | 
			
		||||
	for _, tp := range AllRepoUnitTypes {
 | 
			
		||||
		units = append(units, TeamUnit{
 | 
			
		||||
			OrgID:  org.ID,
 | 
			
		||||
| 
						 | 
				
			
			@ -437,11 +437,11 @@ func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// HasOrgVisible tells if the given user can see the given org
 | 
			
		||||
func HasOrgVisible(org *User, user *User) bool {
 | 
			
		||||
func HasOrgVisible(org, user *User) bool {
 | 
			
		||||
	return hasOrgVisible(x, org, user)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func hasOrgVisible(e Engine, org *User, user *User) bool {
 | 
			
		||||
func hasOrgVisible(e Engine, org, user *User) bool {
 | 
			
		||||
	// Not SignedUser
 | 
			
		||||
	if user == nil {
 | 
			
		||||
		return org.Visibility == structs.VisibleTypePublic
 | 
			
		||||
| 
						 | 
				
			
			@ -813,7 +813,7 @@ func (org *User) AccessibleTeamReposEnv(team *Team) AccessibleReposEnvironment {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (env *accessibleReposEnv) cond() builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if env.team != nil {
 | 
			
		||||
		cond = cond.And(builder.Eq{"team_repo.team_id": env.team.ID})
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ func SearchTeam(opts *SearchTeamOptions) ([]*Team, int64, error) {
 | 
			
		|||
		opts.PageSize = 10
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
 | 
			
		||||
	if len(opts.Keyword) > 0 {
 | 
			
		||||
		lowerKeyword := strings.ToLower(opts.Keyword)
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +80,6 @@ func SearchTeam(opts *SearchTeamOptions) ([]*Team, int64, error) {
 | 
			
		|||
	count, err := sess.
 | 
			
		||||
		Where(cond).
 | 
			
		||||
		Count(new(Team))
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, 0, err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -109,7 +108,6 @@ func (t *Team) ColorFormat(s fmt.State) {
 | 
			
		|||
		t.Name,
 | 
			
		||||
		log.NewColoredIDValue(t.OrgID),
 | 
			
		||||
		t.Authorize)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetUnits return a list of available units for a team
 | 
			
		||||
| 
						 | 
				
			
			@ -608,7 +606,7 @@ func GetTeamNamesByID(teamIDs []int64) ([]string, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// UpdateTeam updates information of team.
 | 
			
		||||
func UpdateTeam(t *Team, authChanged bool, includeAllChanged bool) (err error) {
 | 
			
		||||
func UpdateTeam(t *Team, authChanged, includeAllChanged bool) (err error) {
 | 
			
		||||
	if len(t.Name) == 0 {
 | 
			
		||||
		return errors.New("empty team name")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -963,7 +961,7 @@ func isUserInTeams(e Engine, userID int64, teamIDs []int64) (bool, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// UsersInTeamsCount counts the number of users which are in userIDs and teamIDs
 | 
			
		||||
func UsersInTeamsCount(userIDs []int64, teamIDs []int64) (int64, error) {
 | 
			
		||||
func UsersInTeamsCount(userIDs, teamIDs []int64) (int64, error) {
 | 
			
		||||
	var ids []int64
 | 
			
		||||
	if err := x.In("uid", userIDs).In("team_id", teamIDs).
 | 
			
		||||
		Table("team_user").
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -364,7 +364,7 @@ func TestHasTeamRepo(t *testing.T) {
 | 
			
		|||
func TestUsersInTeamsCount(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	test := func(teamIDs []int64, userIDs []int64, expected int64) {
 | 
			
		||||
	test := func(teamIDs, userIDs []int64, expected int64) {
 | 
			
		||||
		count, err := UsersInTeamsCount(teamIDs, userIDs)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
		assert.Equal(t, expected, count)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -374,12 +374,14 @@ func TestGetOrgUsersByUserID(t *testing.T) {
 | 
			
		|||
			ID:       orgUsers[0].ID,
 | 
			
		||||
			OrgID:    6,
 | 
			
		||||
			UID:      5,
 | 
			
		||||
			IsPublic: true}, *orgUsers[0])
 | 
			
		||||
			IsPublic: true,
 | 
			
		||||
		}, *orgUsers[0])
 | 
			
		||||
		assert.Equal(t, OrgUser{
 | 
			
		||||
			ID:       orgUsers[1].ID,
 | 
			
		||||
			OrgID:    7,
 | 
			
		||||
			UID:      5,
 | 
			
		||||
			IsPublic: false}, *orgUsers[1])
 | 
			
		||||
			IsPublic: false,
 | 
			
		||||
		}, *orgUsers[1])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	publicOrgUsers, err := GetOrgUsersByUserID(5, &SearchOrganizationsOptions{All: false})
 | 
			
		||||
| 
						 | 
				
			
			@ -406,12 +408,14 @@ func TestGetOrgUsersByOrgID(t *testing.T) {
 | 
			
		|||
			ID:       orgUsers[0].ID,
 | 
			
		||||
			OrgID:    3,
 | 
			
		||||
			UID:      2,
 | 
			
		||||
			IsPublic: true}, *orgUsers[0])
 | 
			
		||||
			IsPublic: true,
 | 
			
		||||
		}, *orgUsers[0])
 | 
			
		||||
		assert.Equal(t, OrgUser{
 | 
			
		||||
			ID:       orgUsers[1].ID,
 | 
			
		||||
			OrgID:    3,
 | 
			
		||||
			UID:      4,
 | 
			
		||||
			IsPublic: false}, *orgUsers[1])
 | 
			
		||||
			IsPublic: false,
 | 
			
		||||
		}, *orgUsers[1])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	orgUsers, err = GetOrgUsersByOrgID(&FindOrgMembersOpts{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -89,7 +89,6 @@ func GetProjects(opts ProjectSearchOptions) ([]*Project, int64, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func getProjects(e Engine, opts ProjectSearchOptions) ([]*Project, int64, error) {
 | 
			
		||||
 | 
			
		||||
	projects := make([]*Project, 0, setting.UI.IssuePagingNum)
 | 
			
		||||
 | 
			
		||||
	var cond builder.Cond = builder.Eq{"repo_id": opts.RepoID}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,7 +58,6 @@ func IsProjectBoardTypeValid(p ProjectBoardType) bool {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func createBoardsForProjectsType(sess *xorm.Session, project *Project) error {
 | 
			
		||||
 | 
			
		||||
	var items []string
 | 
			
		||||
 | 
			
		||||
	switch project.BoardType {
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +78,7 @@ func createBoardsForProjectsType(sess *xorm.Session, project *Project) error {
 | 
			
		|||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var boards = make([]ProjectBoard, 0, len(items))
 | 
			
		||||
	boards := make([]ProjectBoard, 0, len(items))
 | 
			
		||||
 | 
			
		||||
	for _, v := range items {
 | 
			
		||||
		boards = append(boards, ProjectBoard{
 | 
			
		||||
| 
						 | 
				
			
			@ -186,7 +185,7 @@ func GetProjectBoards(projectID int64) (ProjectBoardList, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func getProjectBoards(e Engine, projectID int64) ([]*ProjectBoard, error) {
 | 
			
		||||
	var boards = make([]*ProjectBoard, 0, 5)
 | 
			
		||||
	boards := make([]*ProjectBoard, 0, 5)
 | 
			
		||||
 | 
			
		||||
	if err := e.Where("project_id=? AND `default`=?", projectID, false).OrderBy("Sorting").Find(&boards); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
| 
						 | 
				
			
			@ -294,7 +293,6 @@ func UpdateProjectBoardSorting(bs ProjectBoardList) error {
 | 
			
		|||
		_, err := x.ID(bs[i].ID).Cols(
 | 
			
		||||
			"sorting",
 | 
			
		||||
		).Update(bs[i])
 | 
			
		||||
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -124,7 +124,6 @@ func (p *Project) NumOpenIssues() int {
 | 
			
		|||
 | 
			
		||||
// ChangeProjectAssign changes the project associated with an issue
 | 
			
		||||
func ChangeProjectAssign(issue *Issue, doer *User, newProjectID int64) error {
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err := sess.Begin(); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -139,7 +138,6 @@ func ChangeProjectAssign(issue *Issue, doer *User, newProjectID int64) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func addUpdateIssueProject(e *xorm.Session, issue *Issue, doer *User, newProjectID int64) error {
 | 
			
		||||
 | 
			
		||||
	oldProjectID := issue.projectID(e)
 | 
			
		||||
 | 
			
		||||
	if _, err := e.Where("project_issue.issue_id=?", issue.ID).Delete(&ProjectIssue{}); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -179,7 +177,6 @@ func addUpdateIssueProject(e *xorm.Session, issue *Issue, doer *User, newProject
 | 
			
		|||
 | 
			
		||||
// MoveIssueAcrossProjectBoards move a card from one board to another
 | 
			
		||||
func MoveIssueAcrossProjectBoards(issue *Issue, board *ProjectBoard) error {
 | 
			
		||||
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
	if err := sess.Begin(); err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,7 +15,7 @@ import (
 | 
			
		|||
func TestIsProjectTypeValid(t *testing.T) {
 | 
			
		||||
	const UnknownType ProjectType = 15
 | 
			
		||||
 | 
			
		||||
	var cases = []struct {
 | 
			
		||||
	cases := []struct {
 | 
			
		||||
		typ   ProjectType
 | 
			
		||||
		valid bool
 | 
			
		||||
	}{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -241,7 +241,6 @@ func (pr *PullRequest) getApprovalCounts(e Engine) ([]*ReviewCount, error) {
 | 
			
		|||
 | 
			
		||||
// GetApprovers returns the approvers of the pull request
 | 
			
		||||
func (pr *PullRequest) GetApprovers() string {
 | 
			
		||||
 | 
			
		||||
	stringBuilder := strings.Builder{}
 | 
			
		||||
	if err := pr.getReviewedByLines(&stringBuilder); err != nil {
 | 
			
		||||
		log.Error("Unable to getReviewedByLines: Error: %v", err)
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +503,7 @@ func GetLatestPullRequestByHeadInfo(repoID int64, branch string) (*PullRequest,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// GetPullRequestByIndex returns a pull request by the given index
 | 
			
		||||
func GetPullRequestByIndex(repoID int64, index int64) (*PullRequest, error) {
 | 
			
		||||
func GetPullRequestByIndex(repoID, index int64) (*PullRequest, error) {
 | 
			
		||||
	pr := &PullRequest{
 | 
			
		||||
		BaseRepoID: repoID,
 | 
			
		||||
		Index:      index,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -173,7 +173,7 @@ type FindReleasesOptions struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (opts *FindReleasesOptions) toConds(repoID int64) builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	cond = cond.And(builder.Eq{"repo_id": repoID})
 | 
			
		||||
 | 
			
		||||
	if !opts.IncludeDrafts {
 | 
			
		||||
| 
						 | 
				
			
			@ -246,10 +246,12 @@ type releaseMetaSearch struct {
 | 
			
		|||
func (s releaseMetaSearch) Len() int {
 | 
			
		||||
	return len(s.ID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s releaseMetaSearch) Swap(i, j int) {
 | 
			
		||||
	s.ID[i], s.ID[j] = s.ID[j], s.ID[i]
 | 
			
		||||
	s.Rel[i], s.Rel[j] = s.Rel[j], s.Rel[i]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s releaseMetaSearch) Less(i, j int) bool {
 | 
			
		||||
	return s.ID[i] < s.ID[j]
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -269,7 +271,7 @@ func getReleaseAttachments(e Engine, rels ...*Release) (err error) {
 | 
			
		|||
	//    then merge join them
 | 
			
		||||
 | 
			
		||||
	// Sort
 | 
			
		||||
	var sortedRels = releaseMetaSearch{ID: make([]int64, len(rels)), Rel: make([]*Release, len(rels))}
 | 
			
		||||
	sortedRels := releaseMetaSearch{ID: make([]int64, len(rels)), Rel: make([]*Release, len(rels))}
 | 
			
		||||
	var attachments []*Attachment
 | 
			
		||||
	for index, element := range rels {
 | 
			
		||||
		element.Attachments = []*Attachment{}
 | 
			
		||||
| 
						 | 
				
			
			@ -288,7 +290,7 @@ func getReleaseAttachments(e Engine, rels ...*Release) (err error) {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// merge join
 | 
			
		||||
	var currentIndex = 0
 | 
			
		||||
	currentIndex := 0
 | 
			
		||||
	for _, attachment := range attachments {
 | 
			
		||||
		for sortedRels.ID[currentIndex] < attachment.ReleaseID {
 | 
			
		||||
			currentIndex++
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1070,7 +1070,7 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository, overwriteO
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	// insert units for repo
 | 
			
		||||
	var units = make([]RepoUnit, 0, len(DefaultRepoUnits))
 | 
			
		||||
	units := make([]RepoUnit, 0, len(DefaultRepoUnits))
 | 
			
		||||
	for _, tp := range DefaultRepoUnits {
 | 
			
		||||
		if tp == UnitTypeIssues {
 | 
			
		||||
			units = append(units, RepoUnit{
 | 
			
		||||
| 
						 | 
				
			
			@ -1636,7 +1636,7 @@ func GetRepositoryByIDCtx(ctx DBContext, id int64) (*Repository, error) {
 | 
			
		|||
 | 
			
		||||
// GetRepositoriesMapByIDs returns the repositories by given id slice.
 | 
			
		||||
func GetRepositoriesMapByIDs(ids []int64) (map[int64]*Repository, error) {
 | 
			
		||||
	var repos = make(map[int64]*Repository, len(ids))
 | 
			
		||||
	repos := make(map[int64]*Repository, len(ids))
 | 
			
		||||
	return repos, x.In("id", ids).Find(&repos)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1646,7 +1646,7 @@ func GetUserRepositories(opts *SearchRepoOptions) ([]*Repository, int64, error)
 | 
			
		|||
		opts.OrderBy = "updated_unix DESC"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	cond = cond.And(builder.Eq{"owner_id": opts.Actor.ID})
 | 
			
		||||
	if !opts.Private {
 | 
			
		||||
		cond = cond.And(builder.Eq{"is_private": false})
 | 
			
		||||
| 
						 | 
				
			
			@ -2096,9 +2096,9 @@ func DoctorUserStarNum() (err error) {
 | 
			
		|||
// IterateRepository iterate repositories
 | 
			
		||||
func IterateRepository(f func(repo *Repository) error) error {
 | 
			
		||||
	var start int
 | 
			
		||||
	var batchSize = setting.Database.IterateBufferSize
 | 
			
		||||
	batchSize := setting.Database.IterateBufferSize
 | 
			
		||||
	for {
 | 
			
		||||
		var repos = make([]*Repository, 0, batchSize)
 | 
			
		||||
		repos := make([]*Repository, 0, batchSize)
 | 
			
		||||
		if err := x.Limit(batchSize, start).Find(&repos); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -193,7 +193,7 @@ func CopyLanguageStat(originalRepo, destRepo *Repository) error {
 | 
			
		|||
			RepoLang[i].RepoID = destRepo.ID
 | 
			
		||||
			RepoLang[i].CreatedUnix = timeutil.TimeStampNow()
 | 
			
		||||
		}
 | 
			
		||||
		//update destRepo's indexer status
 | 
			
		||||
		// update destRepo's indexer status
 | 
			
		||||
		tmpCommitID := RepoLang[0].CommitID
 | 
			
		||||
		if err := destRepo.updateIndexerStatus(sess, RepoIndexerTypeStats, tmpCommitID); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ type SearchRepoOptions struct {
 | 
			
		|||
	LowerNames []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//SearchOrderBy is used to sort the result
 | 
			
		||||
// SearchOrderBy is used to sort the result
 | 
			
		||||
type SearchOrderBy string
 | 
			
		||||
 | 
			
		||||
func (s SearchOrderBy) String() string {
 | 
			
		||||
| 
						 | 
				
			
			@ -207,7 +207,7 @@ const (
 | 
			
		|||
 | 
			
		||||
// SearchRepositoryCondition creates a query condition according search repository options
 | 
			
		||||
func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
 | 
			
		||||
	if opts.Private {
 | 
			
		||||
		if opts.Actor != nil && !opts.Actor.IsAdmin && opts.Actor.ID != opts.OwnerID {
 | 
			
		||||
| 
						 | 
				
			
			@ -242,7 +242,7 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
 | 
			
		|||
 | 
			
		||||
	// Restrict repositories to those the OwnerID owns or contributes to as per opts.Collaborate
 | 
			
		||||
	if opts.OwnerID > 0 {
 | 
			
		||||
		var accessCond = builder.NewCond()
 | 
			
		||||
		accessCond := builder.NewCond()
 | 
			
		||||
		if opts.Collaborate != util.OptionalBoolTrue {
 | 
			
		||||
			accessCond = builder.Eq{"owner_id": opts.OwnerID}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -301,7 +301,7 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
 | 
			
		|||
 | 
			
		||||
	if opts.Keyword != "" {
 | 
			
		||||
		// separate keyword
 | 
			
		||||
		var subQueryCond = builder.NewCond()
 | 
			
		||||
		subQueryCond := builder.NewCond()
 | 
			
		||||
		for _, v := range strings.Split(opts.Keyword, ",") {
 | 
			
		||||
			if opts.TopicOnly {
 | 
			
		||||
				subQueryCond = subQueryCond.Or(builder.Eq{"topic.name": strings.ToLower(v)})
 | 
			
		||||
| 
						 | 
				
			
			@ -314,9 +314,9 @@ func SearchRepositoryCondition(opts *SearchRepoOptions) builder.Cond {
 | 
			
		|||
			Where(subQueryCond).
 | 
			
		||||
			GroupBy("repo_topic.repo_id")
 | 
			
		||||
 | 
			
		||||
		var keywordCond = builder.In("id", subQuery)
 | 
			
		||||
		keywordCond := builder.In("id", subQuery)
 | 
			
		||||
		if !opts.TopicOnly {
 | 
			
		||||
			var likes = builder.NewCond()
 | 
			
		||||
			likes := builder.NewCond()
 | 
			
		||||
			for _, v := range strings.Split(opts.Keyword, ",") {
 | 
			
		||||
				likes = likes.Or(builder.Like{"lower_name", strings.ToLower(v)})
 | 
			
		||||
				if opts.IncludeDescription {
 | 
			
		||||
| 
						 | 
				
			
			@ -381,7 +381,6 @@ func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loa
 | 
			
		|||
	count, err := sess.
 | 
			
		||||
		Where(cond).
 | 
			
		||||
		Count(new(Repository))
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, 0, fmt.Errorf("Count: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -406,7 +405,7 @@ func SearchRepositoryByCondition(opts *SearchRepoOptions, cond builder.Cond, loa
 | 
			
		|||
 | 
			
		||||
// accessibleRepositoryCondition takes a user a returns a condition for checking if a repository is accessible
 | 
			
		||||
func accessibleRepositoryCondition(user *User) builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
 | 
			
		||||
	if user == nil || !user.IsRestricted || user.ID <= 0 {
 | 
			
		||||
		orgVisibilityLimit := []structs.VisibleType{structs.VisibleTypePrivate}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -119,90 +119,146 @@ func TestSearchRepository(t *testing.T) {
 | 
			
		|||
		opts  *SearchRepoOptions
 | 
			
		||||
		count int
 | 
			
		||||
	}{
 | 
			
		||||
		{name: "PublicRepositoriesByName",
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesByName",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{PageSize: 10}, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 7},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesByName",
 | 
			
		||||
			count: 7,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesByName",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{Page: 1, PageSize: 10}, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 14},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesByNameWithPagesizeLimitFirstPage",
 | 
			
		||||
			count: 14,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesByNameWithPagesizeLimitFirstPage",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{Page: 1, PageSize: 5}, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 14},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesByNameWithPagesizeLimitSecondPage",
 | 
			
		||||
			count: 14,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesByNameWithPagesizeLimitSecondPage",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{Page: 2, PageSize: 5}, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 14},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesByNameWithPagesizeLimitThirdPage",
 | 
			
		||||
			count: 14,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesByNameWithPagesizeLimitThirdPage",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{Page: 3, PageSize: 5}, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 14},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesByNameWithPagesizeLimitFourthPage",
 | 
			
		||||
			count: 14,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesByNameWithPagesizeLimitFourthPage",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{Page: 3, PageSize: 5}, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 14},
 | 
			
		||||
		{name: "PublicRepositoriesOfUser",
 | 
			
		||||
			count: 14,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfUser",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 2},
 | 
			
		||||
		{name: "PublicRepositoriesOfUser2",
 | 
			
		||||
			count: 2,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfUser2",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 18, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 0},
 | 
			
		||||
		{name: "PublicRepositoriesOfUser3",
 | 
			
		||||
			count: 0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfUser3",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 20, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 2},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfUser",
 | 
			
		||||
			count: 2,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfUser",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 4},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfUser2",
 | 
			
		||||
			count: 4,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfUser2",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 18, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 0},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfUser3",
 | 
			
		||||
			count: 0,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfUser3",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 20, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 4},
 | 
			
		||||
		{name: "PublicRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			count: 4,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15},
 | 
			
		||||
			count: 5},
 | 
			
		||||
		{name: "PublicRepositoriesOfUser2IncludingCollaborative",
 | 
			
		||||
			count: 5,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfUser2IncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 18},
 | 
			
		||||
			count: 1},
 | 
			
		||||
		{name: "PublicRepositoriesOfUser3IncludingCollaborative",
 | 
			
		||||
			count: 1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfUser3IncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 20},
 | 
			
		||||
			count: 3},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			count: 3,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true},
 | 
			
		||||
			count: 9},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfUser2IncludingCollaborative",
 | 
			
		||||
			count: 9,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfUser2IncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 18, Private: true},
 | 
			
		||||
			count: 4},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfUser3IncludingCollaborative",
 | 
			
		||||
			count: 4,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfUser3IncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 20, Private: true},
 | 
			
		||||
			count: 7},
 | 
			
		||||
		{name: "PublicRepositoriesOfOrganization",
 | 
			
		||||
			count: 7,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicRepositoriesOfOrganization",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 1},
 | 
			
		||||
		{name: "PublicAndPrivateRepositoriesOfOrganization",
 | 
			
		||||
			count: 1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "PublicAndPrivateRepositoriesOfOrganization",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, Private: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 2},
 | 
			
		||||
		{name: "AllPublic/PublicRepositoriesByName",
 | 
			
		||||
			count: 2,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicRepositoriesByName",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{PageSize: 10}, AllPublic: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 7},
 | 
			
		||||
		{name: "AllPublic/PublicAndPrivateRepositoriesByName",
 | 
			
		||||
			count: 7,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicAndPrivateRepositoriesByName",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "big_test_", ListOptions: ListOptions{Page: 1, PageSize: 10}, Private: true, AllPublic: true, Collaborate: util.OptionalBoolFalse},
 | 
			
		||||
			count: 14},
 | 
			
		||||
		{name: "AllPublic/PublicRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			count: 14,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, AllPublic: true, Template: util.OptionalBoolFalse},
 | 
			
		||||
			count: 28},
 | 
			
		||||
		{name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			count: 28,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborative",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, AllPublic: true, AllLimited: true, Template: util.OptionalBoolFalse},
 | 
			
		||||
			count: 33},
 | 
			
		||||
		{name: "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName",
 | 
			
		||||
			count: 33,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicAndPrivateRepositoriesOfUserIncludingCollaborativeByName",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "test", ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 15, Private: true, AllPublic: true},
 | 
			
		||||
			count: 15},
 | 
			
		||||
		{name: "AllPublic/PublicAndPrivateRepositoriesOfUser2IncludingCollaborativeByName",
 | 
			
		||||
			count: 15,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicAndPrivateRepositoriesOfUser2IncludingCollaborativeByName",
 | 
			
		||||
			opts:  &SearchRepoOptions{Keyword: "test", ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 18, Private: true, AllPublic: true},
 | 
			
		||||
			count: 13},
 | 
			
		||||
		{name: "AllPublic/PublicRepositoriesOfOrganization",
 | 
			
		||||
			count: 13,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/PublicRepositoriesOfOrganization",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, OwnerID: 17, AllPublic: true, Collaborate: util.OptionalBoolFalse, Template: util.OptionalBoolFalse},
 | 
			
		||||
			count: 28},
 | 
			
		||||
		{name: "AllTemplates",
 | 
			
		||||
			count: 28,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllTemplates",
 | 
			
		||||
			opts:  &SearchRepoOptions{ListOptions: ListOptions{Page: 1, PageSize: 10}, Template: util.OptionalBoolTrue},
 | 
			
		||||
			count: 2},
 | 
			
		||||
			count: 2,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, testCase := range testCases {
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +272,7 @@ func TestSearchRepository(t *testing.T) {
 | 
			
		|||
			if page <= 0 {
 | 
			
		||||
				page = 1
 | 
			
		||||
			}
 | 
			
		||||
			var expectedLen = testCase.opts.PageSize
 | 
			
		||||
			expectedLen := testCase.opts.PageSize
 | 
			
		||||
			if testCase.opts.PageSize*page > testCase.count+testCase.opts.PageSize {
 | 
			
		||||
				expectedLen = 0
 | 
			
		||||
			} else if testCase.opts.PageSize*page > testCase.count {
 | 
			
		||||
| 
						 | 
				
			
			@ -274,15 +330,21 @@ func TestSearchRepositoryByTopicName(t *testing.T) {
 | 
			
		|||
		opts  *SearchRepoOptions
 | 
			
		||||
		count int
 | 
			
		||||
	}{
 | 
			
		||||
		{name: "AllPublic/SearchPublicRepositoriesFromTopicAndName",
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/SearchPublicRepositoriesFromTopicAndName",
 | 
			
		||||
			opts:  &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql"},
 | 
			
		||||
			count: 2},
 | 
			
		||||
		{name: "AllPublic/OnlySearchPublicRepositoriesFromTopic",
 | 
			
		||||
			count: 2,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/OnlySearchPublicRepositoriesFromTopic",
 | 
			
		||||
			opts:  &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql", TopicOnly: true},
 | 
			
		||||
			count: 1},
 | 
			
		||||
		{name: "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic",
 | 
			
		||||
			count: 1,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			name:  "AllPublic/OnlySearchMultipleKeywordPublicRepositoriesFromTopic",
 | 
			
		||||
			opts:  &SearchRepoOptions{OwnerID: 21, AllPublic: true, Keyword: "graphql,golang", TopicOnly: true},
 | 
			
		||||
			count: 2},
 | 
			
		||||
			count: 2,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, testCase := range testCases {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,7 +141,6 @@ func TestRepoAPIURL(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestUploadAvatar(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// Generate image
 | 
			
		||||
	myImage := image.NewRGBA(image.Rect(0, 0, 1, 1))
 | 
			
		||||
	var buff bytes.Buffer
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +155,6 @@ func TestUploadAvatar(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestUploadBigAvatar(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// Generate BIG image
 | 
			
		||||
	myImage := image.NewRGBA(image.Rect(0, 0, 5000, 1))
 | 
			
		||||
	var buff bytes.Buffer
 | 
			
		||||
| 
						 | 
				
			
			@ -170,7 +168,6 @@ func TestUploadBigAvatar(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestDeleteAvatar(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// Generate image
 | 
			
		||||
	myImage := image.NewRGBA(image.Rect(0, 0, 1, 1))
 | 
			
		||||
	var buff bytes.Buffer
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,6 @@ func (r *RepoTransfer) LoadAttributes() error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	if r.Recipient.IsOrganization() && len(r.TeamIDs) != len(r.Teams) {
 | 
			
		||||
 | 
			
		||||
		for _, v := range r.TeamIDs {
 | 
			
		||||
			team, err := GetTeamByID(v)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +91,7 @@ func (r *RepoTransfer) CanUserAcceptTransfer(u *User) bool {
 | 
			
		|||
// GetPendingRepositoryTransfer fetches the most recent and ongoing transfer
 | 
			
		||||
// process for the repository
 | 
			
		||||
func GetPendingRepositoryTransfer(repo *Repository) (*RepoTransfer, error) {
 | 
			
		||||
	var transfer = new(RepoTransfer)
 | 
			
		||||
	transfer := new(RepoTransfer)
 | 
			
		||||
 | 
			
		||||
	has, err := x.Where("repo_id = ? ", repo.ID).Get(transfer)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,6 @@ import (
 | 
			
		|||
)
 | 
			
		||||
 | 
			
		||||
func TestRepositoryTransfer(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, PrepareTestDatabase())
 | 
			
		||||
 | 
			
		||||
	doer := AssertExistsAndLoadBean(t, &User{ID: 3}).(*User)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,8 +24,7 @@ type RepoUnit struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// UnitConfig describes common unit config
 | 
			
		||||
type UnitConfig struct {
 | 
			
		||||
}
 | 
			
		||||
type UnitConfig struct{}
 | 
			
		||||
 | 
			
		||||
// FromDB fills up a UnitConfig from serialized format.
 | 
			
		||||
func (cfg *UnitConfig) FromDB(bs []byte) error {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -312,6 +312,6 @@ func watchIfAuto(e Engine, userID, repoID int64, isWrite bool) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// WatchIfAuto subscribes to repo if AutoWatchOnChanges is set
 | 
			
		||||
func WatchIfAuto(userID int64, repoID int64, isWrite bool) error {
 | 
			
		||||
func WatchIfAuto(userID, repoID int64, isWrite bool) error {
 | 
			
		||||
	return watchIfAuto(x, userID, repoID, isWrite)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -175,7 +175,7 @@ type FindReviewOptions struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (opts *FindReviewOptions) toCond() builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if opts.IssueID > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"issue_id": opts.IssueID})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -334,8 +334,7 @@ func GetCurrentReview(reviewer *User, issue *Issue) (*Review, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// ContentEmptyErr represents an content empty error
 | 
			
		||||
type ContentEmptyErr struct {
 | 
			
		||||
}
 | 
			
		||||
type ContentEmptyErr struct{}
 | 
			
		||||
 | 
			
		||||
func (ContentEmptyErr) Error() string {
 | 
			
		||||
	return "Review content is empty"
 | 
			
		||||
| 
						 | 
				
			
			@ -355,7 +354,7 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content, comm
 | 
			
		|||
		return nil, nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var official = false
 | 
			
		||||
	official := false
 | 
			
		||||
 | 
			
		||||
	review, err := getCurrentReview(sess, doer, issue)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -668,7 +667,7 @@ func AddReviewRequest(issue *Issue, reviewer, doer *User) (*Comment, error) {
 | 
			
		|||
	return comment, sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//RemoveReviewRequest remove a review request from one reviewer
 | 
			
		||||
// RemoveReviewRequest remove a review request from one reviewer
 | 
			
		||||
func RemoveReviewRequest(issue *Issue, reviewer, doer *User) (*Comment, error) {
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
| 
						 | 
				
			
			@ -780,7 +779,7 @@ func AddTeamReviewRequest(issue *Issue, reviewer *Team, doer *User) (*Comment, e
 | 
			
		|||
	return comment, sess.Commit()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//RemoveTeamReviewRequest remove a review request from one team
 | 
			
		||||
// RemoveTeamReviewRequest remove a review request from one team
 | 
			
		||||
func RemoveTeamReviewRequest(issue *Issue, reviewer *Team, doer *User) (*Comment, error) {
 | 
			
		||||
	sess := x.NewSession()
 | 
			
		||||
	defer sess.Close()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,7 +34,6 @@ func TestReview_LoadAttributes(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	invalidReview2 := AssertExistsAndLoadBean(t, &Review{ID: 3}).(*Review)
 | 
			
		||||
	assert.Error(t, invalidReview2.LoadAttributes())
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestReview_LoadCodeComments(t *testing.T) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -377,7 +377,7 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error {
 | 
			
		|||
		// This of course doesn't guarantee that this is the right directory for authorized_keys
 | 
			
		||||
		// but at least if it's supposed to be this directory and it doesn't exist and we're the
 | 
			
		||||
		// right user it will at least be created properly.
 | 
			
		||||
		err := os.MkdirAll(setting.SSH.RootPath, 0700)
 | 
			
		||||
		err := os.MkdirAll(setting.SSH.RootPath, 0o700)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Error("Unable to MkdirAll(%s): %v", setting.SSH.RootPath, err)
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			@ -385,7 +385,7 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	fPath := filepath.Join(setting.SSH.RootPath, "authorized_keys")
 | 
			
		||||
	f, err := os.OpenFile(fPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
 | 
			
		||||
	f, err := os.OpenFile(fPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -399,9 +399,9 @@ func appendAuthorizedKeysToFile(keys ...*PublicKey) error {
 | 
			
		|||
		}
 | 
			
		||||
 | 
			
		||||
		// .ssh directory should have mode 700, and authorized_keys file should have mode 600.
 | 
			
		||||
		if fi.Mode().Perm() > 0600 {
 | 
			
		||||
		if fi.Mode().Perm() > 0o600 {
 | 
			
		||||
			log.Error("authorized_keys file has unusual permission flags: %s - setting to -rw-------", fi.Mode().Perm().String())
 | 
			
		||||
			if err = f.Chmod(0600); err != nil {
 | 
			
		||||
			if err = f.Chmod(0o600); err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -465,7 +465,7 @@ func calcFingerprintNative(publicKeyContent string) (string, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func calcFingerprint(publicKeyContent string) (string, error) {
 | 
			
		||||
	//Call the method based on configuration
 | 
			
		||||
	// Call the method based on configuration
 | 
			
		||||
	var (
 | 
			
		||||
		fnName, fp string
 | 
			
		||||
		err        error
 | 
			
		||||
| 
						 | 
				
			
			@ -628,7 +628,7 @@ func ListPublicKeys(uid int64, listOptions ListOptions) ([]*PublicKey, error) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// ListPublicLdapSSHKeys returns a list of synchronized public ldap ssh keys belongs to given user and login source.
 | 
			
		||||
func ListPublicLdapSSHKeys(uid int64, loginSourceID int64) ([]*PublicKey, error) {
 | 
			
		||||
func ListPublicLdapSSHKeys(uid, loginSourceID int64) ([]*PublicKey, error) {
 | 
			
		||||
	keys := make([]*PublicKey, 0, 5)
 | 
			
		||||
	return keys, x.
 | 
			
		||||
		Where("owner_id = ? AND login_source_id = ?", uid, loginSourceID).
 | 
			
		||||
| 
						 | 
				
			
			@ -782,7 +782,7 @@ func RewriteAllPublicKeys() error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func rewriteAllPublicKeys(e Engine) error {
 | 
			
		||||
	//Don't rewrite key if internal server
 | 
			
		||||
	// Don't rewrite key if internal server
 | 
			
		||||
	if setting.SSH.StartBuiltinServer || !setting.SSH.CreateAuthorizedKeysFile {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -795,7 +795,7 @@ func rewriteAllPublicKeys(e Engine) error {
 | 
			
		|||
		// This of course doesn't guarantee that this is the right directory for authorized_keys
 | 
			
		||||
		// but at least if it's supposed to be this directory and it doesn't exist and we're the
 | 
			
		||||
		// right user it will at least be created properly.
 | 
			
		||||
		err := os.MkdirAll(setting.SSH.RootPath, 0700)
 | 
			
		||||
		err := os.MkdirAll(setting.SSH.RootPath, 0o700)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Error("Unable to MkdirAll(%s): %v", setting.SSH.RootPath, err)
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			@ -804,7 +804,7 @@ func rewriteAllPublicKeys(e Engine) error {
 | 
			
		|||
 | 
			
		||||
	fPath := filepath.Join(setting.SSH.RootPath, "authorized_keys")
 | 
			
		||||
	tmpPath := fPath + ".tmp"
 | 
			
		||||
	t, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
 | 
			
		||||
	t, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1147,7 +1147,7 @@ func listDeployKeys(e Engine, repoID int64, listOptions ListOptions) ([]*DeployK
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// SearchDeployKeys returns a list of deploy keys matching the provided arguments.
 | 
			
		||||
func SearchDeployKeys(repoID int64, keyID int64, fingerprint string) ([]*DeployKey, error) {
 | 
			
		||||
func SearchDeployKeys(repoID, keyID int64, fingerprint string) ([]*DeployKey, error) {
 | 
			
		||||
	keys := make([]*DeployKey, 0, 5)
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if repoID != 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -1279,7 +1279,7 @@ func rewriteAllPrincipalKeys(e Engine) error {
 | 
			
		|||
		// This of course doesn't guarantee that this is the right directory for authorized_keys
 | 
			
		||||
		// but at least if it's supposed to be this directory and it doesn't exist and we're the
 | 
			
		||||
		// right user it will at least be created properly.
 | 
			
		||||
		err := os.MkdirAll(setting.SSH.RootPath, 0700)
 | 
			
		||||
		err := os.MkdirAll(setting.SSH.RootPath, 0o700)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			log.Error("Unable to MkdirAll(%s): %v", setting.SSH.RootPath, err)
 | 
			
		||||
			return err
 | 
			
		||||
| 
						 | 
				
			
			@ -1288,7 +1288,7 @@ func rewriteAllPrincipalKeys(e Engine) error {
 | 
			
		|||
 | 
			
		||||
	fPath := filepath.Join(setting.SSH.RootPath, authorizedPrincipalsFile)
 | 
			
		||||
	tmpPath := fPath + ".tmp"
 | 
			
		||||
	t, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0600)
 | 
			
		||||
	t, err := os.OpenFile(tmpPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o600)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -135,7 +135,7 @@ func (err ErrTaskDoesNotExist) Error() string {
 | 
			
		|||
 | 
			
		||||
// GetMigratingTask returns the migrating task by repo's id
 | 
			
		||||
func GetMigratingTask(repoID int64) (*Task, error) {
 | 
			
		||||
	var task = Task{
 | 
			
		||||
	task := Task{
 | 
			
		||||
		RepoID: repoID,
 | 
			
		||||
		Type:   structs.TaskTypeMigrateRepo,
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -150,7 +150,7 @@ func GetMigratingTask(repoID int64) (*Task, error) {
 | 
			
		|||
 | 
			
		||||
// GetMigratingTaskByID returns the migrating task by repo's id
 | 
			
		||||
func GetMigratingTaskByID(id, doerID int64) (*Task, *migration.MigrateOptions, error) {
 | 
			
		||||
	var task = Task{
 | 
			
		||||
	task := Task{
 | 
			
		||||
		ID:     id,
 | 
			
		||||
		DoerID: doerID,
 | 
			
		||||
		Type:   structs.TaskTypeMigrateRepo,
 | 
			
		||||
| 
						 | 
				
			
			@ -177,7 +177,7 @@ type FindTaskOptions struct {
 | 
			
		|||
 | 
			
		||||
// ToConds generates conditions for database operation.
 | 
			
		||||
func (opts FindTaskOptions) ToConds() builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if opts.Status >= 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"status": opts.Status})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -186,7 +186,7 @@ func (opts FindTaskOptions) ToConds() builder.Cond {
 | 
			
		|||
 | 
			
		||||
// FindTasks find all tasks
 | 
			
		||||
func FindTasks(opts FindTaskOptions) ([]*Task, error) {
 | 
			
		||||
	var tasks = make([]*Task, 0, 10)
 | 
			
		||||
	tasks := make([]*Task, 0, 10)
 | 
			
		||||
	err := x.Where(opts.ToConds()).Find(&tasks)
 | 
			
		||||
	return tasks, err
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,7 +28,6 @@ func TestNewAccessToken(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestAccessTokenByNameExists(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	name := "Token Gitea"
 | 
			
		||||
 | 
			
		||||
	assert.NoError(t, PrepareTestDatabase())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,7 +60,7 @@ func ValidateTopic(topic string) bool {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// SanitizeAndValidateTopics sanitizes and checks an array or topics
 | 
			
		||||
func SanitizeAndValidateTopics(topics []string) (validTopics []string, invalidTopics []string) {
 | 
			
		||||
func SanitizeAndValidateTopics(topics []string) (validTopics, invalidTopics []string) {
 | 
			
		||||
	validTopics = make([]string, 0)
 | 
			
		||||
	mValidTopics := make(map[string]struct{})
 | 
			
		||||
	invalidTopics = make([]string, 0)
 | 
			
		||||
| 
						 | 
				
			
			@ -171,7 +171,7 @@ type FindTopicOptions struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (opts *FindTopicOptions) toConds() builder.Cond {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	if opts.RepoID > 0 {
 | 
			
		||||
		cond = cond.And(builder.Eq{"repo_topic.repo_id": opts.RepoID})
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -199,8 +199,9 @@ func FindTopics(opts *FindTopicOptions) (topics []*Topic, err error) {
 | 
			
		|||
func GetRepoTopicByName(repoID int64, topicName string) (*Topic, error) {
 | 
			
		||||
	return getRepoTopicByName(x, repoID, topicName)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getRepoTopicByName(e Engine, repoID int64, topicName string) (*Topic, error) {
 | 
			
		||||
	var cond = builder.NewCond()
 | 
			
		||||
	cond := builder.NewCond()
 | 
			
		||||
	var topic Topic
 | 
			
		||||
	cond = cond.And(builder.Eq{"repo_topic.repo_id": repoID}).And(builder.Eq{"topic.name": topicName})
 | 
			
		||||
	sess := e.Table("topic").Where(cond)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -207,7 +207,7 @@ func AssertSuccessfulInsert(t testing.TB, beans ...interface{}) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// AssertCount assert the count of a bean
 | 
			
		||||
func AssertCount(t testing.TB, bean interface{}, expected interface{}) {
 | 
			
		||||
func AssertCount(t testing.TB, bean, expected interface{}) {
 | 
			
		||||
	assert.EqualValues(t, expected, GetCount(t, bean))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1307,7 +1307,6 @@ func DeleteInactiveUsers(ctx context.Context, olderThan time.Duration) (err erro
 | 
			
		|||
			Find(&users); err != nil {
 | 
			
		||||
			return fmt.Errorf("get all inactive users: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
	// FIXME: should only update authorized_keys file once after all deletions.
 | 
			
		||||
	for _, u := range users {
 | 
			
		||||
| 
						 | 
				
			
			@ -1572,7 +1571,6 @@ type SearchUserOptions struct {
 | 
			
		|||
 | 
			
		||||
func (opts *SearchUserOptions) toConds() builder.Cond {
 | 
			
		||||
	var cond builder.Cond = builder.Eq{"type": opts.Type}
 | 
			
		||||
 | 
			
		||||
	if len(opts.Keyword) > 0 {
 | 
			
		||||
		lowerKeyword := strings.ToLower(opts.Keyword)
 | 
			
		||||
		keywordCond := builder.Or(
 | 
			
		||||
| 
						 | 
				
			
			@ -1601,7 +1599,8 @@ func (opts *SearchUserOptions) toConds() builder.Cond {
 | 
			
		|||
		} else {
 | 
			
		||||
			exprCond = builder.Expr("org_user.org_id = \"user\".id")
 | 
			
		||||
		}
 | 
			
		||||
		var accessCond = builder.NewCond()
 | 
			
		||||
 | 
			
		||||
		var accessCond builder.Cond
 | 
			
		||||
		if !opts.Actor.IsRestricted {
 | 
			
		||||
			accessCond = builder.Or(
 | 
			
		||||
				builder.In("id", builder.Select("org_id").From("org_user").LeftJoin("`user`", exprCond).Where(builder.And(builder.Eq{"uid": opts.Actor.ID}, builder.Eq{"visibility": structs.VisibleTypePrivate}))),
 | 
			
		||||
| 
						 | 
				
			
			@ -1847,7 +1846,7 @@ func SyncExternalUsers(ctx context.Context, updateExisting bool) error {
 | 
			
		|||
			log.Trace("Doing: SyncExternalUsers[%s]", s.Name)
 | 
			
		||||
 | 
			
		||||
			var existingUsers []int64
 | 
			
		||||
			var isAttributeSSHPublicKeySet = len(strings.TrimSpace(s.LDAP().AttributeSSHPublicKey)) > 0
 | 
			
		||||
			isAttributeSSHPublicKeySet := len(strings.TrimSpace(s.LDAP().AttributeSSHPublicKey)) > 0
 | 
			
		||||
			var sshKeysNeedUpdate bool
 | 
			
		||||
 | 
			
		||||
			// Find all users with this login type
 | 
			
		||||
| 
						 | 
				
			
			@ -2021,9 +2020,9 @@ func SyncExternalUsers(ctx context.Context, updateExisting bool) error {
 | 
			
		|||
// IterateUser iterate users
 | 
			
		||||
func IterateUser(f func(user *User) error) error {
 | 
			
		||||
	var start int
 | 
			
		||||
	var batchSize = setting.Database.IterateBufferSize
 | 
			
		||||
	batchSize := setting.Database.IterateBufferSize
 | 
			
		||||
	for {
 | 
			
		||||
		var users = make([]*User, 0, batchSize)
 | 
			
		||||
		users := make([]*User, 0, batchSize)
 | 
			
		||||
		if err := x.Limit(batchSize, start).Find(&users); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ type UserHeatmapData struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// GetUserHeatmapDataByUser returns an array of UserHeatmapData
 | 
			
		||||
func GetUserHeatmapDataByUser(user *User, doer *User) ([]*UserHeatmapData, error) {
 | 
			
		||||
func GetUserHeatmapDataByUser(user, doer *User) ([]*UserHeatmapData, error) {
 | 
			
		||||
	return getUserHeatmapData(user, nil, doer)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ func getUserHeatmapData(user *User, team *Team, doer *User) ([]*UserHeatmapData,
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	var groupBy string
 | 
			
		||||
	var groupByName = "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
 | 
			
		||||
	groupByName := "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
 | 
			
		||||
	switch {
 | 
			
		||||
	case setting.Database.UseSQLite3:
 | 
			
		||||
		groupBy = "strftime('%s', strftime('%Y-%m-%d', created_unix, 'unixepoch'))"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
 | 
			
		|||
		assert.Equal(t, len(actions), len(heatmap), "invalid action count: did the test data became too old?")
 | 
			
		||||
		assert.Equal(t, tc.CountResult, len(heatmap), fmt.Sprintf("testcase %d", i))
 | 
			
		||||
 | 
			
		||||
		//Test JSON rendering
 | 
			
		||||
		// Test JSON rendering
 | 
			
		||||
		json := jsoniter.ConfigCompatibleWithStandardLibrary
 | 
			
		||||
		jsonData, err := json.Marshal(heatmap)
 | 
			
		||||
		assert.NoError(t, err)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,10 +18,8 @@ import (
 | 
			
		|||
	"xorm.io/builder"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrEmailAddressNotExist email address not exist
 | 
			
		||||
	ErrEmailAddressNotExist = errors.New("Email address does not exist")
 | 
			
		||||
)
 | 
			
		||||
// ErrEmailAddressNotExist email address not exist
 | 
			
		||||
var ErrEmailAddressNotExist = errors.New("Email address does not exist")
 | 
			
		||||
 | 
			
		||||
// EmailAddress is the list of all email addresses of a user. Can contain the
 | 
			
		||||
// primary email address, but is not obligatory.
 | 
			
		||||
| 
						 | 
				
			
			@ -231,7 +229,7 @@ func (email *EmailAddress) updateActivation(e Engine, activate bool) error {
 | 
			
		|||
func DeleteEmailAddress(email *EmailAddress) (err error) {
 | 
			
		||||
	var deleted int64
 | 
			
		||||
	// ask to check UID
 | 
			
		||||
	var address = EmailAddress{
 | 
			
		||||
	address := EmailAddress{
 | 
			
		||||
		UID: email.UID,
 | 
			
		||||
	}
 | 
			
		||||
	if email.ID > 0 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,10 +11,8 @@ import (
 | 
			
		|||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// ErrOpenIDNotExist openid is not known
 | 
			
		||||
	ErrOpenIDNotExist = errors.New("OpenID is unknown")
 | 
			
		||||
)
 | 
			
		||||
// ErrOpenIDNotExist openid is not known
 | 
			
		||||
var ErrOpenIDNotExist = errors.New("OpenID is unknown")
 | 
			
		||||
 | 
			
		||||
// UserOpenID is the list of all OpenID identities of a user.
 | 
			
		||||
type UserOpenID struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -72,7 +70,7 @@ func AddUserOpenID(openid *UserOpenID) error {
 | 
			
		|||
func DeleteUserOpenID(openid *UserOpenID) (err error) {
 | 
			
		||||
	var deleted int64
 | 
			
		||||
	// ask to check UID
 | 
			
		||||
	var address = UserOpenID{
 | 
			
		||||
	address := UserOpenID{
 | 
			
		||||
		UID: openid.UID,
 | 
			
		||||
	}
 | 
			
		||||
	if openid.ID > 0 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ func TestUserIsPublicMember(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testUserIsPublicMember(t *testing.T, uid int64, orgID int64, expected bool) {
 | 
			
		||||
func testUserIsPublicMember(t *testing.T, uid, orgID int64, expected bool) {
 | 
			
		||||
	user, err := GetUserByID(uid)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, expected, user.IsPublicMember(orgID))
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +62,7 @@ func TestIsUserOrgOwner(t *testing.T) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testIsUserOrgOwner(t *testing.T, uid int64, orgID int64, expected bool) {
 | 
			
		||||
func testIsUserOrgOwner(t *testing.T, uid, orgID int64, expected bool) {
 | 
			
		||||
	user, err := GetUserByID(uid)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, expected, user.IsUserOrgOwner(orgID))
 | 
			
		||||
| 
						 | 
				
			
			@ -338,7 +338,6 @@ func TestCreateUserInvalidEmail(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestCreateUser_Issue5882(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	// Init settings
 | 
			
		||||
	_ = setting.Admin
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -369,13 +368,12 @@ func TestCreateUser_Issue5882(t *testing.T) {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func TestGetUserIDsByNames(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	//ignore non existing
 | 
			
		||||
	// ignore non existing
 | 
			
		||||
	IDs, err := GetUserIDsByNames([]string{"user1", "user2", "none_existing_user"}, true)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.Equal(t, []int64{1, 2}, IDs)
 | 
			
		||||
 | 
			
		||||
	//ignore non existing
 | 
			
		||||
	// ignore non existing
 | 
			
		||||
	IDs, err = GetUserIDsByNames([]string{"user1", "do_not_exist"}, false)
 | 
			
		||||
	assert.Error(t, err)
 | 
			
		||||
	assert.Equal(t, []int64(nil), IDs)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,14 +10,14 @@ import (
 | 
			
		|||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//UserList is a list of user.
 | 
			
		||||
// UserList is a list of user.
 | 
			
		||||
// This type provide valuable methods to retrieve information for a group of users efficiently.
 | 
			
		||||
type UserList []*User
 | 
			
		||||
 | 
			
		||||
func (users UserList) getUserIDs() []int64 {
 | 
			
		||||
	userIDs := make([]int64, len(users))
 | 
			
		||||
	for _, user := range users {
 | 
			
		||||
		userIDs = append(userIDs, user.ID) //Considering that user id are unique in the list
 | 
			
		||||
		userIDs = append(userIDs, user.ID) // Considering that user id are unique in the list
 | 
			
		||||
	}
 | 
			
		||||
	return userIDs
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +26,7 @@ func (users UserList) getUserIDs() []int64 {
 | 
			
		|||
func (users UserList) IsUserOrgOwner(orgID int64) map[int64]bool {
 | 
			
		||||
	results := make(map[int64]bool, len(users))
 | 
			
		||||
	for _, user := range users {
 | 
			
		||||
		results[user.ID] = false //Set default to false
 | 
			
		||||
		results[user.ID] = false // Set default to false
 | 
			
		||||
	}
 | 
			
		||||
	ownerMaps, err := users.loadOrganizationOwners(x, orgID)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +66,7 @@ func (users UserList) loadOrganizationOwners(e Engine, orgID int64) (map[int64]*
 | 
			
		|||
func (users UserList) GetTwoFaStatus() map[int64]bool {
 | 
			
		||||
	results := make(map[int64]bool, len(users))
 | 
			
		||||
	for _, user := range users {
 | 
			
		||||
		results[user.ID] = false //Set default to false
 | 
			
		||||
		results[user.ID] = false // Set default to false
 | 
			
		||||
	}
 | 
			
		||||
	tokenMaps, err := users.loadTwoFactorStatus(x)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue