diff options
author | Dmitry Sharshakov <d3dx12.xx@gmail.com> | 2023-09-29 04:48:39 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-29 09:48:39 +0800 |
commit | 5e02e3b7ee8294e2ec94968ece9af56bf1aa1534 (patch) | |
tree | 038e8619ee6b08b0c9ebd9be183ba190a1bc27f2 /services/repository | |
parent | e8840e7e2b6c4eaf6fa78dad49a29709ef35217b (diff) | |
download | gitea-5e02e3b7ee8294e2ec94968ece9af56bf1aa1534.tar.gz gitea-5e02e3b7ee8294e2ec94968ece9af56bf1aa1534.zip |
Add support for forking single branch (#25821)
Fixes #25117
Add UI for choosing branch to fork
Change default branch on single-branch forks
![image](https://github.com/go-gitea/gitea/assets/19504461/28505f69-a9a2-43a8-8b19-a0cdac3ddc5a)
---------
Co-authored-by: Denys Konovalov <kontakt@denyskon.de>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'services/repository')
-rw-r--r-- | services/repository/fork.go | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/services/repository/fork.go b/services/repository/fork.go index 397e4cb909..d5ab42badd 100644 --- a/services/repository/fork.go +++ b/services/repository/fork.go @@ -44,9 +44,10 @@ func (err ErrForkAlreadyExist) Unwrap() error { // ForkRepoOptions contains the fork repository options type ForkRepoOptions struct { - BaseRepo *repo_model.Repository - Name string - Description string + BaseRepo *repo_model.Repository + Name string + Description string + SingleBranch string } // ForkRepository forks a repository @@ -70,6 +71,10 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork } } + defaultBranch := opts.BaseRepo.DefaultBranch + if opts.SingleBranch != "" { + defaultBranch = opts.SingleBranch + } repo := &repo_model.Repository{ OwnerID: owner.ID, Owner: owner, @@ -77,7 +82,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork Name: opts.Name, LowerName: strings.ToLower(opts.Name), Description: opts.Description, - DefaultBranch: opts.BaseRepo.DefaultBranch, + DefaultBranch: defaultBranch, IsPrivate: opts.BaseRepo.IsPrivate || opts.BaseRepo.Owner.Visibility == structs.VisibleTypePrivate, IsEmpty: opts.BaseRepo.IsEmpty, IsFork: true, @@ -134,9 +139,12 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork needsRollback = true + cloneCmd := git.NewCommand(txCtx, "clone", "--bare") + if opts.SingleBranch != "" { + cloneCmd.AddArguments("--single-branch", "--branch").AddDynamicArguments(opts.SingleBranch) + } repoPath := repo_model.RepoPath(owner.Name, repo.Name) - if stdout, _, err := git.NewCommand(txCtx, - "clone", "--bare").AddDynamicArguments(oldRepoPath, repoPath). + if stdout, _, err := cloneCmd.AddDynamicArguments(oldRepoPath, repoPath). SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", opts.BaseRepo.FullName(), repo.FullName())). RunStdBytes(&git.RunOpts{Timeout: 10 * time.Minute}); err != nil { log.Error("Fork Repository (git clone) Failed for %v (from %v):\nStdout: %s\nError: %v", repo, opts.BaseRepo, stdout, err) |