aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2018-06-17 22:18:41 +0800
committerUnknwon <u@gogs.io>2018-06-17 22:18:41 +0800
commit376a629c9f99893f341e76163e9b61273dd32c28 (patch)
tree4e3e1320c19d73c2282ff82c8d6aafb569ed9d87 /models
parent303fa37b608a4925f5a0137c89e20a906b3d9fdb (diff)
repo: add changes to repository avatar feature (#5221)
Diffstat (limited to 'models')
-rw-r--r--models/access.go4
-rw-r--r--models/repo.go59
-rw-r--r--models/user.go40
3 files changed, 51 insertions, 52 deletions
diff --git a/models/access.go b/models/access.go
index c10c9750..f9c0408c 100644
--- a/models/access.go
+++ b/models/access.go
@@ -237,6 +237,6 @@ func (repo *Repository) recalculateAccesses(e Engine) error {
}
// RecalculateAccesses recalculates all accesses for repository.
-func (r *Repository) RecalculateAccesses() error {
- return r.recalculateAccesses(x)
+func (repo *Repository) RecalculateAccesses() error {
+ return repo.recalculateAccesses(x)
}
diff --git a/models/repo.go b/models/repo.go
index 3a9f388b..c39d715f 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -7,6 +7,9 @@ package models
import (
"bytes"
"fmt"
+ "image"
+ _ "image/jpeg"
+ "image/png"
"io/ioutil"
"os"
"os/exec"
@@ -15,15 +18,12 @@ import (
"sort"
"strings"
"time"
- "image"
- _ "image/jpeg"
- "image/png"
"github.com/Unknwon/cae/zip"
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
- "github.com/nfnt/resize"
"github.com/mcuadros/go-version"
+ "github.com/nfnt/resize"
log "gopkg.in/clog.v1"
"gopkg.in/ini.v1"
@@ -39,6 +39,9 @@ import (
"github.com/gogs/gogs/pkg/sync"
)
+// REPO_AVATAR_URL_PREFIX is used to identify a URL is to access repository avatar.
+const REPO_AVATAR_URL_PREFIX = "repo-avatars"
+
var repoWorkingPool = sync.NewExclusivePool()
var (
@@ -146,16 +149,18 @@ func NewRepoContext() {
// Repository contains information of a repository.
type Repository struct {
- ID int64
- OwnerID int64 `xorm:"UNIQUE(s)"`
- Owner *User `xorm:"-" json:"-"`
- LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
- Name string `xorm:"INDEX NOT NULL"`
- Description string `xorm:"VARCHAR(512)"`
- Website string
- DefaultBranch string
- Size int64 `xorm:"NOT NULL DEFAULT 0"`
-
+ ID int64
+ OwnerID int64 `xorm:"UNIQUE(s)"`
+ Owner *User `xorm:"-" json:"-"`
+ LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
+ Name string `xorm:"INDEX NOT NULL"`
+ Description string `xorm:"VARCHAR(512)"`
+ Website string
+ DefaultBranch string
+ Size int64 `xorm:"NOT NULL DEFAULT 0"`
+ UseCustomAvatar bool
+
+ // Counters
NumWatches int
NumStars int
NumForks int
@@ -302,10 +307,10 @@ func (repo *Repository) RelAvatarLink() string {
if !com.IsExist(repo.CustomAvatarPath()) {
return defaultImgUrl
}
- return setting.AppSubURL + "/repo-avatars/" + com.ToStr(repo.ID)
+ return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, REPO_AVATAR_URL_PREFIX, repo.ID)
}
-// AvatarLink returns user avatar absolute link.
+// AvatarLink returns repository avatar absolute link.
func (repo *Repository) AvatarLink() string {
link := repo.RelAvatarLink()
if link[0] == '/' && link[1] != '/' {
@@ -315,24 +320,23 @@ func (repo *Repository) AvatarLink() string {
}
// UploadAvatar saves custom avatar for repository.
-// FIXME: split uploads to different subdirs
-// in case we have massive number of repositories.
+// FIXME: split uploads to different subdirs in case we have massive number of repositories.
func (repo *Repository) UploadAvatar(data []byte) error {
img, _, err := image.Decode(bytes.NewReader(data))
if err != nil {
- return fmt.Errorf("Decode: %v", err)
+ return fmt.Errorf("decode image: %v", err)
}
- m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
os.MkdirAll(setting.RepositoryAvatarUploadPath, os.ModePerm)
fw, err := os.Create(repo.CustomAvatarPath())
if err != nil {
- return fmt.Errorf("Create: %v", err)
+ return fmt.Errorf("create custom avatar directory: %v", err)
}
defer fw.Close()
+ m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
if err = png.Encode(fw, m); err != nil {
- return fmt.Errorf("Encode: %v", err)
+ return fmt.Errorf("encode image: %v", err)
}
return nil
@@ -341,7 +345,12 @@ func (repo *Repository) UploadAvatar(data []byte) error {
// DeleteAvatar deletes the repository custom avatar.
func (repo *Repository) DeleteAvatar() error {
log.Trace("DeleteAvatar [%d]: %s", repo.ID, repo.CustomAvatarPath())
- return os.Remove(repo.CustomAvatarPath())
+ if err := os.Remove(repo.CustomAvatarPath()); err != nil {
+ return err
+ }
+
+ repo.UseCustomAvatar = false
+ return UpdateRepository(repo, false)
}
// This method assumes following fields have been assigned with valid values:
@@ -372,8 +381,8 @@ func (repo *Repository) APIFormat(permission *api.Permission, user ...*User) *ap
Created: repo.Created,
Updated: repo.Updated,
Permissions: permission,
-// Reserved for go-gogs-client change
-// AvatarUrl: repo.AvatarLink(),
+ // Reserved for go-gogs-client change
+ // AvatarUrl: repo.AvatarLink(),
}
if repo.IsFork {
p := &api.Permission{Pull: true}
diff --git a/models/user.go b/models/user.go
index ab836b49..7e014df4 100644
--- a/models/user.go
+++ b/models/user.go
@@ -35,6 +35,9 @@ import (
"github.com/gogs/gogs/pkg/tool"
)
+// USER_AVATAR_URL_PREFIX is used to identify a URL is to access user avatar.
+const USER_AVATAR_URL_PREFIX = "avatars"
+
type UserType int
const (
@@ -257,7 +260,7 @@ func (u *User) RelAvatarLink() string {
if !com.IsExist(u.CustomAvatarPath()) {
return defaultImgUrl
}
- return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID)
+ return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, USER_AVATAR_URL_PREFIX, u.ID)
case setting.DisableGravatar, setting.OfflineMode:
if !com.IsExist(u.CustomAvatarPath()) {
if err := u.GenerateRandomAvatar(); err != nil {
@@ -265,7 +268,7 @@ func (u *User) RelAvatarLink() string {
}
}
- return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID)
+ return fmt.Sprintf("%s/%s/%d", setting.AppSubURL, USER_AVATAR_URL_PREFIX, u.ID)
}
return tool.AvatarLink(u.AvatarEmail)
}
@@ -330,50 +333,37 @@ func (u *User) ValidatePassword(passwd string) bool {
}
// UploadAvatar saves custom avatar for user.
-// FIXME: split uploads to different subdirs in case we have massive users.
+// FIXME: split uploads to different subdirs in case we have massive number of users.
func (u *User) UploadAvatar(data []byte) error {
img, _, err := image.Decode(bytes.NewReader(data))
if err != nil {
- return fmt.Errorf("Decode: %v", err)
- }
-
- m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
-
- sess := x.NewSession()
- defer sess.Close()
- if err = sess.Begin(); err != nil {
- return err
- }
-
- u.UseCustomAvatar = true
- if err = updateUser(sess, u); err != nil {
- return fmt.Errorf("updateUser: %v", err)
+ return fmt.Errorf("decode image: %v", err)
}
os.MkdirAll(setting.AvatarUploadPath, os.ModePerm)
fw, err := os.Create(u.CustomAvatarPath())
if err != nil {
- return fmt.Errorf("Create: %v", err)
+ return fmt.Errorf("create custom avatar directory: %v", err)
}
defer fw.Close()
+ m := resize.Resize(avatar.AVATAR_SIZE, avatar.AVATAR_SIZE, img, resize.NearestNeighbor)
if err = png.Encode(fw, m); err != nil {
- return fmt.Errorf("Encode: %v", err)
+ return fmt.Errorf("encode image: %v", err)
}
- return sess.Commit()
+ return nil
}
// DeleteAvatar deletes the user's custom avatar.
func (u *User) DeleteAvatar() error {
log.Trace("DeleteAvatar [%d]: %s", u.ID, u.CustomAvatarPath())
- os.Remove(u.CustomAvatarPath())
+ if err := os.Remove(u.CustomAvatarPath()); err != nil {
+ return err
+ }
u.UseCustomAvatar = false
- if err := UpdateUser(u); err != nil {
- return fmt.Errorf("UpdateUser: %v", err)
- }
- return nil
+ return UpdateUser(u)
}
// IsAdminOfRepo returns true if user has admin or higher access of repository.