@ -6,12 +6,15 @@ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					package  repo  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					import  (  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"fmt"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"net/http"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"code.gitea.io/gitea/models"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"code.gitea.io/gitea/modules/context"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"code.gitea.io/gitea/modules/convert"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"code.gitea.io/gitea/modules/git"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"code.gitea.io/gitea/modules/log"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						"code.gitea.io/gitea/modules/repofiles"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						repo_module  "code.gitea.io/gitea/modules/repository"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						api  "code.gitea.io/gitea/modules/structs"   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					)  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -81,6 +84,104 @@ func GetBranch(ctx *context.APIContext) { 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						ctx . JSON ( http . StatusOK ,  br )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// DeleteBranch get a branch of a repository
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					func  DeleteBranch ( ctx  * context . APIContext )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// swagger:operation DELETE /repos/{owner}/{repo}/branches/{branch} repository repoDeleteBranch
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// ---
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// summary: Delete a specific branch from a repository
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// produces:
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// - application/json
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// parameters:
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// - name: owner
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   in: path
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   description: owner of the repo
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   type: string
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   required: true
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// - name: repo
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   in: path
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   description: name of the repo
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   type: string
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   required: true
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// - name: branch
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   in: path
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   description: branch to delete
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   type: string
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   required: true
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// responses:
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   "204":
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//     "$ref": "#/responses/empty"
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//   "403":
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						//     "$ref": "#/responses/error"
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ctx . Repo . TreePath  !=  ""  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							// if TreePath != "", then URL contained extra slashes
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							// (i.e. "master/subbranch" instead of "master"), so branch does
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							// not exist
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . NotFound ( )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ctx . Repo . Repository . DefaultBranch  ==  ctx . Repo . BranchName  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . Error ( http . StatusForbidden ,  "DefaultBranch" ,  fmt . Errorf ( "can not delete default branch" ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						isProtected ,  err  :=  ctx . Repo . Repository . IsProtectedBranch ( ctx . Repo . BranchName ,  ctx . User )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . InternalServerError ( err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  isProtected  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . Error ( http . StatusForbidden ,  "IsProtectedBranch" ,  fmt . Errorf ( "branch protected" ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						branch ,  err  :=  repo_module . GetBranch ( ctx . Repo . Repository ,  ctx . Repo . BranchName )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							if  git . IsErrBranchNotExist ( err )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ctx . NotFound ( err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}  else  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								ctx . Error ( http . StatusInternalServerError ,  "GetBranch" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						c ,  err  :=  branch . GetCommit ( )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . Error ( http . StatusInternalServerError ,  "GetCommit" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  :=  ctx . Repo . GitRepo . DeleteBranch ( ctx . Repo . BranchName ,  git . DeleteBranchOptions {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							Force :  true ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						} ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . Error ( http . StatusInternalServerError ,  "DeleteBranch" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// Don't return error below this
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  :=  repofiles . PushUpdate (   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . Repo . Repository ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							ctx . Repo . BranchName ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							repofiles . PushUpdateOptions {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								RefFullName :   git . BranchPrefix  +  ctx . Repo . BranchName ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								OldCommitID :   c . ID . String ( ) ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								NewCommitID :   git . EmptySHA ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								PusherID :      ctx . User . ID ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								PusherName :    ctx . User . Name ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								RepoUserName :  ctx . Repo . Owner . Name ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								RepoName :      ctx . Repo . Repository . Name ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							} ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							log . Error ( "Update: %v" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  err  :=  ctx . Repo . Repository . AddDeletedBranch ( ctx . Repo . BranchName ,  c . ID . String ( ) ,  ctx . User . ID ) ;  err  !=  nil  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							log . Warn ( "AddDeletedBranch: %v" ,  err )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						ctx . Status ( http . StatusNoContent )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					}  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					// ListBranches list all the branches of a repository
  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					func  ListBranches ( ctx  * context . APIContext )  {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						// swagger:operation GET /repos/{owner}/{repo}/branches repository repoListBranches