diff --git a/scanpullrequest/scanpullrequest.go b/scanpullrequest/scanpullrequest.go index 5cc0d2888..fafe3fdf2 100644 --- a/scanpullrequest/scanpullrequest.go +++ b/scanpullrequest/scanpullrequest.go @@ -131,11 +131,19 @@ func downloadSourceAndTarget(repoConfig *utils.Repository, scanDetails *utils.Sc err = fmt.Errorf("failed to download source branch code. Error: %s", err.Error()) return } + if err = utils.CreateSyntheticHeadCommit(sourceBranchWd); err != nil { + log.Warn("Failed to create synthetic HEAD commit for source branch: " + err.Error()) + err = nil + } target := repoConfig.Params.Git.PullRequestDetails.Target if targetBranchWd, cleanupTarget, err = utils.DownloadRepoToTempDir(scanDetails.Client(), target.Owner, target.Repository, target.Name); err != nil { err = fmt.Errorf("failed to download target branch code. Error: %s", err.Error()) return } + if err = utils.CreateSyntheticHeadCommit(targetBranchWd); err != nil { + log.Warn("Failed to create synthetic HEAD commit for target branch: " + err.Error()) + err = nil + } return } diff --git a/utils/git.go b/utils/git.go index 563e42491..cef66da21 100644 --- a/utils/git.go +++ b/utils/git.go @@ -82,6 +82,31 @@ func (gm *GitManager) SetAuth(username, token string) *GitManager { return gm } +// CreateSyntheticHeadCommit creates an empty commit in an existing .git directory so that +// jgit-based tools (e.g. Gradle versioning plugins) can resolve HEAD without a real clone. +func CreateSyntheticHeadCommit(repoPath string) error { + repo, err := git.PlainOpen(repoPath) + if err != nil { + return fmt.Errorf("failed to open git repository at '%s': %s", repoPath, err.Error()) + } + w, err := repo.Worktree() + if err != nil { + return fmt.Errorf("failed to get worktree at '%s': %s", repoPath, err.Error()) + } + _, err = w.Commit("init", &git.CommitOptions{ + AllowEmptyCommits: true, + Author: &object.Signature{ + Name: "frogbot", + Email: "frogbot@jfrog.com", + When: time.Now(), + }, + }) + if err != nil { + return fmt.Errorf("failed to create synthetic HEAD commit at '%s': %s", repoPath, err.Error()) + } + return nil +} + func (gm *GitManager) SetRemoteGitUrl(remoteHttpsGitUrl string) (*GitManager, error) { // Check if the .git directory exists dotGitExists, err := fileutils.IsDirExists(git.GitDirName, false)