Skip to content

Commit 6f567c8

Browse files
rgmzbecojo
andauthored
Specify custom ref with analyze_repo (#131)
* feat(analyze_repo): specify ref * add ref to package insights * add ref to json --------- Co-authored-by: Becojo <[email protected]>
1 parent 4f6ca1b commit 6f567c8

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

analyze/analyze.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ package analyze
44
import (
55
"context"
66
"fmt"
7-
"github.com/boostsecurityio/poutine/models"
8-
"golang.org/x/sync/semaphore"
97
"os"
108
"strings"
119
"sync"
1210
"time"
1311

12+
"github.com/boostsecurityio/poutine/models"
13+
"golang.org/x/sync/semaphore"
14+
1415
"github.com/boostsecurityio/poutine/opa"
1516
"github.com/boostsecurityio/poutine/providers/pkgsupply"
1617
"github.com/boostsecurityio/poutine/scanner"
@@ -129,14 +130,14 @@ func (a *Analyzer) AnalyzeOrg(ctx context.Context, org string, numberOfGoroutine
129130
defer sem.Release(1)
130131
defer wg.Done()
131132
repoNameWithOwner := repo.GetRepoIdentifier()
132-
tempDir, err := a.cloneRepoToTemp(ctx, repo.BuildGitURL(a.ScmClient.GetProviderBaseURL()), a.ScmClient.GetToken())
133+
tempDir, err := a.cloneRepoToTemp(ctx, repo.BuildGitURL(a.ScmClient.GetProviderBaseURL()), a.ScmClient.GetToken(), "HEAD")
133134
if err != nil {
134135
log.Error().Err(err).Str("repo", repoNameWithOwner).Msg("failed to clone repo")
135136
return
136137
}
137138
defer os.RemoveAll(tempDir)
138139

139-
pkg, err := a.generatePackageInsights(ctx, tempDir, repo)
140+
pkg, err := a.generatePackageInsights(ctx, tempDir, repo, "HEAD")
140141
if err != nil {
141142
log.Error().Err(err).Str("repo", repoNameWithOwner).Msg("failed to generate package insights")
142143
return
@@ -166,7 +167,7 @@ func (a *Analyzer) AnalyzeOrg(ctx context.Context, org string, numberOfGoroutine
166167
return a.finalizeAnalysis(ctx, inventory)
167168
}
168169

169-
func (a *Analyzer) AnalyzeRepo(ctx context.Context, repoString string) error {
170+
func (a *Analyzer) AnalyzeRepo(ctx context.Context, repoString string, ref string) error {
170171
org, repoName, err := a.ScmClient.ParseRepoAndOrg(repoString)
171172
if err != nil {
172173
return fmt.Errorf("failed to parse repository: %w", err)
@@ -200,13 +201,13 @@ func (a *Analyzer) AnalyzeRepo(ctx context.Context, repoString string) error {
200201
progressbar.OptionSetWriter(os.Stderr),
201202
)
202203

203-
tempDir, err := a.cloneRepoToTemp(ctx, repo.BuildGitURL(a.ScmClient.GetProviderBaseURL()), a.ScmClient.GetToken())
204+
tempDir, err := a.cloneRepoToTemp(ctx, repo.BuildGitURL(a.ScmClient.GetProviderBaseURL()), a.ScmClient.GetToken(), ref)
204205
if err != nil {
205206
return err
206207
}
207208
defer os.RemoveAll(tempDir)
208209

209-
pkg, err := a.generatePackageInsights(ctx, tempDir, repo)
210+
pkg, err := a.generatePackageInsights(ctx, tempDir, repo, ref)
210211
if err != nil {
211212
return err
212213
}
@@ -255,7 +256,7 @@ func (a *Analyzer) AnalyzeLocalRepo(ctx context.Context, repoPath string) error
255256
progressbar.OptionSetWriter(os.Stderr),
256257
)
257258

258-
pkg, err := a.generatePackageInsights(ctx, repoPath, repo)
259+
pkg, err := a.generatePackageInsights(ctx, repoPath, repo, "")
259260
if err != nil {
260261
return err
261262
}
@@ -288,7 +289,7 @@ func (a *Analyzer) finalizeAnalysis(ctx context.Context, inventory *scanner.Inve
288289
return nil
289290
}
290291

291-
func (a *Analyzer) generatePackageInsights(ctx context.Context, tempDir string, repo Repository) (*models.PackageInsights, error) {
292+
func (a *Analyzer) generatePackageInsights(ctx context.Context, tempDir string, repo Repository, ref string) (*models.PackageInsights, error) {
292293
commitDate, err := a.GitClient.LastCommitDate(ctx, tempDir)
293294
if err != nil {
294295
return nil, fmt.Errorf("failed to get last commit date: %w", err)
@@ -299,9 +300,12 @@ func (a *Analyzer) generatePackageInsights(ctx context.Context, tempDir string,
299300
return nil, fmt.Errorf("failed to get commit SHA: %w", err)
300301
}
301302

302-
headBranchName, err := a.GitClient.GetRepoHeadBranchName(ctx, tempDir)
303-
if err != nil {
304-
return nil, fmt.Errorf("failed to get head branch name: %w", err)
303+
switch ref {
304+
case "HEAD", "":
305+
ref, err = a.GitClient.GetRepoHeadBranchName(ctx, tempDir)
306+
if err != nil {
307+
return nil, fmt.Errorf("failed to get head branch name: %w", err)
308+
}
305309
}
306310

307311
purl := fmt.Sprintf("pkg:%s/%s", repo.GetProviderName(), strings.ToLower(repo.GetRepoIdentifier()))
@@ -311,7 +315,7 @@ func (a *Analyzer) generatePackageInsights(ctx context.Context, tempDir string,
311315
SourceGitCommitSha: commitSha,
312316
SourceScmType: repo.GetProviderName(),
313317
SourceGitRepo: repo.GetRepoIdentifier(),
314-
SourceGitRef: headBranchName,
318+
SourceGitRef: ref,
315319
}
316320
err = pkg.NormalizePurl()
317321
if err != nil {
@@ -320,13 +324,13 @@ func (a *Analyzer) generatePackageInsights(ctx context.Context, tempDir string,
320324
return pkg, nil
321325
}
322326

323-
func (a *Analyzer) cloneRepoToTemp(ctx context.Context, gitURL string, token string) (string, error) {
327+
func (a *Analyzer) cloneRepoToTemp(ctx context.Context, gitURL string, token string, ref string) (string, error) {
324328
tempDir, err := os.MkdirTemp("", TEMP_DIR_PREFIX)
325329
if err != nil {
326330
return "", fmt.Errorf("failed to create temp directory: %w", err)
327331
}
328332

329-
err = a.GitClient.Clone(ctx, tempDir, gitURL, token, "HEAD")
333+
err = a.GitClient.Clone(ctx, tempDir, gitURL, token, ref)
330334
if err != nil {
331335
os.RemoveAll(tempDir) // Clean up if cloning fails
332336
return "", fmt.Errorf("failed to clone repo: %s", err)

cmd/analyzeRepo.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package cmd
22

33
import (
44
"fmt"
5+
56
"github.com/spf13/cobra"
67
"github.com/spf13/viper"
78
)
89

10+
var ref string
11+
912
// analyzeRepoCmd represents the analyzeRepo command
1013
var analyzeRepoCmd = &cobra.Command{
1114
Use: "analyze_repo",
@@ -23,7 +26,7 @@ Example Scanning a remote Github Repository: poutine analyze_repo org/repo --tok
2326

2427
repo := args[0]
2528

26-
err = analyzer.AnalyzeRepo(ctx, repo)
29+
err = analyzer.AnalyzeRepo(ctx, repo, ref)
2730
if err != nil {
2831
return fmt.Errorf("failed to analyze repo %s: %w", repo, err)
2932
}
@@ -36,6 +39,7 @@ func init() {
3639
rootCmd.AddCommand(analyzeRepoCmd)
3740

3841
analyzeRepoCmd.Flags().StringVarP(&token, "token", "t", "", "SCM access token (env: GH_TOKEN)")
42+
analyzeRepoCmd.Flags().StringVarP(&ref, "ref", "r", "HEAD", "Commit or branch to analyze (defaults to HEAD)")
3943

4044
viper.BindPFlag("token", analyzeOrgCmd.Flags().Lookup("token"))
4145
viper.BindEnv("token", "GH_TOKEN")

opa/rego/poutine/format/json.rego

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ dependencies[pkg.purl] contains dep if {
1010
packages[pkg.purl] = {
1111
"dependencies": object.get(dependencies, pkg.purl, []),
1212
"commit_sha": pkg.source_git_commit_sha,
13+
"ref": pkg.source_git_ref,
1314
} if {
1415
pkg := input.packages[_]
1516
}

0 commit comments

Comments
 (0)