2020-12-17 17:00:47 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2021-08-24 19:47:09 +03:00
//go:build !gogit
2020-12-17 17:00:47 +03:00
package git
import (
"bufio"
"io"
"strings"
)
// GetRefsFiltered returns all references of the repository that matches patterm exactly or starting with.
func ( repo * Repository ) GetRefsFiltered ( pattern string ) ( [ ] * Reference , error ) {
stdoutReader , stdoutWriter := io . Pipe ( )
defer func ( ) {
_ = stdoutReader . Close ( )
_ = stdoutWriter . Close ( )
} ( )
go func ( ) {
stderrBuilder := & strings . Builder { }
2022-04-01 05:55:30 +03:00
err := NewCommand ( repo . Ctx , "for-each-ref" ) . Run ( & RunOpts {
Dir : repo . Path ,
Stdout : stdoutWriter ,
Stderr : stderrBuilder ,
2022-02-11 15:47:22 +03:00
} )
2020-12-17 17:00:47 +03:00
if err != nil {
_ = stdoutWriter . CloseWithError ( ConcatenateError ( err , stderrBuilder . String ( ) ) )
} else {
_ = stdoutWriter . Close ( )
}
} ( )
refs := make ( [ ] * Reference , 0 )
bufReader := bufio . NewReader ( stdoutReader )
for {
// The output of for-each-ref is simply a list:
// <sha> SP <type> TAB <ref> LF
sha , err := bufReader . ReadString ( ' ' )
if err == io . EOF {
break
}
if err != nil {
return nil , err
}
sha = sha [ : len ( sha ) - 1 ]
typ , err := bufReader . ReadString ( '\t' )
if err == io . EOF {
// This should not happen, but we'll tolerate it
break
}
if err != nil {
return nil , err
}
typ = typ [ : len ( typ ) - 1 ]
refName , err := bufReader . ReadString ( '\n' )
if err == io . EOF {
// This should not happen, but we'll tolerate it
break
}
if err != nil {
return nil , err
}
refName = refName [ : len ( refName ) - 1 ]
// refName cannot be HEAD but can be remotes or stash
2021-12-02 10:28:08 +03:00
if strings . HasPrefix ( refName , RemotePrefix ) || refName == "/refs/stash" {
2020-12-17 17:00:47 +03:00
continue
}
if pattern == "" || strings . HasPrefix ( refName , pattern ) {
r := & Reference {
Name : refName ,
Object : MustIDFromString ( sha ) ,
Type : typ ,
repo : repo ,
}
refs = append ( refs , r )
}
}
return refs , nil
}