Convert mirrors to regular repositories.
This commit is contained in:
parent
10e4887b2b
commit
3650bd8528
|
@ -587,11 +587,16 @@ settings.danger_zone = Danger Zone
|
||||||
settings.transfer = Transfer Ownership
|
settings.transfer = Transfer Ownership
|
||||||
settings.transfer_desc = Transfer this repository to another user or to an organization in which you have admin rights.
|
settings.transfer_desc = Transfer this repository to another user or to an organization in which you have admin rights.
|
||||||
settings.new_owner_has_same_repo = The new owner already has a repository with same name. Please choose another name.
|
settings.new_owner_has_same_repo = The new owner already has a repository with same name. Please choose another name.
|
||||||
|
settings.convert = Convert To Regular Repository
|
||||||
|
settings.convert_desc = You can convert this mirror to a regular repository. This cannot be reversed.
|
||||||
settings.delete = Delete This Repository
|
settings.delete = Delete This Repository
|
||||||
settings.delete_desc = Once you delete a repository, there is no going back. Please be certain.
|
settings.delete_desc = Once you delete a repository, there is no going back. Please be certain.
|
||||||
settings.transfer_notices_1 = - You will lose access if new owner is a individual user.
|
settings.transfer_notices_1 = - You will lose access if new owner is a individual user.
|
||||||
settings.transfer_notices_2 = - You will conserve access if new owner is an organization and if you're one of the owners.
|
settings.transfer_notices_2 = - You will conserve access if new owner is an organization and if you're one of the owners.
|
||||||
settings.transfer_form_title = Please enter following information to confirm your operation:
|
settings.transfer_form_title = Please enter following information to confirm your operation:
|
||||||
|
settings.convert_notices_1 = - This operation will convert this repository mirror into a regular repository and cannot be undone.
|
||||||
|
settings.convert_succeed = Repository successfully converted.
|
||||||
|
settings.convert_failed = Unable to convert repository.
|
||||||
settings.delete_notices_1 = - This operation <strong>CANNOT</strong> be undone.
|
settings.delete_notices_1 = - This operation <strong>CANNOT</strong> be undone.
|
||||||
settings.delete_notices_2 = - This operation will permanently delete the everything of this repository, including Git data, issues, comments and accesses of collaborators.
|
settings.delete_notices_2 = - This operation will permanently delete the everything of this repository, including Git data, issues, comments and accesses of collaborators.
|
||||||
settings.delete_notices_fork_1 = - If this repository is public, all forks will become independent after deletion.
|
settings.delete_notices_fork_1 = - If this repository is public, all forks will become independent after deletion.
|
||||||
|
|
|
@ -654,7 +654,17 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) {
|
||||||
return repo, UpdateRepository(repo, false)
|
return repo, UpdateRepository(repo, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = createUpdateHook(repoPath); err != nil {
|
repo, err = FinishMigrateRepository(repo, repoPath)
|
||||||
|
if err != nil {
|
||||||
|
return repo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return repo, UpdateRepository(repo, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finish migrating repository with things that don't need to be done for mirrors.
|
||||||
|
func FinishMigrateRepository(repo *Repository, repoPath string) (*Repository, error) {
|
||||||
|
if err := createUpdateHook(repoPath); err != nil {
|
||||||
return repo, fmt.Errorf("createUpdateHook: %v", err)
|
return repo, fmt.Errorf("createUpdateHook: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,7 +705,7 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) {
|
||||||
repo.DefaultBranch = headBranch.Name
|
repo.DefaultBranch = headBranch.Name
|
||||||
}
|
}
|
||||||
|
|
||||||
return repo, UpdateRepository(repo, false)
|
return repo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// initRepoCommit temporarily changes with work directory.
|
// initRepoCommit temporarily changes with work directory.
|
||||||
|
|
|
@ -37,6 +37,18 @@ func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) bin
|
||||||
return validate(errs, ctx.Data, f, ctx.Locale)
|
return validate(errs, ctx.Data, f, ctx.Locale)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ConvertRepoForm struct {
|
||||||
|
Uid int64 `binding:"Required"`
|
||||||
|
RepoId int64 `binding:"Required"`
|
||||||
|
RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
|
||||||
|
Private bool
|
||||||
|
Description string `binding:"MaxSize(255)"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *ConvertRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) binding.Errors {
|
||||||
|
return validate(errs, ctx.Data, f, ctx.Locale)
|
||||||
|
}
|
||||||
|
|
||||||
type MigrateRepoForm struct {
|
type MigrateRepoForm struct {
|
||||||
CloneAddr string `json:"clone_addr" binding:"Required"`
|
CloneAddr string `json:"clone_addr" binding:"Required"`
|
||||||
AuthUsername string `json:"auth_username"`
|
AuthUsername string `json:"auth_username"`
|
||||||
|
|
|
@ -141,6 +141,34 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
|
||||||
ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
|
ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success"))
|
||||||
ctx.Redirect(ctx.Repo.RepoLink + "/settings")
|
ctx.Redirect(ctx.Repo.RepoLink + "/settings")
|
||||||
|
|
||||||
|
case "convert":
|
||||||
|
if repo.Name != form.RepoName {
|
||||||
|
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ctx.Repo.Owner.IsOrganization() {
|
||||||
|
if !ctx.Repo.Owner.IsOwnedBy(ctx.User.Id) {
|
||||||
|
ctx.Error(404)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repo.IsMirror = false
|
||||||
|
|
||||||
|
if _, err := models.FinishMigrateRepository(repo, models.RepoPath(ctx.Repo.Owner.Name, repo.Name)); err != nil {
|
||||||
|
ctx.RenderWithErr(ctx.Tr("settings.convert.failed"), SETTINGS_OPTIONS, &form)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := models.UpdateRepository(repo, false); err != nil {
|
||||||
|
ctx.RenderWithErr(ctx.Tr("settings.convert.failed"), SETTINGS_OPTIONS, &form)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
log.Trace("Repository converted: %s/%s", ctx.Repo.Owner.Name, repo.Name)
|
||||||
|
ctx.Flash.Success(ctx.Tr("repo.settings.convert_succeed"))
|
||||||
|
ctx.Redirect(setting.AppSubUrl + "/" + ctx.Repo.Owner.Name + "/" + repo.Name)
|
||||||
|
|
||||||
case "transfer":
|
case "transfer":
|
||||||
if repo.Name != form.RepoName {
|
if repo.Name != form.RepoName {
|
||||||
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
|
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil)
|
||||||
|
|
|
@ -138,6 +138,19 @@
|
||||||
{{.i18n.Tr "repo.settings.danger_zone"}}
|
{{.i18n.Tr "repo.settings.danger_zone"}}
|
||||||
</h4>
|
</h4>
|
||||||
<div class="ui attached warning table danger segment">
|
<div class="ui attached warning table danger segment">
|
||||||
|
{{if .Repository.IsMirror}}
|
||||||
|
<div class="item">
|
||||||
|
<div class="ui right">
|
||||||
|
<button class="ui basic red show-modal button" data-modal="#convert-repo-modal">{{.i18n.Tr "repo.settings.convert"}}</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h5>{{.i18n.Tr "repo.settings.convert"}}</h5>
|
||||||
|
<p>{{.i18n.Tr "repo.settings.convert_desc"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="ui divider"></div>
|
||||||
|
{{end}}
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div class="ui right">
|
<div class="ui right">
|
||||||
<button class="ui basic red show-modal button" data-modal="#transfer-repo-modal">{{.i18n.Tr "repo.settings.transfer"}}</button>
|
<button class="ui basic red show-modal button" data-modal="#transfer-repo-modal">{{.i18n.Tr "repo.settings.transfer"}}</button>
|
||||||
|
@ -165,6 +178,36 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="ui small modal" id="convert-repo-modal">
|
||||||
|
<div class="header">
|
||||||
|
{{.i18n.Tr "repo.settings.convert"}}
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="ui warning message text left">
|
||||||
|
{{.i18n.Tr "repo.settings.convert_notices_1" | Safe}}
|
||||||
|
</div>
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<input type="hidden" name="action" value="convert">
|
||||||
|
<div class="field">
|
||||||
|
<label>
|
||||||
|
{{.i18n.Tr "repo.settings.transfer_form_title"}}
|
||||||
|
<span class="text red">{{.Repository.Name}}</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
|
||||||
|
<input id="repo_name" name="repo_name" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="text right actions">
|
||||||
|
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
|
||||||
|
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_convert"}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="ui small modal" id="transfer-repo-modal">
|
<div class="ui small modal" id="transfer-repo-modal">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
{{.i18n.Tr "repo.settings.transfer"}}
|
{{.i18n.Tr "repo.settings.transfer"}}
|
||||||
|
@ -212,27 +255,27 @@
|
||||||
{{.i18n.Tr "repo.settings.delete_notices_fork_1" | Safe}} <br>
|
{{.i18n.Tr "repo.settings.delete_notices_fork_1" | Safe}} <br>
|
||||||
{{.i18n.Tr "repo.settings.delete_notices_fork_2" | Safe}} <br>
|
{{.i18n.Tr "repo.settings.delete_notices_fork_2" | Safe}} <br>
|
||||||
{{.i18n.Tr "repo.settings.delete_notices_fork_3" | Safe}}
|
{{.i18n.Tr "repo.settings.delete_notices_fork_3" | Safe}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
|
||||||
<form class="ui form" action="{{.Link}}" method="post">
|
|
||||||
{{.CsrfTokenHtml}}
|
|
||||||
<input type="hidden" name="action" value="delete">
|
|
||||||
<div class="field">
|
|
||||||
<label>
|
|
||||||
{{.i18n.Tr "repo.settings.transfer_form_title"}}
|
|
||||||
<span class="text red">{{.Repository.Name}}</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="required field">
|
|
||||||
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
|
|
||||||
<input id="repo_name" name="repo_name" required>
|
|
||||||
</div>
|
</div>
|
||||||
|
<form class="ui form" action="{{.Link}}" method="post">
|
||||||
|
{{.CsrfTokenHtml}}
|
||||||
|
<input type="hidden" name="action" value="delete">
|
||||||
|
<div class="field">
|
||||||
|
<label>
|
||||||
|
{{.i18n.Tr "repo.settings.transfer_form_title"}}
|
||||||
|
<span class="text red">{{.Repository.Name}}</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="required field">
|
||||||
|
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
|
||||||
|
<input id="repo_name" name="repo_name" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="text right actions">
|
<div class="text right actions">
|
||||||
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
|
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
|
||||||
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
|
<button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{template "base/footer" .}}
|
{{template "base/footer" .}}
|
||||||
|
|
Loading…
Reference in a new issue