add the ability to specify repository ref (#80)
closes #75 Reviewed-on: #80 Co-authored-by: Maxim Slipenko <no-reply@maxim.slipenko.com> Co-committed-by: Maxim Slipenko <no-reply@maxim.slipenko.com>
This commit is contained in:
@ -18,12 +18,18 @@ package repos
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"github.com/go-git/go-git/v5"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/format/diff"
|
||||
"github.com/go-git/go-git/v5/plumbing/transport"
|
||||
"github.com/go-git/go-git/v5/plumbing/transport/client"
|
||||
|
||||
"mvdan.cc/sh/v3/interp"
|
||||
"mvdan.cc/sh/v3/syntax"
|
||||
|
||||
@ -137,3 +143,59 @@ func resolveOverrides(runner *interp.Runner, pkg *db.Package) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getHeadReference(r *git.Repository) (plumbing.ReferenceName, error) {
|
||||
remote, err := r.Remote(git.DefaultRemoteName)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
endpoint, err := transport.NewEndpoint(remote.Config().URLs[0])
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
gitClient, err := client.NewClient(endpoint)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
session, err := gitClient.NewUploadPackSession(endpoint, nil)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
info, err := session.AdvertisedReferences()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
refs, err := info.AllReferences()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return refs["HEAD"].Target(), nil
|
||||
}
|
||||
|
||||
func resolveHash(r *git.Repository, ref string) (*plumbing.Hash, error) {
|
||||
var err error
|
||||
|
||||
if ref == "" {
|
||||
reference, err := getHeadReference(r)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get head reference %w", err)
|
||||
}
|
||||
ref = reference.Short()
|
||||
}
|
||||
|
||||
hsh, err := r.ResolveRevision(git.DefaultRemoteName + "/" + plumbing.Revision(ref))
|
||||
if err != nil {
|
||||
hsh, err = r.ResolveRevision(plumbing.Revision(ref))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return hsh, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user