diff --git a/models/release.go b/models/release.go index 1ce88a821..06a4f7848 100644 --- a/models/release.go +++ b/models/release.go @@ -242,6 +242,27 @@ func GetLatestReleaseByRepoID(repoID int64) (*Release, error) { return rel, nil } +// GetLatestReleaseByRepoID returns the latest release for a repository +func GetLatestReleaseByRepoIDExt(repoID int64) (*Release, error) { + cond := builder.NewCond(). + And(builder.Eq{"repo_id": repoID}). + And(builder.Eq{"is_draft": false}). + And(builder.Eq{"is_prerelease": false}) + + rel := new(Release) + has, err := x. + Desc("created_unix", "id"). + Where(cond). + Get(rel) + if err != nil { + return nil, err + } else if !has { + return nil, ErrReleaseNotExist{0, "latest"} + } + + return rel, nil +} + // GetReleasesByRepoIDAndNames returns a list of releases of repository according repoID and tagNames. func GetReleasesByRepoIDAndNames(ctx DBContext, repoID int64, tagNames []string) (rels []*Release, err error) { err = ctx.e. diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 303846110..820e28fd0 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -775,6 +775,9 @@ func Routes() *web.Route { m.Get("/archive/*", reqRepoReader(models.UnitTypeCode), repo.GetArchive) m.Get("/find", viewfile.FindFiles) + m.Group("/releases", func() { + m.Get("/latest", viewfile.LatestRelease) + }) m.Combo("/forks").Get(repo.ListForks). Post(reqToken(), reqRepoReader(models.UnitTypeCode), bind(api.CreateForkOption{}), repo.CreateFork) m.Group("/branches", func() { diff --git a/routers/api/v1/viewfile/viewfile.go b/routers/api/v1/viewfile/viewfile.go index 649e92d49..6db573b8f 100644 --- a/routers/api/v1/viewfile/viewfile.go +++ b/routers/api/v1/viewfile/viewfile.go @@ -159,3 +159,61 @@ func FindFileFromPathEtx(ctx *context.APIContext, treePath, ref, key string) (fi return } + +func LatestRelease(ctx *context.APIContext) { + // swagger:operation GET /repos/{owner}/{repo}/releases/latest repository latest + // --- + // summary: Get the last updated Release version of the repository., which is a custom interface **** + // produces: + // - application/json + // parameters: + // - name: owner + // in: path + // description: owner of the repo + // type: string + // required: true + // - name: repo + // in: path + // description: name of the repo + // type: string + // required: true + // responses: + // "200": + // "$ref": "#/responses/release" + // "404": + // "$ref": "#/responses/notFound" + + var err error + if ctx.Repo.GitRepo == nil { + repoPath := models.RepoPath(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) + ctx.Repo.GitRepo, err = git.OpenRepository(repoPath) + if err != nil { + ctx.ServerError("Reporef Invalid repo"+repoPath, err) + return + } + defer func() { + if ctx.Repo.GitRepo != nil { + ctx.Repo.GitRepo.Close() + } + }() + } + release, err := models.GetLatestReleaseByRepoIDExt(ctx.Repo.Repository.ID) + fmt.Println("****************ctx.Repo.Repository.ID:", ctx.Repo.Repository.ID, " ", release, " ", err) + + if err != nil { + if models.IsErrReleaseNotExist(err) { + ctx.NotFound("LatestRelease", err) + return + } + ctx.ServerError("GetLatestReleaseByRepoIDExt", err) + return + + } + if err := release.LoadAttributes(); err != nil { + ctx.ServerError("LoadAttributes", err) + return + } + release.Publisher.Passwd = "" + ctx.JSON(http.StatusOK, release) + +} diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 072a195d6..fd8136ad6 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -8679,6 +8679,42 @@ } } }, + "/repos/{owner}/{repo}/releases/latest": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "repository" + ], + "summary": "Get the last updated Release version of the repository., which is a custom interface ****", + "operationId": "latest", + "parameters": [ + { + "type": "string", + "description": "owner of the repo", + "name": "owner", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "name of the repo", + "name": "repo", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/release" + }, + "404": { + "$ref": "#/responses/notFound" + } + } + } + }, "/repos/{owner}/{repo}/releases/tags/{tag}": { "get": { "produces": [