From 84727fba96c6794874e1f94d581408b70e1842a7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Aug 2015 10:26:19 +0200 Subject: Revert "Merge branch 'improve-merge-requests' into 'master' " This reverts commit 4773f38e28c91dbbb6e5e385e0c403877298bfed, reversing changes made to 0d5d80b735eb18ae79eb2bfe26c08896d53db414. --- app/models/merge_request.rb | 2 +- app/models/merge_request_diff.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'app/models') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 467b90861f9..631a2d887cc 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -432,7 +432,7 @@ class MergeRequest < ActiveRecord::Base target_project.repository.fetch_ref( source_project.repository.path_to_repo, "refs/heads/#{source_branch}", - "refs/merge-requests/#{iid}/head" + "refs/merge-requests/#{id}/head" ) end diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index e317c8eac4d..2177f972ca3 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -161,8 +161,8 @@ class MergeRequestDiff < ActiveRecord::Base def compare_result @compare_result ||= begin - # Update ref for merge request - merge_request.fetch_ref + # Update ref if merge request is from fork + merge_request.fetch_ref if merge_request.for_fork? # Get latest sha of branch from source project source_sha = merge_request.source_project.commit(source_branch).sha -- cgit v1.2.1 From 9f10943c1a76576ac40d96189a28a4d6123a75d8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Aug 2015 10:28:42 +0200 Subject: Revert "Merge branch 'drop-satellites'" This reverts commit 957e849f41d96fa9778fcdd06792d2f0274b29ab, reversing changes made to 6b9dbe9f5a175a8162abf296367f561bab3eea1a. Signed-off-by: Dmitriy Zaporozhets --- app/models/merge_request.rb | 56 ++++++++++-------------- app/models/merge_request_diff.rb | 32 +++++--------- app/models/namespace.rb | 5 ++- app/models/project.rb | 14 +++++- app/models/project_services/gitlab_ci_service.rb | 4 -- app/models/repository.rb | 30 +------------ 6 files changed, 54 insertions(+), 87 deletions(-) (limited to 'app/models') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 631a2d887cc..1ef76d16700 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -41,6 +41,8 @@ class MergeRequest < ActiveRecord::Base delegate :commits, :diffs, :last_commit, :last_commit_short_sha, to: :merge_request_diff, prefix: nil + attr_accessor :should_remove_source_branch + # When this attribute is true some MR validation is ignored # It allows us to close or modify broken merge requests attr_accessor :allow_broken @@ -55,7 +57,7 @@ class MergeRequest < ActiveRecord::Base transition [:reopened, :opened] => :closed end - event :mark_as_merged do + event :merge do transition [:reopened, :opened, :locked] => :merged end @@ -204,7 +206,11 @@ class MergeRequest < ActiveRecord::Base def check_if_can_be_merged can_be_merged = - project.repository.can_be_merged?(source_sha, target_branch) + if for_fork? + Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? + else + project.repository.can_be_merged?(source_branch, target_branch) + end if can_be_merged mark_as_mergeable @@ -221,6 +227,18 @@ class MergeRequest < ActiveRecord::Base self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last end + def automerge!(current_user, commit_message = nil) + return unless automergeable? + + MergeRequests::AutoMergeService. + new(target_project, current_user). + execute(self, commit_message) + end + + def remove_source_branch? + self.should_remove_source_branch && !self.source_project.root_ref?(self.source_branch) && !self.for_fork? + end + def open? opened? || reopened? end @@ -229,11 +247,11 @@ class MergeRequest < ActiveRecord::Base title =~ /\A\[?WIP\]?:? /i end - def mergeable? + def automergeable? open? && !work_in_progress? && can_be_merged? end - def gitlab_merge_status + def automerge_status if work_in_progress? "work_in_progress" else @@ -260,14 +278,14 @@ class MergeRequest < ActiveRecord::Base # # see "git diff" def to_diff(current_user) - target_project.repository.diff_text(target_branch, source_sha) + Gitlab::Satellite::MergeAction.new(current_user, self).diff_in_satellite end # Returns the commit as a series of email patches. # # see "git format-patch" def to_patch(current_user) - target_project.repository.format_patch(target_branch, source_sha) + Gitlab::Satellite::MergeAction.new(current_user, self).format_patch end def hook_attrs @@ -418,30 +436,4 @@ class MergeRequest < ActiveRecord::Base "Open" end end - - def target_sha - @target_sha ||= target_project. - repository.commit(target_branch).sha - end - - def source_sha - commits.first.sha - end - - def fetch_ref - target_project.repository.fetch_ref( - source_project.repository.path_to_repo, - "refs/heads/#{source_branch}", - "refs/merge-requests/#{id}/head" - ) - end - - def in_locked_state - begin - lock_mr - yield - ensure - unlock_mr if locked? - end - end end diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index 2177f972ca3..df1c2b78758 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -16,8 +16,9 @@ require Rails.root.join("app/models/commit") class MergeRequestDiff < ActiveRecord::Base include Sortable - # Prevent store of diff if commits amount more then 500 - COMMITS_SAFE_SIZE = 500 + # Prevent store of diff + # if commits amount more then 200 + COMMITS_SAFE_SIZE = 200 attr_reader :commits, :diffs @@ -123,12 +124,12 @@ class MergeRequestDiff < ActiveRecord::Base if new_diffs.any? if new_diffs.size > Commit::DIFF_HARD_LIMIT_FILES self.state = :overflow_diff_files_limit - new_diffs = new_diffs.first[Commit::DIFF_HARD_LIMIT_LINES] + 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 = new_diffs.first[Commit::DIFF_HARD_LIMIT_LINES] + new_diffs = [] end end @@ -159,21 +160,12 @@ class MergeRequestDiff < ActiveRecord::Base private def compare_result - @compare_result ||= - begin - # Update ref if merge request is from fork - merge_request.fetch_ref if merge_request.for_fork? - - # Get latest sha of branch from source project - source_sha = merge_request.source_project.commit(source_branch).sha - - Gitlab::CompareResult.new( - Gitlab::Git::Compare.new( - merge_request.target_project.repository.raw_repository, - merge_request.target_branch, - source_sha, - ) - ) - end + @compare_result ||= CompareService.new.execute( + merge_request.author, + merge_request.source_project, + merge_request.source_branch, + merge_request.target_project, + merge_request.target_branch, + ) end end diff --git a/app/models/namespace.rb b/app/models/namespace.rb index 161a16ca61c..30ffacadded 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -118,11 +118,12 @@ class Namespace < ActiveRecord::Base gitlab_shell.add_namespace(path_was) if gitlab_shell.mv_namespace(path_was, path) - # If repositories moved successfully we need to - # send update instructions to users. + # If repositories moved successfully we need to remove old satellites + # and send update instructions to users. # However we cannot allow rollback since we moved namespace dir # So we basically we mute exceptions in next actions begin + gitlab_shell.rm_satellites(path_was) send_update_instructions rescue # Returning false does not rollback after_* transaction but gives diff --git a/app/models/project.rb b/app/models/project.rb index 4628f478ca6..3dc1729e812 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -520,6 +520,14 @@ class Project < ActiveRecord::Base !repository.exists? || repository.empty? end + def ensure_satellite_exists + self.satellite.create unless self.satellite.exists? + end + + def satellite + @satellite ||= Gitlab::Satellite::Satellite.new(self) + end + def repo repository.raw end @@ -589,11 +597,14 @@ class Project < ActiveRecord::Base new_path_with_namespace = File.join(namespace_dir, path) if gitlab_shell.mv_repository(old_path_with_namespace, new_path_with_namespace) - # If repository moved successfully we need to send update instructions to users. + # If repository moved successfully we need to remove old satellite + # and send update instructions to users. # However we cannot allow rollback since we moved repository # So we basically we mute exceptions in next actions begin gitlab_shell.mv_repository("#{old_path_with_namespace}.wiki", "#{new_path_with_namespace}.wiki") + gitlab_shell.rm_satellites(old_path_with_namespace) + ensure_satellite_exists send_move_instructions reset_events_cache rescue @@ -691,6 +702,7 @@ class Project < ActiveRecord::Base def create_repository if forked? if gitlab_shell.fork_repository(forked_from_project.path_with_namespace, self.namespace.path) + ensure_satellite_exists true else errors.add(:base, 'Failed to fork repository via gitlab-shell') diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index ecdcd48ae60..5aaa4e85cbc 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -74,8 +74,6 @@ class GitlabCiService < CiService else :error end - rescue Errno::ECONNREFUSED - :error end def fork_registration(new_project, private_token) @@ -105,8 +103,6 @@ class GitlabCiService < CiService if response.code == 200 and response["coverage"] response["coverage"] end - rescue Errno::ECONNREFUSED - nil end def build_page(sha, ref) diff --git a/app/models/repository.rb b/app/models/repository.rb index 46efbede2a2..807b33b2a3e 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -411,36 +411,15 @@ class Repository } end - def can_be_merged?(source_sha, target_branch) + def can_be_merged?(source_branch, target_branch) our_commit = rugged.branches[target_branch].target - their_commit = rugged.lookup(source_sha) + their_commit = rugged.branches[source_branch].target if our_commit && their_commit !rugged.merge_commits(our_commit, their_commit).conflicts? - else - false end end - def merge(source_sha, target_branch, options = {}) - our_commit = rugged.branches[target_branch].target - their_commit = rugged.lookup(source_sha) - - raise "Invalid merge target" if our_commit.nil? - raise "Invalid merge source" if their_commit.nil? - - merge_index = rugged.merge_commits(our_commit, their_commit) - return false if merge_index.conflicts? - - actual_options = options.merge( - parents: [our_commit, their_commit], - tree: merge_index.write_tree(rugged), - update_ref: "refs/heads/#{target_branch}" - ) - - Rugged::Commit.create(rugged, actual_options) - end - def search_files(query, ref) offset = 2 args = %W(git grep -i -n --before-context #{offset} --after-context #{offset} #{query} #{ref || root_ref}) @@ -474,11 +453,6 @@ class Repository ) end - def fetch_ref(source_path, source_ref, target_ref) - args = %W(git fetch #{source_path} #{source_ref}:#{target_ref}) - Gitlab::Popen.popen(args, path_to_repo) - end - private def cache -- cgit v1.2.1 From 32046983ad0a702b9c091d052859a13660497dcd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Aug 2015 10:48:02 +0200 Subject: Revert "Merge branch 'refactor-can-be-merge' into 'master'" This reverts commit 459e6d346768d9d8fceaee00bf0870b8e7c4ed9a, reversing changes made to 804168e1def1204af712febb229f41a3865f085f. Signed-off-by: Dmitriy Zaporozhets --- app/models/merge_request.rb | 8 +++++++- app/models/repository.rb | 9 --------- 2 files changed, 7 insertions(+), 10 deletions(-) (limited to 'app/models') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 1ef76d16700..5a48fe66281 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -209,7 +209,13 @@ class MergeRequest < ActiveRecord::Base if for_fork? Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? else - project.repository.can_be_merged?(source_branch, target_branch) + rugged = project.repository.rugged + our_commit = rugged.branches[target_branch].target + their_commit = rugged.branches[source_branch].target + + if our_commit && their_commit + !rugged.merge_commits(our_commit, their_commit).conflicts? + end end if can_be_merged diff --git a/app/models/repository.rb b/app/models/repository.rb index 807b33b2a3e..638e278b49e 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -411,15 +411,6 @@ class Repository } end - def can_be_merged?(source_branch, target_branch) - our_commit = rugged.branches[target_branch].target - their_commit = rugged.branches[source_branch].target - - if our_commit && their_commit - !rugged.merge_commits(our_commit, their_commit).conflicts? - end - end - def search_files(query, ref) offset = 2 args = %W(git grep -i -n --before-context #{offset} --after-context #{offset} #{query} #{ref || root_ref}) -- cgit v1.2.1 From 3b02ad846723888a8468f5be88bcbb5955028b6d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Aug 2015 10:50:39 +0200 Subject: Revert "Merge branches inside one repository using rugged instead of satellites" This reverts commit d24c40ec219d76e01e2fab5f6ebf431adae91bdd. --- app/models/merge_request.rb | 15 +-------------- app/models/repository.rb | 2 ++ 2 files changed, 3 insertions(+), 14 deletions(-) (limited to 'app/models') diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 5a48fe66281..324d1795ab4 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -205,20 +205,7 @@ class MergeRequest < ActiveRecord::Base end def check_if_can_be_merged - can_be_merged = - if for_fork? - Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? - else - rugged = project.repository.rugged - our_commit = rugged.branches[target_branch].target - their_commit = rugged.branches[source_branch].target - - if our_commit && their_commit - !rugged.merge_commits(our_commit, their_commit).conflicts? - end - end - - if can_be_merged + if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged? mark_as_mergeable else mark_as_unmergeable diff --git a/app/models/repository.rb b/app/models/repository.rb index 638e278b49e..4394f948e12 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -403,6 +403,8 @@ class Repository Gitlab::Git::Blob.remove(raw_repository, options) end + private + def user_to_comitter(user) { email: user.email, -- cgit v1.2.1 From 1891cab44ce63e63c6606675021f8eaf81444aee Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Aug 2015 11:12:35 +0200 Subject: Fix conflict issue Signed-off-by: Dmitriy Zaporozhets --- app/models/repository.rb | 2 -- 1 file changed, 2 deletions(-) (limited to 'app/models') diff --git a/app/models/repository.rb b/app/models/repository.rb index 4394f948e12..638e278b49e 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -403,8 +403,6 @@ class Repository Gitlab::Git::Blob.remove(raw_repository, options) end - private - def user_to_comitter(user) { email: user.email, -- cgit v1.2.1 From 9bc512314a6a11e075539ada1d1d032b6992d039 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 11 Aug 2015 11:52:33 +0200 Subject: Revert "Create and edit files in web editor via rugged" This reverts commit 734a4ba87de7bc8cf152c5bc7f93ba04210b282d. Signed-off-by: Dmitriy Zaporozhets --- app/models/repository.rb | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) (limited to 'app/models') diff --git a/app/models/repository.rb b/app/models/repository.rb index 638e278b49e..0a62980f93a 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -364,53 +364,6 @@ class Repository @root_ref ||= raw_repository.root_ref end - def commit_file(user, path, content, message, ref) - path[0] = '' if path[0] == '/' - - committer = user_to_comitter(user) - options = {} - options[:committer] = committer - options[:author] = committer - options[:commit] = { - message: message, - branch: ref - } - - options[:file] = { - content: content, - path: path - } - - Gitlab::Git::Blob.commit(raw_repository, options) - end - - def remove_file(user, path, message, ref) - path[0] = '' if path[0] == '/' - - committer = user_to_comitter(user) - options = {} - options[:committer] = committer - options[:author] = committer - options[:commit] = { - message: message, - branch: ref - } - - options[:file] = { - path: path - } - - Gitlab::Git::Blob.remove(raw_repository, options) - end - - def user_to_comitter(user) - { - email: user.email, - name: user.name, - time: Time.now - } - end - def search_files(query, ref) offset = 2 args = %W(git grep -i -n --before-context #{offset} --after-context #{offset} #{query} #{ref || root_ref}) -- cgit v1.2.1