code.gitea.io/gitea@v1.22.3/models/repo/mirror.go (about)

     1  // Copyright 2016 The Gogs Authors. All rights reserved.
     2  // Copyright 2018 The Gitea Authors. All rights reserved.
     3  // SPDX-License-Identifier: MIT
     4  
     5  package repo
     6  
     7  import (
     8  	"context"
     9  	"time"
    10  
    11  	"code.gitea.io/gitea/models/db"
    12  	"code.gitea.io/gitea/modules/log"
    13  	"code.gitea.io/gitea/modules/timeutil"
    14  	"code.gitea.io/gitea/modules/util"
    15  )
    16  
    17  // ErrMirrorNotExist mirror does not exist error
    18  var ErrMirrorNotExist = util.NewNotExistErrorf("Mirror does not exist")
    19  
    20  // Mirror represents mirror information of a repository.
    21  type Mirror struct {
    22  	ID          int64       `xorm:"pk autoincr"`
    23  	RepoID      int64       `xorm:"INDEX"`
    24  	Repo        *Repository `xorm:"-"`
    25  	Interval    time.Duration
    26  	EnablePrune bool `xorm:"NOT NULL DEFAULT true"`
    27  
    28  	UpdatedUnix    timeutil.TimeStamp `xorm:"INDEX"`
    29  	NextUpdateUnix timeutil.TimeStamp `xorm:"INDEX"`
    30  
    31  	LFS         bool   `xorm:"lfs_enabled NOT NULL DEFAULT false"`
    32  	LFSEndpoint string `xorm:"lfs_endpoint TEXT"`
    33  
    34  	RemoteAddress string `xorm:"VARCHAR(2048)"`
    35  }
    36  
    37  func init() {
    38  	db.RegisterModel(new(Mirror))
    39  }
    40  
    41  // BeforeInsert will be invoked by XORM before inserting a record
    42  func (m *Mirror) BeforeInsert() {
    43  	if m != nil {
    44  		m.UpdatedUnix = timeutil.TimeStampNow()
    45  		m.NextUpdateUnix = timeutil.TimeStampNow()
    46  	}
    47  }
    48  
    49  // GetRepository returns the repository.
    50  func (m *Mirror) GetRepository(ctx context.Context) *Repository {
    51  	if m.Repo != nil {
    52  		return m.Repo
    53  	}
    54  	var err error
    55  	m.Repo, err = GetRepositoryByID(ctx, m.RepoID)
    56  	if err != nil {
    57  		log.Error("getRepositoryByID[%d]: %v", m.ID, err)
    58  	}
    59  	return m.Repo
    60  }
    61  
    62  // GetRemoteName returns the name of the remote.
    63  func (m *Mirror) GetRemoteName() string {
    64  	return "origin"
    65  }
    66  
    67  // ScheduleNextUpdate calculates and sets next update time.
    68  func (m *Mirror) ScheduleNextUpdate() {
    69  	if m.Interval != 0 {
    70  		m.NextUpdateUnix = timeutil.TimeStampNow().AddDuration(m.Interval)
    71  	} else {
    72  		m.NextUpdateUnix = 0
    73  	}
    74  }
    75  
    76  // GetMirrorByRepoID returns mirror information of a repository.
    77  func GetMirrorByRepoID(ctx context.Context, repoID int64) (*Mirror, error) {
    78  	m := &Mirror{RepoID: repoID}
    79  	has, err := db.GetEngine(ctx).Get(m)
    80  	if err != nil {
    81  		return nil, err
    82  	} else if !has {
    83  		return nil, ErrMirrorNotExist
    84  	}
    85  	return m, nil
    86  }
    87  
    88  // UpdateMirror updates the mirror
    89  func UpdateMirror(ctx context.Context, m *Mirror) error {
    90  	_, err := db.GetEngine(ctx).ID(m.ID).AllCols().Update(m)
    91  	return err
    92  }
    93  
    94  // TouchMirror updates the mirror updatedUnix
    95  func TouchMirror(ctx context.Context, m *Mirror) error {
    96  	m.UpdatedUnix = timeutil.TimeStampNow()
    97  	_, err := db.GetEngine(ctx).ID(m.ID).Cols("updated_unix").Update(m)
    98  	return err
    99  }
   100  
   101  // DeleteMirrorByRepoID deletes a mirror by repoID
   102  func DeleteMirrorByRepoID(ctx context.Context, repoID int64) error {
   103  	_, err := db.GetEngine(ctx).Delete(&Mirror{RepoID: repoID})
   104  	return err
   105  }
   106  
   107  // MirrorsIterate iterates all mirror repositories.
   108  func MirrorsIterate(ctx context.Context, limit int, f func(idx int, bean any) error) error {
   109  	sess := db.GetEngine(ctx).
   110  		Where("next_update_unix<=?", time.Now().Unix()).
   111  		And("next_update_unix!=0").
   112  		OrderBy("updated_unix ASC")
   113  	if limit > 0 {
   114  		sess = sess.Limit(limit)
   115  	}
   116  	return sess.Iterate(new(Mirror), f)
   117  }
   118  
   119  // InsertMirror inserts a mirror to database
   120  func InsertMirror(ctx context.Context, mirror *Mirror) error {
   121  	_, err := db.GetEngine(ctx).Insert(mirror)
   122  	return err
   123  }