From a0f9197b4573aa9d4d868637ed00e710a435797b Mon Sep 17 00:00:00 2001 From: Unknwon Date: Sun, 16 Nov 2014 21:32:26 -0500 Subject: [PATCH] GetFile api --- cmd/web.go | 1 + modules/avatar/avatar.go | 16 +++++++++++----- modules/middleware/repo.go | 11 +++++++++++ routers/api/v1/repo.go | 16 ++++------------ routers/api/v1/repo_file.go | 27 +++++++++++++++++++++++++++ routers/repo/download.go | 28 +++++++++++++++++++--------- 6 files changed, 73 insertions(+), 26 deletions(-) diff --git a/cmd/web.go b/cmd/web.go index e3d209a0a..a99ee4a1f 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -183,6 +183,7 @@ func runWeb(*cli.Context) { m.Group("/:username/:reponame", func() { m.Combo("/hooks").Get(v1.ListRepoHooks).Post(bind(v1.CreateRepoHookForm{}), v1.CreateRepoHook) m.Patch("/hooks/:id:int", bind(v1.EditRepoHookForm{}), v1.EditRepoHook) + m.Get("/raw/*", middleware.RepoRef(), v1.GetRepoRawFile) }, middleware.ApiRepoAssignment(), middleware.ApiReqToken()) }) diff --git a/modules/avatar/avatar.go b/modules/avatar/avatar.go index 5ed5d16a6..fb198da14 100644 --- a/modules/avatar/avatar.go +++ b/modules/avatar/avatar.go @@ -33,11 +33,17 @@ import ( "github.com/nfnt/resize" "github.com/gogits/gogs/modules/log" + "github.com/gogits/gogs/modules/setting" ) -var ( - gravatar = "http://www.gravatar.com/avatar" -) +var gravatarSource string + +func init() { + gravatarSource = setting.GravatarSource + if !strings.HasPrefix(gravatarSource, "http:") { + gravatarSource = "http:" + gravatarSource + } +} // hash email to md5 string // keep this func in order to make this package indenpent @@ -121,7 +127,7 @@ func (this *Avatar) Encode(wr io.Writer, size int) (err error) { // get image from gravatar.com func (this *Avatar) Update() { - thunder.Fetch(gravatar+"/"+this.Hash+"?"+this.reqParams, + thunder.Fetch(gravatarSource+this.Hash+"?"+this.reqParams, this.imagePath) } @@ -129,7 +135,7 @@ func (this *Avatar) UpdateTimeout(timeout time.Duration) (err error) { select { case <-time.After(timeout): err = fmt.Errorf("get gravatar image %s timeout", this.Hash) - case err = <-thunder.GoFetch(gravatar+"/"+this.Hash+"?"+this.reqParams, + case err = <-thunder.GoFetch(gravatarSource+this.Hash+"?"+this.reqParams, this.imagePath): } return err diff --git a/modules/middleware/repo.go b/modules/middleware/repo.go index d01f93fa4..2d311d213 100644 --- a/modules/middleware/repo.go +++ b/modules/middleware/repo.go @@ -122,6 +122,17 @@ func RepoRef() macaron.Handler { err error ) + // For API calls. + if ctx.Repo.GitRepo == nil { + repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) + gitRepo, err := git.OpenRepository(repoPath) + if err != nil { + ctx.Handle(500, "RepoRef Invalid repo "+repoPath, err) + return + } + ctx.Repo.GitRepo = gitRepo + } + // Get default branch. if len(ctx.Params("*")) == 0 { refName = ctx.Repo.Repository.DefaultBranch diff --git a/routers/api/v1/repo.go b/routers/api/v1/repo.go index aeb22876b..33e3b05a4 100644 --- a/routers/api/v1/repo.go +++ b/routers/api/v1/repo.go @@ -15,6 +15,7 @@ import ( "github.com/gogits/gogs/models" "github.com/gogits/gogs/modules/auth" + "github.com/gogits/gogs/modules/base" "github.com/gogits/gogs/modules/log" "github.com/gogits/gogs/modules/middleware" "github.com/gogits/gogs/modules/setting" @@ -161,20 +162,14 @@ func Migrate(ctx *middleware.Context, form auth.MigrateRepoForm) { func ListMyRepos(ctx *middleware.Context) { ownRepos, err := models.GetRepositories(ctx.User.Id, true) if err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), - }) + ctx.JSON(500, &base.ApiJsonErr{"GetRepositories: " + err.Error(), base.DOC_URL}) return } numOwnRepos := len(ownRepos) collaRepos, err := models.GetCollaborativeRepos(ctx.User.Name) if err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), - }) + ctx.JSON(500, &base.ApiJsonErr{"GetCollaborativeRepos: " + err.Error(), base.DOC_URL}) return } @@ -204,10 +199,7 @@ func ListMyRepos(ctx *middleware.Context) { } for i := range collaRepos { if err = collaRepos[i].GetOwner(); err != nil { - ctx.JSON(500, map[string]interface{}{ - "ok": false, - "error": err.Error(), - }) + ctx.JSON(500, &base.ApiJsonErr{"GetOwner: " + err.Error(), base.DOC_URL}) return } j := i + numOwnRepos diff --git a/routers/api/v1/repo_file.go b/routers/api/v1/repo_file.go index ca06a2e9b..a049904f9 100644 --- a/routers/api/v1/repo_file.go +++ b/routers/api/v1/repo_file.go @@ -3,3 +3,30 @@ // license that can be found in the LICENSE file. package v1 + +import ( + "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/git" + "github.com/gogits/gogs/modules/middleware" + "github.com/gogits/gogs/routers/repo" +) + +func GetRepoRawFile(ctx *middleware.Context) { + if ctx.Repo.Repository.IsPrivate && !ctx.Repo.HasAccess { + ctx.Error(404) + return + } + + blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName) + if err != nil { + if err == git.ErrNotExist { + ctx.Error(404) + } else { + ctx.JSON(500, &base.ApiJsonErr{"GetBlobByPath: " + err.Error(), base.DOC_URL}) + } + return + } + if err = repo.ServeBlob(ctx, blob); err != nil { + ctx.JSON(500, &base.ApiJsonErr{"ServeBlob: " + err.Error(), base.DOC_URL}) + } +} diff --git a/routers/repo/download.go b/routers/repo/download.go index 17642a57e..6367c40e2 100644 --- a/routers/repo/download.go +++ b/routers/repo/download.go @@ -9,20 +9,14 @@ import ( "path" "github.com/gogits/gogs/modules/base" + "github.com/gogits/gogs/modules/git" "github.com/gogits/gogs/modules/middleware" ) -func SingleDownload(ctx *middleware.Context) { - blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName) - if err != nil { - ctx.Handle(500, "GetBlobByPath", err) - return - } - +func ServeBlob(ctx *middleware.Context, blob *git.Blob) error { dataRc, err := blob.Data() if err != nil { - ctx.Handle(500, "Data", err) - return + return err } buf := make([]byte, 1024) @@ -40,4 +34,20 @@ func SingleDownload(ctx *middleware.Context) { } ctx.Resp.Write(buf) io.Copy(ctx.Resp, dataRc) + return nil +} + +func SingleDownload(ctx *middleware.Context) { + blob, err := ctx.Repo.Commit.GetBlobByPath(ctx.Repo.TreeName) + if err != nil { + if err == git.ErrNotExist { + ctx.Handle(404, "GetBlobByPath", nil) + } else { + ctx.Handle(500, "GetBlobByPath", err) + } + return + } + if err = ServeBlob(ctx, blob); err != nil { + ctx.Handle(500, "ServeBlob", err) + } }