code.gitea.io/gitea@v1.21.7/models/migrations/v1_10/v88.go (about)

     1  // Copyright 2019 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package v1_10 //nolint
     5  
     6  import (
     7  	"crypto/sha1"
     8  	"fmt"
     9  
    10  	"xorm.io/xorm"
    11  )
    12  
    13  func hashContext(context string) string {
    14  	return fmt.Sprintf("%x", sha1.Sum([]byte(context)))
    15  }
    16  
    17  func AddCommitStatusContext(x *xorm.Engine) error {
    18  	type CommitStatus struct {
    19  		ID          int64  `xorm:"pk autoincr"`
    20  		ContextHash string `xorm:"char(40) index"`
    21  		Context     string `xorm:"TEXT"`
    22  	}
    23  
    24  	if err := x.Sync(new(CommitStatus)); err != nil {
    25  		return err
    26  	}
    27  
    28  	sess := x.NewSession()
    29  	defer sess.Close()
    30  
    31  	start := 0
    32  	for {
    33  		statuses := make([]*CommitStatus, 0, 100)
    34  		err := sess.OrderBy("id").Limit(100, start).Find(&statuses)
    35  		if err != nil {
    36  			return err
    37  		}
    38  		if len(statuses) == 0 {
    39  			break
    40  		}
    41  
    42  		if err = sess.Begin(); err != nil {
    43  			return err
    44  		}
    45  
    46  		for _, status := range statuses {
    47  			status.ContextHash = hashContext(status.Context)
    48  			if _, err := sess.ID(status.ID).Cols("context_hash").Update(status); err != nil {
    49  				return err
    50  			}
    51  		}
    52  
    53  		if err := sess.Commit(); err != nil {
    54  			return err
    55  		}
    56  
    57  		if len(statuses) < 100 {
    58  			break
    59  		}
    60  
    61  		start += len(statuses)
    62  	}
    63  
    64  	return nil
    65  }