Skip to content

Commit 482ba93

Browse files
Provide option to unlink a fork (#11858)
* Provide option to unlink a fork Fix #4566 Signed-off-by: Andrew Thornton <[email protected]> * Apply suggestions from code review Co-authored-by: techknowlogick <[email protected]> * Add check that user can create repo Signed-off-by: Andrew Thornton <[email protected]> * as per @CirnoT Signed-off-by: Andrew Thornton <[email protected]> Co-authored-by: techknowlogick <[email protected]>
1 parent a87a64e commit 482ba93

File tree

5 files changed

+124
-48
lines changed

5 files changed

+124
-48
lines changed

models/repo.go

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -209,19 +209,9 @@ func (repo *Repository) SanitizedOriginalURL() string {
209209

210210
// ColorFormat returns a colored string to represent this repo
211211
func (repo *Repository) ColorFormat(s fmt.State) {
212-
var ownerName interface{}
213-
214-
if repo.OwnerName != "" {
215-
ownerName = repo.OwnerName
216-
} else if repo.Owner != nil {
217-
ownerName = repo.Owner.Name
218-
} else {
219-
ownerName = log.NewColoredIDValue(strconv.FormatInt(repo.OwnerID, 10))
220-
}
221-
222212
log.ColorFprintf(s, "%d:%s/%s",
223213
log.NewColoredIDValue(repo.ID),
224-
ownerName,
214+
repo.OwnerName,
225215
repo.Name)
226216
}
227217

options/locale/locale_en-US.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,11 @@ settings.convert_desc = You can convert this mirror into a regular repository. T
13821382
settings.convert_notices_1 = This operation will convert the mirror into a regular repository and cannot be undone.
13831383
settings.convert_confirm = Convert Repository
13841384
settings.convert_succeed = The mirror has been converted into a regular repository.
1385+
settings.convert_fork = Convert to Regular Repository
1386+
settings.convert_fork_desc = You can convert this fork into a regular repository. This cannot be undone.
1387+
settings.convert_fork_notices_1 = This operation will convert the fork into a regular repository and cannot be undone.
1388+
settings.convert_fork_confirm = Convert Repository
1389+
settings.convert_fork_succeed = The fork has been converted into a regular repository.
13851390
settings.transfer = Transfer Ownership
13861391
settings.transfer_desc = Transfer this repository to a user or to an organization for which you have administrator rights.
13871392
settings.transfer_notices_1 = - You will lose access to the repository if you transfer it to an individual user.

routers/repo/setting.go

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,9 +356,46 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
356356
ctx.ServerError("DeleteMirrorByRepoID", err)
357357
return
358358
}
359-
log.Trace("Repository converted from mirror to regular: %s/%s", ctx.Repo.Owner.Name, repo.Name)
359+
log.Trace("Repository converted from mirror to regular: %s", repo.FullName())
360360
ctx.Flash.Success(ctx.Tr("repo.settings.convert_succeed"))
361-
ctx.Redirect(setting.AppSubURL + "/" + ctx.Repo.Owner.Name + "/" + repo.Name)
361+
ctx.Redirect(repo.Link())
362+
363+
case "convert_fork":
364+
if !ctx.Repo.IsOwner() {
365+
ctx.Error(404)
366+
return
367+
}
368+
if err := repo.GetOwner(); err != nil {
369+
ctx.ServerError("Convert Fork", err)
370+
return
371+
}
372+
if repo.Name != form.RepoName {
373+
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_repo_name"), tplSettingsOptions, nil)
374+
return
375+
}
376+
377+
if !repo.IsFork {
378+
ctx.Error(404)
379+
return
380+
}
381+
382+
if !ctx.Repo.Owner.CanCreateRepo() {
383+
ctx.Flash.Error(ctx.Tr("repo.form.reach_limit_of_creation", ctx.User.MaxCreationLimit()))
384+
ctx.Redirect(repo.Link() + "/settings")
385+
return
386+
}
387+
388+
repo.IsFork = false
389+
repo.ForkID = 0
390+
if err := models.UpdateRepository(repo, false); err != nil {
391+
log.Error("Unable to update repository %-v whilst converting from fork", repo)
392+
ctx.ServerError("Convert Fork", err)
393+
return
394+
}
395+
396+
log.Trace("Repository converted from fork to regular: %s", repo.FullName())
397+
ctx.Flash.Success(ctx.Tr("repo.settings.convert_fork_succeed"))
398+
ctx.Redirect(repo.Link())
362399

363400
case "transfer":
364401
if !ctx.Repo.IsOwner() {

templates/repo/settings/options.tmpl

Lines changed: 75 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -358,17 +358,28 @@
358358
</h4>
359359
<div class="ui attached warning table danger segment">
360360
{{if .Repository.IsMirror}}
361-
<div class="item">
362-
<div class="ui right">
363-
<button class="ui basic red show-modal button" data-modal="#convert-repo-modal">{{.i18n.Tr "repo.settings.convert"}}</button>
361+
<div class="item">
362+
<div class="ui right">
363+
<button class="ui basic red show-modal button" data-modal="#convert-mirror-repo-modal">{{.i18n.Tr "repo.settings.convert"}}</button>
364+
</div>
365+
<div>
366+
<h5>{{.i18n.Tr "repo.settings.convert"}}</h5>
367+
<p>{{.i18n.Tr "repo.settings.convert_desc"}}</p>
368+
</div>
364369
</div>
365-
<div>
366-
<h5>{{.i18n.Tr "repo.settings.convert"}}</h5>
367-
<p>{{.i18n.Tr "repo.settings.convert_desc"}}</p>
370+
<div class="ui divider"></div>
371+
{{end}}
372+
{{if and .Repository.IsFork .Repository.Owner.CanCreateRepo}}
373+
<div class="item">
374+
<div class="ui right">
375+
<button class="ui basic red show-modal button" data-modal="#convert-fork-repo-modal">{{.i18n.Tr "repo.settings.convert_fork"}}</button>
376+
</div>
377+
<div>
378+
<h5>{{.i18n.Tr "repo.settings.convert_fork"}}</h5>
379+
<p>{{.i18n.Tr "repo.settings.convert_fork_desc"}}</p>
380+
</div>
368381
</div>
369-
</div>
370-
371-
<div class="ui divider"></div>
382+
<div class="ui divider"></div>
372383
{{end}}
373384
<div class="item">
374385
<div class="ui right">
@@ -437,37 +448,67 @@
437448

438449
{{if .Permission.IsOwner}}
439450
{{if .Repository.IsMirror}}
440-
<div class="ui small modal" id="convert-repo-modal">
441-
<div class="header">
442-
{{.i18n.Tr "repo.settings.convert"}}
443-
</div>
444-
<div class="content">
445-
<div class="ui warning message text left">
446-
{{.i18n.Tr "repo.settings.convert_notices_1"}}
451+
<div class="ui small modal" id="convert-mirror-repo-modal">
452+
<div class="header">
453+
{{.i18n.Tr "repo.settings.convert"}}
447454
</div>
448-
<form class="ui form" action="{{.Link}}" method="post">
449-
{{.CsrfTokenHtml}}
450-
<input type="hidden" name="action" value="convert">
451-
<div class="field">
452-
<label>
453-
{{.i18n.Tr "repo.settings.transfer_form_title"}}
454-
<span class="text red">{{.Repository.Name}}</span>
455-
</label>
456-
</div>
457-
<div class="required field">
458-
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
459-
<input id="repo_name" name="repo_name" required>
455+
<div class="content">
456+
<div class="ui warning message text left">
457+
{{.i18n.Tr "repo.settings.convert_notices_1"}}
460458
</div>
459+
<form class="ui form" action="{{.Link}}" method="post">
460+
{{.CsrfTokenHtml}}
461+
<input type="hidden" name="action" value="convert">
462+
<div class="field">
463+
<label>
464+
{{.i18n.Tr "repo.settings.transfer_form_title"}}
465+
<span class="text red">{{.Repository.Name}}</span>
466+
</label>
467+
</div>
468+
<div class="required field">
469+
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
470+
<input id="repo_name" name="repo_name" required>
471+
</div>
461472

462-
<div class="text right actions">
463-
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
464-
<button class="ui red button">{{.i18n.Tr "repo.settings.convert_confirm"}}</button>
465-
</div>
466-
</form>
473+
<div class="text right actions">
474+
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
475+
<button class="ui red button">{{.i18n.Tr "repo.settings.convert_confirm"}}</button>
476+
</div>
477+
</form>
478+
</div>
467479
</div>
468-
</div>
469480
{{end}}
481+
{{if and .Repository.IsFork .Repository.Owner.CanCreateRepo}}
482+
<div class="ui small modal" id="convert-fork-repo-modal">
483+
<div class="header">
484+
{{.i18n.Tr "repo.settings.convert_fork"}}
485+
</div>
486+
<div class="content">
487+
<div class="ui warning message text left">
488+
{{.i18n.Tr "repo.settings.convert_fork_notices_1"}}
489+
</div>
490+
<form class="ui form" action="{{.Link}}" method="post">
491+
{{.CsrfTokenHtml}}
492+
<input type="hidden" name="action" value="convert_fork">
493+
<div class="field">
494+
<label>
495+
{{.i18n.Tr "repo.settings.transfer_form_title"}}
496+
<span class="text red">{{.Repository.Name}}</span>
497+
</label>
498+
</div>
499+
<div class="required field">
500+
<label for="repo_name">{{.i18n.Tr "repo.repo_name"}}</label>
501+
<input id="repo_name" name="repo_name" required>
502+
</div>
470503

504+
<div class="text right actions">
505+
<div class="ui cancel button">{{.i18n.Tr "settings.cancel"}}</div>
506+
<button class="ui red button">{{.i18n.Tr "repo.settings.convert_fork_confirm"}}</button>
507+
</div>
508+
</form>
509+
</div>
510+
</div>
511+
{{end}}
471512
<div class="ui small modal" id="transfer-repo-modal">
472513
<div class="header">
473514
{{.i18n.Tr "repo.settings.transfer"}}

web_src/less/_repository.less

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2796,7 +2796,10 @@
27962796
}
27972797

27982798
#transfer-repo-modal,
2799-
#delete-repo-modal {
2799+
#delete-repo-modal,
2800+
#delete-wiki-modal,
2801+
#convert-fork-repo-modal,
2802+
#convert-mirror-repo-modal {
28002803
.ui.message {
28012804
width: 100% !important;
28022805
}

0 commit comments

Comments
 (0)