@@ -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