diff options
author | Unknwon <u@gogs.io> | 2018-06-17 22:18:41 +0800 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2018-06-17 22:18:41 +0800 |
commit | 376a629c9f99893f341e76163e9b61273dd32c28 (patch) | |
tree | 4e3e1320c19d73c2282ff82c8d6aafb569ed9d87 /models | |
parent | 303fa37b608a4925f5a0137c89e20a906b3d9fdb (diff) |
repo: add changes to repository avatar feature (#5221)
Diffstat (limited to 'models')
-rw-r--r-- | models/access.go | 4 | ||||
-rw-r--r-- | models/repo.go | 59 | ||||
-rw-r--r-- | models/user.go | 40 |
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. |