forked from hswaw/hscloud
127 lines
2.6 KiB
Go
127 lines
2.6 KiB
Go
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: "source", 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
|
|
}
|