aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
Diffstat (limited to 'models')
-rw-r--r--models/access.go8
-rw-r--r--models/git.go19
-rw-r--r--models/oauth2.go18
-rw-r--r--models/repo.go23
-rw-r--r--models/user.go49
5 files changed, 116 insertions, 1 deletions
diff --git a/models/access.go b/models/access.go
index 42fccae0..83261575 100644
--- a/models/access.go
+++ b/models/access.go
@@ -32,6 +32,14 @@ func AddAccess(access *Access) error {
return err
}
+// UpdateAccess updates access information.
+func UpdateAccess(access *Access) error {
+ access.UserName = strings.ToLower(access.UserName)
+ access.RepoName = strings.ToLower(access.RepoName)
+ _, err := orm.Id(access.Id).Update(access)
+ return err
+}
+
// HasAccess returns true if someone can read or write to given repository.
func HasAccess(userName, repoName string, mode int) (bool, error) {
return orm.Get(&Access{
diff --git a/models/git.go b/models/git.go
index d3bad6e0..46345d0f 100644
--- a/models/git.go
+++ b/models/git.go
@@ -56,6 +56,25 @@ func GetBranches(userName, repoName string) ([]string, error) {
return brs, nil
}
+// GetTags returns all tags of given repository.
+func GetTags(userName, repoName string) ([]string, error) {
+ repo, err := git.OpenRepository(RepoPath(userName, repoName))
+ if err != nil {
+ return nil, err
+ }
+
+ refs, err := repo.AllTags()
+ if err != nil {
+ return nil, err
+ }
+
+ tags := make([]string, len(refs))
+ for i, ref := range refs {
+ tags[i] = ref.Name
+ }
+ return tags, nil
+}
+
func IsBranchExist(userName, repoName, branchName string) bool {
repo, err := git.OpenRepository(RepoPath(userName, repoName))
if err != nil {
diff --git a/models/oauth2.go b/models/oauth2.go
new file mode 100644
index 00000000..70dcd510
--- /dev/null
+++ b/models/oauth2.go
@@ -0,0 +1,18 @@
+package models
+
+import "time"
+
+// OT: Oauth2 Type
+const (
+ OT_GITHUB = iota + 1
+ OT_GOOGLE
+ OT_TWITTER
+)
+
+type Oauth2 struct {
+ Uid int64 `xorm:"pk"` // userId
+ Type int `xorm:"pk unique(oauth)"` // twitter,github,google...
+ Identity string `xorm:"pk unique(oauth)"` // id..
+ Token string `xorm:"VARCHAR(200) not null"`
+ RefreshTime time.Time `xorm:"created"`
+}
diff --git a/models/repo.go b/models/repo.go
index 0c808f18..56f28909 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -74,6 +74,7 @@ type Repository struct {
NumStars int
NumForks int
NumIssues int
+ NumReleases int `xorm:"NOT NULL"`
NumClosedIssues int
NumOpenIssues int `xorm:"-"`
IsPrivate bool
@@ -368,14 +369,33 @@ func RepoPath(userName, repoName string) string {
return filepath.Join(UserPath(userName), strings.ToLower(repoName)+".git")
}
+// ChangeRepositoryName changes all corresponding setting from old repository name to new one.
+func ChangeRepositoryName(userName, oldRepoName, newRepoName string) (err error) {
+ // Update accesses.
+ accesses := make([]Access, 0, 10)
+ if err = orm.Find(&accesses, &Access{RepoName: strings.ToLower(userName + "/" + oldRepoName)}); err != nil {
+ return err
+ }
+ for i := range accesses {
+ accesses[i].RepoName = userName + "/" + newRepoName
+ if err = UpdateAccess(&accesses[i]); err != nil {
+ return err
+ }
+ }
+
+ // Change repository directory name.
+ return os.Rename(RepoPath(userName, oldRepoName), RepoPath(userName, newRepoName))
+}
+
func UpdateRepository(repo *Repository) error {
+ repo.LowerName = strings.ToLower(repo.Name)
+
if len(repo.Description) > 255 {
repo.Description = repo.Description[:255]
}
if len(repo.Website) > 255 {
repo.Website = repo.Website[:255]
}
-
_, err := orm.Id(repo.Id).AllCols().Update(repo)
return err
}
@@ -513,6 +533,7 @@ func NotifyWatchers(act *Action) error {
continue
}
+ act.Id = 0
act.UserId = watches[i].UserId
if _, err = orm.InsertOne(act); err != nil {
return errors.New("repo.NotifyWatchers(create action): " + err.Error())
diff --git a/models/user.go b/models/user.go
index 4908552f..c5e46b48 100644
--- a/models/user.go
+++ b/models/user.go
@@ -203,8 +203,52 @@ func VerifyUserActiveCode(code string) (user *User) {
return nil
}
+// ChangeUserName changes all corresponding setting from old user name to new one.
+func ChangeUserName(user *User, newUserName string) (err error) {
+ newUserName = strings.ToLower(newUserName)
+
+ // Update accesses of user.
+ accesses := make([]Access, 0, 10)
+ if err = orm.Find(&accesses, &Access{UserName: user.LowerName}); err != nil {
+ return err
+ }
+ for i := range accesses {
+ accesses[i].UserName = newUserName
+ if strings.HasPrefix(accesses[i].RepoName, user.LowerName+"/") {
+ accesses[i].RepoName = strings.Replace(accesses[i].RepoName, user.LowerName, newUserName, 1)
+ if err = UpdateAccess(&accesses[i]); err != nil {
+ return err
+ }
+ }
+ }
+
+ repos, err := GetRepositories(user)
+ if err != nil {
+ return err
+ }
+ for i := range repos {
+ accesses = make([]Access, 0, 10)
+ // Update accesses of user repository.
+ if err = orm.Find(&accesses, &Access{RepoName: user.LowerName + "/" + repos[i].LowerName}); err != nil {
+ return err
+ }
+
+ for j := range accesses {
+ accesses[j].RepoName = newUserName + "/" + repos[i].LowerName
+ if err = UpdateAccess(&accesses[j]); err != nil {
+ return err
+ }
+ }
+ }
+
+ // Change user directory name.
+ return os.Rename(UserPath(user.LowerName), UserPath(newUserName))
+}
+
// UpdateUser updates user's information.
func UpdateUser(user *User) (err error) {
+ user.LowerName = strings.ToLower(user.Name)
+
if len(user.Location) > 255 {
user.Location = user.Location[:255]
}
@@ -233,6 +277,11 @@ func DeleteUser(user *User) error {
return err
}
+ // Delete all accesses.
+ if _, err = orm.Delete(&Access{UserName: user.LowerName}); err != nil {
+ return err
+ }
+
// Delete all SSH keys.
keys := make([]PublicKey, 0, 10)
if err = orm.Find(&keys, &PublicKey{OwnerId: user.Id}); err != nil {