Commit 6e5cd8e0810c63e8744c23cdb887fea78ea37fb4
Exists in
master
and in
4 other branches
Merge pull request #1375 from tsigo/discover_default_branch
Default branch auto-discovery
Showing
8 changed files
with
118 additions
and
28 deletions
Show diff stats
app/controllers/application_controller.rb
| ... | ... | @@ -120,16 +120,6 @@ class ApplicationController < ActionController::Base |
| 120 | 120 | end |
| 121 | 121 | end |
| 122 | 122 | |
| 123 | - def load_refs | |
| 124 | - if params[:ref].blank? | |
| 125 | - @branch = params[:branch].blank? ? nil : params[:branch] | |
| 126 | - @tag = params[:tag].blank? ? nil : params[:tag] | |
| 127 | - @ref = @branch || @tag || @project.try(:default_branch) || Repository.default_ref | |
| 128 | - else | |
| 129 | - @ref = params[:ref] | |
| 130 | - end | |
| 131 | - end | |
| 132 | - | |
| 133 | 123 | def render_404 |
| 134 | 124 | render file: File.join(Rails.root, "public", "404"), layout: false, status: "404" |
| 135 | 125 | end | ... | ... |
app/controllers/commits_controller.rb
| ... | ... | @@ -59,7 +59,7 @@ class CommitsController < ApplicationController |
| 59 | 59 | |
| 60 | 60 | def patch |
| 61 | 61 | @commit = project.commit(params[:id]) |
| 62 | - | |
| 62 | + | |
| 63 | 63 | send_data( |
| 64 | 64 | @commit.to_patch, |
| 65 | 65 | type: "text/plain", |
| ... | ... | @@ -67,4 +67,16 @@ class CommitsController < ApplicationController |
| 67 | 67 | filename: (@commit.id.to_s + ".patch") |
| 68 | 68 | ) |
| 69 | 69 | end |
| 70 | + | |
| 71 | + protected | |
| 72 | + | |
| 73 | + def load_refs | |
| 74 | + if params[:ref].blank? | |
| 75 | + @branch = params[:branch].blank? ? nil : params[:branch] | |
| 76 | + @tag = params[:tag].blank? ? nil : params[:tag] | |
| 77 | + @ref = @branch || @tag || @project.try(:default_branch) || 'master' | |
| 78 | + else | |
| 79 | + @ref = params[:ref] | |
| 80 | + end | |
| 81 | + end | |
| 70 | 82 | end | ... | ... |
app/models/project.rb
| ... | ... | @@ -187,7 +187,7 @@ end |
| 187 | 187 | # private_flag :boolean(1) default(TRUE), not null |
| 188 | 188 | # code :string(255) |
| 189 | 189 | # owner_id :integer(4) |
| 190 | -# default_branch :string(255) default("master"), not null | |
| 190 | +# default_branch :string(255) | |
| 191 | 191 | # issues_enabled :boolean(1) default(TRUE), not null |
| 192 | 192 | # wall_enabled :boolean(1) default(TRUE), not null |
| 193 | 193 | # merge_requests_enabled :boolean(1) default(TRUE), not null | ... | ... |
app/roles/push_observer.rb
| 1 | +# Includes methods for handling Git Push events | |
| 2 | +# | |
| 3 | +# Triggered by PostReceive job | |
| 1 | 4 | module PushObserver |
| 2 | 5 | def observe_push(oldrev, newrev, ref, user) |
| 3 | 6 | data = post_receive_data(oldrev, newrev, ref, user) |
| ... | ... | @@ -84,11 +87,10 @@ module PushObserver |
| 84 | 87 | data |
| 85 | 88 | end |
| 86 | 89 | |
| 87 | - | |
| 88 | - # This method will be called after each post receive | |
| 89 | - # and only if user present in gitlab. | |
| 90 | - # All callbacks for post receive should be placed here | |
| 90 | + # This method will be called after each post receive and only if the provided | |
| 91 | + # user is present in GitLab. | |
| 91 | 92 | # |
| 93 | + # All callbacks for post receive should be placed here. | |
| 92 | 94 | def trigger_post_receive(oldrev, newrev, ref, user) |
| 93 | 95 | # Create push event |
| 94 | 96 | self.observe_push(oldrev, newrev, ref, user) |
| ... | ... | @@ -101,5 +103,11 @@ module PushObserver |
| 101 | 103 | |
| 102 | 104 | # Create satellite |
| 103 | 105 | self.satellite.create unless self.satellite.exists? |
| 106 | + | |
| 107 | + # Discover the default branch, but only if it hasn't already been set to | |
| 108 | + # something else | |
| 109 | + if default_branch.nil? | |
| 110 | + update_attributes(default_branch: discover_default_branch) | |
| 111 | + end | |
| 104 | 112 | end |
| 105 | 113 | end | ... | ... |
app/roles/repository.rb
| ... | ... | @@ -94,6 +94,24 @@ module Repository |
| 94 | 94 | end.sort_by(&:name) |
| 95 | 95 | end |
| 96 | 96 | |
| 97 | + # Discovers the default branch based on the repository's available branches | |
| 98 | + # | |
| 99 | + # - If no branches are present, returns nil | |
| 100 | + # - If one branch is present, returns its name | |
| 101 | + # - If two or more branches are present, returns the one that has a name | |
| 102 | + # matching root_ref (default_branch or 'master' if default_branch is nil) | |
| 103 | + def discover_default_branch | |
| 104 | + branches = heads.collect(&:name) | |
| 105 | + | |
| 106 | + if branches.length == 0 | |
| 107 | + nil | |
| 108 | + elsif branches.length == 1 | |
| 109 | + branches.first | |
| 110 | + else | |
| 111 | + branches.select { |v| v == root_ref }.first | |
| 112 | + end | |
| 113 | + end | |
| 114 | + | |
| 97 | 115 | def has_commits? |
| 98 | 116 | !!commit |
| 99 | 117 | end |
| ... | ... | @@ -102,7 +120,7 @@ module Repository |
| 102 | 120 | default_branch || "master" |
| 103 | 121 | end |
| 104 | 122 | |
| 105 | - def root_ref? branch | |
| 123 | + def root_ref?(branch) | |
| 106 | 124 | root_ref == branch |
| 107 | 125 | end |
| 108 | 126 | |
| ... | ... | @@ -111,7 +129,7 @@ module Repository |
| 111 | 129 | # Already packed repo archives stored at |
| 112 | 130 | # app_root/tmp/repositories/project_name/project_name-commit-id.tag.gz |
| 113 | 131 | # |
| 114 | - def archive_repo ref | |
| 132 | + def archive_repo(ref) | |
| 115 | 133 | ref = ref || self.root_ref |
| 116 | 134 | commit = self.commit(ref) |
| 117 | 135 | return nil unless commit |
| ... | ... | @@ -138,6 +156,6 @@ module Repository |
| 138 | 156 | end |
| 139 | 157 | |
| 140 | 158 | def http_url_to_repo |
| 141 | - http_url = [Gitlab.config.url, "/", path, ".git"].join() | |
| 159 | + http_url = [Gitlab.config.url, "/", path, ".git"].join('') | |
| 142 | 160 | end |
| 143 | 161 | end | ... | ... |
db/migrate/20120905043334_set_default_branch_default_to_nil.rb
0 → 100644
| ... | ... | @@ -0,0 +1,12 @@ |
| 1 | +class SetDefaultBranchDefaultToNil < ActiveRecord::Migration | |
| 2 | + def up | |
| 3 | + # Set the default_branch to allow nil, and default it to nil | |
| 4 | + change_column_null(:projects, :default_branch, true) | |
| 5 | + change_column_default(:projects, :default_branch, nil) | |
| 6 | + end | |
| 7 | + | |
| 8 | + def down | |
| 9 | + change_column_null(:projects, :default_branch, false) | |
| 10 | + change_column_default(:projects, :default_branch, 'master') | |
| 11 | + end | |
| 12 | +end | ... | ... |
db/schema.rb
| ... | ... | @@ -11,7 +11,7 @@ |
| 11 | 11 | # |
| 12 | 12 | # It's strongly recommended to check this file into your version control system. |
| 13 | 13 | |
| 14 | -ActiveRecord::Schema.define(:version => 20120729131232) do | |
| 14 | +ActiveRecord::Schema.define(:version => 20120905043334) do | |
| 15 | 15 | |
| 16 | 16 | create_table "events", :force => true do |t| |
| 17 | 17 | t.string "target_type" |
| ... | ... | @@ -98,16 +98,16 @@ ActiveRecord::Schema.define(:version => 20120729131232) do |
| 98 | 98 | t.string "name" |
| 99 | 99 | t.string "path" |
| 100 | 100 | t.text "description" |
| 101 | - t.datetime "created_at", :null => false | |
| 102 | - t.datetime "updated_at", :null => false | |
| 103 | - t.boolean "private_flag", :default => true, :null => false | |
| 101 | + t.datetime "created_at", :null => false | |
| 102 | + t.datetime "updated_at", :null => false | |
| 103 | + t.boolean "private_flag", :default => true, :null => false | |
| 104 | 104 | t.string "code" |
| 105 | 105 | t.integer "owner_id" |
| 106 | - t.string "default_branch", :default => "master", :null => false | |
| 107 | - t.boolean "issues_enabled", :default => true, :null => false | |
| 108 | - t.boolean "wall_enabled", :default => true, :null => false | |
| 109 | - t.boolean "merge_requests_enabled", :default => true, :null => false | |
| 110 | - t.boolean "wiki_enabled", :default => true, :null => false | |
| 106 | + t.string "default_branch" | |
| 107 | + t.boolean "issues_enabled", :default => true, :null => false | |
| 108 | + t.boolean "wall_enabled", :default => true, :null => false | |
| 109 | + t.boolean "merge_requests_enabled", :default => true, :null => false | |
| 110 | + t.boolean "wiki_enabled", :default => true, :null => false | |
| 111 | 111 | end |
| 112 | 112 | |
| 113 | 113 | create_table "protected_branches", :force => true do |t| | ... | ... |
spec/roles/repository_spec.rb
| ... | ... | @@ -19,4 +19,54 @@ describe Project, "Repository" do |
| 19 | 19 | project.should_not be_empty_repo |
| 20 | 20 | end |
| 21 | 21 | end |
| 22 | + | |
| 23 | + describe "#discover_default_branch" do | |
| 24 | + let(:master) { double(name: 'master') } | |
| 25 | + let(:stable) { double(name: 'stable') } | |
| 26 | + | |
| 27 | + it "returns 'master' when master exists" do | |
| 28 | + project.should_receive(:heads).and_return([stable, master]) | |
| 29 | + project.discover_default_branch.should == 'master' | |
| 30 | + end | |
| 31 | + | |
| 32 | + it "returns non-master when master exists but default branch is set to something else" do | |
| 33 | + project.default_branch = 'stable' | |
| 34 | + project.should_receive(:heads).and_return([stable, master]) | |
| 35 | + project.discover_default_branch.should == 'stable' | |
| 36 | + end | |
| 37 | + | |
| 38 | + it "returns a non-master branch when only one exists" do | |
| 39 | + project.should_receive(:heads).and_return([stable]) | |
| 40 | + project.discover_default_branch.should == 'stable' | |
| 41 | + end | |
| 42 | + | |
| 43 | + it "returns nil when no branch exists" do | |
| 44 | + project.should_receive(:heads).and_return([]) | |
| 45 | + project.discover_default_branch.should be_nil | |
| 46 | + end | |
| 47 | + end | |
| 48 | + | |
| 49 | + describe "#root_ref" do | |
| 50 | + it "returns default_branch when set" do | |
| 51 | + project.default_branch = 'stable' | |
| 52 | + project.root_ref.should == 'stable' | |
| 53 | + end | |
| 54 | + | |
| 55 | + it "returns 'master' when default_branch is nil" do | |
| 56 | + project.default_branch = nil | |
| 57 | + project.root_ref.should == 'master' | |
| 58 | + end | |
| 59 | + end | |
| 60 | + | |
| 61 | + describe "#root_ref?" do | |
| 62 | + it "returns true when branch is root_ref" do | |
| 63 | + project.default_branch = 'stable' | |
| 64 | + project.root_ref?('stable').should be_true | |
| 65 | + end | |
| 66 | + | |
| 67 | + it "returns false when branch is not root_ref" do | |
| 68 | + project.default_branch = nil | |
| 69 | + project.root_ref?('stable').should be_false | |
| 70 | + end | |
| 71 | + end | |
| 22 | 72 | end | ... | ... |