1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
package link
import (
"context"
"fmt"
"regexp"
"strings"
"github.com/Azure/azure-sdk-for-go/eng/tools/generator/cmd/issue/query"
"github.com/ahmetb/go-linq/v3"
"github.com/google/go-github/v32/github"
)
var (
splitRegex = regexp.MustCompile(`[^A-Fa-f0-9]`)
)
type commitLink struct {
linkBase
rawLink string
}
var _ CommitHashLink = (*commitLink)(nil)
// NewCommitLink parses a commit link to its corresponding readme.md file link
func NewCommitLink(ctx context.Context, client *query.Client, requestLink, releaseLink string) Resolver {
segments := splitRegex.Split(strings.TrimPrefix(releaseLink, CommitPrefix), -1)
realLink := fmt.Sprintf("%s%s", CommitPrefix, segments[0])
return &commitLink{
linkBase: linkBase{
ctx: ctx,
client: client,
releaseLink: realLink,
requestLink: requestLink,
},
rawLink: releaseLink,
}
}
// Resolve ...
func (l commitLink) Resolve() (ResolveResult, error) {
hash, err := l.GetCommitHash()
if err != nil {
return nil, err
}
commit, _, err := l.client.Repositories.GetCommit(l.ctx, SpecOwner, SpecRepo, hash)
if err != nil {
return nil, err
}
var filePaths []string
linq.From(commit.Files).Select(func(item interface{}) interface{} {
return item.(*github.CommitFile).GetFilename()
}).ToSlice(&filePaths)
readme, err := GetReadmePathFromChangedFiles(l.ctx, l.client, filePaths)
if err != nil {
return nil, fmt.Errorf("cannot resolve commit link '%s': %+v", l.GetReleaseLink(), err)
}
return getResult(readme), nil
}
// GetCommitHash ...
func (l commitLink) GetCommitHash() (string, error) {
return getCommitRefFromLink(l.GetReleaseLink(), CommitPrefix)
}
// String ...
func (l commitLink) String() string {
return l.GetReleaseLink()
}
|