+ {{.i18n.Tr "repo.settings.convert_notices_1" | Safe}}
+
+
+ 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 CANNOT 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"}}
{{.i18n.Tr "repo.settings.convert_desc"}}
+