2014-02-20 06:45:43 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
import (
2014-07-26 10:28:04 +04:00
"fmt"
2014-07-26 08:24:27 +04:00
"os"
2014-03-22 21:50:50 +04:00
"path"
2014-07-26 10:28:04 +04:00
"strings"
2014-03-22 21:50:50 +04:00
2014-07-26 08:24:27 +04:00
"github.com/Unknwon/com"
2014-05-06 03:58:13 +04:00
2014-02-20 06:45:43 +04:00
"github.com/gogits/gogs/models"
2014-03-08 01:05:18 +04:00
"github.com/gogits/gogs/modules/auth"
2014-03-22 21:50:50 +04:00
"github.com/gogits/gogs/modules/base"
2014-07-26 08:24:27 +04:00
"github.com/gogits/gogs/modules/git"
2014-03-19 12:48:45 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-15 17:17:16 +04:00
"github.com/gogits/gogs/modules/middleware"
2014-02-20 06:45:43 +04:00
)
2014-06-23 07:11:12 +04:00
const (
CREATE base . TplName = "repo/create"
MIGRATE base . TplName = "repo/migrate"
)
2014-04-11 02:09:57 +04:00
func Create ( ctx * middleware . Context ) {
2014-07-26 08:24:27 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "new_repo" )
ctx . Data [ "PageIsRepoCreate" ] = true
// Give default value for template to render.
ctx . Data [ "gitignore" ] = "0"
ctx . Data [ "license" ] = "0"
ctx . Data [ "Gitignores" ] = models . Gitignores
2014-03-19 21:14:56 +04:00
ctx . Data [ "Licenses" ] = models . Licenses
2014-06-25 11:55:59 +04:00
2014-06-28 23:43:25 +04:00
ctxUser := ctx . User
2014-07-26 10:28:04 +04:00
orgId := com . StrTo ( ctx . Query ( "org" ) ) . MustInt64 ( )
if orgId > 0 {
org , err := models . GetUserById ( orgId )
if err != nil && err != models . ErrUserNotExist {
ctx . Handle ( 500 , "home.Dashboard(GetUserById)" , err )
return
}
ctxUser = org
}
2014-06-28 23:43:25 +04:00
ctx . Data [ "ContextUser" ] = ctxUser
2014-07-26 10:28:04 +04:00
if err := ctx . User . GetOrganizations ( ) ; err != nil {
ctx . Handle ( 500 , "home.Dashboard(GetOrganizations)" , err )
return
}
ctx . Data [ "AllUsers" ] = append ( [ ] * models . User { ctx . User } , ctx . User . Orgs ... )
2014-06-25 11:55:59 +04:00
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , CREATE )
2014-04-11 02:09:57 +04:00
}
2014-03-08 01:05:18 +04:00
2014-04-11 02:09:57 +04:00
func CreatePost ( ctx * middleware . Context , form auth . CreateRepoForm ) {
2014-07-26 08:24:27 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "new_repo" )
ctx . Data [ "PageIsRepoCreate" ] = true
ctx . Data [ "Gitignores" ] = models . Gitignores
2014-04-11 02:09:57 +04:00
ctx . Data [ "Licenses" ] = models . Licenses
2014-02-20 06:45:43 +04:00
2014-07-26 08:24:27 +04:00
ctxUser := ctx . User
2014-07-26 10:28:04 +04:00
orgId := com . StrTo ( ctx . Query ( "org" ) ) . MustInt64 ( )
if orgId > 0 {
org , err := models . GetUserById ( orgId )
if err != nil && err != models . ErrUserNotExist {
ctx . Handle ( 500 , "home.Dashboard(GetUserById)" , err )
return
}
ctxUser = org
}
2014-07-26 08:24:27 +04:00
ctx . Data [ "ContextUser" ] = ctxUser
2014-07-26 10:28:04 +04:00
if err := ctx . User . GetOrganizations ( ) ; err != nil {
ctx . Handle ( 500 , "home.CreatePost(GetOrganizations)" , err )
return
}
ctx . Data [ "Orgs" ] = ctx . User . Orgs
2014-06-25 11:55:59 +04:00
2014-03-23 00:00:46 +04:00
if ctx . HasError ( ) {
2014-06-23 07:11:12 +04:00
ctx . HTML ( 200 , CREATE )
2014-03-23 00:00:46 +04:00
return
}
2014-06-25 13:14:36 +04:00
u := ctx . User
// Not equal means current user is an organization.
if u . Id != form . Uid {
var err error
u , err = models . GetUserById ( form . Uid )
if err != nil {
if err == models . ErrUserNotExist {
2014-06-25 13:35:23 +04:00
ctx . Handle ( 404 , "home.CreatePost(GetUserById)" , err )
2014-06-25 13:14:36 +04:00
} else {
2014-06-25 13:35:23 +04:00
ctx . Handle ( 500 , "home.CreatePost(GetUserById)" , err )
2014-06-25 13:14:36 +04:00
}
return
}
2014-06-28 23:43:25 +04:00
// Check ownership of organization.
2014-06-30 00:30:41 +04:00
if ! u . IsOrgOwner ( ctx . User . Id ) {
2014-06-28 23:43:25 +04:00
ctx . Error ( 403 )
return
}
2014-06-25 13:14:36 +04:00
}
repo , err := models . CreateRepository ( u , form . RepoName , form . Description ,
2014-07-26 08:24:27 +04:00
form . Gitignore , form . License , form . Private , false , form . InitReadme )
2014-03-17 19:56:50 +04:00
if err == nil {
2014-07-26 08:24:27 +04:00
log . Trace ( "Repository created: %s/%s" , u . Name , form . RepoName )
2014-06-25 13:14:36 +04:00
ctx . Redirect ( "/" + u . Name + "/" + form . RepoName )
2014-03-09 06:25:38 +04:00
return
2014-03-17 10:36:28 +04:00
} else if err == models . ErrRepoAlreadyExist {
2014-07-26 08:24:27 +04:00
ctx . RenderWithErr ( ctx . Tr ( "form.repo_name_been_taken" ) , CREATE , & form )
2014-03-10 04:06:29 +04:00
return
2014-03-20 19:41:24 +04:00
} else if err == models . ErrRepoNameIllegal {
2014-07-26 08:24:27 +04:00
ctx . RenderWithErr ( ctx . Tr ( "form.illegal_repo_name" ) , CREATE , & form )
2014-03-20 19:41:24 +04:00
return
2014-03-10 04:06:29 +04:00
}
2014-04-13 04:35:35 +04:00
if repo != nil {
2014-06-25 13:14:36 +04:00
if errDelete := models . DeleteRepository ( u . Id , repo . Id , u . Name ) ; errDelete != nil {
2014-07-26 08:24:27 +04:00
log . Error ( 4 , "DeleteRepository: %v" , errDelete )
2014-04-13 04:35:35 +04:00
}
}
2014-07-26 08:24:27 +04:00
ctx . Handle ( 500 , "CreateRepository" , err )
2014-04-11 02:09:57 +04:00
}
2014-04-09 17:28:00 +04:00
2014-07-26 10:28:04 +04:00
func Migrate ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = "Migrate repository"
ctx . Data [ "PageIsNewRepo" ] = true
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
if err := ctx . User . GetOrganizations ( ) ; err != nil {
ctx . Handle ( 500 , "home.Migrate(GetOrganizations)" , err )
return
}
ctx . Data [ "Orgs" ] = ctx . User . Orgs
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , MIGRATE )
}
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
func MigratePost ( ctx * middleware . Context , form auth . MigrateRepoForm ) {
ctx . Data [ "Title" ] = "Migrate repository"
ctx . Data [ "PageIsNewRepo" ] = true
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
if err := ctx . User . GetOrganizations ( ) ; err != nil {
ctx . Handle ( 500 , "home.MigratePost(GetOrganizations)" , err )
return
}
ctx . Data [ "Orgs" ] = ctx . User . Orgs
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
if ctx . HasError ( ) {
ctx . HTML ( 200 , MIGRATE )
return
}
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
u := ctx . User
// Not equal means current user is an organization.
if u . Id != form . Uid {
var err error
u , err = models . GetUserById ( form . Uid )
if err != nil {
if err == models . ErrUserNotExist {
ctx . Handle ( 404 , "home.MigratePost(GetUserById)" , err )
} else {
ctx . Handle ( 500 , "home.MigratePost(GetUserById)" , err )
}
return
}
}
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
authStr := strings . Replace ( fmt . Sprintf ( "://%s:%s" ,
form . AuthUserName , form . AuthPasswd ) , "@" , "%40" , - 1 )
url := strings . Replace ( form . Url , "://" , authStr + "@" , 1 )
repo , err := models . MigrateRepository ( u , form . RepoName , form . Description , form . Private ,
form . Mirror , url )
if err == nil {
log . Trace ( "%s Repository migrated: %s/%s" , ctx . Req . RequestURI , u . LowerName , form . RepoName )
ctx . Redirect ( "/" + u . Name + "/" + form . RepoName )
return
} else if err == models . ErrRepoAlreadyExist {
ctx . RenderWithErr ( "Repository name has already been used" , MIGRATE , & form )
return
} else if err == models . ErrRepoNameIllegal {
ctx . RenderWithErr ( models . ErrRepoNameIllegal . Error ( ) , MIGRATE , & form )
return
}
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
if repo != nil {
if errDelete := models . DeleteRepository ( u . Id , repo . Id , u . Name ) ; errDelete != nil {
log . Error ( 4 , "DeleteRepository: %v" , errDelete )
}
}
2014-07-26 08:24:27 +04:00
2014-07-26 10:28:04 +04:00
if strings . Contains ( err . Error ( ) , "Authentication failed" ) {
ctx . RenderWithErr ( err . Error ( ) , MIGRATE , & form )
return
}
ctx . Handle ( 500 , "MigrateRepository" , err )
}
2014-07-26 08:24:27 +04:00
// func Action(ctx *middleware.Context, params martini.Params) {
// var err error
// switch params["action"] {
// case "watch":
// err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, true)
// case "unwatch":
// err = models.WatchRepo(ctx.User.Id, ctx.Repo.Repository.Id, false)
// case "desc":
// if !ctx.Repo.IsOwner {
// ctx.Error(404)
// return
// }
// ctx.Repo.Repository.Description = ctx.Query("desc")
// ctx.Repo.Repository.Website = ctx.Query("site")
// err = models.UpdateRepository(ctx.Repo.Repository)
// }
// if err != nil {
// log.Error("repo.Action(%s): %v", params["action"], err)
// ctx.JSON(200, map[string]interface{}{
// "ok": false,
// "err": err.Error(),
// })
// return
// }
// ctx.JSON(200, map[string]interface{}{
// "ok": true,
// })
// }
func Download ( ctx * middleware . Context ) {
ext := "." + ctx . Params ( ":ext" )
var archivePath string
switch ext {
case ".zip" :
archivePath = path . Join ( ctx . Repo . GitRepo . Path , "archives/zip" )
case ".tar.gz" :
archivePath = path . Join ( ctx . Repo . GitRepo . Path , "archives/targz" )
default :
ctx . Error ( 404 )
2014-06-25 13:35:23 +04:00
return
}
2014-07-26 08:24:27 +04:00
if ! com . IsDir ( archivePath ) {
if err := os . MkdirAll ( archivePath , os . ModePerm ) ; err != nil {
ctx . Handle ( 500 , "Download -> os.MkdirAll(archivePath)" , err )
2014-06-25 13:35:23 +04:00
return
}
}
2014-07-26 08:24:27 +04:00
archivePath = path . Join ( archivePath , ctx . Repo . CommitId + ext )
if ! com . IsFile ( archivePath ) {
if err := ctx . Repo . Commit . CreateArchive ( archivePath , git . ZIP ) ; err != nil {
ctx . Handle ( 500 , "Download -> CreateArchive " + archivePath , err )
2014-03-22 21:50:50 +04:00
return
}
}
2014-07-26 08:24:27 +04:00
ctx . ServeFile ( archivePath , ctx . Repo . Repository . Name + "-" + base . ShortSha ( ctx . Repo . CommitId ) + ext )
2014-03-22 21:50:50 +04:00
}