@ -61,14 +61,29 @@ func (repo *Repository) IsBranchExist(name string) bool { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						return  repo . IsReferenceExist ( BranchPrefix  +  name )   
					 
					 
					 
						return  repo . IsReferenceExist ( BranchPrefix  +  name )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// GetBranches returns branches from the repository, skipping skip initial branches and
  
					 
					 
					 
					// GetBranchNam es returns branches from the repository, skipping skip initial branches and
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					// returning at most limit branches, or all branches if limit is 0.
  
					 
					 
					 
					// returning at most limit branches, or all branches if limit is 0.
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					func  ( repo  * Repository )  GetBranches ( skip ,  limit  int )  ( [ ] string ,  int ,  error )  {  
					 
					 
					 
					func  ( repo  * Repository )  GetBranchNam es ( skip ,  limit  int )  ( [ ] string ,  int ,  error )  {  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
						return  callShowRef ( repo . Ctx ,  repo . Path ,  BranchPrefix ,  "--heads" ,  skip ,  limit )   
					 
					 
					 
						return  callShowRef ( repo . Ctx ,  repo . Path ,  BranchPrefix ,  "--heads" ,  skip ,  limit )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					// WalkReferences walks all the references from the repository
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					func  WalkReferences ( ctx  context . Context ,  repoPath  string ,  walkfn  func ( string )  error )  ( int ,  error )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						return  walkShowRef ( ctx ,  repoPath ,  "" ,  0 ,  0 ,  walkfn )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					// callShowRef return refs, if limit = 0 it will not limit
  
					 
					 
					 
					// callShowRef return refs, if limit = 0 it will not limit
  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					func  callShowRef ( ctx  context . Context ,  repoPath ,  prefix ,  arg  string ,  skip ,  limit  int )  ( branchNames  [ ] string ,  countAll  int ,  err  error )  {  
					 
					 
					 
					func  callShowRef ( ctx  context . Context ,  repoPath ,  prefix ,  arg  string ,  skip ,  limit  int )  ( branchNames  [ ] string ,  countAll  int ,  err  error )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						countAll ,  err  =  walkShowRef ( ctx ,  repoPath ,  arg ,  skip ,  limit ,  func ( branchName  string )  error  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							branchName  =  strings . TrimPrefix ( branchName ,  prefix )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							branchNames  =  append ( branchNames ,  branchName )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							return  nil   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						} )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						return   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					}  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					func  walkShowRef ( ctx  context . Context ,  repoPath ,  arg  string ,  skip ,  limit  int ,  walkfn  func ( string )  error )  ( countAll  int ,  err  error )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						stdoutReader ,  stdoutWriter  :=  io . Pipe ( )   
					 
					 
					 
						stdoutReader ,  stdoutWriter  :=  io . Pipe ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						defer  func ( )  {   
					 
					 
					 
						defer  func ( )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							_  =  stdoutReader . Close ( )   
					 
					 
					 
							_  =  stdoutReader . Close ( )   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -77,7 +92,11 @@ func callShowRef(ctx context.Context, repoPath, prefix, arg string, skip, limit 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						go  func ( )  {   
					 
					 
					 
						go  func ( )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							stderrBuilder  :=  & strings . Builder { }   
					 
					 
					 
							stderrBuilder  :=  & strings . Builder { }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							err  :=  NewCommandContext ( ctx ,  "show-ref" ,  arg ) . RunInDirPipeline ( repoPath ,  stdoutWriter ,  stderrBuilder )   
					 
					 
					 
							args  :=  [ ] string { "show-ref" }   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							if  arg  !=  ""  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
								args  =  append ( args ,  arg )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							err  :=  NewCommandContext ( ctx ,  args ... ) . RunInDirPipeline ( repoPath ,  stdoutWriter ,  stderrBuilder )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
							if  err  !=  nil  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								if  stderrBuilder . Len ( )  ==  0  {   
					 
					 
					 
								if  stderrBuilder . Len ( )  ==  0  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
									_  =  stdoutWriter . Close ( )   
					 
					 
					 
									_  =  stdoutWriter . Close ( )   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -94,10 +113,10 @@ func callShowRef(ctx context.Context, repoPath, prefix, arg string, skip, limit 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						for  i  <  skip  {   
					 
					 
					 
						for  i  <  skip  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							_ ,  isPrefix ,  err  :=  bufReader . ReadLine ( )   
					 
					 
					 
							_ ,  isPrefix ,  err  :=  bufReader . ReadLine ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  ==  io . EOF  {   
					 
					 
					 
							if  err  ==  io . EOF  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  branchNames ,  i ,  nil   
					 
					 
					 
								return  i ,  nil   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
							if  err  !=  nil  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  nil ,  0 ,  err   
					 
					 
					 
								return  0 ,  err   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  ! isPrefix  {   
					 
					 
					 
							if  ! isPrefix  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								i ++   
					 
					 
					 
								i ++   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -112,39 +131,42 @@ func callShowRef(ctx context.Context, repoPath, prefix, arg string, skip, limit 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								_ ,  err  =  bufReader . ReadSlice ( ' ' )   
					 
					 
					 
								_ ,  err  =  bufReader . ReadSlice ( ' ' )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  ==  io . EOF  {   
					 
					 
					 
							if  err  ==  io . EOF  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  branchNames ,  i ,  nil   
					 
					 
					 
								return  i ,  nil   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
							if  err  !=  nil  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  nil ,  0 ,  err   
					 
					 
					 
								return  0 ,  err   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							branchName ,  err  :=  bufReader . ReadString ( '\n' )   
					 
					 
					 
							branchName ,  err  :=  bufReader . ReadString ( '\n' )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  ==  io . EOF  {   
					 
					 
					 
							if  err  ==  io . EOF  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								// This shouldn't happen... but we'll tolerate it for the sake of peace
   
					 
					 
					 
								// This shouldn't happen... but we'll tolerate it for the sake of peace
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  branchNames ,  i ,  nil   
					 
					 
					 
								return  i ,  nil   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
							if  err  !=  nil  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  nil ,  i ,  err   
					 
					 
					 
								return  i ,  err   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							branchName  =  strings . TrimPrefix ( branchName ,  prefix )   
					 
					 
					 
					
  
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							if  len ( branchName )  >  0  {   
					 
					 
					 
							if  len ( branchName )  >  0  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								branchName  =  branchName [ : len ( branchName ) - 1 ]   
					 
					 
					 
								branchName  =  branchName [ : len ( branchName ) - 1 ]   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							branchNames  =  append ( branchNames ,  branchName )   
					 
					 
					 
							err  =  walkfn ( branchName )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							if  err  !=  nil  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
								return  i ,  err   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							i ++   
					 
					 
					 
							i ++   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
						}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						// count all refs
   
					 
					 
					 
						// count all refs
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						for  limit  !=  0  {   
					 
					 
					 
						for  limit  !=  0  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							_ ,  isPrefix ,  err  :=  bufReader . ReadLine ( )   
					 
					 
					 
							_ ,  isPrefix ,  err  :=  bufReader . ReadLine ( )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  ==  io . EOF  {   
					 
					 
					 
							if  err  ==  io . EOF  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  branchNames ,  i ,  nil   
					 
					 
					 
								return  i ,  nil   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  err  !=  nil  {   
					 
					 
					 
							if  err  !=  nil  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								return  nil ,  0 ,  err   
					 
					 
					 
								return  0 ,  err   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							if  ! isPrefix  {   
					 
					 
					 
							if  ! isPrefix  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								i ++   
					 
					 
					 
								i ++   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
						}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						return  branchNames ,  i ,  nil   
					 
					 
					 
						return  i ,  nil   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}