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 89 .merge-request-form-info {
90 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 76 @merge_request.author = current_user
77 77 @target_branches ||= []
78 78 if @merge_request.save
79   - @merge_request.reload_code
80 79 redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
81 80 else
82 81 @source_project = @merge_request.source_project
... ... @@ -217,6 +216,7 @@ class Projects::MergeRequestsController &lt; Projects::ApplicationController
217 216 # or from cache if already merged
218 217 @commits = @merge_request.commits
219 218  
  219 + @merge_request_diff = @merge_request.merge_request_diff
220 220 @allowed_to_merge = allowed_to_merge?
221 221 @show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge
222 222 end
... ...
app/models/merge_request.rb
... ... @@ -31,6 +31,11 @@ class MergeRequest &lt; ActiveRecord::Base
31 31 belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project"
32 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 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 41 attr_accessor :should_remove_source_branch
... ... @@ -53,11 +58,8 @@ class MergeRequest &lt; ActiveRecord::Base
53 58 end
54 59  
55 60 state :opened
56   -
57 61 state :reopened
58   -
59 62 state :closed
60   -
61 63 state :merged
62 64 end
63 65  
... ... @@ -75,15 +77,10 @@ class MergeRequest &lt; ActiveRecord::Base
75 77 end
76 78  
77 79 state :unchecked
78   -
79 80 state :can_be_merged
80   -
81 81 state :cannot_be_merged
82 82 end
83 83  
84   - serialize :st_commits
85   - serialize :st_diffs
86   -
87 84 validates :source_project, presence: true, unless: :allow_broken
88 85 validates :source_branch, presence: true
89 86 validates :target_project, presence: true
... ... @@ -105,7 +102,7 @@ class MergeRequest &lt; ActiveRecord::Base
105 102 scope :closed, -> { with_states(:closed, :merged) }
106 103  
107 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 106 errors.add :branch_conflict, "You can not use same project/branch for source and target"
110 107 end
111 108  
... ... @@ -120,8 +117,7 @@ class MergeRequest &lt; ActiveRecord::Base
120 117 end
121 118  
122 119 def reload_code
123   - self.reloaded_commits
124   - self.reloaded_diffs
  120 + merge_request_diff.reload_content if opened?
125 121 end
126 122  
127 123 def check_if_can_be_merged
... ... @@ -132,42 +128,6 @@ class MergeRequest &lt; ActiveRecord::Base
132 128 end
133 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 131 def merge_event
172 132 self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
173 133 end
... ... @@ -176,46 +136,13 @@ class MergeRequest &lt; ActiveRecord::Base
176 136 self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
177 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 139 def merge!(user_id)
213 140 self.author_id_of_changes = user_id
214 141 self.merge
215 142 end
216 143  
217 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 146 self.merge!(current_user.id)
220 147 true
221 148 end
... ... @@ -225,7 +152,10 @@ class MergeRequest &lt; ActiveRecord::Base
225 152 end
226 153  
227 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 159 project.notes.where(
230 160 "(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))",
231 161 mr_id: id,
... ... @@ -247,10 +177,6 @@ class MergeRequest &lt; ActiveRecord::Base
247 177 Gitlab::Satellite::MergeAction.new(current_user, self).format_patch
248 178 end
249 179  
250   - def last_commit_short_sha
251   - @last_commit_short_sha ||= last_commit.sha[0..10]
252   - end
253   -
254 180 def for_fork?
255 181 target_project != source_project
256 182 end
... ... @@ -327,34 +253,4 @@ class MergeRequest &lt; ActiveRecord::Base
327 253 message << description.to_s
328 254 message
329 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 256 end
... ...
app/models/merge_request_diff.rb 0 → 100644
... ... @@ -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 2 .commit-row-title
3 3 = link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id"
4 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 12 8 of #{@commits.count} commits displayed.
13 13 %strong
14 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 26 - else
20 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 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 6 %h4.nothing_here_message
5 7 Can't load diff.
6 8 You can
7 9 = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
8 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 @@
  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 @@
  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 @@
  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
... ...
db/schema.rb
... ... @@ -11,7 +11,7 @@
11 11 #
12 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 16 create_table "broadcast_messages", force: true do |t|
17 17 t.text "message", null: false
... ... @@ -66,8 +66,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
66 66 t.integer "assignee_id"
67 67 t.integer "author_id"
68 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 71 t.integer "position", default: 0
72 72 t.string "branch_name"
73 73 t.text "description"
... ... @@ -85,8 +85,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
85 85  
86 86 create_table "keys", force: true do |t|
87 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 90 t.text "key"
91 91 t.string "title"
92 92 t.string "type"
... ... @@ -95,21 +95,28 @@ ActiveRecord::Schema.define(version: 20140116231608) do
95 95  
96 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 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 111 t.integer "author_id"
103 112 t.integer "assignee_id"
104 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 116 t.integer "milestone_id"
110 117 t.string "state"
111 118 t.string "merge_status"
112   - t.integer "target_project_id", null: false
  119 + t.integer "target_project_id", null: false
113 120 t.integer "iid"
114 121 t.text "description"
115 122 end
... ... @@ -156,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
156 163 t.text "note"
157 164 t.string "noteable_type"
158 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 168 t.integer "project_id"
162 169 t.string "attachment"
163 170 t.string "line_code"
... ... @@ -179,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
179 186 t.string "name"
180 187 t.string "path"
181 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 191 t.integer "creator_id"
185 192 t.boolean "issues_enabled", default: true, null: false
186 193 t.boolean "wall_enabled", default: true, null: false
... ... @@ -231,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
231 238 t.text "content", limit: 2147483647
232 239 t.integer "author_id", null: false
233 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 243 t.string "file_name"
237 244 t.datetime "expires_at"
238 245 t.boolean "private", default: true, null: false
... ... @@ -254,45 +261,42 @@ ActiveRecord::Schema.define(version: 20140116231608) do
254 261 t.datetime "created_at"
255 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 264 create_table "tags", force: true do |t|
261 265 t.string "name"
262 266 end
263 267  
264 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 271 t.string "reset_password_token"
268 272 t.datetime "reset_password_sent_at"
269 273 t.datetime "remember_created_at"
270   - t.integer "sign_in_count", default: 0
  274 + t.integer "sign_in_count", default: 0
271 275 t.datetime "current_sign_in_at"
272 276 t.datetime "last_sign_in_at"
273 277 t.string "current_sign_in_ip"
274 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 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 287 t.string "authentication_token"
284   - t.integer "theme_id", default: 1, null: false
  288 + t.integer "theme_id", default: 1, null: false
285 289 t.string "bio"
286   - t.integer "failed_attempts", default: 0
  290 + t.integer "failed_attempts", default: 0
287 291 t.datetime "locked_at"
288 292 t.string "extern_uid"
289 293 t.string "provider"
290 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 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 300 t.datetime "password_expires_at"
297 301 t.integer "created_by_id"
298 302 t.string "avatar"
... ... @@ -300,15 +304,14 @@ ActiveRecord::Schema.define(version: 20140116231608) do
300 304 t.datetime "confirmed_at"
301 305 t.datetime "confirmation_sent_at"
302 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 309 end
306 310  
307 311 add_index "users", ["admin"], name: "index_users_on_admin", using: :btree
308 312 add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
309 313 add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
310 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 315 add_index "users", ["name"], name: "index_users_on_name", using: :btree
313 316 add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
314 317 add_index "users", ["username"], name: "index_users_on_username", using: :btree
... ... @@ -327,8 +330,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
327 330 create_table "users_projects", force: true do |t|
328 331 t.integer "user_id", null: false
329 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 335 t.integer "project_access", default: 0, null: false
333 336 t.integer "notification_level", default: 3, null: false
334 337 end
... ... @@ -340,8 +343,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
340 343 create_table "web_hooks", force: true do |t|
341 344 t.string "url"
342 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 348 t.string "type", default: "ProjectHook"
346 349 t.integer "service_id"
347 350 t.boolean "push_events", default: true, null: false
... ...
features/project/merge_requests.feature
... ... @@ -55,18 +55,18 @@ Feature: Project Merge Requests
55 55 Given project "Shop" have "Bug NS-05" open merge request with diffs inside
56 56 And I visit merge request page "Bug NS-05"
57 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 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 62 @javascript
63 63 Scenario: I comment on a commit in merge request
64 64 Given project "Shop" have "Bug NS-05" open merge request with diffs inside
65 65 And I visit merge request page "Bug NS-05"
66 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 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 71 @javascript
72 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 66  
67 67 def project
68 68 @project ||= begin
69   - project =create :project_with_code
  69 + project =create :project
70 70 project.team << [current_user, :master]
71 71 project
72 72 end
... ...
features/steps/dashboard/dashboard_merge_requests.rb
... ... @@ -66,7 +66,7 @@ class DashboardMergeRequests &lt; Spinach::FeatureSteps
66 66  
67 67 def project
68 68 @project ||= begin
69   - project =create :project_with_code
  69 + project =create :project
70 70 project.team << [current_user, :master]
71 71 project
72 72 end
... ...
features/steps/project/deploy_keys.rb
... ... @@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys &lt; Spinach::FeatureSteps
34 34 end
35 35  
36 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 38 @second_project.team << [current_user, :master]
39 39 create(:deploy_keys_project, project: @second_project)
40 40 end
... ...
features/steps/project/project_fork.rb
... ... @@ -12,7 +12,7 @@ class ForkProject &lt; Spinach::FeatureSteps
12 12  
13 13 step 'I am a member of project "Shop"' do
14 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 16 @project.team << [@user, :reporter]
17 17 end
18 18  
... ... @@ -26,7 +26,7 @@ class ForkProject &lt; Spinach::FeatureSteps
26 26 current_user.namespace ||= create(:namespace)
27 27 current_user.namespace.should_not be_nil
28 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 30 end
31 31  
32 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  
8 8 step 'I am a member of project "Shop"' do
9 9 @project = Project.find_by(name: "Shop")
10   - @project ||= create(:project_with_code, name: "Shop")
  10 + @project ||= create(:project, name: "Shop")
11 11 @project.team << [@user, :reporter]
12 12 end
13 13  
... ... @@ -15,7 +15,7 @@ class ProjectForkedMergeRequests &lt; Spinach::FeatureSteps
15 15 @forking_user = @user
16 16 forked_project_link = build(:forked_project_link)
17 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 20 forked_project_link.forked_from_project = @project
21 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 5  
6 6 step 'project "Shop" has issues enabled' do
7 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 9 @project.issues_enabled = true
10 10 end
11 11  
... ...
features/steps/project/project_markdown_render.rb
... ... @@ -4,7 +4,7 @@ class Spinach::Features::ProjectMarkdownRender &lt; Spinach::FeatureSteps
4 4  
5 5 And 'I own project "Delta"' do
6 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 8 @project.team << [@user, :master]
9 9 end
10 10  
... ...
features/steps/project/project_merge_requests.rb
... ... @@ -81,6 +81,8 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
81 81 title: "Bug NS-04",
82 82 source_project: project,
83 83 target_project: project,
  84 + source_branch: 'stable',
  85 + target_branch: 'master',
84 86 author: project.users.first)
85 87 end
86 88  
... ... @@ -109,33 +111,29 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
109 111 end
110 112  
111 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 117 end
114 118  
115 119 step 'I leave a comment on the diff page' do
116 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 127 end
127 128  
128 129 step 'I leave a comment like "Line is wrong" on line 185 of the first file' do
129 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 137 end
140 138  
141 139 step 'I should see a discussion has started on line 185' do
... ... @@ -144,14 +142,14 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
144 142 page.should have_content "Line is wrong"
145 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 146 page.should have_content "#{current_user.name} started a discussion on commit"
149 147 page.should have_content "app/assets/stylesheets/tree.scss:L185"
150 148 page.should have_content "Line is wrong"
151 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 153 page.should have_content "One comment to rule them all"
156 154 page.should have_content "app/assets/stylesheets/tree.scss:L185"
157 155 end
... ... @@ -188,6 +186,17 @@ class ProjectMergeRequests &lt; Spinach::FeatureSteps
188 186 end
189 187  
190 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 201 end
193 202 end
... ...
features/steps/project/project_team_management.rb
... ... @@ -79,7 +79,7 @@ class ProjectTeamManagement &lt; Spinach::FeatureSteps
79 79 end
80 80  
81 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 83 @project.team << [@user, :master]
84 84 end
85 85  
... ...
features/steps/project/redirects.rb
... ... @@ -4,7 +4,7 @@ class Spinach::Features::ProjectRedirects &lt; Spinach::FeatureSteps
4 4 include SharedProject
5 5  
6 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 8 end
9 9  
10 10 step 'private project "Enterprise"' do
... ...
features/steps/public/projects_feature.rb
... ... @@ -25,11 +25,11 @@ class Spinach::Features::PublicProjectsFeature &lt; Spinach::FeatureSteps
25 25 end
26 26  
27 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 29 end
30 30  
31 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 33 end
34 34  
35 35 step 'I visit empty project page' do
... ... @@ -76,7 +76,7 @@ class Spinach::Features::PublicProjectsFeature &lt; Spinach::FeatureSteps
76 76 end
77 77  
78 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 80 end
81 81  
82 82 step 'I should see project "Internal"' do
... ...
features/steps/shared/project.rb
... ... @@ -3,21 +3,21 @@ module SharedProject
3 3  
4 4 # Create a project without caring about what it's called
5 5 And "I own a project" do
6   - @project = create(:project_with_code, namespace: @user.namespace)
  6 + @project = create(:project, namespace: @user.namespace)
7 7 @project.team << [@user, :master]
8 8 end
9 9  
10 10 # Create a specific project called "Shop"
11 11 And 'I own project "Shop"' do
12 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 14 @project.team << [@user, :master]
15 15 end
16 16  
17 17 # Create another specific project called "Forum"
18 18 And 'I own project "Forum"' do
19 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 21 @project.team << [@user, :master]
22 22 end
23 23  
... ...
lib/api/merge_requests.rb
... ... @@ -88,7 +88,6 @@ module API
88 88 end
89 89  
90 90 if merge_request.save
91   - merge_request.reload_code
92 91 present merge_request, with: Entities::MergeRequest
93 92 else
94 93 handle_merge_request_errors! merge_request.errors
... ...
spec/controllers/blob_controller_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe Projects::BlobController do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:user) { create(:user) }
6 6  
7 7 before do
... ...
spec/controllers/commit_controller_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe Projects::CommitController do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:user) { create(:user) }
6 6 let(:commit) { project.repository.commit("master") }
7 7  
... ...
spec/controllers/commits_controller_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe Projects::CommitsController do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:user) { create(:user) }
6 6  
7 7 before do
... ...
spec/controllers/merge_requests_controller_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe Projects::MergeRequestsController do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:user) { create(:user) }
6 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 1 require 'spec_helper'
2 2  
3 3 describe Projects::TreeController do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:user) { create(:user) }
6 6  
7 7 before do
... ...
spec/factories.rb
... ... @@ -27,43 +27,16 @@ FactoryGirl.define do
27 27 factory :admin, traits: [:admin]
28 28 end
29 29  
30   - factory :project do
  30 + factory :empty_project, class: 'Project' do
31 31 sequence(:name) { |n| "project#{n}" }
32 32 path { name.downcase.gsub(/\s/, '_') }
33 33 namespace
34 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 35 end
52 36  
53   - factory :project_with_code, parent: :project do
  37 + factory :project, parent: :empty_project do
54 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 40 after :create do |project|
68 41 TestEnv.clear_repo_dir(project.namespace, project.path)
69 42 TestEnv.reset_satellite_dir
... ... @@ -71,6 +44,11 @@ FactoryGirl.define do
71 44 end
72 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 52 factory :group do
75 53 sequence(:name) { |n| "group#{n}" }
76 54 path { name.downcase.gsub(/\s/, '_') }
... ... @@ -109,25 +87,45 @@ FactoryGirl.define do
109 87 factory :merge_request do
110 88 title
111 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 125 source_branch "master"
115 126 target_branch "stable"
116 127  
117   - # pick 3 commits "at random" (from bcf03b5d~3 to bcf03b5d)
118 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 129 end
132 130  
133 131 trait :closed do
... ... @@ -156,7 +154,7 @@ FactoryGirl.define do
156 154 factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment]
157 155  
158 156 trait :on_commit do
159   - project factory: :project_with_code
  157 + project factory: :project
160 158 commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
161 159 noteable_type "Commit"
162 160 end
... ... @@ -166,7 +164,7 @@ FactoryGirl.define do
166 164 end
167 165  
168 166 trait :on_merge_request do
169   - project factory: :project_with_code
  167 + project factory: :project
170 168 noteable_id 1
171 169 noteable_type "MergeRequest"
172 170 end
... ...
spec/features/gitlab_flavored_markdown_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe "GitLab Flavored Markdown" do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:issue) { create(:issue, project: project) }
6 6 let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
7 7 let(:fred) do
... ...
spec/features/notes_on_merge_requests_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe "On a merge request", js: true do
4   - let!(:project) { create(:project_with_code) }
  4 + let!(:project) { create(:project) }
5 5 let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
6 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 135 end
136 136  
137 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 139 let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
140 140  
141 141 before do
... ... @@ -149,7 +149,7 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
149 149  
150 150 describe "when adding a note" do
151 151 before do
152   - find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
  152 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
153 153 end
154 154  
155 155 describe "the notes holder" do
... ... @@ -159,23 +159,14 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
159 159 end
160 160  
161 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 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 166 end
176 167  
177 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 170 find(".js-close-discussion-note-form").trigger("click")
180 171 end
181 172  
... ... @@ -185,11 +176,11 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
185 176 end
186 177  
187 178 describe "with muliple note forms" do
188   - let!(:project) { create(:source_project_with_code) }
  179 + let!(:project) { create(:project) }
189 180 let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
190 181  
191 182 before do
192   - find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
  183 + find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
193 184 find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
194 185 end
195 186  
... ... @@ -198,7 +189,7 @@ describe &quot;On a merge request diff&quot;, js: true, focus: true do
198 189 describe "previewing them separately" do
199 190 before do
200 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 193 fill_in "note[note]", with: "One comment on line 185"
203 194 find(".js-note-preview-button").trigger("click")
204 195 end
... ...
spec/features/security/project/internal_access_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe "Internal Project Access" do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5  
6 6 let(:master) { create(:user) }
7 7 let(:guest) { create(:user) }
... ...
spec/features/security/project/private_access_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe "Private Project Access" do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5  
6 6 let(:master) { create(:user) }
7 7 let(:guest) { create(:user) }
... ...
spec/features/security/project/public_access_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe "Public Project Access" do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5  
6 6 let(:master) { create(:user) }
7 7 let(:guest) { create(:user) }
... ...
spec/helpers/gitlab_markdown_helper_spec.rb
... ... @@ -4,7 +4,7 @@ describe GitlabMarkdownHelper do
4 4 include ApplicationHelper
5 5 include IssuesHelper
6 6  
7   - let!(:project) { create(:project_with_code) }
  7 + let!(:project) { create(:project) }
8 8  
9 9 let(:user) { create(:user, username: 'gfm') }
10 10 let(:commit) { project.repository.commit }
... ...
spec/helpers/search_helper_spec.rb
... ... @@ -43,7 +43,7 @@ describe SearchHelper do
43 43 end
44 44  
45 45 context "with a current project" do
46   - before { @project = create(:project_with_code) }
  46 + before { @project = create(:project) }
47 47  
48 48 it "includes project-specific sections" do
49 49 search_autocomplete_opts("Files").size.should == 1
... ...
spec/lib/gitlab/reference_extractor_spec.rb
... ... @@ -43,7 +43,7 @@ describe Gitlab::ReferenceExtractor do
43 43 end
44 44  
45 45 context 'with a project' do
46   - let(:project) { create(:project_with_code) }
  46 + let(:project) { create(:project) }
47 47  
48 48 it 'accesses valid user objects on the project team' do
49 49 @u_foo = create(:user, username: 'foo')
... ...
spec/lib/gitlab/satellite/action_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe 'Gitlab::Satellite::Action' do
4   - let(:project) { create(:project_with_code) }
  4 + let(:project) { create(:project) }
5 5 let(:user) { create(:user) }
6 6  
7 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 12 @close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
13 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 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 20 describe '#commits_between' do
20 21 def verify_commits(commits, first_commit_sha, last_commit_sha)
... ...
spec/mailers/notify_spec.rb
... ... @@ -5,7 +5,7 @@ describe Notify do
5 5 include EmailSpec::Matchers
6 6  
7 7 let(:recipient) { create(:user, email: 'recipient@example.com') }
8   - let(:project) { create(:project_with_code) }
  8 + let(:project) { create(:project) }
9 9  
10 10 shared_examples 'a multiple recipients email' do
11 11 it 'is sent to the given recipient' do
... ...
spec/models/assembla_service_spec.rb
... ... @@ -25,7 +25,7 @@ describe AssemblaService do
25 25  
26 26 describe "Execute" do
27 27 let(:user) { create(:user) }
28   - let(:project) { create(:project_with_code) }
  28 + let(:project) { create(:project) }
29 29  
30 30 before do
31 31 @assembla_service = AssemblaService.new
... ...
spec/models/commit_spec.rb
1 1 require 'spec_helper'
2 2  
3 3 describe Commit do
4   - let(:project) { create :project_with_code }
  4 + let(:project) { create :project }
5 5 let(:commit) { project.repository.commit }
6 6  
7 7 describe '#title' do
... ...
spec/models/flowdock_service_spec.rb
... ... @@ -25,7 +25,7 @@ describe FlowdockService do
25 25  
26 26 describe "Execute" do
27 27 let(:user) { create(:user) }
28   - let(:project) { create(:project_with_code) }
  28 + let(:project) { create(:project) }
29 29  
30 30 before do
31 31 @flowdock_service = FlowdockService.new
... ...
spec/models/merge_request_spec.rb
... ... @@ -73,14 +73,13 @@ describe MergeRequest do
73 73  
74 74 describe '#for_fork?' do
75 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 79 subject.for_fork?.should be_true
80 80 end
  81 +
81 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 83 subject.for_fork?.should be_false
85 84 end
86 85 end
... ...
spec/models/note_spec.rb
... ... @@ -206,7 +206,7 @@ describe Note do
206 206 end
207 207  
208 208 describe '#create_cross_reference_note' do
209   - let(:project) { create(:project_with_code) }
  209 + let(:project) { create(:project) }
210 210 let(:author) { create(:user) }
211 211 let(:issue) { create(:issue, project: project) }
212 212 let(:mergereq) { create(:merge_request, target_project: project) }
... ...
spec/models/project_spec.rb
... ... @@ -128,7 +128,7 @@ describe Project do
128 128 end
129 129  
130 130 describe :update_merge_requests do
131   - let(:project) { create(:project_with_code) }
  131 + let(:project) { create(:project) }
132 132  
133 133 before do
134 134 @merge_request = create(:merge_request, source_project: project, target_project: project)
... ... @@ -136,7 +136,7 @@ describe Project do
136 136 end
137 137  
138 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 140 @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
141 141 project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user)
142 142 @merge_request.reload
... ... @@ -144,7 +144,6 @@ describe Project do
144 144 end
145 145  
146 146 it "should update merge request commits with new one if pushed to source branch" do
147   - @merge_request.last_commit.should == nil
148 147 project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user)
149 148 @merge_request.reload
150 149 @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
... ... @@ -156,10 +155,10 @@ describe Project do
156 155 context 'with namespace' do
157 156 before do
158 157 @group = create :group, name: 'gitlab'
159   - @project = create(:project, name: 'gitlab-ci', namespace: @group)
  158 + @project = create(:project, name: 'gitlabhq', namespace: @group)
160 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 162 it { Project.find_with_namespace('gitlab-ci').should be_nil }
164 163 end
165 164 end
... ... @@ -168,10 +167,10 @@ describe Project do
168 167 context 'with namespace' do
169 168 before do
170 169 @group = create :group, name: 'gitlab'
171   - @project = create(:project, name: 'gitlab-ci', namespace: @group)
  170 + @project = create(:project, name: 'gitlabhq', namespace: @group)
172 171 end
173 172  
174   - it { @project.to_param.should == "gitlab/gitlab-ci" }
  173 + it { @project.to_param.should == "gitlab/gitlabhq" }
175 174 end
176 175 end
177 176  
... ... @@ -237,7 +236,7 @@ describe Project do
237 236 end
238 237  
239 238 describe :open_branches do
240   - let(:project) { create(:project_with_code) }
  239 + let(:project) { create(:project) }
241 240  
242 241 before do
243 242 project.protected_branches.create(name: 'master')
... ...
spec/models/service_spec.rb
... ... @@ -44,12 +44,12 @@ describe Service do
44 44 end
45 45  
46 46 describe :can_test do
47   - it { @testable.should == false }
  47 + it { @testable.should == true }
48 48 end
49 49 end
50 50  
51 51 describe "With commits" do
52   - let (:project) { create :project_with_code }
  52 + let (:project) { create :project }
53 53  
54 54 before do
55 55 @service.stub(
... ...
spec/observers/merge_request_observer_spec.rb
... ... @@ -4,16 +4,17 @@ describe MergeRequestObserver do
4 4 let(:some_user) { create :user }
5 5 let(:assignee) { create :user }
6 6 let(:author) { create :user }
  7 + let(:project) { create :project }
7 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 14 before { subject.stub(:current_user).and_return(some_user) }
14 15 before { subject.stub(notification: double('NotificationService').as_null_object) }
15 16 before { mr_mock.stub(:author_id) }
16   - before { mr_mock.stub(:target_project) }
  17 + before { mr_mock.stub(:source_project) }
17 18 before { mr_mock.stub(:source_project) }
18 19 before { mr_mock.stub(:project) }
19 20 before { mr_mock.stub(:create_cross_references!).and_return(true) }
... ... @@ -46,7 +47,7 @@ describe MergeRequestObserver do
46 47 end
47 48  
48 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 51 subject.should_receive(:after_update)
51 52  
52 53 MergeRequest.observers.enable :merge_request_observer do
... ... @@ -81,13 +82,13 @@ describe MergeRequestObserver do
81 82 context '#after_close' do
82 83 context 'a status "closed"' do
83 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 87 assigned_mr.close
87 88 end
88 89  
89 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 93 unassigned_mr.close
93 94 end
... ... @@ -97,13 +98,13 @@ describe MergeRequestObserver do
97 98 context '#after_reopen' do
98 99 context 'a status "reopened"' do
99 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 103 closed_assigned_mr.reopen
103 104 end
104 105  
105 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 109 closed_unassigned_mr.reopen
109 110 end
... ... @@ -118,20 +119,13 @@ describe MergeRequestObserver do
118 119 it { @event.project.should == project }
119 120 end
120 121  
121   - let(:project) { create(:project) }
122 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 124 @event = Event.last
126 125 end
127 126  
128   - after do
129   - TestEnv.disable_observers
130   - end
131   -
132 127 it_should_be_valid_event
133 128 it { @event.action.should == Event::CREATED }
134 129 it { @event.target.should == @merge_request }
135 130 end
136   -
137 131 end
... ...
spec/requests/api/files_spec.rb
... ... @@ -6,7 +6,7 @@ describe API::API do
6 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 7  
8 8 let(:user) { create(:user) }
9   - let!(:project) { create(:project_with_code, namespace: user.namespace ) }
  9 + let!(:project) { create(:project, namespace: user.namespace ) }
10 10 before { project.team << [user, :developer] }
11 11  
12 12 describe "POST /projects/:id/repository/files" do
... ...
spec/requests/api/merge_requests_spec.rb
... ... @@ -5,7 +5,7 @@ describe API::API do
5 5 before(:each) { ActiveRecord::Base.observers.enable(:user_observer) }
6 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 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 9 let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
10 10 before {
11 11 project.team << [user, :reporters]
... ... @@ -47,32 +47,32 @@ describe API::API do
47 47 context 'between branches projects' do
48 48 it "should return merge_request" do
49 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 51 response.status.should == 201
52 52 json_response['title'].should == 'Test merge_request'
53 53 end
54 54  
55 55 it "should return 422 when source_branch equals target_branch" do
56 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 58 response.status.should == 422
59 59 end
60 60  
61 61 it "should return 400 when source_branch is missing" do
62 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 64 response.status.should == 400
65 65 end
66 66  
67 67 it "should return 400 when target_branch is missing" do
68 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 70 response.status.should == 400
71 71 end
72 72  
73 73 it "should return 400 when title is missing" do
74 74 post api("/projects/#{project.id}/merge_requests", user),
75   - target_branch: 'master', source_branch: 'stable'
  75 + target_branch: 'master', source_branch: 'stable'
76 76 response.status.should == 400
77 77 end
78 78 end
... ... @@ -80,8 +80,8 @@ describe API::API do
80 80 context 'forked projects' do
81 81 let!(:user2) {create(:user)}
82 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 86 before :each do |each|
87 87 fork_project.team << [user2, :reporters]
... ... @@ -92,7 +92,7 @@ describe API::API do
92 92  
93 93 it "should return merge_request" do
94 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 96 response.status.should == 201
97 97 json_response['title'].should == 'Test merge_request'
98 98 end
... ... @@ -102,44 +102,44 @@ describe API::API do
102 102 fork_project.forked?.should be_true
103 103 fork_project.forked_from_project.should == project
104 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 106 response.status.should == 201
107 107 json_response['title'].should == 'Test merge_request'
108 108 end
109 109  
110 110 it "should return 400 when source_branch is missing" do
111 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 113 response.status.should == 400
114 114 end
115 115  
116 116 it "should return 400 when target_branch is missing" do
117 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 119 response.status.should == 400
120 120 end
121 121  
122 122 it "should return 400 when title is missing" do
123 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 125 response.status.should == 400
126 126 end
127 127  
128 128 it "should return 400 when target_branch is specified and not a forked project" do
129 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 131 response.status.should == 400
132 132 end
133 133  
134 134 it "should return 400 when target_branch is specified and for a different fork" do
135 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 137 response.status.should == 400
138 138 end
139 139  
140 140 it "should return 201 when target_branch is specified and for the same project" do
141 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 143 response.status.should == 201
144 144 end
145 145 end
... ... @@ -170,7 +170,7 @@ describe API::API do
170 170  
171 171 it "should return 422 when source_branch and target_branch are renamed the same" do
172 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 174 response.status.should == 422
175 175 end
176 176  
... ... @@ -198,5 +198,4 @@ describe API::API do
198 198 response.status.should == 404
199 199 end
200 200 end
201   -
202 201 end
... ...
spec/requests/api/project_hooks_spec.rb
... ... @@ -7,7 +7,7 @@ describe API::API, &#39;ProjectHooks&#39; do
7 7  
8 8 let(:user) { create(:user) }
9 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 11 let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
12 12  
13 13 before do
... ...
spec/requests/api/projects_spec.rb
... ... @@ -9,14 +9,14 @@ describe API::API do
9 9 let(:user2) { create(:user) }
10 10 let(:user3) { create(:user) }
11 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 17 describe "GET /projects" do
  18 + before { project }
  19 +
20 20 context "when unauthenticated" do
21 21 it "should return authentication error" do
22 22 get api("/projects")
... ... @@ -36,6 +36,8 @@ describe API::API do
36 36 end
37 37  
38 38 describe "GET /projects/all" do
  39 + before { project }
  40 +
39 41 context "when unauthenticated" do
40 42 it "should return authentication error" do
41 43 get api("/projects/all")
... ... @@ -174,6 +176,7 @@ describe API::API do
174 176 end
175 177  
176 178 describe "POST /projects/user/:id" do
  179 + before { project }
177 180 before { admin }
178 181  
179 182 it "should create new project without path" do
... ... @@ -255,6 +258,8 @@ describe API::API do
255 258 end
256 259  
257 260 describe "GET /projects/:id" do
  261 + before { project }
  262 +
258 263 it "should return a project by id" do
259 264 get api("/projects/#{project.id}", user)
260 265 response.status.should == 200
... ... @@ -282,6 +287,8 @@ describe API::API do
282 287 end
283 288  
284 289 describe "GET /projects/:id/events" do
  290 + before { users_project }
  291 +
285 292 it "should return a project events" do
286 293 get api("/projects/#{project.id}/events", user)
287 294 response.status.should == 200
... ... @@ -305,6 +312,9 @@ describe API::API do
305 312 end
306 313  
307 314 describe "GET /projects/:id/members" do
  315 + before { users_project }
  316 + before { users_project2 }
  317 +
308 318 it "should return project team members" do
309 319 get api("/projects/#{project.id}/members", user)
310 320 response.status.should == 200
... ... @@ -328,6 +338,8 @@ describe API::API do
328 338 end
329 339  
330 340 describe "GET /projects/:id/members/:user_id" do
  341 + before { users_project }
  342 +
331 343 it "should return project team member" do
332 344 get api("/projects/#{project.id}/members/#{user.id}", user)
333 345 response.status.should == 200
... ... @@ -383,6 +395,8 @@ describe API::API do
383 395 end
384 396  
385 397 describe "PUT /projects/:id/members/:user_id" do
  398 + before { users_project2 }
  399 +
386 400 it "should update project team member" do
387 401 put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
388 402 response.status.should == 200
... ... @@ -407,6 +421,9 @@ describe API::API do
407 421 end
408 422  
409 423 describe "DELETE /projects/:id/members/:user_id" do
  424 + before { users_project }
  425 + before { users_project2 }
  426 +
410 427 it "should remove user from project team" do
411 428 expect {
412 429 delete api("/projects/#{project.id}/members/#{user3.id}", user)
... ... @@ -425,9 +442,7 @@ describe API::API do
425 442 delete api("/projects/#{project.id}/members/#{user3.id}", user)
426 443 response.status.should == 200
427 444 end
428   - end
429 445  
430   - describe "DELETE /projects/:id/members/:user_id" do
431 446 it "should return 200 OK when the user was not member" do
432 447 expect {
433 448 delete api("/projects/#{project.id}/members/1000000", user)
... ... @@ -439,6 +454,8 @@ describe API::API do
439 454 end
440 455  
441 456 describe "GET /projects/:id/snippets" do
  457 + before { snippet }
  458 +
442 459 it "should return an array of project snippets" do
443 460 get api("/projects/#{project.id}/snippets", user)
444 461 response.status.should == 200
... ... @@ -505,6 +522,8 @@ describe API::API do
505 522 end
506 523  
507 524 describe "DELETE /projects/:id/snippets/:snippet_id" do
  525 + before { snippet }
  526 +
508 527 it "should delete existing project snippet" do
509 528 expect {
510 529 delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
... ... @@ -657,15 +676,15 @@ describe API::API do
657 676  
658 677 describe "GET /projects/search/:query" do
659 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 689 context "when unauthenticated" do
671 690 it "should return authentication error" do
... ...
spec/requests/api/repositories_spec.rb
... ... @@ -8,7 +8,7 @@ describe API::API do
8 8  
9 9 let(:user) { create(:user) }
10 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 12 let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
13 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 6 after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7 7  
8 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 11 describe "POST /projects/:id/services/gitlab-ci" do
12 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 2  
3 3 describe GitPushService do
4 4 let (:user) { create :user }
5   - let (:project) { create :project_with_code }
  5 + let (:project) { create :project }
6 6 let (:service) { GitPushService.new }
7 7  
8 8 before do
... ...
spec/services/test_hook_service_spec.rb
... ... @@ -2,7 +2,7 @@ require &#39;spec_helper&#39;
2 2  
3 3 describe TestHookService do
4 4 let (:user) { create :user }
5   - let (:project) { create :project_with_code }
  5 + let (:project) { create :project }
6 6 let (:hook) { create :project_hook, project: project }
7 7  
8 8 describe :execute do
... ...
spec/support/mentionable_shared_examples.rb
... ... @@ -11,7 +11,7 @@ def common_mentionable_setup
11 11  
12 12 let(:mentioned_issue) { create :issue, project: mproject }
13 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 15 let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object }
16 16  
17 17 # Override to add known commits to the repository stub.
... ...
spec/support/test_env.rb
... ... @@ -73,6 +73,10 @@ module TestEnv
73 73 version: '6.3.0'
74 74 )
75 75  
  76 + Gitlab::Satellite::MergeAction.any_instance.stub(
  77 + merge!: true,
  78 + )
  79 +
76 80 Gitlab::Satellite::Satellite.any_instance.stub(
77 81 exists?: true,
78 82 destroy: true,
... ...
spec/workers/post_receive_spec.rb
... ... @@ -9,7 +9,7 @@ describe PostReceive do
9 9 end
10 10  
11 11 context "web hook" do
12   - let(:project) { create(:project_with_code) }
  12 + let(:project) { create(:project) }
13 13 let(:key) { create(:key, user: project.owner) }
14 14 let(:key_id) { key.shell_id }
15 15  
... ...