@@ -523,140 +523,6 @@ func (r *gitRepo) ReadFile(rev, file string, maxSize int64) ([]byte, error) {
523523 return out , nil
524524}
525525
526- func (r * gitRepo ) ReadFileRevs (revs []string , file string , maxSize int64 ) (map [string ]* FileRev , error ) {
527- // Create space to hold results.
528- files := make (map [string ]* FileRev )
529- for _ , rev := range revs {
530- f := & FileRev {Rev : rev }
531- files [rev ] = f
532- }
533-
534- // Collect locally-known revs.
535- need , err := r .readFileRevs (revs , file , files )
536- if err != nil {
537- return nil , err
538- }
539- if len (need ) == 0 {
540- return files , nil
541- }
542-
543- // Build list of known remote refs that might help.
544- var redo []string
545- refs , err := r .loadRefs ()
546- if err != nil {
547- return nil , err
548- }
549- for _ , tag := range need {
550- if refs ["refs/tags/" + tag ] != "" {
551- redo = append (redo , tag )
552- }
553- }
554- if len (redo ) == 0 {
555- return files , nil
556- }
557-
558- // Protect r.fetchLevel and the "fetch more and more" sequence.
559- // See stat method above.
560- unlock , err := r .mu .Lock ()
561- if err != nil {
562- return nil , err
563- }
564- defer unlock ()
565-
566- if err := r .fetchRefsLocked (); err != nil {
567- return nil , err
568- }
569-
570- if _ , err := r .readFileRevs (redo , file , files ); err != nil {
571- return nil , err
572- }
573-
574- return files , nil
575- }
576-
577- func (r * gitRepo ) readFileRevs (tags []string , file string , fileMap map [string ]* FileRev ) (missing []string , err error ) {
578- var stdin bytes.Buffer
579- for _ , tag := range tags {
580- fmt .Fprintf (& stdin , "refs/tags/%s\n " , tag )
581- fmt .Fprintf (& stdin , "refs/tags/%s:%s\n " , tag , file )
582- }
583-
584- data , err := RunWithStdin (r .dir , & stdin , "git" , "cat-file" , "--batch" )
585- if err != nil {
586- return nil , err
587- }
588-
589- next := func () (typ string , body []byte , ok bool ) {
590- var line string
591- i := bytes .IndexByte (data , '\n' )
592- if i < 0 {
593- return "" , nil , false
594- }
595- line , data = string (bytes .TrimSpace (data [:i ])), data [i + 1 :]
596- if strings .HasSuffix (line , " missing" ) {
597- return "missing" , nil , true
598- }
599- f := strings .Fields (line )
600- if len (f ) != 3 {
601- return "" , nil , false
602- }
603- n , err := strconv .Atoi (f [2 ])
604- if err != nil || n > len (data ) {
605- return "" , nil , false
606- }
607- body , data = data [:n ], data [n :]
608- if len (data ) > 0 && data [0 ] == '\r' {
609- data = data [1 :]
610- }
611- if len (data ) > 0 && data [0 ] == '\n' {
612- data = data [1 :]
613- }
614- return f [1 ], body , true
615- }
616-
617- badGit := func () ([]string , error ) {
618- return nil , fmt .Errorf ("malformed output from git cat-file --batch" )
619- }
620-
621- for _ , tag := range tags {
622- commitType , _ , ok := next ()
623- if ! ok {
624- return badGit ()
625- }
626- fileType , fileData , ok := next ()
627- if ! ok {
628- return badGit ()
629- }
630- f := fileMap [tag ]
631- f .Data = nil
632- f .Err = nil
633- switch commitType {
634- default :
635- f .Err = fmt .Errorf ("unexpected non-commit type %q for rev %s" , commitType , tag )
636-
637- case "missing" :
638- // Note: f.Err must not satisfy os.IsNotExist. That's reserved for the file not existing in a valid commit.
639- f .Err = fmt .Errorf ("no such rev %s" , tag )
640- missing = append (missing , tag )
641-
642- case "tag" , "commit" :
643- switch fileType {
644- default :
645- f .Err = & fs.PathError {Path : tag + ":" + file , Op : "read" , Err : fmt .Errorf ("unexpected non-blob type %q" , fileType )}
646- case "missing" :
647- f .Err = & fs.PathError {Path : tag + ":" + file , Op : "read" , Err : fs .ErrNotExist }
648- case "blob" :
649- f .Data = fileData
650- }
651- }
652- }
653- if len (bytes .TrimSpace (data )) != 0 {
654- return badGit ()
655- }
656-
657- return missing , nil
658- }
659-
660526func (r * gitRepo ) RecentTag (rev , prefix string , allowed func (string ) bool ) (tag string , err error ) {
661527 info , err := r .Stat (rev )
662528 if err != nil {
0 commit comments