github.com/billybanfield/evergreen@v0.0.0-20170525200750-eeee692790f7/model/repository.go (about)

     1  package model
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/evergreen-ci/evergreen/db"
     7  	"github.com/evergreen-ci/evergreen/db/bsonutil"
     8  	"gopkg.in/mgo.v2"
     9  	"gopkg.in/mgo.v2/bson"
    10  )
    11  
    12  // Repository contains fields used to track projects.
    13  type Repository struct {
    14  	Project             string `bson:"_id"`
    15  	LastRevision        string `bson:"last_revision"`
    16  	RevisionOrderNumber int    `bson:"last_commit_number"`
    17  }
    18  
    19  var (
    20  	// BSON fields for the Repository struct
    21  	RepoProjectKey = bsonutil.MustHaveTag(Repository{},
    22  		"Project")
    23  	RepoLastRevisionKey = bsonutil.MustHaveTag(Repository{},
    24  		"LastRevision")
    25  	RepositoryOrderNumberKey = bsonutil.MustHaveTag(Repository{},
    26  		"RevisionOrderNumber")
    27  )
    28  
    29  const (
    30  	RepositoriesCollection = "repo_revisions"
    31  )
    32  
    33  const (
    34  	GithubRepoType = "github"
    35  )
    36  
    37  // valid repositories - currently only github supported
    38  var (
    39  	ValidRepoTypes = []string{GithubRepoType}
    40  )
    41  
    42  type Revision struct {
    43  	Author          string
    44  	AuthorEmail     string
    45  	RevisionMessage string
    46  	Revision        string
    47  	CreateTime      time.Time
    48  }
    49  
    50  // FindRepository gets the repository object of a project.
    51  func FindRepository(projectId string) (*Repository, error) {
    52  	repository := &Repository{}
    53  	err := db.FindOne(
    54  		RepositoriesCollection,
    55  		bson.M{
    56  			RepoProjectKey: projectId,
    57  		},
    58  		db.NoProjection,
    59  		db.NoSort,
    60  		repository,
    61  	)
    62  	if err == mgo.ErrNotFound {
    63  		return nil, nil
    64  	}
    65  	return repository, err
    66  }
    67  
    68  // UpdateLastRevision updates the last created revision of a project.
    69  func UpdateLastRevision(projectId, revision string) error {
    70  	return db.Update(
    71  		RepositoriesCollection,
    72  		bson.M{
    73  			RepoProjectKey: projectId,
    74  		},
    75  		bson.M{
    76  			"$set": bson.M{
    77  				RepoLastRevisionKey: revision,
    78  			},
    79  		},
    80  	)
    81  }
    82  
    83  // GetNewRevisionOrderNumber gets a new revision order number for a project.
    84  func GetNewRevisionOrderNumber(projectId string) (int, error) {
    85  	repo := &Repository{}
    86  	_, err := db.FindAndModify(
    87  		RepositoriesCollection,
    88  		bson.M{
    89  			RepoProjectKey: projectId,
    90  		},
    91  		nil,
    92  		mgo.Change{
    93  			Update: bson.M{
    94  				"$inc": bson.M{
    95  					RepositoryOrderNumberKey: 1,
    96  				},
    97  			},
    98  			Upsert:    true,
    99  			ReturnNew: true,
   100  		},
   101  		repo,
   102  	)
   103  	if err != nil {
   104  		return 0, err
   105  	}
   106  	return repo.RevisionOrderNumber, nil
   107  }