Commit 28e13634dc9318dbd093a4561ee8ea16e1d71460

Authored by Dmitriy Zaporozhets
2 parents 68590fdd 573f1f4a

Merge branch 'improve/mr_diff'

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>

Conflicts:
	features/steps/project/project_fork.rb
	features/steps/project/project_forked_merge_requests.rb
	features/steps/project/project_issue_tracker.rb
	features/steps/project/project_markdown_render.rb
	features/steps/shared/project.rb
Showing 61 changed files with 492 additions and 386 deletions   Show diff stats
app/assets/stylesheets/sections/merge_requests.scss
@@ -89,16 +89,3 @@ @@ -89,16 +89,3 @@
89 .merge-request-form-info { 89 .merge-request-form-info {
90 padding-top: 15px; 90 padding-top: 15px;
91 } 91 }
92 -  
93 -.merge-request-branches {  
94 - .commit-row-message {  
95 - font-weight: normal !important;  
96 - }  
97 -  
98 - .select2-container .select2-single {  
99 - span {  
100 - font-weight: bold;  
101 - color: #555;  
102 - }  
103 - }  
104 -}  
app/controllers/projects/merge_requests_controller.rb
@@ -76,7 +76,6 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController @@ -76,7 +76,6 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
76 @merge_request.author = current_user 76 @merge_request.author = current_user
77 @target_branches ||= [] 77 @target_branches ||= []
78 if @merge_request.save 78 if @merge_request.save
79 - @merge_request.reload_code  
80 redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' 79 redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
81 else 80 else
82 @source_project = @merge_request.source_project 81 @source_project = @merge_request.source_project
@@ -217,6 +216,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController @@ -217,6 +216,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
217 # or from cache if already merged 216 # or from cache if already merged
218 @commits = @merge_request.commits 217 @commits = @merge_request.commits
219 218
  219 + @merge_request_diff = @merge_request.merge_request_diff
220 @allowed_to_merge = allowed_to_merge? 220 @allowed_to_merge = allowed_to_merge?
221 @show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge 221 @show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge
222 end 222 end
app/models/merge_request.rb
@@ -31,6 +31,11 @@ class MergeRequest &lt; ActiveRecord::Base @@ -31,6 +31,11 @@ class MergeRequest &lt; ActiveRecord::Base
31 belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" 31 belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project"
32 belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" 32 belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project"
33 33
  34 + has_one :merge_request_diff, dependent: :destroy
  35 + after_create :create_merge_request_diff
  36 +
  37 + delegate :commits, :diffs, :last_commit, :last_commit_short_sha, to: :merge_request_diff, prefix: nil
  38 +
34 attr_accessible :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :author_id_of_changes, :state_event, :description 39 attr_accessible :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :author_id_of_changes, :state_event, :description
35 40
36 attr_accessor :should_remove_source_branch 41 attr_accessor :should_remove_source_branch
@@ -53,11 +58,8 @@ class MergeRequest &lt; ActiveRecord::Base @@ -53,11 +58,8 @@ class MergeRequest &lt; ActiveRecord::Base
53 end 58 end
54 59
55 state :opened 60 state :opened
56 -  
57 state :reopened 61 state :reopened
58 -  
59 state :closed 62 state :closed
60 -  
61 state :merged 63 state :merged
62 end 64 end
63 65
@@ -75,15 +77,10 @@ class MergeRequest &lt; ActiveRecord::Base @@ -75,15 +77,10 @@ class MergeRequest &lt; ActiveRecord::Base
75 end 77 end
76 78
77 state :unchecked 79 state :unchecked
78 -  
79 state :can_be_merged 80 state :can_be_merged
80 -  
81 state :cannot_be_merged 81 state :cannot_be_merged
82 end 82 end
83 83
84 - serialize :st_commits  
85 - serialize :st_diffs  
86 -  
87 validates :source_project, presence: true, unless: :allow_broken 84 validates :source_project, presence: true, unless: :allow_broken
88 validates :source_branch, presence: true 85 validates :source_branch, presence: true
89 validates :target_project, presence: true 86 validates :target_project, presence: true
@@ -105,7 +102,7 @@ class MergeRequest &lt; ActiveRecord::Base @@ -105,7 +102,7 @@ class MergeRequest &lt; ActiveRecord::Base
105 scope :closed, -> { with_states(:closed, :merged) } 102 scope :closed, -> { with_states(:closed, :merged) }
106 103
107 def validate_branches 104 def validate_branches
108 - if target_project==source_project && target_branch == source_branch 105 + if target_project == source_project && target_branch == source_branch
109 errors.add :branch_conflict, "You can not use same project/branch for source and target" 106 errors.add :branch_conflict, "You can not use same project/branch for source and target"
110 end 107 end
111 108
@@ -120,8 +117,7 @@ class MergeRequest &lt; ActiveRecord::Base @@ -120,8 +117,7 @@ class MergeRequest &lt; ActiveRecord::Base
120 end 117 end
121 118
122 def reload_code 119 def reload_code
123 - self.reloaded_commits  
124 - self.reloaded_diffs 120 + merge_request_diff.reload_content if opened?
125 end 121 end
126 122
127 def check_if_can_be_merged 123 def check_if_can_be_merged
@@ -132,42 +128,6 @@ class MergeRequest &lt; ActiveRecord::Base @@ -132,42 +128,6 @@ class MergeRequest &lt; ActiveRecord::Base
132 end 128 end
133 end 129 end
134 130
135 - def diffs  
136 - @diffs ||= (load_diffs(st_diffs) || [])  
137 - end  
138 -  
139 - def reloaded_diffs  
140 - if opened? && unmerged_diffs.any?  
141 - self.st_diffs = dump_diffs(unmerged_diffs)  
142 - self.save  
143 - end  
144 - end  
145 -  
146 - def broken_diffs?  
147 - diffs == broken_diffs  
148 - rescue  
149 - true  
150 - end  
151 -  
152 - def valid_diffs?  
153 - !broken_diffs?  
154 - end  
155 -  
156 - def unmerged_diffs  
157 - diffs = if for_fork?  
158 - Gitlab::Satellite::MergeAction.new(author, self).diffs_between_satellite  
159 - else  
160 - Gitlab::Git::Diff.between(target_project.repository, source_branch, target_branch)  
161 - end  
162 -  
163 - diffs ||= []  
164 - diffs  
165 - end  
166 -  
167 - def last_commit  
168 - commits.first  
169 - end  
170 -  
171 def merge_event 131 def merge_event
172 self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last 132 self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
173 end 133 end
@@ -176,46 +136,13 @@ class MergeRequest &lt; ActiveRecord::Base @@ -176,46 +136,13 @@ class MergeRequest &lt; ActiveRecord::Base
176 self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last 136 self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
177 end 137 end
178 138
179 - def commits  
180 - load_commits(st_commits || [])  
181 - end  
182 -  
183 - def probably_merged?  
184 - unmerged_commits.empty? &&  
185 - commits.any? && opened?  
186 - end  
187 -  
188 - def reloaded_commits  
189 - if opened? && unmerged_commits.any?  
190 - self.st_commits = dump_commits(unmerged_commits)  
191 - save  
192 -  
193 - end  
194 - commits  
195 - end  
196 -  
197 - def unmerged_commits  
198 - if for_fork?  
199 - commits = Gitlab::Satellite::MergeAction.new(self.author, self).commits_between  
200 - else  
201 - commits = target_project.repository.commits_between(self.target_branch, self.source_branch)  
202 - end  
203 -  
204 - if commits.present?  
205 - commits = Commit.decorate(commits).  
206 - sort_by(&:created_at).  
207 - reverse  
208 - end  
209 - commits  
210 - end  
211 -  
212 def merge!(user_id) 139 def merge!(user_id)
213 self.author_id_of_changes = user_id 140 self.author_id_of_changes = user_id
214 self.merge 141 self.merge
215 end 142 end
216 143
217 def automerge!(current_user, commit_message = nil) 144 def automerge!(current_user, commit_message = nil)
218 - if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message) && self.unmerged_commits.empty? 145 + if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message)
219 self.merge!(current_user.id) 146 self.merge!(current_user.id)
220 true 147 true
221 end 148 end
@@ -225,7 +152,10 @@ class MergeRequest &lt; ActiveRecord::Base @@ -225,7 +152,10 @@ class MergeRequest &lt; ActiveRecord::Base
225 end 152 end
226 153
227 def mr_and_commit_notes 154 def mr_and_commit_notes
228 - commit_ids = commits.map(&:id) 155 + # Fetch comments only from last 100 commits
  156 + commits_for_notes_limit = 100
  157 + commit_ids = commits.last(commits_for_notes_limit).map(&:id)
  158 +
229 project.notes.where( 159 project.notes.where(
230 "(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))", 160 "(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))",
231 mr_id: id, 161 mr_id: id,
@@ -247,10 +177,6 @@ class MergeRequest &lt; ActiveRecord::Base @@ -247,10 +177,6 @@ class MergeRequest &lt; ActiveRecord::Base
247 Gitlab::Satellite::MergeAction.new(current_user, self).format_patch 177 Gitlab::Satellite::MergeAction.new(current_user, self).format_patch
248 end 178 end
249 179
250 - def last_commit_short_sha  
251 - @last_commit_short_sha ||= last_commit.sha[0..10]  
252 - end  
253 -  
254 def for_fork? 180 def for_fork?
255 target_project != source_project 181 target_project != source_project
256 end 182 end
@@ -327,34 +253,4 @@ class MergeRequest &lt; ActiveRecord::Base @@ -327,34 +253,4 @@ class MergeRequest &lt; ActiveRecord::Base
327 message << description.to_s 253 message << description.to_s
328 message 254 message
329 end 255 end
330 -  
331 - private  
332 -  
333 - def dump_commits(commits)  
334 - commits.map(&:to_hash)  
335 - end  
336 -  
337 - def load_commits(array)  
338 - array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) }  
339 - end  
340 -  
341 - def dump_diffs(diffs)  
342 - if diffs == broken_diffs  
343 - broken_diffs  
344 - elsif diffs.respond_to?(:map)  
345 - diffs.map(&:to_hash)  
346 - end  
347 - end  
348 -  
349 - def load_diffs(raw)  
350 - if raw == broken_diffs  
351 - broken_diffs  
352 - elsif raw.respond_to?(:map)  
353 - raw.map { |hash| Gitlab::Git::Diff.new(hash) }  
354 - end  
355 - end  
356 -  
357 - def broken_diffs  
358 - [Gitlab::Git::Diff::BROKEN_DIFF]  
359 - end  
360 end 256 end
app/models/merge_request_diff.rb 0 → 100644
@@ -0,0 +1,163 @@ @@ -0,0 +1,163 @@
  1 +require Rails.root.join("app/models/commit")
  2 +
  3 +class MergeRequestDiff < ActiveRecord::Base
  4 + # Prevent store of diff
  5 + # if commits amount more then 200
  6 + COMMITS_SAFE_SIZE = 200
  7 +
  8 + attr_reader :commits, :diffs
  9 +
  10 + belongs_to :merge_request
  11 +
  12 + attr_accessible :state, :st_commits, :st_diffs
  13 +
  14 + delegate :target_branch, :source_branch, to: :merge_request, prefix: nil
  15 +
  16 + state_machine :state, initial: :empty do
  17 + state :collected
  18 + state :timeout
  19 + state :overflow_commits_safe_size
  20 + state :overflow_diff_files_limit
  21 + state :overflow_diff_lines_limit
  22 + end
  23 +
  24 + serialize :st_commits
  25 + serialize :st_diffs
  26 +
  27 + after_create :reload_content
  28 +
  29 + def reload_content
  30 + reload_commits
  31 + reload_diffs
  32 + end
  33 +
  34 + def diffs
  35 + @diffs ||= (load_diffs(st_diffs) || [])
  36 + end
  37 +
  38 + def commits
  39 + @commits ||= load_commits(st_commits || [])
  40 + end
  41 +
  42 + def last_commit
  43 + commits.first
  44 + end
  45 +
  46 + def last_commit_short_sha
  47 + @last_commit_short_sha ||= last_commit.sha[0..10]
  48 + end
  49 +
  50 + private
  51 +
  52 + def dump_commits(commits)
  53 + commits.map(&:to_hash)
  54 + end
  55 +
  56 + def load_commits(array)
  57 + array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) }
  58 + end
  59 +
  60 + def dump_diffs(diffs)
  61 + if diffs.respond_to?(:map)
  62 + diffs.map(&:to_hash)
  63 + end
  64 + end
  65 +
  66 + def load_diffs(raw)
  67 + if raw.respond_to?(:map)
  68 + raw.map { |hash| Gitlab::Git::Diff.new(hash) }
  69 + end
  70 + end
  71 +
  72 + # When Git::Diff is not able to get diff
  73 + # because of git timeout it return this value
  74 + def broken_diffs
  75 + [Gitlab::Git::Diff::BROKEN_DIFF]
  76 + end
  77 +
  78 + # Collect array of Git::Commit objects
  79 + # between target and source branches
  80 + def unmerged_commits
  81 + commits = if merge_request.for_fork?
  82 + Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between
  83 + else
  84 + repository.commits_between(target_branch, source_branch)
  85 + end
  86 +
  87 + if commits.present?
  88 + commits = Commit.decorate(commits).
  89 + sort_by(&:created_at).
  90 + reverse
  91 + end
  92 +
  93 + commits
  94 + end
  95 +
  96 + # Reload all commits related to current merge request from repo
  97 + # and save it as array of hashes in st_commits db field
  98 + def reload_commits
  99 + commit_objects = unmerged_commits
  100 +
  101 + if commit_objects.present?
  102 + self.st_commits = dump_commits(commit_objects)
  103 + end
  104 +
  105 + save
  106 + end
  107 +
  108 + # Reload diffs between branches related to current merge request from repo
  109 + # and save it as array of hashes in st_diffs db field
  110 + def reload_diffs
  111 + new_diffs = []
  112 +
  113 + if commits.size.zero?
  114 + self.state = :empty
  115 + elsif commits.size > COMMITS_SAFE_SIZE
  116 + self.state = :overflow_commits_safe_size
  117 + else
  118 + new_diffs = unmerged_diffs
  119 + end
  120 +
  121 + if new_diffs.any?
  122 + if new_diffs.size > Commit::DIFF_HARD_LIMIT_FILES
  123 + self.state = :overflow_diff_files_limit
  124 + new_diffs = []
  125 + end
  126 +
  127 + if new_diffs.sum { |diff| diff.diff.lines.count } > Commit::DIFF_HARD_LIMIT_LINES
  128 + self.state = :overflow_diff_lines_limit
  129 + new_diffs = []
  130 + end
  131 + end
  132 +
  133 + if new_diffs.present?
  134 + new_diffs = dump_commits(new_diffs)
  135 + self.state = :collected
  136 + end
  137 +
  138 + self.st_diffs = new_diffs
  139 + self.save
  140 + end
  141 +
  142 + # Collect array of Git::Diff objects
  143 + # between target and source branches
  144 + def unmerged_diffs
  145 + diffs = if merge_request.for_fork?
  146 + Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
  147 + else
  148 + Gitlab::Git::Diff.between(repository, source_branch, target_branch)
  149 + end
  150 +
  151 + if diffs == broken_diffs
  152 + self.state = :timeout
  153 + diffs = []
  154 + end
  155 +
  156 + diffs ||= []
  157 + diffs
  158 + end
  159 +
  160 + def repository
  161 + merge_request.target_project.repository
  162 + end
  163 +end
app/views/projects/commits/_inline_commit.html.haml
@@ -2,5 +2,7 @@ @@ -2,5 +2,7 @@
2 .commit-row-title 2 .commit-row-title
3 = link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id" 3 = link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id"
4 &nbsp; 4 &nbsp;
5 - = link_to_gfm truncate(commit.title, length: 40), project_commit_path(project, commit.id), class: "commit-row-message"  
6 - #{time_ago_with_tooltip(commit.committed_date)} &nbsp; 5 + %span.str-truncated
  6 + = link_to_gfm commit.title, project_commit_path(project, commit.id), class: "commit-row-message"
  7 + .pull-right
  8 + #{time_ago_with_tooltip(commit.committed_date)}
app/views/projects/merge_requests/show/_commits.html.haml
@@ -12,9 +12,16 @@ @@ -12,9 +12,16 @@
12 8 of #{@commits.count} commits displayed. 12 8 of #{@commits.count} commits displayed.
13 %strong 13 %strong
14 %a.show-all-commits Click here to show all 14 %a.show-all-commits Click here to show all
15 - %ul.all-commits.hide.well-list  
16 - - @commits.each do |commit|  
17 - = render "projects/commits/commit", commit: commit, project: @merge_request.source_project 15 + - if @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE
  16 + %ul.all-commits.hide.well-list
  17 + - @commits.first(MergeRequestDiff::COMMITS_SAFE_SIZE).each do |commit|
  18 + = render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project
  19 + %li
  20 + other #{@commits.size - MergeRequestDiff::COMMITS_SAFE_SIZE} commits hidden top prevent performance issues.
  21 + - else
  22 + %ul.all-commits.hide.well-list
  23 + - @commits.each do |commit|
  24 + = render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project
18 25
19 - else 26 - else
20 %ul.well-list 27 %ul.well-list
app/views/projects/merge_requests/show/_diffs.html.haml
1 -- if @merge_request.valid_diffs? 1 +- if @merge_request_diff.collected?
2 = render "projects/commits/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project 2 = render "projects/commits/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project
3 -- elsif @merge_request.broken_diffs? 3 +- elsif @merge_request_diff.empty?
  4 + %h4.nothing_here_message Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch}
  5 +- else
4 %h4.nothing_here_message 6 %h4.nothing_here_message
5 Can't load diff. 7 Can't load diff.
6 You can 8 You can
7 = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink" 9 = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
8 instead. 10 instead.
9 -- else  
10 - %h4.nothing_here_message Nothing to merge  
db/migrate/20140122112253_create_merge_request_diffs.rb 0 → 100644
@@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
  1 +class CreateMergeRequestDiffs < ActiveRecord::Migration
  2 + def change
  3 + create_table :merge_request_diffs do |t|
  4 + t.string :state, null: false, default: 'collected'
  5 + t.text :st_commits, null: true, limit: 2147483647
  6 + t.text :st_diffs, null: true, limit: 2147483647
  7 + t.integer :merge_request_id, null: false
  8 +
  9 + t.timestamps
  10 + end
  11 + end
  12 +end
db/migrate/20140122114406_migrate_mr_diffs.rb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +class MigrateMrDiffs < ActiveRecord::Migration
  2 + def self.up
  3 + execute "INSERT INTO merge_request_diffs ( merge_request_id ) SELECT id FROM merge_requests"
  4 + execute "UPDATE merge_requests mr, merge_request_diffs md SET md.st_commits = mr.st_commits WHERE md.merge_request_id = mr.id"
  5 + execute "UPDATE merge_requests mr, merge_request_diffs md SET md.st_diffs = mr.st_diffs WHERE md.merge_request_id = mr.id"
  6 + end
  7 +
  8 + def self.down
  9 + MergeRequestDiff.delete_all
  10 + end
  11 +end
db/migrate/20140122122549_remove_m_rdiff_fields.rb 0 → 100644
@@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
  1 +class RemoveMRdiffFields < ActiveRecord::Migration
  2 + def up
  3 + remove_column :merge_requests, :st_commits
  4 + remove_column :merge_requests, :st_diffs
  5 + end
  6 +
  7 + def down
  8 + add_column :merge_requests, :st_commits, :text, null: true, limit: 2147483647
  9 + add_column :merge_requests, :st_diffs, :text, null: true, limit: 2147483647
  10 + execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_commits = md.st_commits WHERE md.merge_request_id = mr.id"
  11 + execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_diffs = md.st_diffs WHERE md.merge_request_id = mr.id"
  12 + end
  13 +end
@@ -11,7 +11,7 @@ @@ -11,7 +11,7 @@
11 # 11 #
12 # It's strongly recommended that you check this file into your version control system. 12 # It's strongly recommended that you check this file into your version control system.
13 13
14 -ActiveRecord::Schema.define(version: 20140116231608) do 14 +ActiveRecord::Schema.define(version: 20140122122549) do
15 15
16 create_table "broadcast_messages", force: true do |t| 16 create_table "broadcast_messages", force: true do |t|
17 t.text "message", null: false 17 t.text "message", null: false
@@ -66,8 +66,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -66,8 +66,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
66 t.integer "assignee_id" 66 t.integer "assignee_id"
67 t.integer "author_id" 67 t.integer "author_id"
68 t.integer "project_id" 68 t.integer "project_id"
69 - t.datetime "created_at", null: false  
70 - t.datetime "updated_at", null: false 69 + t.datetime "created_at"
  70 + t.datetime "updated_at"
71 t.integer "position", default: 0 71 t.integer "position", default: 0
72 t.string "branch_name" 72 t.string "branch_name"
73 t.text "description" 73 t.text "description"
@@ -85,8 +85,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -85,8 +85,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
85 85
86 create_table "keys", force: true do |t| 86 create_table "keys", force: true do |t|
87 t.integer "user_id" 87 t.integer "user_id"
88 - t.datetime "created_at", null: false  
89 - t.datetime "updated_at", null: false 88 + t.datetime "created_at"
  89 + t.datetime "updated_at"
90 t.text "key" 90 t.text "key"
91 t.string "title" 91 t.string "title"
92 t.string "type" 92 t.string "type"
@@ -95,21 +95,28 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -95,21 +95,28 @@ ActiveRecord::Schema.define(version: 20140116231608) do
95 95
96 add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree 96 add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree
97 97
  98 + create_table "merge_request_diffs", force: true do |t|
  99 + t.string "state", default: "collected", null: false
  100 + t.text "st_commits", limit: 2147483647
  101 + t.text "st_diffs", limit: 2147483647
  102 + t.integer "merge_request_id", null: false
  103 + t.datetime "created_at"
  104 + t.datetime "updated_at"
  105 + end
  106 +
98 create_table "merge_requests", force: true do |t| 107 create_table "merge_requests", force: true do |t|
99 - t.string "target_branch", null: false  
100 - t.string "source_branch", null: false  
101 - t.integer "source_project_id", null: false 108 + t.string "target_branch", null: false
  109 + t.string "source_branch", null: false
  110 + t.integer "source_project_id", null: false
102 t.integer "author_id" 111 t.integer "author_id"
103 t.integer "assignee_id" 112 t.integer "assignee_id"
104 t.string "title" 113 t.string "title"
105 - t.datetime "created_at", null: false  
106 - t.datetime "updated_at", null: false  
107 - t.text "st_commits", limit: 2147483647  
108 - t.text "st_diffs", limit: 2147483647 114 + t.datetime "created_at"
  115 + t.datetime "updated_at"
109 t.integer "milestone_id" 116 t.integer "milestone_id"
110 t.string "state" 117 t.string "state"
111 t.string "merge_status" 118 t.string "merge_status"
112 - t.integer "target_project_id", null: false 119 + t.integer "target_project_id", null: false
113 t.integer "iid" 120 t.integer "iid"
114 t.text "description" 121 t.text "description"
115 end 122 end
@@ -156,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -156,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
156 t.text "note" 163 t.text "note"
157 t.string "noteable_type" 164 t.string "noteable_type"
158 t.integer "author_id" 165 t.integer "author_id"
159 - t.datetime "created_at", null: false  
160 - t.datetime "updated_at", null: false 166 + t.datetime "created_at"
  167 + t.datetime "updated_at"
161 t.integer "project_id" 168 t.integer "project_id"
162 t.string "attachment" 169 t.string "attachment"
163 t.string "line_code" 170 t.string "line_code"
@@ -179,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -179,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
179 t.string "name" 186 t.string "name"
180 t.string "path" 187 t.string "path"
181 t.text "description" 188 t.text "description"
182 - t.datetime "created_at", null: false  
183 - t.datetime "updated_at", null: false 189 + t.datetime "created_at"
  190 + t.datetime "updated_at"
184 t.integer "creator_id" 191 t.integer "creator_id"
185 t.boolean "issues_enabled", default: true, null: false 192 t.boolean "issues_enabled", default: true, null: false
186 t.boolean "wall_enabled", default: true, null: false 193 t.boolean "wall_enabled", default: true, null: false
@@ -231,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -231,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
231 t.text "content", limit: 2147483647 238 t.text "content", limit: 2147483647
232 t.integer "author_id", null: false 239 t.integer "author_id", null: false
233 t.integer "project_id" 240 t.integer "project_id"
234 - t.datetime "created_at", null: false  
235 - t.datetime "updated_at", null: false 241 + t.datetime "created_at"
  242 + t.datetime "updated_at"
236 t.string "file_name" 243 t.string "file_name"
237 t.datetime "expires_at" 244 t.datetime "expires_at"
238 t.boolean "private", default: true, null: false 245 t.boolean "private", default: true, null: false
@@ -254,45 +261,42 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -254,45 +261,42 @@ ActiveRecord::Schema.define(version: 20140116231608) do
254 t.datetime "created_at" 261 t.datetime "created_at"
255 end 262 end
256 263
257 - add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree  
258 - add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree  
259 -  
260 create_table "tags", force: true do |t| 264 create_table "tags", force: true do |t|
261 t.string "name" 265 t.string "name"
262 end 266 end
263 267
264 create_table "users", force: true do |t| 268 create_table "users", force: true do |t|
265 - t.string "email", default: "", null: false  
266 - t.string "encrypted_password", default: "", null: false 269 + t.string "email", default: "", null: false
  270 + t.string "encrypted_password", limit: 128, default: "", null: false
267 t.string "reset_password_token" 271 t.string "reset_password_token"
268 t.datetime "reset_password_sent_at" 272 t.datetime "reset_password_sent_at"
269 t.datetime "remember_created_at" 273 t.datetime "remember_created_at"
270 - t.integer "sign_in_count", default: 0 274 + t.integer "sign_in_count", default: 0
271 t.datetime "current_sign_in_at" 275 t.datetime "current_sign_in_at"
272 t.datetime "last_sign_in_at" 276 t.datetime "last_sign_in_at"
273 t.string "current_sign_in_ip" 277 t.string "current_sign_in_ip"
274 t.string "last_sign_in_ip" 278 t.string "last_sign_in_ip"
275 - t.datetime "created_at", null: false  
276 - t.datetime "updated_at", null: false 279 + t.datetime "created_at"
  280 + t.datetime "updated_at"
277 t.string "name" 281 t.string "name"
278 - t.boolean "admin", default: false, null: false  
279 - t.integer "projects_limit", default: 10  
280 - t.string "skype", default: "", null: false  
281 - t.string "linkedin", default: "", null: false  
282 - t.string "twitter", default: "", null: false 282 + t.boolean "admin", default: false, null: false
  283 + t.integer "projects_limit", default: 10
  284 + t.string "skype", default: "", null: false
  285 + t.string "linkedin", default: "", null: false
  286 + t.string "twitter", default: "", null: false
283 t.string "authentication_token" 287 t.string "authentication_token"
284 - t.integer "theme_id", default: 1, null: false 288 + t.integer "theme_id", default: 1, null: false
285 t.string "bio" 289 t.string "bio"
286 - t.integer "failed_attempts", default: 0 290 + t.integer "failed_attempts", default: 0
287 t.datetime "locked_at" 291 t.datetime "locked_at"
288 t.string "extern_uid" 292 t.string "extern_uid"
289 t.string "provider" 293 t.string "provider"
290 t.string "username" 294 t.string "username"
291 - t.boolean "can_create_group", default: true, null: false  
292 - t.boolean "can_create_team", default: true, null: false 295 + t.boolean "can_create_group", default: true, null: false
  296 + t.boolean "can_create_team", default: true, null: false
293 t.string "state" 297 t.string "state"
294 - t.integer "color_scheme_id", default: 1, null: false  
295 - t.integer "notification_level", default: 1, null: false 298 + t.integer "color_scheme_id", default: 1, null: false
  299 + t.integer "notification_level", default: 1, null: false
296 t.datetime "password_expires_at" 300 t.datetime "password_expires_at"
297 t.integer "created_by_id" 301 t.integer "created_by_id"
298 t.string "avatar" 302 t.string "avatar"
@@ -300,15 +304,14 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -300,15 +304,14 @@ ActiveRecord::Schema.define(version: 20140116231608) do
300 t.datetime "confirmed_at" 304 t.datetime "confirmed_at"
301 t.datetime "confirmation_sent_at" 305 t.datetime "confirmation_sent_at"
302 t.string "unconfirmed_email" 306 t.string "unconfirmed_email"
303 - t.boolean "hide_no_ssh_key", default: false  
304 - t.string "website_url", default: "", null: false 307 + t.boolean "hide_no_ssh_key", default: false
  308 + t.string "website_url", default: "", null: false
305 end 309 end
306 310
307 add_index "users", ["admin"], name: "index_users_on_admin", using: :btree 311 add_index "users", ["admin"], name: "index_users_on_admin", using: :btree
308 add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree 312 add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
309 add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree 313 add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
310 add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree 314 add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
311 - add_index "users", ["extern_uid", "provider"], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree  
312 add_index "users", ["name"], name: "index_users_on_name", using: :btree 315 add_index "users", ["name"], name: "index_users_on_name", using: :btree
313 add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree 316 add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
314 add_index "users", ["username"], name: "index_users_on_username", using: :btree 317 add_index "users", ["username"], name: "index_users_on_username", using: :btree
@@ -327,8 +330,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -327,8 +330,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
327 create_table "users_projects", force: true do |t| 330 create_table "users_projects", force: true do |t|
328 t.integer "user_id", null: false 331 t.integer "user_id", null: false
329 t.integer "project_id", null: false 332 t.integer "project_id", null: false
330 - t.datetime "created_at", null: false  
331 - t.datetime "updated_at", null: false 333 + t.datetime "created_at"
  334 + t.datetime "updated_at"
332 t.integer "project_access", default: 0, null: false 335 t.integer "project_access", default: 0, null: false
333 t.integer "notification_level", default: 3, null: false 336 t.integer "notification_level", default: 3, null: false
334 end 337 end
@@ -340,8 +343,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do @@ -340,8 +343,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
340 create_table "web_hooks", force: true do |t| 343 create_table "web_hooks", force: true do |t|
341 t.string "url" 344 t.string "url"
342 t.integer "project_id" 345 t.integer "project_id"
343 - t.datetime "created_at", null: false  
344 - t.datetime "updated_at", null: false 346 + t.datetime "created_at"
  347 + t.datetime "updated_at"
345 t.string "type", default: "ProjectHook" 348 t.string "type", default: "ProjectHook"
346 t.integer "service_id" 349 t.integer "service_id"
347 t.boolean "push_events", default: true, null: false 350 t.boolean "push_events", default: true, null: false
features/project/merge_requests.feature
@@ -55,18 +55,18 @@ Feature: Project Merge Requests @@ -55,18 +55,18 @@ Feature: Project Merge Requests
55 Given project "Shop" have "Bug NS-05" open merge request with diffs inside 55 Given project "Shop" have "Bug NS-05" open merge request with diffs inside
56 And I visit merge request page "Bug NS-05" 56 And I visit merge request page "Bug NS-05"
57 And I click on the first commit in the merge request 57 And I click on the first commit in the merge request
58 - And I leave a comment like "Line is wrong" on line 185 of the first file 58 + And I leave a comment like "Line is wrong" on line 185 of the first file in commit
59 And I switch to the merge request's comments tab 59 And I switch to the merge request's comments tab
60 - Then I should see a discussion has started on commit bcf03b5de6c:L185 60 + Then I should see a discussion has started on commit b1e6a9dbf1:L185
61 61
62 @javascript 62 @javascript
63 Scenario: I comment on a commit in merge request 63 Scenario: I comment on a commit in merge request
64 Given project "Shop" have "Bug NS-05" open merge request with diffs inside 64 Given project "Shop" have "Bug NS-05" open merge request with diffs inside
65 And I visit merge request page "Bug NS-05" 65 And I visit merge request page "Bug NS-05"
66 And I click on the first commit in the merge request 66 And I click on the first commit in the merge request
67 - And I leave a comment on the diff page 67 + And I leave a comment on the diff page in commit
68 And I switch to the merge request's comments tab 68 And I switch to the merge request's comments tab
69 - Then I should see a discussion has started on commit bcf03b5de6c 69 + Then I should see a discussion has started on commit b1e6a9dbf1
70 70
71 @javascript 71 @javascript
72 Scenario: I accept merge request with custom commit message 72 Scenario: I accept merge request with custom commit message
features/steps/dashboard/dashboard_issues.rb
@@ -66,7 +66,7 @@ class DashboardIssues &lt; Spinach::FeatureSteps @@ -66,7 +66,7 @@ class DashboardIssues &lt; Spinach::FeatureSteps
66 66
67 def project 67 def project
68 @project ||= begin 68 @project ||= begin
69 - project =create :project_with_code 69 + project =create :project
70 project.team << [current_user, :master] 70 project.team << [current_user, :master]
71 project 71 project
72 end 72 end
features/steps/dashboard/dashboard_merge_requests.rb
@@ -66,7 +66,7 @@ class DashboardMergeRequests &lt; Spinach::FeatureSteps @@ -66,7 +66,7 @@ class DashboardMergeRequests &lt; Spinach::FeatureSteps
66 66
67 def project 67 def project
68 @project ||= begin 68 @project ||= begin
69 - project =create :project_with_code 69 + project =create :project
70 project.team << [current_user, :master] 70 project.team << [current_user, :master]
71 project 71 project
72 end 72 end
features/steps/project/deploy_keys.rb
@@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys &lt; Spinach::FeatureSteps @@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys &lt; Spinach::FeatureSteps
34 end 34 end
35 35
36 step 'other project has deploy key' do 36 step 'other project has deploy key' do
37 - @second_project = create :project, namespace: current_user.namespace 37 + @second_project = create :project, namespace: create(:group)
38 @second_project.team << [current_user, :master] 38 @second_project.team << [current_user, :master]
39 create(:deploy_keys_project, project: @second_project) 39 create(:deploy_keys_project, project: @second_project)
40 end 40 end
features/steps/project/project_fork.rb
@@ -12,7 +12,7 @@ class ForkProject &lt; Spinach::FeatureSteps @@ -12,7 +12,7 @@ class ForkProject &lt; Spinach::FeatureSteps
12 12
13 step 'I am a member of project "Shop"' do 13 step 'I am a member of project "Shop"' do
14 @project = Project.find_by(name: "Shop") 14 @project = Project.find_by(name: "Shop")
15 - @project ||= create(:project_with_code, name: "Shop", group: create(:group)) 15 + @project ||= create(:project, name: "Shop", group: create(:group))
16 @project.team << [@user, :reporter] 16 @project.team << [@user, :reporter]
17 end 17 end
18 18
@@ -26,7 +26,7 @@ class ForkProject &lt; Spinach::FeatureSteps @@ -26,7 +26,7 @@ class ForkProject &lt; Spinach::FeatureSteps
26 current_user.namespace ||= create(:namespace) 26 current_user.namespace ||= create(:namespace)
27 current_user.namespace.should_not be_nil 27 current_user.namespace.should_not be_nil
28 current_user.namespace.path.should_not be_nil 28 current_user.namespace.path.should_not be_nil
29 - @my_project = create(:project_with_code, name: "Shop", namespace: current_user.namespace) 29 + @my_project = create(:project, name: "Shop", namespace: current_user.namespace)
30 end 30 end
31 31
32 step 'I should see a "Name has already been taken" warning' do 32 step 'I should see a "Name has already been taken" warning' do
features/steps/project/project_forked_merge_requests.rb
@@ -7,7 +7,7 @@ class ProjectForkedMergeRequests &lt; Spinach::FeatureSteps @@ -7,7 +7,7 @@ class ProjectForkedMergeRequests &lt; Spinach::FeatureSteps
7 7
8 step 'I am a member of project "Shop"' do 8 step 'I am a member of project "Shop"' do
9 @project = Project.find_by(name: "Shop") 9 @project = Project.find_by(name: "Shop")
10 - @project ||= create(:project_with_code, name: "Shop") 10 + @project ||= create(:project, name: "Shop")
11 @project.team << [@user, :reporter] 11 @project.team << [@user, :reporter]
12 end 12 end
13 13
@@ -15,7 +15,7 @@ class ProjectForkedMergeRequests &lt; Spinach::FeatureSteps @@ -15,7 +15,7 @@ class ProjectForkedMergeRequests &lt; Spinach::FeatureSteps
15 @forking_user = @user 15 @forking_user = @user
16 forked_project_link = build(:forked_project_link) 16 forked_project_link = build(:forked_project_link)
17 @forked_project = Project.find_by(name: "Forked Shop") 17 @forked_project = Project.find_by(name: "Forked Shop")
18 - @forked_project ||= create(:source_project_with_code, name: "Forked Shop", forked_project_link: forked_project_link, creator_id: @forking_user.id , namespace: @forking_user.namespace) 18 + @forked_project ||= create(:project, name: "Forked Shop", forked_project_link: forked_project_link, creator_id: @forking_user.id , namespace: @forking_user.namespace)
19 19
20 forked_project_link.forked_from_project = @project 20 forked_project_link.forked_from_project = @project
21 forked_project_link.forked_to_project = @forked_project 21 forked_project_link.forked_to_project = @forked_project
features/steps/project/project_issue_tracker.rb
@@ -5,7 +5,7 @@ class ProjectIssueTracker &lt; Spinach::FeatureSteps @@ -5,7 +5,7 @@ class ProjectIssueTracker &lt; Spinach::FeatureSteps
5 5
6 step 'project "Shop" has issues enabled' do 6 step 'project "Shop" has issues enabled' do
7 @project = Project.find_by(name: "Shop") 7 @project = Project.find_by(name: "Shop")
8 - @project ||= create(:project_with_code, name: "Shop", namespace: @user.namespace) 8 + @project ||= create(:project, name: "Shop", namespace: @user.namespace)
9 @project.issues_enabled = true 9 @project.issues_enabled = true
10 end 10 end
11 11
features/steps/project/project_markdown_render.rb
@@ -4,7 +4,7 @@ class Spinach::Features::ProjectMarkdownRender &lt; Spinach::FeatureSteps @@ -4,7 +4,7 @@ class Spinach::Features::ProjectMarkdownRender &lt; Spinach::FeatureSteps
4 4
5 And 'I own project "Delta"' do 5 And 'I own project "Delta"' do
6 @project = Project.find_by(name: "Delta") 6 @project = Project.find_by(name: "Delta")
7 - @project ||= create(:project_with_code, name: "Delta", namespace: @user.namespace) 7 + @project ||= create(:project, name: "Delta", namespace: @user.namespace)
8 @project.team << [@user, :master] 8 @project.team << [@user, :master]
9 end 9 end
10 10
features/steps/project/project_merge_requests.rb
@@ -81,6 +81,8 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps @@ -81,6 +81,8 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
81 title: "Bug NS-04", 81 title: "Bug NS-04",
82 source_project: project, 82 source_project: project,
83 target_project: project, 83 target_project: project,
  84 + source_branch: 'stable',
  85 + target_branch: 'master',
84 author: project.users.first) 86 author: project.users.first)
85 end 87 end
86 88
@@ -109,33 +111,29 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps @@ -109,33 +111,29 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
109 end 111 end
110 112
111 step 'I click on the first commit in the merge request' do 113 step 'I click on the first commit in the merge request' do
112 - click_link merge_request.commits.first.short_id(8) 114 + within '.first-commits' do
  115 + click_link merge_request.commits.first.short_id(8)
  116 + end
113 end 117 end
114 118
115 step 'I leave a comment on the diff page' do 119 step 'I leave a comment on the diff page' do
116 init_diff_note 120 init_diff_note
  121 + leave_comment "One comment to rule them all"
  122 + end
117 123
118 - within('.js-discussion-note-form') do  
119 - fill_in "note_note", with: "One comment to rule them all"  
120 - click_button "Add Comment"  
121 - end  
122 -  
123 - within ".note-text" do  
124 - page.should have_content "One comment to rule them all"  
125 - end 124 + step 'I leave a comment on the diff page in commit' do
  125 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
  126 + leave_comment "One comment to rule them all"
126 end 127 end
127 128
128 step 'I leave a comment like "Line is wrong" on line 185 of the first file' do 129 step 'I leave a comment like "Line is wrong" on line 185 of the first file' do
129 init_diff_note 130 init_diff_note
  131 + leave_comment "Line is wrong"
  132 + end
130 133
131 - within(".js-discussion-note-form") do  
132 - fill_in "note_note", with: "Line is wrong"  
133 - click_button "Add Comment"  
134 - end  
135 -  
136 - within ".note-text" do  
137 - page.should have_content "Line is wrong"  
138 - end 134 + step 'I leave a comment like "Line is wrong" on line 185 of the first file in commit' do
  135 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
  136 + leave_comment "Line is wrong"
139 end 137 end
140 138
141 step 'I should see a discussion has started on line 185' do 139 step 'I should see a discussion has started on line 185' do
@@ -144,14 +142,14 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps @@ -144,14 +142,14 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
144 page.should have_content "Line is wrong" 142 page.should have_content "Line is wrong"
145 end 143 end
146 144
147 - step 'I should see a discussion has started on commit bcf03b5de6c:L185' do 145 + step 'I should see a discussion has started on commit b1e6a9dbf1:L185' do
148 page.should have_content "#{current_user.name} started a discussion on commit" 146 page.should have_content "#{current_user.name} started a discussion on commit"
149 page.should have_content "app/assets/stylesheets/tree.scss:L185" 147 page.should have_content "app/assets/stylesheets/tree.scss:L185"
150 page.should have_content "Line is wrong" 148 page.should have_content "Line is wrong"
151 end 149 end
152 150
153 - step 'I should see a discussion has started on commit bcf03b5de6c' do  
154 - page.should have_content "#{current_user.name} started a discussion on commit bcf03b5de6c" 151 + step 'I should see a discussion has started on commit b1e6a9dbf1' do
  152 + page.should have_content "#{current_user.name} started a discussion on commit"
155 page.should have_content "One comment to rule them all" 153 page.should have_content "One comment to rule them all"
156 page.should have_content "app/assets/stylesheets/tree.scss:L185" 154 page.should have_content "app/assets/stylesheets/tree.scss:L185"
157 end 155 end
@@ -188,6 +186,17 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps @@ -188,6 +186,17 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
188 end 186 end
189 187
190 def init_diff_note 188 def init_diff_note
191 - find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click 189 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
  190 + end
  191 +
  192 + def leave_comment(message)
  193 + within(".js-discussion-note-form") do
  194 + fill_in "note_note", with: message
  195 + click_button "Add Comment"
  196 + end
  197 +
  198 + within ".note-text" do
  199 + page.should have_content message
  200 + end
192 end 201 end
193 end 202 end
features/steps/project/project_team_management.rb
@@ -79,7 +79,7 @@ class ProjectTeamManagement &lt; Spinach::FeatureSteps @@ -79,7 +79,7 @@ class ProjectTeamManagement &lt; Spinach::FeatureSteps
79 end 79 end
80 80
81 Given 'I own project "Website"' do 81 Given 'I own project "Website"' do
82 - @project = create(:project, name: "Website", namespace: @user.namespace) 82 + @project = create(:empty_project, name: "Website", namespace: @user.namespace)
83 @project.team << [@user, :master] 83 @project.team << [@user, :master]
84 end 84 end
85 85
features/steps/project/redirects.rb
@@ -4,7 +4,7 @@ class Spinach::Features::ProjectRedirects &lt; Spinach::FeatureSteps @@ -4,7 +4,7 @@ class Spinach::Features::ProjectRedirects &lt; Spinach::FeatureSteps
4 include SharedProject 4 include SharedProject
5 5
6 step 'public project "Community"' do 6 step 'public project "Community"' do
7 - create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC 7 + create :project, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
8 end 8 end
9 9
10 step 'private project "Enterprise"' do 10 step 'private project "Enterprise"' do
features/steps/public/projects_feature.rb
@@ -25,11 +25,11 @@ class Spinach::Features::PublicProjectsFeature &lt; Spinach::FeatureSteps @@ -25,11 +25,11 @@ class Spinach::Features::PublicProjectsFeature &lt; Spinach::FeatureSteps
25 end 25 end
26 26
27 step 'public project "Community"' do 27 step 'public project "Community"' do
28 - create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC 28 + create :project, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
29 end 29 end
30 30
31 step 'public empty project "Empty Public Project"' do 31 step 'public empty project "Empty Public Project"' do
32 - create :project, name: 'Empty Public Project', visibility_level: Gitlab::VisibilityLevel::PUBLIC 32 + create :empty_project, name: 'Empty Public Project', visibility_level: Gitlab::VisibilityLevel::PUBLIC
33 end 33 end
34 34
35 step 'I visit empty project page' do 35 step 'I visit empty project page' do
@@ -76,7 +76,7 @@ class Spinach::Features::PublicProjectsFeature &lt; Spinach::FeatureSteps @@ -76,7 +76,7 @@ class Spinach::Features::PublicProjectsFeature &lt; Spinach::FeatureSteps
76 end 76 end
77 77
78 step 'internal project "Internal"' do 78 step 'internal project "Internal"' do
79 - create :project_with_code, name: 'Internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL 79 + create :project, name: 'Internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL
80 end 80 end
81 81
82 step 'I should see project "Internal"' do 82 step 'I should see project "Internal"' do
features/steps/shared/project.rb
@@ -3,21 +3,21 @@ module SharedProject @@ -3,21 +3,21 @@ module SharedProject
3 3
4 # Create a project without caring about what it's called 4 # Create a project without caring about what it's called
5 And "I own a project" do 5 And "I own a project" do
6 - @project = create(:project_with_code, namespace: @user.namespace) 6 + @project = create(:project, namespace: @user.namespace)
7 @project.team << [@user, :master] 7 @project.team << [@user, :master]
8 end 8 end
9 9
10 # Create a specific project called "Shop" 10 # Create a specific project called "Shop"
11 And 'I own project "Shop"' do 11 And 'I own project "Shop"' do
12 @project = Project.find_by(name: "Shop") 12 @project = Project.find_by(name: "Shop")
13 - @project ||= create(:project_with_code, name: "Shop", namespace: @user.namespace) 13 + @project ||= create(:project, name: "Shop", namespace: @user.namespace)
14 @project.team << [@user, :master] 14 @project.team << [@user, :master]
15 end 15 end
16 16
17 # Create another specific project called "Forum" 17 # Create another specific project called "Forum"
18 And 'I own project "Forum"' do 18 And 'I own project "Forum"' do
19 @project = Project.find_by(name: "Forum") 19 @project = Project.find_by(name: "Forum")
20 - @project ||= create(:project_with_code, name: "Forum", namespace: @user.namespace, path: 'forum_project') 20 + @project ||= create(:project, name: "Forum", namespace: @user.namespace, path: 'forum_project')
21 @project.team << [@user, :master] 21 @project.team << [@user, :master]
22 end 22 end
23 23
lib/api/merge_requests.rb
@@ -88,7 +88,6 @@ module API @@ -88,7 +88,6 @@ module API
88 end 88 end
89 89
90 if merge_request.save 90 if merge_request.save
91 - merge_request.reload_code  
92 present merge_request, with: Entities::MergeRequest 91 present merge_request, with: Entities::MergeRequest
93 else 92 else
94 handle_merge_request_errors! merge_request.errors 93 handle_merge_request_errors! merge_request.errors
spec/controllers/blob_controller_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Projects::BlobController do 3 describe Projects::BlobController do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:user) { create(:user) } 5 let(:user) { create(:user) }
6 6
7 before do 7 before do
spec/controllers/commit_controller_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Projects::CommitController do 3 describe Projects::CommitController do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:user) { create(:user) } 5 let(:user) { create(:user) }
6 let(:commit) { project.repository.commit("master") } 6 let(:commit) { project.repository.commit("master") }
7 7
spec/controllers/commits_controller_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Projects::CommitsController do 3 describe Projects::CommitsController do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:user) { create(:user) } 5 let(:user) { create(:user) }
6 6
7 before do 7 before do
spec/controllers/merge_requests_controller_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Projects::MergeRequestsController do 3 describe Projects::MergeRequestsController do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:user) { create(:user) } 5 let(:user) { create(:user) }
6 let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") } 6 let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") }
7 7
spec/controllers/tree_controller_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Projects::TreeController do 3 describe Projects::TreeController do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:user) { create(:user) } 5 let(:user) { create(:user) }
6 6
7 before do 7 before do
spec/factories.rb
@@ -27,43 +27,16 @@ FactoryGirl.define do @@ -27,43 +27,16 @@ FactoryGirl.define do
27 factory :admin, traits: [:admin] 27 factory :admin, traits: [:admin]
28 end 28 end
29 29
30 - factory :project do 30 + factory :empty_project, class: 'Project' do
31 sequence(:name) { |n| "project#{n}" } 31 sequence(:name) { |n| "project#{n}" }
32 path { name.downcase.gsub(/\s/, '_') } 32 path { name.downcase.gsub(/\s/, '_') }
33 namespace 33 namespace
34 creator 34 creator
35 -  
36 - trait :source do  
37 - sequence(:name) { |n| "source project#{n}" }  
38 - end  
39 - trait :target do  
40 - sequence(:name) { |n| "target project#{n}" }  
41 - end  
42 -  
43 - factory :source_project, traits: [:source]  
44 - factory :target_project, traits: [:target]  
45 - end  
46 -  
47 -  
48 - factory :redmine_project, parent: :project do  
49 - issues_tracker { "redmine" }  
50 - issues_tracker_id { "project_name_in_redmine" }  
51 end 35 end
52 36
53 - factory :project_with_code, parent: :project do 37 + factory :project, parent: :empty_project do
54 path { 'gitlabhq' } 38 path { 'gitlabhq' }
55 39
56 - trait :source_path do  
57 - path { 'source_gitlabhq' }  
58 - end  
59 -  
60 - trait :target_path do  
61 - path { 'target_gitlabhq' }  
62 - end  
63 -  
64 - factory :source_project_with_code, traits: [:source, :source_path]  
65 - factory :target_project_with_code, traits: [:target, :target_path]  
66 -  
67 after :create do |project| 40 after :create do |project|
68 TestEnv.clear_repo_dir(project.namespace, project.path) 41 TestEnv.clear_repo_dir(project.namespace, project.path)
69 TestEnv.reset_satellite_dir 42 TestEnv.reset_satellite_dir
@@ -71,6 +44,11 @@ FactoryGirl.define do @@ -71,6 +44,11 @@ FactoryGirl.define do
71 end 44 end
72 end 45 end
73 46
  47 + factory :redmine_project, parent: :project do
  48 + issues_tracker { "redmine" }
  49 + issues_tracker_id { "project_name_in_redmine" }
  50 + end
  51 +
74 factory :group do 52 factory :group do
75 sequence(:name) { |n| "group#{n}" } 53 sequence(:name) { |n| "group#{n}" }
76 path { name.downcase.gsub(/\s/, '_') } 54 path { name.downcase.gsub(/\s/, '_') }
@@ -109,25 +87,45 @@ FactoryGirl.define do @@ -109,25 +87,45 @@ FactoryGirl.define do
109 factory :merge_request do 87 factory :merge_request do
110 title 88 title
111 author 89 author
112 - source_project factory: :source_project_with_code  
113 - target_project factory: :target_project_with_code 90 + source_project factory: :project
  91 + target_project { source_project }
  92 +
  93 + # → git log stable..master --pretty=oneline
  94 + # b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828 tree css fixes
  95 + # 8716fc78f3c65bbf7bcf7b574febd583bc5d2812 Added loading animation for notes
  96 + # cd5c4bac5042c5469dcdf7e7b2f768d3c6fd7088 notes count for wall
  97 + # 8470d70da67355c9c009e4401746b1d5410af2e3 notes controller refactored
  98 + # 1e689bfba39525ead225eaf611948cfbe8ac34cf fixed notes logic
  99 + # f0f14c8eaba69ebddd766498a9d0b0e79becd633 finished scss refactoring
  100 + # 3a4b4fb4cde7809f033822a171b9feae19d41fff Moving ui styles to one scss file, Added ui class to body
  101 + # 065c200c33f68c2bb781e35a43f9dc8138a893b5 removed unnecessary hr tags & titles
  102 + # 1e8b111be85df0db6c8000ef9a710bc0221eae83 Merge branch 'master' of github.com:gitlabhq/gitlabhq
  103 + # f403da73f5e62794a0447aca879360494b08f678 Fixed ajax loading image. Fixed wrong wording
  104 + # e6ea73c77600d413d370249b8e392734f7d1dbee Merge pull request #468 from bencevans/patch-1
  105 + # 4a3c05b69355deee25767a74d0512ec4b510d4ef Merge pull request #470 from bgondy/patch-1
  106 + # 0347fe2412eb51d3efeccc35210e9268bc765ac5 Update app/views/projects/team.html.haml
  107 + # 2b5c61bdece1f7eb2b901ceea7d364065cdf76ac Title for a link fixed
  108 + # 460eeb13b7560b40104044973ff933b1a6dbbcaa Increased count of notes loaded when visit wall page
  109 + # 21c141afb1c53a9180a99d2cca29ffa613eb7e3a Merge branch 'notes_refactoring'
  110 + # 292a41cbe295f16f7148913b31eb0fb91f3251c3 Fixed comments for snippets. Tests fixed
  111 + # d41d8ffb02fa74fd4571603548bd7e401ec99e0c Reply button, Comments for Merge Request diff
  112 + # b1a36b552be2a7a6bc57fbed6c52dc6ed82111f8 Merge pull request #466 from skroutz/no-rbenv
  113 + # db75dae913e8365453ca231f101b067314a7ea71 Merge pull request #465 from skroutz/branches_commit_link
  114 + # 75f040fbfe4b5af23ff004ad3207c3976df097a8 Don't enforce rbenv version
  115 + # e42fb4fda475370dcb0d8f8f1268bfdc7a0cc437 Fix broken commit link in branches page
  116 + # 215a01f63ccdc085f75a48f6f7ab6f2b15b5852c move notes login to one controller
  117 + # 81092c01984a481e312de10a28e3f1a6dda182a3 Status codes for errors, New error pages
  118 + # 7d279f9302151e3c8f4c5df9c5200a72799409b9 better error handling for not found resource, gitolite error
  119 + # 9e6d0710e927aa8ea834b8a9ae9f277be617ac7d Merge pull request #443 from CedricGatay/fix/incorrectLineNumberingInDiff
  120 + # 6ea87c47f0f8a24ae031c3fff17bc913889ecd00 Incorrect line numbering in diff
  121 + #
  122 + # → git log master..stable --pretty=oneline
  123 + # empty
  124 +
114 source_branch "master" 125 source_branch "master"
115 target_branch "stable" 126 target_branch "stable"
116 127
117 - # pick 3 commits "at random" (from bcf03b5d~3 to bcf03b5d)  
118 trait :with_diffs do 128 trait :with_diffs do
119 - target_branch "master" # pretend bcf03b5d~3  
120 - source_branch "stable" # pretend bcf03b5d  
121 - st_commits do  
122 - [  
123 - source_project.repository.commit('bcf03b5d').to_hash,  
124 - source_project.repository.commit('bcf03b5d~1').to_hash,  
125 - source_project.repository.commit('bcf03b5d~2').to_hash  
126 - ]  
127 - end  
128 - st_diffs do  
129 - source_project.repo.diff("bcf03b5d~3", "bcf03b5d")  
130 - end  
131 end 129 end
132 130
133 trait :closed do 131 trait :closed do
@@ -156,7 +154,7 @@ FactoryGirl.define do @@ -156,7 +154,7 @@ FactoryGirl.define do
156 factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment] 154 factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment]
157 155
158 trait :on_commit do 156 trait :on_commit do
159 - project factory: :project_with_code 157 + project factory: :project
160 commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a" 158 commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
161 noteable_type "Commit" 159 noteable_type "Commit"
162 end 160 end
@@ -166,7 +164,7 @@ FactoryGirl.define do @@ -166,7 +164,7 @@ FactoryGirl.define do
166 end 164 end
167 165
168 trait :on_merge_request do 166 trait :on_merge_request do
169 - project factory: :project_with_code 167 + project factory: :project
170 noteable_id 1 168 noteable_id 1
171 noteable_type "MergeRequest" 169 noteable_type "MergeRequest"
172 end 170 end
spec/features/gitlab_flavored_markdown_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe "GitLab Flavored Markdown" do 3 describe "GitLab Flavored Markdown" do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:issue) { create(:issue, project: project) } 5 let(:issue) { create(:issue, project: project) }
6 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } 6 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
7 let(:fred) do 7 let(:fred) do
spec/features/notes_on_merge_requests_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe "On a merge request", js: true do 3 describe "On a merge request", js: true do
4 - let!(:project) { create(:project_with_code) } 4 + let!(:project) { create(:project) }
5 let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } 5 let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
6 let!(:note) { create(:note_on_merge_request_with_attachment, project: project) } 6 let!(:note) { create(:note_on_merge_request_with_attachment, project: project) }
7 7
@@ -135,7 +135,7 @@ describe &quot;On a merge request&quot;, js: true do @@ -135,7 +135,7 @@ describe &quot;On a merge request&quot;, js: true do
135 end 135 end
136 136
137 describe "On a merge request diff", js: true, focus: true do 137 describe "On a merge request diff", js: true, focus: true do
138 - let!(:project) { create(:source_project_with_code) } 138 + let!(:project) { create(:project) }
139 let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) } 139 let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
140 140
141 before do 141 before do
@@ -149,7 +149,7 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do @@ -149,7 +149,7 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
149 149
150 describe "when adding a note" do 150 describe "when adding a note" do
151 before do 151 before do
152 - find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click 152 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
153 end 153 end
154 154
155 describe "the notes holder" do 155 describe "the notes holder" do
@@ -159,23 +159,14 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do @@ -159,23 +159,14 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
159 end 159 end
160 160
161 describe "the note form" do 161 describe "the note form" do
162 - # FIXME  
163 - #it 'should be valid' do  
164 - #within(".js-temp-notes-holder") { find("#note_noteable_type").value.should == "MergeRequest" }  
165 - #within(".js-temp-notes-holder") { find("#note_noteable_id").value.should == merge_request.id.to_s }  
166 - #within(".js-temp-notes-holder") { find("#note_commit_id").value.should == "" }  
167 - #within(".js-temp-notes-holder") { find("#note_line_code").value.should == "4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185" }  
168 - #should have_css(".js-close-discussion-note-form", text: "Cancel")  
169 - #end  
170 -  
171 it "shouldn't add a second form for same row" do 162 it "shouldn't add a second form for same row" do
172 - find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click 163 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
173 164
174 - should have_css("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder form", count: 1) 165 + should have_css("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185'] + .js-temp-notes-holder form", count: 1)
175 end 166 end
176 167
177 it "should be removed when canceled" do 168 it "should be removed when canceled" do
178 - within(".file form[rel$='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185']") do 169 + within(".file form[rel$='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185']") do
179 find(".js-close-discussion-note-form").trigger("click") 170 find(".js-close-discussion-note-form").trigger("click")
180 end 171 end
181 172
@@ -185,11 +176,11 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do @@ -185,11 +176,11 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
185 end 176 end
186 177
187 describe "with muliple note forms" do 178 describe "with muliple note forms" do
188 - let!(:project) { create(:source_project_with_code) } 179 + let!(:project) { create(:project) }
189 let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) } 180 let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
190 181
191 before do 182 before do
192 - find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click 183 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
193 find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click 184 find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
194 end 185 end
195 186
@@ -198,7 +189,7 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do @@ -198,7 +189,7 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
198 describe "previewing them separately" do 189 describe "previewing them separately" do
199 before do 190 before do
200 # add two separate texts and trigger previews on both 191 # add two separate texts and trigger previews on both
201 - within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder") do 192 + within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185'] + .js-temp-notes-holder") do
202 fill_in "note[note]", with: "One comment on line 185" 193 fill_in "note[note]", with: "One comment on line 185"
203 find(".js-note-preview-button").trigger("click") 194 find(".js-note-preview-button").trigger("click")
204 end 195 end
spec/features/security/project/internal_access_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe "Internal Project Access" do 3 describe "Internal Project Access" do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 5
6 let(:master) { create(:user) } 6 let(:master) { create(:user) }
7 let(:guest) { create(:user) } 7 let(:guest) { create(:user) }
spec/features/security/project/private_access_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe "Private Project Access" do 3 describe "Private Project Access" do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 5
6 let(:master) { create(:user) } 6 let(:master) { create(:user) }
7 let(:guest) { create(:user) } 7 let(:guest) { create(:user) }
spec/features/security/project/public_access_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe "Public Project Access" do 3 describe "Public Project Access" do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 5
6 let(:master) { create(:user) } 6 let(:master) { create(:user) }
7 let(:guest) { create(:user) } 7 let(:guest) { create(:user) }
spec/helpers/gitlab_markdown_helper_spec.rb
@@ -4,7 +4,7 @@ describe GitlabMarkdownHelper do @@ -4,7 +4,7 @@ describe GitlabMarkdownHelper do
4 include ApplicationHelper 4 include ApplicationHelper
5 include IssuesHelper 5 include IssuesHelper
6 6
7 - let!(:project) { create(:project_with_code) } 7 + let!(:project) { create(:project) }
8 8
9 let(:user) { create(:user, username: 'gfm') } 9 let(:user) { create(:user, username: 'gfm') }
10 let(:commit) { project.repository.commit } 10 let(:commit) { project.repository.commit }
spec/helpers/search_helper_spec.rb
@@ -43,7 +43,7 @@ describe SearchHelper do @@ -43,7 +43,7 @@ describe SearchHelper do
43 end 43 end
44 44
45 context "with a current project" do 45 context "with a current project" do
46 - before { @project = create(:project_with_code) } 46 + before { @project = create(:project) }
47 47
48 it "includes project-specific sections" do 48 it "includes project-specific sections" do
49 search_autocomplete_opts("Files").size.should == 1 49 search_autocomplete_opts("Files").size.should == 1
spec/lib/gitlab/reference_extractor_spec.rb
@@ -43,7 +43,7 @@ describe Gitlab::ReferenceExtractor do @@ -43,7 +43,7 @@ describe Gitlab::ReferenceExtractor do
43 end 43 end
44 44
45 context 'with a project' do 45 context 'with a project' do
46 - let(:project) { create(:project_with_code) } 46 + let(:project) { create(:project) }
47 47
48 it 'accesses valid user objects on the project team' do 48 it 'accesses valid user objects on the project team' do
49 @u_foo = create(:user, username: 'foo') 49 @u_foo = create(:user, username: 'foo')
spec/lib/gitlab/satellite/action_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe 'Gitlab::Satellite::Action' do 3 describe 'Gitlab::Satellite::Action' do
4 - let(:project) { create(:project_with_code) } 4 + let(:project) { create(:project) }
5 let(:user) { create(:user) } 5 let(:user) { create(:user) }
6 6
7 describe '#prepare_satellite!' do 7 describe '#prepare_satellite!' do
spec/lib/gitlab/satellite/merge_action_spec.rb
@@ -12,9 +12,10 @@ describe &#39;Gitlab::Satellite::MergeAction&#39; do @@ -12,9 +12,10 @@ describe &#39;Gitlab::Satellite::MergeAction&#39; do
12 @close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633'] 12 @close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
13 end 13 end
14 14
15 - let(:project) { create(:project_with_code) } 15 + let(:project) { create(:project, namespace: create(:group)) }
  16 + let(:fork_project) { create(:project, namespace: create(:group)) }
16 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } 17 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
17 - let(:merge_request_fork) { create(:merge_request) } 18 + let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) }
18 19
19 describe '#commits_between' do 20 describe '#commits_between' do
20 def verify_commits(commits, first_commit_sha, last_commit_sha) 21 def verify_commits(commits, first_commit_sha, last_commit_sha)
spec/mailers/notify_spec.rb
@@ -5,7 +5,7 @@ describe Notify do @@ -5,7 +5,7 @@ describe Notify do
5 include EmailSpec::Matchers 5 include EmailSpec::Matchers
6 6
7 let(:recipient) { create(:user, email: 'recipient@example.com') } 7 let(:recipient) { create(:user, email: 'recipient@example.com') }
8 - let(:project) { create(:project_with_code) } 8 + let(:project) { create(:project) }
9 9
10 shared_examples 'a multiple recipients email' do 10 shared_examples 'a multiple recipients email' do
11 it 'is sent to the given recipient' do 11 it 'is sent to the given recipient' do
spec/models/assembla_service_spec.rb
@@ -25,7 +25,7 @@ describe AssemblaService do @@ -25,7 +25,7 @@ describe AssemblaService do
25 25
26 describe "Execute" do 26 describe "Execute" do
27 let(:user) { create(:user) } 27 let(:user) { create(:user) }
28 - let(:project) { create(:project_with_code) } 28 + let(:project) { create(:project) }
29 29
30 before do 30 before do
31 @assembla_service = AssemblaService.new 31 @assembla_service = AssemblaService.new
spec/models/commit_spec.rb
1 require 'spec_helper' 1 require 'spec_helper'
2 2
3 describe Commit do 3 describe Commit do
4 - let(:project) { create :project_with_code } 4 + let(:project) { create :project }
5 let(:commit) { project.repository.commit } 5 let(:commit) { project.repository.commit }
6 6
7 describe '#title' do 7 describe '#title' do
spec/models/flowdock_service_spec.rb
@@ -25,7 +25,7 @@ describe FlowdockService do @@ -25,7 +25,7 @@ describe FlowdockService do
25 25
26 describe "Execute" do 26 describe "Execute" do
27 let(:user) { create(:user) } 27 let(:user) { create(:user) }
28 - let(:project) { create(:project_with_code) } 28 + let(:project) { create(:project) }
29 29
30 before do 30 before do
31 @flowdock_service = FlowdockService.new 31 @flowdock_service = FlowdockService.new
spec/models/merge_request_spec.rb
@@ -73,14 +73,13 @@ describe MergeRequest do @@ -73,14 +73,13 @@ describe MergeRequest do
73 73
74 describe '#for_fork?' do 74 describe '#for_fork?' do
75 it 'returns true if the merge request is for a fork' do 75 it 'returns true if the merge request is for a fork' do
76 - subject.source_project = create(:source_project)  
77 - subject.target_project = create(:target_project) 76 + subject.source_project = create(:project, namespace: create(:group))
  77 + subject.target_project = create(:project, namespace: create(:group))
78 78
79 subject.for_fork?.should be_true 79 subject.for_fork?.should be_true
80 end 80 end
  81 +
81 it 'returns false if is not for a fork' do 82 it 'returns false if is not for a fork' do
82 - subject.source_project = create(:source_project)  
83 - subject.target_project = subject.source_project  
84 subject.for_fork?.should be_false 83 subject.for_fork?.should be_false
85 end 84 end
86 end 85 end
spec/models/note_spec.rb
@@ -206,7 +206,7 @@ describe Note do @@ -206,7 +206,7 @@ describe Note do
206 end 206 end
207 207
208 describe '#create_cross_reference_note' do 208 describe '#create_cross_reference_note' do
209 - let(:project) { create(:project_with_code) } 209 + let(:project) { create(:project) }
210 let(:author) { create(:user) } 210 let(:author) { create(:user) }
211 let(:issue) { create(:issue, project: project) } 211 let(:issue) { create(:issue, project: project) }
212 let(:mergereq) { create(:merge_request, target_project: project) } 212 let(:mergereq) { create(:merge_request, target_project: project) }
spec/models/project_spec.rb
@@ -128,7 +128,7 @@ describe Project do @@ -128,7 +128,7 @@ describe Project do
128 end 128 end
129 129
130 describe :update_merge_requests do 130 describe :update_merge_requests do
131 - let(:project) { create(:project_with_code) } 131 + let(:project) { create(:project) }
132 132
133 before do 133 before do
134 @merge_request = create(:merge_request, source_project: project, target_project: project) 134 @merge_request = create(:merge_request, source_project: project, target_project: project)
@@ -136,7 +136,7 @@ describe Project do @@ -136,7 +136,7 @@ describe Project do
136 end 136 end
137 137
138 it "should close merge request if last commit from source branch was pushed to target branch" do 138 it "should close merge request if last commit from source branch was pushed to target branch" do
139 - @merge_request.reloaded_commits 139 + @merge_request.reload_code
140 @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828" 140 @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
141 project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user) 141 project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user)
142 @merge_request.reload 142 @merge_request.reload
@@ -144,7 +144,6 @@ describe Project do @@ -144,7 +144,6 @@ describe Project do
144 end 144 end
145 145
146 it "should update merge request commits with new one if pushed to source branch" do 146 it "should update merge request commits with new one if pushed to source branch" do
147 - @merge_request.last_commit.should == nil  
148 project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user) 147 project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user)
149 @merge_request.reload 148 @merge_request.reload
150 @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828" 149 @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
@@ -156,10 +155,10 @@ describe Project do @@ -156,10 +155,10 @@ describe Project do
156 context 'with namespace' do 155 context 'with namespace' do
157 before do 156 before do
158 @group = create :group, name: 'gitlab' 157 @group = create :group, name: 'gitlab'
159 - @project = create(:project, name: 'gitlab-ci', namespace: @group) 158 + @project = create(:project, name: 'gitlabhq', namespace: @group)
160 end 159 end
161 160
162 - it { Project.find_with_namespace('gitlab/gitlab-ci').should == @project } 161 + it { Project.find_with_namespace('gitlab/gitlabhq').should == @project }
163 it { Project.find_with_namespace('gitlab-ci').should be_nil } 162 it { Project.find_with_namespace('gitlab-ci').should be_nil }
164 end 163 end
165 end 164 end
@@ -168,10 +167,10 @@ describe Project do @@ -168,10 +167,10 @@ describe Project do
168 context 'with namespace' do 167 context 'with namespace' do
169 before do 168 before do
170 @group = create :group, name: 'gitlab' 169 @group = create :group, name: 'gitlab'
171 - @project = create(:project, name: 'gitlab-ci', namespace: @group) 170 + @project = create(:project, name: 'gitlabhq', namespace: @group)
172 end 171 end
173 172
174 - it { @project.to_param.should == "gitlab/gitlab-ci" } 173 + it { @project.to_param.should == "gitlab/gitlabhq" }
175 end 174 end
176 end 175 end
177 176
@@ -237,7 +236,7 @@ describe Project do @@ -237,7 +236,7 @@ describe Project do
237 end 236 end
238 237
239 describe :open_branches do 238 describe :open_branches do
240 - let(:project) { create(:project_with_code) } 239 + let(:project) { create(:project) }
241 240
242 before do 241 before do
243 project.protected_branches.create(name: 'master') 242 project.protected_branches.create(name: 'master')
spec/models/service_spec.rb
@@ -44,12 +44,12 @@ describe Service do @@ -44,12 +44,12 @@ describe Service do
44 end 44 end
45 45
46 describe :can_test do 46 describe :can_test do
47 - it { @testable.should == false } 47 + it { @testable.should == true }
48 end 48 end
49 end 49 end
50 50
51 describe "With commits" do 51 describe "With commits" do
52 - let (:project) { create :project_with_code } 52 + let (:project) { create :project }
53 53
54 before do 54 before do
55 @service.stub( 55 @service.stub(
spec/observers/merge_request_observer_spec.rb
@@ -4,16 +4,17 @@ describe MergeRequestObserver do @@ -4,16 +4,17 @@ describe MergeRequestObserver do
4 let(:some_user) { create :user } 4 let(:some_user) { create :user }
5 let(:assignee) { create :user } 5 let(:assignee) { create :user }
6 let(:author) { create :user } 6 let(:author) { create :user }
  7 + let(:project) { create :project }
7 let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object } 8 let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object }
8 - let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, target_project: create(:project)) }  
9 - let(:unassigned_mr) { create(:merge_request, author: author, target_project: create(:project)) }  
10 - let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, target_project: create(:project)) }  
11 - let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, target_project: create(:project)) } 9 + let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, source_project: project) }
  10 + let(:unassigned_mr) { create(:merge_request, author: author, source_project: project) }
  11 + let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, source_project: project) }
  12 + let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, source_project: project) }
12 13
13 before { subject.stub(:current_user).and_return(some_user) } 14 before { subject.stub(:current_user).and_return(some_user) }
14 before { subject.stub(notification: double('NotificationService').as_null_object) } 15 before { subject.stub(notification: double('NotificationService').as_null_object) }
15 before { mr_mock.stub(:author_id) } 16 before { mr_mock.stub(:author_id) }
16 - before { mr_mock.stub(:target_project) } 17 + before { mr_mock.stub(:source_project) }
17 before { mr_mock.stub(:source_project) } 18 before { mr_mock.stub(:source_project) }
18 before { mr_mock.stub(:project) } 19 before { mr_mock.stub(:project) }
19 before { mr_mock.stub(:create_cross_references!).and_return(true) } 20 before { mr_mock.stub(:create_cross_references!).and_return(true) }
@@ -46,7 +47,7 @@ describe MergeRequestObserver do @@ -46,7 +47,7 @@ describe MergeRequestObserver do
46 end 47 end
47 48
48 it 'is called when a merge request is changed' do 49 it 'is called when a merge request is changed' do
49 - changed = create(:merge_request, source_project: create(:project)) 50 + changed = create(:merge_request, source_project: project)
50 subject.should_receive(:after_update) 51 subject.should_receive(:after_update)
51 52
52 MergeRequest.observers.enable :merge_request_observer do 53 MergeRequest.observers.enable :merge_request_observer do
@@ -81,13 +82,13 @@ describe MergeRequestObserver do @@ -81,13 +82,13 @@ describe MergeRequestObserver do
81 context '#after_close' do 82 context '#after_close' do
82 context 'a status "closed"' do 83 context 'a status "closed"' do
83 it 'note is created if the merge request is being closed' do 84 it 'note is created if the merge request is being closed' do
84 - Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.target_project, some_user, 'closed', nil) 85 + Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.source_project, some_user, 'closed', nil)
85 86
86 assigned_mr.close 87 assigned_mr.close
87 end 88 end
88 89
89 it 'notification is delivered only to author if the merge request is being closed' do 90 it 'notification is delivered only to author if the merge request is being closed' do
90 - Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.target_project, some_user, 'closed', nil) 91 + Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.source_project, some_user, 'closed', nil)
91 92
92 unassigned_mr.close 93 unassigned_mr.close
93 end 94 end
@@ -97,13 +98,13 @@ describe MergeRequestObserver do @@ -97,13 +98,13 @@ describe MergeRequestObserver do
97 context '#after_reopen' do 98 context '#after_reopen' do
98 context 'a status "reopened"' do 99 context 'a status "reopened"' do
99 it 'note is created if the merge request is being reopened' do 100 it 'note is created if the merge request is being reopened' do
100 - Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.target_project, some_user, 'reopened', nil) 101 + Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.source_project, some_user, 'reopened', nil)
101 102
102 closed_assigned_mr.reopen 103 closed_assigned_mr.reopen
103 end 104 end
104 105
105 it 'notification is delivered only to author if the merge request is being reopened' do 106 it 'notification is delivered only to author if the merge request is being reopened' do
106 - Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.target_project, some_user, 'reopened', nil) 107 + Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.source_project, some_user, 'reopened', nil)
107 108
108 closed_unassigned_mr.reopen 109 closed_unassigned_mr.reopen
109 end 110 end
@@ -118,20 +119,13 @@ describe MergeRequestObserver do @@ -118,20 +119,13 @@ describe MergeRequestObserver do
118 it { @event.project.should == project } 119 it { @event.project.should == project }
119 end 120 end
120 121
121 - let(:project) { create(:project) }  
122 before do 122 before do
123 - TestEnv.enable_observers  
124 - @merge_request = create(:merge_request, source_project: project, target_project: project) 123 + @merge_request = create(:merge_request, source_project: project, source_project: project)
125 @event = Event.last 124 @event = Event.last
126 end 125 end
127 126
128 - after do  
129 - TestEnv.disable_observers  
130 - end  
131 -  
132 it_should_be_valid_event 127 it_should_be_valid_event
133 it { @event.action.should == Event::CREATED } 128 it { @event.action.should == Event::CREATED }
134 it { @event.target.should == @merge_request } 129 it { @event.target.should == @merge_request }
135 end 130 end
136 -  
137 end 131 end
spec/requests/api/files_spec.rb
@@ -6,7 +6,7 @@ describe API::API do @@ -6,7 +6,7 @@ describe API::API do
6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 7
8 let(:user) { create(:user) } 8 let(:user) { create(:user) }
9 - let!(:project) { create(:project_with_code, namespace: user.namespace ) } 9 + let!(:project) { create(:project, namespace: user.namespace ) }
10 before { project.team << [user, :developer] } 10 before { project.team << [user, :developer] }
11 11
12 describe "POST /projects/:id/repository/files" do 12 describe "POST /projects/:id/repository/files" do
spec/requests/api/merge_requests_spec.rb
@@ -5,7 +5,7 @@ describe API::API do @@ -5,7 +5,7 @@ describe API::API do
5 before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } 5 before(:each) { ActiveRecord::Base.observers.enable(:user_observer) }
6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 let(:user) { create(:user) } 7 let(:user) { create(:user) }
8 - let!(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) } 8 + let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
9 let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } 9 let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
10 before { 10 before {
11 project.team << [user, :reporters] 11 project.team << [user, :reporters]
@@ -47,32 +47,32 @@ describe API::API do @@ -47,32 +47,32 @@ describe API::API do
47 context 'between branches projects' do 47 context 'between branches projects' do
48 it "should return merge_request" do 48 it "should return merge_request" do
49 post api("/projects/#{project.id}/merge_requests", user), 49 post api("/projects/#{project.id}/merge_requests", user),
50 - title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user 50 + title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
51 response.status.should == 201 51 response.status.should == 201
52 json_response['title'].should == 'Test merge_request' 52 json_response['title'].should == 'Test merge_request'
53 end 53 end
54 54
55 it "should return 422 when source_branch equals target_branch" do 55 it "should return 422 when source_branch equals target_branch" do
56 post api("/projects/#{project.id}/merge_requests", user), 56 post api("/projects/#{project.id}/merge_requests", user),
57 - title: "Test merge_request", source_branch: "master", target_branch: "master", author: user 57 + title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
58 response.status.should == 422 58 response.status.should == 422
59 end 59 end
60 60
61 it "should return 400 when source_branch is missing" do 61 it "should return 400 when source_branch is missing" do
62 post api("/projects/#{project.id}/merge_requests", user), 62 post api("/projects/#{project.id}/merge_requests", user),
63 - title: "Test merge_request", target_branch: "master", author: user 63 + title: "Test merge_request", target_branch: "master", author: user
64 response.status.should == 400 64 response.status.should == 400
65 end 65 end
66 66
67 it "should return 400 when target_branch is missing" do 67 it "should return 400 when target_branch is missing" do
68 post api("/projects/#{project.id}/merge_requests", user), 68 post api("/projects/#{project.id}/merge_requests", user),
69 - title: "Test merge_request", source_branch: "stable", author: user 69 + title: "Test merge_request", source_branch: "stable", author: user
70 response.status.should == 400 70 response.status.should == 400
71 end 71 end
72 72
73 it "should return 400 when title is missing" do 73 it "should return 400 when title is missing" do
74 post api("/projects/#{project.id}/merge_requests", user), 74 post api("/projects/#{project.id}/merge_requests", user),
75 - target_branch: 'master', source_branch: 'stable' 75 + target_branch: 'master', source_branch: 'stable'
76 response.status.should == 400 76 response.status.should == 400
77 end 77 end
78 end 78 end
@@ -80,8 +80,8 @@ describe API::API do @@ -80,8 +80,8 @@ describe API::API do
80 context 'forked projects' do 80 context 'forked projects' do
81 let!(:user2) {create(:user)} 81 let!(:user2) {create(:user)}
82 let!(:forked_project_link) { build(:forked_project_link) } 82 let!(:forked_project_link) { build(:forked_project_link) }
83 - let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }  
84 - let!(:unrelated_project) { create(:target_project_with_code, namespace: user2.namespace, creator_id: user2.id) } 83 + let!(:fork_project) { create(:project, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
  84 + let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) }
85 85
86 before :each do |each| 86 before :each do |each|
87 fork_project.team << [user2, :reporters] 87 fork_project.team << [user2, :reporters]
@@ -92,7 +92,7 @@ describe API::API do @@ -92,7 +92,7 @@ describe API::API do
92 92
93 it "should return merge_request" do 93 it "should return merge_request" do
94 post api("/projects/#{fork_project.id}/merge_requests", user2), 94 post api("/projects/#{fork_project.id}/merge_requests", user2),
95 - title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id 95 + title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id
96 response.status.should == 201 96 response.status.should == 201
97 json_response['title'].should == 'Test merge_request' 97 json_response['title'].should == 'Test merge_request'
98 end 98 end
@@ -102,44 +102,44 @@ describe API::API do @@ -102,44 +102,44 @@ describe API::API do
102 fork_project.forked?.should be_true 102 fork_project.forked?.should be_true
103 fork_project.forked_from_project.should == project 103 fork_project.forked_from_project.should == project
104 post api("/projects/#{fork_project.id}/merge_requests", user2), 104 post api("/projects/#{fork_project.id}/merge_requests", user2),
105 - title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id 105 + title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
106 response.status.should == 201 106 response.status.should == 201
107 json_response['title'].should == 'Test merge_request' 107 json_response['title'].should == 'Test merge_request'
108 end 108 end
109 109
110 it "should return 400 when source_branch is missing" do 110 it "should return 400 when source_branch is missing" do
111 post api("/projects/#{fork_project.id}/merge_requests", user2), 111 post api("/projects/#{fork_project.id}/merge_requests", user2),
112 - title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id 112 + title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
113 response.status.should == 400 113 response.status.should == 400
114 end 114 end
115 115
116 it "should return 400 when target_branch is missing" do 116 it "should return 400 when target_branch is missing" do
117 post api("/projects/#{fork_project.id}/merge_requests", user2), 117 post api("/projects/#{fork_project.id}/merge_requests", user2),
118 - title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id 118 + title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
119 response.status.should == 400 119 response.status.should == 400
120 end 120 end
121 121
122 it "should return 400 when title is missing" do 122 it "should return 400 when title is missing" do
123 post api("/projects/#{fork_project.id}/merge_requests", user2), 123 post api("/projects/#{fork_project.id}/merge_requests", user2),
124 - target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id 124 + target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
125 response.status.should == 400 125 response.status.should == 400
126 end 126 end
127 127
128 it "should return 400 when target_branch is specified and not a forked project" do 128 it "should return 400 when target_branch is specified and not a forked project" do
129 post api("/projects/#{project.id}/merge_requests", user), 129 post api("/projects/#{project.id}/merge_requests", user),
130 - title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id 130 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
131 response.status.should == 400 131 response.status.should == 400
132 end 132 end
133 133
134 it "should return 400 when target_branch is specified and for a different fork" do 134 it "should return 400 when target_branch is specified and for a different fork" do
135 post api("/projects/#{fork_project.id}/merge_requests", user2), 135 post api("/projects/#{fork_project.id}/merge_requests", user2),
136 - title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id 136 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
137 response.status.should == 400 137 response.status.should == 400
138 end 138 end
139 139
140 it "should return 201 when target_branch is specified and for the same project" do 140 it "should return 201 when target_branch is specified and for the same project" do
141 post api("/projects/#{fork_project.id}/merge_requests", user2), 141 post api("/projects/#{fork_project.id}/merge_requests", user2),
142 - title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id 142 + title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
143 response.status.should == 201 143 response.status.should == 201
144 end 144 end
145 end 145 end
@@ -170,7 +170,7 @@ describe API::API do @@ -170,7 +170,7 @@ describe API::API do
170 170
171 it "should return 422 when source_branch and target_branch are renamed the same" do 171 it "should return 422 when source_branch and target_branch are renamed the same" do
172 put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), 172 put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
173 - source_branch: "master", target_branch: "master" 173 + source_branch: "master", target_branch: "master"
174 response.status.should == 422 174 response.status.should == 422
175 end 175 end
176 176
@@ -198,5 +198,4 @@ describe API::API do @@ -198,5 +198,4 @@ describe API::API do
198 response.status.should == 404 198 response.status.should == 404
199 end 199 end
200 end 200 end
201 -  
202 end 201 end
spec/requests/api/project_hooks_spec.rb
@@ -7,7 +7,7 @@ describe API::API, &#39;ProjectHooks&#39; do @@ -7,7 +7,7 @@ describe API::API, &#39;ProjectHooks&#39; do
7 7
8 let(:user) { create(:user) } 8 let(:user) { create(:user) }
9 let(:user3) { create(:user) } 9 let(:user3) { create(:user) }
10 - let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) } 10 + let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
11 let!(:hook) { create(:project_hook, project: project, url: "http://example.com") } 11 let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
12 12
13 before do 13 before do
spec/requests/api/projects_spec.rb
@@ -9,14 +9,14 @@ describe API::API do @@ -9,14 +9,14 @@ describe API::API do
9 let(:user2) { create(:user) } 9 let(:user2) { create(:user) }
10 let(:user3) { create(:user) } 10 let(:user3) { create(:user) }
11 let(:admin) { create(:admin) } 11 let(:admin) { create(:admin) }
12 - let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) }  
13 - let!(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }  
14 - let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }  
15 - let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }  
16 -  
17 - before { project.team << [user, :reporter] } 12 + let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
  13 + let(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
  14 + let(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
  15 + let(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
18 16
19 describe "GET /projects" do 17 describe "GET /projects" do
  18 + before { project }
  19 +
20 context "when unauthenticated" do 20 context "when unauthenticated" do
21 it "should return authentication error" do 21 it "should return authentication error" do
22 get api("/projects") 22 get api("/projects")
@@ -36,6 +36,8 @@ describe API::API do @@ -36,6 +36,8 @@ describe API::API do
36 end 36 end
37 37
38 describe "GET /projects/all" do 38 describe "GET /projects/all" do
  39 + before { project }
  40 +
39 context "when unauthenticated" do 41 context "when unauthenticated" do
40 it "should return authentication error" do 42 it "should return authentication error" do
41 get api("/projects/all") 43 get api("/projects/all")
@@ -174,6 +176,7 @@ describe API::API do @@ -174,6 +176,7 @@ describe API::API do
174 end 176 end
175 177
176 describe "POST /projects/user/:id" do 178 describe "POST /projects/user/:id" do
  179 + before { project }
177 before { admin } 180 before { admin }
178 181
179 it "should create new project without path" do 182 it "should create new project without path" do
@@ -255,6 +258,8 @@ describe API::API do @@ -255,6 +258,8 @@ describe API::API do
255 end 258 end
256 259
257 describe "GET /projects/:id" do 260 describe "GET /projects/:id" do
  261 + before { project }
  262 +
258 it "should return a project by id" do 263 it "should return a project by id" do
259 get api("/projects/#{project.id}", user) 264 get api("/projects/#{project.id}", user)
260 response.status.should == 200 265 response.status.should == 200
@@ -282,6 +287,8 @@ describe API::API do @@ -282,6 +287,8 @@ describe API::API do
282 end 287 end
283 288
284 describe "GET /projects/:id/events" do 289 describe "GET /projects/:id/events" do
  290 + before { users_project }
  291 +
285 it "should return a project events" do 292 it "should return a project events" do
286 get api("/projects/#{project.id}/events", user) 293 get api("/projects/#{project.id}/events", user)
287 response.status.should == 200 294 response.status.should == 200
@@ -305,6 +312,9 @@ describe API::API do @@ -305,6 +312,9 @@ describe API::API do
305 end 312 end
306 313
307 describe "GET /projects/:id/members" do 314 describe "GET /projects/:id/members" do
  315 + before { users_project }
  316 + before { users_project2 }
  317 +
308 it "should return project team members" do 318 it "should return project team members" do
309 get api("/projects/#{project.id}/members", user) 319 get api("/projects/#{project.id}/members", user)
310 response.status.should == 200 320 response.status.should == 200
@@ -328,6 +338,8 @@ describe API::API do @@ -328,6 +338,8 @@ describe API::API do
328 end 338 end
329 339
330 describe "GET /projects/:id/members/:user_id" do 340 describe "GET /projects/:id/members/:user_id" do
  341 + before { users_project }
  342 +
331 it "should return project team member" do 343 it "should return project team member" do
332 get api("/projects/#{project.id}/members/#{user.id}", user) 344 get api("/projects/#{project.id}/members/#{user.id}", user)
333 response.status.should == 200 345 response.status.should == 200
@@ -383,6 +395,8 @@ describe API::API do @@ -383,6 +395,8 @@ describe API::API do
383 end 395 end
384 396
385 describe "PUT /projects/:id/members/:user_id" do 397 describe "PUT /projects/:id/members/:user_id" do
  398 + before { users_project2 }
  399 +
386 it "should update project team member" do 400 it "should update project team member" do
387 put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER 401 put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
388 response.status.should == 200 402 response.status.should == 200
@@ -407,6 +421,9 @@ describe API::API do @@ -407,6 +421,9 @@ describe API::API do
407 end 421 end
408 422
409 describe "DELETE /projects/:id/members/:user_id" do 423 describe "DELETE /projects/:id/members/:user_id" do
  424 + before { users_project }
  425 + before { users_project2 }
  426 +
410 it "should remove user from project team" do 427 it "should remove user from project team" do
411 expect { 428 expect {
412 delete api("/projects/#{project.id}/members/#{user3.id}", user) 429 delete api("/projects/#{project.id}/members/#{user3.id}", user)
@@ -425,9 +442,7 @@ describe API::API do @@ -425,9 +442,7 @@ describe API::API do
425 delete api("/projects/#{project.id}/members/#{user3.id}", user) 442 delete api("/projects/#{project.id}/members/#{user3.id}", user)
426 response.status.should == 200 443 response.status.should == 200
427 end 444 end
428 - end  
429 445
430 - describe "DELETE /projects/:id/members/:user_id" do  
431 it "should return 200 OK when the user was not member" do 446 it "should return 200 OK when the user was not member" do
432 expect { 447 expect {
433 delete api("/projects/#{project.id}/members/1000000", user) 448 delete api("/projects/#{project.id}/members/1000000", user)
@@ -439,6 +454,8 @@ describe API::API do @@ -439,6 +454,8 @@ describe API::API do
439 end 454 end
440 455
441 describe "GET /projects/:id/snippets" do 456 describe "GET /projects/:id/snippets" do
  457 + before { snippet }
  458 +
442 it "should return an array of project snippets" do 459 it "should return an array of project snippets" do
443 get api("/projects/#{project.id}/snippets", user) 460 get api("/projects/#{project.id}/snippets", user)
444 response.status.should == 200 461 response.status.should == 200
@@ -505,6 +522,8 @@ describe API::API do @@ -505,6 +522,8 @@ describe API::API do
505 end 522 end
506 523
507 describe "DELETE /projects/:id/snippets/:snippet_id" do 524 describe "DELETE /projects/:id/snippets/:snippet_id" do
  525 + before { snippet }
  526 +
508 it "should delete existing project snippet" do 527 it "should delete existing project snippet" do
509 expect { 528 expect {
510 delete api("/projects/#{project.id}/snippets/#{snippet.id}", user) 529 delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
@@ -657,15 +676,15 @@ describe API::API do @@ -657,15 +676,15 @@ describe API::API do
657 676
658 describe "GET /projects/search/:query" do 677 describe "GET /projects/search/:query" do
659 let!(:query) { 'query'} 678 let!(:query) { 'query'}
660 - let!(:search) { create(:project, name: query, creator_id: user.id, namespace: user.namespace) }  
661 - let!(:pre) { create(:project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }  
662 - let!(:post) { create(:project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }  
663 - let!(:pre_post) { create(:project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }  
664 - let!(:unfound) { create(:project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }  
665 - let!(:internal) { create(:project, name: "internal #{query}", visibility_level: Gitlab::VisibilityLevel::INTERNAL) }  
666 - let!(:unfound_internal) { create(:project, name: 'unfound internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL) }  
667 - let!(:public) { create(:project, name: "public #{query}", visibility_level: Gitlab::VisibilityLevel::PUBLIC) }  
668 - let!(:unfound_public) { create(:project, name: 'unfound public', visibility_level: Gitlab::VisibilityLevel::PUBLIC) } 679 + let!(:search) { create(:empty_project, name: query, creator_id: user.id, namespace: user.namespace) }
  680 + let!(:pre) { create(:empty_project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
  681 + let!(:post) { create(:empty_project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
  682 + let!(:pre_post) { create(:empty_project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
  683 + let!(:unfound) { create(:empty_project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
  684 + let!(:internal) { create(:empty_project, name: "internal #{query}", visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
  685 + let!(:unfound_internal) { create(:empty_project, name: 'unfound internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
  686 + let!(:public) { create(:empty_project, name: "public #{query}", visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
  687 + let!(:unfound_public) { create(:empty_project, name: 'unfound public', visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
669 688
670 context "when unauthenticated" do 689 context "when unauthenticated" do
671 it "should return authentication error" do 690 it "should return authentication error" do
spec/requests/api/repositories_spec.rb
@@ -8,7 +8,7 @@ describe API::API do @@ -8,7 +8,7 @@ describe API::API do
8 8
9 let(:user) { create(:user) } 9 let(:user) { create(:user) }
10 let(:user2) { create(:user) } 10 let(:user2) { create(:user) }
11 - let!(:project) { create(:project_with_code, creator_id: user.id) } 11 + let!(:project) { create(:project, creator_id: user.id) }
12 let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) } 12 let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
13 let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) } 13 let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) }
14 14
spec/requests/api/services_spec.rb
@@ -6,7 +6,7 @@ describe API::API do @@ -6,7 +6,7 @@ describe API::API do
6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 7
8 let(:user) { create(:user) } 8 let(:user) { create(:user) }
9 - let(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) } 9 + let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
10 10
11 describe "POST /projects/:id/services/gitlab-ci" do 11 describe "POST /projects/:id/services/gitlab-ci" do
12 it "should update gitlab-ci settings" do 12 it "should update gitlab-ci settings" do
spec/services/git_push_service_spec.rb
@@ -2,7 +2,7 @@ require &#39;spec_helper&#39; @@ -2,7 +2,7 @@ require &#39;spec_helper&#39;
2 2
3 describe GitPushService do 3 describe GitPushService do
4 let (:user) { create :user } 4 let (:user) { create :user }
5 - let (:project) { create :project_with_code } 5 + let (:project) { create :project }
6 let (:service) { GitPushService.new } 6 let (:service) { GitPushService.new }
7 7
8 before do 8 before do
spec/services/test_hook_service_spec.rb
@@ -2,7 +2,7 @@ require &#39;spec_helper&#39; @@ -2,7 +2,7 @@ require &#39;spec_helper&#39;
2 2
3 describe TestHookService do 3 describe TestHookService do
4 let (:user) { create :user } 4 let (:user) { create :user }
5 - let (:project) { create :project_with_code } 5 + let (:project) { create :project }
6 let (:hook) { create :project_hook, project: project } 6 let (:hook) { create :project_hook, project: project }
7 7
8 describe :execute do 8 describe :execute do
spec/support/mentionable_shared_examples.rb
@@ -11,7 +11,7 @@ def common_mentionable_setup @@ -11,7 +11,7 @@ def common_mentionable_setup
11 11
12 let(:mentioned_issue) { create :issue, project: mproject } 12 let(:mentioned_issue) { create :issue, project: mproject }
13 let(:other_issue) { create :issue, project: mproject } 13 let(:other_issue) { create :issue, project: mproject }
14 - let(:mentioned_mr) { create :merge_request, target_project: mproject, source_branch: 'different' } 14 + let(:mentioned_mr) { create :merge_request, source_project: mproject, source_branch: 'different' }
15 let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object } 15 let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object }
16 16
17 # Override to add known commits to the repository stub. 17 # Override to add known commits to the repository stub.
spec/support/test_env.rb
@@ -73,6 +73,10 @@ module TestEnv @@ -73,6 +73,10 @@ module TestEnv
73 version: '6.3.0' 73 version: '6.3.0'
74 ) 74 )
75 75
  76 + Gitlab::Satellite::MergeAction.any_instance.stub(
  77 + merge!: true,
  78 + )
  79 +
76 Gitlab::Satellite::Satellite.any_instance.stub( 80 Gitlab::Satellite::Satellite.any_instance.stub(
77 exists?: true, 81 exists?: true,
78 destroy: true, 82 destroy: true,
spec/workers/post_receive_spec.rb
@@ -9,7 +9,7 @@ describe PostReceive do @@ -9,7 +9,7 @@ describe PostReceive do
9 end 9 end
10 10
11 context "web hook" do 11 context "web hook" do
12 - let(:project) { create(:project_with_code) } 12 + let(:project) { create(:project) }
13 let(:key) { create(:key, user: project.owner) } 13 let(:key) { create(:key, user: project.owner) }
14 let(:key_id) { key.shell_id } 14 let(:key_id) { key.shell_id }
15 15