From 46792bdfb9fe8bfbcaa36042d05b50ab617b810e Mon Sep 17 00:00:00 2001 From: Aaron Hill Date: Mon, 30 Dec 2013 08:18:00 -0500 Subject: [PATCH] Only denormalize a build if it's the most recent --- lib/travis/model/build.rb | 4 + lib/travis/model/build/denormalize.rb | 2 +- lib/travis/model/repository.rb | 4 + spec/travis/model/build/denormalize_spec.rb | 98 +++++++++++++-------- spec/travis/model/build_spec.rb | 18 ++++ spec/travis/model/repository_spec.rb | 12 +++ 6 files changed, 102 insertions(+), 36 deletions(-) diff --git a/lib/travis/model/build.rb b/lib/travis/model/build.rb index 53f052a3c..4c6171bfa 100644 --- a/lib/travis/model/build.rb +++ b/lib/travis/model/build.rb @@ -194,6 +194,10 @@ def pull_request? event_type == 'pull_request' end + def last_build_on_default_branch? + repository.last_build_on_default_branch == self + end + # COMPAT: used in http api v1, deprecate as soon as v1 gets retired def result state.try(:to_sym) == :passed ? 0 : 1 diff --git a/lib/travis/model/build/denormalize.rb b/lib/travis/model/build/denormalize.rb index d01a51275..8c953050f 100644 --- a/lib/travis/model/build/denormalize.rb +++ b/lib/travis/model/build/denormalize.rb @@ -22,7 +22,7 @@ def denormalize(event, *args) } def denormalize?(event) - DENORMALIZE.key?(event) + DENORMALIZE.key?(event) && last_build_on_default_branch? end def denormalize_attributes_for(event) diff --git a/lib/travis/model/repository.rb b/lib/travis/model/repository.rb index 0245afb27..91b86019d 100644 --- a/lib/travis/model/repository.rb +++ b/lib/travis/model/repository.rb @@ -132,6 +132,10 @@ def last_build_on(branch) builds.pushes.last_build_on(branch: branch) end + def last_build_on_default_branch + builds.pushes.last_build_on(branch: default_branch) + end + def build_status(branch) builds.pushes.last_state_on(state: [:passed, :failed, :errored], branch: branch) end diff --git a/spec/travis/model/build/denormalize_spec.rb b/spec/travis/model/build/denormalize_spec.rb index f77983c00..abf654408 100644 --- a/spec/travis/model/build/denormalize_spec.rb +++ b/spec/travis/model/build/denormalize_spec.rb @@ -6,54 +6,82 @@ let(:build) { Factory(:build, state: :started, duration: 30) } describe 'on build:started' do - before :each do - build.denormalize(:start) - build.reload - end + describe 'if the build is the most recent' do + before :each do + build.stubs(:last_build_on_default_branch?).returns(true) + build.denormalize(:start) + build.reload + end - it 'denormalizes last_build_id to its repository' do - build.repository.last_build_id.should == build.id - end + it 'denormalizes last_build_id to its repository' do + build.repository.last_build_id.should == build.id + end - it 'denormalizes last_build_state to its repository' do - build.repository.last_build_state.should == 'started' - end + it 'denormalizes last_build_state to its repository' do + build.repository.last_build_state.should == 'started' + end - it 'denormalizes last_build_number to its repository' do - build.repository.last_build_number.should == build.number - end + it 'denormalizes last_build_number to its repository' do + build.repository.last_build_number.should == build.number + end - it 'denormalizes last_build_duration to its repository' do - build.repository.last_build_duration.should == build.duration - end + it 'denormalizes last_build_duration to its repository' do + build.repository.last_build_duration.should == build.duration + end - it 'denormalizes last_build_started_at to its repository' do - build.repository.last_build_started_at.should == build.started_at - end + it 'denormalizes last_build_started_at to its repository' do + build.repository.last_build_started_at.should == build.started_at + end - it 'denormalizes last_build_finished_at to its repository' do - build.repository.last_build_finished_at.should == build.finished_at + it 'denormalizes last_build_finished_at to its repository' do + build.repository.last_build_finished_at.should == build.finished_at + end + end + describe 'if the build is not the most recent' do + before :each do + build.stubs(:most_recent_buid?).returns(true) + build.denormalize(:start) + build.reload + end + it 'does not denormalize' do + build.repository.expects(:update_attributes!).never + build.expects(:denormalize_attributes_for).never + end end end describe 'on build:finished' do - before :each do - build.update_attributes(state: :errored) - build.denormalize(:finish) - build.reload - end + describe 'if the build is the most recent' do + before :each do + build.stubs(:last_build_on_default_branch?).returns(:true) + build.update_attributes(state: :errored) + build.denormalize(:finish) + build.reload + end - it 'denormalizes last_build_state to its repository' do - build.repository.last_build_state.should == 'errored' - end + it 'denormalizes last_build_state to its repository' do + build.repository.last_build_state.should == 'errored' + end - it 'denormalizes last_build_duration to its repository' do - build.repository.last_build_duration.should == build.duration - end + it 'denormalizes last_build_duration to its repository' do + build.repository.last_build_duration.should == build.duration + end - it 'denormalizes last_build_finished_at to its repository' do - build.repository.last_build_finished_at.should == build.finished_at + it 'denormalizes last_build_finished_at to its repository' do + build.repository.last_build_finished_at.should == build.finished_at + end + end + describe 'if the build is not the most recent' do + before :each do + build.stubs(:last_build_on_default_branch?).returns(false) + build.update_attributes(state: :errored) + build.denormalize(:finish) + build.reload + end + it 'does not denormalize' do + build.repository.expects(:update_attributes!).never + build.expects(:denormalize_attributes_for).never + end end end end - diff --git a/spec/travis/model/build_spec.rb b/spec/travis/model/build_spec.rb index 865df0cc5..da6d10795 100644 --- a/spec/travis/model/build_spec.rb +++ b/spec/travis/model/build_spec.rb @@ -77,6 +77,24 @@ end end + describe 'last_build_on_default_branch?' do + it 'returns the most recently created build on the default branch' do + build1 = Factory(:build, state: 'passed', started_at: 3.minutes.ago, finished_at: 2.minutes.ago) + build2 = Factory(:build, state: 'failed', started_at: 10.minutes.ago, finished_at: 9.minutes.ago) + + build1.last_build_on_default_branch?.should be_false + build2.last_build_on_default_branch?.should be_true + end + + it 'ignores builds not on the default branch' do + build1 = Factory(:build, state: 'failed') + build2 = Factory(:build, state: 'passed', commit: Factory(:commit, branch: 'blah')) + + build1.last_build_on_default_branch?.should be_true + build2.last_build_on_default_branch?.should be_false + end + end + describe 'on_branch' do it 'returns builds that are on any of the given branches' do Factory(:build, commit: Factory(:commit, branch: 'master')) diff --git a/spec/travis/model/repository_spec.rb b/spec/travis/model/repository_spec.rb index b9123c43d..3f26961af 100644 --- a/spec/travis/model/repository_spec.rb +++ b/spec/travis/model/repository_spec.rb @@ -154,6 +154,18 @@ end end + describe 'last_build_on_default_branch' do + let(:repo) { Factory(:repository) } + + it 'returns the last created build for the repostiory on the default branch' do + build1 = Factory(:build, repository: repo, commit: Factory(:commit, branch: 'blah')) + build2 = Factory(:build, repository: repo) + build3 = Factory(:build, repository: repo, started_at: 20.minutes.ago, finished_at: 11.minutes.ago) + + repo.last_build_on_default_branch.should == build3 + end + end + describe 'api_url' do let(:repo) { Repository.new(owner_name: 'travis-ci', name: 'travis-ci') }