72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package github_experimental
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/google/go-github/v67/github"
|
|
|
|
"github.com/trufflesecurity/trufflehog/v3/pkg/giturl"
|
|
"github.com/trufflesecurity/trufflehog/v3/pkg/pb/source_metadatapb"
|
|
)
|
|
|
|
type repoInfoCache struct {
|
|
mu sync.RWMutex
|
|
cache map[string]repoInfo
|
|
}
|
|
|
|
func newRepoInfoCache() repoInfoCache {
|
|
return repoInfoCache{
|
|
cache: make(map[string]repoInfo),
|
|
}
|
|
}
|
|
|
|
func (r *repoInfoCache) put(repoURL string, info repoInfo) {
|
|
r.mu.Lock()
|
|
defer r.mu.Unlock()
|
|
r.cache[repoURL] = info
|
|
}
|
|
|
|
func (r *repoInfoCache) get(repoURL string) (repoInfo, bool) {
|
|
r.mu.RLock()
|
|
defer r.mu.RUnlock()
|
|
|
|
info, ok := r.cache[repoURL]
|
|
return info, ok
|
|
}
|
|
|
|
type repoInfo struct {
|
|
owner string
|
|
name string
|
|
fullName string
|
|
hasWiki bool // the repo is _likely_ to have a wiki (see the comment on wikiIsReachable func).
|
|
size int
|
|
visibility source_metadatapb.Visibility
|
|
}
|
|
|
|
func (s *Source) cacheRepoInfo(r *github.Repository) {
|
|
info := repoInfo{
|
|
owner: r.GetOwner().GetLogin(),
|
|
name: r.GetName(),
|
|
fullName: r.GetFullName(),
|
|
hasWiki: r.GetHasWiki(),
|
|
size: r.GetSize(),
|
|
}
|
|
if r.GetPrivate() {
|
|
info.visibility = source_metadatapb.Visibility_private
|
|
} else {
|
|
info.visibility = source_metadatapb.Visibility_public
|
|
}
|
|
s.repoInfoCache.put(r.GetCloneURL(), info)
|
|
}
|
|
|
|
func (s *Source) normalizeRepo(repo string) (string, error) {
|
|
// If there's a '/', assume it's a URL and try to normalize it.
|
|
if strings.ContainsRune(repo, '/') {
|
|
return giturl.NormalizeGithubRepo(repo)
|
|
}
|
|
|
|
return "", fmt.Errorf("no repositories found for %s", repo)
|
|
}
|