Commit 28e13634dc9318dbd093a4561ee8ea16e1d71460
Exists in
spb-stable
and in
3 other branches
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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 | ... | ... |
... | ... | @@ -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 | |
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)} | |
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 | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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
features/steps/dashboard/dashboard_merge_requests.rb
features/steps/project/deploy_keys.rb
... | ... | @@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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 < 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
spec/controllers/blob_controller_spec.rb
spec/controllers/commit_controller_spec.rb
spec/controllers/commits_controller_spec.rb
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
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 "On a merge request", 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 "On a merge request diff", 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 "On a merge request diff", 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 "On a merge request diff", 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 "On a merge request diff", 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
spec/features/security/project/private_access_spec.rb
spec/features/security/project/public_access_spec.rb
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
spec/lib/gitlab/satellite/merge_action_spec.rb
... | ... | @@ -12,9 +12,10 @@ describe 'Gitlab::Satellite::MergeAction' 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
spec/models/commit_spec.rb
spec/models/flowdock_service_spec.rb
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, 'ProjectHooks' 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
spec/services/test_hook_service_spec.rb
... | ... | @@ -2,7 +2,7 @@ require 'spec_helper' |
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
spec/workers/post_receive_spec.rb