diff --git a/lib/docker_manager/git_repo.rb b/lib/docker_manager/git_repo.rb index 5581158..4d8b306 100644 --- a/lib/docker_manager/git_repo.rb +++ b/lib/docker_manager/git_repo.rb @@ -112,12 +112,29 @@ class DockerManager::GitRepo Time.at(unix_timestamp).to_datetime end + def upstream_branch + run("for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)") + end + + def has_origin_main? + run("branch -r").include?("origin/main") rescue false + end + def tracking_branch branch = nil if defined?(Discourse.find_compatible_git_resource) branch = Discourse.find_compatible_git_resource(path) end - branch || run("for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)") + return branch if branch.present? + + head = upstream_branch + + # We prefer `origin/main` to `origin/master` + if head == "origin/master" + return "origin/main" if has_origin_main? + end + + head end def run(cmd) diff --git a/spec/lib/git_repo_spec.rb b/spec/lib/git_repo_spec.rb index 466d040..172901e 100644 --- a/spec/lib/git_repo_spec.rb +++ b/spec/lib/git_repo_spec.rb @@ -22,4 +22,28 @@ RSpec.describe DockerManager::GitRepo do end end + describe "#branch" do + + it "returns origin/master if a repo hasn't been renamed" do + described_class.any_instance.stubs(:upstream_branch).returns("origin/master") + described_class.any_instance.stubs(:has_origin_main?).returns(false) + repo = described_class.new("dummy", "dummy") + expect(repo.branch).to eq("origin/master") + end + + it "returns origin/main if a repo has been renamed but still tracks master" do + described_class.any_instance.stubs(:upstream_branch).returns("origin/master") + described_class.any_instance.stubs(:has_origin_main?).returns(true) + repo = described_class.new("dummy", "dummy") + expect(repo.branch).to eq("origin/main") + end + + it "returns origin/main if a repo points at origin/main" do + described_class.any_instance.stubs(:upstream_branch).returns("origin/main") + described_class.any_instance.stubs(:has_origin_main?).returns(true) + repo = described_class.new("dummy", "dummy") + expect(repo.branch).to eq("origin/main") + end + + end end