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 }