2018-11-28 00:52:20 +03:00
// Copyright 2018 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.
package git
import (
"strings"
2020-03-17 19:19:58 +03:00
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
2018-11-28 00:52:20 +03:00
)
// GetRefs returns all references of the repository.
func ( repo * Repository ) GetRefs ( ) ( [ ] * Reference , error ) {
return repo . GetRefsFiltered ( "" )
}
// GetRefsFiltered returns all references of the repository that matches patterm exactly or starting with.
func ( repo * Repository ) GetRefsFiltered ( pattern string ) ( [ ] * Reference , error ) {
r , err := git . PlainOpen ( repo . Path )
if err != nil {
return nil , err
}
refsIter , err := r . References ( )
if err != nil {
return nil , err
}
refs := make ( [ ] * Reference , 0 )
if err = refsIter . ForEach ( func ( ref * plumbing . Reference ) error {
if ref . Name ( ) != plumbing . HEAD && ! ref . Name ( ) . IsRemote ( ) &&
( pattern == "" || strings . HasPrefix ( ref . Name ( ) . String ( ) , pattern ) ) {
2019-06-08 17:31:11 +03:00
refType := string ( ObjectCommit )
if ref . Name ( ) . IsTag ( ) {
// tags can be of type `commit` (lightweight) or `tag` (annotated)
2019-07-23 21:50:39 +03:00
if tagType , _ := repo . GetTagType ( ref . Hash ( ) ) ; err == nil {
2019-06-08 17:31:11 +03:00
refType = tagType
}
}
2018-11-28 00:52:20 +03:00
r := & Reference {
Name : ref . Name ( ) . String ( ) ,
2019-07-23 21:50:39 +03:00
Object : ref . Hash ( ) ,
2019-06-08 17:31:11 +03:00
Type : refType ,
2018-11-28 00:52:20 +03:00
repo : repo ,
}
refs = append ( refs , r )
}
return nil
} ) ; err != nil {
return nil , err
}
return refs , nil
}