aboutsummaryrefslogtreecommitdiff
path: root/routers/api
diff options
context:
space:
mode:
Diffstat (limited to 'routers/api')
-rw-r--r--routers/api/v1/repo.go77
-rw-r--r--routers/api/v1/user.go2
2 files changed, 51 insertions, 28 deletions
diff --git a/routers/api/v1/repo.go b/routers/api/v1/repo.go
index 9cdb16f8..b4da4c6f 100644
--- a/routers/api/v1/repo.go
+++ b/routers/api/v1/repo.go
@@ -5,9 +5,7 @@
package v1
import (
- "net/url"
"path"
- "strings"
"github.com/Unknwon/com"
@@ -108,9 +106,9 @@ func ListMyRepos(ctx *middleware.Context) {
}
numOwnRepos := len(ownRepos)
- accessibleRepos, err := ctx.User.GetAccessibleRepositories()
+ accessibleRepos, err := ctx.User.GetRepositoryAccesses()
if err != nil {
- ctx.APIError(500, "GetAccessibleRepositories", err)
+ ctx.APIError(500, "GetRepositoryAccesses", err)
return
}
@@ -218,26 +216,33 @@ func MigrateRepo(ctx *middleware.Context, form auth.MigrateRepoForm) {
}
}
- // Remote address can be HTTP/HTTPS/Git URL or local path.
- remoteAddr := form.CloneAddr
- if strings.HasPrefix(form.CloneAddr, "http://") ||
- strings.HasPrefix(form.CloneAddr, "https://") ||
- strings.HasPrefix(form.CloneAddr, "git://") {
- u, err := url.Parse(form.CloneAddr)
- if err != nil {
- ctx.APIError(422, "", err)
- return
- }
- if len(form.AuthUsername) > 0 || len(form.AuthPassword) > 0 {
- u.User = url.UserPassword(form.AuthUsername, form.AuthPassword)
+ remoteAddr, err := form.ParseRemoteAddr(ctx.User)
+ if err != nil {
+ if models.IsErrInvalidCloneAddr(err) {
+ addrErr := err.(models.ErrInvalidCloneAddr)
+ switch {
+ case addrErr.IsURLError:
+ ctx.APIError(422, "", err)
+ case addrErr.IsPermissionDenied:
+ ctx.APIError(422, "", "You are not allowed to import local repositories.")
+ case addrErr.IsInvalidPath:
+ ctx.APIError(422, "", "Invalid local path, it does not exist or not a directory.")
+ default:
+ ctx.APIError(500, "ParseRemoteAddr", "Unknown error type (ErrInvalidCloneAddr): "+err.Error())
+ }
+ } else {
+ ctx.APIError(500, "ParseRemoteAddr", err)
}
- remoteAddr = u.String()
- } else if !com.IsDir(remoteAddr) {
- ctx.APIError(422, "", "Invalid local path, it does not exist or not a directory.")
return
}
- repo, err := models.MigrateRepository(ctxUser, form.RepoName, form.Description, form.Private, form.Mirror, remoteAddr)
+ repo, err := models.MigrateRepository(ctxUser, models.MigrateRepoOptions{
+ Name: form.RepoName,
+ Description: form.Description,
+ IsPrivate: form.Private || setting.Repository.ForcePrivate,
+ IsMirror: form.Mirror,
+ RemoteAddr: remoteAddr,
+ })
if err != nil {
if repo != nil {
if errDelete := models.DeleteRepository(ctxUser.Id, repo.ID); errDelete != nil {
@@ -252,37 +257,55 @@ func MigrateRepo(ctx *middleware.Context, form auth.MigrateRepoForm) {
ctx.JSON(201, ToApiRepository(ctxUser, repo, api.Permission{true, true, true}))
}
-func DeleteRepo(ctx *middleware.Context) {
- user, err := models.GetUserByName(ctx.Params(":username"))
+func parseOwnerAndRepo(ctx *middleware.Context) (*models.User, *models.Repository) {
+ owner, err := models.GetUserByName(ctx.Params(":username"))
if err != nil {
if models.IsErrUserNotExist(err) {
ctx.APIError(422, "", err)
} else {
ctx.APIError(500, "GetUserByName", err)
}
- return
+ return nil, nil
}
- repo, err := models.GetRepositoryByName(user.Id, ctx.Params(":reponame"))
+ repo, err := models.GetRepositoryByName(owner.Id, ctx.Params(":reponame"))
if err != nil {
if models.IsErrRepoNotExist(err) {
ctx.Error(404)
} else {
ctx.APIError(500, "GetRepositoryByName", err)
}
+ return nil, nil
+ }
+
+ return owner, repo
+}
+
+func GetRepo(ctx *middleware.Context) {
+ owner, repo := parseOwnerAndRepo(ctx)
+ if ctx.Written() {
+ return
+ }
+
+ ctx.JSON(200, ToApiRepository(owner, repo, api.Permission{true, true, true}))
+}
+
+func DeleteRepo(ctx *middleware.Context) {
+ owner, repo := parseOwnerAndRepo(ctx)
+ if ctx.Written() {
return
}
- if user.IsOrganization() && !user.IsOwnedBy(ctx.User.Id) {
+ if owner.IsOrganization() && !owner.IsOwnedBy(ctx.User.Id) {
ctx.APIError(403, "", "Given user is not owner of organization.")
return
}
- if err := models.DeleteRepository(user.Id, repo.ID); err != nil {
+ if err := models.DeleteRepository(owner.Id, repo.ID); err != nil {
ctx.APIError(500, "DeleteRepository", err)
return
}
- log.Trace("Repository deleted: %s/%s", user.Name, repo.Name)
+ log.Trace("Repository deleted: %s/%s", owner.Name, repo.Name)
ctx.Status(204)
}
diff --git a/routers/api/v1/user.go b/routers/api/v1/user.go
index f27cd3ae..ec4f720c 100644
--- a/routers/api/v1/user.go
+++ b/routers/api/v1/user.go
@@ -55,7 +55,7 @@ func SearchUsers(ctx *middleware.Context) {
}
}
- ctx.Render.JSON(200, map[string]interface{}{
+ ctx.JSON(200, map[string]interface{}{
"ok": true,
"data": results,
})