| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | package modelsimport (	"os"	"path/filepath"	"strings"	"time"	git "github.com/libgit2/git2go")type Repo struct {	Id        int64	OwnerId   int64 `xorm:"unique(s)"`	ForkId    int64	LowerName string `xorm:"unique(s) index not null"`	Name      string `xorm:"index not null"`	NumWatchs int	NumStars  int	NumForks  int	Created   time.Time `xorm:"created"`	Updated   time.Time `xorm:"updated"`}// check if repository is existfunc IsRepositoryExist(user *User, reposName string) (bool, error) {	repo := Repo{OwnerId: user.Id}	// TODO: get repository by nocase name	return orm.Where("lower_name = ?", strings.ToLower(reposName)).Get(&repo)}//// create a repository for a user or orgnaziation//func CreateRepository(user *User, reposName string) (*Repo, error) {	p := filepath.Join(root, user.Name)	os.MkdirAll(p, os.ModePerm)	f := filepath.Join(p, reposName)	_, err := git.InitRepository(f, false)	if err != nil {		return nil, err	}	repo := Repo{OwnerId: user.Id, Name: reposName}	session := orm.NewSession()	defer session.Close()	session.Begin()	_, err = session.Insert(&repo)	if err != nil {		os.RemoveAll(f)		session.Rollback()		return nil, err	}	_, err = session.Exec("update user set num_repos = num_repos + 1 where id = ?", user.Id)	if err != nil {		os.RemoveAll(f)		session.Rollback()		return nil, err	}	err = session.Commit()	if err != nil {		os.RemoveAll(f)		session.Rollback()		return nil, err	}	return &repo, nil}// list one user's repositoryfunc GetRepositories(user *User) ([]Repo, error) {	repos := make([]Repo, 0)	err := orm.Find(&repos, &Repo{OwnerId: user.Id})	return repos, err}func StarReposiory(user *User, repoName string) error {	return nil}func UnStarRepository() {}func WatchRepository() {}func UnWatchRepository() {}//// delete a repository for a user or orgnaztion//func DeleteRepository(user *User, reposName string) error {	session := orm.NewSession()	_, err := session.Delete(&Repo{OwnerId: user.Id, Name: reposName})	if err != nil {		session.Rollback()		return err	}	_, err = session.Exec("update user set num_repos = num_repos - 1 where id = ?", user.Id)	if err != nil {		session.Rollback()		return err	}	err = session.Commit()	if err != nil {		session.Rollback()		return err	}	err = os.RemoveAll(filepath.Join(root, user.Name, reposName))	if err != nil {		// TODO: log and delete manully		return err	}	return nil}
 |