@@ -13,6 +13,7 @@ import (
13
13
"path"
14
14
"path/filepath"
15
15
"regexp"
16
+ "sort"
16
17
"strings"
17
18
"syscall"
18
19
@@ -503,7 +504,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
503
504
return
504
505
}
505
506
if treeEntry .Mode .IsFile () {
506
- var fileContent []* utils.Content
507
+ var fileContent []utils.Content
507
508
blob , err := object .GetBlob (repo .Storer , treeEntry .Hash )
508
509
if err != nil {
509
510
http .Error (w , err .Error (), http .StatusNotFound )
@@ -512,7 +513,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
512
513
if err != nil {
513
514
http .Error (w , err .Error (), http .StatusNotFound )
514
515
}
515
- fileContent = append (fileContent , fc )
516
+ fileContent = append (fileContent , * fc )
516
517
517
518
if body .IncludeLastCommit {
518
519
pathCommitId , err := utils .LastCommitForPath (RepoPath , body .RefId , fileContent [0 ].Path )
@@ -550,50 +551,67 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
550
551
}
551
552
}
552
553
553
- var treeContents []* utils.Content
554
+ var treeContents []utils.Content
554
555
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 )
556
557
return nil
557
558
})
558
559
if err != nil {
559
560
http .Error (w , err .Error (), http .StatusBadRequest )
560
561
return
561
562
}
562
563
564
+ var resContents []utils.Content
565
+
563
566
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
+ }
580
590
}
591
+ errc <- nil
592
+ }()
593
+
594
+ if err := <- errc ; err != nil {
595
+ http .Error (w , err .Error (), http .StatusBadRequest )
596
+ return
581
597
}
598
+ } else {
599
+ resContents = treeContents
582
600
}
583
601
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
591
609
}
592
- }
593
- sortedTreeContents := append ( sortedTREEContents , sortedBLOBContents ... )
610
+ return resContents [ i ]. Name < resContents [ j ]. Name
611
+ } )
594
612
595
613
contentResponse := utils.ContentResponse {
596
- Content : sortedTreeContents ,
614
+ Content : resContents ,
597
615
Pagination : pageRes ,
598
616
}
599
617
contentResponseJson , err := json .Marshal (contentResponse )
0 commit comments