blob: 6a256be2dd973f883286e898c2847766a7fd5fb5 [file] [log] [blame]
package source
import (
"context"
"fmt"
"strconv"
"strings"
dvpb "code.hackerspace.pl/hscloud/devtools/depotview/proto"
)
type DepotViewSourceProvider struct {
stub dvpb.DepotViewClient
}
func NewDepotView(stub dvpb.DepotViewClient) SourceProvider {
return &DepotViewSourceProvider{
stub: stub,
}
}
func changeRef(ref string) int64 {
ref = strings.ToLower(ref)
if !strings.HasPrefix(ref, "change/") && !strings.HasPrefix(ref, "cr/") {
return 0
}
n, err := strconv.ParseInt(strings.SplitN(ref, "/", 2)[1], 10, 64)
if err != nil {
return 0
}
return n
}
func (s *DepotViewSourceProvider) Source(ctx context.Context, ref string) (Source, error) {
var hash string
n := changeRef(ref)
if n != 0 {
res, err := s.stub.ResolveGerritChange(ctx, &dvpb.ResolveGerritChangeRequest{Change: n})
if err != nil {
return nil, err
}
hash = res.Hash
} else {
res, err := s.stub.Resolve(ctx, &dvpb.ResolveRequest{Ref: ref})
if err != nil {
return nil, err
}
hash = res.Hash
}
if hash == "" {
return nil, nil
}
return &depotViewSource{
stub: s.stub,
hash: hash,
change: n,
}, nil
}
type depotViewSource struct {
stub dvpb.DepotViewClient
hash string
change int64
}
func (s *depotViewSource) IsFile(ctx context.Context, path string) (bool, error) {
res, err := s.stub.Stat(ctx, &dvpb.StatRequest{
Hash: s.hash,
Path: path,
})
if err != nil {
return false, err
}
return res.Type == dvpb.StatResponse_TYPE_FILE, nil
}
func (s *depotViewSource) IsDirectory(ctx context.Context, path string) (bool, error) {
res, err := s.stub.Stat(ctx, &dvpb.StatRequest{
Hash: s.hash,
Path: path,
})
if err != nil {
return false, err
}
return res.Type == dvpb.StatResponse_TYPE_DIRECTORY, nil
}
func (s *depotViewSource) ReadFile(ctx context.Context, path string) ([]byte, error) {
var data []byte
srv, err := s.stub.Read(ctx, &dvpb.ReadRequest{
Hash: s.hash,
Path: path,
})
if err != nil {
return nil, err
}
for {
res, err := srv.Recv()
if err != nil {
return nil, err
}
if len(res.Data) == 0 {
break
}
data = append(data, res.Data...)
}
return data, nil
}
func (s *depotViewSource) WebLinks(fpath string) []WebLink {
gitURL := fmt.Sprintf(FlagGitwebURLPattern, s.hash, fpath)
links := []WebLink{
WebLink{Kind: "gitweb", LinkLabel: s.hash[:16], LinkURL: gitURL},
}
if s.change != 0 {
gerritLabel := fmt.Sprintf("change %d", s.change)
gerritLink := fmt.Sprintf("https://gerrit.hackerspace.pl/%d", s.change)
links = append(links, WebLink{Kind: "gerrit", LinkLabel: gerritLabel, LinkURL: gerritLink})
}
return links
}