Commit 28e13634 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch 'improve/mr_diff'

Signed-off-by: default avatarDmitriy 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
parents 68590fdd 573f1f4a
...@@ -89,16 +89,3 @@ ...@@ -89,16 +89,3 @@
.merge-request-form-info { .merge-request-form-info {
padding-top: 15px; padding-top: 15px;
} }
.merge-request-branches {
.commit-row-message {
font-weight: normal !important;
}
.select2-container .select2-single {
span {
font-weight: bold;
color: #555;
}
}
}
...@@ -76,7 +76,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController ...@@ -76,7 +76,6 @@ class Projects::MergeRequestsController < Projects::ApplicationController
@merge_request.author = current_user @merge_request.author = current_user
@target_branches ||= [] @target_branches ||= []
if @merge_request.save if @merge_request.save
@merge_request.reload_code
redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.' redirect_to [@merge_request.target_project, @merge_request], notice: 'Merge request was successfully created.'
else else
@source_project = @merge_request.source_project @source_project = @merge_request.source_project
...@@ -217,6 +216,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController ...@@ -217,6 +216,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
# or from cache if already merged # or from cache if already merged
@commits = @merge_request.commits @commits = @merge_request.commits
@merge_request_diff = @merge_request.merge_request_diff
@allowed_to_merge = allowed_to_merge? @allowed_to_merge = allowed_to_merge?
@show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge @show_merge_controls = @merge_request.opened? && @commits.any? && @allowed_to_merge
end end
......
...@@ -31,6 +31,11 @@ class MergeRequest < ActiveRecord::Base ...@@ -31,6 +31,11 @@ class MergeRequest < ActiveRecord::Base
belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project" belongs_to :target_project, foreign_key: :target_project_id, class_name: "Project"
belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project" belongs_to :source_project, foreign_key: :source_project_id, class_name: "Project"
has_one :merge_request_diff, dependent: :destroy
after_create :create_merge_request_diff
delegate :commits, :diffs, :last_commit, :last_commit_short_sha, to: :merge_request_diff, prefix: nil
attr_accessible :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :author_id_of_changes, :state_event, :description attr_accessible :title, :assignee_id, :source_project_id, :source_branch, :target_project_id, :target_branch, :milestone_id, :author_id_of_changes, :state_event, :description
attr_accessor :should_remove_source_branch attr_accessor :should_remove_source_branch
...@@ -53,11 +58,8 @@ class MergeRequest < ActiveRecord::Base ...@@ -53,11 +58,8 @@ class MergeRequest < ActiveRecord::Base
end end
state :opened state :opened
state :reopened state :reopened
state :closed state :closed
state :merged state :merged
end end
...@@ -75,15 +77,10 @@ class MergeRequest < ActiveRecord::Base ...@@ -75,15 +77,10 @@ class MergeRequest < ActiveRecord::Base
end end
state :unchecked state :unchecked
state :can_be_merged state :can_be_merged
state :cannot_be_merged state :cannot_be_merged
end end
serialize :st_commits
serialize :st_diffs
validates :source_project, presence: true, unless: :allow_broken validates :source_project, presence: true, unless: :allow_broken
validates :source_branch, presence: true validates :source_branch, presence: true
validates :target_project, presence: true validates :target_project, presence: true
...@@ -105,7 +102,7 @@ class MergeRequest < ActiveRecord::Base ...@@ -105,7 +102,7 @@ class MergeRequest < ActiveRecord::Base
scope :closed, -> { with_states(:closed, :merged) } scope :closed, -> { with_states(:closed, :merged) }
def validate_branches def validate_branches
if target_project==source_project && target_branch == source_branch if target_project == source_project && target_branch == source_branch
errors.add :branch_conflict, "You can not use same project/branch for source and target" errors.add :branch_conflict, "You can not use same project/branch for source and target"
end end
...@@ -120,8 +117,7 @@ class MergeRequest < ActiveRecord::Base ...@@ -120,8 +117,7 @@ class MergeRequest < ActiveRecord::Base
end end
def reload_code def reload_code
self.reloaded_commits merge_request_diff.reload_content if opened?
self.reloaded_diffs
end end
def check_if_can_be_merged def check_if_can_be_merged
...@@ -132,42 +128,6 @@ class MergeRequest < ActiveRecord::Base ...@@ -132,42 +128,6 @@ class MergeRequest < ActiveRecord::Base
end end
end end
def diffs
@diffs ||= (load_diffs(st_diffs) || [])
end
def reloaded_diffs
if opened? && unmerged_diffs.any?
self.st_diffs = dump_diffs(unmerged_diffs)
self.save
end
end
def broken_diffs?
diffs == broken_diffs
rescue
true
end
def valid_diffs?
!broken_diffs?
end
def unmerged_diffs
diffs = if for_fork?
Gitlab::Satellite::MergeAction.new(author, self).diffs_between_satellite
else
Gitlab::Git::Diff.between(target_project.repository, source_branch, target_branch)
end
diffs ||= []
diffs
end
def last_commit
commits.first
end
def merge_event def merge_event
self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::MERGED).last
end end
...@@ -176,46 +136,13 @@ class MergeRequest < ActiveRecord::Base ...@@ -176,46 +136,13 @@ class MergeRequest < ActiveRecord::Base
self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
end end
def commits
load_commits(st_commits || [])
end
def probably_merged?
unmerged_commits.empty? &&
commits.any? && opened?
end
def reloaded_commits
if opened? && unmerged_commits.any?
self.st_commits = dump_commits(unmerged_commits)
save
end
commits
end
def unmerged_commits
if for_fork?
commits = Gitlab::Satellite::MergeAction.new(self.author, self).commits_between
else
commits = target_project.repository.commits_between(self.target_branch, self.source_branch)
end
if commits.present?
commits = Commit.decorate(commits).
sort_by(&:created_at).
reverse
end
commits
end
def merge!(user_id) def merge!(user_id)
self.author_id_of_changes = user_id self.author_id_of_changes = user_id
self.merge self.merge
end end
def automerge!(current_user, commit_message = nil) def automerge!(current_user, commit_message = nil)
if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message) && self.unmerged_commits.empty? if Gitlab::Satellite::MergeAction.new(current_user, self).merge!(commit_message)
self.merge!(current_user.id) self.merge!(current_user.id)
true true
end end
...@@ -225,7 +152,10 @@ class MergeRequest < ActiveRecord::Base ...@@ -225,7 +152,10 @@ class MergeRequest < ActiveRecord::Base
end end
def mr_and_commit_notes def mr_and_commit_notes
commit_ids = commits.map(&:id) # Fetch comments only from last 100 commits
commits_for_notes_limit = 100
commit_ids = commits.last(commits_for_notes_limit).map(&:id)
project.notes.where( project.notes.where(
"(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))", "(noteable_type = 'MergeRequest' AND noteable_id = :mr_id) OR (noteable_type = 'Commit' AND commit_id IN (:commit_ids))",
mr_id: id, mr_id: id,
...@@ -247,10 +177,6 @@ class MergeRequest < ActiveRecord::Base ...@@ -247,10 +177,6 @@ class MergeRequest < ActiveRecord::Base
Gitlab::Satellite::MergeAction.new(current_user, self).format_patch Gitlab::Satellite::MergeAction.new(current_user, self).format_patch
end end
def last_commit_short_sha
@last_commit_short_sha ||= last_commit.sha[0..10]
end
def for_fork? def for_fork?
target_project != source_project target_project != source_project
end end
...@@ -327,34 +253,4 @@ class MergeRequest < ActiveRecord::Base ...@@ -327,34 +253,4 @@ class MergeRequest < ActiveRecord::Base
message << description.to_s message << description.to_s
message message
end end
private
def dump_commits(commits)
commits.map(&:to_hash)
end
def load_commits(array)
array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) }
end
def dump_diffs(diffs)
if diffs == broken_diffs
broken_diffs
elsif diffs.respond_to?(:map)
diffs.map(&:to_hash)
end
end
def load_diffs(raw)
if raw == broken_diffs
broken_diffs
elsif raw.respond_to?(:map)
raw.map { |hash| Gitlab::Git::Diff.new(hash) }
end
end
def broken_diffs
[Gitlab::Git::Diff::BROKEN_DIFF]
end
end end
require Rails.root.join("app/models/commit")
class MergeRequestDiff < ActiveRecord::Base
# Prevent store of diff
# if commits amount more then 200
COMMITS_SAFE_SIZE = 200
attr_reader :commits, :diffs
belongs_to :merge_request
attr_accessible :state, :st_commits, :st_diffs
delegate :target_branch, :source_branch, to: :merge_request, prefix: nil
state_machine :state, initial: :empty do
state :collected
state :timeout
state :overflow_commits_safe_size
state :overflow_diff_files_limit
state :overflow_diff_lines_limit
end
serialize :st_commits
serialize :st_diffs
after_create :reload_content
def reload_content
reload_commits
reload_diffs
end
def diffs
@diffs ||= (load_diffs(st_diffs) || [])
end
def commits
@commits ||= load_commits(st_commits || [])
end
def last_commit
commits.first
end
def last_commit_short_sha
@last_commit_short_sha ||= last_commit.sha[0..10]
end
private
def dump_commits(commits)
commits.map(&:to_hash)
end
def load_commits(array)
array.map { |hash| Commit.new(Gitlab::Git::Commit.new(hash)) }
end
def dump_diffs(diffs)
if diffs.respond_to?(:map)
diffs.map(&:to_hash)
end
end
def load_diffs(raw)
if raw.respond_to?(:map)
raw.map { |hash| Gitlab::Git::Diff.new(hash) }
end
end
# When Git::Diff is not able to get diff
# because of git timeout it return this value
def broken_diffs
[Gitlab::Git::Diff::BROKEN_DIFF]
end
# Collect array of Git::Commit objects
# between target and source branches
def unmerged_commits
commits = if merge_request.for_fork?
Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).commits_between
else
repository.commits_between(target_branch, source_branch)
end
if commits.present?
commits = Commit.decorate(commits).
sort_by(&:created_at).
reverse
end
commits
end
# Reload all commits related to current merge request from repo
# and save it as array of hashes in st_commits db field
def reload_commits
commit_objects = unmerged_commits
if commit_objects.present?
self.st_commits = dump_commits(commit_objects)
end
save
end
# Reload diffs between branches related to current merge request from repo
# and save it as array of hashes in st_diffs db field
def reload_diffs
new_diffs = []
if commits.size.zero?
self.state = :empty
elsif commits.size > COMMITS_SAFE_SIZE
self.state = :overflow_commits_safe_size
else
new_diffs = unmerged_diffs
end
if new_diffs.any?
if new_diffs.size > Commit::DIFF_HARD_LIMIT_FILES
self.state = :overflow_diff_files_limit
new_diffs = []
end
if new_diffs.sum { |diff| diff.diff.lines.count } > Commit::DIFF_HARD_LIMIT_LINES
self.state = :overflow_diff_lines_limit
new_diffs = []
end
end
if new_diffs.present?
new_diffs = dump_commits(new_diffs)
self.state = :collected
end
self.st_diffs = new_diffs
self.save
end
# Collect array of Git::Diff objects
# between target and source branches
def unmerged_diffs
diffs = if merge_request.for_fork?
Gitlab::Satellite::MergeAction.new(merge_request.author, merge_request).diffs_between_satellite
else
Gitlab::Git::Diff.between(repository, source_branch, target_branch)
end
if diffs == broken_diffs
self.state = :timeout
diffs = []
end
diffs ||= []
diffs
end
def repository
merge_request.target_project.repository
end
end
...@@ -2,5 +2,7 @@ ...@@ -2,5 +2,7 @@
.commit-row-title .commit-row-title
= link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id" = link_to commit.short_id(8), project_commit_path(project, commit), class: "commit_short_id"
&nbsp; &nbsp;
= link_to_gfm truncate(commit.title, length: 40), project_commit_path(project, commit.id), class: "commit-row-message" %span.str-truncated
#{time_ago_with_tooltip(commit.committed_date)} &nbsp; = link_to_gfm commit.title, project_commit_path(project, commit.id), class: "commit-row-message"
.pull-right
#{time_ago_with_tooltip(commit.committed_date)}
...@@ -12,9 +12,16 @@ ...@@ -12,9 +12,16 @@
8 of #{@commits.count} commits displayed. 8 of #{@commits.count} commits displayed.
%strong %strong
%a.show-all-commits Click here to show all %a.show-all-commits Click here to show all
%ul.all-commits.hide.well-list - if @commits.size > MergeRequestDiff::COMMITS_SAFE_SIZE
- @commits.each do |commit| %ul.all-commits.hide.well-list
= render "projects/commits/commit", commit: commit, project: @merge_request.source_project - @commits.first(MergeRequestDiff::COMMITS_SAFE_SIZE).each do |commit|
= render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project
%li
other #{@commits.size - MergeRequestDiff::COMMITS_SAFE_SIZE} commits hidden top prevent performance issues.
- else
%ul.all-commits.hide.well-list
- @commits.each do |commit|
= render "projects/commits/inline_commit", commit: commit, project: @merge_request.source_project
- else - else
%ul.well-list %ul.well-list
......
- if @merge_request.valid_diffs? - if @merge_request_diff.collected?
= render "projects/commits/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project = render "projects/commits/diffs", diffs: @merge_request.diffs, project: @merge_request.source_project
- elsif @merge_request.broken_diffs? - elsif @merge_request_diff.empty?
%h4.nothing_here_message Nothing to merge from #{@merge_request.source_branch} into #{@merge_request.target_branch}
- else
%h4.nothing_here_message %h4.nothing_here_message
Can't load diff. Can't load diff.
You can You can
= link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink" = link_to "download it", project_merge_request_path(@merge_request.source_project, @merge_request), format: :diff, class: "vlink"
instead. instead.
- else
%h4.nothing_here_message Nothing to merge
class CreateMergeRequestDiffs < ActiveRecord::Migration
def change
create_table :merge_request_diffs do |t|
t.string :state, null: false, default: 'collected'
t.text :st_commits, null: true, limit: 2147483647
t.text :st_diffs, null: true, limit: 2147483647
t.integer :merge_request_id, null: false
t.timestamps
end
end
end
class MigrateMrDiffs < ActiveRecord::Migration
def self.up
execute "INSERT INTO merge_request_diffs ( merge_request_id ) SELECT id FROM merge_requests"
execute "UPDATE merge_requests mr, merge_request_diffs md SET md.st_commits = mr.st_commits WHERE md.merge_request_id = mr.id"
execute "UPDATE merge_requests mr, merge_request_diffs md SET md.st_diffs = mr.st_diffs WHERE md.merge_request_id = mr.id"
end
def self.down
MergeRequestDiff.delete_all
end
end
class RemoveMRdiffFields < ActiveRecord::Migration
def up
remove_column :merge_requests, :st_commits
remove_column :merge_requests, :st_diffs
end
def down
add_column :merge_requests, :st_commits, :text, null: true, limit: 2147483647
add_column :merge_requests, :st_diffs, :text, null: true, limit: 2147483647
execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_commits = md.st_commits WHERE md.merge_request_id = mr.id"
execute "UPDATE merge_requests mr, merge_request_diffs md SET mr.st_diffs = md.st_diffs WHERE md.merge_request_id = mr.id"
end
end
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20140116231608) do ActiveRecord::Schema.define(version: 20140122122549) do
create_table "broadcast_messages", force: true do |t| create_table "broadcast_messages", force: true do |t|
t.text "message", null: false t.text "message", null: false
...@@ -66,8 +66,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -66,8 +66,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
t.integer "assignee_id" t.integer "assignee_id"
t.integer "author_id" t.integer "author_id"
t.integer "project_id" t.integer "project_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.integer "position", default: 0 t.integer "position", default: 0
t.string "branch_name" t.string "branch_name"
t.text "description" t.text "description"
...@@ -85,8 +85,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -85,8 +85,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
create_table "keys", force: true do |t| create_table "keys", force: true do |t|
t.integer "user_id" t.integer "user_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.text "key" t.text "key"
t.string "title" t.string "title"
t.string "type" t.string "type"
...@@ -95,21 +95,28 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -95,21 +95,28 @@ ActiveRecord::Schema.define(version: 20140116231608) do
add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree add_index "keys", ["user_id"], name: "index_keys_on_user_id", using: :btree
create_table "merge_request_diffs", force: true do |t|
t.string "state", default: "collected", null: false
t.text "st_commits", limit: 2147483647
t.text "st_diffs", limit: 2147483647
t.integer "merge_request_id", null: false
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "merge_requests", force: true do |t| create_table "merge_requests", force: true do |t|
t.string "target_branch", null: false t.string "target_branch", null: false
t.string "source_branch", null: false t.string "source_branch", null: false
t.integer "source_project_id", null: false t.integer "source_project_id", null: false
t.integer "author_id" t.integer "author_id"
t.integer "assignee_id" t.integer "assignee_id"
t.string "title" t.string "title"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.text "st_commits", limit: 2147483647
t.text "st_diffs", limit: 2147483647
t.integer "milestone_id" t.integer "milestone_id"
t.string "state" t.string "state"
t.string "merge_status" t.string "merge_status"
t.integer "target_project_id", null: false t.integer "target_project_id", null: false
t.integer "iid" t.integer "iid"
t.text "description" t.text "description"
end end
...@@ -156,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -156,8 +163,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
t.text "note" t.text "note"
t.string "noteable_type" t.string "noteable_type"
t.integer "author_id" t.integer "author_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.integer "project_id" t.integer "project_id"
t.string "attachment" t.string "attachment"
t.string "line_code" t.string "line_code"
...@@ -179,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -179,8 +186,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
t.string "name" t.string "name"
t.string "path" t.string "path"
t.text "description" t.text "description"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.integer "creator_id" t.integer "creator_id"
t.boolean "issues_enabled", default: true, null: false t.boolean "issues_enabled", default: true, null: false
t.boolean "wall_enabled", default: true, null: false t.boolean "wall_enabled", default: true, null: false
...@@ -231,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -231,8 +238,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
t.text "content", limit: 2147483647 t.text "content", limit: 2147483647
t.integer "author_id", null: false t.integer "author_id", null: false
t.integer "project_id" t.integer "project_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.string "file_name" t.string "file_name"
t.datetime "expires_at" t.datetime "expires_at"
t.boolean "private", default: true, null: false t.boolean "private", default: true, null: false
...@@ -254,45 +261,42 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -254,45 +261,42 @@ ActiveRecord::Schema.define(version: 20140116231608) do
t.datetime "created_at" t.datetime "created_at"
end end
add_index "taggings", ["tag_id"], name: "index_taggings_on_tag_id", using: :btree
add_index "taggings", ["taggable_id", "taggable_type", "context"], name: "index_taggings_on_taggable_id_and_taggable_type_and_context", using: :btree
create_table "tags", force: true do |t| create_table "tags", force: true do |t|
t.string "name" t.string "name"
end end
create_table "users", force: true do |t| create_table "users", force: true do |t|
t.string "email", default: "", null: false t.string "email", default: "", null: false
t.string "encrypted_password", default: "", null: false t.string "encrypted_password", limit: 128, default: "", null: false
t.string "reset_password_token" t.string "reset_password_token"
t.datetime "reset_password_sent_at" t.datetime "reset_password_sent_at"
t.datetime "remember_created_at" t.datetime "remember_created_at"
t.integer "sign_in_count", default: 0 t.integer "sign_in_count", default: 0
t.datetime "current_sign_in_at" t.datetime "current_sign_in_at"
t.datetime "last_sign_in_at" t.datetime "last_sign_in_at"
t.string "current_sign_in_ip" t.string "current_sign_in_ip"
t.string "last_sign_in_ip" t.string "last_sign_in_ip"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.string "name" t.string "name"
t.boolean "admin", default: false, null: false t.boolean "admin", default: false, null: false
t.integer "projects_limit", default: 10 t.integer "projects_limit", default: 10
t.string "skype", default: "", null: false t.string "skype", default: "", null: false
t.string "linkedin", default: "", null: false t.string "linkedin", default: "", null: false
t.string "twitter", default: "", null: false t.string "twitter", default: "", null: false
t.string "authentication_token" t.string "authentication_token"
t.integer "theme_id", default: 1, null: false t.integer "theme_id", default: 1, null: false
t.string "bio" t.string "bio"
t.integer "failed_attempts", default: 0 t.integer "failed_attempts", default: 0
t.datetime "locked_at" t.datetime "locked_at"
t.string "extern_uid" t.string "extern_uid"
t.string "provider" t.string "provider"
t.string "username" t.string "username"
t.boolean "can_create_group", default: true, null: false t.boolean "can_create_group", default: true, null: false
t.boolean "can_create_team", default: true, null: false t.boolean "can_create_team", default: true, null: false
t.string "state" t.string "state"
t.integer "color_scheme_id", default: 1, null: false t.integer "color_scheme_id", default: 1, null: false
t.integer "notification_level", default: 1, null: false t.integer "notification_level", default: 1, null: false
t.datetime "password_expires_at" t.datetime "password_expires_at"
t.integer "created_by_id" t.integer "created_by_id"
t.string "avatar" t.string "avatar"
...@@ -300,15 +304,14 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -300,15 +304,14 @@ ActiveRecord::Schema.define(version: 20140116231608) do
t.datetime "confirmed_at" t.datetime "confirmed_at"
t.datetime "confirmation_sent_at" t.datetime "confirmation_sent_at"
t.string "unconfirmed_email" t.string "unconfirmed_email"
t.boolean "hide_no_ssh_key", default: false t.boolean "hide_no_ssh_key", default: false
t.string "website_url", default: "", null: false t.string "website_url", default: "", null: false
end end
add_index "users", ["admin"], name: "index_users_on_admin", using: :btree add_index "users", ["admin"], name: "index_users_on_admin", using: :btree
add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree add_index "users", ["authentication_token"], name: "index_users_on_authentication_token", unique: true, using: :btree
add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree add_index "users", ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true, using: :btree
add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
add_index "users", ["extern_uid", "provider"], name: "index_users_on_extern_uid_and_provider", unique: true, using: :btree
add_index "users", ["name"], name: "index_users_on_name", using: :btree add_index "users", ["name"], name: "index_users_on_name", using: :btree
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree
add_index "users", ["username"], name: "index_users_on_username", using: :btree add_index "users", ["username"], name: "index_users_on_username", using: :btree
...@@ -327,8 +330,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -327,8 +330,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
create_table "users_projects", force: true do |t| create_table "users_projects", force: true do |t|
t.integer "user_id", null: false t.integer "user_id", null: false
t.integer "project_id", null: false t.integer "project_id", null: false
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.integer "project_access", default: 0, null: false t.integer "project_access", default: 0, null: false
t.integer "notification_level", default: 3, null: false t.integer "notification_level", default: 3, null: false
end end
...@@ -340,8 +343,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do ...@@ -340,8 +343,8 @@ ActiveRecord::Schema.define(version: 20140116231608) do
create_table "web_hooks", force: true do |t| create_table "web_hooks", force: true do |t|
t.string "url" t.string "url"
t.integer "project_id" t.integer "project_id"
t.datetime "created_at", null: false t.datetime "created_at"
t.datetime "updated_at", null: false t.datetime "updated_at"
t.string "type", default: "ProjectHook" t.string "type", default: "ProjectHook"
t.integer "service_id" t.integer "service_id"
t.boolean "push_events", default: true, null: false t.boolean "push_events", default: true, null: false
......
...@@ -55,18 +55,18 @@ Feature: Project Merge Requests ...@@ -55,18 +55,18 @@ Feature: Project Merge Requests
Given project "Shop" have "Bug NS-05" open merge request with diffs inside Given project "Shop" have "Bug NS-05" open merge request with diffs inside
And I visit merge request page "Bug NS-05" And I visit merge request page "Bug NS-05"
And I click on the first commit in the merge request And I click on the first commit in the merge request
And I leave a comment like "Line is wrong" on line 185 of the first file And I leave a comment like "Line is wrong" on line 185 of the first file in commit
And I switch to the merge request's comments tab And I switch to the merge request's comments tab
Then I should see a discussion has started on commit bcf03b5de6c:L185 Then I should see a discussion has started on commit b1e6a9dbf1:L185
@javascript @javascript
Scenario: I comment on a commit in merge request Scenario: I comment on a commit in merge request
Given project "Shop" have "Bug NS-05" open merge request with diffs inside Given project "Shop" have "Bug NS-05" open merge request with diffs inside
And I visit merge request page "Bug NS-05" And I visit merge request page "Bug NS-05"
And I click on the first commit in the merge request And I click on the first commit in the merge request
And I leave a comment on the diff page And I leave a comment on the diff page in commit
And I switch to the merge request's comments tab And I switch to the merge request's comments tab
Then I should see a discussion has started on commit bcf03b5de6c Then I should see a discussion has started on commit b1e6a9dbf1
@javascript @javascript
Scenario: I accept merge request with custom commit message Scenario: I accept merge request with custom commit message
......
...@@ -66,7 +66,7 @@ class DashboardIssues < Spinach::FeatureSteps ...@@ -66,7 +66,7 @@ class DashboardIssues < Spinach::FeatureSteps
def project def project
@project ||= begin @project ||= begin
project =create :project_with_code project =create :project
project.team << [current_user, :master] project.team << [current_user, :master]
project project
end end
......
...@@ -66,7 +66,7 @@ class DashboardMergeRequests < Spinach::FeatureSteps ...@@ -66,7 +66,7 @@ class DashboardMergeRequests < Spinach::FeatureSteps
def project def project
@project ||= begin @project ||= begin
project =create :project_with_code project =create :project
project.team << [current_user, :master] project.team << [current_user, :master]
project project
end end
......
...@@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps ...@@ -34,7 +34,7 @@ class Spinach::Features::ProjectDeployKeys < Spinach::FeatureSteps
end end
step 'other project has deploy key' do step 'other project has deploy key' do
@second_project = create :project, namespace: current_user.namespace @second_project = create :project, namespace: create(:group)
@second_project.team << [current_user, :master] @second_project.team << [current_user, :master]
create(:deploy_keys_project, project: @second_project) create(:deploy_keys_project, project: @second_project)
end end
......
...@@ -12,7 +12,7 @@ class ForkProject < Spinach::FeatureSteps ...@@ -12,7 +12,7 @@ class ForkProject < Spinach::FeatureSteps
step 'I am a member of project "Shop"' do step 'I am a member of project "Shop"' do
@project = Project.find_by(name: "Shop") @project = Project.find_by(name: "Shop")
@project ||= create(:project_with_code, name: "Shop", group: create(:group)) @project ||= create(:project, name: "Shop", group: create(:group))
@project.team << [@user, :reporter] @project.team << [@user, :reporter]
end end
...@@ -26,7 +26,7 @@ class ForkProject < Spinach::FeatureSteps ...@@ -26,7 +26,7 @@ class ForkProject < Spinach::FeatureSteps
current_user.namespace ||= create(:namespace) current_user.namespace ||= create(:namespace)
current_user.namespace.should_not be_nil current_user.namespace.should_not be_nil
current_user.namespace.path.should_not be_nil current_user.namespace.path.should_not be_nil
@my_project = create(:project_with_code, name: "Shop", namespace: current_user.namespace) @my_project = create(:project, name: "Shop", namespace: current_user.namespace)
end end
step 'I should see a "Name has already been taken" warning' do step 'I should see a "Name has already been taken" warning' do
......
...@@ -7,7 +7,7 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps ...@@ -7,7 +7,7 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
step 'I am a member of project "Shop"' do step 'I am a member of project "Shop"' do
@project = Project.find_by(name: "Shop") @project = Project.find_by(name: "Shop")
@project ||= create(:project_with_code, name: "Shop") @project ||= create(:project, name: "Shop")
@project.team << [@user, :reporter] @project.team << [@user, :reporter]
end end
...@@ -15,7 +15,7 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps ...@@ -15,7 +15,7 @@ class ProjectForkedMergeRequests < Spinach::FeatureSteps
@forking_user = @user @forking_user = @user
forked_project_link = build(:forked_project_link) forked_project_link = build(:forked_project_link)
@forked_project = Project.find_by(name: "Forked Shop") @forked_project = Project.find_by(name: "Forked Shop")
@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) @forked_project ||= create(:project, name: "Forked Shop", forked_project_link: forked_project_link, creator_id: @forking_user.id , namespace: @forking_user.namespace)
forked_project_link.forked_from_project = @project forked_project_link.forked_from_project = @project
forked_project_link.forked_to_project = @forked_project forked_project_link.forked_to_project = @forked_project
......
...@@ -5,7 +5,7 @@ class ProjectIssueTracker < Spinach::FeatureSteps ...@@ -5,7 +5,7 @@ class ProjectIssueTracker < Spinach::FeatureSteps
step 'project "Shop" has issues enabled' do step 'project "Shop" has issues enabled' do
@project = Project.find_by(name: "Shop") @project = Project.find_by(name: "Shop")
@project ||= create(:project_with_code, name: "Shop", namespace: @user.namespace) @project ||= create(:project, name: "Shop", namespace: @user.namespace)
@project.issues_enabled = true @project.issues_enabled = true
end end
......
...@@ -4,7 +4,7 @@ class Spinach::Features::ProjectMarkdownRender < Spinach::FeatureSteps ...@@ -4,7 +4,7 @@ class Spinach::Features::ProjectMarkdownRender < Spinach::FeatureSteps
And 'I own project "Delta"' do And 'I own project "Delta"' do
@project = Project.find_by(name: "Delta") @project = Project.find_by(name: "Delta")
@project ||= create(:project_with_code, name: "Delta", namespace: @user.namespace) @project ||= create(:project, name: "Delta", namespace: @user.namespace)
@project.team << [@user, :master] @project.team << [@user, :master]
end end
......
...@@ -81,6 +81,8 @@ class ProjectMergeRequests < Spinach::FeatureSteps ...@@ -81,6 +81,8 @@ class ProjectMergeRequests < Spinach::FeatureSteps
title: "Bug NS-04", title: "Bug NS-04",
source_project: project, source_project: project,
target_project: project, target_project: project,
source_branch: 'stable',
target_branch: 'master',
author: project.users.first) author: project.users.first)
end end
...@@ -109,33 +111,29 @@ class ProjectMergeRequests < Spinach::FeatureSteps ...@@ -109,33 +111,29 @@ class ProjectMergeRequests < Spinach::FeatureSteps
end end
step 'I click on the first commit in the merge request' do step 'I click on the first commit in the merge request' do
click_link merge_request.commits.first.short_id(8) within '.first-commits' do
click_link merge_request.commits.first.short_id(8)
end
end end
step 'I leave a comment on the diff page' do step 'I leave a comment on the diff page' do
init_diff_note init_diff_note
leave_comment "One comment to rule them all"
end
within('.js-discussion-note-form') do step 'I leave a comment on the diff page in commit' do
fill_in "note_note", with: "One comment to rule them all" find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
click_button "Add Comment" leave_comment "One comment to rule them all"
end
within ".note-text" do
page.should have_content "One comment to rule them all"
end
end end
step 'I leave a comment like "Line is wrong" on line 185 of the first file' do step 'I leave a comment like "Line is wrong" on line 185 of the first file' do
init_diff_note init_diff_note
leave_comment "Line is wrong"
end
within(".js-discussion-note-form") do step 'I leave a comment like "Line is wrong" on line 185 of the first file in commit' do
fill_in "note_note", with: "Line is wrong" find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click
click_button "Add Comment" leave_comment "Line is wrong"
end
within ".note-text" do
page.should have_content "Line is wrong"
end
end end
step 'I should see a discussion has started on line 185' do step 'I should see a discussion has started on line 185' do
...@@ -144,14 +142,14 @@ class ProjectMergeRequests < Spinach::FeatureSteps ...@@ -144,14 +142,14 @@ class ProjectMergeRequests < Spinach::FeatureSteps
page.should have_content "Line is wrong" page.should have_content "Line is wrong"
end end
step 'I should see a discussion has started on commit bcf03b5de6c:L185' do step 'I should see a discussion has started on commit b1e6a9dbf1:L185' do
page.should have_content "#{current_user.name} started a discussion on commit" page.should have_content "#{current_user.name} started a discussion on commit"
page.should have_content "app/assets/stylesheets/tree.scss:L185" page.should have_content "app/assets/stylesheets/tree.scss:L185"
page.should have_content "Line is wrong" page.should have_content "Line is wrong"
end end
step 'I should see a discussion has started on commit bcf03b5de6c' do step 'I should see a discussion has started on commit b1e6a9dbf1' do
page.should have_content "#{current_user.name} started a discussion on commit bcf03b5de6c" page.should have_content "#{current_user.name} started a discussion on commit"
page.should have_content "One comment to rule them all" page.should have_content "One comment to rule them all"
page.should have_content "app/assets/stylesheets/tree.scss:L185" page.should have_content "app/assets/stylesheets/tree.scss:L185"
end end
...@@ -188,6 +186,17 @@ class ProjectMergeRequests < Spinach::FeatureSteps ...@@ -188,6 +186,17 @@ class ProjectMergeRequests < Spinach::FeatureSteps
end end
def init_diff_note def init_diff_note
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
end
def leave_comment(message)
within(".js-discussion-note-form") do
fill_in "note_note", with: message
click_button "Add Comment"
end
within ".note-text" do
page.should have_content message
end
end end
end end
...@@ -79,7 +79,7 @@ class ProjectTeamManagement < Spinach::FeatureSteps ...@@ -79,7 +79,7 @@ class ProjectTeamManagement < Spinach::FeatureSteps
end end
Given 'I own project "Website"' do Given 'I own project "Website"' do
@project = create(:project, name: "Website", namespace: @user.namespace) @project = create(:empty_project, name: "Website", namespace: @user.namespace)
@project.team << [@user, :master] @project.team << [@user, :master]
end end
......
...@@ -4,7 +4,7 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps ...@@ -4,7 +4,7 @@ class Spinach::Features::ProjectRedirects < Spinach::FeatureSteps
include SharedProject include SharedProject
step 'public project "Community"' do step 'public project "Community"' do
create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC create :project, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
end end
step 'private project "Enterprise"' do step 'private project "Enterprise"' do
......
...@@ -25,11 +25,11 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps ...@@ -25,11 +25,11 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps
end end
step 'public project "Community"' do step 'public project "Community"' do
create :project_with_code, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC create :project, name: 'Community', visibility_level: Gitlab::VisibilityLevel::PUBLIC
end end
step 'public empty project "Empty Public Project"' do step 'public empty project "Empty Public Project"' do
create :project, name: 'Empty Public Project', visibility_level: Gitlab::VisibilityLevel::PUBLIC create :empty_project, name: 'Empty Public Project', visibility_level: Gitlab::VisibilityLevel::PUBLIC
end end
step 'I visit empty project page' do step 'I visit empty project page' do
...@@ -76,7 +76,7 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps ...@@ -76,7 +76,7 @@ class Spinach::Features::PublicProjectsFeature < Spinach::FeatureSteps
end end
step 'internal project "Internal"' do step 'internal project "Internal"' do
create :project_with_code, name: 'Internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL create :project, name: 'Internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL
end end
step 'I should see project "Internal"' do step 'I should see project "Internal"' do
......
...@@ -3,21 +3,21 @@ module SharedProject ...@@ -3,21 +3,21 @@ module SharedProject
# Create a project without caring about what it's called # Create a project without caring about what it's called
And "I own a project" do And "I own a project" do
@project = create(:project_with_code, namespace: @user.namespace) @project = create(:project, namespace: @user.namespace)
@project.team << [@user, :master] @project.team << [@user, :master]
end end
# Create a specific project called "Shop" # Create a specific project called "Shop"
And 'I own project "Shop"' do And 'I own project "Shop"' do
@project = Project.find_by(name: "Shop") @project = Project.find_by(name: "Shop")
@project ||= create(:project_with_code, name: "Shop", namespace: @user.namespace) @project ||= create(:project, name: "Shop", namespace: @user.namespace)
@project.team << [@user, :master] @project.team << [@user, :master]
end end
# Create another specific project called "Forum" # Create another specific project called "Forum"
And 'I own project "Forum"' do And 'I own project "Forum"' do
@project = Project.find_by(name: "Forum") @project = Project.find_by(name: "Forum")
@project ||= create(:project_with_code, name: "Forum", namespace: @user.namespace, path: 'forum_project') @project ||= create(:project, name: "Forum", namespace: @user.namespace, path: 'forum_project')
@project.team << [@user, :master] @project.team << [@user, :master]
end end
......
...@@ -88,7 +88,6 @@ module API ...@@ -88,7 +88,6 @@ module API
end end
if merge_request.save if merge_request.save
merge_request.reload_code
present merge_request, with: Entities::MergeRequest present merge_request, with: Entities::MergeRequest
else else
handle_merge_request_errors! merge_request.errors handle_merge_request_errors! merge_request.errors
......
require 'spec_helper' require 'spec_helper'
describe Projects::BlobController do describe Projects::BlobController do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
before do before do
......
require 'spec_helper' require 'spec_helper'
describe Projects::CommitController do describe Projects::CommitController do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
let(:commit) { project.repository.commit("master") } let(:commit) { project.repository.commit("master") }
......
require 'spec_helper' require 'spec_helper'
describe Projects::CommitsController do describe Projects::CommitsController do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
before do before do
......
require 'spec_helper' require 'spec_helper'
describe Projects::MergeRequestsController do describe Projects::MergeRequestsController do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") } let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project, target_branch: "stable", source_branch: "master") }
......
require 'spec_helper' require 'spec_helper'
describe Projects::TreeController do describe Projects::TreeController do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
before do before do
......
...@@ -27,43 +27,16 @@ FactoryGirl.define do ...@@ -27,43 +27,16 @@ FactoryGirl.define do
factory :admin, traits: [:admin] factory :admin, traits: [:admin]
end end
factory :project do factory :empty_project, class: 'Project' do
sequence(:name) { |n| "project#{n}" } sequence(:name) { |n| "project#{n}" }
path { name.downcase.gsub(/\s/, '_') } path { name.downcase.gsub(/\s/, '_') }
namespace namespace
creator creator
trait :source do
sequence(:name) { |n| "source project#{n}" }
end
trait :target do
sequence(:name) { |n| "target project#{n}" }
end
factory :source_project, traits: [:source]
factory :target_project, traits: [:target]
end
factory :redmine_project, parent: :project do
issues_tracker { "redmine" }
issues_tracker_id { "project_name_in_redmine" }
end end
factory :project_with_code, parent: :project do factory :project, parent: :empty_project do
path { 'gitlabhq' } path { 'gitlabhq' }
trait :source_path do
path { 'source_gitlabhq' }
end
trait :target_path do
path { 'target_gitlabhq' }
end
factory :source_project_with_code, traits: [:source, :source_path]
factory :target_project_with_code, traits: [:target, :target_path]
after :create do |project| after :create do |project|
TestEnv.clear_repo_dir(project.namespace, project.path) TestEnv.clear_repo_dir(project.namespace, project.path)
TestEnv.reset_satellite_dir TestEnv.reset_satellite_dir
...@@ -71,6 +44,11 @@ FactoryGirl.define do ...@@ -71,6 +44,11 @@ FactoryGirl.define do
end end
end end
factory :redmine_project, parent: :project do
issues_tracker { "redmine" }
issues_tracker_id { "project_name_in_redmine" }
end
factory :group do factory :group do
sequence(:name) { |n| "group#{n}" } sequence(:name) { |n| "group#{n}" }
path { name.downcase.gsub(/\s/, '_') } path { name.downcase.gsub(/\s/, '_') }
...@@ -109,25 +87,45 @@ FactoryGirl.define do ...@@ -109,25 +87,45 @@ FactoryGirl.define do
factory :merge_request do factory :merge_request do
title title
author author
source_project factory: :source_project_with_code source_project factory: :project
target_project factory: :target_project_with_code target_project { source_project }
# → git log stable..master --pretty=oneline
# b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828 tree css fixes
# 8716fc78f3c65bbf7bcf7b574febd583bc5d2812 Added loading animation for notes
# cd5c4bac5042c5469dcdf7e7b2f768d3c6fd7088 notes count for wall
# 8470d70da67355c9c009e4401746b1d5410af2e3 notes controller refactored
# 1e689bfba39525ead225eaf611948cfbe8ac34cf fixed notes logic
# f0f14c8eaba69ebddd766498a9d0b0e79becd633 finished scss refactoring
# 3a4b4fb4cde7809f033822a171b9feae19d41fff Moving ui styles to one scss file, Added ui class to body
# 065c200c33f68c2bb781e35a43f9dc8138a893b5 removed unnecessary hr tags & titles
# 1e8b111be85df0db6c8000ef9a710bc0221eae83 Merge branch 'master' of github.com:gitlabhq/gitlabhq
# f403da73f5e62794a0447aca879360494b08f678 Fixed ajax loading image. Fixed wrong wording
# e6ea73c77600d413d370249b8e392734f7d1dbee Merge pull request #468 from bencevans/patch-1
# 4a3c05b69355deee25767a74d0512ec4b510d4ef Merge pull request #470 from bgondy/patch-1
# 0347fe2412eb51d3efeccc35210e9268bc765ac5 Update app/views/projects/team.html.haml
# 2b5c61bdece1f7eb2b901ceea7d364065cdf76ac Title for a link fixed
# 460eeb13b7560b40104044973ff933b1a6dbbcaa Increased count of notes loaded when visit wall page
# 21c141afb1c53a9180a99d2cca29ffa613eb7e3a Merge branch 'notes_refactoring'
# 292a41cbe295f16f7148913b31eb0fb91f3251c3 Fixed comments for snippets. Tests fixed
# d41d8ffb02fa74fd4571603548bd7e401ec99e0c Reply button, Comments for Merge Request diff
# b1a36b552be2a7a6bc57fbed6c52dc6ed82111f8 Merge pull request #466 from skroutz/no-rbenv
# db75dae913e8365453ca231f101b067314a7ea71 Merge pull request #465 from skroutz/branches_commit_link
# 75f040fbfe4b5af23ff004ad3207c3976df097a8 Don't enforce rbenv version
# e42fb4fda475370dcb0d8f8f1268bfdc7a0cc437 Fix broken commit link in branches page
# 215a01f63ccdc085f75a48f6f7ab6f2b15b5852c move notes login to one controller
# 81092c01984a481e312de10a28e3f1a6dda182a3 Status codes for errors, New error pages
# 7d279f9302151e3c8f4c5df9c5200a72799409b9 better error handling for not found resource, gitolite error
# 9e6d0710e927aa8ea834b8a9ae9f277be617ac7d Merge pull request #443 from CedricGatay/fix/incorrectLineNumberingInDiff
# 6ea87c47f0f8a24ae031c3fff17bc913889ecd00 Incorrect line numbering in diff
#
# → git log master..stable --pretty=oneline
# empty
source_branch "master" source_branch "master"
target_branch "stable" target_branch "stable"
# pick 3 commits "at random" (from bcf03b5d~3 to bcf03b5d)
trait :with_diffs do trait :with_diffs do
target_branch "master" # pretend bcf03b5d~3
source_branch "stable" # pretend bcf03b5d
st_commits do
[
source_project.repository.commit('bcf03b5d').to_hash,
source_project.repository.commit('bcf03b5d~1').to_hash,
source_project.repository.commit('bcf03b5d~2').to_hash
]
end
st_diffs do
source_project.repo.diff("bcf03b5d~3", "bcf03b5d")
end
end end
trait :closed do trait :closed do
...@@ -156,7 +154,7 @@ FactoryGirl.define do ...@@ -156,7 +154,7 @@ FactoryGirl.define do
factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment] factory :note_on_merge_request_with_attachment, traits: [:on_merge_request, :with_attachment]
trait :on_commit do trait :on_commit do
project factory: :project_with_code project factory: :project
commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a" commit_id "bcf03b5de6c33f3869ef70d68cf06e679d1d7f9a"
noteable_type "Commit" noteable_type "Commit"
end end
...@@ -166,7 +164,7 @@ FactoryGirl.define do ...@@ -166,7 +164,7 @@ FactoryGirl.define do
end end
trait :on_merge_request do trait :on_merge_request do
project factory: :project_with_code project factory: :project
noteable_id 1 noteable_id 1
noteable_type "MergeRequest" noteable_type "MergeRequest"
end end
......
require 'spec_helper' require 'spec_helper'
describe "GitLab Flavored Markdown" do describe "GitLab Flavored Markdown" do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:issue) { create(:issue, project: project) } let(:issue) { create(:issue, project: project) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:fred) do let(:fred) do
......
require 'spec_helper' require 'spec_helper'
describe "On a merge request", js: true do describe "On a merge request", js: true do
let!(:project) { create(:project_with_code) } let!(:project) { create(:project) }
let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) } let!(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let!(:note) { create(:note_on_merge_request_with_attachment, project: project) } let!(:note) { create(:note_on_merge_request_with_attachment, project: project) }
...@@ -135,7 +135,7 @@ describe "On a merge request", js: true do ...@@ -135,7 +135,7 @@ describe "On a merge request", js: true do
end end
describe "On a merge request diff", js: true, focus: true do describe "On a merge request diff", js: true, focus: true do
let!(:project) { create(:source_project_with_code) } let!(:project) { create(:project) }
let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) } let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
before do before do
...@@ -149,7 +149,7 @@ describe "On a merge request diff", js: true, focus: true do ...@@ -149,7 +149,7 @@ describe "On a merge request diff", js: true, focus: true do
describe "when adding a note" do describe "when adding a note" do
before do before do
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
end end
describe "the notes holder" do describe "the notes holder" do
...@@ -159,23 +159,14 @@ describe "On a merge request diff", js: true, focus: true do ...@@ -159,23 +159,14 @@ describe "On a merge request diff", js: true, focus: true do
end end
describe "the note form" do describe "the note form" do
# FIXME
#it 'should be valid' do
#within(".js-temp-notes-holder") { find("#note_noteable_type").value.should == "MergeRequest" }
#within(".js-temp-notes-holder") { find("#note_noteable_id").value.should == merge_request.id.to_s }
#within(".js-temp-notes-holder") { find("#note_commit_id").value.should == "" }
#within(".js-temp-notes-holder") { find("#note_line_code").value.should == "4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185" }
#should have_css(".js-close-discussion-note-form", text: "Cancel")
#end
it "shouldn't add a second form for same row" do it "shouldn't add a second form for same row" do
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
should have_css("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder form", count: 1) should have_css("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185'] + .js-temp-notes-holder form", count: 1)
end end
it "should be removed when canceled" do it "should be removed when canceled" do
within(".file form[rel$='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185']") do within(".file form[rel$='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185']") do
find(".js-close-discussion-note-form").trigger("click") find(".js-close-discussion-note-form").trigger("click")
end end
...@@ -185,11 +176,11 @@ describe "On a merge request diff", js: true, focus: true do ...@@ -185,11 +176,11 @@ describe "On a merge request diff", js: true, focus: true do
end end
describe "with muliple note forms" do describe "with muliple note forms" do
let!(:project) { create(:source_project_with_code) } let!(:project) { create(:project) }
let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) } let!(:merge_request) { create(:merge_request_with_diffs, source_project: project, target_project: project) }
before do before do
find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185"]').click find('a[data-line-code="4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185"]').click
find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click find('a[data-line-code="342e16cbbd482ac2047dc679b2749d248cc1428f_18_17"]').click
end end
...@@ -198,7 +189,7 @@ describe "On a merge request diff", js: true, focus: true do ...@@ -198,7 +189,7 @@ describe "On a merge request diff", js: true, focus: true do
describe "previewing them separately" do describe "previewing them separately" do
before do before do
# add two separate texts and trigger previews on both # add two separate texts and trigger previews on both
within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_185_185'] + .js-temp-notes-holder") do within("tr[id='4735dfc552ad7bf15ca468adc3cad9d05b624490_172_185'] + .js-temp-notes-holder") do
fill_in "note[note]", with: "One comment on line 185" fill_in "note[note]", with: "One comment on line 185"
find(".js-note-preview-button").trigger("click") find(".js-note-preview-button").trigger("click")
end end
......
require 'spec_helper' require 'spec_helper'
describe "Internal Project Access" do describe "Internal Project Access" do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:master) { create(:user) } let(:master) { create(:user) }
let(:guest) { create(:user) } let(:guest) { create(:user) }
......
require 'spec_helper' require 'spec_helper'
describe "Private Project Access" do describe "Private Project Access" do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:master) { create(:user) } let(:master) { create(:user) }
let(:guest) { create(:user) } let(:guest) { create(:user) }
......
require 'spec_helper' require 'spec_helper'
describe "Public Project Access" do describe "Public Project Access" do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:master) { create(:user) } let(:master) { create(:user) }
let(:guest) { create(:user) } let(:guest) { create(:user) }
......
...@@ -4,7 +4,7 @@ describe GitlabMarkdownHelper do ...@@ -4,7 +4,7 @@ describe GitlabMarkdownHelper do
include ApplicationHelper include ApplicationHelper
include IssuesHelper include IssuesHelper
let!(:project) { create(:project_with_code) } let!(:project) { create(:project) }
let(:user) { create(:user, username: 'gfm') } let(:user) { create(:user, username: 'gfm') }
let(:commit) { project.repository.commit } let(:commit) { project.repository.commit }
......
...@@ -43,7 +43,7 @@ describe SearchHelper do ...@@ -43,7 +43,7 @@ describe SearchHelper do
end end
context "with a current project" do context "with a current project" do
before { @project = create(:project_with_code) } before { @project = create(:project) }
it "includes project-specific sections" do it "includes project-specific sections" do
search_autocomplete_opts("Files").size.should == 1 search_autocomplete_opts("Files").size.should == 1
......
...@@ -43,7 +43,7 @@ describe Gitlab::ReferenceExtractor do ...@@ -43,7 +43,7 @@ describe Gitlab::ReferenceExtractor do
end end
context 'with a project' do context 'with a project' do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
it 'accesses valid user objects on the project team' do it 'accesses valid user objects on the project team' do
@u_foo = create(:user, username: 'foo') @u_foo = create(:user, username: 'foo')
......
require 'spec_helper' require 'spec_helper'
describe 'Gitlab::Satellite::Action' do describe 'Gitlab::Satellite::Action' do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:user) { create(:user) } let(:user) { create(:user) }
describe '#prepare_satellite!' do describe '#prepare_satellite!' do
......
...@@ -12,9 +12,10 @@ describe 'Gitlab::Satellite::MergeAction' do ...@@ -12,9 +12,10 @@ describe 'Gitlab::Satellite::MergeAction' do
@close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633'] @close_commit2 = ['scss_refactoring', 'f0f14c8eaba69ebddd766498a9d0b0e79becd633']
end end
let(:project) { create(:project_with_code) } let(:project) { create(:project, namespace: create(:group)) }
let(:fork_project) { create(:project, namespace: create(:group)) }
let(:merge_request) { create(:merge_request, source_project: project, target_project: project) } let(:merge_request) { create(:merge_request, source_project: project, target_project: project) }
let(:merge_request_fork) { create(:merge_request) } let(:merge_request_fork) { create(:merge_request, source_project: fork_project, target_project: project) }
describe '#commits_between' do describe '#commits_between' do
def verify_commits(commits, first_commit_sha, last_commit_sha) def verify_commits(commits, first_commit_sha, last_commit_sha)
......
...@@ -5,7 +5,7 @@ describe Notify do ...@@ -5,7 +5,7 @@ describe Notify do
include EmailSpec::Matchers include EmailSpec::Matchers
let(:recipient) { create(:user, email: 'recipient@example.com') } let(:recipient) { create(:user, email: 'recipient@example.com') }
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
shared_examples 'a multiple recipients email' do shared_examples 'a multiple recipients email' do
it 'is sent to the given recipient' do it 'is sent to the given recipient' do
......
...@@ -25,7 +25,7 @@ describe AssemblaService do ...@@ -25,7 +25,7 @@ describe AssemblaService do
describe "Execute" do describe "Execute" do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
before do before do
@assembla_service = AssemblaService.new @assembla_service = AssemblaService.new
......
require 'spec_helper' require 'spec_helper'
describe Commit do describe Commit do
let(:project) { create :project_with_code } let(:project) { create :project }
let(:commit) { project.repository.commit } let(:commit) { project.repository.commit }
describe '#title' do describe '#title' do
......
...@@ -25,7 +25,7 @@ describe FlowdockService do ...@@ -25,7 +25,7 @@ describe FlowdockService do
describe "Execute" do describe "Execute" do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
before do before do
@flowdock_service = FlowdockService.new @flowdock_service = FlowdockService.new
......
...@@ -73,14 +73,13 @@ describe MergeRequest do ...@@ -73,14 +73,13 @@ describe MergeRequest do
describe '#for_fork?' do describe '#for_fork?' do
it 'returns true if the merge request is for a fork' do it 'returns true if the merge request is for a fork' do
subject.source_project = create(:source_project) subject.source_project = create(:project, namespace: create(:group))
subject.target_project = create(:target_project) subject.target_project = create(:project, namespace: create(:group))
subject.for_fork?.should be_true subject.for_fork?.should be_true
end end
it 'returns false if is not for a fork' do it 'returns false if is not for a fork' do
subject.source_project = create(:source_project)
subject.target_project = subject.source_project
subject.for_fork?.should be_false subject.for_fork?.should be_false
end end
end end
......
...@@ -206,7 +206,7 @@ describe Note do ...@@ -206,7 +206,7 @@ describe Note do
end end
describe '#create_cross_reference_note' do describe '#create_cross_reference_note' do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:author) { create(:user) } let(:author) { create(:user) }
let(:issue) { create(:issue, project: project) } let(:issue) { create(:issue, project: project) }
let(:mergereq) { create(:merge_request, target_project: project) } let(:mergereq) { create(:merge_request, target_project: project) }
......
...@@ -128,7 +128,7 @@ describe Project do ...@@ -128,7 +128,7 @@ describe Project do
end end
describe :update_merge_requests do describe :update_merge_requests do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
before do before do
@merge_request = create(:merge_request, source_project: project, target_project: project) @merge_request = create(:merge_request, source_project: project, target_project: project)
...@@ -136,7 +136,7 @@ describe Project do ...@@ -136,7 +136,7 @@ describe Project do
end end
it "should close merge request if last commit from source branch was pushed to target branch" do it "should close merge request if last commit from source branch was pushed to target branch" do
@merge_request.reloaded_commits @merge_request.reload_code
@merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828" @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user) project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/stable", @key.user)
@merge_request.reload @merge_request.reload
...@@ -144,7 +144,6 @@ describe Project do ...@@ -144,7 +144,6 @@ describe Project do
end end
it "should update merge request commits with new one if pushed to source branch" do it "should update merge request commits with new one if pushed to source branch" do
@merge_request.last_commit.should == nil
project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user) project.update_merge_requests("8716fc78f3c65bbf7bcf7b574febd583bc5d2812", "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828", "refs/heads/master", @key.user)
@merge_request.reload @merge_request.reload
@merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828" @merge_request.last_commit.id.should == "b1e6a9dbf1c85e6616497a5e7bad9143a4bd0828"
...@@ -156,10 +155,10 @@ describe Project do ...@@ -156,10 +155,10 @@ describe Project do
context 'with namespace' do context 'with namespace' do
before do before do
@group = create :group, name: 'gitlab' @group = create :group, name: 'gitlab'
@project = create(:project, name: 'gitlab-ci', namespace: @group) @project = create(:project, name: 'gitlabhq', namespace: @group)
end end
it { Project.find_with_namespace('gitlab/gitlab-ci').should == @project } it { Project.find_with_namespace('gitlab/gitlabhq').should == @project }
it { Project.find_with_namespace('gitlab-ci').should be_nil } it { Project.find_with_namespace('gitlab-ci').should be_nil }
end end
end end
...@@ -168,10 +167,10 @@ describe Project do ...@@ -168,10 +167,10 @@ describe Project do
context 'with namespace' do context 'with namespace' do
before do before do
@group = create :group, name: 'gitlab' @group = create :group, name: 'gitlab'
@project = create(:project, name: 'gitlab-ci', namespace: @group) @project = create(:project, name: 'gitlabhq', namespace: @group)
end end
it { @project.to_param.should == "gitlab/gitlab-ci" } it { @project.to_param.should == "gitlab/gitlabhq" }
end end
end end
...@@ -237,7 +236,7 @@ describe Project do ...@@ -237,7 +236,7 @@ describe Project do
end end
describe :open_branches do describe :open_branches do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
before do before do
project.protected_branches.create(name: 'master') project.protected_branches.create(name: 'master')
......
...@@ -44,12 +44,12 @@ describe Service do ...@@ -44,12 +44,12 @@ describe Service do
end end
describe :can_test do describe :can_test do
it { @testable.should == false } it { @testable.should == true }
end end
end end
describe "With commits" do describe "With commits" do
let (:project) { create :project_with_code } let (:project) { create :project }
before do before do
@service.stub( @service.stub(
......
...@@ -4,16 +4,17 @@ describe MergeRequestObserver do ...@@ -4,16 +4,17 @@ describe MergeRequestObserver do
let(:some_user) { create :user } let(:some_user) { create :user }
let(:assignee) { create :user } let(:assignee) { create :user }
let(:author) { create :user } let(:author) { create :user }
let(:project) { create :project }
let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object } let(:mr_mock) { double(:merge_request, id: 42, assignee: assignee, author: author).as_null_object }
let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, target_project: create(:project)) } let(:assigned_mr) { create(:merge_request, assignee: assignee, author: author, source_project: project) }
let(:unassigned_mr) { create(:merge_request, author: author, target_project: create(:project)) } let(:unassigned_mr) { create(:merge_request, author: author, source_project: project) }
let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, target_project: create(:project)) } let(:closed_assigned_mr) { create(:closed_merge_request, assignee: assignee, author: author, source_project: project) }
let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, target_project: create(:project)) } let(:closed_unassigned_mr) { create(:closed_merge_request, author: author, source_project: project) }
before { subject.stub(:current_user).and_return(some_user) } before { subject.stub(:current_user).and_return(some_user) }
before { subject.stub(notification: double('NotificationService').as_null_object) } before { subject.stub(notification: double('NotificationService').as_null_object) }
before { mr_mock.stub(:author_id) } before { mr_mock.stub(:author_id) }
before { mr_mock.stub(:target_project) } before { mr_mock.stub(:source_project) }
before { mr_mock.stub(:source_project) } before { mr_mock.stub(:source_project) }
before { mr_mock.stub(:project) } before { mr_mock.stub(:project) }
before { mr_mock.stub(:create_cross_references!).and_return(true) } before { mr_mock.stub(:create_cross_references!).and_return(true) }
...@@ -46,7 +47,7 @@ describe MergeRequestObserver do ...@@ -46,7 +47,7 @@ describe MergeRequestObserver do
end end
it 'is called when a merge request is changed' do it 'is called when a merge request is changed' do
changed = create(:merge_request, source_project: create(:project)) changed = create(:merge_request, source_project: project)
subject.should_receive(:after_update) subject.should_receive(:after_update)
MergeRequest.observers.enable :merge_request_observer do MergeRequest.observers.enable :merge_request_observer do
...@@ -81,13 +82,13 @@ describe MergeRequestObserver do ...@@ -81,13 +82,13 @@ describe MergeRequestObserver do
context '#after_close' do context '#after_close' do
context 'a status "closed"' do context 'a status "closed"' do
it 'note is created if the merge request is being closed' do it 'note is created if the merge request is being closed' do
Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.target_project, some_user, 'closed', nil) Note.should_receive(:create_status_change_note).with(assigned_mr, assigned_mr.source_project, some_user, 'closed', nil)
assigned_mr.close assigned_mr.close
end end
it 'notification is delivered only to author if the merge request is being closed' do it 'notification is delivered only to author if the merge request is being closed' do
Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.target_project, some_user, 'closed', nil) Note.should_receive(:create_status_change_note).with(unassigned_mr, unassigned_mr.source_project, some_user, 'closed', nil)
unassigned_mr.close unassigned_mr.close
end end
...@@ -97,13 +98,13 @@ describe MergeRequestObserver do ...@@ -97,13 +98,13 @@ describe MergeRequestObserver do
context '#after_reopen' do context '#after_reopen' do
context 'a status "reopened"' do context 'a status "reopened"' do
it 'note is created if the merge request is being reopened' do it 'note is created if the merge request is being reopened' do
Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.target_project, some_user, 'reopened', nil) Note.should_receive(:create_status_change_note).with(closed_assigned_mr, closed_assigned_mr.source_project, some_user, 'reopened', nil)
closed_assigned_mr.reopen closed_assigned_mr.reopen
end end
it 'notification is delivered only to author if the merge request is being reopened' do it 'notification is delivered only to author if the merge request is being reopened' do
Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.target_project, some_user, 'reopened', nil) Note.should_receive(:create_status_change_note).with(closed_unassigned_mr, closed_unassigned_mr.source_project, some_user, 'reopened', nil)
closed_unassigned_mr.reopen closed_unassigned_mr.reopen
end end
...@@ -118,20 +119,13 @@ describe MergeRequestObserver do ...@@ -118,20 +119,13 @@ describe MergeRequestObserver do
it { @event.project.should == project } it { @event.project.should == project }
end end
let(:project) { create(:project) }
before do before do
TestEnv.enable_observers @merge_request = create(:merge_request, source_project: project, source_project: project)
@merge_request = create(:merge_request, source_project: project, target_project: project)
@event = Event.last @event = Event.last
end end
after do
TestEnv.disable_observers
end
it_should_be_valid_event it_should_be_valid_event
it { @event.action.should == Event::CREATED } it { @event.action.should == Event::CREATED }
it { @event.target.should == @merge_request } it { @event.target.should == @merge_request }
end end
end end
...@@ -6,7 +6,7 @@ describe API::API do ...@@ -6,7 +6,7 @@ describe API::API do
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
let(:user) { create(:user) } let(:user) { create(:user) }
let!(:project) { create(:project_with_code, namespace: user.namespace ) } let!(:project) { create(:project, namespace: user.namespace ) }
before { project.team << [user, :developer] } before { project.team << [user, :developer] }
describe "POST /projects/:id/repository/files" do describe "POST /projects/:id/repository/files" do
......
...@@ -5,7 +5,7 @@ describe API::API do ...@@ -5,7 +5,7 @@ describe API::API do
before(:each) { ActiveRecord::Base.observers.enable(:user_observer) } before(:each) { ActiveRecord::Base.observers.enable(:user_observer) }
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
let(:user) { create(:user) } let(:user) { create(:user) }
let!(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) } let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
before { before {
project.team << [user, :reporters] project.team << [user, :reporters]
...@@ -47,32 +47,32 @@ describe API::API do ...@@ -47,32 +47,32 @@ describe API::API do
context 'between branches projects' do context 'between branches projects' do
it "should return merge_request" do it "should return merge_request" do
post api("/projects/#{project.id}/merge_requests", user), post api("/projects/#{project.id}/merge_requests", user),
title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
response.status.should == 201 response.status.should == 201
json_response['title'].should == 'Test merge_request' json_response['title'].should == 'Test merge_request'
end end
it "should return 422 when source_branch equals target_branch" do it "should return 422 when source_branch equals target_branch" do
post api("/projects/#{project.id}/merge_requests", user), post api("/projects/#{project.id}/merge_requests", user),
title: "Test merge_request", source_branch: "master", target_branch: "master", author: user title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
response.status.should == 422 response.status.should == 422
end end
it "should return 400 when source_branch is missing" do it "should return 400 when source_branch is missing" do
post api("/projects/#{project.id}/merge_requests", user), post api("/projects/#{project.id}/merge_requests", user),
title: "Test merge_request", target_branch: "master", author: user title: "Test merge_request", target_branch: "master", author: user
response.status.should == 400 response.status.should == 400
end end
it "should return 400 when target_branch is missing" do it "should return 400 when target_branch is missing" do
post api("/projects/#{project.id}/merge_requests", user), post api("/projects/#{project.id}/merge_requests", user),
title: "Test merge_request", source_branch: "stable", author: user title: "Test merge_request", source_branch: "stable", author: user
response.status.should == 400 response.status.should == 400
end end
it "should return 400 when title is missing" do it "should return 400 when title is missing" do
post api("/projects/#{project.id}/merge_requests", user), post api("/projects/#{project.id}/merge_requests", user),
target_branch: 'master', source_branch: 'stable' target_branch: 'master', source_branch: 'stable'
response.status.should == 400 response.status.should == 400
end end
end end
...@@ -80,8 +80,8 @@ describe API::API do ...@@ -80,8 +80,8 @@ describe API::API do
context 'forked projects' do context 'forked projects' do
let!(:user2) {create(:user)} let!(:user2) {create(:user)}
let!(:forked_project_link) { build(:forked_project_link) } let!(:forked_project_link) { build(:forked_project_link) }
let!(:fork_project) { create(:source_project_with_code, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) } let!(:fork_project) { create(:project, forked_project_link: forked_project_link, namespace: user2.namespace, creator_id: user2.id) }
let!(:unrelated_project) { create(:target_project_with_code, namespace: user2.namespace, creator_id: user2.id) } let!(:unrelated_project) { create(:project, namespace: create(:user).namespace, creator_id: user2.id) }
before :each do |each| before :each do |each|
fork_project.team << [user2, :reporters] fork_project.team << [user2, :reporters]
...@@ -92,7 +92,7 @@ describe API::API do ...@@ -92,7 +92,7 @@ describe API::API do
it "should return merge_request" do it "should return merge_request" do
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id
response.status.should == 201 response.status.should == 201
json_response['title'].should == 'Test merge_request' json_response['title'].should == 'Test merge_request'
end end
...@@ -102,44 +102,44 @@ describe API::API do ...@@ -102,44 +102,44 @@ describe API::API do
fork_project.forked?.should be_true fork_project.forked?.should be_true
fork_project.forked_from_project.should == project fork_project.forked_from_project.should == project
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
response.status.should == 201 response.status.should == 201
json_response['title'].should == 'Test merge_request' json_response['title'].should == 'Test merge_request'
end end
it "should return 400 when source_branch is missing" do it "should return 400 when source_branch is missing" do
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
response.status.should == 400 response.status.should == 400
end end
it "should return 400 when target_branch is missing" do it "should return 400 when target_branch is missing" do
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
response.status.should == 400 response.status.should == 400
end end
it "should return 400 when title is missing" do it "should return 400 when title is missing" do
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
response.status.should == 400 response.status.should == 400
end end
it "should return 400 when target_branch is specified and not a forked project" do it "should return 400 when target_branch is specified and not a forked project" do
post api("/projects/#{project.id}/merge_requests", user), post api("/projects/#{project.id}/merge_requests", user),
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
response.status.should == 400 response.status.should == 400
end end
it "should return 400 when target_branch is specified and for a different fork" do it "should return 400 when target_branch is specified and for a different fork" do
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
response.status.should == 400 response.status.should == 400
end end
it "should return 201 when target_branch is specified and for the same project" do it "should return 201 when target_branch is specified and for the same project" do
post api("/projects/#{fork_project.id}/merge_requests", user2), post api("/projects/#{fork_project.id}/merge_requests", user2),
title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
response.status.should == 201 response.status.should == 201
end end
end end
...@@ -170,7 +170,7 @@ describe API::API do ...@@ -170,7 +170,7 @@ describe API::API do
it "should return 422 when source_branch and target_branch are renamed the same" do it "should return 422 when source_branch and target_branch are renamed the same" do
put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
source_branch: "master", target_branch: "master" source_branch: "master", target_branch: "master"
response.status.should == 422 response.status.should == 422
end end
...@@ -198,5 +198,4 @@ describe API::API do ...@@ -198,5 +198,4 @@ describe API::API do
response.status.should == 404 response.status.should == 404
end end
end end
end end
...@@ -7,7 +7,7 @@ describe API::API, 'ProjectHooks' do ...@@ -7,7 +7,7 @@ describe API::API, 'ProjectHooks' do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:user3) { create(:user) } let(:user3) { create(:user) }
let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) } let!(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
let!(:hook) { create(:project_hook, project: project, url: "http://example.com") } let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
before do before do
......
...@@ -9,14 +9,14 @@ describe API::API do ...@@ -9,14 +9,14 @@ describe API::API do
let(:user2) { create(:user) } let(:user2) { create(:user) }
let(:user3) { create(:user) } let(:user3) { create(:user) }
let(:admin) { create(:admin) } let(:admin) { create(:admin) }
let!(:project) { create(:project_with_code, creator_id: user.id, namespace: user.namespace) } let(:project) { create(:project, creator_id: user.id, namespace: user.namespace) }
let!(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') } let(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) } let(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) } let(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
before { project.team << [user, :reporter] }
describe "GET /projects" do describe "GET /projects" do
before { project }
context "when unauthenticated" do context "when unauthenticated" do
it "should return authentication error" do it "should return authentication error" do
get api("/projects") get api("/projects")
...@@ -36,6 +36,8 @@ describe API::API do ...@@ -36,6 +36,8 @@ describe API::API do
end end
describe "GET /projects/all" do describe "GET /projects/all" do
before { project }
context "when unauthenticated" do context "when unauthenticated" do
it "should return authentication error" do it "should return authentication error" do
get api("/projects/all") get api("/projects/all")
...@@ -174,6 +176,7 @@ describe API::API do ...@@ -174,6 +176,7 @@ describe API::API do
end end
describe "POST /projects/user/:id" do describe "POST /projects/user/:id" do
before { project }
before { admin } before { admin }
it "should create new project without path" do it "should create new project without path" do
...@@ -255,6 +258,8 @@ describe API::API do ...@@ -255,6 +258,8 @@ describe API::API do
end end
describe "GET /projects/:id" do describe "GET /projects/:id" do
before { project }
it "should return a project by id" do it "should return a project by id" do
get api("/projects/#{project.id}", user) get api("/projects/#{project.id}", user)
response.status.should == 200 response.status.should == 200
...@@ -282,6 +287,8 @@ describe API::API do ...@@ -282,6 +287,8 @@ describe API::API do
end end
describe "GET /projects/:id/events" do describe "GET /projects/:id/events" do
before { users_project }
it "should return a project events" do it "should return a project events" do
get api("/projects/#{project.id}/events", user) get api("/projects/#{project.id}/events", user)
response.status.should == 200 response.status.should == 200
...@@ -305,6 +312,9 @@ describe API::API do ...@@ -305,6 +312,9 @@ describe API::API do
end end
describe "GET /projects/:id/members" do describe "GET /projects/:id/members" do
before { users_project }
before { users_project2 }
it "should return project team members" do it "should return project team members" do
get api("/projects/#{project.id}/members", user) get api("/projects/#{project.id}/members", user)
response.status.should == 200 response.status.should == 200
...@@ -328,6 +338,8 @@ describe API::API do ...@@ -328,6 +338,8 @@ describe API::API do
end end
describe "GET /projects/:id/members/:user_id" do describe "GET /projects/:id/members/:user_id" do
before { users_project }
it "should return project team member" do it "should return project team member" do
get api("/projects/#{project.id}/members/#{user.id}", user) get api("/projects/#{project.id}/members/#{user.id}", user)
response.status.should == 200 response.status.should == 200
...@@ -383,6 +395,8 @@ describe API::API do ...@@ -383,6 +395,8 @@ describe API::API do
end end
describe "PUT /projects/:id/members/:user_id" do describe "PUT /projects/:id/members/:user_id" do
before { users_project2 }
it "should update project team member" do it "should update project team member" do
put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER put api("/projects/#{project.id}/members/#{user3.id}", user), access_level: UsersProject::MASTER
response.status.should == 200 response.status.should == 200
...@@ -407,6 +421,9 @@ describe API::API do ...@@ -407,6 +421,9 @@ describe API::API do
end end
describe "DELETE /projects/:id/members/:user_id" do describe "DELETE /projects/:id/members/:user_id" do
before { users_project }
before { users_project2 }
it "should remove user from project team" do it "should remove user from project team" do
expect { expect {
delete api("/projects/#{project.id}/members/#{user3.id}", user) delete api("/projects/#{project.id}/members/#{user3.id}", user)
...@@ -425,9 +442,7 @@ describe API::API do ...@@ -425,9 +442,7 @@ describe API::API do
delete api("/projects/#{project.id}/members/#{user3.id}", user) delete api("/projects/#{project.id}/members/#{user3.id}", user)
response.status.should == 200 response.status.should == 200
end end
end
describe "DELETE /projects/:id/members/:user_id" do
it "should return 200 OK when the user was not member" do it "should return 200 OK when the user was not member" do
expect { expect {
delete api("/projects/#{project.id}/members/1000000", user) delete api("/projects/#{project.id}/members/1000000", user)
...@@ -439,6 +454,8 @@ describe API::API do ...@@ -439,6 +454,8 @@ describe API::API do
end end
describe "GET /projects/:id/snippets" do describe "GET /projects/:id/snippets" do
before { snippet }
it "should return an array of project snippets" do it "should return an array of project snippets" do
get api("/projects/#{project.id}/snippets", user) get api("/projects/#{project.id}/snippets", user)
response.status.should == 200 response.status.should == 200
...@@ -505,6 +522,8 @@ describe API::API do ...@@ -505,6 +522,8 @@ describe API::API do
end end
describe "DELETE /projects/:id/snippets/:snippet_id" do describe "DELETE /projects/:id/snippets/:snippet_id" do
before { snippet }
it "should delete existing project snippet" do it "should delete existing project snippet" do
expect { expect {
delete api("/projects/#{project.id}/snippets/#{snippet.id}", user) delete api("/projects/#{project.id}/snippets/#{snippet.id}", user)
...@@ -657,15 +676,15 @@ describe API::API do ...@@ -657,15 +676,15 @@ describe API::API do
describe "GET /projects/search/:query" do describe "GET /projects/search/:query" do
let!(:query) { 'query'} let!(:query) { 'query'}
let!(:search) { create(:project, name: query, creator_id: user.id, namespace: user.namespace) } let!(:search) { create(:empty_project, name: query, creator_id: user.id, namespace: user.namespace) }
let!(:pre) { create(:project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) } let!(:pre) { create(:empty_project, name: "pre_#{query}", creator_id: user.id, namespace: user.namespace) }
let!(:post) { create(:project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) } let!(:post) { create(:empty_project, name: "#{query}_post", creator_id: user.id, namespace: user.namespace) }
let!(:pre_post) { create(:project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) } let!(:pre_post) { create(:empty_project, name: "pre_#{query}_post", creator_id: user.id, namespace: user.namespace) }
let!(:unfound) { create(:project, name: 'unfound', creator_id: user.id, namespace: user.namespace) } let!(:unfound) { create(:empty_project, name: 'unfound', creator_id: user.id, namespace: user.namespace) }
let!(:internal) { create(:project, name: "internal #{query}", visibility_level: Gitlab::VisibilityLevel::INTERNAL) } let!(:internal) { create(:empty_project, name: "internal #{query}", visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
let!(:unfound_internal) { create(:project, name: 'unfound internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL) } let!(:unfound_internal) { create(:empty_project, name: 'unfound internal', visibility_level: Gitlab::VisibilityLevel::INTERNAL) }
let!(:public) { create(:project, name: "public #{query}", visibility_level: Gitlab::VisibilityLevel::PUBLIC) } let!(:public) { create(:empty_project, name: "public #{query}", visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
let!(:unfound_public) { create(:project, name: 'unfound public', visibility_level: Gitlab::VisibilityLevel::PUBLIC) } let!(:unfound_public) { create(:empty_project, name: 'unfound public', visibility_level: Gitlab::VisibilityLevel::PUBLIC) }
context "when unauthenticated" do context "when unauthenticated" do
it "should return authentication error" do it "should return authentication error" do
......
...@@ -8,7 +8,7 @@ describe API::API do ...@@ -8,7 +8,7 @@ describe API::API do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:user2) { create(:user) } let(:user2) { create(:user) }
let!(:project) { create(:project_with_code, creator_id: user.id) } let!(:project) { create(:project, creator_id: user.id) }
let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) } let!(:master) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) } let!(:guest) { create(:users_project, user: user2, project: project, project_access: UsersProject::GUEST) }
......
...@@ -6,7 +6,7 @@ describe API::API do ...@@ -6,7 +6,7 @@ describe API::API do
after(:each) { ActiveRecord::Base.observers.disable(:user_observer) } after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) } let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) }
describe "POST /projects/:id/services/gitlab-ci" do describe "POST /projects/:id/services/gitlab-ci" do
it "should update gitlab-ci settings" do it "should update gitlab-ci settings" do
......
...@@ -2,7 +2,7 @@ require 'spec_helper' ...@@ -2,7 +2,7 @@ require 'spec_helper'
describe GitPushService do describe GitPushService do
let (:user) { create :user } let (:user) { create :user }
let (:project) { create :project_with_code } let (:project) { create :project }
let (:service) { GitPushService.new } let (:service) { GitPushService.new }
before do before do
......
...@@ -2,7 +2,7 @@ require 'spec_helper' ...@@ -2,7 +2,7 @@ require 'spec_helper'
describe TestHookService do describe TestHookService do
let (:user) { create :user } let (:user) { create :user }
let (:project) { create :project_with_code } let (:project) { create :project }
let (:hook) { create :project_hook, project: project } let (:hook) { create :project_hook, project: project }
describe :execute do describe :execute do
......
...@@ -11,7 +11,7 @@ def common_mentionable_setup ...@@ -11,7 +11,7 @@ def common_mentionable_setup
let(:mentioned_issue) { create :issue, project: mproject } let(:mentioned_issue) { create :issue, project: mproject }
let(:other_issue) { create :issue, project: mproject } let(:other_issue) { create :issue, project: mproject }
let(:mentioned_mr) { create :merge_request, target_project: mproject, source_branch: 'different' } let(:mentioned_mr) { create :merge_request, source_project: mproject, source_branch: 'different' }
let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object } let(:mentioned_commit) { double('commit', sha: '1234567890abcdef').as_null_object }
# Override to add known commits to the repository stub. # Override to add known commits to the repository stub.
......
...@@ -73,6 +73,10 @@ module TestEnv ...@@ -73,6 +73,10 @@ module TestEnv
version: '6.3.0' version: '6.3.0'
) )
Gitlab::Satellite::MergeAction.any_instance.stub(
merge!: true,
)
Gitlab::Satellite::Satellite.any_instance.stub( Gitlab::Satellite::Satellite.any_instance.stub(
exists?: true, exists?: true,
destroy: true, destroy: true,
......
...@@ -9,7 +9,7 @@ describe PostReceive do ...@@ -9,7 +9,7 @@ describe PostReceive do
end end
context "web hook" do context "web hook" do
let(:project) { create(:project_with_code) } let(:project) { create(:project) }
let(:key) { create(:key, user: project.owner) } let(:key) { create(:key, user: project.owner) }
let(:key_id) { key.shell_id } let(:key_id) { key.shell_id }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment