mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-20 20:07:03 +01:00
Migrate repository by organization
This commit is contained in:
parent
8644c571db
commit
32b09681b2
4 changed files with 72 additions and 15 deletions
|
@ -251,8 +251,8 @@ func MirrorUpdate() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// MigrateRepository migrates a existing repository from other project hosting.
|
// MigrateRepository migrates a existing repository from other project hosting.
|
||||||
func MigrateRepository(user *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
|
func MigrateRepository(u *User, name, desc string, private, mirror bool, url string) (*Repository, error) {
|
||||||
repo, err := CreateRepository(user, name, desc, "", "", private, mirror, false)
|
repo, err := CreateRepository(u, name, desc, "", "", private, mirror, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -261,11 +261,11 @@ func MigrateRepository(user *User, name, desc string, private, mirror bool, url
|
||||||
tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()))
|
tmpDir := filepath.Join(os.TempDir(), fmt.Sprintf("%d", time.Now().Nanosecond()))
|
||||||
os.MkdirAll(tmpDir, os.ModePerm)
|
os.MkdirAll(tmpDir, os.ModePerm)
|
||||||
|
|
||||||
repoPath := RepoPath(user.Name, name)
|
repoPath := RepoPath(u.Name, name)
|
||||||
|
|
||||||
repo.IsBare = false
|
repo.IsBare = false
|
||||||
if mirror {
|
if mirror {
|
||||||
if err = MirrorRepository(repo.Id, user.Name, repo.Name, repoPath, url); err != nil {
|
if err = MirrorRepository(repo.Id, u.Name, repo.Name, repoPath, url); err != nil {
|
||||||
return repo, err
|
return repo, err
|
||||||
}
|
}
|
||||||
repo.IsMirror = true
|
repo.IsMirror = true
|
||||||
|
|
|
@ -48,6 +48,7 @@ type MigrateRepoForm struct {
|
||||||
Url string `form:"url" binding:"Url"`
|
Url string `form:"url" binding:"Url"`
|
||||||
AuthUserName string `form:"auth_username"`
|
AuthUserName string `form:"auth_username"`
|
||||||
AuthPasswd string `form:"auth_password"`
|
AuthPasswd string `form:"auth_password"`
|
||||||
|
Uid int64 `form:"uid" binding:"Required"`
|
||||||
RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"`
|
RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"`
|
||||||
Mirror bool `form:"mirror"`
|
Mirror bool `form:"mirror"`
|
||||||
Private bool `form:"private"`
|
Private bool `form:"private"`
|
||||||
|
|
|
@ -53,7 +53,7 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
|
||||||
ctx.Data["Licenses"] = models.Licenses
|
ctx.Data["Licenses"] = models.Licenses
|
||||||
|
|
||||||
if err := ctx.User.GetOrganizations(); err != nil {
|
if err := ctx.User.GetOrganizations(); err != nil {
|
||||||
ctx.Handle(500, "home.Dashboard(GetOrganizations)", err)
|
ctx.Handle(500, "home.CreatePost(GetOrganizations)", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx.Data["Orgs"] = ctx.User.Orgs
|
ctx.Data["Orgs"] = ctx.User.Orgs
|
||||||
|
@ -70,9 +70,9 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
|
||||||
u, err = models.GetUserById(form.Uid)
|
u, err = models.GetUserById(form.Uid)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == models.ErrUserNotExist {
|
if err == models.ErrUserNotExist {
|
||||||
ctx.Handle(404, "home.Dashboard(GetUserById)", err)
|
ctx.Handle(404, "home.CreatePost(GetUserById)", err)
|
||||||
} else {
|
} else {
|
||||||
ctx.Handle(500, "home.Dashboard(GetUserById)", err)
|
ctx.Handle(500, "home.CreatePost(GetUserById)", err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -97,12 +97,19 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
|
||||||
log.Error("repo.CreatePost(DeleteRepository): %v", errDelete)
|
log.Error("repo.CreatePost(DeleteRepository): %v", errDelete)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.Handle(500, "repo.CreatePost", err)
|
ctx.Handle(500, "repo.CreatePost(CreateRepository)", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Migrate(ctx *middleware.Context) {
|
func Migrate(ctx *middleware.Context) {
|
||||||
ctx.Data["Title"] = "Migrate repository"
|
ctx.Data["Title"] = "Migrate repository"
|
||||||
ctx.Data["PageIsNewRepo"] = true
|
ctx.Data["PageIsNewRepo"] = true
|
||||||
|
|
||||||
|
if err := ctx.User.GetOrganizations(); err != nil {
|
||||||
|
ctx.Handle(500, "home.Migrate(GetOrganizations)", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Data["Orgs"] = ctx.User.Orgs
|
||||||
|
|
||||||
ctx.HTML(200, MIGRATE)
|
ctx.HTML(200, MIGRATE)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,19 +117,40 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
|
||||||
ctx.Data["Title"] = "Migrate repository"
|
ctx.Data["Title"] = "Migrate repository"
|
||||||
ctx.Data["PageIsNewRepo"] = true
|
ctx.Data["PageIsNewRepo"] = true
|
||||||
|
|
||||||
|
if err := ctx.User.GetOrganizations(); err != nil {
|
||||||
|
ctx.Handle(500, "home.MigratePost(GetOrganizations)", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ctx.Data["Orgs"] = ctx.User.Orgs
|
||||||
|
|
||||||
if ctx.HasError() {
|
if ctx.HasError() {
|
||||||
ctx.HTML(200, MIGRATE)
|
ctx.HTML(200, MIGRATE)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
authStr := strings.Replace(fmt.Sprintf("://%s:%s",
|
authStr := strings.Replace(fmt.Sprintf("://%s:%s",
|
||||||
form.AuthUserName, form.AuthPasswd), "@", "%40", -1)
|
form.AuthUserName, form.AuthPasswd), "@", "%40", -1)
|
||||||
url := strings.Replace(form.Url, "://", authStr+"@", 1)
|
url := strings.Replace(form.Url, "://", authStr+"@", 1)
|
||||||
repo, err := models.MigrateRepository(ctx.User, form.RepoName, form.Description, form.Private,
|
repo, err := models.MigrateRepository(u, form.RepoName, form.Description, form.Private,
|
||||||
form.Mirror, url)
|
form.Mirror, url)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
log.Trace("%s Repository migrated: %s/%s", ctx.Req.RequestURI, ctx.User.LowerName, form.RepoName)
|
log.Trace("%s Repository migrated: %s/%s", ctx.Req.RequestURI, u.LowerName, form.RepoName)
|
||||||
ctx.Redirect("/" + ctx.User.Name + "/" + form.RepoName)
|
ctx.Redirect("/" + u.Name + "/" + form.RepoName)
|
||||||
return
|
return
|
||||||
} else if err == models.ErrRepoAlreadyExist {
|
} else if err == models.ErrRepoAlreadyExist {
|
||||||
ctx.RenderWithErr("Repository name has already been used", MIGRATE, &form)
|
ctx.RenderWithErr("Repository name has already been used", MIGRATE, &form)
|
||||||
|
@ -133,7 +161,7 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if repo != nil {
|
if repo != nil {
|
||||||
if errDelete := models.DeleteRepository(ctx.User.Id, repo.Id, ctx.User.Name); errDelete != nil {
|
if errDelete := models.DeleteRepository(u.Id, repo.Id, u.Name); errDelete != nil {
|
||||||
log.Error("repo.MigratePost(DeleteRepository): %v", errDelete)
|
log.Error("repo.MigratePost(DeleteRepository): %v", errDelete)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,7 +170,7 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
|
||||||
ctx.RenderWithErr(err.Error(), MIGRATE, &form)
|
ctx.RenderWithErr(err.Error(), MIGRATE, &form)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ctx.Handle(500, "repo.Migrate", err)
|
ctx.Handle(500, "repo.Migrate(MigrateRepository)", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Single(ctx *middleware.Context, params martini.Params) {
|
func Single(ctx *middleware.Context, params martini.Params) {
|
||||||
|
|
|
@ -44,9 +44,37 @@
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-md-2 control-label">Owner<strong class="text-danger">*</strong></label>
|
<label class="col-md-2 control-label">Owner<strong class="text-danger">*</strong></label>
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<p class="form-control-static">{{.SignedUserName}}</p>
|
<div class="btn-group" id="repo-owner-switch">
|
||||||
<input type="hidden" value="{{.SignedUserId}}" name="userId"/>
|
<button type="button" class="btn btn-default" id="repo-owner-current">
|
||||||
|
<img src="{{.SignedUser.AvatarLink}}?s=28" alt="user-avatar" title="username" id="repo-owner-avatar">
|
||||||
|
<span id="repo-owner-name">{{.SignedUser.Name}}</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<span class="caret"></span>
|
||||||
|
</button>
|
||||||
|
<div class="dropdown-menu clone-group-btn no-propagation">
|
||||||
|
<ul id="dashboard-switch-menu" class="list-unstyled">
|
||||||
|
<li data-uid="{{.SignedUser.Id}}" class="checked">
|
||||||
|
<a>
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
<img src="{{.SignedUser.AvatarLink}}?s=28" alt="user-avatar" title="username">
|
||||||
|
{{.SignedUser.Name}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{range .Orgs}}
|
||||||
|
<li data-uid="{{.Id}}">
|
||||||
|
<a>
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
<img src="{{.AvatarLink}}?s=28" alt="user-avatar" title="username">
|
||||||
|
{{.Name}}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<input type="hidden" value="{{.SignedUserId}}" name="uid" id="repo-owner-id"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group {{if .Err_RepoName}}has-error has-feedback{{end}}">
|
<div class="form-group {{if .Err_RepoName}}has-error has-feedback{{end}}">
|
||||||
|
|
Loading…
Reference in a new issue