From 952a769c69839fe90761515f0814f58c825fba7a Mon Sep 17 00:00:00 2001 From: Jeremy Walker Date: Fri, 13 Feb 2026 12:48:42 +0000 Subject: [PATCH] Guard against blank/short OIDs in Git::Repository#lookup_commit Raise MissingCommitError immediately for blank SHAs instead of attempting a pointless fetch. Include the SHA value in all MissingCommitError messages for easier debugging. Add track context (slug and synced_to_git_sha) to Sentry reports in UpdateTracksBuildStatusJob. Closes #8626 Co-Authored-By: Claude Opus 4.6 --- app/jobs/update_tracks_build_status_job.rb | 2 +- app/models/git/repository.rb | 4 +++- test/models/git/repository_test.rb | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/jobs/update_tracks_build_status_job.rb b/app/jobs/update_tracks_build_status_job.rb index 6fccbc8177..eca6ea9b6c 100644 --- a/app/jobs/update_tracks_build_status_job.rb +++ b/app/jobs/update_tracks_build_status_job.rb @@ -7,7 +7,7 @@ def perform tracks.find_each do |track| Track::UpdateBuildStatus.(track) rescue StandardError => e - Sentry.capture_exception(e) + Sentry.capture_exception(e, extra: { track_slug: track.slug, synced_to_git_sha: track.synced_to_git_sha }) end end diff --git a/app/models/git/repository.rb b/app/models/git/repository.rb index 504bc4fead..b30f6827bc 100644 --- a/app/models/git/repository.rb +++ b/app/models/git/repository.rb @@ -57,11 +57,13 @@ def read_blob(oid, default = nil) def lookup_commit(sha, update_on_failure: true) return head_commit if sha == "HEAD" + raise MissingCommitError, sha if sha.blank? + lookup(sha).tap do |object| raise 'wrong-type' if object.type != :commit end rescue Rugged::OdbError, Rugged::InvalidError - raise MissingCommitError unless update_on_failure + raise MissingCommitError, sha unless update_on_failure fetch! lookup_commit(sha, update_on_failure: false) diff --git a/test/models/git/repository_test.rb b/test/models/git/repository_test.rb index 28368524e5..f22709b2a4 100644 --- a/test/models/git/repository_test.rb +++ b/test/models/git/repository_test.rb @@ -14,6 +14,22 @@ class RepositoryTest < ActiveSupport::TestCase end end + test "lookup_commit_for_blank_sha_raises_without_fetch" do + repository = ::Git::Repository.new(repo_url: TestHelpers.git_repo_url("track")) + repository.expects(:fetch!).never + assert_raises Git::MissingCommitError do + repository.lookup_commit("") + end + end + + test "lookup_commit_for_nil_sha_raises_without_fetch" do + repository = ::Git::Repository.new(repo_url: TestHelpers.git_repo_url("track")) + repository.expects(:fetch!).never + assert_raises Git::MissingCommitError do + repository.lookup_commit(nil) + end + end + test "lookup_commit_for_head" do repository = ::Git::Repository.new(repo_url: TestHelpers.git_repo_url("track")) assert_equal repository.head_commit, repository.lookup_commit("HEAD")