mirror of
https://github.com/wahyd4/gitlabhq.git
synced 2026-08-17 00:26:07 +10:00
Merge branch 'master' into issue_3400_port
This commit is contained in:
@@ -43,6 +43,7 @@ v 8.6.0 (unreleased)
|
||||
- Increase the notes polling timeout over time (Roberto Dip)
|
||||
- Add shortcut to toggle markdown preview (Florent Baldino)
|
||||
- Show labels in dashboard and group milestone views
|
||||
- Fix an issue when the target branch of a MR had been deleted
|
||||
- Add main language of a project in the list of projects (Tiago Botelho)
|
||||
- Add #upcoming filter to Milestone filter (Tiago Botelho)
|
||||
- Add ability to show archived projects on dashboard, explore and group pages
|
||||
|
||||
@@ -111,14 +111,17 @@ ul.content-list {
|
||||
|
||||
> li {
|
||||
border-color: $table-border-color;
|
||||
color: $list-text-color;
|
||||
font-size: $list-font-size;
|
||||
color: $list-text-color;
|
||||
|
||||
.title {
|
||||
color: $list-title-color;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
a {
|
||||
color: $gl-dark-link-color;
|
||||
}
|
||||
|
||||
.description {
|
||||
p {
|
||||
@include str-truncated;
|
||||
|
||||
@@ -10,36 +10,37 @@ $gutter_inner_width: 258px;
|
||||
/*
|
||||
* UI elements
|
||||
*/
|
||||
$border-color: #efeff1;
|
||||
$border-color: #efeff1;
|
||||
$table-border-color: #eef0f2;
|
||||
$background-color: #faf9f9;
|
||||
$background-color: #faf9f9;
|
||||
|
||||
/*
|
||||
* Text
|
||||
*/
|
||||
$gl-font-size: 15px;
|
||||
$gl-title-color: #333;
|
||||
$gl-text-color: #555;
|
||||
$gl-font-size: 15px;
|
||||
$gl-title-color: #333;
|
||||
$gl-text-color: #555;
|
||||
$gl-text-green: #4a2;
|
||||
$gl-text-red: #d12f19;
|
||||
$gl-text-orange: #d90;
|
||||
$gl-link-color: #3084bb;
|
||||
$gl-dark-link-color: #333;
|
||||
$gl-placeholder-color: #8f8f8f;
|
||||
$gl-text-green: #4a2;
|
||||
$gl-text-red: #d12f19;
|
||||
$gl-text-orange: #d90;
|
||||
$gl-header-color: $gl-title-color;
|
||||
$gl-link-color: #333c48;
|
||||
$gl-gray: $gl-text-color;
|
||||
$gl-gray: $gl-text-color;
|
||||
$gl-header-color: $gl-title-color;
|
||||
|
||||
/*
|
||||
* Lists
|
||||
*/
|
||||
$list-font-size: $gl-font-size;
|
||||
$list-font-size: $gl-font-size;
|
||||
$list-title-color: $gl-title-color;
|
||||
$list-text-color: $gl-text-color;
|
||||
$list-text-color: $gl-text-color;
|
||||
|
||||
/*
|
||||
* Markdown
|
||||
*/
|
||||
$md-text-color: #444;
|
||||
$md-link-color: #3084bb;
|
||||
$md-text-color: $gl-text-color;
|
||||
$md-link-color: $gl-link-color;
|
||||
|
||||
/*
|
||||
* Code
|
||||
|
||||
@@ -55,7 +55,7 @@ li.commit {
|
||||
}
|
||||
|
||||
.commit-row-message {
|
||||
color: $gl-link-color;
|
||||
color: $gl-dark-link-color;
|
||||
|
||||
&:hover {
|
||||
text-decoration: underline;
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
}
|
||||
|
||||
a {
|
||||
color: #4c4e54;
|
||||
color: $gl-dark-link-color;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
@@ -31,11 +31,7 @@
|
||||
.event-title {
|
||||
@include str-truncated(calc(100% - 174px));
|
||||
font-weight: 600;
|
||||
color: $list-title-color;
|
||||
|
||||
a {
|
||||
color: $list-title-color;
|
||||
}
|
||||
color: $list-text-color;
|
||||
}
|
||||
|
||||
.event-body {
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
padding: 10px $gl-padding;
|
||||
position: relative;
|
||||
|
||||
.issue-title {
|
||||
.title {
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
|
||||
@@ -14,26 +14,8 @@
|
||||
}
|
||||
|
||||
.todo-item {
|
||||
font-size: $gl-font-size;
|
||||
padding-left: $gl-avatar-size + $gl-padding-top;
|
||||
color: $gl-text-color;
|
||||
|
||||
a {
|
||||
color: #4c4e54;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
margin-left: -($gl-avatar-size + $gl-padding-top);
|
||||
}
|
||||
|
||||
.todo-title {
|
||||
@include str-truncated(calc(100% - 174px));
|
||||
font-weight: 600;
|
||||
color: $list-title-color;
|
||||
|
||||
a {
|
||||
color: $list-title-color;
|
||||
}
|
||||
}
|
||||
|
||||
.todo-body {
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
vertical-align: middle;
|
||||
|
||||
i, a {
|
||||
color: $gl-link-color;
|
||||
color: $gl-dark-link-color;
|
||||
}
|
||||
|
||||
img {
|
||||
|
||||
@@ -21,17 +21,24 @@ class DashboardController < Dashboard::ApplicationController
|
||||
end
|
||||
|
||||
def labels
|
||||
labels = Label.where(project_id: @projects).select(:title, :color).uniq(:title)
|
||||
|
||||
respond_to do |format|
|
||||
format.json do
|
||||
render json: view_context.projects_labels_options
|
||||
render json: labels
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def milestones
|
||||
milestones = Milestone.where(project_id: @projects).active
|
||||
epoch = DateTime.parse('1970-01-01')
|
||||
grouped_milestones = GlobalMilestone.build_collection(milestones)
|
||||
grouped_milestones = grouped_milestones.sort_by { |x| x.due_date.nil? ? epoch : x.due_date }
|
||||
|
||||
respond_to do |format|
|
||||
format.json do
|
||||
render json: view_context.projects_milestones_options
|
||||
render json: grouped_milestones
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -109,14 +109,6 @@ module LabelsHelper
|
||||
end
|
||||
end
|
||||
|
||||
def projects_labels_options
|
||||
if @project
|
||||
@project.labels
|
||||
else
|
||||
Label.where(project_id: @projects)
|
||||
end
|
||||
end
|
||||
|
||||
def labels_filter_path
|
||||
if @project
|
||||
namespace_project_labels_path(@project.namespace, @project, :json)
|
||||
|
||||
@@ -46,19 +46,6 @@ module MilestonesHelper
|
||||
end
|
||||
end
|
||||
|
||||
def projects_milestones_options
|
||||
milestones =
|
||||
if @project
|
||||
@project.milestones
|
||||
else
|
||||
Milestone.where(project_id: @projects)
|
||||
end.active
|
||||
|
||||
epoch = DateTime.parse('1970-01-01')
|
||||
grouped_milestones = GlobalMilestone.build_collection(milestones)
|
||||
grouped_milestones.sort_by { |x| x.due_date.nil? ? epoch : x.due_date }
|
||||
end
|
||||
|
||||
def milestones_filter_dropdown_path
|
||||
if @project
|
||||
namespace_project_milestones_path(@project.namespace, @project, :json)
|
||||
|
||||
@@ -516,7 +516,7 @@ class MergeRequest < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def target_sha
|
||||
@target_sha ||= target_project.repository.commit(target_branch).sha
|
||||
@target_sha ||= target_project.repository.commit(target_branch).try(:sha)
|
||||
end
|
||||
|
||||
def source_sha
|
||||
@@ -572,8 +572,11 @@ class MergeRequest < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def compute_diverged_commits_count
|
||||
return 0 unless source_sha && target_sha
|
||||
|
||||
Gitlab::Git::Commit.between(target_project.repository.raw_repository, source_sha, target_sha).size
|
||||
end
|
||||
private :compute_diverged_commits_count
|
||||
|
||||
def diverged_from_target_branch?
|
||||
diverged_commits_count > 0
|
||||
|
||||
@@ -24,7 +24,7 @@ module Projects
|
||||
def execute
|
||||
raise LeaseTaken if !try_obtain_lease
|
||||
|
||||
GitlabShellWorker.perform_async(:gc, @project.path_with_namespace)
|
||||
GitlabShellOneShotWorker.perform_async(:gc, @project.path_with_namespace)
|
||||
ensure
|
||||
@project.update_column(:pushes_since_gc, 0)
|
||||
end
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
.todo-item.todo-block
|
||||
= image_tag avatar_icon(todo.author_email, 40), class: 'avatar s40', alt:''
|
||||
|
||||
.todo-title
|
||||
.todo-title.title
|
||||
%span.author-name
|
||||
- if todo.author
|
||||
= link_to_author(todo)
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
.panel-heading
|
||||
= link_to project.name_with_namespace, namespace_project_path(project.namespace, project)
|
||||
|
||||
%ul.well-list.todos-list
|
||||
%ul.content-list.todos-list
|
||||
= render group[1]
|
||||
= paginate @todos, theme: "gitlab"
|
||||
- else
|
||||
|
||||
@@ -3,11 +3,11 @@
|
||||
.issue-check
|
||||
= check_box_tag dom_id(issue,"selected"), nil, false, 'data-id' => issue.id, class: "selected_issue"
|
||||
|
||||
.issue-title
|
||||
.issue-title.title
|
||||
%span.issue-title-text
|
||||
= confidential_icon(issue)
|
||||
= link_to_gfm issue.title, issue_path(issue), class: "title"
|
||||
%ul.controls.light
|
||||
= link_to_gfm issue.title, issue_path(issue)
|
||||
%ul.controls
|
||||
- if issue.closed?
|
||||
%li
|
||||
CLOSED
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
%li{ class: mr_css_classes(merge_request) }
|
||||
.merge-request-title
|
||||
.merge-request-title.title
|
||||
%span.merge-request-title-text
|
||||
= link_to_gfm merge_request.title, merge_request_path(merge_request), class: "title"
|
||||
%ul.controls.light
|
||||
= link_to_gfm merge_request.title, merge_request_path(merge_request)
|
||||
%ul.controls
|
||||
- if merge_request.merged?
|
||||
%li
|
||||
MERGED
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
%i.fa.fa-cogs
|
||||
|
||||
= link_to leave_group_group_members_path(group), data: { confirm: leave_group_message(group.name) }, method: :delete, class: "btn-sm btn btn-grouped", title: 'Leave this group' do
|
||||
%i.fa.fa-sign-out
|
||||
= icon('sign-out')
|
||||
|
||||
.stats
|
||||
%span
|
||||
@@ -22,12 +22,13 @@
|
||||
= number_with_delimiter(group.users.count)
|
||||
|
||||
= image_tag group_icon(group), class: "avatar s40 hidden-xs"
|
||||
= link_to group, class: 'group-name title' do
|
||||
= group.name
|
||||
.title
|
||||
= link_to group, class: 'group-name' do
|
||||
= group.name
|
||||
|
||||
- if group_member
|
||||
as
|
||||
%span #{group_member.human_access}
|
||||
- if group_member
|
||||
as
|
||||
%span #{group_member.human_access}
|
||||
|
||||
- if group.description.present?
|
||||
.description
|
||||
|
||||
@@ -7,26 +7,11 @@
|
||||
- show_last_commit_as_description = false unless local_assigns[:show_last_commit_as_description] == true && project.commit
|
||||
- css_class += " no-description" if project.description.blank? && !show_last_commit_as_description
|
||||
- ci_commit = project.ci_commit(project.commit.sha) if ci && !project.empty_repo? && project.commit
|
||||
- cache_key = [project.namespace, project, controller.controller_name, controller.action_name, current_application_settings, 'v2.2']
|
||||
- cache_key = [project.namespace, project, controller.controller_name, controller.action_name, current_application_settings, 'v2.3']
|
||||
- cache_key.push(ci_commit.status) if ci_commit
|
||||
|
||||
%li.project-row{ class: css_class }
|
||||
= cache(cache_key) do
|
||||
= link_to project_path(project), class: dom_class(project) do
|
||||
- if avatar
|
||||
.dash-project-avatar
|
||||
- if use_creator_avatar
|
||||
= image_tag avatar_icon(project.creator.email, 40), class: "avatar s40", alt:''
|
||||
- else
|
||||
= project_icon(project, alt: '', class: 'avatar project-avatar s40')
|
||||
%span.project-full-name.title
|
||||
%span.namespace-name
|
||||
- if project.namespace && !skip_namespace
|
||||
= project.namespace.human_name
|
||||
\/
|
||||
%span.project-name.filter-title
|
||||
= project.name
|
||||
|
||||
.controls
|
||||
- if project.main_language
|
||||
%span
|
||||
@@ -45,6 +30,23 @@
|
||||
%span.visibility-icon.has_tooltip{data: { container: 'body', placement: 'left' },
|
||||
title: "#{visibility_level_label(project.visibility_level)} - #{project_visibility_level_description(project.visibility_level)}"}
|
||||
= visibility_level_icon(project.visibility_level, fw: false)
|
||||
|
||||
.title
|
||||
= link_to project_path(project), class: dom_class(project) do
|
||||
- if avatar
|
||||
.dash-project-avatar
|
||||
- if use_creator_avatar
|
||||
= image_tag avatar_icon(project.creator.email, 40), class: "avatar s40", alt:''
|
||||
- else
|
||||
= project_icon(project, alt: '', class: 'avatar project-avatar s40')
|
||||
%span.project-full-name
|
||||
%span.namespace-name
|
||||
- if project.namespace && !skip_namespace
|
||||
= project.namespace.human_name
|
||||
\/
|
||||
%span.project-name.filter-title
|
||||
= project.name
|
||||
|
||||
- if show_last_commit_as_description
|
||||
.description
|
||||
= link_to_gfm project.commit.title, namespace_project_commit_path(project.namespace, project, project.commit),
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
%li.snippet-row
|
||||
= image_tag avatar_icon(snippet.author_email), class: "avatar s40 hidden-xs", alt: ''
|
||||
|
||||
.snippet-title
|
||||
= link_to reliable_snippet_path(snippet), class: 'title' do
|
||||
.title
|
||||
= link_to reliable_snippet_path(snippet) do
|
||||
= truncate(snippet.title, length: 60)
|
||||
- if snippet.private?
|
||||
%span.label.label-gray
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
class GitlabShellOneShotWorker
|
||||
include Sidekiq::Worker
|
||||
include Gitlab::ShellAdapter
|
||||
|
||||
sidekiq_options queue: :gitlab_shell, retry: false
|
||||
|
||||
def perform(action, *arg)
|
||||
gitlab_shell.send(action, *arg)
|
||||
end
|
||||
end
|
||||
@@ -86,6 +86,16 @@ describe MergeRequest, models: true do
|
||||
end
|
||||
end
|
||||
|
||||
describe '#target_sha' do
|
||||
context 'when the target branch does not exist anymore' do
|
||||
subject { create(:merge_request).tap { |mr| mr.update_attribute(:target_branch, 'deleted') } }
|
||||
|
||||
it 'returns nil' do
|
||||
expect(subject.target_sha).to be_nil
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#source_sha' do
|
||||
let(:last_branch_commit) { subject.source_project.repository.commit(subject.source_branch) }
|
||||
|
||||
@@ -310,6 +320,18 @@ describe MergeRequest, models: true do
|
||||
let(:project) { create(:project) }
|
||||
let(:fork_project) { create(:project, forked_from_project: project) }
|
||||
|
||||
context 'when the target branch does not exist anymore' do
|
||||
subject { create(:merge_request).tap { |mr| mr.update_attribute(:target_branch, 'deleted') } }
|
||||
|
||||
it 'does not crash' do
|
||||
expect{ subject.diverged_commits_count }.not_to raise_error
|
||||
end
|
||||
|
||||
it 'returns 0' do
|
||||
expect(subject.diverged_commits_count).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
context 'diverged on same repository' do
|
||||
subject(:merge_request_with_divergence) { create(:merge_request, :diverged, source_project: project, target_project: project) }
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ describe Projects::HousekeepingService do
|
||||
|
||||
it 'enqueues a sidekiq job' do
|
||||
expect(subject).to receive(:try_obtain_lease).and_return(true)
|
||||
expect(GitlabShellWorker).to receive(:perform_async).with(:gc, project.path_with_namespace)
|
||||
expect(GitlabShellOneShotWorker).to receive(:perform_async).with(:gc, project.path_with_namespace)
|
||||
|
||||
subject.execute
|
||||
expect(project.pushes_since_gc).to eq(0)
|
||||
@@ -20,7 +20,7 @@ describe Projects::HousekeepingService do
|
||||
|
||||
it 'does not enqueue a job when no lease can be obtained' do
|
||||
expect(subject).to receive(:try_obtain_lease).and_return(false)
|
||||
expect(GitlabShellWorker).not_to receive(:perform_async)
|
||||
expect(GitlabShellOneShotWorker).not_to receive(:perform_async)
|
||||
|
||||
expect { subject.execute }.to raise_error(Projects::HousekeepingService::LeaseTaken)
|
||||
expect(project.pushes_since_gc).to eq(0)
|
||||
|
||||
Reference in New Issue
Block a user