|
@@ -15,10 +15,14 @@ import (
|
|
"sort"
|
|
"sort"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
|
|
+ "image"
|
|
|
|
+ _ "image/jpeg"
|
|
|
|
+ "image/png"
|
|
|
|
|
|
"github.com/Unknwon/cae/zip"
|
|
"github.com/Unknwon/cae/zip"
|
|
"github.com/Unknwon/com"
|
|
"github.com/Unknwon/com"
|
|
"github.com/go-xorm/xorm"
|
|
"github.com/go-xorm/xorm"
|
|
|
|
+ "github.com/nfnt/resize"
|
|
"github.com/mcuadros/go-version"
|
|
"github.com/mcuadros/go-version"
|
|
log "gopkg.in/clog.v1"
|
|
log "gopkg.in/clog.v1"
|
|
"gopkg.in/ini.v1"
|
|
"gopkg.in/ini.v1"
|
|
@@ -27,6 +31,7 @@ import (
|
|
api "github.com/gogs/go-gogs-client"
|
|
api "github.com/gogs/go-gogs-client"
|
|
|
|
|
|
"github.com/gogs/gogs/models/errors"
|
|
"github.com/gogs/gogs/models/errors"
|
|
|
|
+ "github.com/gogs/gogs/pkg/avatar"
|
|
"github.com/gogs/gogs/pkg/bindata"
|
|
"github.com/gogs/gogs/pkg/bindata"
|
|
"github.com/gogs/gogs/pkg/markup"
|
|
"github.com/gogs/gogs/pkg/markup"
|
|
"github.com/gogs/gogs/pkg/process"
|
|
"github.com/gogs/gogs/pkg/process"
|
|
@@ -284,6 +289,61 @@ func (repo *Repository) HTMLURL() string {
|
|
return setting.AppURL + repo.FullName()
|
|
return setting.AppURL + repo.FullName()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// CustomAvatarPath returns repository custom avatar file path.
|
|
|
|
+func (repo *Repository) CustomAvatarPath() string {
|
|
|
|
+ return filepath.Join(setting.RepositoryAvatarUploadPath, com.ToStr(repo.ID))
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// RelAvatarLink returns relative avatar link to the site domain,
|
|
|
|
+// which includes app sub-url as prefix.
|
|
|
|
+// Since Gravatar support not needed here - just check for image path.
|
|
|
|
+func (repo *Repository) RelAvatarLink() string {
|
|
|
|
+ defaultImgUrl := ""
|
|
|
|
+ if !com.IsExist(repo.CustomAvatarPath()) {
|
|
|
|
+ return defaultImgUrl
|
|
|
|
+ }
|
|
|
|
+ return setting.AppSubURL + "/repo-avatars/" + com.ToStr(repo.ID)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// AvatarLink returns user avatar absolute link.
|
|
|
|
+func (repo *Repository) AvatarLink() string {
|
|
|
|
+ link := repo.RelAvatarLink()
|
|
|
|
+ if link[0] == '/' && link[1] != '/' {
|
|
|
|
+ return setting.AppURL + strings.TrimPrefix(link, setting.AppSubURL)[1:]
|
|
|
|
+ }
|
|
|
|
+ return link
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// UploadAvatar saves custom avatar for repository.
|
|
|
|
+// 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)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ 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)
|
|
|
|
+ }
|
|
|
|
+ defer fw.Close()
|
|
|
|
+
|
|
|
|
+ if err = png.Encode(fw, m); err != nil {
|
|
|
|
+ return fmt.Errorf("Encode: %v", err)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+// 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())
|
|
|
|
+}
|
|
|
|
+
|
|
// This method assumes following fields have been assigned with valid values:
|
|
// This method assumes following fields have been assigned with valid values:
|
|
// Required - BaseRepo (if fork)
|
|
// Required - BaseRepo (if fork)
|
|
// Arguments that are allowed to be nil: permission
|
|
// Arguments that are allowed to be nil: permission
|
|
@@ -312,6 +372,8 @@ func (repo *Repository) APIFormat(permission *api.Permission, user ...*User) *ap
|
|
Created: repo.Created,
|
|
Created: repo.Created,
|
|
Updated: repo.Updated,
|
|
Updated: repo.Updated,
|
|
Permissions: permission,
|
|
Permissions: permission,
|
|
|
|
+// Reserved for go-gogs-client change
|
|
|
|
+// AvatarUrl: repo.AvatarLink(),
|
|
}
|
|
}
|
|
if repo.IsFork {
|
|
if repo.IsFork {
|
|
p := &api.Permission{Pull: true}
|
|
p := &api.Permission{Pull: true}
|