|
|
|
@ -1018,11 +1018,14 @@ func CreateRepository(u *User, opts CreateRepoOptions) (_ *Repository, err error
|
|
|
|
|
return repo, sess.Commit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func countRepositories(showPrivate bool) int64 {
|
|
|
|
|
sess := x.NewSession()
|
|
|
|
|
func countRepositories(userID int64, private bool) int64 {
|
|
|
|
|
sess := x.Where("id > 0")
|
|
|
|
|
|
|
|
|
|
if !showPrivate {
|
|
|
|
|
sess.Where("is_private=?", false)
|
|
|
|
|
if userID > 0 {
|
|
|
|
|
sess.And("owner_id = ?", userID)
|
|
|
|
|
}
|
|
|
|
|
if !private {
|
|
|
|
|
sess.And("is_private=?", false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
count, err := sess.Count(new(Repository))
|
|
|
|
@ -1033,13 +1036,17 @@ func countRepositories(showPrivate bool) int64 {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CountRepositories returns number of repositories.
|
|
|
|
|
func CountRepositories() int64 {
|
|
|
|
|
return countRepositories(true)
|
|
|
|
|
// Argument private only takes effect when it is false,
|
|
|
|
|
// set it true to count all repositories.
|
|
|
|
|
func CountRepositories(private bool) int64 {
|
|
|
|
|
return countRepositories(-1, private)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// CountPublicRepositories returns number of public repositories.
|
|
|
|
|
func CountPublicRepositories() int64 {
|
|
|
|
|
return countRepositories(false)
|
|
|
|
|
// CountUserRepositories returns number of repositories user owns.
|
|
|
|
|
// Argument private only takes effect when it is false,
|
|
|
|
|
// set it true to count all repositories.
|
|
|
|
|
func CountUserRepositories(userID int64, private bool) int64 {
|
|
|
|
|
return countRepositories(userID, private)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Repositories(page, pageSize int) (_ []*Repository, err error) {
|
|
|
|
@ -1448,16 +1455,26 @@ func GetRepositoryByID(id int64) (*Repository, error) {
|
|
|
|
|
return getRepositoryByID(x, id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetRepositories returns a list of repositories of given user.
|
|
|
|
|
func GetRepositories(uid int64, private bool) ([]*Repository, error) {
|
|
|
|
|
repos := make([]*Repository, 0, 10)
|
|
|
|
|
sess := x.Desc("updated_unix")
|
|
|
|
|
|
|
|
|
|
// GetUserRepositories returns a list of repositories of given user.
|
|
|
|
|
func GetUserRepositories(userID int64, private bool, page, pageSize int) ([]*Repository, error) {
|
|
|
|
|
sess := x.Where("owner_id = ?", userID).Desc("updated_unix")
|
|
|
|
|
if !private {
|
|
|
|
|
sess.Where("is_private=?", false)
|
|
|
|
|
sess.And("is_private=?", false)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return repos, sess.Find(&repos, &Repository{OwnerID: uid})
|
|
|
|
|
if page <= 0 {
|
|
|
|
|
page = 1
|
|
|
|
|
}
|
|
|
|
|
sess.Limit(pageSize, (page-1)*pageSize)
|
|
|
|
|
|
|
|
|
|
repos := make([]*Repository, 0, pageSize)
|
|
|
|
|
return repos, sess.Find(&repos)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetUserRepositories returns a list of mirror repositories of given user.
|
|
|
|
|
func GetUserMirrorRepositories(userID int64) ([]*Repository, error) {
|
|
|
|
|
repos := make([]*Repository, 0, 10)
|
|
|
|
|
return repos, x.Where("owner_id = ?", userID).And("is_mirror = ?", true).Find(&repos)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GetRecentUpdatedRepositories returns the list of repositories that are recently updated.
|
|
|
|
@ -1849,6 +1866,74 @@ func CheckRepoStats() {
|
|
|
|
|
// ***** END: Repository.NumForks *****
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type RepositoryList []*Repository
|
|
|
|
|
|
|
|
|
|
func (repos RepositoryList) loadAttributes(e Engine) error {
|
|
|
|
|
if len(repos) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Load owners.
|
|
|
|
|
set := make(map[int64]*User)
|
|
|
|
|
for i := range repos {
|
|
|
|
|
set[repos[i].OwnerID] = nil
|
|
|
|
|
}
|
|
|
|
|
userIDs := make([]int64, 0, len(set))
|
|
|
|
|
for userID := range set {
|
|
|
|
|
userIDs = append(userIDs, userID)
|
|
|
|
|
}
|
|
|
|
|
users := make([]*User, 0, len(userIDs))
|
|
|
|
|
if err := e.Where("id > 0").In("id", userIDs).Find(&users); err != nil {
|
|
|
|
|
return fmt.Errorf("find users: %v", err)
|
|
|
|
|
}
|
|
|
|
|
for i := range users {
|
|
|
|
|
set[users[i].ID] = users[i]
|
|
|
|
|
}
|
|
|
|
|
for i := range repos {
|
|
|
|
|
repos[i].Owner = set[repos[i].OwnerID]
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repos RepositoryList) LoadAttributes() error {
|
|
|
|
|
return repos.loadAttributes(x)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type MirrorRepositoryList []*Repository
|
|
|
|
|
|
|
|
|
|
func (repos MirrorRepositoryList) loadAttributes(e Engine) error {
|
|
|
|
|
if len(repos) == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Load mirrors.
|
|
|
|
|
repoIDs := make([]int64, 0, len(repos))
|
|
|
|
|
for i := range repos {
|
|
|
|
|
if !repos[i].IsMirror {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
repoIDs = append(repoIDs, repos[i].ID)
|
|
|
|
|
}
|
|
|
|
|
mirrors := make([]*Mirror, 0, len(repoIDs))
|
|
|
|
|
if err := e.Where("id > 0").In("repo_id", repoIDs).Find(&mirrors); err != nil {
|
|
|
|
|
return fmt.Errorf("find mirrors: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set := make(map[int64]*Mirror)
|
|
|
|
|
for i := range mirrors {
|
|
|
|
|
set[mirrors[i].RepoID] = mirrors[i]
|
|
|
|
|
}
|
|
|
|
|
for i := range repos {
|
|
|
|
|
repos[i].Mirror = set[repos[i].ID]
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (repos MirrorRepositoryList) LoadAttributes() error {
|
|
|
|
|
return repos.loadAttributes(x)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// __ __ __ .__
|
|
|
|
|
// / \ / \_____ _/ |_ ____ | |__
|
|
|
|
|
// \ \/\/ /\__ \\ __\/ ___\| | \
|
|
|
|
@ -1863,40 +1948,40 @@ type Watch struct {
|
|
|
|
|
RepoID int64 `xorm:"UNIQUE(watch)"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func isWatching(e Engine, uid, repoId int64) bool {
|
|
|
|
|
has, _ := e.Get(&Watch{0, uid, repoId})
|
|
|
|
|
func isWatching(e Engine, userID, repoID int64) bool {
|
|
|
|
|
has, _ := e.Get(&Watch{0, userID, repoID})
|
|
|
|
|
return has
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsWatching checks if user has watched given repository.
|
|
|
|
|
func IsWatching(uid, repoId int64) bool {
|
|
|
|
|
return isWatching(x, uid, repoId)
|
|
|
|
|
func IsWatching(userID, repoID int64) bool {
|
|
|
|
|
return isWatching(x, userID, repoID)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func watchRepo(e Engine, uid, repoId int64, watch bool) (err error) {
|
|
|
|
|
func watchRepo(e Engine, userID, repoID int64, watch bool) (err error) {
|
|
|
|
|
if watch {
|
|
|
|
|
if isWatching(e, uid, repoId) {
|
|
|
|
|
if isWatching(e, userID, repoID) {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if _, err = e.Insert(&Watch{RepoID: repoId, UserID: uid}); err != nil {
|
|
|
|
|
if _, err = e.Insert(&Watch{RepoID: repoID, UserID: userID}); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, err = e.Exec("UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?", repoId)
|
|
|
|
|
_, err = e.Exec("UPDATE `repository` SET num_watches = num_watches + 1 WHERE id = ?", repoID)
|
|
|
|
|
} else {
|
|
|
|
|
if !isWatching(e, uid, repoId) {
|
|
|
|
|
if !isWatching(e, userID, repoID) {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if _, err = e.Delete(&Watch{0, uid, repoId}); err != nil {
|
|
|
|
|
if _, err = e.Delete(&Watch{0, userID, repoID}); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, err = e.Exec("UPDATE `repository` SET num_watches=num_watches-1 WHERE id=?", repoId)
|
|
|
|
|
_, err = e.Exec("UPDATE `repository` SET num_watches = num_watches - 1 WHERE id = ?", repoID)
|
|
|
|
|
}
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Watch or unwatch repository.
|
|
|
|
|
func WatchRepo(uid, repoId int64, watch bool) (err error) {
|
|
|
|
|
return watchRepo(x, uid, repoId, watch)
|
|
|
|
|
func WatchRepo(userID, repoID int64, watch bool) (err error) {
|
|
|
|
|
return watchRepo(x, userID, repoID, watch)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func getWatchers(e Engine, repoID int64) ([]*Watch, error) {
|
|
|
|
@ -1967,34 +2052,34 @@ type Star struct {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Star or unstar repository.
|
|
|
|
|
func StarRepo(uid, repoId int64, star bool) (err error) {
|
|
|
|
|
func StarRepo(userID, repoID int64, star bool) (err error) {
|
|
|
|
|
if star {
|
|
|
|
|
if IsStaring(uid, repoId) {
|
|
|
|
|
if IsStaring(userID, repoID) {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if _, err = x.Insert(&Star{UID: uid, RepoID: repoId}); err != nil {
|
|
|
|
|
if _, err = x.Insert(&Star{UID: userID, RepoID: repoID}); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
} else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoId); err != nil {
|
|
|
|
|
} else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars + 1 WHERE id = ?", repoID); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, err = x.Exec("UPDATE `user` SET num_stars = num_stars + 1 WHERE id = ?", uid)
|
|
|
|
|
_, err = x.Exec("UPDATE `user` SET num_stars = num_stars + 1 WHERE id = ?", userID)
|
|
|
|
|
} else {
|
|
|
|
|
if !IsStaring(uid, repoId) {
|
|
|
|
|
if !IsStaring(userID, repoID) {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if _, err = x.Delete(&Star{0, uid, repoId}); err != nil {
|
|
|
|
|
if _, err = x.Delete(&Star{0, userID, repoID}); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
} else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoId); err != nil {
|
|
|
|
|
} else if _, err = x.Exec("UPDATE `repository` SET num_stars = num_stars - 1 WHERE id = ?", repoID); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
_, err = x.Exec("UPDATE `user` SET num_stars = num_stars - 1 WHERE id = ?", uid)
|
|
|
|
|
_, err = x.Exec("UPDATE `user` SET num_stars = num_stars - 1 WHERE id = ?", userID)
|
|
|
|
|
}
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsStaring checks if user has starred given repository.
|
|
|
|
|
func IsStaring(uid, repoId int64) bool {
|
|
|
|
|
has, _ := x.Get(&Star{0, uid, repoId})
|
|
|
|
|
func IsStaring(userID, repoID int64) bool {
|
|
|
|
|
has, _ := x.Get(&Star{0, userID, repoID})
|
|
|
|
|
return has
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|