code.gitea.io/gitea@v1.19.3/modules/git/repo_ref_gogit.go (about)

     1  // Copyright 2018 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  //go:build gogit
     5  
     6  package git
     7  
     8  import (
     9  	"strings"
    10  
    11  	"github.com/go-git/go-git/v5"
    12  	"github.com/go-git/go-git/v5/plumbing"
    13  )
    14  
    15  // GetRefsFiltered returns all references of the repository that matches patterm exactly or starting with.
    16  func (repo *Repository) GetRefsFiltered(pattern string) ([]*Reference, error) {
    17  	r, err := git.PlainOpen(repo.Path)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	refsIter, err := r.References()
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  	refs := make([]*Reference, 0)
    27  	if err = refsIter.ForEach(func(ref *plumbing.Reference) error {
    28  		if ref.Name() != plumbing.HEAD && !ref.Name().IsRemote() &&
    29  			(pattern == "" || strings.HasPrefix(ref.Name().String(), pattern)) {
    30  			refType := string(ObjectCommit)
    31  			if ref.Name().IsTag() {
    32  				// tags can be of type `commit` (lightweight) or `tag` (annotated)
    33  				if tagType, _ := repo.GetTagType(ref.Hash()); err == nil {
    34  					refType = tagType
    35  				}
    36  			}
    37  			r := &Reference{
    38  				Name:   ref.Name().String(),
    39  				Object: ref.Hash(),
    40  				Type:   refType,
    41  				repo:   repo,
    42  			}
    43  			refs = append(refs, r)
    44  		}
    45  		return nil
    46  	}); err != nil {
    47  		return nil, err
    48  	}
    49  
    50  	return refs, nil
    51  }