aboutsummaryrefslogtreecommitdiff
path: root/models/repo.go
diff options
context:
space:
mode:
Diffstat (limited to 'models/repo.go')
-rw-r--r--models/repo.go135
1 files changed, 104 insertions, 31 deletions
diff --git a/models/repo.go b/models/repo.go
index e97164d2..4382bd7d 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -18,6 +18,7 @@ import (
"github.com/Unknwon/cae/zip"
"github.com/Unknwon/com"
+ qlog "github.com/qiniu/log"
"github.com/gogits/git"
@@ -39,8 +40,38 @@ var (
)
func LoadRepoConfig() {
- LanguageIgns = strings.Split(base.Cfg.MustValue("repository", "LANG_IGNS"), "|")
- Licenses = strings.Split(base.Cfg.MustValue("repository", "LICENSES"), "|")
+ workDir, err := base.ExecDir()
+ if err != nil {
+ qlog.Fatalf("Fail to get work directory: %s\n", err)
+ }
+
+ // Load .gitignore and license files.
+ types := []string{"gitignore", "license"}
+ typeFiles := make([][]string, 2)
+ for i, t := range types {
+ cfgPath := filepath.Join(workDir, "conf", t)
+ files, err := com.StatDir(cfgPath)
+ if err != nil {
+ qlog.Fatalf("Fail to get default %s files: %v\n", t, err)
+ }
+ cfgPath = filepath.Join(workDir, "custom/conf/gitignore")
+ if com.IsDir(cfgPath) {
+ customFiles, err := com.StatDir(cfgPath)
+ if err != nil {
+ qlog.Fatalf("Fail to get custom %s files: %v\n", t, err)
+ }
+
+ for _, f := range customFiles {
+ if !com.IsSliceContainsStr(files, f) {
+ files = append(files, f)
+ }
+ }
+ }
+ typeFiles[i] = files
+ }
+
+ LanguageIgns = typeFiles[0]
+ Licenses = typeFiles[1]
}
func NewRepoContext() {
@@ -49,43 +80,43 @@ func NewRepoContext() {
// Check if server has basic git setting.
stdout, stderr, err := com.ExecCmd("git", "config", "--get", "user.name")
if strings.Contains(stderr, "fatal:") {
- fmt.Printf("repo.NewRepoContext(fail to get git user.name): %s", stderr)
- os.Exit(2)
+ qlog.Fatalf("repo.NewRepoContext(fail to get git user.name): %s", stderr)
} else if err != nil || len(strings.TrimSpace(stdout)) == 0 {
if _, stderr, err = com.ExecCmd("git", "config", "--global", "user.email", "gogitservice@gmail.com"); err != nil {
- fmt.Printf("repo.NewRepoContext(fail to set git user.email): %s", stderr)
- os.Exit(2)
+ qlog.Fatalf("repo.NewRepoContext(fail to set git user.email): %s", stderr)
} else if _, stderr, err = com.ExecCmd("git", "config", "--global", "user.name", "Gogs"); err != nil {
- fmt.Printf("repo.NewRepoContext(fail to set git user.name): %s", stderr)
- os.Exit(2)
+ qlog.Fatalf("repo.NewRepoContext(fail to set git user.name): %s", stderr)
}
}
}
// Repository represents a git repository.
type Repository struct {
- Id int64
- OwnerId int64 `xorm:"unique(s)"`
- Owner *User `xorm:"-"`
- ForkId int64
- LowerName string `xorm:"unique(s) index not null"`
- Name string `xorm:"index not null"`
- Description string
- Website string
- NumWatches int
- NumStars int
- NumForks int
- NumIssues int
- NumClosedIssues int
- NumOpenIssues int `xorm:"-"`
- NumTags int `xorm:"-"`
- IsPrivate bool
- IsMirror bool
- IsBare bool
- IsGoget bool
- DefaultBranch string
- Created time.Time `xorm:"created"`
- Updated time.Time `xorm:"updated"`
+ Id int64
+ OwnerId int64 `xorm:"unique(s)"`
+ Owner *User `xorm:"-"`
+ ForkId int64
+ LowerName string `xorm:"unique(s) index not null"`
+ Name string `xorm:"index not null"`
+ Description string
+ Website string
+ NumWatches int
+ NumStars int
+ NumForks int
+ NumIssues int
+ NumClosedIssues int
+ NumOpenIssues int `xorm:"-"`
+ NumMilestones int `xorm:"NOT NULL DEFAULT 0"`
+ NumClosedMilestones int `xorm:"NOT NULL DEFAULT 0"`
+ NumOpenMilestones int `xorm:"-"`
+ NumTags int `xorm:"-"`
+ IsPrivate bool
+ IsMirror bool
+ IsBare bool
+ IsGoget bool
+ DefaultBranch string
+ Created time.Time `xorm:"created"`
+ Updated time.Time `xorm:"updated"`
}
func (repo *Repository) GetOwner() (err error) {
@@ -645,6 +676,18 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) {
sess.Rollback()
return err
}
+ if _, err = sess.Delete(&Issue{RepoId: repoId}); err != nil {
+ sess.Rollback()
+ return err
+ }
+ if _, err = sess.Delete(&IssueUser{RepoId: repoId}); err != nil {
+ sess.Rollback()
+ return err
+ }
+ if _, err = sess.Delete(&Milestone{RepoId: repoId}); err != nil {
+ sess.Rollback()
+ return err
+ }
rawSql := "UPDATE `user` SET num_repos = num_repos - 1 WHERE id = ?"
if _, err = sess.Exec(rawSql, userId); err != nil {
@@ -690,7 +733,7 @@ func GetRepositoryById(id int64) (*Repository, error) {
return repo, nil
}
-// GetRepositories returns the list of repositories of given user.
+// GetRepositories returns a list of repositories of given user.
func GetRepositories(user *User, private bool) ([]*Repository, error) {
repos := make([]*Repository, 0, 10)
sess := orm.Desc("updated")
@@ -727,6 +770,36 @@ func GetCollaboratorNames(repoName string) ([]string, error) {
return names, nil
}
+// GetCollaborativeRepos returns a list of repositories that user is collaborator.
+func GetCollaborativeRepos(uname string) ([]*Repository, error) {
+ uname = strings.ToLower(uname)
+ accesses := make([]*Access, 0, 10)
+ if err := orm.Find(&accesses, &Access{UserName: uname}); err != nil {
+ return nil, err
+ }
+
+ repos := make([]*Repository, 0, 10)
+ for _, access := range accesses {
+ if strings.HasPrefix(access.RepoName, uname) {
+ continue
+ }
+
+ infos := strings.Split(access.RepoName, "/")
+ u, err := GetUserByName(infos[0])
+ if err != nil {
+ return nil, err
+ }
+
+ repo, err := GetRepositoryByName(u.Id, infos[1])
+ if err != nil {
+ return nil, err
+ }
+ repo.Owner = u
+ repos = append(repos, repo)
+ }
+ return repos, nil
+}
+
// GetCollaborators returns a list of users of repository's collaborators.
func GetCollaborators(repoName string) (us []*User, err error) {
accesses := make([]*Access, 0, 10)