diff options
author | Martin Hartkorn <github@hartkorn.net> | 2016-02-14 21:12:00 +0100 |
---|---|---|
committer | Martin Hartkorn <github@hartkorn.net> | 2016-02-14 21:12:00 +0100 |
commit | 3650bd8528a8c0f43eb3d9083939735bf740fa3b (patch) | |
tree | 267f881bfb964101b66aef2973d8e27c440ffd41 | |
parent | 10e4887b2bf2e201c7acc38f09731a218ae1a7bc (diff) | |
download | gitea-3650bd8528a8c0f43eb3d9083939735bf740fa3b.tar.gz gitea-3650bd8528a8c0f43eb3d9083939735bf740fa3b.zip |
Convert mirrors to regular repositories.
-rw-r--r-- | conf/locale/locale_en-US.ini | 5 | ||||
-rw-r--r-- | models/repo.go | 14 | ||||
-rw-r--r-- | modules/auth/repo_form.go | 12 | ||||
-rw-r--r-- | routers/repo/setting.go | 28 | ||||
-rw-r--r-- | templates/repo/settings/options.tmpl | 83 |
5 files changed, 120 insertions, 22 deletions
diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index cb3e048d27..8273bf9d58 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -587,11 +587,16 @@ settings.danger_zone = Danger Zone settings.transfer = Transfer Ownership 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.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_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_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.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_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. diff --git a/models/repo.go b/models/repo.go index fec007c9cc..71493810f2 100644 --- a/models/repo.go +++ b/models/repo.go @@ -654,7 +654,17 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) { 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) } @@ -695,7 +705,7 @@ func MigrateRepository(u *User, opts MigrateRepoOptions) (*Repository, error) { repo.DefaultBranch = headBranch.Name } - return repo, UpdateRepository(repo, false) + return repo, nil } // initRepoCommit temporarily changes with work directory. diff --git a/modules/auth/repo_form.go b/modules/auth/repo_form.go index bd68feafcf..5853c2c005 100644 --- a/modules/auth/repo_form.go +++ b/modules/auth/repo_form.go @@ -37,6 +37,18 @@ func (f *CreateRepoForm) Validate(ctx *macaron.Context, errs binding.Errors) bin 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 { CloneAddr string `json:"clone_addr" binding:"Required"` AuthUsername string `json:"auth_username"` diff --git a/routers/repo/setting.go b/routers/repo/setting.go index 507984e56d..9d7e4074c3 100644 --- a/routers/repo/setting.go +++ b/routers/repo/setting.go @@ -141,6 +141,34 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) { ctx.Flash.Success(ctx.Tr("repo.settings.update_settings_success")) 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": if repo.Name != form.RepoName { ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), SETTINGS_OPTIONS, nil) diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl index 4bb39bb07a..90c03d3e3e 100644 --- a/templates/repo/settings/options.tmpl +++ b/templates/repo/settings/options.tmpl @@ -138,6 +138,19 @@ {{.i18n.Tr "repo.settings.danger_zone"}} </h4> <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="ui right"> <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 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="header"> {{.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_2" | Safe}} <br> {{.i18n.Tr "repo.settings.delete_notices_fork_3" | Safe}} - {{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> + {{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 class="text right actions"> - <div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div> - <button class="ui red button">{{.i18n.Tr "repo.settings.confirm_delete"}}</button> - </div> - </form> -</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_delete"}}</button> + </div> + </form> + </div> </div> {{template "base/footer" .}} |