@@ -13,6 +13,7 @@ import (
1313	"path" 
1414	"path/filepath" 
1515	"regexp" 
16+ 	"sort" 
1617	"strings" 
1718	"syscall" 
1819
@@ -503,7 +504,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
503504				return 
504505			}
505506			if  treeEntry .Mode .IsFile () {
506- 				var  fileContent  []* utils.Content 
507+ 				var  fileContent  []utils.Content 
507508				blob , err  :=  object .GetBlob (repo .Storer , treeEntry .Hash )
508509				if  err  !=  nil  {
509510					http .Error (w , err .Error (), http .StatusNotFound )
@@ -512,7 +513,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
512513				if  err  !=  nil  {
513514					http .Error (w , err .Error (), http .StatusNotFound )
514515				}
515- 				fileContent  =  append (fileContent , fc )
516+ 				fileContent  =  append (fileContent , * fc )
516517
517518				if  body .IncludeLastCommit  {
518519					pathCommitId , err  :=  utils .LastCommitForPath (RepoPath , body .RefId , fileContent [0 ].Path )
@@ -550,50 +551,67 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
550551			}
551552		}
552553
553- 		var  treeContents  []* utils.Content 
554+ 		var  treeContents  []utils.Content 
554555		pageRes , err  :=  utils .PaginateTreeContentResponse (tree , body .Pagination , 100 , body .Path , func (treeContent  utils.Content ) error  {
555- 			treeContents  =  append (treeContents , & treeContent )
556+ 			treeContents  =  append (treeContents , treeContent )
556557			return  nil 
557558		})
558559		if  err  !=  nil  {
559560			http .Error (w , err .Error (), http .StatusBadRequest )
560561			return 
561562		}
562563
564+ 		var  resContents  []utils.Content 
565+ 
563566		if  body .IncludeLastCommit  {
564- 			for  i  :=  range  treeContents  {
565- 				pathCommitId , err  :=  utils .LastCommitForPath (RepoPath , body .RefId , treeContents [i ].Path )
566- 				if  err  !=  nil  {
567- 					http .Error (w , err .Error (), http .StatusBadRequest )
568- 					return 
569- 				}
570- 				pathCommitHash  :=  plumbing .NewHash (pathCommitId )
571- 				pathCommitObject , err  :=  object .GetCommit (repo .Storer , pathCommitHash )
572- 				if  err  !=  nil  {
573- 					http .Error (w , err .Error (), http .StatusNotFound )
574- 					return 
575- 				}
576- 				treeContents [i ].LastCommit , err  =  utils .GrabCommit (* pathCommitObject )
577- 				if  err  !=  nil  {
578- 					http .Error (w , err .Error (), http .StatusBadRequest )
579- 					return 
567+ 			errc  :=  make (chan  error , len (treeContents ))
568+ 			done  :=  make (chan  struct {})
569+ 			defer  close (errc )
570+ 			defer  close (done )
571+ 
572+ 			inputCh  :=  utils .PrepareTreeContentPipeline (treeContents , done )
573+ 
574+ 			mergeInput  :=  make ([]<- chan  utils.Content , len (treeContents ))
575+ 
576+ 			for  i  :=  0 ; i  <  len (treeContents ); i ++  {
577+ 				mergeInput [i ] =  utils .GetLastCommit (inputCh , RepoPath , repo .Storer , body .RefId , errc , done )
578+ 			}
579+ 
580+ 			final  :=  utils .MergeContentChannel (done , mergeInput ... )
581+ 
582+ 			go  func () {
583+ 				for  tc  :=  range  final  {
584+ 					select  {
585+ 					case  <- done :
586+ 						return 
587+ 					default :
588+ 						resContents  =  append (resContents , tc )
589+ 					}
580590				}
591+ 				errc  <-  nil 
592+ 			}()
593+ 
594+ 			if  err  :=  <- errc ; err  !=  nil  {
595+ 				http .Error (w , err .Error (), http .StatusBadRequest )
596+ 				return 
581597			}
598+ 		} else  {
599+ 			resContents  =  treeContents 
582600		}
583601
584- 		var   sortedTREEContents  [] * utils. Content 
585- 		var   sortedBLOBContents  [] * utils. Content 
586- 		for   _ ,  tc   :=   range   treeContents  {
587- 			if   tc . Type   ==   "TREE"  { 
588- 				sortedTREEContents   =   append ( sortedTREEContents ,  tc ) 
589- 			}  else  { 
590- 				sortedBLOBContents   =   append ( sortedBLOBContents ,  tc ) 
602+ 		/* Sort the contents */ 
603+ 		sort . Slice ( resContents [:],  func ( i ,  j   int )  bool  { 
604+ 			 switch   strings . Compare ( resContents [ i ]. Type ,  resContents [ j ]. Type )  {
605+ 			case   - 1 : 
606+ 				return   false 
607+ 			case   1 : 
608+ 				return   true 
591609			}
592- 		} 
593- 		sortedTreeContents   :=   append ( sortedTREEContents ,  sortedBLOBContents ... )
610+ 			 return   resContents [ i ]. Name   <   resContents [ j ]. Name 
611+ 		} )
594612
595613		contentResponse  :=  utils.ContentResponse {
596- 			Content :    sortedTreeContents ,
614+ 			Content :    resContents ,
597615			Pagination : pageRes ,
598616		}
599617		contentResponseJson , err  :=  json .Marshal (contentResponse )
0 commit comments