Option to set default branch at repository creation (#10803)
* Option to set default branch at repository creation * Handle template repos with non-default master branch * Add DefaultBranch handling on creation to API Fix #9542 Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		
							parent
							
								
									b1c331c845
								
							
						
					
					
						commit
						52cfd2743c
					
				
					 10 changed files with 57 additions and 33 deletions
				
			
		|  | @ -929,6 +929,7 @@ type CreateRepoOptions struct { | |||
| 	IssueLabels    string | ||||
| 	License        string | ||||
| 	Readme         string | ||||
| 	DefaultBranch  string | ||||
| 	IsPrivate      bool | ||||
| 	IsMirror       bool | ||||
| 	AutoInit       bool | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ type CreateRepoForm struct { | |||
| 	RepoName      string `binding:"Required;AlphaDashDot;MaxSize(100)"` | ||||
| 	Private       bool | ||||
| 	Description   string `binding:"MaxSize(255)"` | ||||
| 	DefaultBranch string `binding:"GitRefName;MaxSize(100)"` | ||||
| 	AutoInit      bool | ||||
| 	Gitignores    string | ||||
| 	IssueLabels   string | ||||
|  |  | |||
|  | @ -114,6 +114,7 @@ func generateRepoCommit(repo, templateRepo, generateRepo *models.Repository, tmp | |||
| 	templateRepoPath := templateRepo.RepoPath() | ||||
| 	if err := git.Clone(templateRepoPath, tmpDir, git.CloneRepoOptions{ | ||||
| 		Depth:  1, | ||||
| 		Branch: templateRepo.DefaultBranch, | ||||
| 	}); err != nil { | ||||
| 		return fmt.Errorf("git clone: %v", err) | ||||
| 	} | ||||
|  | @ -180,7 +181,7 @@ func generateRepoCommit(repo, templateRepo, generateRepo *models.Repository, tmp | |||
| 		return fmt.Errorf("git remote add: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return initRepoCommit(tmpDir, repo, repo.Owner) | ||||
| 	return initRepoCommit(tmpDir, repo, repo.Owner, templateRepo.DefaultBranch) | ||||
| } | ||||
| 
 | ||||
| func generateGitContent(ctx models.DBContext, repo, templateRepo, generateRepo *models.Repository) (err error) { | ||||
|  | @ -204,7 +205,7 @@ func generateGitContent(ctx models.DBContext, repo, templateRepo, generateRepo * | |||
| 		return fmt.Errorf("getRepositoryByID: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	repo.DefaultBranch = "master" | ||||
| 	repo.DefaultBranch = templateRepo.DefaultBranch | ||||
| 	if err = models.UpdateRepositoryCtx(ctx, repo, false); err != nil { | ||||
| 		return fmt.Errorf("updateRepository: %v", err) | ||||
| 	} | ||||
|  |  | |||
|  | @ -98,7 +98,7 @@ func prepareRepoCommit(ctx models.DBContext, repo *models.Repository, tmpDir, re | |||
| } | ||||
| 
 | ||||
| // initRepoCommit temporarily changes with work directory.
 | ||||
| func initRepoCommit(tmpPath string, repo *models.Repository, u *models.User) (err error) { | ||||
| func initRepoCommit(tmpPath string, repo *models.Repository, u *models.User, defaultBranch string) (err error) { | ||||
| 	commitTimeStr := time.Now().Format(time.RFC3339) | ||||
| 
 | ||||
| 	sig := u.NewGitSig() | ||||
|  | @ -145,7 +145,11 @@ func initRepoCommit(tmpPath string, repo *models.Repository, u *models.User) (er | |||
| 		return fmt.Errorf("git commit: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if stdout, err := git.NewCommand("push", "origin", "master"). | ||||
| 	if len(defaultBranch) == 0 { | ||||
| 		defaultBranch = "master" | ||||
| 	} | ||||
| 
 | ||||
| 	if stdout, err := git.NewCommand("push", "origin", "master:"+defaultBranch). | ||||
| 		SetDescription(fmt.Sprintf("initRepoCommit (git push): %s", tmpPath)). | ||||
| 		RunInDirWithEnv(tmpPath, models.InternalPushingEnvironment(u, repo)); err != nil { | ||||
| 		log.Error("Failed to push back to master: Stdout: %s\nError: %v", stdout, err) | ||||
|  | @ -190,7 +194,7 @@ func initRepository(ctx models.DBContext, repoPath string, u *models.User, repo | |||
| 		} | ||||
| 
 | ||||
| 		// Apply changes and commit.
 | ||||
| 		if err = initRepoCommit(tmpDir, repo, u); err != nil { | ||||
| 		if err = initRepoCommit(tmpDir, repo, u, opts.DefaultBranch); err != nil { | ||||
| 			return fmt.Errorf("initRepoCommit: %v", err) | ||||
| 		} | ||||
| 	} | ||||
|  | @ -206,6 +210,10 @@ func initRepository(ctx models.DBContext, repoPath string, u *models.User, repo | |||
| 	} | ||||
| 
 | ||||
| 	repo.DefaultBranch = "master" | ||||
| 	if len(opts.DefaultBranch) > 0 { | ||||
| 		repo.DefaultBranch = opts.DefaultBranch | ||||
| 	} | ||||
| 
 | ||||
| 	if err = models.UpdateRepositoryCtx(ctx, repo, false); err != nil { | ||||
| 		return fmt.Errorf("updateRepository: %v", err) | ||||
| 	} | ||||
|  |  | |||
|  | @ -112,6 +112,8 @@ type CreateRepoOption struct { | |||
| 	License string `json:"license"` | ||||
| 	// Readme of the repository to create
 | ||||
| 	Readme string `json:"readme"` | ||||
| 	// DefaultBranch of the repository (used when initializes and in template)
 | ||||
| 	DefaultBranch string `json:"default_branch" binding:"GitRefName;MaxSize(100)"` | ||||
| } | ||||
| 
 | ||||
| // EditRepoOption options when editing a repository's properties
 | ||||
|  |  | |||
|  | @ -226,6 +226,7 @@ func CreateUserRepo(ctx *context.APIContext, owner *models.User, opt api.CreateR | |||
| 		Readme:        opt.Readme, | ||||
| 		IsPrivate:     opt.Private, | ||||
| 		AutoInit:      opt.AutoInit, | ||||
| 		DefaultBranch: opt.DefaultBranch, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		if models.IsErrRepoAlreadyExist(err) { | ||||
|  |  | |||
|  | @ -228,6 +228,7 @@ func CreatePost(ctx *context.Context, form auth.CreateRepoForm) { | |||
| 			License:       form.License, | ||||
| 			Readme:        form.Readme, | ||||
| 			IsPrivate:     form.Private || setting.Repository.ForcePrivate, | ||||
| 			DefaultBranch: form.DefaultBranch, | ||||
| 			AutoInit:      form.AutoInit, | ||||
| 		}) | ||||
| 		if err == nil { | ||||
|  |  | |||
|  | @ -162,6 +162,10 @@ | |||
| 								<label>{{.i18n.Tr "repo.auto_init"}}</label> | ||||
| 							</div> | ||||
| 						</div> | ||||
| 						<div class="inline field"> | ||||
| 							<label for="default_branch">{{.i18n.Tr "repo.default_branch"}}</label> | ||||
| 							<input id="default_branch" name="default_branch" value="{{.default_branch}}" placeholder="master"> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 
 | ||||
| 					<br/> | ||||
|  |  | |||
|  | @ -52,7 +52,7 @@ git init | |||
| git add README.md | ||||
| git commit -m "first commit" | ||||
| git remote add origin <span class="clone-url">{{if $.DisableSSH}}{{$.CloneLink.HTTPS}}{{else}}{{$.CloneLink.SSH}}{{end}}</span> | ||||
| git push -u origin master</code></pre> | ||||
| git push -u origin {{if ne .Repository.DefaultBranch "master"}}master:{{.Repository.DefaultBranch}}{{else}}master{{end}}</code></pre> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 							<div class="ui divider"></div> | ||||
|  | @ -61,7 +61,7 @@ git push -u origin master</code></pre> | |||
| 								<h3>{{.i18n.Tr "repo.push_exist_repo"}}</h3> | ||||
| 								<div class="markdown"> | ||||
| 									<pre><code>git remote add origin <span class="clone-url">{{if $.DisableSSH}}{{$.CloneLink.HTTPS}}{{else}}{{$.CloneLink.SSH}}{{end}}</span> | ||||
| git push -u origin master</code></pre> | ||||
| git push -u origin {{.Repository.DefaultBranch}}</code></pre> | ||||
| 								</div> | ||||
| 							</div> | ||||
| 						{{end}} | ||||
|  |  | |||
|  | @ -10600,6 +10600,11 @@ | |||
|           "type": "boolean", | ||||
|           "x-go-name": "AutoInit" | ||||
|         }, | ||||
|         "default_branch": { | ||||
|           "description": "DefaultBranch of the repository (used when initializes and in template)", | ||||
|           "type": "string", | ||||
|           "x-go-name": "DefaultBranch" | ||||
|         }, | ||||
|         "description": { | ||||
|           "description": "Description of the repository to create", | ||||
|           "type": "string", | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue