summaryrefslogtreecommitdiffstats
path: root/models/repo.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2014-02-14 22:20:57 +0800
committerLunny Xiao <xiaolunwen@gmail.com>2014-02-14 22:20:57 +0800
commit237193ef2a58d890d50e96fcc99481849c42dca9 (patch)
tree3418b87d6f631abb15678bb32dc897ba7a4dcd18 /models/repo.go
parenta30e5bcaf83a82f5f7d1c89a6f9f7e52036d74af (diff)
downloadgitea-237193ef2a58d890d50e96fcc99481849c42dca9.tar.gz
gitea-237193ef2a58d890d50e96fcc99481849c42dca9.zip
add user models
Diffstat (limited to 'models/repo.go')
-rw-r--r--models/repo.go119
1 files changed, 119 insertions, 0 deletions
diff --git a/models/repo.go b/models/repo.go
new file mode 100644
index 0000000000..8e3aae9ab4
--- /dev/null
+++ b/models/repo.go
@@ -0,0 +1,119 @@
+package models
+
+import (
+ "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 exist
+func 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 repository
+func 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
+}