From 5ba2d53cfa1704b7ab76d3ac5dda2a880fa55c57 Mon Sep 17 00:00:00 2001 From: karen Carias Date: Mon, 10 Aug 2015 16:56:02 -0700 Subject: [PATCH 001/153] fixed text --- doc/workflow/importing/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/workflow/importing/README.md b/doc/workflow/importing/README.md index cd98d1b985..c14709b6b6 100644 --- a/doc/workflow/importing/README.md +++ b/doc/workflow/importing/README.md @@ -8,5 +8,6 @@ ### Note * If you'd like to migrate from a self-hosted GitLab instance to GitLab.com, you can copy your repos by changing the remote and pushing to the new server; but issues and merge requests can't be imported. -* Repositories are imported to GitLab via HTTP. -If the repository is too large, it can timeout. We have a soft limit of 10GB. +* You can import any Git repository via HTTP from the New Project page. +If the repository is too large, it can timeout. We have a soft limit of +10GB. From 10491b5438d1a41628bbb732f58329fb1b6270a3 Mon Sep 17 00:00:00 2001 From: karen Carias Date: Mon, 17 Aug 2015 14:42:34 -0700 Subject: [PATCH 002/153] deleted line --- doc/workflow/importing/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/workflow/importing/README.md b/doc/workflow/importing/README.md index c14709b6b6..5cde90993d 100644 --- a/doc/workflow/importing/README.md +++ b/doc/workflow/importing/README.md @@ -9,5 +9,4 @@ * If you'd like to migrate from a self-hosted GitLab instance to GitLab.com, you can copy your repos by changing the remote and pushing to the new server; but issues and merge requests can't be imported. * You can import any Git repository via HTTP from the New Project page. -If the repository is too large, it can timeout. We have a soft limit of -10GB. +If the repository is too large, it can timeout. From 001c8cd0ee6e70cc96727cc37eedf263b916d24b Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Fri, 14 Aug 2015 22:21:22 -0700 Subject: [PATCH 003/153] Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries Closes https://github.com/gitlabhq/gitlabhq/issues/9560 --- CHANGELOG | 1 + app/workers/emails_on_push_worker.rb | 33 ++++++++++++--------- spec/workers/emails_on_push_worker_spec.rb | 34 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 spec/workers/emails_on_push_worker_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 8214e57aaa..6872ec16aa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,6 +6,7 @@ v 8.0.0 (unreleased) - Faster merge - Ability to fetch merge requests from refs/merge-requests/:id - Allow displaying of archived projects in the admin interface (Artem Sidorenko) + - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu) v 7.14.0 (unreleased) - Update default robots.txt rules to disallow crawling of irrelevant pages (Ben Bodenmiller) diff --git a/app/workers/emails_on_push_worker.rb b/app/workers/emails_on_push_worker.rb index 1d21addece..916a99bb27 100644 --- a/app/workers/emails_on_push_worker.rb +++ b/app/workers/emails_on_push_worker.rb @@ -4,7 +4,7 @@ class EmailsOnPushWorker def perform(project_id, recipients, push_data, options = {}) options.symbolize_keys! options.reverse_merge!( - send_from_committer_email: false, + send_from_committer_email: false, disable_diffs: false ) send_from_committer_email = options[:send_from_committer_email] @@ -16,9 +16,9 @@ class EmailsOnPushWorker ref = push_data["ref"] author_id = push_data["user_id"] - action = + action = if Gitlab::Git.blank_ref?(before_sha) - :create + :create elsif Gitlab::Git.blank_ref?(after_sha) :delete else @@ -42,17 +42,22 @@ class EmailsOnPushWorker end recipients.split(" ").each do |recipient| - Notify.repository_push_email( - project_id, - recipient, - author_id: author_id, - ref: ref, - action: action, - compare: compare, - reverse_compare: reverse_compare, - send_from_committer_email: send_from_committer_email, - disable_diffs: disable_diffs - ).deliver + begin + Notify.repository_push_email( + project_id, + recipient, + author_id: author_id, + ref: ref, + action: action, + compare: compare, + reverse_compare: reverse_compare, + send_from_committer_email: send_from_committer_email, + disable_diffs: disable_diffs + ).deliver + # These are input errors and won't be corrected even if Sidekiq retries + rescue Net::SMTPFatalError, Net::SMTPSyntaxError => e + logger.info("Failed to send e-mail for project '#{project.name_with_namespace}' to #{recipient}: #{e}") + end end ensure compare = nil diff --git a/spec/workers/emails_on_push_worker_spec.rb b/spec/workers/emails_on_push_worker_spec.rb new file mode 100644 index 0000000000..3600c77107 --- /dev/null +++ b/spec/workers/emails_on_push_worker_spec.rb @@ -0,0 +1,34 @@ +require 'spec_helper' + +describe EmailsOnPushWorker do + include RepoHelpers + + let(:project) { create(:project) } + let(:user) { create(:user) } + let(:data) { Gitlab::PushDataBuilder.build_sample(project, user) } + + subject { EmailsOnPushWorker.new } + + before do + allow(Project).to receive(:find).and_return(project) + end + + describe "#perform" do + it "sends mail" do + subject.perform(project.id, user.email, data.stringify_keys) + + email = ActionMailer::Base.deliveries.last + expect(email.subject).to include('Change some files') + expect(email.to).to eq([user.email]) + end + + it "gracefully handles an input SMTP error" do + ActionMailer::Base.deliveries.clear + allow(Notify).to receive(:repository_push_email).and_raise(Net::SMTPFatalError) + + subject.perform(project.id, user.email, data.stringify_keys) + + expect(ActionMailer::Base.deliveries.count).to eq(0) + end + end +end From 4d2f36118a3b21b6bb4ee702b98d032967ba463a Mon Sep 17 00:00:00 2001 From: Joel Koglin Date: Tue, 21 Jul 2015 14:03:26 -0700 Subject: [PATCH 004/153] Issue #993: Fixed login failure when extern_uid changes --- CHANGELOG | 1 + app/models/user.rb | 2 +- ...50817163600_deduplicate_user_identities.rb | 14 ++++++++++++ db/schema.rb | 2 +- lib/gitlab/ldap/user.rb | 10 ++++++--- spec/lib/gitlab/ldap/user_spec.rb | 22 +++++++++++++++++++ 6 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20150817163600_deduplicate_user_identities.rb diff --git a/CHANGELOG b/CHANGELOG index 6cbe51f1fb..53c7463ae7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -75,6 +75,7 @@ v 7.14.0 (unreleased) - Update Flowdock integration to support new Flowdock API (Boyan Tabakov) - Remove author from files view (Sven Strickroth) - Fix infinite loop when SAML was incorrectly configured. + - Fixed login failure when extern_uid changes (Joel Koglin) v 7.13.5 - Satellites reverted diff --git a/app/models/user.rb b/app/models/user.rb index f70761074c..1f0735a7e7 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -104,7 +104,7 @@ class User < ActiveRecord::Base # Profile has_many :keys, dependent: :destroy has_many :emails, dependent: :destroy - has_many :identities, dependent: :destroy + has_many :identities, dependent: :destroy, autosave: true # Groups has_many :members, dependent: :destroy diff --git a/db/migrate/20150817163600_deduplicate_user_identities.rb b/db/migrate/20150817163600_deduplicate_user_identities.rb new file mode 100644 index 0000000000..fab669c290 --- /dev/null +++ b/db/migrate/20150817163600_deduplicate_user_identities.rb @@ -0,0 +1,14 @@ +class DeduplicateUserIdentities < ActiveRecord::Migration + def change + execute 'DROP TABLE IF EXISTS tt_migration_DeduplicateUserIdentities;' + execute 'CREATE TEMPORARY TABLE tt_migration_DeduplicateUserIdentities AS SELECT id,provider,user_id FROM identities;' + execute 'DELETE FROM identities WHERE id NOT IN ( SELECT MIN(id) FROM tt_migration_DeduplicateUserIdentities GROUP BY user_id, provider);' + execute 'DROP TABLE IF EXISTS tt_migration_DeduplicateUserIdentities;' + end + + def down + # This is an irreversible migration; + # If someone is trying to rollback for other reasons, we should not throw an Exception. + # raise ActiveRecord::IrreversibleMigration + end +end diff --git a/db/schema.rb b/db/schema.rb index fdf09b3afd..7a0c92bddc 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150812080800) do +ActiveRecord::Schema.define(version: 20150817163600) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" diff --git a/lib/gitlab/ldap/user.rb b/lib/gitlab/ldap/user.rb index f7f3ba9ad7..2ffb124196 100644 --- a/lib/gitlab/ldap/user.rb +++ b/lib/gitlab/ldap/user.rb @@ -44,9 +44,13 @@ module Gitlab gl_user.skip_reconfirmation! gl_user.email = auth_hash.email - # Build new identity only if we dont have have same one - gl_user.identities.find_or_initialize_by(provider: auth_hash.provider, - extern_uid: auth_hash.uid) + # If we don't have an identity for this provider yet, create one + if gl_user.identities.find_by(provider: auth_hash.provider).nil? + gl_user.identities.new(extern_uid: auth_hash.uid, provider: auth_hash.provider) + else # Update the UID attribute for this provider in case it has changed + identity = gl_user.identities.select { |identity| identity.provider == auth_hash.provider } + identity.first.extern_uid = auth_hash.uid + end gl_user end diff --git a/spec/lib/gitlab/ldap/user_spec.rb b/spec/lib/gitlab/ldap/user_spec.rb index 7cfca96f4e..84d9fb54b6 100644 --- a/spec/lib/gitlab/ldap/user_spec.rb +++ b/spec/lib/gitlab/ldap/user_spec.rb @@ -47,6 +47,28 @@ describe Gitlab::LDAP::User do expect(existing_user.ldap_identity.provider).to eql 'ldapmain' end + it 'connects to existing ldap user if the extern_uid changes' do + existing_user = create(:omniauth_user, email: 'john@example.com', extern_uid: 'old-uid', provider: 'ldapmain') + expect{ ldap_user.save }.not_to change{ User.count } + + existing_user.reload + expect(existing_user.ldap_identity.extern_uid).to eql 'my-uid' + expect(existing_user.ldap_identity.provider).to eql 'ldapmain' + expect(existing_user.id).to eql ldap_user.gl_user.id + end + + it 'maintains an identity per provider' do + existing_user = create(:omniauth_user, email: 'john@example.com', provider: 'twitter') + expect(existing_user.identities.count).to eql(1) + + ldap_user.save + expect(ldap_user.gl_user.identities.count).to eql(2) + + # Expect that find_by provider only returns a single instance of an identity and not an Enumerable + expect(ldap_user.gl_user.identities.find_by(provider: 'twitter')).to be_instance_of Identity + expect(ldap_user.gl_user.identities.find_by(provider: auth_hash.provider)).to be_instance_of Identity + end + it "creates a new user if not found" do expect{ ldap_user.save }.to change{ User.count }.by(1) end From 4016a4577c6f41354e9261e08fe94d917bc9edc2 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 23 Aug 2015 13:31:02 -0700 Subject: [PATCH 005/153] Only include base URL in OmniAuth full_host parameter Closes #2335 --- CHANGELOG | 1 + config/initializers/1_settings.rb | 26 ++++++++++++++++++-------- config/initializers/7_omniauth.rb | 2 +- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 44ffb56d5f..ae7a8dba9d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Only include base URL in OmniAuth full_host parameter (Stan Hu) - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) - Remove satellites - Better performance for web editor (switched from satellites to rugged) diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index bd26ac1da2..c47e5dab27 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -8,7 +8,7 @@ class Settings < Settingslogic def gitlab_on_standard_port? gitlab.port.to_i == (gitlab.https ? 443 : 80) end - + # get host without www, thanks to http://stackoverflow.com/a/6674363/1233435 def get_host_without_www(url) url = URI.encode(url) @@ -32,14 +32,12 @@ class Settings < Settingslogic end end + def build_base_gitlab_url + base_gitlab_url.join('') + end + def build_gitlab_url - custom_port = gitlab_on_standard_port? ? nil : ":#{gitlab.port}" - [ gitlab.protocol, - "://", - gitlab.host, - custom_port, - gitlab.relative_url_root - ].join('') + (base_gitlab_url + [gitlab.relative_url_root]).join('') end # check that values in `current` (string or integer) is a contant in `modul`. @@ -64,6 +62,17 @@ class Settings < Settingslogic end value end + + private + + def base_gitlab_url + custom_port = gitlab_on_standard_port? ? nil : ":#{gitlab.port}" + [ gitlab.protocol, + "://", + gitlab.host, + custom_port + ] + end end end @@ -123,6 +132,7 @@ Settings.gitlab['email_enabled'] ||= true if Settings.gitlab['email_enabled'].ni Settings.gitlab['email_from'] ||= "gitlab@#{Settings.gitlab.host}" Settings.gitlab['email_display_name'] ||= "GitLab" Settings.gitlab['email_reply_to'] ||= "noreply@#{Settings.gitlab.host}" +Settings.gitlab['base_url'] ||= Settings.send(:build_base_gitlab_url) Settings.gitlab['url'] ||= Settings.send(:build_gitlab_url) Settings.gitlab['user'] ||= 'git' Settings.gitlab['user_home'] ||= begin diff --git a/config/initializers/7_omniauth.rb b/config/initializers/7_omniauth.rb index 7f73546ac8..70ed10e827 100644 --- a/config/initializers/7_omniauth.rb +++ b/config/initializers/7_omniauth.rb @@ -11,7 +11,7 @@ if Gitlab::LDAP::Config.enabled? end end -OmniAuth.config.full_host = Settings.gitlab['url'] +OmniAuth.config.full_host = Settings.gitlab['base_url'] OmniAuth.config.allowed_request_methods = [:post] #In case of auto sign-in, the GET method is used (users don't get to click on a button) OmniAuth.config.allowed_request_methods << :get if Gitlab.config.omniauth.auto_sign_in_with_provider.present? From 6318a7631131074d5d65775f92097b9c1e3f04d6 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 23 Aug 2015 16:52:29 -0700 Subject: [PATCH 006/153] Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode Closes #2271 --- CHANGELOG | 1 + Gemfile | 2 +- Gemfile.lock | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 7eb6ab81dd..99df3c7a83 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu) - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) - Remove satellites diff --git a/Gemfile b/Gemfile index 3aa3c72e08..fa54a72f02 100644 --- a/Gemfile +++ b/Gemfile @@ -34,7 +34,7 @@ gem 'rqrcode-rails3' gem 'attr_encrypted', '1.3.4' # Browser detection -gem "browser", '~> 0.8.0' +gem "browser", '~> 1.0.0' # Extracting information from a git repository # Provide access to Gitlab::Git library diff --git a/Gemfile.lock b/Gemfile.lock index 5278fe243a..a7cfe6b751 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -76,7 +76,7 @@ GEM ruby_parser (~> 3.5.0) sass (~> 3.0) terminal-table (~> 1.4) - browser (0.8.0) + browser (1.0.0) builder (3.2.2) byebug (3.2.0) columnize (~> 0.8) @@ -755,7 +755,7 @@ DEPENDENCIES binding_of_caller bootstrap-sass (~> 3.0) brakeman - browser (~> 0.8.0) + browser (~> 1.0.0) byebug cal-heatmap-rails (~> 0.0.1) capybara (~> 2.4.0) From 208888038375d48cc91cf481a3f8509d63d8e1ad Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 24 Aug 2015 10:57:35 -0700 Subject: [PATCH 007/153] Ignore empty incoming messages. --- app/mailers/email_rejection_mailer.rb | 2 ++ app/workers/email_receiver_worker.rb | 2 ++ config/mail_room.yml.example | 2 ++ doc/reply_by_email/README.md | 4 ++++ 4 files changed, 10 insertions(+) diff --git a/app/mailers/email_rejection_mailer.rb b/app/mailers/email_rejection_mailer.rb index 89aceda82d..883f1c73ad 100644 --- a/app/mailers/email_rejection_mailer.rb +++ b/app/mailers/email_rejection_mailer.rb @@ -3,6 +3,8 @@ class EmailRejectionMailer < BaseMailer @reason = reason @original_message = Mail::Message.new(original_raw) + return unless @original_message.from + headers = { to: @original_message.from, subject: "[Rejected] #{@original_message.subject}" diff --git a/app/workers/email_receiver_worker.rb b/app/workers/email_receiver_worker.rb index a588a1f45e..8cfb96ef37 100644 --- a/app/workers/email_receiver_worker.rb +++ b/app/workers/email_receiver_worker.rb @@ -18,6 +18,8 @@ class EmailReceiverWorker def handle_failure(raw, e) Rails.logger.warn("Email can not be processed: #{e}\n\n#{raw}") + return unless raw.present? + can_retry = false reason = nil diff --git a/config/mail_room.yml.example b/config/mail_room.yml.example index 28366eb739..dd8edfc42e 100644 --- a/config/mail_room.yml.example +++ b/config/mail_room.yml.example @@ -14,6 +14,8 @@ # :name: "inbox" # # Always "sidekiq". # :delivery_method: sidekiq + # # Always true. + # :delete_after_delivery: true # :delivery_options: # # The URL to the Redis server used by Sidekiq. Should match the URL in config/resque.yml. # :redis_url: redis://localhost:6379 diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md index 91eea956e5..5d36f5121d 100644 --- a/doc/reply_by_email/README.md +++ b/doc/reply_by_email/README.md @@ -59,6 +59,8 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. If you' :name: "inbox" # Always "sidekiq". :delivery_method: sidekiq + # Always true. + :delete_after_delivery: true :delivery_options: # The URL to the Redis server used by Sidekiq. Should match the URL in config/resque.yml. :redis_url: redis://localhost:6379 @@ -144,6 +146,8 @@ TODO :name: "inbox" # Always "sidekiq". :delivery_method: sidekiq + # Always true. + :delete_after_delivery: true :delivery_options: # The URL to the Redis server used by Sidekiq. Should match the URL in config/resque.yml. :redis_url: redis://localhost:6379 From eeac2aafbc444b1fe5ada430b15058b30628b364 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 24 Aug 2015 12:07:14 -0700 Subject: [PATCH 008/153] Move full_host fix changelog entry to 7.14.1 [ci skip] --- CHANGELOG | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index f22c337b72..5137879d31 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -3,7 +3,6 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) - Fix Error 500 in API when accessing a group that has an avatar (Stan Hu) - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) - - Only include base URL in OmniAuth full_host parameter (Stan Hu) - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) - Remove satellites - Better performance for web editor (switched from satellites to rugged) @@ -15,6 +14,9 @@ v 8.0.0 (unreleased) - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais) - Ability to search milestones +v 7.14.1 (unreleased) + - Only include base URL in OmniAuth full_host parameter (Stan Hu) + v 7.14.0 - Fix bug where non-project members of the target project could set labels on new merge requests. - Update default robots.txt rules to disallow crawling of irrelevant pages (Ben Bodenmiller) From 451873963a4c41e0edeb066545cafcb9a0df9c19 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 24 Aug 2015 12:27:02 -0700 Subject: [PATCH 009/153] Move changelog entry to 7.14.1 [ci skip] --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 5137879d31..5940d586d8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,6 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) - - Fix Error 500 in API when accessing a group that has an avatar (Stan Hu) - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) - Remove satellites @@ -16,6 +15,7 @@ v 8.0.0 (unreleased) v 7.14.1 (unreleased) - Only include base URL in OmniAuth full_host parameter (Stan Hu) + - Fix Error 500 in API when accessing a group that has an avatar (Stan Hu) v 7.14.0 - Fix bug where non-project members of the target project could set labels on new merge requests. From 646c1f0324650c5736e85db0deb55dceb943fa7a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 24 Aug 2015 18:56:01 -0700 Subject: [PATCH 010/153] Re-enable the "links with adjacent text" UserReferenceFilter spec --- spec/lib/gitlab/markdown/user_reference_filter_spec.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/lib/gitlab/markdown/user_reference_filter_spec.rb b/spec/lib/gitlab/markdown/user_reference_filter_spec.rb index a5405e14a7..02d923b036 100644 --- a/spec/lib/gitlab/markdown/user_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/user_reference_filter_spec.rb @@ -121,7 +121,6 @@ module Gitlab::Markdown end it 'links with adjacent text' do - skip "TODO (rspeicher): Re-enable when usernames can't end in periods." doc = filter("Mention me (#{reference}.)") expect(doc.to_html).to match(/\(#{reference}<\/a>\.\)/) end From 3bee4a6712a654abeba4ce07eb17235c3240b487 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Mon, 24 Aug 2015 23:35:26 -0700 Subject: [PATCH 011/153] Fix "Reload with full diff" URL button in compare branch view This button worked when viewing merge requests because the JavaScript stripped the .html in the Ajax request. However, it left the .html suffix in the compare branch view. --- CHANGELOG | 1 + app/views/projects/diffs/_warning.html.haml | 2 +- features/project/commits/commits.feature | 1 + features/steps/project/commits/commits.rb | 6 ++++++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 7eb6ab81dd..4e16536269 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Fix "Reload with full diff" URL button in compare branch view (Stan Hu) - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu) - Remove satellites diff --git a/app/views/projects/diffs/_warning.html.haml b/app/views/projects/diffs/_warning.html.haml index caed0e69dc..f99bc9a85e 100644 --- a/app/views/projects/diffs/_warning.html.haml +++ b/app/views/projects/diffs/_warning.html.haml @@ -3,7 +3,7 @@ Too many changes to show. .pull-right - unless diff_hard_limit_enabled? - = link_to "Reload with full diff", url_for(params.merge(force_show_diff: true, format: :html)), class: "btn btn-sm btn-warning" + = link_to "Reload with full diff", url_for(params.merge(force_show_diff: true, format: nil)), class: "btn btn-sm btn-warning" - if current_controller?(:commit) or current_controller?(:merge_requests) - if current_controller?(:commit) diff --git a/features/project/commits/commits.feature b/features/project/commits/commits.feature index c4b206edc9..3ebc8a39aa 100644 --- a/features/project/commits/commits.feature +++ b/features/project/commits/commits.feature @@ -41,6 +41,7 @@ Feature: Project Commits Scenario: I browse big commit Given I visit big commit page Then I see big commit warning + And I see "Reload with full diff" link Scenario: I browse a commit with an image Given I visit a commit with an image that changed diff --git a/features/steps/project/commits/commits.rb b/features/steps/project/commits/commits.rb index e6330ec457..a8532cc18d 100644 --- a/features/steps/project/commits/commits.rb +++ b/features/steps/project/commits/commits.rb @@ -79,6 +79,12 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps expect(page).to have_content "Too many changes" end + step 'I see "Reload with full diff" link' do + link = find_link('Reload with full diff') + expect(link[:href]).to end_with('?force_show_diff=true') + expect(link[:href]).not_to include('.html') + end + step 'I visit a commit with an image that changed' do visit namespace_project_commit_path(@project.namespace, @project, sample_image_commit.id) end From e02b7bf4435d0ff151239ac790849994066c0bc1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 25 Aug 2015 10:52:10 +0200 Subject: [PATCH 012/153] Improve abuse reports management * Link to user profile instead of user admin page * One button for remove user and report * Remove user and report with page reloading Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/application.js.coffee | 6 ++++++ app/controllers/admin/abuse_reports_controller.rb | 9 +++++++-- app/views/admin/abuse_reports/_abuse_report.html.haml | 11 +++++++---- app/views/admin/abuse_reports/index.html.haml | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index bb0a0c51fd..c263912b7e 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -116,6 +116,12 @@ $ -> $('.remove-row').bind 'ajax:success', -> $(this).closest('li').fadeOut() + $('.js-remove-tr').bind 'ajax:before', -> + $(this).hide() + + $('.js-remove-tr').bind 'ajax:success', -> + $(this).closest('tr').fadeOut() + # Initialize select2 selects $('select.select2').select2(width: 'resolve', dropdownAutoWidth: true) diff --git a/app/controllers/admin/abuse_reports_controller.rb b/app/controllers/admin/abuse_reports_controller.rb index 34f37bca4a..38a5a9fca0 100644 --- a/app/controllers/admin/abuse_reports_controller.rb +++ b/app/controllers/admin/abuse_reports_controller.rb @@ -4,8 +4,13 @@ class Admin::AbuseReportsController < Admin::ApplicationController end def destroy - AbuseReport.find(params[:id]).destroy + abuse_report = AbuseReport.find(params[:id]) - redirect_to admin_abuse_reports_path, notice: 'Report was removed' + if params[:remove_user] + abuse_report.user.destroy + end + + abuse_report.destroy + render nothing: true end end diff --git a/app/views/admin/abuse_reports/_abuse_report.html.haml b/app/views/admin/abuse_reports/_abuse_report.html.haml index 4449721ae3..785ce4b759 100644 --- a/app/views/admin/abuse_reports/_abuse_report.html.haml +++ b/app/views/admin/abuse_reports/_abuse_report.html.haml @@ -3,7 +3,7 @@ %tr %td - if reporter - = link_to reporter.name, [:admin, reporter] + = link_to reporter.name, reporter - else (removed) %td @@ -12,12 +12,15 @@ = abuse_report.message %td - if user - = link_to user.name, [:admin, user] + = link_to user.name, user - else (removed) %td - if user - = link_to 'Block', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-xs btn-warning" - = link_to 'Remove user', [:admin, user], data: { confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?" }, method: :delete, class: "btn btn-xs btn-remove" + = link_to 'Remove user & report', admin_abuse_report_path(abuse_report, remove_user: true), + data: { confirm: "USER #{user.name} WILL BE REMOVED! Are you sure?" }, remote: true, method: :delete, class: "btn btn-xs btn-remove js-remove-tr" + %td + - if user + = link_to 'Block user', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-xs btn-warning" = link_to 'Remove report', [:admin, abuse_report], method: :delete, class: "btn btn-xs btn-close" diff --git a/app/views/admin/abuse_reports/index.html.haml b/app/views/admin/abuse_reports/index.html.haml index 4a25848f15..2e8746146d 100644 --- a/app/views/admin/abuse_reports/index.html.haml +++ b/app/views/admin/abuse_reports/index.html.haml @@ -9,7 +9,7 @@ %th Reported at %th Message %th User - %th + %th Primary action %th = render @abuse_reports = paginate @abuse_reports From 13f8fc97843d3bb0f8c498835f740e44b1306395 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 25 Aug 2015 10:57:56 +0200 Subject: [PATCH 013/153] Fix remove report button Signed-off-by: Dmitriy Zaporozhets --- CHANGELOG | 1 + app/views/admin/abuse_reports/_abuse_report.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 5940d586d8..40b8ccb62f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -12,6 +12,7 @@ v 8.0.0 (unreleased) - Search for comments should be case insensetive - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais) - Ability to search milestones + - Improve abuse reports management from admin area v 7.14.1 (unreleased) - Only include base URL in OmniAuth full_host parameter (Stan Hu) diff --git a/app/views/admin/abuse_reports/_abuse_report.html.haml b/app/views/admin/abuse_reports/_abuse_report.html.haml index 785ce4b759..d3afc658cd 100644 --- a/app/views/admin/abuse_reports/_abuse_report.html.haml +++ b/app/views/admin/abuse_reports/_abuse_report.html.haml @@ -22,5 +22,5 @@ %td - if user - = link_to 'Block user', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-xs btn-warning" - = link_to 'Remove report', [:admin, abuse_report], method: :delete, class: "btn btn-xs btn-close" + = link_to 'Block user', block_admin_user_path(user), data: {confirm: 'USER WILL BE BLOCKED! Are you sure?'}, method: :put, class: "btn btn-xs" + = link_to 'Remove report', [:admin, abuse_report], remote: true, method: :delete, class: "btn btn-xs btn-close js-remove-tr" From 8f68c38746639d8714ff5aa12fe9a0fd362f4419 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 25 Aug 2015 14:13:04 +0200 Subject: [PATCH 014/153] Dashboard activity as separate page Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/dispatcher.js.coffee | 1 + app/controllers/dashboard_controller.rb | 22 ++++++++++++++------- app/views/dashboard/activity.html.haml | 6 ++++++ app/views/dashboard/show.html.haml | 9 +-------- app/views/layouts/nav/_dashboard.html.haml | 7 ++++++- config/routes.rb | 1 + 6 files changed, 30 insertions(+), 16 deletions(-) create mode 100644 app/views/dashboard/activity.html.haml diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee index 81e7379927..539041c286 100644 --- a/app/assets/javascripts/dispatcher.js.coffee +++ b/app/assets/javascripts/dispatcher.js.coffee @@ -51,6 +51,7 @@ class Dispatcher MergeRequests.init() when 'dashboard:show', 'root:show' new Dashboard() + when 'dashboard:activity' new Activities() when 'dashboard:projects:starred' new Activities() diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index d2f0c43929..d745131694 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -1,6 +1,6 @@ class DashboardController < Dashboard::ApplicationController before_action :load_projects - before_action :event_filter, only: :show + before_action :event_filter, only: :activity respond_to :html @@ -10,13 +10,8 @@ class DashboardController < Dashboard::ApplicationController respond_to do |format| format.html - - format.json do - load_events - pager_json("events/_events", @events.count) - end - format.atom do + event_filter load_events render layout: false end @@ -40,6 +35,19 @@ class DashboardController < Dashboard::ApplicationController end end + def activity + @last_push = current_user.recent_push + + respond_to do |format| + format.html + + format.json do + load_events + pager_json("events/_events", @events.count) + end + end + end + protected def load_projects diff --git a/app/views/dashboard/activity.html.haml b/app/views/dashboard/activity.html.haml new file mode 100644 index 0000000000..7a5a093add --- /dev/null +++ b/app/views/dashboard/activity.html.haml @@ -0,0 +1,6 @@ += content_for :meta_tags do + - if current_user + = auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity") + +%section.activities + = render 'activities' diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index a3a32b6932..1b6ea3d596 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -5,13 +5,6 @@ = render 'dashboard/projects_head' - if @projects.any? - = render 'shared/show_aside' - - .dashboard.row - %section.activities.col-md-8 - = render 'activities' - %aside.col-md-4 - = render 'sidebar' - + = render 'sidebar' - else = render "zero_authorized_projects" diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 8f010196d1..154fd41839 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,9 +1,14 @@ %ul.nav.nav-sidebar = nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do = link_to (current_user ? root_path : explore_root_path), title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do - = icon('dashboard fw') + = icon('home fw') %span Projects + = nav_link(path: 'dashboard#activity') do + = link_to activity_dashboard_path, title: 'Activity', data: {placement: 'right'} do + = icon('dashboard fw') + %span + Activity = nav_link(controller: :groups) do = link_to (current_user ? dashboard_groups_path : explore_groups_path), title: 'Groups', data: {placement: 'right'} do = icon('group fw') diff --git a/config/routes.rb b/config/routes.rb index d7307a61ed..8ba439f08b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -261,6 +261,7 @@ Gitlab::Application.routes.draw do member do get :issues get :merge_requests + get :activity end scope module: :dashboard do From c11e43145f87436062f3840d16a9fcf97286265a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 25 Aug 2015 15:23:25 +0200 Subject: [PATCH 015/153] Make some visual improvements to dashboard page after we moved activity Signed-off-by: Dmitriy Zaporozhets --- .../javascripts/projects_list.js.coffee | 2 +- app/assets/stylesheets/pages/dashboard.scss | 38 +------------------ app/assets/stylesheets/pages/projects.scss | 31 +++++++++++++++ app/views/dashboard/_projects.html.haml | 9 +++-- app/views/dashboard/show.html.haml | 2 +- app/views/groups/_projects.html.haml | 2 +- app/views/shared/_project.html.haml | 6 ++- 7 files changed, 46 insertions(+), 44 deletions(-) diff --git a/app/assets/javascripts/projects_list.js.coffee b/app/assets/javascripts/projects_list.js.coffee index c0e36d1ccc..db5faf71fa 100644 --- a/app/assets/javascripts/projects_list.js.coffee +++ b/app/assets/javascripts/projects_list.js.coffee @@ -8,7 +8,7 @@ class @ProjectsList $(".projects-list-filter").keyup -> terms = $(this).val() - uiBox = $(this).closest('.panel') + uiBox = $(this).closest('.projects-list-holder') if terms == "" || terms == undefined uiBox.find(".projects-list li").show() else diff --git a/app/assets/stylesheets/pages/dashboard.scss b/app/assets/stylesheets/pages/dashboard.scss index 9a3b543ad1..c1103a1c2e 100644 --- a/app/assets/stylesheets/pages/dashboard.scss +++ b/app/assets/stylesheets/pages/dashboard.scss @@ -23,41 +23,6 @@ } } -.project-row, .group-row { - padding: 0 !important; - font-size: 14px; - line-height: 24px; - - a { - display: block; - padding: 8px 15px; - } - - .project-name, .group-name { - font-weight: 500; - } - - .arrow { - float: right; - margin: 0; - font-size: 20px; - } - - .last-activity { - float: right; - font-size: 12px; - color: #AAA; - display: block; - .date { - color: #777; - } - } -} - -.project-description { - overflow: hidden; -} - .project-access-icon { margin-left: 10px; float: left; @@ -73,10 +38,9 @@ float: left; .avatar { - margin-top: -8px; - margin-left: -15px; @include border-radius(0px); } + .identicon { line-height: 40px; } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 29d3dbc25e..1e138651d5 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -316,3 +316,34 @@ table.table.protected-branches-list tr.no-border { pre.light-well { border-color: #f1f1f1; } + +.projects-search-form { + max-width: 600px; + margin: 0 auto; + margin-bottom: 20px; + + input { + border-color: #BBB; + } +} + +.project-row { + .project-full-name { + font-weight: bold; + font-size: 15px; + } + + .project-description { + color: #888; + font-size: 13px; + + p { + margin-bottom: 0; + color: #888; + } + } +} + +.my-projects .project-row { + padding: 10px 0; +} diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml index d676576067..dc83d5343f 100644 --- a/app/views/dashboard/_projects.html.haml +++ b/app/views/dashboard/_projects.html.haml @@ -1,5 +1,5 @@ -.panel.panel-default - .panel-heading.clearfix +.projects-list-holder + .projects-search-form .input-group = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' - if current_user.can_create_project? @@ -7,4 +7,7 @@ = link_to new_project_path, class: 'btn btn-success' do New project - = render 'shared/projects_list', projects: @projects, projects_limit: 20 + %ul.projects-list.bordered-list.my-projects + - @projects.each do |project| + %li.project-row + = render partial: 'shared/project', locals: { project: project, avatar: true, stars: true } diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index 1b6ea3d596..44372b921c 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -5,6 +5,6 @@ = render 'dashboard/projects_head' - if @projects.any? - = render 'sidebar' + = render 'projects' - else = render "zero_authorized_projects" diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 4f8aec1c67..2ae51a1c8c 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -1,4 +1,4 @@ -.panel.panel-default +.panel.panel-default.projects-list-holder .panel-heading.clearfix .input-group = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' diff --git a/app/views/shared/_project.html.haml b/app/views/shared/_project.html.haml index 6bd61455d2..15df97b133 100644 --- a/app/views/shared/_project.html.haml +++ b/app/views/shared/_project.html.haml @@ -3,7 +3,7 @@ - if avatar .dash-project-avatar = project_icon(project, alt: '', class: 'avatar project-avatar s40') - %span.str-truncated + %span.str-truncated.project-full-name %span.namespace-name - if project.namespace = project.namespace.human_name @@ -14,3 +14,7 @@ %span.pull-right.light %i.fa.fa-star = project.star_count + - if project.description.present? + .project-description + .str-truncated + = markdown(project.description, pipeline: :description) From 7569010bc3918af0098e00eb56fce1a18d8ca72e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 25 Aug 2015 16:36:54 +0200 Subject: [PATCH 016/153] Fix tests and last push widget Signed-off-by: Dmitriy Zaporozhets --- CHANGELOG | 1 + app/views/dashboard/projects/starred.html.haml | 2 +- app/views/dashboard/show.html.haml | 3 +++ app/views/events/_event_last_push.html.haml | 2 +- features/dashboard/dashboard.feature | 8 ++++++-- features/dashboard/event_filters.feature | 8 ++++---- features/steps/shared/paths.rb | 4 ++++ 7 files changed, 20 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 35b5803d34..cf3ce803e0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -14,6 +14,7 @@ v 8.0.0 (unreleased) - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais) - Ability to search milestones - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu) + - Move dashboard activity to separate page v 7.14.1 (unreleased) - Only include base URL in OmniAuth full_host parameter (Stan Hu) diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml index 98b8cde476..027387028b 100644 --- a/app/views/dashboard/projects/starred.html.haml +++ b/app/views/dashboard/projects/starred.html.haml @@ -8,7 +8,7 @@ %section.activities.col-md-8 = render 'dashboard/activities' %aside.col-md-4 - .panel.panel-default + .panel.panel-default.projects-list-holder .panel-heading.clearfix .input-group = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index 44372b921c..4cf2feb9aa 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -4,6 +4,9 @@ = render 'dashboard/projects_head' +- if @last_push + = render "events/event_last_push", event: @last_push + - if @projects.any? = render 'projects' - else diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml index 501412642d..6a0c6cba41 100644 --- a/app/views/events/_event_last_push.html.haml +++ b/app/views/events/_event_last_push.html.haml @@ -9,6 +9,6 @@ #{time_ago_with_tooltip(event.created_at)} .pull-right - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-create btn-sm" do + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do Create Merge Request %hr diff --git a/features/dashboard/dashboard.feature b/features/dashboard/dashboard.feature index 1959d32708..392d4235ef 100644 --- a/features/dashboard/dashboard.feature +++ b/features/dashboard/dashboard.feature @@ -10,6 +10,10 @@ Feature: Dashboard Scenario: I should see projects list Then I should see "New Project" link Then I should see "Shop" project link + + @javascript + Scenario: I should see activity list + And I visit dashboard activity page Then I should see project "Shop" activity feed Scenario: I should see groups list @@ -26,12 +30,12 @@ Feature: Dashboard @javascript Scenario: I should see User joined Project event Given user with name "John Doe" joined project "Shop" - When I visit dashboard page + When I visit dashboard activity page Then I should see "John Doe joined project Shop" event @javascript Scenario: I should see User left Project event Given user with name "John Doe" joined project "Shop" And user with name "John Doe" left project "Shop" - When I visit dashboard page + When I visit dashboard activity page Then I should see "John Doe left project Shop" event diff --git a/features/dashboard/event_filters.feature b/features/dashboard/event_filters.feature index ec5680caba..96399ea21a 100644 --- a/features/dashboard/event_filters.feature +++ b/features/dashboard/event_filters.feature @@ -6,7 +6,7 @@ Feature: Event Filters And this project has push event And this project has new member event And this project has merge request event - And I visit dashboard page + And I visit dashboard activity page @javascript Scenario: I should see all events @@ -16,7 +16,7 @@ Feature: Event Filters @javascript Scenario: I should see only pushed events - When I click "push" event filter + When I click "push" event filter Then I should see push event And I should not see new member event And I should not see merge request event @@ -38,11 +38,11 @@ Feature: Event Filters @javascript Scenario: I should see only selected events while page reloaded When I click "push" event filter - And I visit dashboard page + And I visit dashboard activity page Then I should see push event And I should not see new member event When I click "team" event filter - And I visit dashboard page + And I visit dashboard activity page Then I should see push event And I should see new member event And I should not see merge request event diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index ca8fbb4910..b4deccb652 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -71,6 +71,10 @@ module SharedPaths visit dashboard_path end + step 'I visit dashboard activity page' do + visit activity_dashboard_path + end + step 'I visit dashboard projects page' do visit projects_dashboard_path end From 4a4d9fe16e371c4c5d4423a285758abe1d04d84d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Rosen=C3=B6gger?= <123haynes@gmail.com> Date: Tue, 25 Aug 2015 17:58:29 +0200 Subject: [PATCH 017/153] UI Improvement for the project page This commit improves the positioning of the dropdown menu on the project page. --- CHANGELOG | 1 + app/assets/stylesheets/pages/projects.scss | 4 ++++ app/views/projects/buttons/_dropdown.html.haml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index a66e898652..8048ca1373 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Improve dropdown positioning on the project home page (Hannes Rosenögger) - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu) - Fix "Reload with full diff" URL button in compare branch view (Stan Hu) - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 29d3dbc25e..505b93b3bc 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -30,6 +30,10 @@ } } + .project-home-dropdown { + margin: 11px 3px 0; + } + .project-home-desc { h1 { margin: 0; diff --git a/app/views/projects/buttons/_dropdown.html.haml b/app/views/projects/buttons/_dropdown.html.haml index cade930c8c..bc7625e898 100644 --- a/app/views/projects/buttons/_dropdown.html.haml +++ b/app/views/projects/buttons/_dropdown.html.haml @@ -2,7 +2,7 @@ %span.dropdown %a.dropdown-toggle.btn.btn-new{href: '#', "data-toggle" => "dropdown"} = icon('plus') - %ul.dropdown-menu + %ul.dropdown-menu.dropdown-menu-right.project-home-dropdown - if can?(current_user, :create_issue, @project) %li = link_to url_for_new_issue do From 084da5253b699b0734e17839f6ffebd4dc414320 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 25 Aug 2015 18:20:06 +0200 Subject: [PATCH 018/153] Re-use project partial for rendering explore projects Signed-off-by: Dmitriy Zaporozhets --- app/views/explore/projects/_project.html.haml | 24 ------------------- .../explore/projects/_projects.html.haml | 6 +++++ app/views/explore/projects/index.html.haml | 9 ++----- app/views/explore/projects/starred.html.haml | 5 +--- app/views/explore/projects/trending.html.haml | 4 +--- app/views/layouts/nav/_dashboard.html.haml | 2 +- 6 files changed, 11 insertions(+), 39 deletions(-) delete mode 100644 app/views/explore/projects/_project.html.haml create mode 100644 app/views/explore/projects/_projects.html.haml diff --git a/app/views/explore/projects/_project.html.haml b/app/views/explore/projects/_project.html.haml deleted file mode 100644 index 1e8a89e366..0000000000 --- a/app/views/explore/projects/_project.html.haml +++ /dev/null @@ -1,24 +0,0 @@ -%li - %h4.project-title - .project-access-icon - = visibility_level_icon(project.visibility_level) - = link_to project.name_with_namespace, [project.namespace.becomes(Namespace), project] - %span.pull-right - %i.fa.fa-star - = project.star_count - - .project-info - - if project.description.present? - .project-description.str-truncated - = markdown(project.description, pipeline: :description) - - .repo-info - - unless project.empty_repo? - = link_to pluralize(round_commit_count(project), 'commit'), namespace_project_commits_path(project.namespace, project, project.default_branch) - · - = link_to pluralize(project.repository.branch_names.count, 'branch'), namespace_project_branches_path(project.namespace, project) - · - = link_to pluralize(project.repository.tag_names.count, 'tag'), namespace_project_tags_path(project.namespace, project) - - else - %i.fa.fa-exclamation-triangle - Empty repository diff --git a/app/views/explore/projects/_projects.html.haml b/app/views/explore/projects/_projects.html.haml new file mode 100644 index 0000000000..22cc541115 --- /dev/null +++ b/app/views/explore/projects/_projects.html.haml @@ -0,0 +1,6 @@ +%ul.projects-list.bordered-list.my-projects.public-projects + - projects.each do |project| + %li.project-row + = render partial: 'shared/project', locals: { project: project, avatar: true, stars: true } +- unless projects.present? + .nothing-here-block No such projects diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index 4956081e1e..0cfdf5cfd1 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -4,10 +4,5 @@ .clearfix = render 'filter' %br -.public-projects - %ul.bordered-list.top-list - = render @projects - - unless @projects.present? - .nothing-here-block No public projects - - = paginate @projects, theme: "gitlab" += render 'projects', projects: @projects += paginate @projects, theme: "gitlab" diff --git a/app/views/explore/projects/starred.html.haml b/app/views/explore/projects/starred.html.haml index fdccbe5692..4a9fcae4be 100644 --- a/app/views/explore/projects/starred.html.haml +++ b/app/views/explore/projects/starred.html.haml @@ -7,8 +7,5 @@ See most starred projects .pull-right = render 'explore/projects/dropdown' - .public-projects - %ul.bordered-list - = render @starred_projects - + = render 'projects', projects: @starred_projects = paginate @starred_projects, theme: 'gitlab' diff --git a/app/views/explore/projects/trending.html.haml b/app/views/explore/projects/trending.html.haml index 98a4174b42..4c7e7d4473 100644 --- a/app/views/explore/projects/trending.html.haml +++ b/app/views/explore/projects/trending.html.haml @@ -13,6 +13,4 @@ See most discussed projects for last month .pull-right = render 'explore/projects/dropdown' - .public-projects - %ul.bordered-list - = render @trending_projects + = render 'projects', projects: @trending_projects diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 154fd41839..d620c02227 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -34,7 +34,7 @@ %span.count= current_user.assigned_merge_requests.opened.count = nav_link(controller: :snippets) do = link_to (current_user ? user_snippets_path(current_user) : snippets_path), title: 'Your snippets', data: {placement: 'right'} do - = icon('dashboard fw') + = icon('clipboard fw') %span Snippets - if current_user From ad85f1f560224a3f276e57dcf638a6e41eb231eb Mon Sep 17 00:00:00 2001 From: Josef Kufner Date: Wed, 13 May 2015 12:51:47 +0200 Subject: [PATCH 019/153] Change plots to bar graphs --- app/views/projects/graphs/commits.html.haml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/app/views/projects/graphs/commits.html.haml b/app/views/projects/graphs/commits.html.haml index 141acbdcf7..a357736bf5 100644 --- a/app/views/projects/graphs/commits.html.haml +++ b/app/views/projects/graphs/commits.html.haml @@ -50,39 +50,42 @@ datasets : [{ fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#EEE", + barStrokeWidth: 1, + barValueSpacing: 1, + barDatasetSpacing: 1, data : #{@commits_per_time.values.to_json} }] } ctx = $("#hour-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) + new Chart(ctx).Bar(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) data = { labels : #{@commits_per_week_days.keys.to_json}, datasets : [{ fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#EEE", + barStrokeWidth: 1, + barValueSpacing: 1, + barDatasetSpacing: 1, data : #{@commits_per_week_days.values.to_json} }] } ctx = $("#weekday-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) + new Chart(ctx).Bar(data,{"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) data = { labels : #{@commits_per_month.keys.to_json}, datasets : [{ fillColor : "rgba(220,220,220,0.5)", strokeColor : "rgba(220,220,220,1)", - pointColor : "rgba(220,220,220,1)", - pointStrokeColor : "#EEE", + barStrokeWidth: 1, + barValueSpacing: 1, + barDatasetSpacing: 1, data : #{@commits_per_month.values.to_json} }] } ctx = $("#month-chart").get(0).getContext("2d"); - new Chart(ctx).Line(data, {"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) + new Chart(ctx).Bar(data, {"scaleOverlay": true, responsive: true, pointHitDetectionRadius: 2}) From fa65db9aa876289bcb5974edfdd15f181c9a1ac5 Mon Sep 17 00:00:00 2001 From: Josef Kufner Date: Mon, 24 Aug 2015 23:51:50 +0200 Subject: [PATCH 020/153] Add changelog entry --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index 5222ab1e3e..3ccb096214 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -306,6 +306,7 @@ v 7.11.0 - Protect OmniAuth request phase against CSRF. - Don't send notifications to mentioned users that don't have access to the project in question. - Add search issues/MR by number + - Change plots to bar graphs in commit statistics screen - Move snippets UI to fluid layout - Improve UI for sidebar. Increase separation between navigation and content - Improve new project command options (Ben Bodenmiller) From 1eba96c636fc441c7fafbffe0a3cdf195a1595f9 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Tue, 25 Aug 2015 20:24:38 +0200 Subject: [PATCH 021/153] Update Racc to 1.4.12 This ensures GitLab can actually run Rubinius, previously it would segfault in Racc during the bootup phase. --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index a7cfe6b751..07a44c5055 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -462,7 +462,7 @@ GEM pyu-ruby-sasl (0.0.3.3) quiet_assets (1.0.2) railties (>= 3.1, < 5.0) - racc (1.4.10) + racc (1.4.12) rack (1.5.5) rack-accept (0.4.5) rack (>= 0.4) From 02e7b00a54ebfebc51acab0a7f7e15adc93f4bb0 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 25 Aug 2015 12:03:58 -0700 Subject: [PATCH 022/153] Fix init script for Reply by email --- lib/support/init.d/gitlab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/support/init.d/gitlab b/lib/support/init.d/gitlab index 41a2f254db..457bd31e23 100755 --- a/lib/support/init.d/gitlab +++ b/lib/support/init.d/gitlab @@ -288,7 +288,7 @@ print_status() { fi if [ "$mail_room_enabled" = true ]; then if [ "$mail_room_status" = "0" ]; then - echo "The GitLab MailRoom email processor with pid $spid is running." + echo "The GitLab MailRoom email processor with pid $mpid is running." else printf "The GitLab MailRoom email processor is \033[31mnot running\033[0m.\n" fi From 4344b8d2d4367b19c6849c3cab0d02d17ddf2304 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 25 Aug 2015 14:31:33 -0700 Subject: [PATCH 023/153] Add Gitlab::ColorSchemes module Very similar to Gitlab::Theme, this contains all of the definitions for our syntax highlighting schemes. --- app/helpers/preferences_helper.rb | 25 +------- app/views/profiles/preferences/show.html.haml | 8 +-- lib/gitlab/color_schemes.rb | 62 +++++++++++++++++++ spec/lib/gitlab/color_schemes_spec.rb | 45 ++++++++++++++ spec/lib/gitlab/themes_spec.rb | 3 - 5 files changed, 113 insertions(+), 30 deletions(-) create mode 100644 lib/gitlab/color_schemes.rb create mode 100644 spec/lib/gitlab/color_schemes_spec.rb diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index ea774e28ec..b294ddc9d7 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -1,25 +1,5 @@ # Helper methods for per-User preferences module PreferencesHelper - COLOR_SCHEMES = { - 1 => 'white', - 2 => 'dark', - 3 => 'solarized-light', - 4 => 'solarized-dark', - 5 => 'monokai', - } - COLOR_SCHEMES.default = 'white' - - # Helper method to access the COLOR_SCHEMES - # - # The keys are the `color_scheme_ids` - # The values are the `name` of the scheme. - # - # The preview images are `name-scheme-preview.png` - # The stylesheets should use the css class `.name` - def color_schemes - COLOR_SCHEMES.freeze - end - # Maps `dashboard` values to more user-friendly option text DASHBOARD_CHOICES = { projects: 'Your Projects (default)', @@ -50,12 +30,11 @@ module PreferencesHelper end def user_application_theme - theme = Gitlab::Themes.by_id(current_user.try(:theme_id)) - theme.css_class + Gitlab::Themes.by_id(current_user.try(:theme_id)).css_class end def user_color_scheme_class - COLOR_SCHEMES[current_user.try(:color_scheme_id)] if defined?(current_user) + Gitlab::ColorSchemes.by_id(current_user.try(:color_scheme_id)).css_class end def prefer_readme? diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index 1134317ee0..aa0361a0a1 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -22,11 +22,11 @@ .panel-heading Syntax highlighting theme .panel-body - - color_schemes.each do |color_scheme_id, color_scheme| + - Gitlab::ColorSchemes.each do |scheme| = label_tag do - .preview= image_tag "#{color_scheme}-scheme-preview.png" - = f.radio_button :color_scheme_id, color_scheme_id - = color_scheme.tr('-_', ' ').titleize + .preview= image_tag "#{scheme.css_class}-scheme-preview.png" + = f.radio_button :color_scheme_id, scheme.id + = scheme.name .panel.panel-default .panel-heading diff --git a/lib/gitlab/color_schemes.rb b/lib/gitlab/color_schemes.rb new file mode 100644 index 0000000000..763853ab1c --- /dev/null +++ b/lib/gitlab/color_schemes.rb @@ -0,0 +1,62 @@ +module Gitlab + # Module containing GitLab's syntax color scheme definitions and helper + # methods for accessing them. + module ColorSchemes + # Struct class representing a single Scheme + Scheme = Struct.new(:id, :name, :css_class) + + SCHEMES = [ + Scheme.new(1, 'White', 'white'), + Scheme.new(2, 'Dark', 'dark'), + Scheme.new(3, 'Solarized Light', 'solarized-light'), + Scheme.new(4, 'Solarized Dark', 'solarized-dark'), + Scheme.new(5, 'Monokai', 'monokai') + ].freeze + + # Convenience method to get a space-separated String of all the color scheme + # classes that might be applied to a code block. + # + # Returns a String + def self.body_classes + SCHEMES.collect(&:css_class).uniq.join(' ') + end + + # Get a Scheme by its ID + # + # If the ID is invalid, returns the default Scheme. + # + # id - Integer ID + # + # Returns a Scheme + def self.by_id(id) + SCHEMES.detect { |s| s.id == id } || default + end + + # Get the default Scheme + # + # Returns a Scheme + def self.default + by_id(1) + end + + # Iterate through each Scheme + # + # Yields the Scheme object + def self.each(&block) + SCHEMES.each(&block) + end + + # Get the Scheme for the specified user, or the default + # + # user - User record + # + # Returns a Scheme + def self.for_user(user) + if user + by_id(user.color_scheme_id) + else + default + end + end + end +end diff --git a/spec/lib/gitlab/color_schemes_spec.rb b/spec/lib/gitlab/color_schemes_spec.rb new file mode 100644 index 0000000000..c7be45dbcd --- /dev/null +++ b/spec/lib/gitlab/color_schemes_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +describe Gitlab::ColorSchemes do + describe '.body_classes' do + it 'returns a space-separated list of class names' do + css = described_class.body_classes + + expect(css).to include('white') + expect(css).to include(' solarized-light ') + expect(css).to include(' monokai') + end + end + + describe '.by_id' do + it 'returns a scheme by its ID' do + expect(described_class.by_id(1).name).to eq 'White' + expect(described_class.by_id(4).name).to eq 'Solarized Dark' + end + end + + describe '.default' do + it 'returns the default scheme' do + expect(described_class.default.id).to eq 1 + end + end + + describe '.each' do + it 'passes the block to the SCHEMES Array' do + ids = [] + described_class.each { |scheme| ids << scheme.id } + expect(ids).not_to be_empty + end + end + + describe '.for_user' do + it 'returns default when user is nil' do + expect(described_class.for_user(nil).id).to eq 1 + end + + it "returns user's preferred color scheme" do + user = double(color_scheme_id: 5) + expect(described_class.for_user(user).id).to eq 5 + end + end +end diff --git a/spec/lib/gitlab/themes_spec.rb b/spec/lib/gitlab/themes_spec.rb index 9c6c3fd810..e554458e41 100644 --- a/spec/lib/gitlab/themes_spec.rb +++ b/spec/lib/gitlab/themes_spec.rb @@ -43,9 +43,6 @@ describe Gitlab::Themes do ids = [] described_class.each { |theme| ids << theme.id } expect(ids).not_to be_empty - - # TODO (rspeicher): RSpec 3.x - # expect(described_class.each).to yield_with_arg(described_class::Theme) end end end From 59180c4f5a553938ee79968e7983aee6ce584ff5 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 25 Aug 2015 15:23:41 -0700 Subject: [PATCH 024/153] Add highlight_word style definition to each color scheme Now we don't need to override the user color scheme on search results. They'll look good with any of them. --- app/assets/stylesheets/generic/common.scss | 4 ---- app/assets/stylesheets/highlight/dark.scss | 6 ++++++ app/assets/stylesheets/highlight/monokai.scss | 6 ++++++ app/assets/stylesheets/highlight/solarized_dark.scss | 5 +++++ app/assets/stylesheets/highlight/solarized_light.scss | 5 +++++ app/assets/stylesheets/highlight/white.scss | 5 +++++ 6 files changed, 27 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index bf5c7a8d75..7281b26179 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -132,10 +132,6 @@ p.time { text-shadow: none; } -.highlight_word { - background: #fafe3d; -} - .thin_area{ height: 150px; } diff --git a/app/assets/stylesheets/highlight/dark.scss b/app/assets/stylesheets/highlight/dark.scss index c8cb18ec35..8323a8598e 100644 --- a/app/assets/stylesheets/highlight/dark.scss +++ b/app/assets/stylesheets/highlight/dark.scss @@ -21,6 +21,12 @@ pre.code.highlight.dark, background-color: #557 !important; } + // Search result highlight + span.highlight_word { + background: #ffe792; + color: #000000; + } + .hll { background-color: #373b41 } .c { color: #969896 } /* Comment */ .err { color: #cc6666 } /* Error */ diff --git a/app/assets/stylesheets/highlight/monokai.scss b/app/assets/stylesheets/highlight/monokai.scss index 001e8b3102..e838167433 100644 --- a/app/assets/stylesheets/highlight/monokai.scss +++ b/app/assets/stylesheets/highlight/monokai.scss @@ -21,6 +21,12 @@ pre.code.monokai, background-color: #49483e !important; } + // Search result highlight + span.highlight_word { + background: #ffe792; + color: #000000; + } + .hll { background-color: #49483e } .c { color: #75715e } /* Comment */ .err { color: #960050; background-color: #1e0010 } /* Error */ diff --git a/app/assets/stylesheets/highlight/solarized_dark.scss b/app/assets/stylesheets/highlight/solarized_dark.scss index f5b827e7c0..bd41480aef 100644 --- a/app/assets/stylesheets/highlight/solarized_dark.scss +++ b/app/assets/stylesheets/highlight/solarized_dark.scss @@ -21,6 +21,11 @@ pre.code.highlight.solarized-dark, background-color: #174652 !important; } + // Search result highlight + span.highlight_word { + background: #094554; + } + /* Solarized Dark For use with Jekyll and Pygments diff --git a/app/assets/stylesheets/highlight/solarized_light.scss b/app/assets/stylesheets/highlight/solarized_light.scss index 6b44c00c30..4cc6286387 100644 --- a/app/assets/stylesheets/highlight/solarized_light.scss +++ b/app/assets/stylesheets/highlight/solarized_light.scss @@ -21,6 +21,11 @@ pre.code.highlight.solarized-light, background-color: #ddd8c5 !important; } + // Search result highlight + span.highlight_word { + background: #eee8d5; + } + /* Solarized Light For use with Jekyll and Pygments diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index a52ffc971d..e0edfb80b4 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -21,6 +21,11 @@ pre.code.highlight.white, background-color: #f8eec7 !important; } + // Search result highlight + span.highlight_word { + background: #fafe3d; + } + .hll { background-color: #f8f8f8 } .c { color: #999988; font-style: italic; } .err { color: #a61717; background-color: #e3d2d2; } From 2c3e42e4a44e2f40e521cbafc8144e5d7c366b76 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 25 Aug 2015 15:24:53 -0700 Subject: [PATCH 025/153] Remove user_color_scheme_class Instead of rendering this value server-side, we use Javascript and Gon to apply the user's color scheme (or the default) to any syntax highlighted code blocks. This will make it easier to cache these blocks in the future because they're no longer state-dependent. --- .../javascripts/syntax_highlight.coffee | 9 ++++++++ app/controllers/application_controller.rb | 9 ++++---- app/helpers/gitlab_markdown_helper.rb | 2 +- app/helpers/preferences_helper.rb | 4 ---- app/views/search/results/_blob.html.haml | 2 +- .../search/results/_snippet_blob.html.haml | 2 +- app/views/search/results/_wiki_blob.html.haml | 2 +- app/views/shared/_file_highlight.html.haml | 2 +- lib/redcarpet/render/gitlab_html.rb | 5 ++--- spec/features/markdown_spec.rb | 4 ---- spec/helpers/preferences_helper_spec.rb | 21 ------------------- 11 files changed, 21 insertions(+), 41 deletions(-) create mode 100644 app/assets/javascripts/syntax_highlight.coffee diff --git a/app/assets/javascripts/syntax_highlight.coffee b/app/assets/javascripts/syntax_highlight.coffee new file mode 100644 index 0000000000..510f15d1b4 --- /dev/null +++ b/app/assets/javascripts/syntax_highlight.coffee @@ -0,0 +1,9 @@ +# Applies a syntax highlighting color scheme CSS class to any element with the +# `js-syntax-highlight` class +# +# ### Example Markup +# +#
+# +$(document).on 'ready page:load', -> + $('.js-syntax-highlight').addClass(gon.user_color_scheme) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 12d439b0b3..b51a9600c1 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -190,11 +190,12 @@ class ApplicationController < ActionController::Base end def add_gon_variables + gon.api_version = API::API.version + gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s gon.default_issues_tracker = Project.new.default_issue_tracker.to_param - gon.api_version = API::API.version - gon.relative_url_root = Gitlab.config.gitlab.relative_url_root - gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s - gon.max_file_size = current_application_settings.max_attachment_size; + gon.max_file_size = current_application_settings.max_attachment_size + gon.relative_url_root = Gitlab.config.gitlab.relative_url_root + gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class if current_user gon.current_user_id = current_user.id diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index eb3f72a307..114730eb94 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -58,7 +58,7 @@ module GitlabMarkdownHelper @options = options # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch - rend = Redcarpet::Render::GitlabHTML.new(self, user_color_scheme_class, options) + rend = Redcarpet::Render::GitlabHTML.new(self, options) # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use @markdown = Redcarpet::Markdown.new(rend, MARKDOWN_OPTIONS) diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index b294ddc9d7..51a6b3fa99 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -33,10 +33,6 @@ module PreferencesHelper Gitlab::Themes.by_id(current_user.try(:theme_id)).css_class end - def user_color_scheme_class - Gitlab::ColorSchemes.by_id(current_user.try(:color_scheme_id)).css_class - end - def prefer_readme? !current_user || current_user.project_view == 'readme' diff --git a/app/views/search/results/_blob.html.haml b/app/views/search/results/_blob.html.haml index 58f58eff54..0fe8a3b490 100644 --- a/app/views/search/results/_blob.html.haml +++ b/app/views/search/results/_blob.html.haml @@ -7,4 +7,4 @@ %strong = blob.filename .file-content.code.term - = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline, user_color_scheme_class: 'white' + = render 'shared/file_highlight', blob: blob, first_line_number: blob.startline diff --git a/app/views/search/results/_snippet_blob.html.haml b/app/views/search/results/_snippet_blob.html.haml index 9509985391..19a7bfefef 100644 --- a/app/views/search/results/_snippet_blob.html.haml +++ b/app/views/search/results/_snippet_blob.html.haml @@ -23,7 +23,7 @@ .nothing-here-block Empty file - else .file-content.code - %div.highlighted-data{class: user_color_scheme_class} + %div.highlighted-data.js-syntax-highlight .line-numbers - snippet_blob[:snippet_chunks].each do |snippet| - unless snippet[:data].empty? diff --git a/app/views/search/results/_wiki_blob.html.haml b/app/views/search/results/_wiki_blob.html.haml index c03438eb95..f5859481d4 100644 --- a/app/views/search/results/_wiki_blob.html.haml +++ b/app/views/search/results/_wiki_blob.html.haml @@ -7,4 +7,4 @@ %strong = wiki_blob.filename .file-content.code.term - = render 'shared/file_highlight', blob: wiki_blob, first_line_number: wiki_blob.startline, user_color_scheme_class: 'white' + = render 'shared/file_highlight', blob: wiki_blob, first_line_number: wiki_blob.startline diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml index d6a2e177da..7b1c624d76 100644 --- a/app/views/shared/_file_highlight.html.haml +++ b/app/views/shared/_file_highlight.html.haml @@ -1,4 +1,4 @@ -.file-content.code{class: user_color_scheme_class} +.file-content.code.js-syntax-highlight .line-numbers - if blob.data.present? - blob.data.lines.each_index do |index| diff --git a/lib/redcarpet/render/gitlab_html.rb b/lib/redcarpet/render/gitlab_html.rb index f57b56cbdf..9cb8e91d6e 100644 --- a/lib/redcarpet/render/gitlab_html.rb +++ b/lib/redcarpet/render/gitlab_html.rb @@ -4,9 +4,8 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML attr_reader :template alias_method :h, :template - def initialize(template, color_scheme, options = {}) + def initialize(template, options = {}) @template = template - @color_scheme = color_scheme @options = options.dup @options.reverse_merge!( @@ -35,7 +34,7 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML end formatter = Rouge::Formatters::HTMLGitlab.new( - cssclass: "code highlight #{@color_scheme} #{lexer.tag}" + cssclass: "code highlight js-syntax-highlight #{lexer.tag}" ) formatter.format(lexer.lex(code)) end diff --git a/spec/features/markdown_spec.rb b/spec/features/markdown_spec.rb index 3da4dfc2b2..d32bd4adb5 100644 --- a/spec/features/markdown_spec.rb +++ b/spec/features/markdown_spec.rb @@ -224,8 +224,4 @@ describe 'GitLab Markdown', feature: true do def current_user @feat.user end - - def user_color_scheme_class - :white - end end diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb index d814b56211..b4dee272bf 100644 --- a/spec/helpers/preferences_helper_spec.rb +++ b/spec/helpers/preferences_helper_spec.rb @@ -48,25 +48,4 @@ describe PreferencesHelper do ] end end - - describe 'user_color_scheme_class' do - context 'with current_user is nil' do - it 'should return a string' do - allow(self).to receive(:current_user).and_return(nil) - expect(user_color_scheme_class).to be_kind_of(String) - end - end - - context 'with a current_user' do - (1..5).each do |color_scheme_id| - context "with color_scheme_id == #{color_scheme_id}" do - it 'should return a string' do - current_user = double(color_scheme_id: color_scheme_id) - allow(self).to receive(:current_user).and_return(current_user) - expect(user_color_scheme_class).to be_kind_of(String) - end - end - end - end - end end From c401543d02487888a71966518fa8cb4f17de1397 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 25 Aug 2015 15:57:55 -0700 Subject: [PATCH 026/153] Fix failing spec --- spec/features/markdown_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/features/markdown_spec.rb b/spec/features/markdown_spec.rb index d32bd4adb5..4fe019f834 100644 --- a/spec/features/markdown_spec.rb +++ b/spec/features/markdown_spec.rb @@ -64,8 +64,8 @@ describe 'GitLab Markdown', feature: true do it 'parses fenced code blocks' do aggregate_failures do - expect(doc).to have_selector('pre.code.highlight.white.c') - expect(doc).to have_selector('pre.code.highlight.white.python') + expect(doc).to have_selector('pre.code.highlight.js-syntax-highlight.c') + expect(doc).to have_selector('pre.code.highlight.js-syntax-highlight.python') end end From d6a145d4b0b8d2baa63f2c1699ba44ea203a4ae8 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 25 Aug 2015 16:26:20 -0700 Subject: [PATCH 027/153] Fix two more failing specs --- spec/helpers/events_helper_spec.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/spec/helpers/events_helper_spec.rb b/spec/helpers/events_helper_spec.rb index da58ab9846..e68a5ec29a 100644 --- a/spec/helpers/events_helper_spec.rb +++ b/spec/helpers/events_helper_spec.rb @@ -28,8 +28,7 @@ describe EventsHelper do it 'should display the first line of a code block' do input = "```\nCode block\nwith two lines\n```" - expected = '
' \
-               'Code block...
' + expected = %r{Code block\.\.\.} expect(event_note(input)).to match(expected) end @@ -55,7 +54,7 @@ describe EventsHelper do it 'should preserve code color scheme' do input = "```ruby\ndef test\n 'hello world'\nend\n```" - expected = '
' \
+    expected = '
' \
       "def test\n" \
       "  \'hello world\'\n" \
       "end" \

From 9d40457766d3f7154780d57deb787d3e87934b49 Mon Sep 17 00:00:00 2001
From: karen Carias 
Date: Tue, 25 Aug 2015 21:57:10 -0700
Subject: [PATCH 028/153] added new commands

---
 doc/gitlab-basics/basic-git-commands.md    | 2 ++
 doc/gitlab-basics/command-line-commands.md | 8 ++++++++
 2 files changed, 10 insertions(+)

diff --git a/doc/gitlab-basics/basic-git-commands.md b/doc/gitlab-basics/basic-git-commands.md
index 2b5767dd2d..172568b5a1 100644
--- a/doc/gitlab-basics/basic-git-commands.md
+++ b/doc/gitlab-basics/basic-git-commands.md
@@ -34,6 +34,8 @@ You'll see your changes in red when you type "git status".
 ```
 git add CHANGES IN RED
 git commit -m "DESCRIBE THE INTENTION OF THE COMMIT"
+or
+git commit -am "DESCRIBE THE INTENTION OF THE COMMIT WITH AN ADDITIONAL MESSAGE"
 ```
 
 ### Send changes to gitlab.com
diff --git a/doc/gitlab-basics/command-line-commands.md b/doc/gitlab-basics/command-line-commands.md
index b03cca4029..5d22e29a86 100644
--- a/doc/gitlab-basics/command-line-commands.md
+++ b/doc/gitlab-basics/command-line-commands.md
@@ -72,3 +72,11 @@ You will be asked for an administrator’s password.
 ```
 sudo
 ```
+
+### Tell where you are
+```
+pwd
+```
+
+### Open new command line window
+Press `command + t` on your keyboard.

From bff8376ab15c7fb621f26673213e4d928c5bf8c6 Mon Sep 17 00:00:00 2001
From: karen Carias 
Date: Tue, 25 Aug 2015 21:58:40 -0700
Subject: [PATCH 029/153] added new commands

---
 doc/gitlab-basics/basic-git-commands.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/doc/gitlab-basics/basic-git-commands.md b/doc/gitlab-basics/basic-git-commands.md
index 172568b5a1..2b5767dd2d 100644
--- a/doc/gitlab-basics/basic-git-commands.md
+++ b/doc/gitlab-basics/basic-git-commands.md
@@ -34,8 +34,6 @@ You'll see your changes in red when you type "git status".
 ```
 git add CHANGES IN RED
 git commit -m "DESCRIBE THE INTENTION OF THE COMMIT"
-or
-git commit -am "DESCRIBE THE INTENTION OF THE COMMIT WITH AN ADDITIONAL MESSAGE"
 ```
 
 ### Send changes to gitlab.com

From 5ddf38e1881b515149738647e42f2d0a96d8df14 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 10:21:51 +0200
Subject: [PATCH 030/153] Improve project name/description look on project page

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/pages/projects.scss | 3 +++
 app/views/projects/_home_panel.html.haml   | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 1e138651d5..6e40cbdd02 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -35,9 +35,12 @@
       margin: 0;
       margin-bottom: 10px;
       font-size: 26px;
+      font-weight: bold;
     }
 
     p {
+      font-size: 18px;
+      color: #666;
       display: inline;
     }
   }
diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml
index bec40ec27a..b93036e78e 100644
--- a/app/views/projects/_home_panel.html.haml
+++ b/app/views/projects/_home_panel.html.haml
@@ -2,7 +2,7 @@
 .project-home-panel.clearfix{:class => ("empty-project" if empty_repo)}
   .project-identicon-holder
     = project_icon(@project, alt: '', class: 'project-avatar avatar s90')
-  .project-home-desc.lead
+  .project-home-desc
     %h1= @project.name
     - if @project.description.present?
       = markdown(@project.description, pipeline: :description)

From 735978388f62787dc69c97cd267359693fde6415 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 10:36:08 +0200
Subject: [PATCH 031/153] Increase width of sidebar for several pages

Signed-off-by: Dmitriy Zaporozhets 
---
 app/views/dashboard/projects/starred.html.haml | 4 ++--
 app/views/groups/show.html.haml                | 4 ++--
 app/views/users/show.html.haml                 | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml
index 027387028b..6dcfd497ed 100644
--- a/app/views/dashboard/projects/starred.html.haml
+++ b/app/views/dashboard/projects/starred.html.haml
@@ -5,9 +5,9 @@
   = render 'shared/show_aside'
 
   .dashboard.row
-    %section.activities.col-md-8
+    %section.activities.col-md-7
       = render 'dashboard/activities'
-    %aside.col-md-4
+    %aside.col-md-5
       .panel.panel-default.projects-list-holder
         .panel-heading.clearfix
           .input-group
diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml
index d31dae7d64..0577f4ec14 100644
--- a/app/views/groups/show.html.haml
+++ b/app/views/groups/show.html.haml
@@ -17,7 +17,7 @@
   = render 'shared/show_aside'
 
   .row
-    %section.activities.col-md-8
+    %section.activities.col-md-7
       .hidden-xs
         - if current_user
           = render "events/event_last_push", event: @last_push
@@ -33,5 +33,5 @@
 
       .content_list
       = spinner
-    %aside.side.col-md-4
+    %aside.side.col-md-5
       = render "projects", projects: @projects
diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml
index 64b7f25ad3..aa4e8722fb 100644
--- a/app/views/users/show.html.haml
+++ b/app/views/users/show.html.haml
@@ -7,7 +7,7 @@
 = render 'shared/show_aside'
 
 .row
-  %section.col-md-8
+  %section.col-md-7
     .header-with-avatar
       = link_to avatar_icon(@user.email, 400), target: '_blank' do
         = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: ''
@@ -59,7 +59,7 @@
 
     .content_list
     = spinner
-  %aside.col-md-4
+  %aside.col-md-5
     = render 'profile', user: @user
     = render 'projects', projects: @projects, contributed_projects: @contributed_projects
 

From 0276e9032a5c31548844e76e913d9c50039cf054 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 11:51:28 +0200
Subject: [PATCH 032/153] Limit content width for big screens except certain
 pages

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/base/layout.scss           |  5 +++++
 app/assets/stylesheets/base/variables.scss        |  2 +-
 app/assets/stylesheets/pages/issuable.scss        |  6 ------
 app/assets/stylesheets/pages/tree.scss            |  1 -
 app/helpers/page_layout_helper.rb                 |  8 ++++++++
 app/views/layouts/_page.html.haml                 |  2 +-
 app/views/layouts/header/_default.html.haml       | 12 ------------
 app/views/projects/deploy_keys/index.html.haml    |  1 +
 app/views/projects/diffs/_diffs.html.haml         |  3 +++
 app/views/projects/merge_requests/_show.html.haml |  3 +++
 10 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/app/assets/stylesheets/base/layout.scss b/app/assets/stylesheets/base/layout.scss
index 690d89a5c1..734b95e26c 100644
--- a/app/assets/stylesheets/base/layout.scss
+++ b/app/assets/stylesheets/base/layout.scss
@@ -20,3 +20,8 @@ html {
 .navless-container {
   margin-top: 30px;
 }
+
+
+.container-limited {
+  max-width: $fixed-layout-width;
+}
diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss
index cb439a0e0b..26d0a1e536 100644
--- a/app/assets/stylesheets/base/variables.scss
+++ b/app/assets/stylesheets/base/variables.scss
@@ -13,7 +13,7 @@ $code_line_height: 1.5;
 $border-color: #E5E5E5;
 $background-color: #f5f5f5;
 $header-height: 50px;
-$readable-width: 1100px;
+$fixed-layout-width: 1200px;
 
 
 /*
diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss
index 3f617e72b0..586e7b5f8d 100644
--- a/app/assets/stylesheets/pages/issuable.scss
+++ b/app/assets/stylesheets/pages/issuable.scss
@@ -45,9 +45,3 @@
 
   .btn { font-size: 13px; }
 }
-
-.issuable-details {
-  .description {
-    max-width: $readable-width;
-  }
-}
diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss
index 5f1a3db4fb..81e2aa7bb9 100644
--- a/app/assets/stylesheets/pages/tree.scss
+++ b/app/assets/stylesheets/pages/tree.scss
@@ -117,7 +117,6 @@
 
 .readme-holder {
   margin: 0 auto;
-  max-width: $readable-width;
 
   .readme-file-title {
     font-size: 14px;
diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb
index 01b6a63552..8473d6d75d 100644
--- a/app/helpers/page_layout_helper.rb
+++ b/app/helpers/page_layout_helper.rb
@@ -23,4 +23,12 @@ module PageLayoutHelper
       @sidebar
     end
   end
+
+  def fluid_layout(enabled = false)
+    if @fluid_layout.nil?
+      @fluid_layout = enabled
+    else
+      @fluid_layout
+    end
+  end
 end
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index 96e15783a3..3d58f993ca 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -13,7 +13,7 @@
         .username
           = current_user.username
   .content-wrapper
-    .container-fluid
+    %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" }
       .content
         = render "layouts/flash"
         .clearfix
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 12ddbe6f1b..6086f36f07 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -17,15 +17,6 @@
           %li.visible-sm.visible-xs
             = link_to search_path, title: 'Search', data: {toggle: 'tooltip', placement: 'bottom'} do
               = icon('search')
-          -#%li.hidden-xs
-            = link_to help_path, title: 'Help', data: {toggle: 'tooltip', placement: 'bottom'} do
-              = icon('question-circle fw')
-          -#%li
-            = link_to explore_root_path, title: 'Explore', data: {toggle: 'tooltip', placement: 'bottom'} do
-              = icon('globe fw')
-          -#%li
-            = link_to user_snippets_path(current_user), title: 'Your snippets', data: {toggle: 'tooltip', placement: 'bottom'} do
-              = icon('clipboard fw')
           - if current_user.is_admin?
             %li
               = link_to admin_root_path, title: 'Admin area', data: {toggle: 'tooltip', placement: 'bottom'} do
@@ -34,9 +25,6 @@
             %li.hidden-xs
               = link_to new_project_path, title: 'New project', data: {toggle: 'tooltip', placement: 'bottom'} do
                 = icon('plus fw')
-          -#%li
-            = link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do
-              = icon('cog fw')
           %li
             = link_to destroy_user_session_path, class: 'logout', method: :delete, title: 'Sign out', data: {toggle: 'tooltip', placement: 'bottom'} do
               = icon('sign-out')
diff --git a/app/views/projects/deploy_keys/index.html.haml b/app/views/projects/deploy_keys/index.html.haml
index 2e9c5dc08c..8e24c778b7 100644
--- a/app/views/projects/deploy_keys/index.html.haml
+++ b/app/views/projects/deploy_keys/index.html.haml
@@ -1,4 +1,5 @@
 - page_title "Deploy Keys"
+
 %h3.page-title
   Deploy keys allow read-only access to the repository
 
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index 52c1e03040..30943f49bb 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -1,3 +1,6 @@
+- if params[:view] == 'parallel'
+  - fluid_layout true
+
 .prepend-top-20.append-bottom-20
   .pull-right
     .btn-group
diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml
index 007f6c6a78..ec1838eb48 100644
--- a/app/views/projects/merge_requests/_show.html.haml
+++ b/app/views/projects/merge_requests/_show.html.haml
@@ -1,4 +1,7 @@
 - page_title "#{@merge_request.title} (##{@merge_request.iid})", "Merge Requests"
+- if params[:view] == 'parallel'
+  - fluid_layout true
+
 .merge-request{'data-url' => merge_request_path(@merge_request)}
   .merge-request-details.issuable-details
     = render "projects/merge_requests/show/mr_title"

From 2fa560d658ec7c49df97daadae443568bc72bdce Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 13:15:02 +0200
Subject: [PATCH 033/153] Align header with content container

Signed-off-by: Dmitriy Zaporozhets 
---
 CHANGELOG                                     |  1 +
 app/assets/stylesheets/generic/header.scss    | 66 ++-----------------
 app/assets/stylesheets/generic/sidebar.scss   | 43 ++++++++++++
 .../stylesheets/themes/gitlab-theme.scss      | 26 ++++----
 app/views/layouts/_page.html.haml             |  5 ++
 app/views/layouts/header/_default.html.haml   |  7 +-
 6 files changed, 67 insertions(+), 81 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 5222ab1e3e..5ab0b5c3fa 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -17,6 +17,7 @@ v 8.0.0 (unreleased)
   - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu)
   - Improve abuse reports management from admin area
   - Move dashboard activity to separate page
+  - Limit content width to 1200px for most of pages to improve readability on big screens
 
 v 7.14.1 (unreleased)
   - Only include base URL in OmniAuth full_host parameter (Stan Hu)
diff --git a/app/assets/stylesheets/generic/header.scss b/app/assets/stylesheets/generic/header.scss
index 31e2ad8669..6a29b32e19 100644
--- a/app/assets/stylesheets/generic/header.scss
+++ b/app/assets/stylesheets/generic/header.scss
@@ -20,16 +20,16 @@ header {
   }
 
   &.navbar-gitlab {
+    padding: 0 20px;
     z-index: 100;
     margin-bottom: 0;
     min-height: $header-height;
     border: none;
-    width: 100%;
+    border-bottom: 1px solid #EEE;
 
-    .container {
+    .container-fluid {
       background: #FFF;
       width: 100% !important;
-      padding: 0;
       filter: none;
 
       .nav > li > a {
@@ -64,55 +64,11 @@ header {
     }
   }
 
-  .header-logo {
-    border-bottom: 1px solid transparent;
-    float: left;
-    height: $header-height;
-    width: $sidebar_width;
-    overflow: hidden;
-    transition-duration: .3s;
-
-    a {
-      float: left;
-      height: $header-height;
-      width: 100%;
-      padding: ($header-height - 36 ) / 2 8px;
-      overflow: hidden;
-
-      img {
-        width: 36px;
-        height: 36px;
-        float: left;
-      }
-
-      .gitlab-text-container {
-        width: 230px;
-
-        h3 {
-          width: 158px;
-          float: left;
-          margin: 0;
-          margin-left: 14px;
-          font-size: 18px;
-          line-height: $header-height - 14;
-          font-weight: normal;
-        }
-      }
-    }
-
-    &:hover {
-      background-color: #EEE;
-    }
-  }
-
   .header-content {
-    border-bottom: 1px solid #EEE;
-    padding-right: 35px;
     height: $header-height;
 
     .title {
       margin: 0;
-      padding: 0 15px 0 35px;
       overflow: hidden;
       font-size: 18px;
       line-height: $header-height;
@@ -168,15 +124,7 @@ header {
 }
 
 @mixin collapsed-header {
-  .header-logo {
-    width: $sidebar_collapsed_width;
-  }
-
-  .header-content {
-    .title {
-      margin-left: 30px;
-    }
-  }
+  margin-left: $sidebar_collapsed_width;
 }
 
 @media (max-width: $screen-md-max) {
@@ -191,16 +139,14 @@ header {
   }
 
   .header-expanded {
+    margin-left: $sidebar_width;
   }
 }
 
 @media (max-width: $screen-xs-max) {
-  header .container {
+  header .container-fluid {
     font-size: 18px;
 
-    .title {
-    }
-
     .navbar-nav {
       margin: 0px;
       float: none !important;
diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss
index b96664d30d..320bdb1c76 100644
--- a/app/assets/stylesheets/generic/sidebar.scss
+++ b/app/assets/stylesheets/generic/sidebar.scss
@@ -188,3 +188,46 @@
     width: $sidebar_width - 2 * 10px;
   }
 }
+
+.sidebar-wrapper {
+  .header-logo {
+    border-bottom: 1px solid transparent;
+    float: left;
+    height: $header-height;
+    width: $sidebar_width;
+    overflow: hidden;
+    transition-duration: .3s;
+
+    a {
+      float: left;
+      height: $header-height;
+      width: 100%;
+      padding: ($header-height - 36 ) / 2 8px;
+      overflow: hidden;
+
+      img {
+        width: 36px;
+        height: 36px;
+        float: left;
+      }
+
+      .gitlab-text-container {
+        width: 230px;
+
+        h3 {
+          width: 158px;
+          float: left;
+          margin: 0;
+          margin-left: 14px;
+          font-size: 18px;
+          line-height: $header-height - 14;
+          font-weight: normal;
+        }
+      }
+    }
+
+    &:hover {
+      background-color: #EEE;
+    }
+  }
+}
diff --git a/app/assets/stylesheets/themes/gitlab-theme.scss b/app/assets/stylesheets/themes/gitlab-theme.scss
index 3589cb88d0..77b62c3153 100644
--- a/app/assets/stylesheets/themes/gitlab-theme.scss
+++ b/app/assets/stylesheets/themes/gitlab-theme.scss
@@ -7,27 +7,23 @@
  * $color-dark   -
  */
 @mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) {
-  header {
-    &.navbar-gitlab {
-      .header-logo {
-        background-color: $color-darker;
-        border-color: $color-darker;
+  .page-with-sidebar {
+    .header-logo {
+      background-color: $color-darker;
+      border-color: $color-darker;
 
+      a {
+        color: $color-light;
+      }
+
+      &:hover {
+        background-color: $color-dark;
         a {
-          color: $color-light;
-        }
-
-        &:hover {
-          background-color: $color-dark;
-          a {
-            color: #FFF;
-          }
+          color: #FFF;
         }
       }
     }
-  }
 
-  .page-with-sidebar {
     .collapse-nav a {
       color: #FFF;
       background: $color;
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index 3d58f993ca..0104d7198d 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -1,6 +1,11 @@
 .page-with-sidebar{ class: nav_sidebar_class }
   = render "layouts/broadcast"
   .sidebar-wrapper.nicescroll
+    .header-logo
+      = link_to root_path, class: 'home', title: 'Dashboard', id: 'js-shortcuts-home', data: {toggle: 'tooltip', placement: 'bottom'} do
+        = brand_header_logo
+        .gitlab-text-container
+          %h3 GitLab
     - if defined?(sidebar) && sidebar
       = render "layouts/nav/#{sidebar}"
     - elsif current_user
diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml
index 6086f36f07..0b630b55c7 100644
--- a/app/views/layouts/header/_default.html.haml
+++ b/app/views/layouts/header/_default.html.haml
@@ -1,10 +1,5 @@
 %header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class }
-  .container
-    .header-logo
-      = link_to root_path, class: 'home', title: 'Dashboard', id: 'js-shortcuts-home', data: {toggle: 'tooltip', placement: 'bottom'} do
-        = brand_header_logo
-        .gitlab-text-container
-          %h3 GitLab
+  %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" }
     .header-content
       %button.navbar-toggle{type: 'button'}
         %span.sr-only Toggle navigation

From bafffb2d14e1924154d5b7c74c7b3cbcf8c898fd Mon Sep 17 00:00:00 2001
From: Valery Sizov 
Date: Tue, 11 Aug 2015 09:59:40 +0300
Subject: [PATCH 034/153] Enable SSL verification for Webhooks

---
 CHANGELOG                                         |  1 +
 app/controllers/admin/hooks_controller.rb         |  2 +-
 app/controllers/projects/hooks_controller.rb      |  3 ++-
 app/controllers/projects/services_controller.rb   |  2 +-
 app/models/hooks/web_hook.rb                      |  5 +++--
 app/models/project_services/buildkite_service.rb  |  9 +++++++--
 app/models/project_services/gitlab_ci_service.rb  |  6 ++++--
 app/views/admin/hooks/index.html.haml             |  8 ++++++++
 app/views/projects/hooks/index.html.haml          |  8 ++++++++
 .../20150824002011_add_enable_ssl_verification.rb |  5 +++++
 db/schema.rb                                      | 15 ++++++++-------
 features/admin/hooks.feature                      |  9 +++++++++
 features/project/hooks.feature                    |  5 +++++
 features/steps/admin/hooks.rb                     | 15 +++++++++++++++
 features/steps/project/hooks.rb                   | 13 +++++++++++++
 15 files changed, 90 insertions(+), 16 deletions(-)
 create mode 100644 db/migrate/20150824002011_add_enable_ssl_verification.rb
 create mode 100644 features/admin/hooks.feature
 create mode 100644 features/steps/admin/hooks.rb

diff --git a/CHANGELOG b/CHANGELOG
index 7ec1dabcf9..2c1b1a53fe 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -12,6 +12,7 @@ v 8.0.0 (unreleased)
   - Search for comments should be case insensetive
   - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais)
   - Ability to search milestones
+  - Ability to enable SSL verification for Webhooks
 
 v 7.14.0
   - Fix bug where non-project members of the target project could set labels on new merge requests.
diff --git a/app/controllers/admin/hooks_controller.rb b/app/controllers/admin/hooks_controller.rb
index 690096bdbc..d670386f8c 100644
--- a/app/controllers/admin/hooks_controller.rb
+++ b/app/controllers/admin/hooks_controller.rb
@@ -39,6 +39,6 @@ class Admin::HooksController < Admin::ApplicationController
   end
 
   def hook_params
-    params.require(:hook).permit(:url)
+    params.require(:hook).permit(:url, :enable_ssl_verification)
   end
 end
diff --git a/app/controllers/projects/hooks_controller.rb b/app/controllers/projects/hooks_controller.rb
index 76062446c9..4e5b4125f5 100644
--- a/app/controllers/projects/hooks_controller.rb
+++ b/app/controllers/projects/hooks_controller.rb
@@ -53,6 +53,7 @@ class Projects::HooksController < Projects::ApplicationController
   end
 
   def hook_params
-    params.require(:hook).permit(:url, :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events)
+    params.require(:hook).permit(:url, :push_events, :issues_events,
+      :merge_requests_events, :tag_push_events, :note_events, :enable_ssl_verification)
   end
 end
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 0110553247..b0cf5866d4 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -8,7 +8,7 @@ class Projects::ServicesController < Projects::ApplicationController
                     :push_events, :issues_events, :merge_requests_events, :tag_push_events,
                     :note_events, :send_from_committer_email, :disable_diffs, :external_wiki_url,
                     :notify, :color,
-                    :server_host, :server_port, :default_irc_uri]
+                    :server_host, :server_port, :default_irc_uri, :enable_ssl_verification]
   # Authorize
   before_action :authorize_admin_project!
   before_action :service, only: [:edit, :update, :test]
diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb
index 46fb85336e..9a8251bdad 100644
--- a/app/models/hooks/web_hook.rb
+++ b/app/models/hooks/web_hook.rb
@@ -25,6 +25,7 @@ class WebHook < ActiveRecord::Base
   default_value_for :note_events, false
   default_value_for :merge_requests_events, false
   default_value_for :tag_push_events, false
+  default_value_for :enable_ssl_verification, false
 
   # HTTParty timeout
   default_timeout Gitlab.config.gitlab.webhook_timeout
@@ -41,7 +42,7 @@ class WebHook < ActiveRecord::Base
                      "Content-Type" => "application/json",
                      "X-Gitlab-Event" => hook_name.singularize.titleize
                    },
-                   verify: false)
+                   verify: enable_ssl_verification)
     else
       post_url = url.gsub("#{parsed_url.userinfo}@", "")
       auth = {
@@ -54,7 +55,7 @@ class WebHook < ActiveRecord::Base
                      "Content-Type" => "application/json",
                      "X-Gitlab-Event" => hook_name.singularize.titleize
                    },
-                   verify: false,
+                   verify: enable_ssl_verification,
                    basic_auth: auth)
     end
   rescue SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e
diff --git a/app/models/project_services/buildkite_service.rb b/app/models/project_services/buildkite_service.rb
index a714bc8224..9e5da6f45d 100644
--- a/app/models/project_services/buildkite_service.rb
+++ b/app/models/project_services/buildkite_service.rb
@@ -23,7 +23,7 @@ require "addressable/uri"
 class BuildkiteService < CiService
   ENDPOINT = "https://buildkite.com"
 
-  prop_accessor :project_url, :token
+  prop_accessor :project_url, :token, :enable_ssl_verification
 
   validates :project_url, presence: true, if: :activated?
   validates :token, presence: true, if: :activated?
@@ -37,6 +37,7 @@ class BuildkiteService < CiService
   def compose_service_hook
     hook = service_hook || build_service_hook
     hook.url = webhook_url
+    hook.enable_ssl_verification = enable_ssl_verification
     hook.save
   end
 
@@ -96,7 +97,11 @@ class BuildkiteService < CiService
 
       { type: 'text',
         name: 'project_url',
-        placeholder: "#{ENDPOINT}/example/project" }
+        placeholder: "#{ENDPOINT}/example/project" },
+      
+      { type: 'checkbox',
+        name: 'enable_ssl_verification',
+        title: "Enable SSL verification" }
     ]
   end
 
diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb
index ecdcd48ae6..acbbc9935b 100644
--- a/app/models/project_services/gitlab_ci_service.rb
+++ b/app/models/project_services/gitlab_ci_service.rb
@@ -21,7 +21,7 @@
 class GitlabCiService < CiService
   API_PREFIX = "api/v1"
 
-  prop_accessor :project_url, :token
+  prop_accessor :project_url, :token, :enable_ssl_verification
   validates :project_url,
     presence: true,
     format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }, if: :activated?
@@ -34,6 +34,7 @@ class GitlabCiService < CiService
   def compose_service_hook
     hook = service_hook || build_service_hook
     hook.url = [project_url, "/build", "?token=#{token}"].join("")
+    hook.enable_ssl_verification = enable_ssl_verification
     hook.save
   end
 
@@ -136,7 +137,8 @@ class GitlabCiService < CiService
   def fields
     [
       { type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' },
-      { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' }
+      { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3' },
+      { type: 'checkbox', name: 'enable_ssl_verification', title: "Enable SSL verification" }
     ]
   end
 
diff --git a/app/views/admin/hooks/index.html.haml b/app/views/admin/hooks/index.html.haml
index e74e1e85f4..b120f4dea6 100644
--- a/app/views/admin/hooks/index.html.haml
+++ b/app/views/admin/hooks/index.html.haml
@@ -18,6 +18,13 @@
     = f.label :url, "URL:", class: 'control-label'
     .col-sm-10
       = f.text_field :url, class: "form-control"
+  .form-group
+    = f.label :enable_ssl_verification, "SSL verification", class: 'control-label checkbox'
+    .col-sm-10
+      .checkbox
+        = f.label :enable_ssl_verification do
+          = f.check_box :enable_ssl_verification
+          %strong Enable SSL verification
   .form-actions
     = f.submit "Add System Hook", class: "btn btn-create"
 %hr
@@ -32,6 +39,7 @@
           .list-item-name
             = link_to admin_hook_path(hook) do
               %strong= hook.url
+            %p SSL Verification: #{hook.enable_ssl_verification ? "enabled" : "disabled"}
 
           .pull-right
             = link_to 'Test Hook', admin_hook_test_path(hook), class: "btn btn-sm"
diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml
index eadbf61fdd..85dbfd6786 100644
--- a/app/views/projects/hooks/index.html.haml
+++ b/app/views/projects/hooks/index.html.haml
@@ -55,6 +55,13 @@
             %strong Merge Request events
           %p.light
             This url will be triggered when a merge request is created
+  .form-group
+    = f.label :enable_ssl_verification, "SSL verification", class: 'control-label checkbox'
+    .col-sm-10
+      .checkbox
+        = f.label :enable_ssl_verification do
+          = f.check_box :enable_ssl_verification
+          %strong Enable SSL verification
   .form-actions
     = f.submit "Add Web Hook", class: "btn btn-create"
 
@@ -74,3 +81,4 @@
             - %w(push_events tag_push_events issues_events note_events merge_requests_events).each do |trigger|
               - if hook.send(trigger)
                 %span.label.label-gray= trigger.titleize
+            SSL Verification: #{hook.enable_ssl_verification ? "enabled" : "disabled"}
diff --git a/db/migrate/20150824002011_add_enable_ssl_verification.rb b/db/migrate/20150824002011_add_enable_ssl_verification.rb
new file mode 100644
index 0000000000..093c068fbd
--- /dev/null
+++ b/db/migrate/20150824002011_add_enable_ssl_verification.rb
@@ -0,0 +1,5 @@
+class AddEnableSslVerification < ActiveRecord::Migration
+  def change
+    add_column :web_hooks, :enable_ssl_verification, :boolean, default: false
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 108c48bf32..7ee1c6e214 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20150818213832) do
+ActiveRecord::Schema.define(version: 20150824002011) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -566,13 +566,14 @@ ActiveRecord::Schema.define(version: 20150818213832) do
     t.integer  "project_id"
     t.datetime "created_at"
     t.datetime "updated_at"
-    t.string   "type",                  default: "ProjectHook"
+    t.string   "type",                    default: "ProjectHook"
     t.integer  "service_id"
-    t.boolean  "push_events",           default: true,          null: false
-    t.boolean  "issues_events",         default: false,         null: false
-    t.boolean  "merge_requests_events", default: false,         null: false
-    t.boolean  "tag_push_events",       default: false
-    t.boolean  "note_events",           default: false,         null: false
+    t.boolean  "push_events",             default: true,          null: false
+    t.boolean  "issues_events",           default: false,         null: false
+    t.boolean  "merge_requests_events",   default: false,         null: false
+    t.boolean  "tag_push_events",         default: false
+    t.boolean  "note_events",             default: false,         null: false
+    t.boolean  "enable_ssl_verification", default: false
   end
 
   add_index "web_hooks", ["created_at", "id"], name: "index_web_hooks_on_created_at_and_id", using: :btree
diff --git a/features/admin/hooks.feature b/features/admin/hooks.feature
new file mode 100644
index 0000000000..5ca332d9f1
--- /dev/null
+++ b/features/admin/hooks.feature
@@ -0,0 +1,9 @@
+@admin
+Feature: Admin Hooks
+  Background:
+    Given I sign in as an admin
+
+  Scenario: On Admin Hooks
+    Given I visit admin hooks page
+    Then I submit the form with enabled SSL verification
+    And I see new hook with enabled SSL verification
\ No newline at end of file
diff --git a/features/project/hooks.feature b/features/project/hooks.feature
index 1a60846a23..627738004c 100644
--- a/features/project/hooks.feature
+++ b/features/project/hooks.feature
@@ -13,6 +13,11 @@ Feature: Project Hooks
     When I submit new hook
     Then I should see newly created hook
 
+  Scenario: I add new hook with SSL verification enabled
+    Given I visit project hooks page
+    When I submit new hook with SSL verification enabled
+    Then I should see newly created hook with SSL verification enabled
+
   Scenario: I test hook
     Given project has hook
     And I visit project hooks page
diff --git a/features/steps/admin/hooks.rb b/features/steps/admin/hooks.rb
new file mode 100644
index 0000000000..541e25fcb7
--- /dev/null
+++ b/features/steps/admin/hooks.rb
@@ -0,0 +1,15 @@
+class Spinach::Features::AdminHooks < Spinach::FeatureSteps
+  include SharedAuthentication
+  include SharedPaths
+  include SharedAdmin
+
+  step "I submit the form with enabled SSL verification" do
+    fill_in 'hook_url', with: 'http://google.com'
+    check "Enable SSL verification"
+    click_on "Add System Hook"
+  end
+
+  step "I see new hook with enabled SSL verification" do
+    expect(page).to have_content "SSL Verification: enabled"
+  end
+end
diff --git a/features/steps/project/hooks.rb b/features/steps/project/hooks.rb
index 04e3bf78ed..df4a23a371 100644
--- a/features/steps/project/hooks.rb
+++ b/features/steps/project/hooks.rb
@@ -28,11 +28,24 @@ class Spinach::Features::ProjectHooks < Spinach::FeatureSteps
     expect { click_button "Add Web Hook" }.to change(ProjectHook, :count).by(1)
   end
 
+  step 'I submit new hook with SSL verification enabled' do
+    @url = FFaker::Internet.uri("http")
+    fill_in "hook_url", with: @url
+    check "hook_enable_ssl_verification"
+    expect { click_button "Add Web Hook" }.to change(ProjectHook, :count).by(1)
+  end
+
   step 'I should see newly created hook' do
     expect(current_path).to eq namespace_project_hooks_path(current_project.namespace, current_project)
     expect(page).to have_content(@url)
   end
 
+  step 'I should see newly created hook with SSL verification enabled' do
+    expect(current_path).to eq namespace_project_hooks_path(current_project.namespace, current_project)
+    expect(page).to have_content(@url)
+    expect(page).to have_content("SSL Verification: enabled")
+  end
+
   step 'I click test hook button' do
     stub_request(:post, @hook.url).to_return(status: 200)
     click_link 'Test Hook'

From 99b2be7625fe7849aa0559356beef86c1840fb65 Mon Sep 17 00:00:00 2001
From: Valery Sizov 
Date: Wed, 26 Aug 2015 16:39:55 +0300
Subject: [PATCH 035/153] Improve perofrmance of git blame

---
 CHANGELOG                               | 1 +
 app/views/projects/blame/show.html.haml | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG b/CHANGELOG
index be99941b4c..dc1d88bf61 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -18,6 +18,7 @@ v 8.0.0 (unreleased)
   - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu)
   - Improve abuse reports management from admin area
   - Move dashboard activity to separate page
+  - Improve performance of git blame
 
 v 7.14.1 (unreleased)
   - Only include base URL in OmniAuth full_host parameter (Stan Hu)
diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml
index a3ff7ce2f1..c1ec42aefc 100644
--- a/app/views/projects/blame/show.html.haml
+++ b/app/views/projects/blame/show.html.haml
@@ -27,7 +27,7 @@
                 .light
                   = commit_author_link(commit, avatar: false)
                   authored
-                  #{time_ago_with_tooltip(commit.committed_date)}
+                  #{time_ago_with_tooltip(commit.committed_date, skip_js: true)}
             %td.lines.blame-numbers
               %pre
                 - line_count = blame_group[:lines].count

From 468d29251da81bb3a16380b4465becf35db2ba23 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 16:00:37 +0200
Subject: [PATCH 036/153] Fix header for anonymous users too

Signed-off-by: Dmitriy Zaporozhets 
---
 app/views/layouts/header/_public.html.haml | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/app/views/layouts/header/_public.html.haml b/app/views/layouts/header/_public.html.haml
index 15c2e292be..af4b9ba58f 100644
--- a/app/views/layouts/header/_public.html.haml
+++ b/app/views/layouts/header/_public.html.haml
@@ -1,10 +1,5 @@
 %header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class }
-  .container
-    .header-logo
-      = link_to explore_root_path, class: "home" do
-        = brand_header_logo
-        .gitlab-text-container
-          %h3 GitLab
+  %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" }
     .header-content
       - unless current_controller?('sessions')
         .pull-right

From c1fe98e0b9dbe40d564dc5ddad23e14dd0e6e462 Mon Sep 17 00:00:00 2001
From: Stan Hu 
Date: Wed, 26 Aug 2015 07:38:33 -0700
Subject: [PATCH 037/153] Prevent too many redirects error when home page URL
 set to external_urll

Many users naively set the home page URL setting to external_url
(e.g. https://mydomain.com). When an unauthenticated user signs in, this
causes endless redirections. For example, this is occuring:

1. Unauthenticated user attempts to access https://mydomain.com/dashboard
2. Application redirects to the home page URL: https://mydomain.com
3. Repeat step 2

In step 3, ApplicationController should have redirected the user to
https://mydomain.com/users/sign_in. Disabling the redirection if home
page URL is the same as external_url prevents users from messing up.

Closes https://github.com/gitlabhq/gitlabhq/issues/8843
Closes #2057
---
 CHANGELOG                                 | 1 +
 app/controllers/application_controller.rb | 4 +++-
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG b/CHANGELOG
index a93558fb10..92793b6be2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 Please view this file on the master branch, on stable branches it's out of date.
 
 v 8.0.0 (unreleased)
+  - Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu)
   - Improve dropdown positioning on the project home page (Hannes Rosenögger)
   - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu)
   - Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 12d439b0b3..ef1170e16d 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -55,7 +55,9 @@ class ApplicationController < ActionController::Base
 
   def authenticate_user!(*args)
     # If user is not signed-in and tries to access root_path - redirect him to landing page
-    if current_application_settings.home_page_url.present?
+    # Don't redirect to the default URL to prevent endless redirections
+    if current_application_settings.home_page_url.present? &&
+        current_application_settings.home_page_url.chomp('/') != Gitlab.config.gitlab['url'].chomp('/')
       if current_user.nil? && root_path == request.path
         redirect_to current_application_settings.home_page_url and return
       end

From 5ea15fc7b556d1e5e3a778d2f100b903904e8c6a Mon Sep 17 00:00:00 2001
From: Stan Hu 
Date: Wed, 26 Aug 2015 07:53:26 -0700
Subject: [PATCH 038/153] Update CHANGELOG for released 7.14.1

[ci skip]
---
 CHANGELOG | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index dc1d88bf61..6743b93f58 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,7 +3,6 @@ Please view this file on the master branch, on stable branches it's out of date.
 v 8.0.0 (unreleased)
   - Improve dropdown positioning on the project home page (Hannes Rosenögger)
   - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu)
-  - Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
   - Remove user OAuth tokens from the database and request new tokens each session (Stan Hu)
   - Only show recent push event if the branch still exists or a recent merge request has not been created (Stan Hu)
   - Remove satellites
@@ -16,11 +15,12 @@ v 8.0.0 (unreleased)
   - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais)
   - Ability to search milestones
   - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu)
-  - Improve abuse reports management from admin area
   - Move dashboard activity to separate page
   - Improve performance of git blame
 
-v 7.14.1 (unreleased)
+v 7.14.1
+  - Improve abuse reports management from admin area
+  - Fix "Reload with full diff" URL button in compare branch view (Stan Hu)
   - Only include base URL in OmniAuth full_host parameter (Stan Hu)
   - Fix Error 500 in API when accessing a group that has an avatar (Stan Hu)
 

From bc683a590402b6ce017a613616623b65b6823ec4 Mon Sep 17 00:00:00 2001
From: Douwe Maan 
Date: Wed, 26 Aug 2015 08:58:46 -0700
Subject: [PATCH 039/153] Update mail_room

---
 Gemfile      | 2 +-
 Gemfile.lock | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Gemfile b/Gemfile
index fa54a72f02..4696a961e8 100644
--- a/Gemfile
+++ b/Gemfile
@@ -273,6 +273,6 @@ gem "newrelic_rpm"
 
 gem 'octokit', '3.7.0'
 
-gem "mail_room", "~> 0.4.0"
+gem "mail_room", "~> 0.4.1"
 
 gem 'email_reply_parser'
diff --git a/Gemfile.lock b/Gemfile.lock
index a7cfe6b751..814249c7ff 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -372,7 +372,7 @@ GEM
       systemu (~> 2.6.2)
     mail (2.6.3)
       mime-types (>= 1.16, < 3)
-    mail_room (0.4.0)
+    mail_room (0.4.1)
     method_source (0.8.2)
     mime-types (1.25.1)
     mimemagic (0.3.0)
@@ -808,7 +808,7 @@ DEPENDENCIES
   jquery-ui-rails
   kaminari (~> 0.15.1)
   letter_opener
-  mail_room (~> 0.4.0)
+  mail_room (~> 0.4.1)
   minitest (~> 5.3.0)
   mousetrap-rails
   mysql2

From 6d43308b5a5ff7663e1782fd6f5493f48c0f7e2a Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Wed, 26 Aug 2015 11:30:11 -0700
Subject: [PATCH 040/153] Add `Gitlab::Themes.for_user`

---
 lib/gitlab/themes.rb | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/lib/gitlab/themes.rb b/lib/gitlab/themes.rb
index 5209df9279..37a36b9599 100644
--- a/lib/gitlab/themes.rb
+++ b/lib/gitlab/themes.rb
@@ -51,6 +51,19 @@ module Gitlab
       THEMES.each(&block)
     end
 
+    # Get the Theme for the specified user, or the default
+    #
+    # user - User record
+    #
+    # Returns a Theme
+    def self.for_user(user)
+      if user
+        by_id(user.theme_id)
+      else
+        default
+      end
+    end
+
     private
 
     def self.default_id

From 2d72efcd9fb63f4bb0c6aed5a472a2eca2d6abac Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Wed, 26 Aug 2015 11:30:38 -0700
Subject: [PATCH 041/153] Add `count` to Themes and ColorSchemes

---
 lib/gitlab/color_schemes.rb | 5 +++++
 lib/gitlab/themes.rb        | 5 +++++
 2 files changed, 10 insertions(+)

diff --git a/lib/gitlab/color_schemes.rb b/lib/gitlab/color_schemes.rb
index 763853ab1c..9c4664df90 100644
--- a/lib/gitlab/color_schemes.rb
+++ b/lib/gitlab/color_schemes.rb
@@ -32,6 +32,11 @@ module Gitlab
       SCHEMES.detect { |s| s.id == id } || default
     end
 
+    # Returns the number of defined Schemes
+    def self.count
+      SCHEMES.size
+    end
+
     # Get the default Scheme
     #
     # Returns a Scheme
diff --git a/lib/gitlab/themes.rb b/lib/gitlab/themes.rb
index 37a36b9599..83f91de810 100644
--- a/lib/gitlab/themes.rb
+++ b/lib/gitlab/themes.rb
@@ -37,6 +37,11 @@ module Gitlab
       THEMES.detect { |t| t.id == id } || default
     end
 
+    # Returns the number of defined Themes
+    def self.count
+      THEMES.size
+    end
+
     # Get the default Theme
     #
     # Returns a Theme

From 7a81dc65d9013dff4d8bf36cf78e027693703990 Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Wed, 26 Aug 2015 11:33:44 -0700
Subject: [PATCH 042/153] Re-add user_color_scheme helper

Update PreferencesHelper specs
---
 app/helpers/preferences_helper.rb       |  6 +-
 spec/helpers/preferences_helper_spec.rb | 95 ++++++++++++++++---------
 2 files changed, 68 insertions(+), 33 deletions(-)

diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb
index 51a6b3fa99..7f1b6a6992 100644
--- a/app/helpers/preferences_helper.rb
+++ b/app/helpers/preferences_helper.rb
@@ -30,7 +30,11 @@ module PreferencesHelper
   end
 
   def user_application_theme
-    Gitlab::Themes.by_id(current_user.try(:theme_id)).css_class
+    Gitlab::Themes.for_user(current_user).css_class
+  end
+
+  def user_color_scheme
+    Gitlab::ColorSchemes.for_user(current_user).css_class
   end
 
   def prefer_readme?
diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb
index b4dee272bf..06f69262b7 100644
--- a/spec/helpers/preferences_helper_spec.rb
+++ b/spec/helpers/preferences_helper_spec.rb
@@ -1,51 +1,82 @@
 require 'spec_helper'
 
 describe PreferencesHelper do
-  describe 'user_application_theme' do
-    context 'with a user' do
-      it "returns user's theme's css_class" do
-        user = double('user', theme_id: 3)
-        allow(self).to receive(:current_user).and_return(user)
-        expect(user_application_theme).to eq 'ui_green'
-      end
-
-      it 'returns the default when id is invalid' do
-        user = double('user', theme_id: Gitlab::Themes::THEMES.size + 5)
-
-        allow(Gitlab.config.gitlab).to receive(:default_theme).and_return(2)
-        allow(self).to receive(:current_user).and_return(user)
-
-        expect(user_application_theme).to eq 'ui_charcoal'
-      end
-    end
-
-    context 'without a user' do
-      before do
-        allow(self).to receive(:current_user).and_return(nil)
-      end
-
-      it 'returns the default theme' do
-        expect(user_application_theme).to eq Gitlab::Themes.default.css_class
-      end
-    end
-  end
-
   describe 'dashboard_choices' do
     it 'raises an exception when defined choices may be missing' do
       expect(User).to receive(:dashboards).and_return(foo: 'foo')
-      expect { dashboard_choices }.to raise_error(RuntimeError)
+      expect { helper.dashboard_choices }.to raise_error(RuntimeError)
     end
 
     it 'raises an exception when defined choices may be using the wrong key' do
       expect(User).to receive(:dashboards).and_return(foo: 'foo', bar: 'bar')
-      expect { dashboard_choices }.to raise_error(KeyError)
+      expect { helper.dashboard_choices }.to raise_error(KeyError)
     end
 
     it 'provides better option descriptions' do
-      expect(dashboard_choices).to match_array [
+      expect(helper.dashboard_choices).to match_array [
         ['Your Projects (default)', 'projects'],
         ['Starred Projects',        'stars']
       ]
     end
   end
+
+  describe 'user_application_theme' do
+    context 'with a user' do
+      it "returns user's theme's css_class" do
+        stub_user(theme_id: 3)
+
+        expect(helper.user_application_theme).to eq 'ui_green'
+      end
+
+      it 'returns the default when id is invalid' do
+        stub_user(theme_id: Gitlab::Themes.count + 5)
+
+        allow(Gitlab.config.gitlab).to receive(:default_theme).and_return(2)
+
+        expect(helper.user_application_theme).to eq 'ui_charcoal'
+      end
+    end
+
+    context 'without a user' do
+      it 'returns the default theme' do
+        stub_user
+
+        expect(helper.user_application_theme).to eq Gitlab::Themes.default.css_class
+      end
+    end
+  end
+
+  describe 'user_color_scheme' do
+    context 'with a user' do
+      it "returns user's scheme's css_class" do
+        allow(helper).to receive(:current_user).
+          and_return(double(color_scheme_id: 3))
+
+        expect(helper.user_color_scheme).to eq 'solarized-light'
+      end
+
+      it 'returns the default when id is invalid' do
+        allow(helper).to receive(:current_user).
+          and_return(double(color_scheme_id: Gitlab::ColorSchemes.count + 5))
+      end
+    end
+
+    context 'without a user' do
+      it 'returns the default theme' do
+        stub_user
+
+        expect(helper.user_color_scheme).
+          to eq Gitlab::ColorSchemes.default.css_class
+      end
+    end
+  end
+
+  def stub_user(messages = {})
+    if messages.empty?
+      allow(helper).to receive(:current_user).and_return(nil)
+    else
+      allow(helper).to receive(:current_user).
+        and_return(double('user', messages))
+    end
+  end
 end

From 54771100eb8693c7fa06ea31041b0bd15f78dcc7 Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Wed, 26 Aug 2015 11:34:28 -0700
Subject: [PATCH 043/153] Add user_color_scheme class to file_highlight

Prevents an unstyled flash that occurs when we were only applying the
syntax highlighting class in Javascript. Now for these uncached blobs
the server can add the syntax class, and for (possibly) cached fenced
code blocks, the Javascript will add it as needed.
---
 app/views/shared/_file_highlight.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/shared/_file_highlight.html.haml b/app/views/shared/_file_highlight.html.haml
index 7b1c624d76..57c3aff3e1 100644
--- a/app/views/shared/_file_highlight.html.haml
+++ b/app/views/shared/_file_highlight.html.haml
@@ -1,4 +1,4 @@
-.file-content.code.js-syntax-highlight
+.file-content.code.js-syntax-highlight{ class: user_color_scheme }
   .line-numbers
     - if blob.data.present?
       - blob.data.lines.each_index do |index|

From ce0a0feff45b47b6c03b9ab01d815b651840a7b2 Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Wed, 26 Aug 2015 11:43:25 -0700
Subject: [PATCH 044/153] Make snippet_blob highlight server-side as well

---
 app/views/search/results/_snippet_blob.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/search/results/_snippet_blob.html.haml b/app/views/search/results/_snippet_blob.html.haml
index 19a7bfefef..9a4f9fb948 100644
--- a/app/views/search/results/_snippet_blob.html.haml
+++ b/app/views/search/results/_snippet_blob.html.haml
@@ -23,7 +23,7 @@
                 .nothing-here-block Empty file
       - else
         .file-content.code
-          %div.highlighted-data.js-syntax-highlight
+          %div.highlighted-data{ class: user_color_scheme }
             .line-numbers
               - snippet_blob[:snippet_chunks].each do |snippet|
                 - unless snippet[:data].empty?

From c27c81331183dd6c878b4a74df7e62e37b006a04 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 22:43:04 +0200
Subject: [PATCH 045/153] Improve trending projects finder

Signed-off-by: Dmitriy Zaporozhets 
---
 app/finders/trending_projects_finder.rb | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/app/finders/trending_projects_finder.rb b/app/finders/trending_projects_finder.rb
index a79bd47d98..f3f4d461ef 100644
--- a/app/finders/trending_projects_finder.rb
+++ b/app/finders/trending_projects_finder.rb
@@ -2,13 +2,21 @@ class TrendingProjectsFinder
   def execute(current_user, start_date = nil)
     start_date ||= Date.today - 1.month
 
-    projects = projects_for(current_user)
-
     # Determine trending projects based on comments count
     # for period of time - ex. month
-    projects.joins(:notes).where('notes.created_at > ?', start_date).
-      select("projects.*, count(notes.id) as ncount").
-      group("projects.id").reorder("ncount DESC")
+    trending_project_ids = Note.
+      select("notes.project_id, count(notes.project_id) as pcount").
+      where('notes.created_at > ?', start_date).
+      group("project_id").
+      reorder("pcount DESC").
+      map(&:project_id)
+
+    sql_order_ids = trending_project_ids.reverse.
+      map { |project_id| "id = #{project_id}" }.join(", ")
+
+    # Get list of projects that user allowed to see
+    projects = projects_for(current_user)
+    projects.where(id: trending_project_ids).reorder(sql_order_ids)
   end
 
   private

From b54358b45785639acc49e4b065020d2089040bd9 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 22:44:02 +0200
Subject: [PATCH 046/153] Refactor project list rendering

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/javascripts/dispatcher.js.coffee   |  4 --
 app/assets/stylesheets/base/mixins.scss       | 37 +++++++++++++++++++
 app/assets/stylesheets/generic/lists.scss     | 20 +---------
 app/assets/stylesheets/pages/projects.scss    | 33 +++++++++++------
 app/views/dashboard/_projects.html.haml       |  5 +--
 .../dashboard/projects/starred.html.haml      |  3 +-
 .../explore/projects/_projects.html.haml      | 12 +++---
 app/views/groups/_projects.html.haml          |  2 +-
 app/views/search/_results.html.haml           |  6 ++-
 app/views/search/results/_project.html.haml   |  6 ---
 app/views/shared/_project.html.haml           | 20 ----------
 app/views/shared/_projects_list.html.haml     | 17 ---------
 app/views/shared/projects/_list.html.haml     | 19 ++++++++++
 app/views/shared/projects/_project.html.haml  | 23 ++++++++++++
 app/views/users/_projects.html.haml           |  4 +-
 15 files changed, 118 insertions(+), 93 deletions(-)
 delete mode 100644 app/views/search/results/_project.html.haml
 delete mode 100644 app/views/shared/_project.html.haml
 delete mode 100644 app/views/shared/_projects_list.html.haml
 create mode 100644 app/views/shared/projects/_list.html.haml
 create mode 100644 app/views/shared/projects/_project.html.haml

diff --git a/app/assets/javascripts/dispatcher.js.coffee b/app/assets/javascripts/dispatcher.js.coffee
index 539041c286..5bf0b30217 100644
--- a/app/assets/javascripts/dispatcher.js.coffee
+++ b/app/assets/javascripts/dispatcher.js.coffee
@@ -55,7 +55,6 @@ class Dispatcher
         new Activities()
       when 'dashboard:projects:starred'
         new Activities()
-        new ProjectsList()
       when 'projects:commit:show'
         new Commit()
         new Diff()
@@ -70,7 +69,6 @@ class Dispatcher
       when 'groups:show'
         new Activities()
         shortcut_handler = new ShortcutsNavigation()
-        new ProjectsList()
       when 'groups:group_members:index'
         new GroupMembers()
         new UsersSelect()
@@ -96,8 +94,6 @@ class Dispatcher
       when 'users:show'
         new User()
         new Activities()
-      when 'admin:users:show'
-        new ProjectsList()
 
     switch path.first()
       when 'admin'
diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss
index 7beef1845e..3974befa95 100644
--- a/app/assets/stylesheets/base/mixins.scss
+++ b/app/assets/stylesheets/base/mixins.scss
@@ -157,3 +157,40 @@
   white-space: nowrap;
   max-width: $max_width;
 }
+
+/*
+ * Base mixin for lists in GitLab
+ */
+@mixin basic-list {
+  margin: 5px 0px;
+  padding: 0px;
+
+  li {
+    padding: 10px 0;
+    border-bottom: 1px solid #EEE;
+    overflow: hidden;
+    display: block;
+    margin: 0px;
+
+    &:last-child {
+      border:none
+    }
+
+    &.active {
+      background: #f9f9f9;
+      a {
+        font-weight: bold;
+      }
+    }
+
+    &.hide {
+      display: none;
+    }
+
+    &.light {
+      a {
+        color: #777;
+      }
+    }
+  }
+}
diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss
index c502d953c7..4b7ff84de2 100644
--- a/app/assets/stylesheets/generic/lists.scss
+++ b/app/assets/stylesheets/generic/lists.scss
@@ -93,28 +93,12 @@ ol, ul {
 
 /** light list with border-bottom between li **/
 ul.bordered-list {
-  margin: 5px 0px;
-  padding: 0px;
-  li {
-    padding: 5px 0;
-    border-bottom: 1px solid #EEE;
-    overflow: hidden;
-    display: block;
-    margin: 0px;
-    &:last-child { border:none }
-    &.active {
-      background: #f9f9f9;
-      a { font-weight: bold; }
-    }
-
-    &.light {
-      a { color: #777; }
-    }
-  }
+  @include basic-list;
 
   &.top-list {
     li:first-child {
       padding-top: 0;
+
       h4, h5 {
         margin-top: 0;
       }
diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 4d065c3bdf..8339c6f5e6 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -334,23 +334,32 @@ pre.light-well {
   }
 }
 
-.project-row {
-  .project-full-name {
-    font-weight: bold;
-    font-size: 15px;
-  }
+/*
+ * Projects list rendered on dashboard and user page
+ */
+.projects-list {
+  @include basic-list;
 
-  .project-description {
-    color: #888;
-    font-size: 13px;
+  .project-row {
+    .project-full-name {
+      @include str-truncated;
+      font-weight: bold;
+      font-size: 15px;
+    }
 
-    p {
-      margin-bottom: 0;
+    .project-description {
       color: #888;
+      font-size: 13px;
+
+      p {
+        @include str-truncated;
+        margin-bottom: 0;
+        color: #888;
+      }
     }
   }
 }
 
-.my-projects .project-row {
-  padding: 10px 0;
+.panel .projects-list li {
+  padding: 10px 15px;
 }
diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/_projects.html.haml
index dc83d5343f..ef9b9ce756 100644
--- a/app/views/dashboard/_projects.html.haml
+++ b/app/views/dashboard/_projects.html.haml
@@ -7,7 +7,4 @@
           = link_to new_project_path, class: 'btn btn-success' do
             New project
 
-  %ul.projects-list.bordered-list.my-projects
-    - @projects.each do |project|
-      %li.project-row
-        = render partial: 'shared/project', locals: { project: project, avatar: true, stars: true }
+  = render 'shared/projects/list', projects: @projects
diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml
index 6dcfd497ed..19f3975e53 100644
--- a/app/views/dashboard/projects/starred.html.haml
+++ b/app/views/dashboard/projects/starred.html.haml
@@ -17,8 +17,7 @@
                 = link_to new_project_path, class: 'btn btn-success' do
                   New project
 
-        = render 'shared/projects_list', projects: @projects,
-          projects_limit: 20, stars: true, avatar: false
+        = render 'shared/projects/list', projects: @projects, projects_limit: 20
 
 - else
   %h3 You don't have starred projects yet
diff --git a/app/views/explore/projects/_projects.html.haml b/app/views/explore/projects/_projects.html.haml
index 22cc541115..669079e952 100644
--- a/app/views/explore/projects/_projects.html.haml
+++ b/app/views/explore/projects/_projects.html.haml
@@ -1,6 +1,6 @@
-%ul.projects-list.bordered-list.my-projects.public-projects
-  - projects.each do |project|
-    %li.project-row
-      = render partial: 'shared/project', locals: { project: project, avatar: true, stars: true }
-- unless projects.present?
-  .nothing-here-block No such projects
+- if projects.any?
+  .public-projects
+    = render 'shared/projects/list', projects: projects
+- else
+  .nothing-here-block
+    No such projects
diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml
index 2ae51a1c8c..b2e32ced5e 100644
--- a/app/views/groups/_projects.html.haml
+++ b/app/views/groups/_projects.html.haml
@@ -7,4 +7,4 @@
           = link_to new_project_path(namespace_id: @group.id), class: 'btn btn-success' do
             New project
 
-  = render 'shared/projects_list', projects: @projects, projects_limit: 20
+  = render 'shared/projects/list', projects: @projects, projects_limit: 20
diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml
index 741c780ad9..0dc1dd5362 100644
--- a/app/views/search/_results.html.haml
+++ b/app/views/search/_results.html.haml
@@ -14,7 +14,11 @@
   %br
   .results.prepend-top-10
     .search-results
-      = render partial: "search/results/#{@scope.singularize}", collection: @objects
+      - if @scope == 'projects'
+        .term
+          = render 'shared/projects/list', projects: @objects
+      - else
+        = render partial: "search/results/#{@scope.singularize}", collection: @objects
       = paginate @objects, theme: 'gitlab'
 
 :javascript
diff --git a/app/views/search/results/_project.html.haml b/app/views/search/results/_project.html.haml
deleted file mode 100644
index 195cf06c8e..0000000000
--- a/app/views/search/results/_project.html.haml
+++ /dev/null
@@ -1,6 +0,0 @@
-.search-result-row
-  %h4
-    = link_to [project.namespace.becomes(Namespace), project] do
-      %span.term= project.name_with_namespace
-  - if project.description.present?
-    %span.light.term= project.description
diff --git a/app/views/shared/_project.html.haml b/app/views/shared/_project.html.haml
deleted file mode 100644
index 15df97b133..0000000000
--- a/app/views/shared/_project.html.haml
+++ /dev/null
@@ -1,20 +0,0 @@
-= cache [project.namespace, project, controller.controller_name, controller.action_name] do
-  = link_to project_path(project), class: dom_class(project) do
-    - if avatar
-      .dash-project-avatar
-        = project_icon(project, alt: '', class: 'avatar project-avatar s40')
-    %span.str-truncated.project-full-name
-      %span.namespace-name
-        - if project.namespace
-          = project.namespace.human_name
-          \/
-      %span.project-name.filter-title
-        = project.name
-    - if stars
-      %span.pull-right.light
-        %i.fa.fa-star
-        = project.star_count
-  - if project.description.present?
-    .project-description
-      .str-truncated
-        = markdown(project.description, pipeline: :description)
diff --git a/app/views/shared/_projects_list.html.haml b/app/views/shared/_projects_list.html.haml
deleted file mode 100644
index 4c58092af4..0000000000
--- a/app/views/shared/_projects_list.html.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-- projects_limit = 20 unless local_assigns[:projects_limit]
-- avatar = true unless local_assigns[:avatar] == false
-- stars = false unless local_assigns[:stars] == true
-%ul.well-list.projects-list
-  - projects.each_with_index do |project, i|
-    %li{class: (i >= projects_limit) ? 'project-row hide' : 'project-row'}
-      = render "shared/project", project: project, avatar: avatar, stars: stars
-  - if projects.blank?
-    %li
-      .nothing-here-block There are no projects here.
-  - if projects.count > projects_limit
-    %li.bottom
-      %span.light
-        #{projects_limit} of #{pluralize(projects.count, 'project')} displayed.
-      %span
-        = link_to '#', class: 'js-expand' do
-          Show all
diff --git a/app/views/shared/projects/_list.html.haml b/app/views/shared/projects/_list.html.haml
new file mode 100644
index 0000000000..021e3b689a
--- /dev/null
+++ b/app/views/shared/projects/_list.html.haml
@@ -0,0 +1,19 @@
+- projects_limit = 20 unless local_assigns[:projects_limit]
+- avatar = true unless local_assigns[:avatar] == false
+- stars = true unless local_assigns[:stars] == false
+
+%ul.projects-list
+  - projects.each_with_index do |project, i|
+    - css_class = (i >= projects_limit) ? 'hide' : nil
+    = render "shared/projects/project", project: project,
+      avatar: avatar, stars: stars, css_class: css_class
+
+  - if projects.count > projects_limit
+    %li.bottom.center
+      .light
+        #{projects_limit} of #{pluralize(projects.count, 'project')} displayed.
+        = link_to '#', class: 'js-expand' do
+          Show all
+
+:coffeescript
+  new ProjectsList()
diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml
new file mode 100644
index 0000000000..4bfdf4d55f
--- /dev/null
+++ b/app/views/shared/projects/_project.html.haml
@@ -0,0 +1,23 @@
+- avatar = true unless local_assigns[:avatar] == false
+- stars = true unless local_assigns[:stars] == false
+- css_class = nil unless local_assigns[:css_class]
+%li.project-row{ class: css_class }
+  = cache [project.namespace, project, controller.controller_name, controller.action_name, 'v2'] do
+    = link_to project_path(project), class: dom_class(project) do
+      - if avatar
+        .dash-project-avatar
+          = project_icon(project, alt: '', class: 'avatar project-avatar s40')
+      %span.project-full-name
+        %span.namespace-name
+          - if project.namespace
+            = project.namespace.human_name
+            \/
+        %span.project-name.filter-title
+          = project.name
+      - if stars
+        %span.pull-right.light
+          %i.fa.fa-star
+          = project.star_count
+    - if project.description.present?
+      .project-description
+        = markdown(project.description, pipeline: :description)
diff --git a/app/views/users/_projects.html.haml b/app/views/users/_projects.html.haml
index 297fa53739..a126a858ea 100644
--- a/app/views/users/_projects.html.haml
+++ b/app/views/users/_projects.html.haml
@@ -1,13 +1,13 @@
 - if local_assigns.has_key?(:contributed_projects) && contributed_projects.present?
   .panel.panel-default.contributed-projects
     .panel-heading Projects contributed to
-    = render 'shared/projects_list',
+    = render 'shared/projects/list',
       projects: contributed_projects.sort_by(&:star_count).reverse,
       projects_limit: 5, stars: true, avatar: false
 
 - if local_assigns.has_key?(:projects) && projects.present?
   .panel.panel-default
     .panel-heading Personal projects
-    = render 'shared/projects_list',
+    = render 'shared/projects/list',
       projects: projects.sort_by(&:star_count).reverse,
       projects_limit: 10, stars: true, avatar: false

From 174e4424a5eb6828705ecf5ed25979a5120dd735 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 22:52:52 +0200
Subject: [PATCH 047/153] Remove unused css

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/pages/projects.scss | 72 ----------------------
 1 file changed, 72 deletions(-)

diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss
index 8339c6f5e6..488dded549 100644
--- a/app/assets/stylesheets/pages/projects.scss
+++ b/app/assets/stylesheets/pages/projects.scss
@@ -162,78 +162,6 @@ ul.nav.nav-projects-tabs {
   margin: 0px;
 }
 
-.my-projects,
-.public-projects {
-  li {
-    .project-info {
-      margin-bottom: 10px;
-      overflow: hidden;
-    }
-
-    .access-icon {
-      color: #AAA;
-      margin-left: 10px;
-      i {
-        color: #AAA;
-      }
-    }
-  }
-}
-
-.public-clone {
-  background: #EEE;
-  color: #777;
-  padding: 6px 10px;
-  margin: 1px;
-  font-weight: normal;
-}
-
-.public-projects .repo-info {
-  color: #777;
-
-  a {
-    color: #777;
-  }
-}
-
-.project-side {
-  .project-fork-icon {
-    float: left;
-    font-size: 26px;
-    margin-right: 10px;
-    line-height: 1.5;
-  }
-
-  .panel {
-    @include border-radius(3px);
-
-    .panel-heading, .panel-footer {
-      font-weight: normal;
-      background-color: transparent;
-      color: #666;
-      border-color: #EEE;
-    }
-
-    .actions {
-      margin-top: 10px;
-    }
-
-    .nav-pills a {
-      padding: 10px;
-      font-weight: bold;
-      color: $gl-link-color;
-    }
-
-    .nav {
-      margin-bottom: 15px;
-    }
-  }
-
-  .ci-status-image {
-    max-height: 22px;
-  }
-}
-
 .transfer-project .select2-container {
   min-width: 200px;
 }

From e0b4222fa67f25c330d16b660010b604383ba7fa Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 23:12:24 +0200
Subject: [PATCH 048/153] Small improvements to center top menu

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/generic/common.scss | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss
index bf5c7a8d75..c63fe404aa 100644
--- a/app/assets/stylesheets/generic/common.scss
+++ b/app/assets/stylesheets/generic/common.scss
@@ -375,7 +375,6 @@ table {
 }
 
 .center-top-menu {
-  border-bottom: 1px solid #EEE;
   list-style: none;
   text-align: center;
   padding-bottom: 15px;
@@ -385,7 +384,7 @@ table {
     display: inline-block;
 
     a {
-      padding: 10px;
+      padding: 15px;
     }
 
     &.active a {

From 5ea5e8f5d6fa6721af10839b7c81a87fc49c7843 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 23:41:56 +0200
Subject: [PATCH 049/153] Standartize how we render group rows

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/generic/common.scss |  1 +
 app/views/dashboard/groups/index.html.haml | 31 +++-------------------
 app/views/explore/groups/index.html.haml   | 12 +--------
 app/views/shared/groups/_group.html.haml   | 24 +++++++++++++++++
 4 files changed, 30 insertions(+), 38 deletions(-)
 create mode 100644 app/views/shared/groups/_group.html.haml

diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss
index c63fe404aa..2674fde41a 100644
--- a/app/assets/stylesheets/generic/common.scss
+++ b/app/assets/stylesheets/generic/common.scss
@@ -377,6 +377,7 @@ table {
 .center-top-menu {
   list-style: none;
   text-align: center;
+  margin-top: 5px;
   padding-bottom: 15px;
   margin-bottom: 15px;
 
diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml
index 0860fe3c76..fbe523b4b6 100644
--- a/app/views/dashboard/groups/index.html.haml
+++ b/app/views/dashboard/groups/index.html.haml
@@ -8,32 +8,9 @@
       = link_to new_group_path, class: "btn btn-new btn-sm" do
         %i.fa.fa-plus
         New Group
-.panel.panel-default
-  .panel-heading
-    %strong Groups
-    (#{@group_members.count})
-  %ul.well-list
-    - @group_members.each do |group_member|
-      - group = group_member.group
-      %li
-        .pull-right.hidden-xs
-          - if can?(current_user, :admin_group, group)
-            = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do
-              %i.fa.fa-cogs
-              Settings
-
-          = 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
-            Leave
-
-        = image_tag group_icon(group), class: "avatar s40 avatar-tile hidden-xs"
-        = link_to group, class: 'group-name' do
-          %strong= group.name
-
-        as
-        %strong #{group_member.human_access}
-
-        %div.light
-          #{pluralize(group.projects.count, "project")}, #{pluralize(group.users.count, "user")}
+%ul.bordered-list
+  - @group_members.each do |group_member|
+    - group = group_member.group
+    = render 'shared/groups/group', group: group, group_member: group_member
 
 = paginate @group_members
diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml
index 7dcefd330a..80acb91436 100644
--- a/app/views/explore/groups/index.html.haml
+++ b/app/views/explore/groups/index.html.haml
@@ -32,17 +32,7 @@
 
 %ul.bordered-list
   - @groups.each do |group|
-    %li
-      .clearfix
-        %h4
-          = link_to group_path(id: group.path) do
-            = group.name
-      .clearfix
-        %p
-          = truncate group.description, length: 150
-      .clearfix
-        %p.light
-          #{pluralize(group.members.size, 'member')}, #{pluralize(group.projects.count, 'project')}
+    = render 'shared/groups/group', group: group
   - unless @groups.present?
     .nothing-here-block No public groups
 
diff --git a/app/views/shared/groups/_group.html.haml b/app/views/shared/groups/_group.html.haml
new file mode 100644
index 0000000000..229ae359bc
--- /dev/null
+++ b/app/views/shared/groups/_group.html.haml
@@ -0,0 +1,24 @@
+- group_member = local_assigns[:group_member]
+%li
+  - if group_member
+    .pull-right.hidden-xs
+      - if can?(current_user, :admin_group, group)
+        = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do
+          %i.fa.fa-cogs
+          Settings
+
+      = 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
+        Leave
+
+  = image_tag group_icon(group), class: "avatar s40 avatar-tile hidden-xs"
+  = link_to group, class: 'group-name' do
+    %strong= group.name
+
+  - if group_member
+    as
+    %strong #{group_member.human_access}
+
+  %div.light
+    #{pluralize(group.projects.count, "project")}, #{pluralize(group.users.count, "user")}
+

From daa90e1182c1991b088f4feed1a633c35bdde0f9 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Wed, 26 Aug 2015 23:59:52 +0200
Subject: [PATCH 050/153] Fix 500 error when try to create project snippet
 without content

Signed-off-by: Dmitriy Zaporozhets 
---
 app/controllers/projects/snippets_controller.rb | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb
index 6430663742..b07a2a8db2 100644
--- a/app/controllers/projects/snippets_controller.rb
+++ b/app/controllers/projects/snippets_controller.rb
@@ -30,9 +30,14 @@ class Projects::SnippetsController < Projects::ApplicationController
   def create
     @snippet = CreateSnippetService.new(@project, current_user,
                                         snippet_params).execute
-    respond_with(@snippet,
-                 location: namespace_project_snippet_path(@project.namespace,
-                                                          @project, @snippet))
+
+    if @snippet.valid?
+      respond_with(@snippet,
+                   location: namespace_project_snippet_path(@project.namespace,
+                                                            @project, @snippet))
+    else
+      render :new
+    end
   end
 
   def edit

From 4ac7f5c949c664523e9a6e474d522f7d093249a2 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Thu, 27 Aug 2015 00:00:06 +0200
Subject: [PATCH 051/153] Restyle snippets rendering

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/pages/snippets.scss    | 24 +++++++++++++++++++
 .../projects/snippets/_snippet.html.haml      | 15 ------------
 app/views/projects/snippets/index.html.haml   |  3 +--
 .../{ => shared}/snippets/_snippet.html.haml  | 18 +++++++-------
 app/views/snippets/_snippets.html.haml        |  2 +-
 5 files changed, 34 insertions(+), 28 deletions(-)
 delete mode 100644 app/views/projects/snippets/_snippet.html.haml
 rename app/views/{ => shared}/snippets/_snippet.html.haml (53%)

diff --git a/app/assets/stylesheets/pages/snippets.scss b/app/assets/stylesheets/pages/snippets.scss
index d79591d991..a3d7aba054 100644
--- a/app/assets/stylesheets/pages/snippets.scss
+++ b/app/assets/stylesheets/pages/snippets.scss
@@ -6,3 +6,27 @@
 .snippet-form-holder .file-holder .file-title {
   padding: 2px;
 }
+
+
+.snippet-row {
+  .snippet-title {
+    font-size: 15px;
+    font-weight: bold;
+    line-height: 20px;
+    margin-bottom: 2px;
+
+    .monospace {
+      font-weight: normal;
+    }
+  }
+
+  .snippet-info {
+    color: #888;
+    font-size: 13px;
+    line-height: 24px;
+
+    a {
+      color: #888;
+    }
+  }
+}
diff --git a/app/views/projects/snippets/_snippet.html.haml b/app/views/projects/snippets/_snippet.html.haml
deleted file mode 100644
index b2c35edc44..0000000000
--- a/app/views/projects/snippets/_snippet.html.haml
+++ /dev/null
@@ -1,15 +0,0 @@
-%li
-  %h4.snippet-title
-    = link_to reliable_snippet_path(snippet) do
-      = truncate(snippet.title, length: 60)
-    %span.cgray.monospace.tiny.pull-right
-      = snippet.file_name
-
-  .snippet-info
-    = "##{snippet.id}"
-    %span
-      by
-      = image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16"
-      = snippet.author_name
-      %span.light
-        #{time_ago_with_tooltip(snippet.created_at)}
diff --git a/app/views/projects/snippets/index.html.haml b/app/views/projects/snippets/index.html.haml
index 30081673ff..45d4de6a38 100644
--- a/app/views/projects/snippets/index.html.haml
+++ b/app/views/projects/snippets/index.html.haml
@@ -8,9 +8,8 @@
 %p.light
   Share code pastes with others out of git repository
 
-%hr
 %ul.bordered-list
-  = render partial: "projects/snippets/snippet", collection: @snippets
+  = render partial: "shared/snippets/snippet", collection: @snippets
   - if @snippets.empty?
     %li
       .nothing-here-block Nothing here.
diff --git a/app/views/snippets/_snippet.html.haml b/app/views/shared/snippets/_snippet.html.haml
similarity index 53%
rename from app/views/snippets/_snippet.html.haml
rename to app/views/shared/snippets/_snippet.html.haml
index 5bb2866434..69a713ad9a 100644
--- a/app/views/snippets/_snippet.html.haml
+++ b/app/views/shared/snippets/_snippet.html.haml
@@ -1,12 +1,12 @@
-%li
-  %h4.snippet-title
+%li.snippet-row
+  .snippet-title
     = link_to reliable_snippet_path(snippet) do
       = truncate(snippet.title, length: 60)
       - if snippet.private?
         %span.label.label-gray
           %i.fa.fa-lock
           private
-    %span.cgray.monospace.tiny.pull-right
+    %span.monospace.pull-right
       = snippet.file_name
 
   %small.pull-right.cgray
@@ -14,10 +14,8 @@
       = link_to snippet.project.name_with_namespace, namespace_project_path(snippet.project.namespace, snippet.project)
 
   .snippet-info
-    = "##{snippet.id}"
-    %span
-      by
-      = link_to user_snippets_path(snippet.author) do
-        = image_tag avatar_icon(snippet.author_email), class: "avatar avatar-inline s16", alt: ''
-        = snippet.author_name
-      %span.light #{time_ago_with_tooltip(snippet.created_at)}
+    = link_to user_snippets_path(snippet.author) do
+      = image_tag avatar_icon(snippet.author_email), class: "avatar s24", alt: ''
+      = snippet.author_name
+    authored #{time_ago_with_tooltip(snippet.created_at)}
+
diff --git a/app/views/snippets/_snippets.html.haml b/app/views/snippets/_snippets.html.haml
index 40df42b6cf..d9aa4dd1d2 100644
--- a/app/views/snippets/_snippets.html.haml
+++ b/app/views/snippets/_snippets.html.haml
@@ -1,5 +1,5 @@
 %ul.bordered-list
-  = render partial: 'snippet', collection: @snippets
+  = render partial: 'shared/snippets/snippet', collection: @snippets
   - if @snippets.empty?
     %li
       .nothing-here-block Nothing here.

From 3d02ead9246c7112d5a32ee87da774e47927c84e Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Thu, 27 Aug 2015 00:06:48 +0200
Subject: [PATCH 052/153] Use same snippets icon everywhere. Fix list style for
 bordered-list

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/base/mixins.scss  | 1 +
 app/views/layouts/nav/_project.html.haml | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss
index 3974befa95..05f5bd79f9 100644
--- a/app/assets/stylesheets/base/mixins.scss
+++ b/app/assets/stylesheets/base/mixins.scss
@@ -164,6 +164,7 @@
 @mixin basic-list {
   margin: 5px 0px;
   padding: 0px;
+  list-style: none;
 
   li {
     padding: 10px 0;
diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml
index d17d1c5fbd..5e7b902622 100644
--- a/app/views/layouts/nav/_project.html.haml
+++ b/app/views/layouts/nav/_project.html.haml
@@ -100,7 +100,7 @@
   - if project_nav_tab? :snippets
     = nav_link(controller: :snippets) do
       = link_to namespace_project_snippets_path(@project.namespace, @project), title: 'Snippets', class: 'shortcuts-snippets', data: {placement: 'right'} do
-        = icon('file-text-o fw')
+        = icon('clipboard fw')
         %span
           Snippets
 

From dcdf214fd15244fd41cc22cfc068c0b6ee421069 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Thu, 27 Aug 2015 00:22:36 +0200
Subject: [PATCH 053/153] More compact search page

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/pages/search.scss | 6 +++---
 app/views/search/_category.html.haml     | 2 +-
 app/views/search/show.html.haml          | 3 +--
 3 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index bdaa17ac33..eee0e342c3 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -1,7 +1,7 @@
 .search-results {
   .search-result-row {
-    border-bottom: 1px solid #EEE;
-    padding-bottom: 10px;
-    margin-bottom: 10px;
+    border-bottom: 1px solid #DDD;
+    padding-bottom: 15px;
+    margin-bottom: 15px;
   }
 }
diff --git a/app/views/search/_category.html.haml b/app/views/search/_category.html.haml
index a75cd7bd80..d637abfa76 100644
--- a/app/views/search/_category.html.haml
+++ b/app/views/search/_category.html.haml
@@ -1,4 +1,4 @@
-%ul.nav.nav-pills.search-filter
+%ul.nav.nav-tabs.search-filter
   - if @project
     %li{class: ("active" if @scope == 'blobs')}
       = link_to search_filter_path(scope: 'blobs') do
diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml
index 60f9e9ac9d..35b23ceb9d 100644
--- a/app/views/search/show.html.haml
+++ b/app/views/search/show.html.haml
@@ -1,7 +1,6 @@
 - page_title @search_term
 = render 'search/form'
-%hr
+%br
 - if @search_term
   = render 'search/category'
-  %hr
   = render 'search/results'

From e06fe6b7e1d02784992cb9c413f65504ad63ce14 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Thu, 27 Aug 2015 00:50:17 +0200
Subject: [PATCH 054/153] Make search bar on search page more noticeable

Signed-off-by: Dmitriy Zaporozhets 
---
 app/assets/stylesheets/pages/search.scss | 12 ++++++++++++
 app/views/search/_filter.html.haml       |  6 ++----
 app/views/search/_form.html.haml         | 12 +++++++-----
 app/views/search/_results.html.haml      |  3 +--
 app/views/search/show.html.haml          |  1 -
 5 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/app/assets/stylesheets/pages/search.scss b/app/assets/stylesheets/pages/search.scss
index eee0e342c3..3aaa96da60 100644
--- a/app/assets/stylesheets/pages/search.scss
+++ b/app/assets/stylesheets/pages/search.scss
@@ -5,3 +5,15 @@
     margin-bottom: 15px;
   }
 }
+
+.search-holder {
+  max-width: 600px;
+  margin: 0 auto;
+  margin-bottom: 20px;
+
+  input {
+    border-color: #BBB;
+    font-weight: bold;
+  }
+}
+
diff --git a/app/views/search/_filter.html.haml b/app/views/search/_filter.html.haml
index e2d0cab9e7..ec478a5963 100644
--- a/app/views/search/_filter.html.haml
+++ b/app/views/search/_filter.html.haml
@@ -1,6 +1,5 @@
 .dropdown.inline
-  %button.dropdown-toggle.btn.btn{type: 'button', 'data-toggle' => 'dropdown'}
-    %i.fa.fa-tags
+  %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'}
     %span.light Group:
     - if @group.present?
       %strong= @group.name
@@ -17,8 +16,7 @@
           = group.name
 
 .dropdown.inline.prepend-left-10.project-filter
-  %button.dropdown-toggle.btn.btn{type: 'button', 'data-toggle' => 'dropdown'}
-    %i.fa.fa-tags
+  %button.dropdown-toggle.btn.btn-sm{type: 'button', 'data-toggle' => 'dropdown'}
     %span.light Project:
     - if @project.present?
       %strong= @project.name_with_namespace
diff --git a/app/views/search/_form.html.haml b/app/views/search/_form.html.haml
index 5ee70be1ad..3938c545ca 100644
--- a/app/views/search/_form.html.haml
+++ b/app/views/search/_form.html.haml
@@ -1,12 +1,14 @@
-= form_tag search_path, method: :get, class: 'form-inline' do |f|
+= form_tag search_path, method: :get do |f|
   = hidden_field_tag :project_id, params[:project_id]
   = hidden_field_tag :group_id, params[:group_id]
   = hidden_field_tag :snippets, params[:snippets]
   = hidden_field_tag :scope, params[:scope]
+
   .search-holder.clearfix
-    .form-group
+    .input-group
       = search_field_tag :search, params[:search], placeholder: "Search for projects, issues etc", class: "form-control search-text-input", id: "dashboard_search", autofocus: true
-      = button_tag 'Search', class: "btn btn-primary"
+      %span.input-group-btn
+        = button_tag 'Search', class: "btn btn-primary"
     - unless params[:snippets].eql? 'true'
-      .pull-right
-        = render 'filter'
+      %br
+      = render 'filter'
diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml
index 0dc1dd5362..2a38c98dcf 100644
--- a/app/views/search/_results.html.haml
+++ b/app/views/search/_results.html.haml
@@ -1,7 +1,7 @@
 - if @search_results.empty?
   = render partial: "search/results/empty"
 - else
-  .light
+  %p.light
     Search results for
     %code
       = @search_term
@@ -11,7 +11,6 @@
       - elsif @group
         in group #{link_to @group.name, @group}
 
-  %br
   .results.prepend-top-10
     .search-results
       - if @scope == 'projects'
diff --git a/app/views/search/show.html.haml b/app/views/search/show.html.haml
index 35b23ceb9d..f4f3dcfc29 100644
--- a/app/views/search/show.html.haml
+++ b/app/views/search/show.html.haml
@@ -1,6 +1,5 @@
 - page_title @search_term
 = render 'search/form'
-%br
 - if @search_term
   = render 'search/category'
   = render 'search/results'

From 6a889572fa8c149729e12e9386c1982e660a766e Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets 
Date: Thu, 27 Aug 2015 00:53:00 +0200
Subject: [PATCH 055/153] Add changelog items

Signed-off-by: Dmitriy Zaporozhets 
---
 CHANGELOG | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/CHANGELOG b/CHANGELOG
index 03b12ff133..7603bda6d3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -20,6 +20,9 @@ v 8.0.0 (unreleased)
   - Move dashboard activity to separate page
   - Improve performance of git blame
   - Limit content width to 1200px for most of pages to improve readability on big screens
+  - Fix 500 error when submit project snippet without body
+  - Improve search page usability
+  - Bring more UI consistency in way how projects, snippets and groups lists are rendered
 
 v 7.14.1 (unreleased)
   - Only include base URL in OmniAuth full_host parameter (Stan Hu)

From ea5da30326a0515f98d7276c9cff239232cafed4 Mon Sep 17 00:00:00 2001
From: Douwe Maan 
Date: Wed, 26 Aug 2015 17:23:22 -0700
Subject: [PATCH 056/153] Don't notify users without access to the project when
 they are (accidentally) mentioned in a note.

---
 CHANGELOG                                  |  1 +
 app/services/notification_service.rb       | 11 ++++++++---
 spec/services/notification_service_spec.rb | 11 +++++++++--
 3 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 9593c16c9c..bf3b7bb8b0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,6 +19,7 @@ v 8.0.0 (unreleased)
   - Move dashboard activity to separate page
   - Improve performance of git blame
   - Limit content width to 1200px for most of pages to improve readability on big screens
+  - Don't notify users without access to the project when they are (accidentally) mentioned in a note.
 
 v 7.14.1
   - Improve abuse reports management from admin area
diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
index 3735a13636..e294b23bc2 100644
--- a/app/services/notification_service.rb
+++ b/app/services/notification_service.rb
@@ -107,12 +107,17 @@ class NotificationService
 
     recipients = []
 
+    mentioned_users = note.mentioned_users
+    mentioned_users.select! do |user|
+      user.can?(:read_project, note.project)
+    end
+
     # Add all users participating in the thread (author, assignee, comment authors)
     participants = 
       if target.respond_to?(:participants)
         target.participants(note.author)
       else
-        note.mentioned_users
+        mentioned_users
       end
     recipients = recipients.concat(participants)
 
@@ -120,8 +125,8 @@ class NotificationService
     recipients = add_project_watchers(recipients, note.project)
 
     # Reject users with Mention notification level, except those mentioned in _this_ note.
-    recipients = reject_mention_users(recipients - note.mentioned_users, note.project)
-    recipients = recipients + note.mentioned_users
+    recipients = reject_mention_users(recipients - mentioned_users, note.project)
+    recipients = recipients + mentioned_users
 
     recipients = reject_muted_users(recipients, note.project)
 
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
index 9da6c9dc94..8865335d0d 100644
--- a/spec/services/notification_service_spec.rb
+++ b/spec/services/notification_service_spec.rb
@@ -31,13 +31,16 @@ describe NotificationService do
 
   describe 'Notes' do
     context 'issue note' do
-      let(:project) { create(:empty_project, :public) }
+      let(:project) { create(:empty_project, :private) }
       let(:issue) { create(:issue, project: project, assignee: create(:user)) }
       let(:mentioned_issue) { create(:issue, assignee: issue.assignee) }
-      let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@mention referenced') }
+      let(:note) { create(:note_on_issue, noteable: issue, project_id: issue.project_id, note: '@mention referenced, @outsider also') }
 
       before do
         build_team(note.project)
+        project.team << [issue.author, :master]
+        project.team << [issue.assignee, :master]
+        project.team << [note.author, :master]
       end
 
       describe :new_note do
@@ -53,6 +56,7 @@ describe NotificationService do
           should_not_email(@u_participating.id)
           should_not_email(@u_disabled.id)
           should_not_email(@unsubscriber.id)
+          should_not_email(@u_outsider_mentioned)
 
           notification.new_note(note)
         end
@@ -444,12 +448,15 @@ describe NotificationService do
     @u_mentioned = create(:user, username: 'mention', notification_level: Notification::N_MENTION)
     @u_committer = create(:user, username: 'committer')
     @u_not_mentioned = create(:user, username: 'regular', notification_level: Notification::N_PARTICIPATING)
+    @u_outsider_mentioned = create(:user, username: 'outsider')
 
     project.team << [@u_watcher, :master]
     project.team << [@u_participating, :master]
+    project.team << [@u_participant_mentioned, :master]
     project.team << [@u_disabled, :master]
     project.team << [@u_mentioned, :master]
     project.team << [@u_committer, :master]
+    project.team << [@u_not_mentioned, :master]
   end
 
   def add_users_with_subscription(project, issuable)

From 397ebc5fc1fd424fc745535793fadbff880ce547 Mon Sep 17 00:00:00 2001
From: Sytse Sijbrandij 
Date: Wed, 26 Aug 2015 19:29:37 -0700
Subject: [PATCH 057/153] Doesn't refer to participating in watch.

---
 app/views/profiles/notifications/show.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml
index 9480a19f5b..db7fa2eabe 100644
--- a/app/views/profiles/notifications/show.html.haml
+++ b/app/views/profiles/notifications/show.html.haml
@@ -48,7 +48,7 @@
           = f.radio_button :notification_level, Notification::N_WATCH
           .level-title
             Watch
-          %p You will receive all notifications from projects in which you participate
+          %p You will receive notifications for any activity
 
   .form-actions
     = f.submit 'Save changes', class: "btn btn-create"

From ff30b407545b2b873ffbe9d5d3d603e550013cf3 Mon Sep 17 00:00:00 2001
From: Valery Sizov 
Date: Thu, 27 Aug 2015 11:21:57 +0300
Subject: [PATCH 058/153] Make all profile public

---
 CHANGELOG                           | 1 +
 app/controllers/users_controller.rb | 4 ----
 app/models/user.rb                  | 4 ----
 app/views/profiles/show.html.haml   | 5 -----
 features/user.feature               | 5 -----
 5 files changed, 1 insertion(+), 18 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 6ed1716f8a..d366e2a6f5 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,6 +19,7 @@ v 8.0.0 (unreleased)
   - Move dashboard activity to separate page
   - Improve performance of git blame
   - Limit content width to 1200px for most of pages to improve readability on big screens
+  - Make all profiles public
 
 v 7.14.1
   - Improve abuse reports management from admin area
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 2bb5c338cf..1484356a7f 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -51,10 +51,6 @@ class UsersController < ApplicationController
 
   def set_user
     @user = User.find_by_username!(params[:username])
-
-    unless current_user || @user.public_profile?
-      return authenticate_user!
-    end
   end
 
   def authorized_projects_ids
diff --git a/app/models/user.rb b/app/models/user.rb
index f70761074c..b4e779370a 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -637,10 +637,6 @@ class User < ActiveRecord::Base
     email.start_with?('temp-email-for-oauth')
   end
 
-  def public_profile?
-    authorized_projects.public_only.any?
-  end
-
   def avatar_url(size = nil)
     if avatar.present?
       [gitlab_config.url, avatar.url].join
diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml
index 9fdeddfcc7..c519e52e59 100644
--- a/app/views/profiles/show.html.haml
+++ b/app/views/profiles/show.html.haml
@@ -100,11 +100,6 @@
               %hr
               = link_to 'Remove avatar', profile_avatar_path, data: { confirm: "Avatar will be removed. Are you sure?"}, method: :delete, class: "btn btn-remove btn-sm remove-avatar"
 
-      - if @user.public_profile?
-        .alert.alert-info
-          %h4 Public profile
-          %p Your profile is publicly visible because you joined public project(s)
-
 
   .row
     .col-md-7
diff --git a/features/user.feature b/features/user.feature
index 69618e929c..35eae842e7 100644
--- a/features/user.feature
+++ b/features/user.feature
@@ -14,11 +14,6 @@ Feature: User
     And I should not see project "Internal"
     And I should see project "Community"
 
-  Scenario: I visit user "John Doe" page while not signed in when he is not authorized to a public project
-    Given "John Doe" owns internal project "Internal"
-    When I visit user "John Doe" page
-    Then I should be redirected to sign in page
-
   # Signed in as someone else
 
   Scenario: I visit user "John Doe" page while signed in as someone else when he owns a public project

From 1081a322f1b846fcddb3cb77f068e2e818f9d73f Mon Sep 17 00:00:00 2001
From: Jacob Vosmaer 
Date: Thu, 27 Aug 2015 16:35:00 +0200
Subject: [PATCH 059/153] Properly daemonize the mail_room process

The old invocation only worked by accident because we have a '&'
somewhere in the init script for expediency. When ran from a terminal,
the mail_room daemon process ended up in the session of the terminal.
This commit adds a small wrapper that tries to do the textbook
daemonization steps (double fork, setsid etc.) while also taking
care that the pidfile is written before the 'start' process exits.
---
 bin/daemon_with_pidfile | 33 +++++++++++++++++++++++++++++++++
 bin/mail_room           |  4 +---
 2 files changed, 34 insertions(+), 3 deletions(-)
 create mode 100755 bin/daemon_with_pidfile

diff --git a/bin/daemon_with_pidfile b/bin/daemon_with_pidfile
new file mode 100755
index 0000000000..f138c27a0e
--- /dev/null
+++ b/bin/daemon_with_pidfile
@@ -0,0 +1,33 @@
+#!/usr/bin/env ruby
+# daemon_with_pidfile
+#
+# Daemonize, write a pidfile, and exec the remainder of the command line.
+
+def main(pidfile, cmd)
+  if middle_pid = Process.fork
+    # outer process
+    # Do not exit the outer process before the middle process finishes
+    Process.waitpid(middle_pid)
+    exit $?.exitstatus
+  end
+
+  if final_pid = Process.fork
+    # middle process
+    open(pidfile, 'w') { |f| f.puts final_pid }
+    exit
+  end
+
+  # Standard daemon things: become session leader, ignore SIGHUP, close stdin.
+  Signal.trap("HUP", "IGNORE")
+  Process.setsid
+  IO.new(0).close
+
+  exec(*cmd)
+end
+
+if ARGV.count < 2
+  abort "Usage: #$0 pidfile command [args...]"
+end
+
+pidfile = ARGV.shift
+main(pidfile, ARGV)
diff --git a/bin/mail_room b/bin/mail_room
index f4f1a170c0..74a84f5b2b 100755
--- a/bin/mail_room
+++ b/bin/mail_room
@@ -19,9 +19,7 @@ get_mail_room_pid()
 
 start()
 {
-  bundle exec mail_room -q -c $mail_room_config >> $mail_room_logfile 2>&1 &
-  PID=$!
-  echo $PID > $mail_room_pidfile
+  bin/daemon_with_pidfile $mail_room_pidfile bundle exec mail_room -q -c $mail_room_config >> $mail_room_logfile 2>&1
 }
 
 stop()

From ef6c06c0f3341d9508693930af4979659d6a4b63 Mon Sep 17 00:00:00 2001
From: Stan Hu 
Date: Thu, 27 Aug 2015 13:07:14 -0700
Subject: [PATCH 060/153] Upgrade gitlab_git to 7.2.15 to fix `git blame`
 errors with ISO-encoded files

Closes https://github.com/gitlabhq/gitlabhq/issues/9577
---
 CHANGELOG    | 1 +
 Gemfile      | 2 +-
 Gemfile.lock | 4 ++--
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 386ce7ca6d..638a6aac03 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 Please view this file on the master branch, on stable branches it's out of date.
 
 v 8.0.0 (unreleased)
+  - Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu)
   - Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu)
   - Improve dropdown positioning on the project home page (Hannes Rosenögger)
   - Upgrade browser gem to 1.0.0 to avoid warning in IE11 compatibilty mode (Stan Hu)
diff --git a/Gemfile b/Gemfile
index 4696a961e8..e1b9ede17b 100644
--- a/Gemfile
+++ b/Gemfile
@@ -38,7 +38,7 @@ gem "browser", '~> 1.0.0'
 
 # Extracting information from a git repository
 # Provide access to Gitlab::Git library
-gem "gitlab_git", '~> 7.2.14'
+gem "gitlab_git", '~> 7.2.15'
 
 # Ruby/Rack Git Smart-HTTP Server Handler
 # GitLab fork with a lot of changes (improved thread-safety, better memory usage etc)
diff --git a/Gemfile.lock b/Gemfile.lock
index 814249c7ff..ff01ad1014 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -276,7 +276,7 @@ GEM
       mime-types (~> 1.19)
     gitlab_emoji (0.1.0)
       gemojione (~> 2.0)
-    gitlab_git (7.2.14)
+    gitlab_git (7.2.15)
       activesupport (~> 4.0)
       charlock_holmes (~> 0.6)
       gitlab-linguist (~> 3.0)
@@ -790,7 +790,7 @@ DEPENDENCIES
   gitlab-grack (~> 2.0.2)
   gitlab-linguist (~> 3.0.1)
   gitlab_emoji (~> 0.1)
-  gitlab_git (~> 7.2.14)
+  gitlab_git (~> 7.2.15)
   gitlab_meta (= 7.0)
   gitlab_omniauth-ldap (= 1.2.1)
   gollum-lib (~> 4.0.2)

From 4340dd3eeb6fdda83b729c16cba29239b8ed9f43 Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Thu, 27 Aug 2015 13:09:01 -0700
Subject: [PATCH 061/153] Decouple Gitlab::Markdown from the
 GitlabMarkdownHelper

This module is now the sole source of knowledge for *how* we render
Markdown (and GFM).
---
 app/helpers/gitlab_markdown_helper.rb         | 34 +++-------
 lib/gitlab/markdown.rb                        | 62 ++++++++++++++++---
 .../markdown/syntax_highlight_filter.rb       | 38 ++++++++++++
 lib/gitlab/reference_extractor.rb             |  8 +--
 lib/redcarpet/render/gitlab_html.rb           | 45 --------------
 spec/features/markdown_spec.rb                |  2 +-
 spec/helpers/gitlab_markdown_helper_spec.rb   | 22 ++-----
 7 files changed, 111 insertions(+), 100 deletions(-)
 create mode 100644 lib/gitlab/markdown/syntax_highlight_filter.rb
 delete mode 100644 lib/redcarpet/render/gitlab_html.rb

diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb
index 114730eb94..b7fec9fc1d 100644
--- a/app/helpers/gitlab_markdown_helper.rb
+++ b/app/helpers/gitlab_markdown_helper.rb
@@ -1,7 +1,6 @@
 require 'nokogiri'
 
 module GitlabMarkdownHelper
-  include Gitlab::Markdown
   include PreferencesHelper
 
   # Use this in places where you would normally use link_to(gfm(...), ...).
@@ -22,7 +21,7 @@ module GitlabMarkdownHelper
                      escape_once(body)
                    end
 
-    gfm_body = gfm(escaped_body, {}, html_options)
+    gfm_body = Gitlab::Markdown.gfm(escaped_body, project: @project, current_user: current_user)
 
     fragment = Nokogiri::XML::DocumentFragment.parse(gfm_body)
     if fragment.children.size == 1 && fragment.children[0].name == 'a'
@@ -42,29 +41,16 @@ module GitlabMarkdownHelper
     fragment.to_html.html_safe
   end
 
-  MARKDOWN_OPTIONS = {
-    no_intra_emphasis:   true,
-    tables:              true,
-    fenced_code_blocks:  true,
-    strikethrough:       true,
-    lax_spacing:         true,
-    space_after_headers: true,
-    superscript:         true,
-    footnotes:           true
-  }.freeze
+  def markdown(text, context = {})
+    context.merge!(
+      current_user:   current_user,
+      project:        @project,
+      project_wiki:   @project_wiki,
+      ref:            @ref,
+      requested_path: @path
+    )
 
-  def markdown(text, options={})
-    unless @markdown && options == @options
-      @options = options
-
-      # see https://github.com/vmg/redcarpet#darling-i-packed-you-a-couple-renderers-for-lunch
-      rend = Redcarpet::Render::GitlabHTML.new(self, options)
-
-      # see https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
-      @markdown = Redcarpet::Markdown.new(rend, MARKDOWN_OPTIONS)
-    end
-
-    @markdown.render(text).html_safe
+    Gitlab::Markdown.render(text, context)
   end
 
   def asciidoc(text)
diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb
index 9f6e19a09f..de1da31a39 100644
--- a/lib/gitlab/markdown.rb
+++ b/lib/gitlab/markdown.rb
@@ -5,6 +5,44 @@ module Gitlab
   #
   # See the files in `lib/gitlab/markdown/` for specific processing information.
   module Markdown
+    # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
+    REDCARPET_OPTIONS = {
+      no_intra_emphasis:   true,
+      tables:              true,
+      fenced_code_blocks:  true,
+      strikethrough:       true,
+      lax_spacing:         true,
+      space_after_headers: true,
+      superscript:         true,
+      footnotes:           true
+    }.freeze
+
+    # Convert a Markdown String into an HTML-safe String of HTML
+    #
+    # markdown - Markdown String
+    # context  - Hash of context options passed to our HTML Pipeline
+    #
+    # Returns an HTML-safe String
+    def self.render(markdown, context = {})
+      html = renderer.render(markdown)
+      html = gfm(html, context)
+
+      html.html_safe
+    end
+
+    # Convert a Markdown String into HTML without going through the HTML
+    # Pipeline.
+    #
+    # Note that because the pipeline is skipped, SanitizationFilter is as well.
+    # Do not output the result of this method to the user.
+    #
+    # markdown - Markdown String
+    #
+    # Returns a String
+    def self.render_without_gfm(markdown)
+      self.renderer.render(markdown)
+    end
+
     # Provide autoload paths for filters to prevent a circular dependency error
     autoload :AutolinkFilter,               'gitlab/markdown/autolink_filter'
     autoload :CommitRangeReferenceFilter,   'gitlab/markdown/commit_range_reference_filter'
@@ -18,6 +56,7 @@ module Gitlab
     autoload :RelativeLinkFilter,           'gitlab/markdown/relative_link_filter'
     autoload :SanitizationFilter,           'gitlab/markdown/sanitization_filter'
     autoload :SnippetReferenceFilter,       'gitlab/markdown/snippet_reference_filter'
+    autoload :SyntaxHighlightFilter,        'gitlab/markdown/syntax_highlight_filter'
     autoload :TableOfContentsFilter,        'gitlab/markdown/table_of_contents_filter'
     autoload :TaskListFilter,               'gitlab/markdown/task_list_filter'
     autoload :UserReferenceFilter,          'gitlab/markdown/user_reference_filter'
@@ -29,7 +68,7 @@ module Gitlab
     #                :xhtml               - output XHTML instead of HTML
     #                :reference_only_path - Use relative path for reference links
     # html_options - extra options for the reference links as given to link_to
-    def gfm(text, options = {}, html_options = {})
+    def self.gfm(text, options = {})
       return text if text.nil?
 
       # Duplicate the string so we don't alter the original, then call to_str
@@ -40,8 +79,8 @@ module Gitlab
       options.reverse_merge!(
         xhtml:                false,
         reference_only_path:  true,
-        project:              @project,
-        current_user:         current_user
+        project:              options[:project],
+        current_user:         options[:current_user]
       )
 
       @pipeline ||= HTML::Pipeline.new(filters)
@@ -61,12 +100,11 @@ module Gitlab
         current_user:    options[:current_user],
         only_path:       options[:reference_only_path],
         project:         options[:project],
-        reference_class: html_options[:class],
 
         # RelativeLinkFilter
-        ref:            @ref,
-        requested_path: @path,
-        project_wiki:   @project_wiki
+        ref:            options[:ref],
+        requested_path: options[:path],
+        project_wiki:   options[:project_wiki]
       }
 
       result = @pipeline.call(text, context)
@@ -83,14 +121,22 @@ module Gitlab
 
     private
 
+    def self.renderer
+      @markdown ||= begin
+        renderer = Redcarpet::Render::HTML.new
+        Redcarpet::Markdown.new(renderer, REDCARPET_OPTIONS)
+      end
+    end
+
     # Filters used in our pipeline
     #
     # SanitizationFilter should come first so that all generated reference HTML
     # goes through untouched.
     #
     # See https://github.com/jch/html-pipeline#filters for more filters.
-    def filters
+    def self.filters
       [
+        Gitlab::Markdown::SyntaxHighlightFilter,
         Gitlab::Markdown::SanitizationFilter,
 
         Gitlab::Markdown::RelativeLinkFilter,
diff --git a/lib/gitlab/markdown/syntax_highlight_filter.rb b/lib/gitlab/markdown/syntax_highlight_filter.rb
new file mode 100644
index 0000000000..9f468f98ae
--- /dev/null
+++ b/lib/gitlab/markdown/syntax_highlight_filter.rb
@@ -0,0 +1,38 @@
+require 'html/pipeline/filter'
+require 'rouge/plugins/redcarpet'
+
+module Gitlab
+  module Markdown
+    # HTML Filter to highlight fenced code blocks
+    #
+    class SyntaxHighlightFilter < HTML::Pipeline::Filter
+      include Rouge::Plugins::Redcarpet
+
+      def call
+        doc.search('pre > code').each do |node|
+          highlight_node(node)
+        end
+
+        doc
+      end
+
+      def highlight_node(node)
+        language = node.attr('class')
+        code     = node.text
+
+        highlighted = block_code(code, language)
+
+        # Replace the parent `pre` element with the entire highlighted block
+        node.parent.replace(highlighted)
+      end
+
+      private
+
+      # Override Rouge::Plugins::Redcarpet#rouge_formatter
+      def rouge_formatter(lexer)
+        Rouge::Formatters::HTMLGitlab.new(
+          cssclass: "code highlight js-syntax-highlight #{lexer.tag}")
+      end
+    end
+  end
+end
diff --git a/lib/gitlab/reference_extractor.rb b/lib/gitlab/reference_extractor.rb
index e836b05ff2..20f4098057 100644
--- a/lib/gitlab/reference_extractor.rb
+++ b/lib/gitlab/reference_extractor.rb
@@ -10,7 +10,7 @@ module Gitlab
 
     def analyze(text)
       references.clear
-      @text = markdown.render(text.dup)
+      @text = Gitlab::Markdown.render_without_gfm(text)
     end
 
     %i(user label issue merge_request snippet commit commit_range).each do |type|
@@ -21,10 +21,6 @@ module Gitlab
 
     private
 
-    def markdown
-      @markdown ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, GitlabMarkdownHelper::MARKDOWN_OPTIONS)
-    end
-
     def references
       @references ||= Hash.new do |references, type|
         type = type.to_sym
@@ -42,7 +38,7 @@ module Gitlab
     # Returns the results Array for the requested filter type
     def pipeline_result(filter_type)
       klass  = filter_type.to_s.camelize + 'ReferenceFilter'
-      filter = "Gitlab::Markdown::#{klass}".constantize
+      filter = Gitlab::Markdown.const_get(klass)
 
       context = {
         project: project,
diff --git a/lib/redcarpet/render/gitlab_html.rb b/lib/redcarpet/render/gitlab_html.rb
deleted file mode 100644
index 9cb8e91d6e..0000000000
--- a/lib/redcarpet/render/gitlab_html.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-require 'active_support/core_ext/string/output_safety'
-
-class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
-  attr_reader :template
-  alias_method :h, :template
-
-  def initialize(template, options = {})
-    @template = template
-    @options = options.dup
-
-    @options.reverse_merge!(
-      # Handled further down the line by Gitlab::Markdown::SanitizationFilter
-      escape_html: false,
-      project: @template.instance_variable_get("@project")
-    )
-
-    super(options)
-  end
-
-  def normal_text(text)
-    ERB::Util.html_escape_once(text)
-  end
-
-  # Stolen from Rouge::Plugins::Redcarpet as this module is not required
-  # from Rouge's gem root.
-  def block_code(code, language)
-    lexer = Rouge::Lexer.find_fancy(language, code) || Rouge::Lexers::PlainText
-
-    # XXX HACK: Redcarpet strips hard tabs out of code blocks,
-    # so we assume you're not using leading spaces that aren't tabs,
-    # and just replace them here.
-    if lexer.tag == 'make'
-      code.gsub!(/^    /, "\t")
-    end
-
-    formatter = Rouge::Formatters::HTMLGitlab.new(
-      cssclass: "code highlight js-syntax-highlight #{lexer.tag}"
-    )
-    formatter.format(lexer.lex(code))
-  end
-
-  def postprocess(full_document)
-    h.gfm(full_document, @options)
-  end
-end
diff --git a/spec/features/markdown_spec.rb b/spec/features/markdown_spec.rb
index 4fe019f834..c557a1061a 100644
--- a/spec/features/markdown_spec.rb
+++ b/spec/features/markdown_spec.rb
@@ -179,7 +179,7 @@ describe 'GitLab Markdown', feature: true do
     before(:all) do
       @feat = MarkdownFeature.new
 
-      # `gfm` helper depends on a `@project` variable
+      # `markdown` helper expects a `@project` variable
       @project = @feat.project
 
       @html = markdown(@feat.raw_markdown)
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
index a42ccb9b50..d1ca2337a9 100644
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ b/spec/helpers/gitlab_markdown_helper_spec.rb
@@ -19,10 +19,10 @@ describe GitlabMarkdownHelper do
     @project = project
   end
 
-  describe "#gfm" do
+  describe "#markdown" do
     it "should forward HTML options to links" do
-      expect(gfm("Fixed in #{commit.id}", { project: @project }, class: 'foo')).
-        to have_selector('a.gfm.foo')
+      expect(markdown("Fixed in #{commit.id}", project: @project)).
+        to have_selector('a.gfm')
     end
 
     describe "referencing multiple objects" do
@@ -30,17 +30,17 @@ describe GitlabMarkdownHelper do
 
       it "should link to the merge request" do
         expected = namespace_project_merge_request_path(project.namespace, project, merge_request)
-        expect(gfm(actual)).to match(expected)
+        expect(markdown(actual)).to match(expected)
       end
 
       it "should link to the commit" do
         expected = namespace_project_commit_path(project.namespace, project, commit)
-        expect(gfm(actual)).to match(expected)
+        expect(markdown(actual)).to match(expected)
       end
 
       it "should link to the issue" do
         expected = namespace_project_issue_path(project.namespace, project, issue)
-        expect(gfm(actual)).to match(expected)
+        expect(markdown(actual)).to match(expected)
       end
     end
   end
@@ -79,16 +79,6 @@ describe GitlabMarkdownHelper do
       expect(doc.css('a')[4].text).to eq ' for real'
     end
 
-    it 'should forward HTML options' do
-      actual = link_to_gfm("Fixed in #{commit.id}", commit_path, class: 'foo')
-      doc = Nokogiri::HTML.parse(actual)
-
-      expect(doc.css('a')).to satisfy do |v|
-        # 'foo' gets added to all links
-        v.all? { |a| a.attr('class').match(/foo$/) }
-      end
-    end
-
     it "escapes HTML passed in as the body" do
       actual = "This is a 

test

- see #{issues[0].to_reference}" expect(link_to_gfm(actual, commit_path)). From a4e4fde3e68a5c27e0424bdbe0dbd87d33a9e020 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 27 Aug 2015 14:28:45 -0700 Subject: [PATCH 062/153] Restore the forwarded HTML options in link_to_gfm --- app/helpers/gitlab_markdown_helper.rb | 5 +++++ spec/helpers/gitlab_markdown_helper_spec.rb | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index b7fec9fc1d..924e6cb197 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -38,6 +38,11 @@ module GitlabMarkdownHelper end end + # Add any custom CSS classes to the GFM-generated reference links + if html_options[:class] + fragment.css('a.gfm').add_class(html_options[:class]) + end + fragment.to_html.html_safe end diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb index d1ca2337a9..0f9c587432 100644 --- a/spec/helpers/gitlab_markdown_helper_spec.rb +++ b/spec/helpers/gitlab_markdown_helper_spec.rb @@ -79,6 +79,16 @@ describe GitlabMarkdownHelper do expect(doc.css('a')[4].text).to eq ' for real' end + it 'should forward HTML options' do + actual = link_to_gfm("Fixed in #{commit.id}", commit_path, class: 'foo') + doc = Nokogiri::HTML.parse(actual) + + expect(doc.css('a')).to satisfy do |v| + # 'foo' gets added to all links + v.all? { |a| a.attr('class').match(/foo$/) } + end + end + it "escapes HTML passed in as the body" do actual = "This is a

test

- see #{issues[0].to_reference}" expect(link_to_gfm(actual, commit_path)). From 8e7111f79de43ea5c8471f3e0bf6ac0c76dd3117 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 27 Aug 2015 15:36:26 -0700 Subject: [PATCH 063/153] Reference filters no longer take a custom class context option --- lib/gitlab/markdown.rb | 1 - lib/gitlab/markdown/reference_filter.rb | 3 +-- .../gitlab/markdown/commit_range_reference_filter_spec.rb | 5 ----- spec/lib/gitlab/markdown/commit_reference_filter_spec.rb | 5 ----- .../gitlab/markdown/external_issue_reference_filter_spec.rb | 5 ----- spec/lib/gitlab/markdown/issue_reference_filter_spec.rb | 5 ----- spec/lib/gitlab/markdown/label_reference_filter_spec.rb | 5 ----- .../gitlab/markdown/merge_request_reference_filter_spec.rb | 5 ----- spec/lib/gitlab/markdown/snippet_reference_filter_spec.rb | 5 ----- spec/lib/gitlab/markdown/user_reference_filter_spec.rb | 5 ----- 10 files changed, 1 insertion(+), 43 deletions(-) diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index de1da31a39..7efcbaf325 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -67,7 +67,6 @@ module Gitlab # options - A Hash of options used to customize output (default: {}): # :xhtml - output XHTML instead of HTML # :reference_only_path - Use relative path for reference links - # html_options - extra options for the reference links as given to link_to def self.gfm(text, options = {}) return text if text.nil? diff --git a/lib/gitlab/markdown/reference_filter.rb b/lib/gitlab/markdown/reference_filter.rb index 47ee1d99da..3b1dbb3004 100644 --- a/lib/gitlab/markdown/reference_filter.rb +++ b/lib/gitlab/markdown/reference_filter.rb @@ -9,7 +9,6 @@ module Gitlab # # Context options: # :project (required) - Current project, ignored if reference is cross-project. - # :reference_class - Custom CSS class added to reference links. # :only_path - Generate path-only links. # # Results: @@ -70,7 +69,7 @@ module Gitlab end def reference_class(type) - "gfm gfm-#{type} #{context[:reference_class]}".strip + "gfm gfm-#{type}".strip end # Iterate through the document's text nodes, yielding the current node's diff --git a/spec/lib/gitlab/markdown/commit_range_reference_filter_spec.rb b/spec/lib/gitlab/markdown/commit_range_reference_filter_spec.rb index 5815528448..3c6c84a041 100644 --- a/spec/lib/gitlab/markdown/commit_range_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/commit_range_reference_filter_spec.rb @@ -75,11 +75,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-commit_range' end - it 'includes an optional custom class' do - doc = filter("See #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'includes a data-project-id attribute' do doc = filter("See #{reference}") link = doc.css('a').first diff --git a/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb b/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb index 05a02de466..9ed438252b 100644 --- a/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/commit_reference_filter_spec.rb @@ -71,11 +71,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-commit' end - it 'includes an optional custom class' do - doc = filter("See #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'includes a data-project-id attribute' do doc = filter("See #{reference}") link = doc.css('a').first diff --git a/spec/lib/gitlab/markdown/external_issue_reference_filter_spec.rb b/spec/lib/gitlab/markdown/external_issue_reference_filter_spec.rb index f16095bc2b..d8c2970b6b 100644 --- a/spec/lib/gitlab/markdown/external_issue_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/external_issue_reference_filter_spec.rb @@ -68,11 +68,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-issue' end - it 'includes an optional custom class' do - doc = filter("Issue #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'supports an :only_path context' do doc = filter("Issue #{reference}", only_path: true) link = doc.css('a').first.attr('href') diff --git a/spec/lib/gitlab/markdown/issue_reference_filter_spec.rb b/spec/lib/gitlab/markdown/issue_reference_filter_spec.rb index 35b1ba5f13..1dd54f5858 100644 --- a/spec/lib/gitlab/markdown/issue_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/issue_reference_filter_spec.rb @@ -68,11 +68,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-issue' end - it 'includes an optional custom class' do - doc = filter("Issue #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'includes a data-project-id attribute' do doc = filter("Issue #{reference}") link = doc.css('a').first diff --git a/spec/lib/gitlab/markdown/label_reference_filter_spec.rb b/spec/lib/gitlab/markdown/label_reference_filter_spec.rb index fabe0411e4..e32089de37 100644 --- a/spec/lib/gitlab/markdown/label_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/label_reference_filter_spec.rb @@ -25,11 +25,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-label' end - it 'includes an optional custom class' do - doc = filter("Label #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'includes a data-project-id attribute' do doc = filter("Label #{reference}") link = doc.css('a').first diff --git a/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb b/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb index 5cef52b191..66616b9336 100644 --- a/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/merge_request_reference_filter_spec.rb @@ -56,11 +56,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-merge_request' end - it 'includes an optional custom class' do - doc = filter("Merge #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'includes a data-project-id attribute' do doc = filter("Merge #{reference}") link = doc.css('a').first diff --git a/spec/lib/gitlab/markdown/snippet_reference_filter_spec.rb b/spec/lib/gitlab/markdown/snippet_reference_filter_spec.rb index 678b171e99..fd3f0d20fa 100644 --- a/spec/lib/gitlab/markdown/snippet_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/snippet_reference_filter_spec.rb @@ -55,11 +55,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-snippet' end - it 'includes an optional custom class' do - doc = filter("Snippet #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'includes a data-project-id attribute' do doc = filter("Snippet #{reference}") link = doc.css('a').first diff --git a/spec/lib/gitlab/markdown/user_reference_filter_spec.rb b/spec/lib/gitlab/markdown/user_reference_filter_spec.rb index 02d923b036..b2155fab59 100644 --- a/spec/lib/gitlab/markdown/user_reference_filter_spec.rb +++ b/spec/lib/gitlab/markdown/user_reference_filter_spec.rb @@ -130,11 +130,6 @@ module Gitlab::Markdown expect(doc.css('a').first.attr('class')).to eq 'gfm gfm-project_member' end - it 'includes an optional custom class' do - doc = filter("Hey #{reference}", reference_class: 'custom') - expect(doc.css('a').first.attr('class')).to include 'custom' - end - it 'supports an :only_path context' do doc = filter("Hey #{reference}", only_path: true) link = doc.css('a').first.attr('href') From 62117becb9212e3df296be2babc77cd5ac6194d2 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 27 Aug 2015 15:36:56 -0700 Subject: [PATCH 064/153] Add a temporary `gfm` helper that just delegates to `markdown` Some views are still calling `gfm` directly. We'll need to update them to instead call `markdown` with a `pipeline: ...` argument. --- app/helpers/gitlab_markdown_helper.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 924e6cb197..d7843a70c7 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -58,6 +58,12 @@ module GitlabMarkdownHelper Gitlab::Markdown.render(text, context) end + # TODO (rspeicher): Remove all usages of this helper and just call `markdown` + # with a custom pipeline depending on the content being rendered + def gfm(text, options = {}) + markdown(text, options) + end + def asciidoc(text) Gitlab::Asciidoc.render(text, { commit: @commit, From 9bb06ae9effab7bc2ae813539f1253038cb6c221 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 27 Aug 2015 16:02:49 -0700 Subject: [PATCH 065/153] Make sure the main Gitlab::Markdown module gets loaded before filters --- lib/gitlab/markdown/autolink_filter.rb | 1 + lib/gitlab/markdown/commit_range_reference_filter.rb | 2 ++ lib/gitlab/markdown/commit_reference_filter.rb | 2 ++ lib/gitlab/markdown/cross_project_reference.rb | 2 ++ lib/gitlab/markdown/emoji_filter.rb | 3 ++- lib/gitlab/markdown/external_issue_reference_filter.rb | 2 ++ lib/gitlab/markdown/external_link_filter.rb | 1 + lib/gitlab/markdown/issue_reference_filter.rb | 2 ++ lib/gitlab/markdown/label_reference_filter.rb | 2 ++ lib/gitlab/markdown/merge_request_reference_filter.rb | 2 ++ lib/gitlab/markdown/reference_filter.rb | 1 + lib/gitlab/markdown/relative_link_filter.rb | 1 + lib/gitlab/markdown/sanitization_filter.rb | 1 + lib/gitlab/markdown/snippet_reference_filter.rb | 2 ++ lib/gitlab/markdown/syntax_highlight_filter.rb | 1 + lib/gitlab/markdown/table_of_contents_filter.rb | 1 + lib/gitlab/markdown/task_list_filter.rb | 1 + lib/gitlab/markdown/user_reference_filter.rb | 2 ++ 18 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/gitlab/markdown/autolink_filter.rb b/lib/gitlab/markdown/autolink_filter.rb index 541f1d88ff..c37c3bc55b 100644 --- a/lib/gitlab/markdown/autolink_filter.rb +++ b/lib/gitlab/markdown/autolink_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'html/pipeline/filter' require 'uri' diff --git a/lib/gitlab/markdown/commit_range_reference_filter.rb b/lib/gitlab/markdown/commit_range_reference_filter.rb index a9f1ee9c16..8613150894 100644 --- a/lib/gitlab/markdown/commit_range_reference_filter.rb +++ b/lib/gitlab/markdown/commit_range_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces commit range references with links. diff --git a/lib/gitlab/markdown/commit_reference_filter.rb b/lib/gitlab/markdown/commit_reference_filter.rb index eacdf8a6d3..5696b4fa58 100644 --- a/lib/gitlab/markdown/commit_reference_filter.rb +++ b/lib/gitlab/markdown/commit_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces commit references with links. diff --git a/lib/gitlab/markdown/cross_project_reference.rb b/lib/gitlab/markdown/cross_project_reference.rb index 66c256c510..855748fdcc 100644 --- a/lib/gitlab/markdown/cross_project_reference.rb +++ b/lib/gitlab/markdown/cross_project_reference.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # Common methods for ReferenceFilters that support an optional cross-project diff --git a/lib/gitlab/markdown/emoji_filter.rb b/lib/gitlab/markdown/emoji_filter.rb index 6794ab9c89..da10e4d376 100644 --- a/lib/gitlab/markdown/emoji_filter.rb +++ b/lib/gitlab/markdown/emoji_filter.rb @@ -1,6 +1,7 @@ +require 'action_controller' +require 'gitlab/markdown' require 'gitlab_emoji' require 'html/pipeline/filter' -require 'action_controller' module Gitlab module Markdown diff --git a/lib/gitlab/markdown/external_issue_reference_filter.rb b/lib/gitlab/markdown/external_issue_reference_filter.rb index afd28dd8cf..f7c43e1ca8 100644 --- a/lib/gitlab/markdown/external_issue_reference_filter.rb +++ b/lib/gitlab/markdown/external_issue_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces external issue tracker references with links. diff --git a/lib/gitlab/markdown/external_link_filter.rb b/lib/gitlab/markdown/external_link_filter.rb index c539e0fb82..29e51b6ade 100644 --- a/lib/gitlab/markdown/external_link_filter.rb +++ b/lib/gitlab/markdown/external_link_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'html/pipeline/filter' module Gitlab diff --git a/lib/gitlab/markdown/issue_reference_filter.rb b/lib/gitlab/markdown/issue_reference_filter.rb index ab6f6bc1cf..01320f8079 100644 --- a/lib/gitlab/markdown/issue_reference_filter.rb +++ b/lib/gitlab/markdown/issue_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces issue references with links. References to diff --git a/lib/gitlab/markdown/label_reference_filter.rb b/lib/gitlab/markdown/label_reference_filter.rb index 2186f36f85..3d7445a27f 100644 --- a/lib/gitlab/markdown/label_reference_filter.rb +++ b/lib/gitlab/markdown/label_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces label references with links. diff --git a/lib/gitlab/markdown/merge_request_reference_filter.rb b/lib/gitlab/markdown/merge_request_reference_filter.rb index 884f60f9d5..48248f5219 100644 --- a/lib/gitlab/markdown/merge_request_reference_filter.rb +++ b/lib/gitlab/markdown/merge_request_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces merge request references with links. References diff --git a/lib/gitlab/markdown/reference_filter.rb b/lib/gitlab/markdown/reference_filter.rb index 3b1dbb3004..4e936d7cd5 100644 --- a/lib/gitlab/markdown/reference_filter.rb +++ b/lib/gitlab/markdown/reference_filter.rb @@ -1,4 +1,5 @@ require 'active_support/core_ext/string/output_safety' +require 'gitlab/markdown' require 'html/pipeline/filter' module Gitlab diff --git a/lib/gitlab/markdown/relative_link_filter.rb b/lib/gitlab/markdown/relative_link_filter.rb index 30f50b8299..8c5cf51bfe 100644 --- a/lib/gitlab/markdown/relative_link_filter.rb +++ b/lib/gitlab/markdown/relative_link_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'html/pipeline/filter' require 'uri' diff --git a/lib/gitlab/markdown/sanitization_filter.rb b/lib/gitlab/markdown/sanitization_filter.rb index 74b3a8d274..68ed57f625 100644 --- a/lib/gitlab/markdown/sanitization_filter.rb +++ b/lib/gitlab/markdown/sanitization_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'html/pipeline/filter' require 'html/pipeline/sanitization_filter' diff --git a/lib/gitlab/markdown/snippet_reference_filter.rb b/lib/gitlab/markdown/snippet_reference_filter.rb index 92979a356d..9e1aab936c 100644 --- a/lib/gitlab/markdown/snippet_reference_filter.rb +++ b/lib/gitlab/markdown/snippet_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces snippet references with links. References to diff --git a/lib/gitlab/markdown/syntax_highlight_filter.rb b/lib/gitlab/markdown/syntax_highlight_filter.rb index 9f468f98ae..86f4385753 100644 --- a/lib/gitlab/markdown/syntax_highlight_filter.rb +++ b/lib/gitlab/markdown/syntax_highlight_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'html/pipeline/filter' require 'rouge/plugins/redcarpet' diff --git a/lib/gitlab/markdown/table_of_contents_filter.rb b/lib/gitlab/markdown/table_of_contents_filter.rb index 38887c9778..bbb3bf7fc8 100644 --- a/lib/gitlab/markdown/table_of_contents_filter.rb +++ b/lib/gitlab/markdown/table_of_contents_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'html/pipeline/filter' module Gitlab diff --git a/lib/gitlab/markdown/task_list_filter.rb b/lib/gitlab/markdown/task_list_filter.rb index c6eb2e2bf6..2f133ae850 100644 --- a/lib/gitlab/markdown/task_list_filter.rb +++ b/lib/gitlab/markdown/task_list_filter.rb @@ -1,3 +1,4 @@ +require 'gitlab/markdown' require 'task_list/filter' module Gitlab diff --git a/lib/gitlab/markdown/user_reference_filter.rb b/lib/gitlab/markdown/user_reference_filter.rb index a4aec7a05d..1871e52df0 100644 --- a/lib/gitlab/markdown/user_reference_filter.rb +++ b/lib/gitlab/markdown/user_reference_filter.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab module Markdown # HTML filter that replaces user or group references with links. From 23aee0ca8ad3de5697f770696f3e55fbfdba2be8 Mon Sep 17 00:00:00 2001 From: Eric Maziade Date: Wed, 26 Aug 2015 22:28:24 -0400 Subject: [PATCH 066/153] fixed connection detection so settings can be read from the database --- lib/gitlab/current_settings.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index 1a2a50a14d..7ad3ed8728 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -4,7 +4,7 @@ module Gitlab key = :current_application_settings RequestStore.store[key] ||= begin - if ActiveRecord::Base.connected? && ActiveRecord::Base.connection.table_exists?('application_settings') + if ActiveRecord::Base.connection.active? && ActiveRecord::Base.connection.table_exists?('application_settings') ApplicationSetting.current || ApplicationSetting.create_from_defaults else fake_application_settings From 39ee52f1b168f3c6d2c9f27a3311aa7c785a0b20 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 28 Aug 2015 10:23:56 +0200 Subject: [PATCH 067/153] Expire cache when merge request source branch was removed Signed-off-by: Dmitriy Zaporozhets --- app/workers/merge_worker.rb | 4 ++++ spec/workers/merge_worker_spec.rb | 28 ++++++++++++++++++++++++++++ spec/workers/post_receive_spec.rb | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 spec/workers/merge_worker_spec.rb diff --git a/app/workers/merge_worker.rb b/app/workers/merge_worker.rb index 6a8665c179..5d1a8555b7 100644 --- a/app/workers/merge_worker.rb +++ b/app/workers/merge_worker.rb @@ -14,6 +14,10 @@ class MergeWorker if result[:status] == :success && params[:should_remove_source_branch].present? DeleteBranchService.new(merge_request.source_project, current_user). execute(merge_request.source_branch) + + merge_request.source_project.repository.expire_branch_names end + + result end end diff --git a/spec/workers/merge_worker_spec.rb b/spec/workers/merge_worker_spec.rb new file mode 100644 index 0000000000..b11c5de94e --- /dev/null +++ b/spec/workers/merge_worker_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +describe MergeWorker do + describe "remove source branch" do + let!(:merge_request) { create(:merge_request, source_branch: "markdown") } + let!(:source_project) { merge_request.source_project } + let!(:project) { merge_request.project } + let!(:author) { merge_request.author } + + before do + source_project.team << [author, :master] + source_project.repository.expire_branch_names + end + + it 'clears cache of source repo after removing source branch' do + expect(source_project.repository.branch_names).to include('markdown') + + MergeWorker.new.perform( + merge_request.id, merge_request.author_id, + commit_message: 'wow such merge', + should_remove_source_branch: true) + + merge_request.reload + expect(merge_request).to be_merged + expect(source_project.repository.branch_names).not_to include('markdown') + end + end +end diff --git a/spec/workers/post_receive_spec.rb b/spec/workers/post_receive_spec.rb index 46eae9ab08..e4151b9bb6 100644 --- a/spec/workers/post_receive_spec.rb +++ b/spec/workers/post_receive_spec.rb @@ -4,7 +4,7 @@ describe PostReceive do let(:changes) { "123456 789012 refs/heads/tést\n654321 210987 refs/tags/tag" } let(:wrongly_encoded_changes) { changes.encode("ISO-8859-1").force_encoding("UTF-8") } let(:base64_changes) { Base64.encode64(wrongly_encoded_changes) } - + context "as a resque worker" do it "reponds to #perform" do expect(PostReceive.new).to respond_to(:perform) From 1fdf56c95d82292a3050578fed3bb258abbc6e9c Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sat, 29 Aug 2015 01:59:04 -0700 Subject: [PATCH 068/153] Prevent anchors from being hidden by header upon a new page load. Browsers change the scroll position after the page is loaded, and the current 1 ms delay wasn't long enough for the browser to jump to the anchor. Even then, it appears another 100ms delay is necessary to adjust the scroll properly: http://stackoverflow.com/questions/19057731/scrolltop-on-page-reload-doesnt-work-possible-script-conflict Add a little more of an offset to see a few lines before the anchor. Closes #1614 Closes #1024 --- CHANGELOG | 1 + app/assets/javascripts/application.js.coffee | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b827b7c69e..2cda1a4626 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Prevent anchors from being hidden by header (Stan Hu) - Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu) - Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu) - Improve dropdown positioning on the project home page (Hannes Rosenögger) diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index c263912b7e..8e987ac4e8 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -94,16 +94,18 @@ window.unbindEvents = -> $(document).off('scroll') window.shiftWindow = -> - scrollBy 0, -50 + scrollBy 0, -100 document.addEventListener("page:fetch", unbindEvents) -# Scroll the window to avoid the topnav bar -# https://github.com/twitter/bootstrap/issues/1768 -if location.hash - setTimeout shiftWindow, 1 window.addEventListener "hashchange", shiftWindow +window.onload = -> + # Scroll the window to avoid the topnav bar + # https://github.com/twitter/bootstrap/issues/1768 + if location.hash + setTimeout shiftWindow, 100 + $ -> $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") From d92f428024b2878682bb23b6b03bc671636b5afe Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 7 Aug 2015 16:09:48 +0200 Subject: [PATCH 069/153] Minor refactor --- lib/gitlab/ldap/user.rb | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/gitlab/ldap/user.rb b/lib/gitlab/ldap/user.rb index 2ffb124196..04a2223747 100644 --- a/lib/gitlab/ldap/user.rb +++ b/lib/gitlab/ldap/user.rb @@ -44,13 +44,14 @@ module Gitlab gl_user.skip_reconfirmation! gl_user.email = auth_hash.email - # If we don't have an identity for this provider yet, create one - if gl_user.identities.find_by(provider: auth_hash.provider).nil? - gl_user.identities.new(extern_uid: auth_hash.uid, provider: auth_hash.provider) - else # Update the UID attribute for this provider in case it has changed - identity = gl_user.identities.select { |identity| identity.provider == auth_hash.provider } - identity.first.extern_uid = auth_hash.uid - end + # find_or_initialize_by doesn't update `gl_user.identities`, and isn't autosaved. + identity = gl_user.identities.find { |identity| identity.provider == auth_hash.provider } + identity ||= gl_user.identities.build(provider: auth_hash.provider) + + # For a new user set extern_uid to the LDAP DN + # For an existing user with matching email but changed DN, update the DN. + # For an existing user with no change in DN, this line changes nothing. + identity.extern_uid = auth_hash.uid gl_user end From 12d8b01eb2df532815306db602d116e3177d750e Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Sat, 29 Aug 2015 11:49:59 -0700 Subject: [PATCH 070/153] Move changelog item --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 4946c68390..bbf44ca14c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -24,6 +24,7 @@ v 8.0.0 (unreleased) - Improve search page usability - Bring more UI consistency in way how projects, snippets and groups lists are rendered - Make all profiles public + - Fixed login failure when extern_uid changes (Joel Koglin) v 7.14.1 - Improve abuse reports management from admin area @@ -98,7 +99,6 @@ v 7.14.0 - Update Flowdock integration to support new Flowdock API (Boyan Tabakov) - Remove author from files view (Sven Strickroth) - Fix infinite loop when SAML was incorrectly configured. - - Fixed login failure when extern_uid changes (Joel Koglin) v 7.13.5 - Satellites reverted From e334ec0683b77f46f19e1474289a9edfd2fb8c13 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Mon, 31 Aug 2015 08:24:50 +0300 Subject: [PATCH 071/153] Ordering of GitHub issues import is now fixed See https://gitlab.com/gitlab-org/gitlab-ce/commit/4a203aab57c69ea402939cf8fc423a0e5aaa1cab --- doc/workflow/importing/import_projects_from_github.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/workflow/importing/import_projects_from_github.md b/doc/workflow/importing/import_projects_from_github.md index 3efa92cb86..2d77c6d117 100644 --- a/doc/workflow/importing/import_projects_from_github.md +++ b/doc/workflow/importing/import_projects_from_github.md @@ -17,4 +17,4 @@ If you want to import from a GitHub Enterprise instance, you need to use GitLab * To import a project, you can simple click "Add". The importer will import your repository and issues. Once the importer is done, a new GitLab project will be created with your imported data. ### Note -When you import your projects from GitHub, it is not possible to keep your labels and milestones and issue numbers won't match. We are working on improving this in the near future. +When you import your projects from GitHub, it is not possible to keep your labels and milestones. We are working on improving this in the near future. From 6f785d584b2607ccd6997933364434e7d9a27504 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 27 Aug 2015 17:01:11 +0300 Subject: [PATCH 072/153] retrieving oauth token with LDAP credentials --- CHANGELOG | 1 + config/initializers/doorkeeper.rb | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 386ce7ca6d..4b3cc639a1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -22,6 +22,7 @@ v 8.0.0 (unreleased) - Fix 500 error when submit project snippet without body - Improve search page usability - Bring more UI consistency in way how projects, snippets and groups lists are rendered + - Retrieving oauth token with LDAP credentials v 7.14.1 - Improve abuse reports management from admin area diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 6139ddbe6c..66ac88e9f4 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -12,8 +12,7 @@ Doorkeeper.configure do end resource_owner_from_credentials do |routes| - u = User.find_by(email: params[:username]) || User.find_by(username: params[:username]) - u if u && u.valid_password?(params[:password]) + Gitlab::Auth.new.find(params[:username], params[:password]) end # If you want to restrict access to the web interface for adding oauth authorized applications, you need to declare the block below. From 4027a26e7b5a1a2a54dd57e480507095c91af26b Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Mon, 31 Aug 2015 15:30:15 +0200 Subject: [PATCH 073/153] Replace grack with gitlab-git-http-server --- Gemfile | 5 - Gemfile.lock | 6 - config/routes.rb | 7 +- doc/install/installation.md | 29 +++- doc/update/7.14-to-8.0.md | 159 ++++++++++++++++++++++ lib/gitlab/backend/grack_auth.rb | 16 +-- lib/support/init.d/gitlab | 74 +++++++--- lib/support/init.d/gitlab.default.example | 10 ++ lib/support/nginx/gitlab | 38 +++--- lib/support/nginx/gitlab-ssl | 40 +++--- 10 files changed, 294 insertions(+), 90 deletions(-) create mode 100644 doc/update/7.14-to-8.0.md diff --git a/Gemfile b/Gemfile index 4696a961e8..1e0f387d03 100644 --- a/Gemfile +++ b/Gemfile @@ -40,11 +40,6 @@ gem "browser", '~> 1.0.0' # Provide access to Gitlab::Git library gem "gitlab_git", '~> 7.2.14' -# Ruby/Rack Git Smart-HTTP Server Handler -# GitLab fork with a lot of changes (improved thread-safety, better memory usage etc) -# For full list of changes see https://github.com/SaitoWu/grack/compare/master...gitlabhq:master -gem 'gitlab-grack', '~> 2.0.2', require: 'grack' - # LDAP Auth # GitLab fork with several improvements to original library. For full list of changes # see https://github.com/intridea/omniauth-ldap/compare/master...gitlabhq:master diff --git a/Gemfile.lock b/Gemfile.lock index 814249c7ff..bedcf9c85b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -263,8 +263,6 @@ GEM flowdock (~> 0.7) gitlab-grit (>= 2.4.1) multi_json - gitlab-grack (2.0.2) - rack (~> 1.5.1) gitlab-grit (2.7.2) charlock_holmes (~> 0.6) diff-lcs (~> 1.1) @@ -787,7 +785,6 @@ DEPENDENCIES gemnasium-gitlab-service (~> 0.2) github-markup gitlab-flowdock-git-hook (~> 1.0.1) - gitlab-grack (~> 2.0.2) gitlab-linguist (~> 3.0.1) gitlab_emoji (~> 0.1) gitlab_git (~> 7.2.14) @@ -881,6 +878,3 @@ DEPENDENCIES virtus webmock (~> 1.21.0) wikicloth (= 0.8.1) - -BUNDLED WITH - 1.10.6 diff --git a/config/routes.rb b/config/routes.rb index 8ba439f08b..920ece518e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,12 +30,7 @@ Gitlab::Application.routes.draw do end # Enable Grack support - mount Grack::Bundle.new({ - git_path: Gitlab.config.git.bin_path, - project_root: Gitlab.config.gitlab_shell.repos_path, - upload_pack: Gitlab.config.gitlab_shell.upload_pack, - receive_pack: Gitlab.config.gitlab_shell.receive_pack - }), at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] + mount Grack::Auth.new({}), at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] # Help get 'help' => 'help#index' diff --git a/doc/install/installation.md b/doc/install/installation.md index 73e36fa7e5..52031e9b9a 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -125,13 +125,25 @@ Install the Bundler Gem: sudo gem install bundler --no-ri --no-rdoc -## 3. System Users +## 3. Go + +Since GitLab 8.0, Git HTTP requests are handled by gitlab-git-http-server. +This is a small daemon written in Go. +To install gitlab-git-http-server we need a Go compiler. + + curl -O --progress https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz + echo '5817fa4b2252afdb02e11e8b9dc1d9173ef3bd5a go1.5.linux-amd64.tar.gz' | shasum -c - && \ + sudo tar -C /usr/local -xzf go1.5.linux-amd64.tar.gz + sudo ln -sf /usr/local/go/bin/{go,godoc,gofmt} /usr/local/bin/ + rm go1.5.linux-amd64.tar.gz + +## 4. System Users Create a `git` user for GitLab: sudo adduser --disabled-login --gecos 'GitLab' git -## 4. Database +## 5. Database We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](database_mysql.md). *Note*: because we need to make use of extensions you need at least pgsql 9.1. @@ -157,7 +169,7 @@ We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](da # Quit the database session gitlabhq_production> \q -## 5. Redis +## 6. Redis sudo apt-get install redis-server @@ -187,7 +199,7 @@ We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](da # Add git to the redis group sudo usermod -aG redis git -## 6. GitLab +## 7. GitLab # We'll install GitLab into home directory of the user "git" cd /home/git @@ -297,6 +309,13 @@ GitLab Shell is an SSH access and repository management software developed speci **Note:** Make sure your hostname can be resolved on the machine itself by either a proper DNS record or an additional line in /etc/hosts ("127.0.0.1 hostname"). This might be necessary for example if you set up gitlab behind a reverse proxy. If the hostname cannot be resolved, the final installation check will fail with "Check GitLab API access: FAILED. code: 401" and pushing commits will be rejected with "[remote rejected] master -> master (hook declined)". +### Install gitlab-git-http-server + + cd /home/git + sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-git-http-server.git + cd gitlab-git-http-server + sudo -u git -H make + ### Initialize Database and Activate Advanced Features sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production @@ -345,7 +364,7 @@ Check if GitLab and its environment are configured correctly: # or sudo /etc/init.d/gitlab restart -## 7. Nginx +## 8. Nginx **Note:** Nginx is the officially supported web server for GitLab. If you cannot or do not want to use Nginx as your web server, have a look at the [GitLab recipes](https://gitlab.com/gitlab-org/gitlab-recipes/). diff --git a/doc/update/7.14-to-8.0.md b/doc/update/7.14-to-8.0.md new file mode 100644 index 0000000000..29a38d07b3 --- /dev/null +++ b/doc/update/7.14-to-8.0.md @@ -0,0 +1,159 @@ +# From 7.14 to 8.0 + +### 0. Double-check your Git version + +**This notice applies only to /usr/local/bin/git** + +If you compiled Git from source on your GitLab server then please double-check +that you are using a version that protects against CVE-2014-9390. For six +months after this vulnerability became known the GitLab installation guide +still contained instructions that would install the outdated, 'vulnerable' Git +version 2.1.2. + +Run the following command to get your current Git version. + +``` +/usr/local/bin/git --version +``` + +If you see 'No such file or directory' then you did not install Git according +to the outdated instructions from the GitLab installation guide and you can go +to the next step 'Stop server' below. + +If you see a version string then it should be v1.8.5.6, v1.9.5, v2.0.5, v2.1.4, +v2.2.1 or newer. You can use the [instructions in the GitLab source +installation +guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#1-packages-dependencies) +to install a newer version of Git. + +### 1. Stop server + + sudo service gitlab stop + +### 2. Backup + +```bash +cd /home/git/gitlab +sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production +``` + +### 3. Get latest code + +```bash +sudo -u git -H git fetch --all +sudo -u git -H git checkout -- db/schema.rb # local changes will be restored automatically +``` + +For GitLab Community Edition: + +```bash +sudo -u git -H git checkout 8-0-stable +``` + +OR + +For GitLab Enterprise Edition: + +```bash +sudo -u git -H git checkout 8-0-stable-ee +``` + +### 4. Update gitlab-shell + +```bash +cd /home/git/gitlab-shell +sudo -u git -H git fetch +sudo -u git -H git checkout v2.6.4 +``` + +### 5. Install gitlab-git-http-server + +First we download Go 1.5 and install it into /usr/local/go. + + curl -O --progress https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz + echo '5817fa4b2252afdb02e11e8b9dc1d9173ef3bd5a go1.5.linux-amd64.tar.gz' | shasum -c - && \ + sudo tar -C /usr/local -xzf go1.5.linux-amd64.tar.gz + sudo ln -sf /usr/local/go/bin/{go,godoc,gofmt} /usr/local/bin/ + rm go1.5.linux-amd64.tar.gz + +Now we download gitlab-git-http-server and install it in /home/git/gitlab-git-http-server. + + cd /home/git + sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-git-http-server.git + cd gitlab-git-http-server + sudo -u git -H make + +If you put your Git repositories in a directory different from /home/git/repositories, you need to tell gitlab-git-http-server about it via /etc/gitlab/default. +See lib/support/init.d/gitlab.default.example for the options. + +### 6. Install libs, migrations, etc. + +```bash +cd /home/git/gitlab + +# MySQL installations (note: the line below states '--without ... postgres') +sudo -u git -H bundle install --without development test postgres --deployment + +# PostgreSQL installations (note: the line below states '--without ... mysql') +sudo -u git -H bundle install --without development test mysql --deployment + +# Run database migrations +sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production + +# Clean up assets and cache +sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production + +# Update init.d script +sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab +``` + +### 7. Update config files + +#### New configuration options for `gitlab.yml` + +There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. + +``` +git diff origin/7-14-stable:config/gitlab.yml.example origin/8-0-stable:config/gitlab.yml.example +`````` + +#### New NGINX configuration + +Because of the new gitlab-git-http-server you need to update your NGINX configuration. +If you skip this step 'git clone' and 'git push' over HTTP(S) will stop working. + +``` +# Remove '-ssl' twice in the diff command below if you use HTTP instead of HTTPS +git diff origin/7-14-stable:lib/support/nginx/gitlab-ssl origin/8-0-stable:lib/support/nginx/gitlab-ssl +``` + +### 8. Start application + + sudo service gitlab start + sudo service nginx restart + +### 9. Check application status + +Check if GitLab and its environment are configured correctly: + + sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production + +To make sure you didn't miss anything run a more thorough check with: + + sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production + +If all items are green, then congratulations, the upgrade is complete! + +## Things went south? Revert to previous version (7.14) + +### 1. Revert the code to the previous version +Follow the [upgrade guide from 7.13 to 7.14](7.13-to-7.14.md), except for the database migration +(The backup is already migrated to the previous version) + +### 2. Restore from the backup: + +```bash +cd /home/git/gitlab +sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production +``` +If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb index 12292f614e..dc87aa52a3 100644 --- a/lib/gitlab/backend/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -26,12 +26,8 @@ module Grack auth! if project && authorized_request? - if ENV['GITLAB_GRACK_AUTH_ONLY'] == '1' - # Tell gitlab-git-http-server the request is OK, and what the GL_ID is - render_grack_auth_ok - else - @app.call(env) - end + # Tell gitlab-git-http-server the request is OK, and what the GL_ID is + render_grack_auth_ok elsif @user.nil? && !@gitlab_ci unauthorized else @@ -132,7 +128,9 @@ module Grack case git_cmd when *Gitlab::GitAccess::DOWNLOAD_COMMANDS - if user + if !Gitlab.config.gitlab_shell.upload_pack + false + elsif user Gitlab::GitAccess.new(user, project).download_access_check.allowed? elsif project.public? # Allow clone/fetch for public projects @@ -141,7 +139,9 @@ module Grack false end when *Gitlab::GitAccess::PUSH_COMMANDS - if user + if !Gitlab.config.gitlab_shell.receive_pack + false + elsif user # Skip user authorization on upload request. # It will be done by the pre-receive hook in the repository. true diff --git a/lib/support/init.d/gitlab b/lib/support/init.d/gitlab index 457bd31e23..f2923314d4 100755 --- a/lib/support/init.d/gitlab +++ b/lib/support/init.d/gitlab @@ -37,6 +37,10 @@ web_server_pid_path="$pid_path/unicorn.pid" sidekiq_pid_path="$pid_path/sidekiq.pid" mail_room_enabled=false mail_room_pid_path="$pid_path/mail_room.pid" +gitlab_git_http_server_pid_path="$pid_path/gitlab-git-http-server.pid" +gitlab_git_http_server_options="-listenUmask 0 -listenNetwork unix -listenAddr $socket_path/gitlab-git-http-server.socket -authBackend http://127.0.0.1:8080" +gitlab_git_http_server_repo_root='/home/git/repositories' +gitlab_git_http_server_log="$app_root/log/gitlab-git-http-server.log" shell_path="/bin/bash" # Read configuration variable file if it is present @@ -72,6 +76,11 @@ check_pids(){ else spid=0 fi + if [ -f "$gitlab_git_http_server_pid_path" ]; then + hpid=$(cat "$gitlab_git_http_server_pid_path") + else + hpid=0 + fi if [ "$mail_room_enabled" = true ]; then if [ -f "$mail_room_pid_path" ]; then mpid=$(cat "$mail_room_pid_path") @@ -85,7 +94,7 @@ check_pids(){ wait_for_pids(){ # We are sleeping a bit here mostly because sidekiq is slow at writing it's pid i=0; - while [ ! -f $web_server_pid_path ] || [ ! -f $sidekiq_pid_path ] || { [ "$mail_room_enabled" = true ] && [ ! -f $mail_room_pid_path ]; }; do + while [ ! -f $web_server_pid_path ] || [ ! -f $sidekiq_pid_path ] || [ ! -f $gitlab_git_http_server_pid_path ] || { [ "$mail_room_enabled" = true ] && [ ! -f $mail_room_pid_path ]; }; do sleep 0.1; i=$((i+1)) if [ $((i%10)) = 0 ]; then @@ -120,6 +129,12 @@ check_status(){ else sidekiq_status="-1" fi + if [ $hpid -ne 0 ]; then + kill -0 "$hpid" 2>/dev/null + gitlab_git_http_server_status="$?" + else + gitlab_git_http_server_status="-1" + fi if [ "$mail_room_enabled" = true ]; then if [ $mpid -ne 0 ]; then kill -0 "$mpid" 2>/dev/null @@ -128,7 +143,7 @@ check_status(){ mail_room_status="-1" fi fi - if [ $web_status = 0 ] && [ $sidekiq_status = 0 ] && { [ "$mail_room_enabled" != true ] || [ $mail_room_status = 0 ]; }; then + if [ $web_status = 0 ] && [ $sidekiq_status = 0 ] && [ $gitlab_git_http_server_status = 0 ] && { [ "$mail_room_enabled" != true ] || [ $mail_room_status = 0 ]; }; then gitlab_status=0 else # http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html @@ -156,6 +171,13 @@ check_stale_pids(){ exit 1 fi fi + if [ "$hpid" != "0" ] && [ "$gitlab_git_http_server_status" != "0" ]; then + echo "Removing stale gitlab-git-http-server pid. This is most likely caused by gitlab-git-http-server crashing the last time it ran." + if ! rm "$gitlab_git_http_server_pid_path"; then + echo "Unable to remove stale pid, exiting" + exit 1 + fi + fi if [ "$mail_room_enabled" = true ] && [ "$mpid" != "0" ] && [ "$mail_room_status" != "0" ]; then echo "Removing stale MailRoom job dispatcher pid. This is most likely caused by MailRoom crashing the last time it ran." if ! rm "$mail_room_pid_path"; then @@ -168,7 +190,7 @@ check_stale_pids(){ ## If no parts of the service is running, bail out. exit_if_not_running(){ check_stale_pids - if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ] && { [ "$mail_room_enabled" != true ] || [ "$mail_room_status" != "0" ]; }; then + if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ] && [ "$gitlab_git_http_server_status" != "0" ] && { [ "$mail_room_enabled" != true ] || [ "$mail_room_status" != "0" ]; }; then echo "GitLab is not running." exit fi @@ -184,6 +206,9 @@ start_gitlab() { if [ "$sidekiq_status" != "0" ]; then echo "Starting GitLab Sidekiq" fi + if [ "$gitlab_git_http_server_status" != "0" ]; then + echo "Starting gitlab-git-http-server" + fi if [ "$mail_room_enabled" = true ] && [ "$mail_room_status" != "0" ]; then echo "Starting GitLab MailRoom" fi @@ -205,6 +230,17 @@ start_gitlab() { RAILS_ENV=$RAILS_ENV bin/background_jobs start & fi + if [ "$gitlab_git_http_server_status" = "0" ]; then + echo "The gitlab-git-http-server is already running with pid $spid, not restarting" + else + # No need to remove a socket, gitlab-git-http-server does this itself + $app_root/bin/daemon_with_pidfile $gitlab_git_http_server_pid_path \ + $app_root/../gitlab-git-http-server/gitlab-git-http-server \ + $gitlab_git_http_server_options \ + $gitlab_git_http_server_repo_root \ + >> $gitlab_git_http_server_log 2>&1 & + fi + if [ "$mail_room_enabled" = true ]; then # If MailRoom is already running, don't start it again. if [ "$mail_room_status" = "0" ]; then @@ -226,33 +262,27 @@ stop_gitlab() { if [ "$web_status" = "0" ]; then echo "Shutting down GitLab Unicorn" + RAILS_ENV=$RAILS_ENV bin/web stop fi if [ "$sidekiq_status" = "0" ]; then echo "Shutting down GitLab Sidekiq" + RAILS_ENV=$RAILS_ENV bin/background_jobs stop + fi + if [ "$gitlab_git_http_server_status" = "0" ]; then + echo "Shutting down gitlab-git-http-server" + kill $(cat $gitlab_git_http_server_pid_path) fi if [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; then echo "Shutting down GitLab MailRoom" - fi - - # If the Unicorn web server is running, tell it to stop; - if [ "$web_status" = "0" ]; then - RAILS_ENV=$RAILS_ENV bin/web stop - fi - # And do the same thing for the Sidekiq. - if [ "$sidekiq_status" = "0" ]; then - RAILS_ENV=$RAILS_ENV bin/background_jobs stop - fi - # And do the same thing for the MailRoom. - if [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; then RAILS_ENV=$RAILS_ENV bin/mail_room stop fi # If something needs to be stopped, lets wait for it to stop. Never use SIGKILL in a script. - while [ "$web_status" = "0" ] || [ "$sidekiq_status" = "0" ] || { [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; }; do + while [ "$web_status" = "0" ] || [ "$sidekiq_status" = "0" ] || [ "$gitlab_git_http_server_status" = "0" ] || { [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; }; do sleep 1 check_status printf "." - if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ] && { [ "$mail_room_enabled" != true ] || [ "$mail_room_status" != "0" ]; }; then + if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ] && [ "$gitlab_git_http_server_status" != "0" ] && { [ "$mail_room_enabled" != true ] || [ "$mail_room_status" != "0" ]; }; then printf "\n" break fi @@ -262,6 +292,7 @@ stop_gitlab() { # Cleaning up unused pids rm "$web_server_pid_path" 2>/dev/null # rm "$sidekiq_pid_path" 2>/dev/null # Sidekiq seems to be cleaning up it's own pid. + rm -f "$gitlab_git_http_server_pid_path" if [ "$mail_room_enabled" = true ]; then rm "$mail_room_pid_path" 2>/dev/null fi @@ -272,7 +303,7 @@ stop_gitlab() { ## Prints the status of GitLab and it's components. print_status() { check_status - if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ] && { [ "$mail_room_enabled" != true ] || [ "$mail_room_status" != "0" ]; }; then + if [ "$web_status" != "0" ] && [ "$sidekiq_status" != "0" ] && [ "$gitlab_git_http_server_status" != "0" ] && { [ "$mail_room_enabled" != true ] || [ "$mail_room_status" != "0" ]; }; then echo "GitLab is not running." return fi @@ -286,6 +317,11 @@ print_status() { else printf "The GitLab Sidekiq job dispatcher is \033[31mnot running\033[0m.\n" fi + if [ "$gitlab_git_http_server_status" = "0" ]; then + echo "The gitlab-git-http-server with pid $hpid is running." + else + printf "The gitlab-git-http-server is \033[31mnot running\033[0m.\n" + fi if [ "$mail_room_enabled" = true ]; then if [ "$mail_room_status" = "0" ]; then echo "The GitLab MailRoom email processor with pid $mpid is running." @@ -324,7 +360,7 @@ reload_gitlab(){ ## Restarts Sidekiq and Unicorn. restart_gitlab(){ check_status - if [ "$web_status" = "0" ] || [ "$sidekiq_status" = "0" ] || { [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; }; then + if [ "$web_status" = "0" ] || [ "$sidekiq_status" = "0" ] || [ "$gitlab_git_http_server" = "0" ] || { [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; }; then stop_gitlab fi start_gitlab diff --git a/lib/support/init.d/gitlab.default.example b/lib/support/init.d/gitlab.default.example index fd70cb7cc7..aab5acaa72 100755 --- a/lib/support/init.d/gitlab.default.example +++ b/lib/support/init.d/gitlab.default.example @@ -30,6 +30,16 @@ web_server_pid_path="$pid_path/unicorn.pid" # The default is "$pid_path/sidekiq.pid" sidekiq_pid_path="$pid_path/sidekiq.pid" +gitlab_git_http_server_pid_path="$pid_path/gitlab-git-http-server.pid" +# The -listenXxx settings determine where gitlab-git-http-server +# listens for connections from NGINX. To listen on localhost:8181, write +# '-listenNetwork tcp -listenAddr localhost:8181'. +# The -authBackend setting tells gitlab-git-http-server where it can reach +# Unicorn. +gitlab_git_http_server_options="-listenUmask 0 -listenNetwork unix -listenAddr $socket_path/gitlab-git-http-server.socket -authBackend http://127.0.0.1:8080" +gitlab_git_http_server_repo_root="/home/git/repositories" +gitlab_git_http_server_log="$app_root/log/gitlab-git-http-server.log" + # mail_room_enabled specifies whether mail_room, which is used to process incoming email, is enabled. # This is required for the Reply by email feature. # The default is "false" diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab index efa0898900..17f89c8beb 100644 --- a/lib/support/nginx/gitlab +++ b/lib/support/nginx/gitlab @@ -38,10 +38,9 @@ upstream gitlab { server unix:/home/git/gitlab/tmp/sockets/gitlab.socket fail_timeout=0; } -## Experimental: gitlab-git-http-server -# upstream gitlab-git-http-server { -# server localhost:8181; -# } +upstream gitlab-git-http-server { + server unix:/home/git/gitlab/tmp/sockets/gitlab-git-http-server.socket fail_timeout=0; +} ## Normal HTTP host server { @@ -114,25 +113,24 @@ server { proxy_pass http://gitlab; } - ## Experimental: send Git HTTP traffic to gitlab-git-http-server instead of Unicorn - # location ~ [-\/\w\.]+\.git\/ { - # ## If you use HTTPS make sure you disable gzip compression - # ## to be safe against BREACH attack. - # # gzip off; + location ~ [-\/\w\.]+\.git\/ { + ## If you use HTTPS make sure you disable gzip compression + ## to be safe against BREACH attack. + # gzip off; - # ## https://github.com/gitlabhq/gitlabhq/issues/694 - # ## Some requests take more than 30 seconds. - # proxy_read_timeout 300; - # proxy_connect_timeout 300; - # proxy_redirect off; + ## https://github.com/gitlabhq/gitlabhq/issues/694 + ## Some requests take more than 30 seconds. + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_redirect off; - # proxy_set_header Host $http_host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; - # proxy_pass http://gitlab-git-http-server; - # } + proxy_pass http://gitlab-git-http-server; + } ## Enable gzip compression as per rails guide: ## http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression diff --git a/lib/support/nginx/gitlab-ssl b/lib/support/nginx/gitlab-ssl index 314525518f..5ba39fc41a 100644 --- a/lib/support/nginx/gitlab-ssl +++ b/lib/support/nginx/gitlab-ssl @@ -42,10 +42,9 @@ upstream gitlab { server unix:/home/git/gitlab/tmp/sockets/gitlab.socket fail_timeout=0; } -## Experimental: gitlab-git-http-server -# upstream gitlab-git-http-server { -# server localhost:8181; -# } +upstream gitlab-git-http-server { + server unix:/home/git/gitlab/tmp/sockets/gitlab-git-http-server.socket fail_timeout=0; +} ## Redirects all HTTP traffic to the HTTPS host server { @@ -161,25 +160,24 @@ server { proxy_pass http://gitlab; } - ## Experimental: send Git HTTP traffic to gitlab-git-http-server instead of Unicorn - # location ~ [-\/\w\.]+\.git\/ { - # ## If you use HTTPS make sure you disable gzip compression - # ## to be safe against BREACH attack. - # gzip off; + location ~ [-\/\w\.]+\.git\/ { + ## If you use HTTPS make sure you disable gzip compression + ## to be safe against BREACH attack. + gzip off; - # ## https://github.com/gitlabhq/gitlabhq/issues/694 - # ## Some requests take more than 30 seconds. - # proxy_read_timeout 300; - # proxy_connect_timeout 300; - # proxy_redirect off; + ## https://github.com/gitlabhq/gitlabhq/issues/694 + ## Some requests take more than 30 seconds. + proxy_read_timeout 300; + proxy_connect_timeout 300; + proxy_redirect off; - # proxy_set_header Host $http_host; - # proxy_set_header X-Real-IP $remote_addr; - # proxy_set_header X-Forwarded-Ssl on; - # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - # proxy_set_header X-Forwarded-Proto $scheme; - # proxy_pass http://gitlab-git-http-server; - # } + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-Ssl on; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://gitlab-git-http-server; + } ## Enable gzip compression as per rails guide: ## http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression From 780bac1026f96d68d8c658ead605c61a5b018f62 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Mon, 31 Aug 2015 16:15:41 +0200 Subject: [PATCH 074/153] Be more defensive when running 'kill' --- lib/support/init.d/gitlab | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/support/init.d/gitlab b/lib/support/init.d/gitlab index f2923314d4..a80e7e7743 100755 --- a/lib/support/init.d/gitlab +++ b/lib/support/init.d/gitlab @@ -270,7 +270,7 @@ stop_gitlab() { fi if [ "$gitlab_git_http_server_status" = "0" ]; then echo "Shutting down gitlab-git-http-server" - kill $(cat $gitlab_git_http_server_pid_path) + kill -- $(cat $gitlab_git_http_server_pid_path) fi if [ "$mail_room_enabled" = true ] && [ "$mail_room_status" = "0" ]; then echo "Shutting down GitLab MailRoom" From 7816b223603ee52cc7b0c40f1f1f36a4b752c477 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 31 Aug 2015 16:16:03 -0400 Subject: [PATCH 075/153] Fix context options in `markdown` helper We need to send `path`, not `requested_path`. --- app/helpers/gitlab_markdown_helper.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index d7843a70c7..4ccdeff353 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -48,11 +48,11 @@ module GitlabMarkdownHelper def markdown(text, context = {}) context.merge!( - current_user: current_user, - project: @project, - project_wiki: @project_wiki, - ref: @ref, - requested_path: @path + current_user: current_user, + path: @path, + project: @project, + project_wiki: @project_wiki, + ref: @ref, ) Gitlab::Markdown.render(text, context) From 90ab92621f81cfe5347a979c73aef692a23c43cc Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 31 Aug 2015 16:16:26 -0400 Subject: [PATCH 076/153] Make `gfm` delegate to `Gitlab::Markdown.gfm` instead of `markdown` Some usages of the `gfm` helper depend on the text not being rendered as standard Markdown. Ugh. --- app/helpers/gitlab_markdown_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 4ccdeff353..225caca1f4 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -61,7 +61,7 @@ module GitlabMarkdownHelper # TODO (rspeicher): Remove all usages of this helper and just call `markdown` # with a custom pipeline depending on the content being rendered def gfm(text, options = {}) - markdown(text, options) + Gitlab::Markdown.gfm(text, options) end def asciidoc(text) From 805693bfea900ed656524abeeb7dd2fb06520123 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 31 Aug 2015 16:22:14 -0400 Subject: [PATCH 077/153] Remove invalid spec for GitlabMarkdownHelper --- spec/helpers/gitlab_markdown_helper_spec.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb index 0f9c587432..5639b3db91 100644 --- a/spec/helpers/gitlab_markdown_helper_spec.rb +++ b/spec/helpers/gitlab_markdown_helper_spec.rb @@ -20,11 +20,6 @@ describe GitlabMarkdownHelper do end describe "#markdown" do - it "should forward HTML options to links" do - expect(markdown("Fixed in #{commit.id}", project: @project)). - to have_selector('a.gfm') - end - describe "referencing multiple objects" do let(:actual) { "#{merge_request.to_reference} -> #{commit.to_reference} -> #{issue.to_reference}" } From 08ca9411865a9dff5354f0e7ec214fba6af4e9d9 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 31 Aug 2015 16:22:34 -0400 Subject: [PATCH 078/153] Move REDCARPET_OPTIONS to a private method There wasn't really a reason to have them as a constant, and we were getting "already defined" warnings which are always annoying. --- lib/gitlab/markdown.rb | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index 7efcbaf325..097caf67a6 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -5,18 +5,6 @@ module Gitlab # # See the files in `lib/gitlab/markdown/` for specific processing information. module Markdown - # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use - REDCARPET_OPTIONS = { - no_intra_emphasis: true, - tables: true, - fenced_code_blocks: true, - strikethrough: true, - lax_spacing: true, - space_after_headers: true, - superscript: true, - footnotes: true - }.freeze - # Convert a Markdown String into an HTML-safe String of HTML # # markdown - Markdown String @@ -40,7 +28,7 @@ module Gitlab # # Returns a String def self.render_without_gfm(markdown) - self.renderer.render(markdown) + renderer.render(markdown) end # Provide autoload paths for filters to prevent a circular dependency error @@ -123,10 +111,24 @@ module Gitlab def self.renderer @markdown ||= begin renderer = Redcarpet::Render::HTML.new - Redcarpet::Markdown.new(renderer, REDCARPET_OPTIONS) + Redcarpet::Markdown.new(renderer, redcarpet_options) end end + def self.redcarpet_options + # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use + @redcarpet_options ||= { + fenced_code_blocks: true, + footnotes: true, + lax_spacing: true, + no_intra_emphasis: true, + space_after_headers: true, + strikethrough: true, + superscript: true, + tables: true + }.freeze + end + # Filters used in our pipeline # # SanitizationFilter should come first so that all generated reference HTML From c104f4d590b16d4784d029c953be90fda130e8b4 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 31 Aug 2015 16:23:46 -0400 Subject: [PATCH 079/153] Remove unnecessary `strip` from `reference_class` method --- lib/gitlab/markdown/reference_filter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/markdown/reference_filter.rb b/lib/gitlab/markdown/reference_filter.rb index 4e936d7cd5..9b293c957d 100644 --- a/lib/gitlab/markdown/reference_filter.rb +++ b/lib/gitlab/markdown/reference_filter.rb @@ -70,7 +70,7 @@ module Gitlab end def reference_class(type) - "gfm gfm-#{type}".strip + "gfm gfm-#{type}" end # Iterate through the document's text nodes, yielding the current node's From 2930041886fb616bd98ba31627d0ce53e0f7603a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 31 Aug 2015 18:09:18 -0400 Subject: [PATCH 080/153] Make sure the `gfm` helper passes the required options This adds some duplication, but this helper is temporary. --- app/helpers/gitlab_markdown_helper.rb | 10 +++++++++- spec/features/gitlab_flavored_markdown_spec.rb | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index 225caca1f4..b742419fbf 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -52,7 +52,7 @@ module GitlabMarkdownHelper path: @path, project: @project, project_wiki: @project_wiki, - ref: @ref, + ref: @ref ) Gitlab::Markdown.render(text, context) @@ -61,6 +61,14 @@ module GitlabMarkdownHelper # TODO (rspeicher): Remove all usages of this helper and just call `markdown` # with a custom pipeline depending on the content being rendered def gfm(text, options = {}) + options.merge!( + current_user: current_user, + path: @path, + project: @project, + project_wiki: @project_wiki, + ref: @ref + ) + Gitlab::Markdown.gfm(text, options) end diff --git a/spec/features/gitlab_flavored_markdown_spec.rb b/spec/features/gitlab_flavored_markdown_spec.rb index 0c1bc53cdb..7852c39fee 100644 --- a/spec/features/gitlab_flavored_markdown_spec.rb +++ b/spec/features/gitlab_flavored_markdown_spec.rb @@ -77,7 +77,7 @@ describe "GitLab Flavored Markdown", feature: true do it "should render details in issues#show" do visit namespace_project_issue_path(project.namespace, project, @issue) - expect(page).to have_link("@#{fred.username}") + expect(page).to have_link(fred.to_reference) end end From c924a3a8d79272355442e9ee595f09c79b0819d4 Mon Sep 17 00:00:00 2001 From: karen Carias Date: Mon, 31 Aug 2015 22:50:32 -0700 Subject: [PATCH 081/153] deleted additional info --- doc/gitlab-basics/command-line-commands.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/doc/gitlab-basics/command-line-commands.md b/doc/gitlab-basics/command-line-commands.md index 5d22e29a86..addd3b6b6e 100644 --- a/doc/gitlab-basics/command-line-commands.md +++ b/doc/gitlab-basics/command-line-commands.md @@ -77,6 +77,3 @@ sudo ``` pwd ``` - -### Open new command line window -Press `command + t` on your keyboard. From f07273f6f69feaaceebcb545eec5eb49147751c1 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 1 Sep 2015 10:36:38 +0200 Subject: [PATCH 082/153] Rename profile settings navigation to "Profile Settings" Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/nav/_dashboard.html.haml | 2 +- app/views/layouts/profile.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index d620c02227..0cf1c3d5d2 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -42,7 +42,7 @@ = link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('user fw') %span - Profile + Profile Settings = nav_link(controller: :help) do = link_to help_path, title: 'Help', data: {placement: 'right'} do = icon('question-circle fw') diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 3193206fe1..77d2ccbf76 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,5 +1,5 @@ -- page_title "Settings" -- header_title "Settings", profile_path +- page_title "Profile Settings" +- header_title "Profile Settings", profile_path - sidebar "profile" = render template: "layouts/application" From f0aa6986fa0e26d75f145fc7cebf9d1a36ff3d01 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 1 Sep 2015 14:01:56 +0200 Subject: [PATCH 083/153] Update db schema Signed-off-by: Dmitriy Zaporozhets --- db/schema.rb | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 7ee1c6e214..36568dd4ed 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -487,12 +487,12 @@ ActiveRecord::Schema.define(version: 20150824002011) do add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree create_table "users", force: true do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_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 "last_sign_in_at" t.string "current_sign_in_ip" @@ -500,22 +500,22 @@ ActiveRecord::Schema.define(version: 20150824002011) do t.datetime "created_at" t.datetime "updated_at" t.string "name" - t.boolean "admin", default: false, null: false - t.integer "projects_limit", default: 10 - t.string "skype", default: "", null: false - t.string "linkedin", default: "", null: false - t.string "twitter", default: "", null: false + t.boolean "admin", default: false, null: false + t.integer "projects_limit", default: 10 + t.string "skype", default: "", null: false + t.string "linkedin", default: "", null: false + t.string "twitter", default: "", null: false t.string "authentication_token" - t.integer "theme_id", default: 1, null: false + t.integer "theme_id", default: 1, null: false t.string "bio" - t.integer "failed_attempts", default: 0 + t.integer "failed_attempts", default: 0 t.datetime "locked_at" t.string "username" - t.boolean "can_create_group", default: true, null: false - t.boolean "can_create_team", default: true, null: false + t.boolean "can_create_group", default: true, null: false + t.boolean "can_create_team", default: true, null: false t.string "state" - t.integer "color_scheme_id", default: 1, null: false - t.integer "notification_level", default: 1, null: false + t.integer "color_scheme_id", default: 1, null: false + t.integer "notification_level", default: 1, null: false t.datetime "password_expires_at" t.integer "created_by_id" t.datetime "last_credential_check_at" @@ -524,20 +524,20 @@ ActiveRecord::Schema.define(version: 20150824002011) do t.datetime "confirmed_at" t.datetime "confirmation_sent_at" t.string "unconfirmed_email" - t.boolean "hide_no_ssh_key", default: false - t.string "website_url", default: "", null: false + t.boolean "hide_no_ssh_key", default: false + t.string "website_url", default: "", null: false t.string "notification_email" - t.boolean "hide_no_password", default: false - t.boolean "password_automatically_set", default: false + t.boolean "hide_no_password", default: false + t.boolean "password_automatically_set", default: false t.string "location" t.string "encrypted_otp_secret" t.string "encrypted_otp_secret_iv" t.string "encrypted_otp_secret_salt" - t.boolean "otp_required_for_login", default: false, null: false + t.boolean "otp_required_for_login", default: false, null: false t.text "otp_backup_codes" - t.string "public_email", default: "", null: false - t.integer "dashboard", default: 0 - t.integer "project_view", default: 0 + t.string "public_email", default: "", null: false + t.integer "dashboard", default: 0 + t.integer "project_view", default: 0 end add_index "users", ["admin"], name: "index_users_on_admin", using: :btree From 31e4654b1f77ab48e5705f8feb8d628c66d4f962 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 30 Aug 2015 17:47:11 -0700 Subject: [PATCH 084/153] Sort issues by creation date in Bitbucket importer API reference here: https://bitbucket.org/site/master/issues/3571/api-issues-sorting-bb-3518 Closes https://github.com/gitlabhq/gitlabhq/issues/9519 --- CHANGELOG | 1 + lib/gitlab/bitbucket_import/client.rb | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 69c2c120d9..193e9df595 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) - Prevent anchors from being hidden by header (Stan Hu) + - Sort issues by creation date in Bitbucket importer (Stan Hu) - Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu) - Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu) - Improve dropdown positioning on the project home page (Hannes Rosenögger) diff --git a/lib/gitlab/bitbucket_import/client.rb b/lib/gitlab/bitbucket_import/client.rb index aec44b8c87..bb8bf7e3a9 100644 --- a/lib/gitlab/bitbucket_import/client.rb +++ b/lib/gitlab/bitbucket_import/client.rb @@ -52,7 +52,7 @@ module Gitlab end def issues(project_identifier) - JSON.parse(get("/api/1.0/repositories/#{project_identifier}/issues").body) + JSON.parse(get("/api/1.0/repositories/#{project_identifier}/issues?sort=utc_created_on").body) end def issue_comments(project_identifier, issue_id) From 3a8773fb2f86757ce0a061ef6476b7d91bcb6259 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Tue, 1 Sep 2015 12:45:14 +0200 Subject: [PATCH 085/153] Added USE_DB env var to allow loading fake settings without db running. --- CHANGELOG | 3 ++- lib/gitlab/current_settings.rb | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2ec3bd28b3..789fd58d5c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -28,6 +28,7 @@ v 8.0.0 (unreleased) - Fixed login failure when extern_uid changes (Joel Koglin) - Don't notify users without access to the project when they are (accidentally) mentioned in a note. - Retrieving oauth token with LDAP credentials + - Load Application settings from running database unless env var USE_DB=false v 7.14.1 - Improve abuse reports management from admin area @@ -112,7 +113,7 @@ v 7.13.4 v 7.13.3 - Fix bug causing Bitbucket importer to crash when OAuth application had been removed. - Allow users to send abuse reports - - Remove satellites + - Remove satellites - Link username to profile on Group Members page (Tom Webster) v 7.13.2 diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index 7ad3ed8728..0ea1b6a2f6 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -4,7 +4,7 @@ module Gitlab key = :current_application_settings RequestStore.store[key] ||= begin - if ActiveRecord::Base.connection.active? && ActiveRecord::Base.connection.table_exists?('application_settings') + if connect_to_db? ApplicationSetting.current || ApplicationSetting.create_from_defaults else fake_application_settings @@ -26,5 +26,17 @@ module Gitlab import_sources: Settings.gitlab['import_sources'] ) end + + private + + def connect_to_db? + use_db = if ENV['USE_DB'] == "false" + false + else + true + end + + use_db && ActiveRecord::Base.connection.active? && ActiveRecord::Base.connection.table_exists?('application_settings') + end end end From 2e9c922dd17d13e2cb20b214f00eb875c673dfdf Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Mon, 31 Aug 2015 17:03:09 -0700 Subject: [PATCH 086/153] Fix bug where only the first 15 Bitbucket issues would be imported. Also fix a number of issues where author/reporter names were not available. --- CHANGELOG | 1 + lib/gitlab/bitbucket_import/client.rb | 23 +++++++++++-- lib/gitlab/bitbucket_import/importer.rb | 34 +++++++++++++++---- lib/gitlab/github_import/importer.rb | 3 +- lib/gitlab/gitlab_import/importer.rb | 3 +- lib/gitlab/import_formatter.rb | 4 +-- .../gitlab/bitbucket_import/client_spec.rb | 34 +++++++++++++++++++ 7 files changed, 89 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 193e9df595..eacc92b190 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) - Prevent anchors from being hidden by header (Stan Hu) + - Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu) - Sort issues by creation date in Bitbucket importer (Stan Hu) - Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu) - Prevent too many redirects upon login when home page URL is set to external_url (Stan Hu) diff --git a/lib/gitlab/bitbucket_import/client.rb b/lib/gitlab/bitbucket_import/client.rb index bb8bf7e3a9..d88a6eaac6 100644 --- a/lib/gitlab/bitbucket_import/client.rb +++ b/lib/gitlab/bitbucket_import/client.rb @@ -52,11 +52,26 @@ module Gitlab end def issues(project_identifier) - JSON.parse(get("/api/1.0/repositories/#{project_identifier}/issues?sort=utc_created_on").body) + all_issues = [] + offset = 0 + per_page = 50 # Maximum number allowed by Bitbucket + index = 0 + + begin + issues = JSON.parse(get(issue_api_endpoint(project_identifier, per_page, offset)).body) + # Find out how many total issues are present + total = issues["count"] if index == 0 + all_issues.concat(issues["issues"]) + offset += issues["issues"].count + index += 1 + end while all_issues.count < total + + all_issues end def issue_comments(project_identifier, issue_id) - JSON.parse(get("/api/1.0/repositories/#{project_identifier}/issues/#{issue_id}/comments").body) + comments = JSON.parse(get("/api/1.0/repositories/#{project_identifier}/issues/#{issue_id}/comments").body) + comments.sort_by { |comment| comment["utc_created_on"] } end def project(project_identifier) @@ -100,6 +115,10 @@ module Gitlab response end + def issue_api_endpoint(project_identifier, per_page, offset) + "/api/1.0/repositories/#{project_identifier}/issues?sort=utc_created_on&limit=#{per_page}&start=#{offset}" + end + def config Gitlab.config.omniauth.providers.find { |provider| provider.name == "bitbucket"} end diff --git a/lib/gitlab/bitbucket_import/importer.rb b/lib/gitlab/bitbucket_import/importer.rb index d8a7d29f1b..2355b3c6dd 100644 --- a/lib/gitlab/bitbucket_import/importer.rb +++ b/lib/gitlab/bitbucket_import/importer.rb @@ -20,8 +20,18 @@ module Gitlab #Issues && Comments issues = client.issues(project_identifier) - issues["issues"].each do |issue| - body = @formatter.author_line(issue["reported_by"]["username"], issue["content"]) + issues.each do |issue| + body = '' + reporter = nil + author = 'Anonymous' + + if issue["reported_by"] && issue["reported_by"]["username"] + reporter = issue["reported_by"]["username"] + author = reporter + end + + body = @formatter.author_line(author) + body += issue["content"] comments = client.issue_comments(project_identifier, issue["local_id"]) @@ -30,14 +40,20 @@ module Gitlab end comments.each do |comment| - body += @formatter.comment(comment["author_info"]["username"], comment["utc_created_on"], comment["content"]) + author = 'Anonymous' + + if comment["author_info"] && comment["author_info"]["username"] + author = comment["author_info"]["username"] + end + + body += @formatter.comment(author, comment["utc_created_on"], comment["content"]) end project.issues.create!( description: body, title: issue["title"], state: %w(resolved invalid duplicate wontfix).include?(issue["status"]) ? 'closed' : 'opened', - author_id: gl_user_id(project, issue["reported_by"]["username"]) + author_id: gl_user_id(project, reporter) ) end @@ -47,9 +63,13 @@ module Gitlab private def gl_user_id(project, bitbucket_id) - user = User.joins(:identities).find_by("identities.extern_uid = ? AND identities.provider = 'bitbucket'", bitbucket_id.to_s) - (user && user.id) || project.creator_id - end + if bitbucket_id + user = User.joins(:identities).find_by("identities.extern_uid = ? AND identities.provider = 'bitbucket'", bitbucket_id.to_s) + (user && user.id) || project.creator_id + else + project.creator_id + end + end end end end diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb index 8c106a6173..bd7340a80f 100644 --- a/lib/gitlab/github_import/importer.rb +++ b/lib/gitlab/github_import/importer.rb @@ -18,7 +18,8 @@ module Gitlab direction: :asc).each do |issue| if issue.pull_request.nil? - body = @formatter.author_line(issue.user.login, issue.body) + body = @formatter.author_line(issue.user.login) + body += issue.body if issue.comments > 0 body += @formatter.comments_header diff --git a/lib/gitlab/gitlab_import/importer.rb b/lib/gitlab/gitlab_import/importer.rb index 50594d2b24..e24b94d615 100644 --- a/lib/gitlab/gitlab_import/importer.rb +++ b/lib/gitlab/gitlab_import/importer.rb @@ -18,7 +18,8 @@ module Gitlab issues = client.issues(project_identifier) issues.each do |issue| - body = @formatter.author_line(issue["author"]["name"], issue["description"]) + body = @formatter.author_line(issue["author"]["name"]) + body += issue["description"] comments = client.issue_comments(project_identifier, issue["id"]) diff --git a/lib/gitlab/import_formatter.rb b/lib/gitlab/import_formatter.rb index 72e041a90b..3e54456e93 100644 --- a/lib/gitlab/import_formatter.rb +++ b/lib/gitlab/import_formatter.rb @@ -8,8 +8,8 @@ module Gitlab "\n\n\n**Imported comments:**\n" end - def author_line(author, body) - "*Created by: #{author}*\n\n#{body}" + def author_line(author) + "*Created by: #{author}*\n\n" end end end diff --git a/spec/lib/gitlab/bitbucket_import/client_spec.rb b/spec/lib/gitlab/bitbucket_import/client_spec.rb index dd450e9967..dfe58637ee 100644 --- a/spec/lib/gitlab/bitbucket_import/client_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/client_spec.rb @@ -14,4 +14,38 @@ describe Gitlab::BitbucketImport::Client do expect(key).to be_kind_of(Symbol) end end + + context 'issues' do + let(:per_page) { 50 } + let(:count) { 95 } + let(:sample_issues) do + issues = [] + + count.times do |i| + issues << { local_id: i } + end + + issues + end + let(:first_sample_data) { { count: count, issues: sample_issues[0..per_page - 1] } } + let(:second_sample_data) { { count: count, issues: sample_issues[per_page..count] } } + let(:project_id) { 'namespace/repo' } + + it 'retrieves issues over a number of pages' do + stub_request(:get, + "https://bitbucket.org/api/1.0/repositories/#{project_id}/issues?limit=50&sort=utc_created_on&start=0"). + to_return(status: 200, + body: first_sample_data.to_json, + headers: {}) + + stub_request(:get, + "https://bitbucket.org/api/1.0/repositories/#{project_id}/issues?limit=50&sort=utc_created_on&start=50"). + to_return(status: 200, + body: second_sample_data.to_json, + headers: {}) + + issues = client.issues(project_id) + expect(issues.count).to eq(95) + end + end end From f43e48a1ce0a5568e352049b3a8a844b0ded6332 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 1 Sep 2015 13:28:19 -0400 Subject: [PATCH 087/153] Require gitlab/markdown in ReferenceExtractor --- lib/gitlab/reference_extractor.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/gitlab/reference_extractor.rb b/lib/gitlab/reference_extractor.rb index 20f4098057..0961bd8042 100644 --- a/lib/gitlab/reference_extractor.rb +++ b/lib/gitlab/reference_extractor.rb @@ -1,3 +1,5 @@ +require 'gitlab/markdown' + module Gitlab # Extract possible GFM references from an arbitrary String for further processing. class ReferenceExtractor From 1bcfe4d2ff4d1eaf872c5ce1e3514f8cb539c42b Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 1 Sep 2015 13:37:05 -0400 Subject: [PATCH 088/153] Remove PreferencesHelper include from GitlabMarkdownHelper --- app/helpers/gitlab_markdown_helper.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb index b742419fbf..1ebfd92f11 100644 --- a/app/helpers/gitlab_markdown_helper.rb +++ b/app/helpers/gitlab_markdown_helper.rb @@ -1,8 +1,6 @@ require 'nokogiri' module GitlabMarkdownHelper - include PreferencesHelper - # Use this in places where you would normally use link_to(gfm(...), ...). # # It solves a problem occurring with nested links (i.e. From 263abda3fd7ddfb826cd17ae88fb47d0e1d67fae Mon Sep 17 00:00:00 2001 From: Kirilll Zaitsev Date: Thu, 27 Aug 2015 02:58:49 +0300 Subject: [PATCH 089/153] Drone CI service --- CHANGELOG | 3 + .../projects/services_controller.rb | 2 +- app/models/project.rb | 2 + app/models/project_services/ci_service.rb | 37 +- .../project_services/drone_ci_service.rb | 170 ++++++ app/models/service.rb | 1 + doc/api/services.md | 506 +++++++++++++++++- doc/web_hooks/web_hooks.md | 4 + lib/api/helpers.rb | 26 + lib/api/services.rb | 86 ++- lib/gitlab/backend/grack_auth.rb | 25 +- lib/tasks/services.rake | 89 +++ .../project_services/drone_ci_service_spec.rb | 107 ++++ spec/requests/api/services_spec.rb | 89 ++- spec/support/services_shared_context.rb | 21 + 15 files changed, 1037 insertions(+), 131 deletions(-) create mode 100644 app/models/project_services/drone_ci_service.rb create mode 100644 lib/tasks/services.rake create mode 100644 spec/models/project_services/drone_ci_service_spec.rb create mode 100644 spec/support/services_shared_context.rb diff --git a/CHANGELOG b/CHANGELOG index f2ac3b979a..0c401a99d4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -31,6 +31,9 @@ v 8.0.0 (unreleased) - Don't notify users without access to the project when they are (accidentally) mentioned in a note. - Retrieving oauth token with LDAP credentials - Load Application settings from running database unless env var USE_DB=false + - Added Drone CI integration (Kirill Zaitsev) + - Refactored service API and added automatically service docs generator (Kirill Zaitsev) + - Added web_url key project hook_attrs (Kirill Zaitsev) v 7.14.1 - Improve abuse reports management from admin area diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index b0cf5866d4..3a22ed832a 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -2,7 +2,7 @@ class Projects::ServicesController < Projects::ApplicationController ALLOWED_PARAMS = [:title, :token, :type, :active, :api_key, :api_version, :subdomain, :room, :recipients, :project_url, :webhook, :user_key, :device, :priority, :sound, :bamboo_url, :username, :password, - :build_key, :server, :teamcity_url, :build_type, + :build_key, :server, :teamcity_url, :drone_url, :build_type, :description, :issues_url, :new_issue_url, :restrict_to_branch, :channel, :colorize_messages, :channels, :push_events, :issues_events, :merge_requests_events, :tag_push_events, diff --git a/app/models/project.rb b/app/models/project.rb index 69f9af91c5..8e33a4b2f0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -73,6 +73,7 @@ class Project < ActiveRecord::Base has_many :services has_one :gitlab_ci_service, dependent: :destroy has_one :campfire_service, dependent: :destroy + has_one :drone_ci_service, dependent: :destroy has_one :emails_on_push_service, dependent: :destroy has_one :irker_service, dependent: :destroy has_one :pivotaltracker_service, dependent: :destroy @@ -613,6 +614,7 @@ class Project < ActiveRecord::Base name: name, ssh_url: ssh_url_to_repo, http_url: http_url_to_repo, + web_url: web_url, namespace: namespace.name, visibility_level: visibility_level } diff --git a/app/models/project_services/ci_service.rb b/app/models/project_services/ci_service.rb index 803402c83e..88186113c6 100644 --- a/app/models/project_services/ci_service.rb +++ b/app/models/project_services/ci_service.rb @@ -25,12 +25,24 @@ class CiService < Service def category :ci end - + + def valid_token?(token) + self.respond_to?(:token) && self.token.present? && self.token == token + end + def supported_events %w(push) end - # Return complete url to build page + def merge_request_page(iid, sha, ref) + commit_page(sha, ref) + end + + def commit_page(sha, ref) + build_page(sha, ref) + end + + # Return complete url to merge_request page # # Ex. # http://jenkins.example.com:8888/job/test1/scm/bySHA1/12d65c @@ -45,10 +57,27 @@ class CiService < Service # # # Ex. - # @service.commit_status('13be4ac') + # @service.merge_request_status(9, '13be4ac', 'dev') # # => 'success' # - # @service.commit_status('2abe4ac') + # @service.merge_request_status(10, '2abe4ac', 'dev) + # # => 'running' + # + # + def merge_request_status(iid, sha, ref) + commit_status(sha, ref) + end + + # Return string with build status or :error symbol + # + # Allowed states: 'success', 'failed', 'running', 'pending', 'skipped' + # + # + # Ex. + # @service.commit_status('13be4ac', 'master') + # # => 'success' + # + # @service.commit_status('2abe4ac', 'dev') # # => 'running' # # diff --git a/app/models/project_services/drone_ci_service.rb b/app/models/project_services/drone_ci_service.rb new file mode 100644 index 0000000000..39f732c811 --- /dev/null +++ b/app/models/project_services/drone_ci_service.rb @@ -0,0 +1,170 @@ +class DroneCiService < CiService + + prop_accessor :drone_url, :token, :enable_ssl_verification + validates :drone_url, + presence: true, + format: { with: /\A#{URI.regexp(%w(http https))}\z/, message: "should be a valid url" }, if: :activated? + validates :token, + presence: true, + format: { with: /\A([A-Za-z0-9]+)\z/ }, if: :activated? + + after_save :compose_service_hook, if: :activated? + + def compose_service_hook + hook = service_hook || build_service_hook + hook.url = [drone_url, "/api/hook", "?owner=#{project.namespace.path}", "&name=#{project.path}", "&access_token=#{token}"].join + hook.enable_ssl_verification = enable_ssl_verification + hook.save + end + + def execute(data) + case data[:object_kind] + when 'push' + service_hook.execute(data) if push_valid?(data) + when 'merge_request' + service_hook.execute(data) if merge_request_valid?(data) + when 'tag_push' + service_hook.execute(data) if tag_push_valid?(data) + end + end + + def allow_target_ci? + true + end + + def supported_events + %w(push merge_request tag_push) + end + + def merge_request_status_path(iid, sha = nil, ref = nil) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/pulls/#{iid}", + "?access_token=#{token}"] + + URI.join(*url).to_s + end + + def commit_status_path(sha, ref) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/commits/#{sha}", + "?branch=#{URI::encode(ref.to_s)}&access_token=#{token}"] + + URI.join(*url).to_s + end + + def merge_request_status(iid, sha, ref) + response = HTTParty.get(merge_request_status_path(iid), verify: enable_ssl_verification) + + if response.code == 200 and response['status'] + case response['status'] + when 'killed' + :canceled + when 'failure', 'error' + # Because drone return error if some test env failed + :failed + else + response["status"] + end + else + :error + end + rescue Errno::ECONNREFUSED + :error + end + + def commit_status(sha, ref) + response = HTTParty.get(commit_status_path(sha, ref), verify: enable_ssl_verification) + + if response.code == 200 and response['status'] + case response['status'] + when 'killed' + :canceled + when 'failure', 'error' + # Because drone return error if some test env failed + :failed + else + response["status"] + end + else + :error + end + rescue Errno::ECONNREFUSED + :error + end + + def merge_request_page(iid, sha, ref) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/redirect/pulls/#{iid}"] + + URI.join(*url).to_s + end + + def commit_page(sha, ref) + url = [drone_url, + "gitlab/#{project.namespace.path}/#{project.path}/redirect/commits/#{sha}", + "?branch=#{URI::encode(ref.to_s)}"] + + URI.join(*url).to_s + end + + def commit_coverage(sha, ref) + nil + end + + def build_page(sha, ref) + commit_page(sha, ref) + end + + def builds_path + url = [drone_url, "#{project.namespace.path}/#{project.path}"] + + URI.join(*url).to_s + end + + def status_img_path + url = [drone_url, + "api/badges/#{project.namespace.path}/#{project.path}/status.svg", + "?branch=#{URI::encode(project.default_branch)}"] + + URI.join(*url).to_s + end + + def title + 'Drone CI' + end + + def description + 'Drone is a Continuous Integration platform built on Docker, written in Go' + end + + def to_param + 'drone_ci' + end + + def fields + [ + { type: 'text', name: 'token', placeholder: 'Drone CI project specific token' }, + { type: 'text', name: 'drone_url', placeholder: 'http://drone.example.com' }, + { type: 'checkbox', name: 'enable_ssl_verification', title: "Enable SSL verification" } + ] + end + + private + + def tag_push_valid?(data) + data[:total_commits_count] > 0 && !Gitlab::Git.blank_ref?(data[:after]) + end + + def push_valid?(data) + opened_merge_requests = project.merge_requests.opened.where(source_project_id: project.id, + source_branch: Gitlab::Git.ref_name(data[:ref])) + + opened_merge_requests.empty? && data[:total_commits_count] > 0 && + !Gitlab::Git.blank_ref?(data[:after]) + end + + def merge_request_valid?(data) + ['opened', 'reopened'].include?(data[:object_attributes][:state]) && + data[:object_attributes][:merge_status] == 'unchecked' + end +end diff --git a/app/models/service.rb b/app/models/service.rb index dcef2866c3..60fcc9d285 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -135,6 +135,7 @@ class Service < ActiveRecord::Base buildkite campfire custom_issue_tracker + drone_ci emails_on_push external_wiki flowdock diff --git a/doc/api/services.md b/doc/api/services.md index cbf767d1b2..bc5049dd30 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -1,8 +1,296 @@ # Services +## Asana + +Asana - Teamwork without email + +### Create/Edit Asana service + +Set Asana service for a project. + +> This service adds commit messages as comments to Asana tasks. Once enabled, commit messages are checked for Asana task URLs (for example, `https://app.asana.com/0/123456/987654`) or task IDs starting with # (for example, `#987654`). Every task ID found will get the commit comment added to it. You can also close a task with a message containing: `fix #123456`. You can find your Api Keys here: http://developer.asana.com/documentation/#api_keys + +``` +PUT /projects/:id/services/asana +``` + +Parameters: + +- `api_key` (**required**) - User API token. User must have access to task,all comments will be attributed to this user. +- `restrict_to_branch` (optional) - Comma-separated list of branches which will beautomatically inspected. Leave blank to include all branches. + +### Delete Asana service + +Delete Asana service for a project. + +``` +DELETE /projects/:id/services/asana +``` + +## Assembla + +Project Management Software (Source Commits Endpoint) + +### Create/Edit Assembla service + +Set Assembla service for a project. + +``` +PUT /projects/:id/services/assembla +``` + +Parameters: + +- `token` (**required**) +- `subdomain` (optional) + +### Delete Assembla service + +Delete Assembla service for a project. + +``` +DELETE /projects/:id/services/assembla +``` + +## Atlassian Bamboo CI + +A continuous integration and build server + +### Create/Edit Atlassian Bamboo CI service + +Set Atlassian Bamboo CI service for a project. + +> You must set up automatic revision labeling and a repository trigger in Bamboo. + +``` +PUT /projects/:id/services/bamboo +``` + +Parameters: + +- `bamboo_url` (**required**) - Bamboo root URL like https://bamboo.example.com +- `build_key` (**required**) - Bamboo build plan key like KEY +- `username` (**required**) - A user with API access, if applicable +- `password` (**required**) + +### Delete Atlassian Bamboo CI service + +Delete Atlassian Bamboo CI service for a project. + +``` +DELETE /projects/:id/services/bamboo +``` + +## Buildkite + +Continuous integration and deployments + +### Create/Edit Buildkite service + +Set Buildkite service for a project. + +``` +PUT /projects/:id/services/buildkite +``` + +Parameters: + +- `token` (**required**) - Buildkite project GitLab token +- `project_url` (**required**) - https://buildkite.com/example/project +- `enable_ssl_verification` (optional) - Enable SSL verification + +### Delete Buildkite service + +Delete Buildkite service for a project. + +``` +DELETE /projects/:id/services/buildkite +``` + +## Campfire + +Simple web-based real-time group chat + +### Create/Edit Campfire service + +Set Campfire service for a project. + +``` +PUT /projects/:id/services/campfire +``` + +Parameters: + +- `token` (**required**) +- `subdomain` (optional) +- `room` (optional) + +### Delete Campfire service + +Delete Campfire service for a project. + +``` +DELETE /projects/:id/services/campfire +``` + +## Custom Issue Tracker + +Custom issue tracker + +### Create/Edit Custom Issue Tracker service + +Set Custom Issue Tracker service for a project. + +``` +PUT /projects/:id/services/custom-issue-tracker +``` + +Parameters: + +- `new_issue_url` (**required**) - New Issue url +- `issues_url` (**required**) - Issue url +- `project_url` (**required**) - Project url +- `description` (optional) - Custom issue tracker +- `title` (optional) - Custom Issue Tracker + +### Delete Custom Issue Tracker service + +Delete Custom Issue Tracker service for a project. + +``` +DELETE /projects/:id/services/custom-issue-tracker +``` + +## Drone CI + +Drone is a Continuous Integration platform built on Docker, written in Go + +### Create/Edit Drone CI service + +Set Drone CI service for a project. + +``` +PUT /projects/:id/services/drone-ci +``` + +Parameters: + +- `token` (**required**) - Drone CI project specific token +- `drone_url` (**required**) - http://drone.example.com +- `enable_ssl_verification` (optional) - Enable SSL verification + +### Delete Drone CI service + +Delete Drone CI service for a project. + +``` +DELETE /projects/:id/services/drone-ci +``` + +## Emails on push + +Email the commits and diff of each push to a list of recipients. + +### Create/Edit Emails on push service + +Set Emails on push service for a project. + +``` +PUT /projects/:id/services/emails-on-push +``` + +Parameters: + +- `recipients` (**required**) - Emails separated by whitespace +- `disable_diffs` (optional) - Disable code diffs +- `send_from_committer_email` (optional) - Send from committer + +### Delete Emails on push service + +Delete Emails on push service for a project. + +``` +DELETE /projects/:id/services/emails-on-push +``` + +## External Wiki + +Replaces the link to the internal wiki with a link to an external wiki. + +### Create/Edit External Wiki service + +Set External Wiki service for a project. + +``` +PUT /projects/:id/services/external-wiki +``` + +Parameters: + +- `external_wiki_url` (**required**) - The URL of the external Wiki + +### Delete External Wiki service + +Delete External Wiki service for a project. + +``` +DELETE /projects/:id/services/external-wiki +``` + +## Flowdock + +Flowdock is a collaboration web app for technical teams. + +### Create/Edit Flowdock service + +Set Flowdock service for a project. + +``` +PUT /projects/:id/services/flowdock +``` + +Parameters: + +- `token` (**required**) - Flowdock Git source token + +### Delete Flowdock service + +Delete Flowdock service for a project. + +``` +DELETE /projects/:id/services/flowdock +``` + +## Gemnasium + +Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities. + +### Create/Edit Gemnasium service + +Set Gemnasium service for a project. + +``` +PUT /projects/:id/services/gemnasium +``` + +Parameters: + +- `api_key` (**required**) - Your personal API KEY on gemnasium.com +- `token` (**required**) - The project's slug on gemnasium.com + +### Delete Gemnasium service + +Delete Gemnasium service for a project. + +``` +DELETE /projects/:id/services/gemnasium +``` + ## GitLab CI -### Edit GitLab CI service +Continuous integration server from GitLab + +### Create/Edit GitLab CI service Set GitLab CI service for a project. @@ -12,12 +300,13 @@ PUT /projects/:id/services/gitlab-ci Parameters: -- `token` (required) - CI project token -- `project_url` (required) - CI project URL +- `token` (**required**) - GitLab CI project specific token +- `project_url` (**required**) - http://ci.gitlabhq.com/projects/3 +- `enable_ssl_verification` (optional) - Enable SSL verification ### Delete GitLab CI service -Delete GitLab CI service settings for a project. +Delete GitLab CI service for a project. ``` DELETE /projects/:id/services/gitlab-ci @@ -25,17 +314,24 @@ DELETE /projects/:id/services/gitlab-ci ## HipChat -### Edit HipChat service +Private group chat and IM -Set HipChat service for project. +### Create/Edit HipChat service + +Set HipChat service for a project. ``` PUT /projects/:id/services/hipchat ``` + Parameters: -- `token` (required) - HipChat token -- `room` (required) - HipChat room name +- `token` (**required**) - Room token +- `color` (optional) +- `notify` (optional) +- `room` (optional) - Room name or ID +- `api_version` (optional) - Leave blank for default (v2) +- `server` (optional) - Leave blank for default. https://hipchat.example.com ### Delete HipChat service @@ -44,3 +340,197 @@ Delete HipChat service for a project. ``` DELETE /projects/:id/services/hipchat ``` + +## Irker (IRC gateway) + +Send IRC messages, on update, to a list of recipients through an Irker gateway. + +### Create/Edit Irker (IRC gateway) service + +Set Irker (IRC gateway) service for a project. + +> NOTE: Irker does NOT have built-in authentication, which makes it vulnerable to spamming IRC channels if it is hosted outside of a firewall. Please make sure you run the daemon within a secured network to prevent abuse. For more details, read: http://www.catb.org/~esr/irker/security.html. + +``` +PUT /projects/:id/services/irker +``` + +Parameters: + +- `recipients` (**required**) - Recipients/channels separated by whitespaces +- `default_irc_uri` (optional) - irc://irc.network.net:6697/ +- `server_port` (optional) - 6659 +- `server_host` (optional) - localhost +- `colorize_messages` (optional) + +### Delete Irker (IRC gateway) service + +Delete Irker (IRC gateway) service for a project. + +``` +DELETE /projects/:id/services/irker +``` + +## JIRA + +Jira issue tracker + +### Create/Edit JIRA service + +Set JIRA service for a project. + +> Setting `project_url`, `issues_url` and `new_issue_url` will allow a user to easily navigate to the Jira issue tracker. See the [integration doc](http://doc.gitlab.com/ce/integration/external-issue-tracker.html) for details. Support for referencing commits and automatic closing of Jira issues directly from GitLab is [available in GitLab EE.](http://doc.gitlab.com/ee/integration/jira.html) + +``` +PUT /projects/:id/services/jira +``` + +Parameters: + +- `new_issue_url` (**required**) - New Issue url +- `project_url` (**required**) - Project url +- `issues_url` (**required**) - Issue url +- `description` (optional) - Jira issue tracker + +### Delete JIRA service + +Delete JIRA service for a project. + +``` +DELETE /projects/:id/services/jira +``` + +## PivotalTracker + +Project Management Software (Source Commits Endpoint) + +### Create/Edit PivotalTracker service + +Set PivotalTracker service for a project. + +``` +PUT /projects/:id/services/pivotaltracker +``` + +Parameters: + +- `token` (**required**) + +### Delete PivotalTracker service + +Delete PivotalTracker service for a project. + +``` +DELETE /projects/:id/services/pivotaltracker +``` + +## Pushover + +Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop. + +### Create/Edit Pushover service + +Set Pushover service for a project. + +``` +PUT /projects/:id/services/pushover +``` + +Parameters: + +- `api_key` (**required**) - Your application key +- `user_key` (**required**) - Your user key +- `priority` (**required**) +- `device` (optional) - Leave blank for all active devices +- `sound` (optional) + +### Delete Pushover service + +Delete Pushover service for a project. + +``` +DELETE /projects/:id/services/pushover +``` + +## Redmine + +Redmine issue tracker + +### Create/Edit Redmine service + +Set Redmine service for a project. + +``` +PUT /projects/:id/services/redmine +``` + +Parameters: + +- `new_issue_url` (**required**) - New Issue url +- `project_url` (**required**) - Project url +- `issues_url` (**required**) - Issue url +- `description` (optional) - Redmine issue tracker + +### Delete Redmine service + +Delete Redmine service for a project. + +``` +DELETE /projects/:id/services/redmine +``` + +## Slack + +A team communication tool for the 21st century + +### Create/Edit Slack service + +Set Slack service for a project. + +``` +PUT /projects/:id/services/slack +``` + +Parameters: + +- `webhook` (**required**) - https://hooks.slack.com/services/... +- `username` (optional) - username +- `channel` (optional) - #channel + +### Delete Slack service + +Delete Slack service for a project. + +``` +DELETE /projects/:id/services/slack +``` + +## JetBrains TeamCity CI + +A continuous integration and build server + +### Create/Edit JetBrains TeamCity CI service + +Set JetBrains TeamCity CI service for a project. + +> The build configuration in Teamcity must use the build format number %build.vcs.number% you will also want to configure monitoring of all branches so merge requests build, that setting is in the vsc root advanced settings. + +``` +PUT /projects/:id/services/teamcity +``` + +Parameters: + +- `teamcity_url` (**required**) - TeamCity root URL like https://teamcity.example.com +- `build_type` (**required**) - Build configuration ID +- `username` (**required**) - A user with permissions to trigger a manual build +- `password` (**required**) + +### Delete JetBrains TeamCity CI service + +Delete JetBrains TeamCity CI service for a project. + +``` +DELETE /projects/:id/services/teamcity +``` + diff --git a/doc/web_hooks/web_hooks.md b/doc/web_hooks/web_hooks.md index 73717ffc7d..09400d9b16 100644 --- a/doc/web_hooks/web_hooks.md +++ b/doc/web_hooks/web_hooks.md @@ -279,6 +279,7 @@ X-Gitlab-Event: Note Hook "name": "Gitlab Test", "ssh_url": "git@example.com:gitlab-org/gitlab-test.git", "http_url": "http://example.com/gitlab-org/gitlab-test.git", + "web_url": "http://example.com/gitlab-org/gitlab-test", "namespace": "Gitlab Org", "visibility_level": 10 }, @@ -286,6 +287,7 @@ X-Gitlab-Event: Note Hook "name": "Gitlab Test", "ssh_url": "git@example.com:gitlab-org/gitlab-test.git", "http_url": "http://example.com/gitlab-org/gitlab-test.git", + "web_url": "http://example.com/gitlab-org/gitlab-test", "namespace": "Gitlab Org", "visibility_level": 10 }, @@ -462,6 +464,7 @@ X-Gitlab-Event: Merge Request Hook "name": "awesome_project", "ssh_url": "ssh://git@example.com/awesome_space/awesome_project.git", "http_url": "http://example.com/awesome_space/awesome_project.git", + "web_url": "http://example.com/awesome_space/awesome_project", "visibility_level": 20, "namespace": "awesome_space" }, @@ -469,6 +472,7 @@ X-Gitlab-Event: Merge Request Hook "name": "awesome_project", "ssh_url": "ssh://git@example.com/awesome_space/awesome_project.git", "http_url": "http://example.com/awesome_space/awesome_project.git", + "web_url": "http://example.com/awesome_space/awesome_project", "visibility_level": 20, "namespace": "awesome_space" }, diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 1ebf9a1f02..76c9cc2e3a 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -55,6 +55,32 @@ module API end end + def project_service + @project_service ||= begin + underscored_service = params[:service_slug].underscore + + if Service.available_services_names.include?(underscored_service) + user_project.build_missing_services + + service_method = "#{underscored_service}_service" + + send_service(service_method) + end + end + + @project_service || not_found!("Service") + end + + def send_service(service_method) + user_project.send(service_method) + end + + def service_attributes + @service_attributes ||= project_service.fields.inject([]) do |arr, hash| + arr << hash[:name].to_sym + end + end + def find_group(id) begin group = Group.find(id) diff --git a/lib/api/services.rb b/lib/api/services.rb index 3ad59cf3ad..73645cedea 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -4,73 +4,49 @@ module API before { authenticate! } before { authorize_admin_project } + resource :projects do - # Set GitLab CI service for project - # - # Parameters: - # token (required) - CI project token - # project_url (required) - CI project url + # Set service for project # # Example Request: + # # PUT /projects/:id/services/gitlab-ci - put ":id/services/gitlab-ci" do - required_attributes! [:token, :project_url] - attrs = attributes_for_keys [:token, :project_url] - user_project.build_missing_services + # + put ':id/services/:service_slug' do + if project_service + validators = project_service.class.validators.select do |s| + s.class == ActiveRecord::Validations::PresenceValidator && + s.attributes != [:project_id] + end - if user_project.gitlab_ci_service.update_attributes(attrs.merge(active: true)) - true - else - not_found! + required_attributes! validators.map(&:attributes).flatten.uniq + attrs = attributes_for_keys service_attributes + + if project_service.update_attributes(attrs.merge(active: true)) + true + else + not_found! + end end end - # Delete GitLab CI service settings + # Delete service for project # # Example Request: - # DELETE /projects/:id/services/gitlab-ci - delete ":id/services/gitlab-ci" do - if user_project.gitlab_ci_service - user_project.gitlab_ci_service.update_attributes( - active: false, - token: nil, - project_url: nil - ) - end - end - - # Set Hipchat service for project # - # Parameters: - # token (required) - Hipchat token - # room (required) - Hipchat room name + # DELETE /project/:id/services/gitlab-ci # - # Example Request: - # PUT /projects/:id/services/hipchat - put ':id/services/hipchat' do - required_attributes! [:token, :room] - attrs = attributes_for_keys [:token, :room] - user_project.build_missing_services - - if user_project.hipchat_service.update_attributes( - attrs.merge(active: true)) - true - else - not_found! - end - end - - # Delete Hipchat service settings - # - # Example Request: - # DELETE /projects/:id/services/hipchat - delete ':id/services/hipchat' do - if user_project.hipchat_service - user_project.hipchat_service.update_attributes( - active: false, - token: nil, - room: nil - ) + delete ':id/services/:service_slug' do + if project_service + attrs = service_attributes.inject({}) do |hash, key| + hash.merge!(key => nil) + end + + if project_service.update_attributes(attrs.merge(active: false)) + true + else + not_found! + end end end end diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb index dc87aa52a3..aa46c9a6d4 100644 --- a/lib/gitlab/backend/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -10,7 +10,7 @@ module Grack @request = Rack::Request.new(env) @auth = Request.new(env) - @gitlab_ci = false + @ci = false # Need this patch due to the rails mount # Need this if under RELATIVE_URL_ROOT @@ -28,7 +28,7 @@ module Grack if project && authorized_request? # Tell gitlab-git-http-server the request is OK, and what the GL_ID is render_grack_auth_ok - elsif @user.nil? && !@gitlab_ci + elsif @user.nil? && !@ci unauthorized else render_not_found @@ -47,8 +47,8 @@ module Grack # Allow authentication for GitLab CI service # if valid token passed - if gitlab_ci_request?(login, password) - @gitlab_ci = true + if ci_request?(login, password) + @ci = true return end @@ -60,12 +60,17 @@ module Grack end end - def gitlab_ci_request?(login, password) - if login == "gitlab-ci-token" && project && project.gitlab_ci? - token = project.gitlab_ci_service.token + def ci_request?(login, password) + matched_login = /(?^[a-zA-Z]*-ci)-token$/.match(login) - if token.present? && token == password && git_cmd == 'git-upload-pack' - return true + if project && matched_login.present? && git_cmd == 'git-upload-pack' + underscored_service = matched_login['s'].underscore + + if Service.available_services_names.include?(underscored_service) + service_method = "#{underscored_service}_service" + service = project.send(service_method) + + return service && service.activated? && service.valid_token?(password) end end @@ -124,7 +129,7 @@ module Grack end def authorized_request? - return true if @gitlab_ci + return true if @ci case git_cmd when *Gitlab::GitAccess::DOWNLOAD_COMMANDS diff --git a/lib/tasks/services.rake b/lib/tasks/services.rake new file mode 100644 index 0000000000..53d912d2a7 --- /dev/null +++ b/lib/tasks/services.rake @@ -0,0 +1,89 @@ +services_template = <<-ERB +# Services + +<% services.each do |service| %> +## <%= service[:title] %> + + +<% unless service[:description].blank? %> +<%= service[:description] %> +<% end %> + + +### Create/Edit <%= service[:title] %> service + +Set <%= service[:title] %> service for a project. +<% unless service[:help].blank? %> + +> <%= service[:help].gsub("\n", ' ') %> + +<% end %> + +``` +PUT /projects/:id/services/<%= service[:dashed_name] %> + +``` + +Parameters: + +<% service[:params].each do |param| %> +- `<%= param[:name] %>` <%= param[:required] ? "(**required**)" : "(optional)" %><%= [" -", param[:description]].join(" ").gsub("\n", '') unless param[:description].blank? %> + +<% end %> + +### Delete <%= service[:title] %> service + +Delete <%= service[:title] %> service for a project. + +``` +DELETE /projects/:id/services/<%= service[:dashed_name] %> + +``` + +<% end %> +ERB + +namespace :services do + task :doc do + services = Service.available_services_names.map do |s| + service_start = Time.now + klass = "#{s}_service".classify.constantize + + service = klass.new + + service_hash = {} + + service_hash[:title] = service.title + service_hash[:dashed_name] = s.dasherize + service_hash[:description] = service.description + service_hash[:help] = service.help + service_hash[:params] = service.fields.map do |p| + param_hash = {} + + param_hash[:name] = p[:name] + param_hash[:description] = p[:placeholder] || p[:title] + param_hash[:required] = klass.validators_on(p[:name].to_sym).any? do |v| + v.class == ActiveRecord::Validations::PresenceValidator + end + + param_hash + end.sort_by { |p| p[:required] ? 0 : 1 } + + puts "Collected data for: #{service.title}, #{Time.now-service_start}" + service_hash + end + + doc_start = Time.now + doc_path = File.join(Rails.root, 'doc', 'api', 'services.md') + + result = ERB.new(services_template, 0 , '>') + .result(OpenStruct.new(services: services).instance_eval { binding }) + + File.open(doc_path, 'w') do |f| + f.write result + end + + puts "write a new service.md to: #{doc_path.to_s}, #{Time.now-doc_start}" + + end +end diff --git a/spec/models/project_services/drone_ci_service_spec.rb b/spec/models/project_services/drone_ci_service_spec.rb new file mode 100644 index 0000000000..bad9a9e6e1 --- /dev/null +++ b/spec/models/project_services/drone_ci_service_spec.rb @@ -0,0 +1,107 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# template :boolean default(FALSE) +# push_events :boolean default(TRUE) +# issues_events :boolean default(TRUE) +# merge_requests_events :boolean default(TRUE) +# tag_push_events :boolean default(TRUE) +# note_events :boolean default(TRUE), not null +# + +require 'spec_helper' + +describe DroneCiService do + describe 'associations' do + it { is_expected.to belong_to(:project) } + it { is_expected.to have_one(:service_hook) } + end + + describe 'validations' do + context 'active' do + before { allow(subject).to receive(:activated?).and_return(true) } + + it { is_expected.to validate_presence_of(:token) } + it { is_expected.to validate_presence_of(:drone_url) } + it { is_expected.to allow_value('ewf9843kdnfdfs89234n').for(:token) } + it { is_expected.to allow_value('http://ci.example.com').for(:drone_url) } + it { is_expected.not_to allow_value('token with spaces').for(:token) } + it { is_expected.not_to allow_value('token/with%spaces').for(:token) } + it { is_expected.not_to allow_value('this is not url').for(:drone_url) } + it { is_expected.not_to allow_value('http//noturl').for(:drone_url) } + it { is_expected.not_to allow_value('ftp://ci.example.com').for(:drone_url) } + end + + context 'inactive' do + before { allow(subject).to receive(:activated?).and_return(false) } + + it { is_expected.not_to validate_presence_of(:token) } + it { is_expected.not_to validate_presence_of(:drone_url) } + it { is_expected.to allow_value('ewf9843kdnfdfs89234n').for(:token) } + it { is_expected.to allow_value('http://drone.example.com').for(:drone_url) } + it { is_expected.to allow_value('token with spaces').for(:token) } + it { is_expected.to allow_value('ftp://drone.example.com').for(:drone_url) } + end + end + + shared_context :drone_ci_service do + let(:drone) { DroneCiService.new } + let(:project) { create(:project, name: 'project') } + let(:path) { "#{project.namespace.path}/#{project.path}" } + let(:drone_url) { 'http://drone.example.com' } + let(:sha) { '2ab7834c' } + let(:branch) { 'dev' } + let(:token) { 'secret' } + let(:iid) { rand(1..9999) } + + before(:each) do + allow(drone).to receive_messages( + project_id: project.id, + project: project, + active: true, + drone_url: drone_url, + token: token + ) + end + end + + describe "service page/path methods" do + include_context :drone_ci_service + + # URL's + let(:commit_page) { "#{drone_url}/gitlab/#{path}/redirect/commits/#{sha}?branch=#{branch}" } + let(:merge_request_page) { "#{drone_url}/gitlab/#{path}/redirect/pulls/#{iid}" } + let(:commit_status_path) { "#{drone_url}/gitlab/#{path}/commits/#{sha}?branch=#{branch}&access_token=#{token}" } + let(:merge_request_status_path) { "#{drone_url}/gitlab/#{path}/pulls/#{iid}?access_token=#{token}" } + + it { expect(drone.build_page(sha, branch)).to eq(commit_page) } + it { expect(drone.commit_page(sha, branch)).to eq(commit_page) } + it { expect(drone.merge_request_page(iid, sha, branch)).to eq(merge_request_page) } + it { expect(drone.commit_status_path(sha, branch)).to eq(commit_status_path) } + it { expect(drone.merge_request_status_path(iid, sha, branch)).to eq(merge_request_status_path) } + end + + describe "execute" do + include_context :drone_ci_service + + let(:user) { create(:user, username: 'username') } + let(:push_sample_data) { Gitlab::PushDataBuilder.build_sample(project, user) } + + it do + service_hook = double + expect(service_hook).to receive(:execute) + expect(drone).to receive(:service_hook).and_return(service_hook) + + drone.execute(push_sample_data) + end + end +end diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb index 6d29a28580..c297904614 100644 --- a/spec/requests/api/services_spec.rb +++ b/spec/requests/api/services_spec.rb @@ -5,64 +5,47 @@ describe API::API, api: true do let(:user) { create(:user) } let(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } - describe "POST /projects/:id/services/gitlab-ci" do - it "should update gitlab-ci settings" do - put api("/projects/#{project.id}/services/gitlab-ci", user), token: 'secrettoken', project_url: "http://ci.example.com/projects/1" + Service.available_services_names.each do |service| + describe "PUT /projects/:id/services/#{service.dasherize}" do + include_context service - expect(response.status).to eq(200) + it "should update #{service} settings" do + put api("/projects/#{project.id}/services/#{dashed_service}", user), service_attrs + + expect(response.status).to eq(200) + end + + it "should return if required fields missing" do + attrs = service_attrs + + required_attributes = service_attrs_list.select do |attr| + service_klass.validators_on(attr).any? do |v| + v.class == ActiveRecord::Validations::PresenceValidator + end + end + + if required_attributes.empty? + expected_code = 200 + else + attrs.delete(required_attributes.shuffle.first) + expected_code = 400 + end + + put api("/projects/#{project.id}/services/#{dashed_service}", user), attrs + + expect(response.status).to eq(expected_code) + end end - it "should return if required fields missing" do - put api("/projects/#{project.id}/services/gitlab-ci", user), project_url: "http://ci.example.com/projects/1", active: true + describe "DELETE /projects/:id/services/#{service.dasherize}" do + include_context service - expect(response.status).to eq(400) - end + it "should delete #{service}" do + delete api("/projects/#{project.id}/services/#{dashed_service}", user) - it "should return if the format of token is invalid" do - put api("/projects/#{project.id}/services/gitlab-ci", user), token: 'token-with dashes and spaces%', project_url: "http://ci.example.com/projects/1", active: true - - expect(response.status).to eq(404) - end - - it "should return if the format of token is invalid" do - put api("/projects/#{project.id}/services/gitlab-ci", user), token: 'token-with dashes and spaces%', project_url: "ftp://ci.example/projects/1", active: true - - expect(response.status).to eq(404) - end - end - - describe "DELETE /projects/:id/services/gitlab-ci" do - it "should update gitlab-ci settings" do - delete api("/projects/#{project.id}/services/gitlab-ci", user) - - expect(response.status).to eq(200) - expect(project.gitlab_ci_service).to be_nil - end - end - - describe 'PUT /projects/:id/services/hipchat' do - it 'should update hipchat settings' do - put api("/projects/#{project.id}/services/hipchat", user), - token: 'secret-token', room: 'test' - - expect(response.status).to eq(200) - expect(project.hipchat_service).not_to be_nil - end - - it 'should return if required fields missing' do - put api("/projects/#{project.id}/services/gitlab-ci", user), - token: 'secret-token', active: true - - expect(response.status).to eq(400) - end - end - - describe 'DELETE /projects/:id/services/hipchat' do - it 'should delete hipchat settings' do - delete api("/projects/#{project.id}/services/hipchat", user) - - expect(response.status).to eq(200) - expect(project.hipchat_service).to be_nil + expect(response.status).to eq(200) + expect(project.send(service_method).activated?).to be_falsey + end end end end diff --git a/spec/support/services_shared_context.rb b/spec/support/services_shared_context.rb new file mode 100644 index 0000000000..4d007ae55e --- /dev/null +++ b/spec/support/services_shared_context.rb @@ -0,0 +1,21 @@ +Service.available_services_names.each do |service| + shared_context service do + let(:dashed_service) { service.dasherize } + let(:service_method) { "#{service}_service".to_sym } + let(:service_klass) { "#{service}_service".classify.constantize } + let(:service_attrs_list) { service_klass.new.fields.inject([]) {|arr, hash| arr << hash[:name].to_sym } } + let(:service_attrs) do + service_attrs_list.inject({}) do |hash, k| + if k =~ /^(token*|.*_token|.*_key)/ + hash.merge!(k => 'secrettoken') + elsif k =~ /^(.*_url|url|webhook)/ + hash.merge!(k => "http://example.com") + elsif service == 'irker' && k == :recipients + hash.merge!(k => 'irc://irc.network.net:666/#channel') + else + hash.merge!(k => "someword") + end + end + end + end +end From fbb891c8f3818b9aa17fadbb984ff7d33053c819 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 1 Sep 2015 17:57:56 -0700 Subject: [PATCH 090/153] Fix broken Wiki Page History Closes #2104 Closes #1751 Closes #1592 Closes https://github.com/gitlabhq/gitlabhq/issues/9399 --- CHANGELOG | 1 + app/controllers/projects/wikis_controller.rb | 1 - app/helpers/wiki_helper.rb | 24 ------------------- .../projects/wikis/_main_links.html.haml | 4 ++-- app/views/projects/wikis/_nav.html.haml | 4 ++-- app/views/projects/wikis/show.html.haml | 2 +- config/routes.rb | 22 ++++++++++------- features/project/wiki.feature | 12 ++++++++++ features/steps/project/wiki.rb | 9 ++++++- 9 files changed, 39 insertions(+), 40 deletions(-) delete mode 100644 app/helpers/wiki_helper.rb diff --git a/CHANGELOG b/CHANGELOG index f2ac3b979a..47bab4533c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Fix broken Wiki Page History (Stan Hu) - Prevent anchors from being hidden by header (Stan Hu) - Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu) - Sort issues by creation date in Bitbucket importer (Stan Hu) diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 50512cb6dc..51c26a6a46 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -5,7 +5,6 @@ class Projects::WikisController < Projects::ApplicationController before_action :authorize_create_wiki!, only: [:edit, :create, :history] before_action :authorize_admin_wiki!, only: :destroy before_action :load_project_wiki - include WikiHelper def pages @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]).per(PER_PAGE) diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb deleted file mode 100644 index f8a96516e6..0000000000 --- a/app/helpers/wiki_helper.rb +++ /dev/null @@ -1,24 +0,0 @@ -module WikiHelper - # Rails v4.1.9+ escapes all model IDs, converting slashes into %2F. The - # only way around this is to implement our own path generators. - def namespace_project_wiki_path(namespace, project, wiki_page, *args) - slug = - case wiki_page - when Symbol - wiki_page - when String - wiki_page - else - wiki_page.slug - end - namespace_project_path(namespace, project) + "/wikis/#{slug}" - end - - def edit_namespace_project_wiki_path(namespace, project, wiki_page, *args) - namespace_project_wiki_path(namespace, project, wiki_page) + '/edit' - end - - def history_namespace_project_wiki_path(namespace, project, wiki_page, *args) - namespace_project_wiki_path(namespace, project, wiki_page) + '/history' - end -end diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index 788bb8cf1e..acc2c8b2f7 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,8 +1,8 @@ %span.pull-right - if (@page && @page.persisted?) - = link_to history_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do + = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn btn-grouped" do Page History - if can?(current_user, :create_wiki, @project) - = link_to edit_namespace_project_wiki_path(@project.namespace, @project, @page), class: "btn btn-grouped" do + = link_to namespace_project_wiki_edit_path(@project.namespace, @project, @page), class: "btn btn-grouped" do %i.fa.fa-pencil-square-o Edit diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml index 804a1b52db..ec87c3c765 100644 --- a/app/views/projects/wikis/_nav.html.haml +++ b/app/views/projects/wikis/_nav.html.haml @@ -3,10 +3,10 @@ = link_to 'Home', namespace_project_wiki_path(@project.namespace, @project, :home) = nav_link(path: 'wikis#pages') do - = link_to 'Pages', pages_namespace_project_wikis_path(@project.namespace, @project) + = link_to 'Pages', namespace_project_wiki_pages_path(@project.namespace, @project) = nav_link(path: 'wikis#git_access') do - = link_to git_access_namespace_project_wikis_path(@project.namespace, @project) do + = link_to namespace_project_wikis_git_access_path(@project.namespace, @project) do %i.fa.fa-download Git Access diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 5c4dd7f91a..90c4b83cf3 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -10,7 +10,7 @@ - if @page.historical? .warning_message This is an old version of this page. - You can view the #{link_to "most recent version", namespace_project_wiki_path(@project.namespace, @project, @page)} or browse the #{link_to "history", history_namespace_project_wiki_path(@project.namespace, @project, @page)}. + You can view the #{link_to "most recent version", namespace_project_wiki_path(@project.namespace, @project, @page)} or browse the #{link_to "history", namespace_project_wiki_history_path(@project.namespace, @project, @page)}. %hr diff --git a/config/routes.rb b/config/routes.rb index 920ece518e..15da21f04e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -406,16 +406,20 @@ Gitlab::Application.routes.draw do end end - resources :wikis, only: [:show, :edit, :destroy, :create], constraints: { id: /[a-zA-Z.0-9_\-\/]+/ } do - collection do - get :pages - put ':id' => 'wikis#update' - get :git_access - end + WIKI_SLUG_ID = { id: /[a-zA-Z.0-9_\-\/]+/ } unless defined? WIKI_SLUG_ID - member do - get 'history' - end + scope do + # Order matters to give priority to these matches + get '/wikis/git_access', to: 'wikis#git_access' + get '/wikis/pages', to: 'wikis#pages', as: 'wiki_pages' + post '/wikis', to: 'wikis#create' + + get '/wikis/*id/history', to: 'wikis#history', as: 'wiki_history', constraints: WIKI_SLUG_ID + get '/wikis/*id/edit', to: 'wikis#edit', as: 'wiki_edit', constraints: WIKI_SLUG_ID + + get '/wikis/*id', to: 'wikis#show', as: 'wiki', constraints: WIKI_SLUG_ID + delete '/wikis/*id', to: 'wikis#destroy', constraints: WIKI_SLUG_ID + put '/wikis/*id', to: 'wikis#update', constraints: WIKI_SLUG_ID end resource :repository, only: [:show, :create] do diff --git a/features/project/wiki.feature b/features/project/wiki.feature index 2ebfa3c166..af970ecf2d 100644 --- a/features/project/wiki.feature +++ b/features/project/wiki.feature @@ -91,3 +91,15 @@ Feature: Project Wiki And I view the page history of a Wiki page that has a path Then I should see a non-escaped path And I should see the page history + + @javascript + Scenario: View an old page version of a Wiki page + Given I create a New page with paths + And I click on the "Pages" button + And I edit the Wiki page with a path + Then I should see a non-escaped path + And I should see the Editing page + And I change the content + Then I click on Page History + And I should see the page history + And I should see a link with a version ID diff --git a/features/steps/project/wiki.rb b/features/steps/project/wiki.rb index eebfaee1ed..02207dbffa 100644 --- a/features/steps/project/wiki.rb +++ b/features/steps/project/wiki.rb @@ -3,7 +3,6 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps include SharedProject include SharedNote include SharedPaths - include WikiHelper step 'I click on the Cancel button' do page.within(:css, ".form-actions") do @@ -165,6 +164,10 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps click_on 'Page History' end + step 'I click on Page History' do + click_on 'Page History' + end + step 'I should see the page history' do expect(page).to have_content('History for') end @@ -174,6 +177,10 @@ class Spinach::Features::ProjectWiki < Spinach::FeatureSteps click_button "Search" end + step 'I should see a link with a version ID' do + find('a[href*="?version_id"]') + end + def wiki @project_wiki = ProjectWiki.new(project, current_user) end From d72b8f87ac44fd90d0b0efb09ac72e1be9d33745 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 2 Sep 2015 08:12:01 +0100 Subject: [PATCH 091/153] Update mail_room to 0.4.2 for better error handling --- Gemfile | 2 +- Gemfile.lock | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 2a55bb31cb..36b7195974 100644 --- a/Gemfile +++ b/Gemfile @@ -268,6 +268,6 @@ gem "newrelic_rpm" gem 'octokit', '3.7.0' -gem "mail_room", "~> 0.4.1" +gem "mail_room", "~> 0.4.2" gem 'email_reply_parser' diff --git a/Gemfile.lock b/Gemfile.lock index 2450b95d97..181b72e07e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -370,7 +370,7 @@ GEM systemu (~> 2.6.2) mail (2.6.3) mime-types (>= 1.16, < 3) - mail_room (0.4.1) + mail_room (0.4.2) method_source (0.8.2) mime-types (1.25.1) mimemagic (0.3.0) @@ -805,7 +805,7 @@ DEPENDENCIES jquery-ui-rails kaminari (~> 0.15.1) letter_opener - mail_room (~> 0.4.1) + mail_room (~> 0.4.2) minitest (~> 5.3.0) mousetrap-rails mysql2 @@ -878,3 +878,6 @@ DEPENDENCIES virtus webmock (~> 1.21.0) wikicloth (= 0.8.1) + +BUNDLED WITH + 1.10.5 From 551157960e70363d35a9b24d79780c9b98c9ef3b Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 1 Sep 2015 23:28:48 -0700 Subject: [PATCH 092/153] Remove the filename argument from Content-Disposition header to avoid RFC 5987 and RFC 6266 encoding issues. This change allows the browser to determine the filename based on the URL. See: http://greenbytes.de/tech/tc2231/ Closes https://github.com/gitlabhq/gitlabhq/issues/9595 Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/1829 --- CHANGELOG | 1 + app/controllers/projects/raw_controller.rb | 3 +-- .../projects/raw_controller_spec.rb | 23 +++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 spec/controllers/projects/raw_controller_spec.rb diff --git a/CHANGELOG b/CHANGELOG index f2ac3b979a..a5b4c3cf5c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU) - Prevent anchors from being hidden by header (Stan Hu) - Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu) - Sort issues by creation date in Bitbucket importer (Stan Hu) diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index 647c145407..1a3df40dc7 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -17,8 +17,7 @@ class Projects::RawController < Projects::ApplicationController send_data( @blob.data, type: type, - disposition: 'inline', - filename: @blob.name + disposition: 'inline' ) else not_found! diff --git a/spec/controllers/projects/raw_controller_spec.rb b/spec/controllers/projects/raw_controller_spec.rb new file mode 100644 index 0000000000..1f921d5f05 --- /dev/null +++ b/spec/controllers/projects/raw_controller_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +describe Projects::RawController do + let(:public_project) { create(:project, :public) } + + describe "#show" do + context 'regular filename' do + let(:id) { 'master/README.md' } + + it 'delivers ASCII file' do + get(:show, + namespace_id: public_project.namespace.to_param, + project_id: public_project.to_param, + id: id) + + expect(response.status).to eq(200) + expect(response.header['Content-Type']).to eq('text/plain; charset=utf-8') + expect(response.header['Content-Disposition']). + to eq("inline") + end + end + end +end From 3700e5a9607ba9980940a29d275e22034538473d Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 31 Aug 2015 13:59:52 +0300 Subject: [PATCH 093/153] Crowd integration --- CHANGELOG | 1 + Gemfile | 1 + Gemfile.lock | 5 ++ app/controllers/sessions_controller.rb | 2 + app/helpers/auth_helper.rb | 6 +- .../devise/sessions/_new_crowd.html.haml | 9 +++ app/views/devise/shared/_signin_box.html.haml | 10 +++- config/gitlab.yml.example | 5 ++ config/initializers/devise.rb | 2 +- doc/integration/crowd.md | 58 +++++++++++++++++++ doc/integration/omniauth.md | 1 + 11 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 app/views/devise/sessions/_new_crowd.html.haml create mode 100644 doc/integration/crowd.md diff --git a/CHANGELOG b/CHANGELOG index 0c401a99d4..d8733174b0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -34,6 +34,7 @@ v 8.0.0 (unreleased) - Added Drone CI integration (Kirill Zaitsev) - Refactored service API and added automatically service docs generator (Kirill Zaitsev) - Added web_url key project hook_attrs (Kirill Zaitsev) + - Add support for Crowd v 7.14.1 - Improve abuse reports management from admin area diff --git a/Gemfile b/Gemfile index 2a55bb31cb..ad921706fc 100644 --- a/Gemfile +++ b/Gemfile @@ -25,6 +25,7 @@ gem 'omniauth-kerberos', group: :kerberos gem 'omniauth-gitlab' gem 'omniauth-bitbucket' gem 'omniauth-saml', '~> 1.4.0' +gem 'omniauth_crowd' gem 'doorkeeper', '2.1.3' gem "rack-oauth2", "~> 1.0.5" diff --git a/Gemfile.lock b/Gemfile.lock index 2450b95d97..78affaeaa7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -434,6 +434,10 @@ GEM omniauth-twitter (1.0.1) multi_json (~> 1.3) omniauth-oauth (~> 1.0) + omniauth_crowd (2.2.3) + activesupport + nokogiri (>= 1.4.4) + omniauth (~> 1.0) opennebula (4.12.1) json nokogiri @@ -821,6 +825,7 @@ DEPENDENCIES omniauth-saml (~> 1.4.0) omniauth-shibboleth omniauth-twitter + omniauth_crowd org-ruby (= 0.9.12) pg poltergeist (~> 1.6.0) diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 8389f07a3b..cfa565cd03 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -8,6 +8,8 @@ class SessionsController < Devise::SessionsController def new if Gitlab.config.ldap.enabled @ldap_servers = Gitlab::LDAP::Config.servers + else + @ldap_servers = [] end super diff --git a/app/helpers/auth_helper.rb b/app/helpers/auth_helper.rb index 0e7a37b4cc..d9502181c4 100644 --- a/app/helpers/auth_helper.rb +++ b/app/helpers/auth_helper.rb @@ -1,6 +1,6 @@ module AuthHelper PROVIDERS_WITH_ICONS = %w(twitter github gitlab bitbucket google_oauth2).freeze - FORM_BASED_PROVIDERS = [/\Aldap/, 'kerberos'].freeze + FORM_BASED_PROVIDERS = [/\Aldap/, 'kerberos', 'crowd'].freeze def ldap_enabled? Gitlab.config.ldap.enabled @@ -26,6 +26,10 @@ module AuthHelper auth_providers.select { |provider| form_based_provider?(provider) } end + def crowd_enabled? + auth_providers.include? :crowd + end + def button_based_providers auth_providers.reject { |provider| form_based_provider?(provider) } end diff --git a/app/views/devise/sessions/_new_crowd.html.haml b/app/views/devise/sessions/_new_crowd.html.haml new file mode 100644 index 0000000000..4974bb7f7f --- /dev/null +++ b/app/views/devise/sessions/_new_crowd.html.haml @@ -0,0 +1,9 @@ += form_tag(user_omniauth_authorize_path("crowd"), id: 'new_crowd_user' ) do + = text_field_tag :username, nil, {class: "form-control top", placeholder: "Username", autofocus: "autofocus"} + = password_field_tag :password, nil, {class: "form-control bottom", placeholder: "Password"} + - if devise_mapping.rememberable? + .remember-me.checkbox + %label{for: "remember_me"} + = check_box_tag :remember_me, '1', false, id: 'remember_me' + %span Remember me + = button_tag "Sign in", class: "btn-save btn" \ No newline at end of file diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index bb5e479697..41ad2c231d 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -8,15 +8,21 @@ .login-body - if form_based_providers.any? %ul.nav.nav-tabs + - if crowd_enabled? + %li.active + = link_to "Crowd", "#tab-crowd", 'data-toggle' => 'tab' - @ldap_servers.each_with_index do |server, i| - %li{class: (:active if i.zero?)} + %li{class: (:active if i.zero? && !crowd_enabled?)} = link_to server['label'], "#tab-#{server['provider_name']}", 'data-toggle' => 'tab' - if signin_enabled? %li = link_to 'Standard', '#tab-signin', 'data-toggle' => 'tab' .tab-content + - if crowd_enabled? + %div.tab-pane.active{id: "tab-crowd"} + = render 'devise/sessions/new_crowd' - @ldap_servers.each_with_index do |server, i| - %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero?)} + %div.tab-pane{id: "tab-#{server['provider_name']}", class: (:active if i.zero? && !crowd_enabled?)} = render 'devise/sessions/new_ldap', server: server - if signin_enabled? %div#tab-signin.tab-pane diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index c7b60a1d4b..9eb99dae45 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -246,6 +246,11 @@ production: &base # issuer: 'https://gitlab.example.com', # name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient' # } } + # - { name: 'crowd', + # args: { + # crowd_server_url: 'CROWD SERVER URL', + # application_name: 'YOUR_APP_NAME', + # application_password: 'YOUR_APP_PASSWORD' } } diff --git a/config/initializers/devise.rb b/config/initializers/devise.rb index 091548348b..2ce24592f8 100644 --- a/config/initializers/devise.rb +++ b/config/initializers/devise.rb @@ -238,7 +238,7 @@ Devise.setup do |config| provider_arguments.concat provider['args'] when Hash # A Hash from the configuration will be passed as is. - provider_arguments << provider['args'] + provider_arguments << provider['args'].symbolize_keys end config.omniauth provider['name'].to_sym, *provider_arguments diff --git a/doc/integration/crowd.md b/doc/integration/crowd.md new file mode 100644 index 0000000000..2ecc8795ac --- /dev/null +++ b/doc/integration/crowd.md @@ -0,0 +1,58 @@ +# Crowd OmniAuth Provider + +To enable the Crowd OmniAuth provider you must register your application with Crowd. To configure Crowd integration you need an application name and password. + +1. On your GitLab server, open the configuration file. + + For omnibus package: + + ```sh + sudo editor /etc/gitlab/gitlab.rb + ``` + + For instalations from source: + + ```sh + cd /home/git/gitlab + + sudo -u git -H editor config/gitlab.yml + ``` + +1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. + +1. Add the provider configuration: + + For omnibus package: + + ```ruby + gitlab_rails['omniauth_providers'] = [ + { + "name" => "crowd", + "args" => { + "crowd_server_url" => "CROWD", + "application_name" => "YOUR_APP_NAME", + "application_password" => "YOUR_APP_PASSWORD" + } + } + ] + ``` + + For installations from source: + + ``` + - { name: 'crowd', + args: { + crowd_server_url: 'CROWD SERVER URL', + application_name: 'YOUR_APP_NAME', + application_password: 'YOUR_APP_PASSWORD' } } + ``` + +1. Change 'YOUR_APP_NAME' to the application name from Crowd applications page. + +1. Change 'YOUR_APP_PASSWORD' to the application password you've set. + +1. Save the configuration file. + +1. Restart GitLab for the changes to take effect. + +On the sign in page there should now be a Crowd tab in the sign in form. \ No newline at end of file diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md index 2010cb9b8a..c5cecbc2f2 100644 --- a/doc/integration/omniauth.md +++ b/doc/integration/omniauth.md @@ -76,6 +76,7 @@ Now we can choose one or more of the Supported Providers below to continue confi - [Shibboleth](shibboleth.md) - [Twitter](twitter.md) - [SAML](saml.md) +- [Crowd](crowd.md) ## Enable OmniAuth for an Existing User From 81fe6f9d7e813726816b649ce8a27058a74af740 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Wed, 2 Sep 2015 16:17:30 +0300 Subject: [PATCH 094/153] added spinach --- features/crowd_login_form.feature | 5 +++++ features/steps/crowd_login_form.rb | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 features/crowd_login_form.feature create mode 100644 features/steps/crowd_login_form.rb diff --git a/features/crowd_login_form.feature b/features/crowd_login_form.feature new file mode 100644 index 0000000000..d5a347b5fd --- /dev/null +++ b/features/crowd_login_form.feature @@ -0,0 +1,5 @@ +Feature: Crowd login form + Scenario: I see crowd form + Given Crowd integration enabled + When I visit sign in page + Then I should see Crowd login form \ No newline at end of file diff --git a/features/steps/crowd_login_form.rb b/features/steps/crowd_login_form.rb new file mode 100644 index 0000000000..31bc6eea3c --- /dev/null +++ b/features/steps/crowd_login_form.rb @@ -0,0 +1,21 @@ +class Spinach::Features::CrowdLoginForm < Spinach::FeatureSteps + include SharedAuthentication + include SharedPaths + include SharedSnippet + include SharedUser + include SharedSearch + + step 'Crowd integration enabled' do + Gitlab::OAuth::Provider.should_receive(:providers).and_return([:crowd]) + allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path) + Gitlab.config.omniauth.should_receive(:enabled).and_return(true) + end + + step 'I should see Crowd login form' do + expect(page).to have_selector '#tab-crowd form' + end + + step 'I visit sign in page' do + visit new_user_session_path + end +end \ No newline at end of file From 30bf2b9cc370da5936f70b827db4f53dc33d8f1f Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Wed, 2 Sep 2015 18:47:56 +0200 Subject: [PATCH 095/153] Avoid instance variable re-use trouble This is the quickest/dumbest/safest way I could think of to prevent the instance variable reuse problems we have on dev.gitlab.org now. --- config/routes.rb | 2 +- lib/gitlab/backend/grack_auth.rb | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 920ece518e..a98c0f8aa7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,7 +30,7 @@ Gitlab::Application.routes.draw do end # Enable Grack support - mount Grack::Auth.new({}), at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] + mount Grack::AuthSpawner, at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\//.match(request.path_info) }, via: [:get, :post] # Help get 'help' => 'help#index' diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb index dc87aa52a3..7ffc322691 100644 --- a/lib/gitlab/backend/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -1,6 +1,14 @@ require_relative 'shell_env' module Grack + class AuthSpawner + def self.call(env) + # Avoid issues with instance variables in Grack::Auth persisting across + # requests by creating a new instance for each request. + Auth.new({}).call(env) + end + end + class Auth < Rack::Auth::Basic attr_accessor :user, :project, :env From 5bbe6c4d54f9cffcac9d3c14d5ef5ad0248ffcc9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 19:17:04 +0200 Subject: [PATCH 096/153] Split starred projects list and activity in same way like we did with your projects Signed-off-by: Dmitriy Zaporozhets --- app/controllers/dashboard_controller.rb | 11 +++++++++-- app/views/dashboard/_activity_head.html.haml | 7 +++++++ app/views/dashboard/activity.html.haml | 2 ++ app/views/dashboard/projects/starred.html.haml | 18 +----------------- 4 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 app/views/dashboard/_activity_head.html.haml diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index d745131694..2bc2e5e58f 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -1,5 +1,5 @@ class DashboardController < Dashboard::ApplicationController - before_action :load_projects + before_action :load_projects, except: :activity before_action :event_filter, only: :activity respond_to :html @@ -55,7 +55,14 @@ class DashboardController < Dashboard::ApplicationController end def load_events - @events = Event.in_projects(current_user.authorized_projects.pluck(:id)) + project_ids = + if params[:filter] == "starred" + current_user.starred_projects + else + current_user.authorized_projects + end.pluck(:id) + + @events = Event.in_projects(project_ids) @events = @event_filter.apply_filter(@events).with_associations @events = @events.limit(20).offset(params[:offset] || 0) end diff --git a/app/views/dashboard/_activity_head.html.haml b/app/views/dashboard/_activity_head.html.haml new file mode 100644 index 0000000000..9f4be025bf --- /dev/null +++ b/app/views/dashboard/_activity_head.html.haml @@ -0,0 +1,7 @@ +%ul.center-top-menu + %li{ class: ("active" unless params[:filter]) } + = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do + Your Projects + %li{ class: ("active" if params[:filter] == 'starred') } + = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do + Starred Projects diff --git a/app/views/dashboard/activity.html.haml b/app/views/dashboard/activity.html.haml index 7a5a093add..72419bf94d 100644 --- a/app/views/dashboard/activity.html.haml +++ b/app/views/dashboard/activity.html.haml @@ -2,5 +2,7 @@ - if current_user = auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity") += render 'dashboard/activity_head' + %section.activities = render 'activities' diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml index 19f3975e53..becd989c1f 100644 --- a/app/views/dashboard/projects/starred.html.haml +++ b/app/views/dashboard/projects/starred.html.haml @@ -2,23 +2,7 @@ = render 'dashboard/projects_head' - if @projects.any? - = render 'shared/show_aside' - - .dashboard.row - %section.activities.col-md-7 - = render 'dashboard/activities' - %aside.col-md-5 - .panel.panel-default.projects-list-holder - .panel-heading.clearfix - .input-group - = search_field_tag :filter_projects, nil, placeholder: 'Filter by name', class: 'projects-list-filter form-control' - - if current_user.can_create_project? - %span.input-group-btn - = link_to new_project_path, class: 'btn btn-success' do - New project - - = render 'shared/projects/list', projects: @projects, projects_limit: 20 - + = render 'dashboard/projects' - else %h3 You don't have starred projects yet %p.slead Visit project page and press on star icon and it will appear on this page. From 774c523c1f0ccb259329ff0b945c73ca5e06a7aa Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 20:02:26 +0200 Subject: [PATCH 097/153] Fix tests and update CHANGELOG Signed-off-by: Dmitriy Zaporozhets --- CHANGELOG | 2 +- features/steps/dashboard/starred_projects.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index e46fb5d6c1..339df2bcac 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -21,7 +21,7 @@ v 8.0.0 (unreleased) - Create cross-reference for closing references on commits pushed to non-default branches (Maël Valais) - Ability to search milestones - Gracefully handle SMTP user input errors (e.g. incorrect email addresses) to prevent Sidekiq retries (Stan Hu) - - Move dashboard activity to separate page + - Move dashboard activity to separate page (for your projects and starred projects) - Improve performance of git blame - Limit content width to 1200px for most of pages to improve readability on big screens - Fix 500 error when submit project snippet without body diff --git a/features/steps/dashboard/starred_projects.rb b/features/steps/dashboard/starred_projects.rb index 59c73fe63f..c33813e550 100644 --- a/features/steps/dashboard/starred_projects.rb +++ b/features/steps/dashboard/starred_projects.rb @@ -8,7 +8,7 @@ class Spinach::Features::DashboardStarredProjects < Spinach::FeatureSteps end step 'I should not see project "Shop"' do - page.within 'aside' do + page.within '.projects-list' do expect(page).not_to have_content('Shop') end end From 4406aeff05ea76522e662c996cbb9c9837f765d4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 13:02:16 +0200 Subject: [PATCH 098/153] Implement new design for projects page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/mixins.scss | 17 +++++++ app/assets/stylesheets/base/variables.scss | 4 +- app/assets/stylesheets/generic/avatar.scss | 1 + app/assets/stylesheets/generic/common.scss | 18 +++++-- app/assets/stylesheets/generic/header.scss | 30 +++++------- app/assets/stylesheets/generic/sidebar.scss | 46 +++++++++++------- app/assets/stylesheets/pages/dashboard.scss | 2 +- app/assets/stylesheets/pages/projects.scss | 47 +++++++++++++++---- .../stylesheets/themes/gitlab-theme.scss | 10 ++-- app/views/layouts/_page.html.haml | 2 +- app/views/shared/projects/_project.html.haml | 3 +- 11 files changed, 121 insertions(+), 59 deletions(-) diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 05f5bd79f9..bf251d896e 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -195,3 +195,20 @@ } } } + +@mixin input-big { + height: 36px; + padding: 5px 10px; + font-size: 16px; + line-height: 24px; + color: #7f8fa4; + background-color: #fff; + border-color: #e7e9ed; +} + +@mixin btn-big { + height: 36px; + padding: 5px 10px; + font-size: 16px; + line-height: 24px; +} diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 26d0a1e536..f492530a13 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -12,7 +12,7 @@ $code_font_size: 13px; $code_line_height: 1.5; $border-color: #E5E5E5; $background-color: #f5f5f5; -$header-height: 50px; +$header-height: 73px; $fixed-layout-width: 1200px; @@ -20,7 +20,7 @@ $fixed-layout-width: 1200px; * State colors: */ $gl-primary: #446e9b; -$gl-success: #019875; +$gl-success: #44c679; $gl-info: #029ACF; $gl-warning: #EB9532; $gl-danger: #d9534f; diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 8595887c3b..0f137fd8c8 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -23,6 +23,7 @@ &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; } + &.s48 { width: 48px; height: 48px; margin-right: 10px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; } &.s160 { width: 160px; height: 160px; margin-right: 20px; } diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index e5902597c4..549234d8d6 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -362,7 +362,7 @@ table { } .profiler-results { - top: 50px !important; + top: 73px !important; .profiler-button, .profiler-controls { @@ -374,18 +374,28 @@ table { list-style: none; text-align: center; margin-top: 5px; - padding-bottom: 15px; - margin-bottom: 15px; + margin-bottom: 12px; + height: 60px; + margin-top: -15px; + padding-top: 15px; li { display: inline-block; a { padding: 15px; + font-size: 20px; + color: #7f8fa4; + border-bottom: 2px solid transparent; + + &:hover, &:active, &:focus { + text-decoration: none; + } } &.active a { - color: #666; + color: #4c4e54; + border-bottom: 2px solid #1cacfc; } } } diff --git a/app/assets/stylesheets/generic/header.scss b/app/assets/stylesheets/generic/header.scss index 6a29b32e19..9825be8538 100644 --- a/app/assets/stylesheets/generic/header.scss +++ b/app/assets/stylesheets/generic/header.scss @@ -24,29 +24,28 @@ header { z-index: 100; margin-bottom: 0; min-height: $header-height; + background-color: #fff; border: none; border-bottom: 1px solid #EEE; .container-fluid { - background: #FFF; width: 100% !important; filter: none; + padding: 0; .nav > li > a { - color: #888; - font-size: 14px; + color: #7f8fa4; + font-size: 18px; padding: 0; - background-color: #f5f5f5; margin: ($header-height - 28) / 2 0; margin-left: 10px; - border-radius: 40px; height: 28px; width: 28px; line-height: 28px; text-align: center; &:hover, &:focus, &:active { - background-color: #EEE; + background-color: #FFF; } } @@ -70,16 +69,16 @@ header { .title { margin: 0; overflow: hidden; - font-size: 18px; + font-size: 20px; line-height: $header-height; - font-weight: bold; - color: #444; + font-weight: normal; + color: #4c4e54; text-overflow: ellipsis; vertical-align: top; white-space: nowrap; a { - color: #444; + color: #4c4e54; &:hover { text-decoration: underline; } @@ -94,7 +93,7 @@ header { .search { margin-right: 10px; margin-left: 10px; - margin-top: ($header-height - 28) / 2; + margin-top: ($header-height - 36) / 2; form { margin: 0; @@ -105,13 +104,8 @@ header { width: 220px; background-image: image-url("icon-search.png"); background-repeat: no-repeat; - background-position: 10px; - height: inherit; - padding: 4px 6px; - padding-left: 25px; - font-size: 13px; - background-color: #f5f5f5; - border-color: #f5f5f5; + background-position: 195px; + @include input-big; &:focus { @include box-shadow(none); diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 320bdb1c76..160520d5e8 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -18,13 +18,22 @@ } .content-wrapper { + min-height: 100vh; width: 100%; padding: 20px; - background: #FFF; + background: #f1f4f8; + + .container-fluid { + background: #FFF; + padding-top: 15px; + padding-bottom: 15px; + border: 1px solid #e7e9ed; + min-height: 90vh; + } } .nav-sidebar { - margin-top: 29 + $header-height; + margin-top: 14 + $header-height; margin-bottom: 50px; transition-duration: .3s; list-style: none; @@ -44,12 +53,13 @@ a { padding: 8px 15px; - font-size: 13px; - line-height: 18px; + font-size: 16px; + line-height: 24px; color: $gray; display: block; text-decoration: none; - padding-left: 16px; + padding-left: 22px; + font-weight: normal; &:hover { text-decoration: none; @@ -60,9 +70,9 @@ } i { - width: 20px; + width: 16px; color: $gray-light; - margin-right: 23px; + margin-right: 13px; } .count { @@ -135,11 +145,11 @@ .collapse-nav a { position: fixed; - top: $header-height; - left: 198px; + top: 0; + left: 202px; font-size: 13px; background: transparent; - width: 32px; + width: 28px; height: 28px; text-align: center; line-height: 28px; @@ -176,16 +186,18 @@ } .sidebar-user { + padding: 12px 22px; position: fixed; bottom: 0; width: $sidebar_width; - padding: 10px; overflow: hidden; transition-duration: .3s; .username { - margin-top: 5px; + margin-left: 10px; width: $sidebar_width - 2 * 10px; + font-size: 16px; + line-height: 49px; } } @@ -202,12 +214,12 @@ float: left; height: $header-height; width: 100%; - padding: ($header-height - 36 ) / 2 8px; + padding: 12px 22px; overflow: hidden; img { - width: 36px; - height: 36px; + width: 48px; + height: 48px; float: left; } @@ -219,8 +231,8 @@ float: left; margin: 0; margin-left: 14px; - font-size: 18px; - line-height: $header-height - 14; + font-size: 20px; + line-height: 49px; font-weight: normal; } } diff --git a/app/assets/stylesheets/pages/dashboard.scss b/app/assets/stylesheets/pages/dashboard.scss index c1103a1c2e..01ee41d0fa 100644 --- a/app/assets/stylesheets/pages/dashboard.scss +++ b/app/assets/stylesheets/pages/dashboard.scss @@ -38,7 +38,7 @@ float: left; .avatar { - @include border-radius(0px); + @include border-radius(50%); } .identicon { diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 488dded549..0887837b86 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -253,12 +253,22 @@ pre.light-well { } .projects-search-form { - max-width: 600px; - margin: 0 auto; - margin-bottom: 20px; + margin: -15px; + background-color: #f8fafc; + padding: 18px; + margin-bottom: 10px; + border-top: 1px solid #e7e9ed; + border-bottom: 1px solid #e7e9ed; - input { - border-color: #BBB; + + .projects-list-filter { + @include input-big; + padding: 5px 18px; + } + + .btn { + @include btn-big; + padding: 5px 18px; } } @@ -269,20 +279,36 @@ pre.light-well { @include basic-list; .project-row { + padding: 18px; + border-color: #f1f2f4; + margin: 0 -15px; + + &.no-description { + .project { + line-height: 38px; + } + } + .project-full-name { @include str-truncated; - font-weight: bold; - font-size: 15px; + font-weight: 500; + font-size: 16px; + color: #4c4e54; + } + + .pull-right.light { + line-height: 38px; + color: #7f8fa4; } .project-description { - color: #888; - font-size: 13px; + color: #7f8fa4; + font-size: 16px; p { @include str-truncated; margin-bottom: 0; - color: #888; + color: #7f8fa4; } } } @@ -290,4 +316,5 @@ pre.light-well { .panel .projects-list li { padding: 10px 15px; + margin: 0; } diff --git a/app/assets/stylesheets/themes/gitlab-theme.scss b/app/assets/stylesheets/themes/gitlab-theme.scss index 77b62c3153..57cb8a78b9 100644 --- a/app/assets/stylesheets/themes/gitlab-theme.scss +++ b/app/assets/stylesheets/themes/gitlab-theme.scss @@ -9,7 +9,7 @@ @mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) { .page-with-sidebar { .header-logo { - background-color: $color-darker; + background-color: $color; border-color: $color-darker; a { @@ -17,7 +17,7 @@ } &:hover { - background-color: $color-dark; + background-color: $color-darker; a { color: #FFF; } @@ -26,7 +26,7 @@ .collapse-nav a { color: #FFF; - background: $color; + background: $color-darker; } .sidebar-wrapper { @@ -83,7 +83,7 @@ } $theme-blue: #2980B9; -$theme-charcoal: #474D57; +$theme-charcoal: #333c47; $theme-graphite: #888888; $theme-gray: #373737; $theme-green: #019875; @@ -95,7 +95,7 @@ body { } &.ui_charcoal { - @include gitlab-theme(#979DA7, $theme-charcoal, #373D47, #24272D); + @include gitlab-theme(#c5d0de, $theme-charcoal, #2b333d, #24272D); } &.ui_graphite { diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 0104d7198d..9a9282de22 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -14,7 +14,7 @@ = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user' do - = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s32' + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s48' .username = current_user.username .content-wrapper diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml index 4bfdf4d55f..fdedcf97cf 100644 --- a/app/views/shared/projects/_project.html.haml +++ b/app/views/shared/projects/_project.html.haml @@ -1,6 +1,7 @@ - avatar = true unless local_assigns[:avatar] == false - stars = true unless local_assigns[:stars] == false -- css_class = nil unless local_assigns[:css_class] +- css_class = '' unless local_assigns[:css_class] +- css_class += " no-description" unless project.description.present? %li.project-row{ class: css_class } = cache [project.namespace, project, controller.controller_name, controller.action_name, 'v2'] do = link_to project_path(project), class: dom_class(project) do From b879407695f71a11cbc69a24623a71e0e2ff6e92 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 13:24:35 +0200 Subject: [PATCH 099/153] Fix collapsed sidebar Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/variables.scss | 2 +- app/assets/stylesheets/generic/sidebar.scss | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index f492530a13..81c1ab1c38 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -5,7 +5,7 @@ $gl-link-color: #446e9b; $nprogress-color: #c0392b; $gl-font-size: 14px; $list-font-size: 15px; -$sidebar_collapsed_width: 52px; +$sidebar_collapsed_width: 62px; $sidebar_width: 230px; $avatar_radius: 50%; $code_font_size: 13px; diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 160520d5e8..603aef79d0 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -124,20 +124,26 @@ .sidebar-wrapper { width: $sidebar_collapsed_width; + .header-logo a { + padding-left: 7px; + } + .nav-sidebar { width: $sidebar_collapsed_width; - li a { - padding-left: 16px; + li a i { + margin-right: 20px; } } .collapse-nav a { left: 0px; + opacity: 0.6; width: $sidebar_collapsed_width; } .sidebar-user { + padding-left: 7px; width: $sidebar_collapsed_width; } } From 418dd5ebf865799a006cba37f956f7fd33cc820e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 18:41:30 +0200 Subject: [PATCH 100/153] Collapse sidebar button at the bottom Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/sidebar.scss | 12 +++++------- app/assets/stylesheets/themes/gitlab-theme.scss | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 603aef79d0..c2bad93ecb 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -138,7 +138,6 @@ .collapse-nav a { left: 0px; - opacity: 0.6; width: $sidebar_collapsed_width; } @@ -150,15 +149,14 @@ } .collapse-nav a { + width: $sidebar_width; position: fixed; - top: 0; - left: 202px; + bottom: 0; font-size: 13px; background: transparent; - width: 28px; - height: 28px; + height: 40px; text-align: center; - line-height: 28px; + line-height: 40px; transition-duration: .3s; } @@ -194,7 +192,7 @@ .sidebar-user { padding: 12px 22px; position: fixed; - bottom: 0; + bottom: 40px; width: $sidebar_width; overflow: hidden; transition-duration: .3s; diff --git a/app/assets/stylesheets/themes/gitlab-theme.scss b/app/assets/stylesheets/themes/gitlab-theme.scss index 57cb8a78b9..644433f9cb 100644 --- a/app/assets/stylesheets/themes/gitlab-theme.scss +++ b/app/assets/stylesheets/themes/gitlab-theme.scss @@ -26,7 +26,7 @@ .collapse-nav a { color: #FFF; - background: $color-darker; + background: $color; } .sidebar-wrapper { From c5786649c98ded6f1c930d9da8b916da195a59a7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 18:47:36 +0200 Subject: [PATCH 101/153] Keep header fluid for big res Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/header/_default.html.haml | 2 +- app/views/layouts/header/_public.html.haml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 0b630b55c7..3ad06088c0 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -1,5 +1,5 @@ %header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } - %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" } + %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content %button.navbar-toggle{type: 'button'} %span.sr-only Toggle navigation diff --git a/app/views/layouts/header/_public.html.haml b/app/views/layouts/header/_public.html.haml index af4b9ba58f..265937c7f4 100644 --- a/app/views/layouts/header/_public.html.haml +++ b/app/views/layouts/header/_public.html.haml @@ -1,5 +1,5 @@ %header.navbar.navbar-fixed-top.navbar-gitlab{ class: nav_header_class } - %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" } + %div{ class: fluid_layout ? "container-fluid" : "container-fluid" } .header-content - unless current_controller?('sessions') .pull-right From d0cfa4651c08cc6da124baed30d316d9b607f619 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 18:59:48 +0200 Subject: [PATCH 102/153] Avoid horizontal scroll in sidebar Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/sidebar.scss | 20 ++++++++++++++----- .../stylesheets/themes/gitlab-theme.scss | 2 +- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index c2bad93ecb..88d6c7ca6d 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -118,21 +118,31 @@ } @mixin folded-sidebar { - padding-left: 50px; + padding-left: 60px; transition-duration: .3s; .sidebar-wrapper { width: $sidebar_collapsed_width; - .header-logo a { - padding-left: 7px; + .header-logo { + width: $sidebar_collapsed_width; + + a { + padding-left: 7px; + + .gitlab-text-container { + display: none; + } + } } .nav-sidebar { width: $sidebar_collapsed_width; - li a i { - margin-right: 20px; + li a { + span { + display: none; + } } } diff --git a/app/assets/stylesheets/themes/gitlab-theme.scss b/app/assets/stylesheets/themes/gitlab-theme.scss index 644433f9cb..d523bb8952 100644 --- a/app/assets/stylesheets/themes/gitlab-theme.scss +++ b/app/assets/stylesheets/themes/gitlab-theme.scss @@ -10,7 +10,7 @@ .page-with-sidebar { .header-logo { background-color: $color; - border-color: $color-darker; + border-color: $color; a { color: $color-light; From 6fb7311e6e8941be898d7eb4eaa3ff6664f426d2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 2 Sep 2015 22:28:40 +0200 Subject: [PATCH 103/153] Fix home page for mobile devices Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 3 +++ app/assets/stylesheets/generic/header.scss | 1 + app/assets/stylesheets/generic/mobile.scss | 17 +++++++++++++++++ app/views/dashboard/_projects_head.html.haml | 2 +- app/views/layouts/header/_default.html.haml | 2 +- 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 549234d8d6..eaa1fe07b0 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -371,6 +371,8 @@ table { } .center-top-menu { + padding: 0; + margin: 0; list-style: none; text-align: center; margin-top: 5px; @@ -385,6 +387,7 @@ table { a { padding: 15px; font-size: 20px; + line-height: 27px; color: #7f8fa4; border-bottom: 2px solid transparent; diff --git a/app/assets/stylesheets/generic/header.scss b/app/assets/stylesheets/generic/header.scss index 9825be8538..d362f179c5 100644 --- a/app/assets/stylesheets/generic/header.scss +++ b/app/assets/stylesheets/generic/header.scss @@ -55,6 +55,7 @@ header { border-radius: 0; position: absolute; right: 2px; + top: 15px; &:hover { background-color: #EEE; diff --git a/app/assets/stylesheets/generic/mobile.scss b/app/assets/stylesheets/generic/mobile.scss index bb7b9356c7..36ae126f86 100644 --- a/app/assets/stylesheets/generic/mobile.scss +++ b/app/assets/stylesheets/generic/mobile.scss @@ -80,6 +80,23 @@ %ul.notes .note-role, .note-actions { display: none; } + + .center-top-menu { + height: 45px; + + li a { + font-size: 14px; + padding: 19px 10px; + } + } + + .projects-search-form { + margin: 0 -5px !important; + + .btn { + display: none; + } + } } @media (max-width: $screen-sm-max) { diff --git a/app/views/dashboard/_projects_head.html.haml b/app/views/dashboard/_projects_head.html.haml index f7be194c69..9ba12036f2 100644 --- a/app/views/dashboard/_projects_head.html.haml +++ b/app/views/dashboard/_projects_head.html.haml @@ -5,6 +5,6 @@ = nav_link(page: starred_dashboard_projects_path) do = link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do Starred Projects - = nav_link(page: [explore_root_path, trending_explore_projects_path, starred_explore_projects_path, explore_projects_path]) do + = nav_link(page: [explore_root_path, trending_explore_projects_path, starred_explore_projects_path, explore_projects_path], html_options: { class: 'hidden-xs' }) do = link_to explore_root_path, title: 'Explore', data: {toggle: 'tooltip', placement: 'bottom'} do Explore Projects diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 3ad06088c0..3892f71c0e 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -17,7 +17,7 @@ = link_to admin_root_path, title: 'Admin area', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('wrench fw') - if current_user.can_create_project? - %li.hidden-xs + %li = link_to new_project_path, title: 'New project', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('plus fw') %li From 59d9dc44088b7d4cd75c57b89a24497335c20895 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 10:24:10 +0200 Subject: [PATCH 104/153] Reduce margin under projects filter Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/projects.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 0887837b86..e0f9b8cd19 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -256,7 +256,7 @@ pre.light-well { margin: -15px; background-color: #f8fafc; padding: 18px; - margin-bottom: 10px; + margin-bottom: 0px; border-top: 1px solid #e7e9ed; border-bottom: 1px solid #e7e9ed; From 63ba17c4db4984bb3d060fdf33d25b7038aa1856 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 13:44:54 +0200 Subject: [PATCH 105/153] Redesign activity feed on dashboard and project pages Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/activities.js.coffee | 2 +- app/assets/stylesheets/base/gl_variables.scss | 12 ++- app/assets/stylesheets/base/variables.scss | 2 +- app/assets/stylesheets/generic/blocks.scss | 9 +++ app/assets/stylesheets/generic/buttons.scss | 16 ++++ app/assets/stylesheets/pages/events.scss | 74 ++++++------------- app/helpers/events_helper.rb | 10 +-- app/views/dashboard/_activities.html.haml | 4 +- app/views/events/_event.html.haml | 4 +- app/views/projects/_activity.html.haml | 3 +- app/views/shared/_event_filter.html.haml | 2 +- 11 files changed, 70 insertions(+), 68 deletions(-) diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee index 777c62dc1b..f1afa62f94 100644 --- a/app/assets/javascripts/activities.js.coffee +++ b/app/assets/javascripts/activities.js.coffee @@ -1,7 +1,7 @@ class @Activities constructor: -> Pager.init 20, true - $(".event_filter_link").bind "click", (event) => + $(".event-filter .btn").bind "click", (event) => event.preventDefault() @toggleFilter($(event.currentTarget)) @reloadActivities() diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 56f4c794e1..bb49ed16c8 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -43,8 +43,9 @@ $font-size-base: $gl-font-size; //## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). $padding-base-vertical: 6px; -$padding-base-horizontal: 14px; - +$padding-base-horizontal: 18px; +$component-active-color: #fff; +$component-active-bg: $brand-info; //== Forms // @@ -131,3 +132,10 @@ $code-bg: #f9f2f4; $kbd-color: #fff; $kbd-bg: #333; + +//== Buttons +// +//## +$btn-default-color: #7f8fa4; +$btn-default-bg: #fff; +$btn-default-border: #e7e9ed; diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 81c1ab1c38..8c257c5453 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -21,7 +21,7 @@ $fixed-layout-width: 1200px; */ $gl-primary: #446e9b; $gl-success: #44c679; -$gl-info: #029ACF; +$gl-info: #00aaff; $gl-warning: #EB9532; $gl-danger: #d9534f; diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 3536a68f41..1080bc1baa 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -17,3 +17,12 @@ font-size: 16px; line-height: 36px; } + +.gray-content-block { + margin: -15px; + background-color: #f8fafc; + padding: 18px; + margin-bottom: 0px; + border-top: 1px solid #e7e9ed; + border-bottom: 1px solid #e7e9ed; +} diff --git a/app/assets/stylesheets/generic/buttons.scss b/app/assets/stylesheets/generic/buttons.scss index cd6bf64c0a..e823750909 100644 --- a/app/assets/stylesheets/generic/buttons.scss +++ b/app/assets/stylesheets/generic/buttons.scss @@ -72,3 +72,19 @@ } } } + +.btn-group-next { + .btn { + padding: 9px 0px; + font-size: 15px; + color: #7f8fa4; + border-color: #e7e9ed; + width: 140px; + + &.active { + border-color: $gl-info; + background: $gl-info; + color: #fff; + } + } +} diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index d4af7506d5..c570bb1e43 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -1,39 +1,13 @@ -/** - * Events labels - * - */ -.event_label { - &.pushed { - padding: 0 2px; - } - - &.opened { - padding: 0 2px; - } - - &.closed { - padding: 0 2px; - } - - &.merged { - padding: 0 2px; - } - - &.left, - &.joined { - padding: 0 2px; - float: none; - } -} - /** * Dashboard events feed * */ .event-item { - &:first-child { - padding-top: 0; - } + font-size: 16px; + padding: 18px; + margin: 0 -15px; + border-bottom: 1px solid #f1f2f4; + color: #7f8fa4; &.event-inline { .avatar { @@ -42,29 +16,35 @@ } } - padding: 12px 0px; - border-bottom: 1px solid #eee; + a { + color: #4c4e54; + } + + .avatar { + margin-right: 15px; + } + .event-title { - max-width: 70%; @include str-truncated(calc(100% - 174px)); + + max-width: 70%; font-weight: 500; - font-size: 14px; + .author_name { color: #333; } } + .event-body { - font-size: 13px; - margin-left: 35px; + margin-left: 60px; margin-right: 80px; - color: #777; .event-note { margin-top: 5px; word-wrap: break-word; .md { - font-size: 13px; + font-size: 16px; iframe.twitter-share-button { vertical-align: bottom; @@ -116,7 +96,7 @@ &:last-child { border:none } .event_commits { - margin-top: 5px; + margin-top: 9px; li { &.commit { @@ -125,10 +105,12 @@ padding-left: 0; border: none; .commit-row-title { - font-size: 12px; + font-size: 16px; } } + &.commits-stat { + margin-top: 3px; display: block; padding: 3px; padding-left: 0; @@ -142,7 +124,6 @@ .event-item-timestamp { float: right; - color: #999; line-height: 22px; } } @@ -186,12 +167,3 @@ } } } - -.event_filter { - li a { - font-size: 13px; - padding: 5px 10px; - background: $background-color; - margin-left: 4px; - } -} diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 8428281f8f..13347b6eec 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -27,16 +27,14 @@ module EventsHelper key = key.to_s active = 'active' if @event_filter.active?(key) link_opts = { - class: 'event_filter_link', + class: "event-filter-link btn btn-default #{active}", id: "#{key}_event_filter", title: "Filter by #{tooltip.downcase}", data: { toggle: 'tooltip', placement: 'top' } } - content_tag :li, class: "filter_icon #{active}" do - link_to request.path, link_opts do - icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) - end + link_to request.path, link_opts do + content_tag(:span, ' ' + tooltip) end end @@ -66,7 +64,7 @@ module EventsHelper end words << "at" elsif event.target - words << "##{event.target_iid}:" + words << "##{event.target_iid}:" words << event.target.title if event.target.respond_to?(:title) words << "at" end diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml index 213b5d65b3..1db56542af 100644 --- a/app/views/dashboard/_activities.html.haml +++ b/app/views/dashboard/_activities.html.haml @@ -1,13 +1,13 @@ .hidden-xs = render "events/event_last_push", event: @last_push +.gray-content-block - if current_user %ul.nav.nav-pills.event_filter.pull-right %li.pull-right = link_to dashboard_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do %i.fa.fa-rss - = render 'shared/event_filter' - %hr + .content_list = spinner diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index 0faab4458e..3cd65edacb 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -3,8 +3,8 @@ .event-item-timestamp #{time_ago_with_tooltip(event.created_at)} - = cache [event, "v1"] do - = image_tag avatar_icon(event.author_email, 24), class: "avatar s24", alt:'' + = cache [event, "v2"] do + = image_tag avatar_icon(event.author_email, 48), class: "avatar s48", alt:'' - if event.created_project? = render "events/event/created_project", event: event - elsif event.push? diff --git a/app/views/projects/_activity.html.haml b/app/views/projects/_activity.html.haml index ee02b7f6a6..86133768d7 100644 --- a/app/views/projects/_activity.html.haml +++ b/app/views/projects/_activity.html.haml @@ -1,5 +1,5 @@ = render 'projects/last_push' -.hidden-xs +.gray-content-block - if current_user %ul.nav.nav-pills.event_filter.pull-right %li @@ -7,7 +7,6 @@ %i.fa.fa-rss = render 'shared/event_filter' - %hr .content_list{:"data-href" => activity_project_path(@project)} = spinner diff --git a/app/views/shared/_event_filter.html.haml b/app/views/shared/_event_filter.html.haml index 334db60690..8495774acc 100644 --- a/app/views/shared/_event_filter.html.haml +++ b/app/views/shared/_event_filter.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-pills.event_filter +.btn-group.btn-group-next.event-filter = event_filter_link EventFilter.push, 'Push events' = event_filter_link EventFilter.merged, 'Merge events' = event_filter_link EventFilter.comments, 'Comments' From 7f045a6b4a2fadce8aa6bf6d1b1378519fc4000f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 14:24:27 +0200 Subject: [PATCH 106/153] Apply new font size and padding Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_variables.scss | 11 ++++++++--- app/assets/stylesheets/base/mixins.scss | 3 --- app/assets/stylesheets/base/variables.scss | 4 ++-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index bb49ed16c8..23aa8029fb 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -42,7 +42,7 @@ $font-size-base: $gl-font-size; // //## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). -$padding-base-vertical: 6px; +$padding-base-vertical: 9px; $padding-base-horizontal: 18px; $component-active-color: #fff; $component-active-bg: $brand-info; @@ -52,8 +52,8 @@ $component-active-bg: $brand-info; //## $input-color: $text-color; -$input-border: #DDD; -$input-border-focus: $brand-info; +$input-border: #e7e9ed; +$input-border-focus: #7F8FA4; $legend-color: $text-color; @@ -139,3 +139,8 @@ $kbd-bg: #333; $btn-default-color: #7f8fa4; $btn-default-bg: #fff; $btn-default-border: #e7e9ed; + +//== Nav +// +//## +$nav-link-padding: 13px 18px; diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index bf251d896e..66417c2bdf 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -55,9 +55,6 @@ } @mixin md-typography { - font-size: 15px; - line-height: 1.5; - img { max-width: 100%; } diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 8c257c5453..5471a93dad 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -3,8 +3,8 @@ $hover: #FFFAF1; $gl-text-color: #222222; $gl-link-color: #446e9b; $nprogress-color: #c0392b; -$gl-font-size: 14px; -$list-font-size: 15px; +$gl-font-size: 16px; +$list-font-size: 16px; $sidebar_collapsed_width: 62px; $sidebar_width: 230px; $avatar_radius: 50%; From 1d6a65a2aba6382564f761ec7881e582fc6d055f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 14:43:31 +0200 Subject: [PATCH 107/153] Improve paddings and set new colors for links Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/layout.scss | 1 - app/assets/stylesheets/base/variables.scss | 3 ++- app/assets/stylesheets/generic/blocks.scss | 2 +- app/assets/stylesheets/generic/common.scss | 10 +++++----- app/assets/stylesheets/generic/selects.scss | 8 ++++---- app/assets/stylesheets/generic/sidebar.scss | 3 +-- app/assets/stylesheets/pages/events.scss | 4 ++-- app/assets/stylesheets/pages/projects.scss | 4 ++-- app/assets/stylesheets/pages/tree.scss | 6 +++--- app/views/events/_commit.html.haml | 2 +- 10 files changed, 21 insertions(+), 22 deletions(-) diff --git a/app/assets/stylesheets/base/layout.scss b/app/assets/stylesheets/base/layout.scss index 734b95e26c..b91c15d891 100644 --- a/app/assets/stylesheets/base/layout.scss +++ b/app/assets/stylesheets/base/layout.scss @@ -21,7 +21,6 @@ html { margin-top: 30px; } - .container-limited { max-width: $fixed-layout-width; } diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 5471a93dad..7d7f481cc4 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -1,7 +1,7 @@ $style_color: #474D57; $hover: #FFFAF1; $gl-text-color: #222222; -$gl-link-color: #446e9b; +$gl-link-color: #4c4e54; $nprogress-color: #c0392b; $gl-font-size: 16px; $list-font-size: 16px; @@ -14,6 +14,7 @@ $border-color: #E5E5E5; $background-color: #f5f5f5; $header-height: 73px; $fixed-layout-width: 1200px; +$gl-gray: #7f8fa4; /* diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 1080bc1baa..16619502a5 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -19,7 +19,7 @@ } .gray-content-block { - margin: -15px; + margin: -18px; background-color: #f8fafc; padding: 18px; margin-bottom: 0px; diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index eaa1fe07b0..17dec22861 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -1,5 +1,5 @@ /** COLORS **/ -.cgray { color: gray } +.cgray { color: $gl-gray; } .clgray { color: #BBB } .cred { color: #D12F19 } .cgreen { color: #4a2 } @@ -20,7 +20,7 @@ .underlined-link { text-decoration: underline; } .hint { font-style: italic; color: #999; } -.light { color: #888 } +.light { color: $gl-gray; } .slead { color: #666; @@ -376,10 +376,10 @@ table { list-style: none; text-align: center; margin-top: 5px; - margin-bottom: 12px; + margin-bottom: 19px; height: 60px; - margin-top: -15px; - padding-top: 15px; + margin-top: -18px; + padding-top: 18px; li { display: inline-block; diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss index d8e0dc028d..c6a1047e01 100644 --- a/app/assets/stylesheets/generic/selects.scss +++ b/app/assets/stylesheets/generic/selects.scss @@ -3,9 +3,9 @@ .select2-choice { background: #FFF; border-color: #DDD; - height: 34px; - padding: 6px 14px; - font-size: 14px; + height: 42px; + padding: 8px 18px; + font-size: $gl-font-size; line-height: 1.42857143; @include border-radius(4px); @@ -13,7 +13,7 @@ .select2-arrow { background: #FFF; border-left: none; - padding-top: 3px; + padding-top: 5px; } } } diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 88d6c7ca6d..7f3688801a 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -25,8 +25,7 @@ .container-fluid { background: #FFF; - padding-top: 15px; - padding-bottom: 15px; + padding: 18px; border: 1px solid #e7e9ed; min-height: 90vh; } diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index c570bb1e43..a90b05da29 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -5,7 +5,7 @@ .event-item { font-size: 16px; padding: 18px; - margin: 0 -15px; + margin: 0 -18px; border-bottom: 1px solid #f1f2f4; color: #7f8fa4; @@ -36,7 +36,7 @@ } .event-body { - margin-left: 60px; + margin-left: 63px; margin-right: 80px; .event-note { diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index e0f9b8cd19..f8e3d861c0 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -253,7 +253,7 @@ pre.light-well { } .projects-search-form { - margin: -15px; + margin: -18px; background-color: #f8fafc; padding: 18px; margin-bottom: 0px; @@ -281,7 +281,7 @@ pre.light-well { .project-row { padding: 18px; border-color: #f1f2f4; - margin: 0 -15px; + margin: 0 -18px; &.no-description { .project { diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index 81e2aa7bb9..587d09a04a 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -63,15 +63,15 @@ padding-right: 8px; .commit-author-name { - color: gray; + color: $gl-gray; } } .tree_commit { - color: gray; + color: $gl-gray; .tree-commit-link { - color: gray; + color: $gl-gray; &:hover { text-decoration: underline; diff --git a/app/views/events/_commit.html.haml b/app/views/events/_commit.html.haml index 742b74a67c..ad63841ccf 100644 --- a/app/views/events/_commit.html.haml +++ b/app/views/events/_commit.html.haml @@ -1,5 +1,5 @@ %li.commit .commit-row-title = link_to truncate_sha(commit[:id]), namespace_project_commit_path(project.namespace, project, commit[:id]), class: "commit_short_id", alt: '' -   + · = gfm event_commit_title(commit[:message]), project: project From 8ec59bd18bcacf13c012a34b3e37c2c9167bcc65 Mon Sep 17 00:00:00 2001 From: "Artem V. Navrotskiy" Date: Sat, 29 Aug 2015 12:52:21 +0300 Subject: [PATCH 108/153] Add API method for get user by ID of an SSH key --- CHANGELOG | 1 + doc/api/users.md | 45 ++++++++++++++++++++++++++++++++++ lib/api/api.rb | 1 + lib/api/entities.rb | 4 +++ lib/api/keys.rb | 20 +++++++++++++++ spec/requests/api/keys_spec.rb | 39 +++++++++++++++++++++++++++++ 6 files changed, 110 insertions(+) create mode 100644 lib/api/keys.rb create mode 100644 spec/requests/api/keys_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 339df2bcac..7a773a7ed1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -35,6 +35,7 @@ v 8.0.0 (unreleased) - Added Drone CI integration (Kirill Zaitsev) - Refactored service API and added automatically service docs generator (Kirill Zaitsev) - Added web_url key project hook_attrs (Kirill Zaitsev) + - Add ability to get user information by ID of an SSH key via the API v 7.14.1 - Improve abuse reports management from admin area diff --git a/doc/api/users.md b/doc/api/users.md index 7ba2db248f..eb6726b60d 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -150,6 +150,51 @@ Parameters: } ``` +### Get SSH key with user by ID of an SSH key + +Get SSH key with user by ID of an SSH key. Note only administrators can lookup SSH key with user by ID of an SSH key. + +``` +GET /keys/:id +``` + +Parameters: + +- `id` (required) - The ID of an SSH key + +```json +{ + "id": 1, + "title": "Sample key 25", + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1256k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", + "created_at": "2015-09-03T07:24:44.627Z", + "user": { + "name": "John Smith", + "username": "john_smith", + "id": 25, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/cfa35b8cd2ec278026357769582fa563?s=40\u0026d=identicon", + "web_url": "http://localhost:3000/u/john_smith", + "created_at": "2015-09-03T07:24:01.670Z", + "is_admin": false, + "bio": null, + "skype": "", + "linkedin": "", + "twitter": "", + "website_url": "", + "email": "john@example.com", + "theme_id": 2, + "color_scheme_id": 1, + "projects_limit": 10, + "current_sign_in_at": null, + "identities": [], + "can_create_group": true, + "can_create_project": true, + "two_factor_enabled": false + } +} +``` + ## User creation Creates a new user. Note only administrators can create new users. diff --git a/lib/api/api.rb b/lib/api/api.rb index eebd44ea5b..c09488d354 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -50,5 +50,6 @@ module API mount Branches mount Labels mount Settings + mount Keys end end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 1f9dd6bc15..8dddcd7ccc 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -199,6 +199,10 @@ module API expose :id, :title, :key, :created_at end + class SSHKeyWithUser < SSHKey + expose :user, using: Entities::UserFull + end + class Note < Grape::Entity expose :id expose :note, as: :body diff --git a/lib/api/keys.rb b/lib/api/keys.rb new file mode 100644 index 0000000000..2b723b7950 --- /dev/null +++ b/lib/api/keys.rb @@ -0,0 +1,20 @@ +module API + # Keys API + class Keys < Grape::API + before { authenticate! } + + resource :keys do + # Get single ssh key by id. Only available to admin users. + # + # Example Request: + # GET /keys/:id + get ":id" do + authenticated_as_admin! + + key = Key.find(params[:id]) + + present key, with: Entities::SSHKeyWithUser + end + end + end +end diff --git a/spec/requests/api/keys_spec.rb b/spec/requests/api/keys_spec.rb new file mode 100644 index 0000000000..d2b87f8871 --- /dev/null +++ b/spec/requests/api/keys_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' + +describe API::API, api: true do + include ApiHelpers + + let(:user) { create(:user) } + let(:admin) { create(:admin) } + let(:key) { create(:key, user: user) } + let(:email) { create(:email, user: user) } + + describe 'GET /keys/:uid' do + before { admin } + + context 'when unauthenticated' do + it 'should return authentication error' do + get api("/keys/#{key.id}") + expect(response.status).to eq(401) + end + end + + context 'when authenticated' do + it 'should return 404 for non-existing key' do + get api('/keys/999999', admin) + expect(response.status).to eq(404) + expect(json_response['message']).to eq('404 Not found') + end + + it 'should return single ssh key with user information' do + user.keys << key + user.save + get api("/keys/#{key.id}", admin) + expect(response.status).to eq(200) + expect(json_response['title']).to eq(key.title) + expect(json_response['user']['id']).to eq(user.id) + expect(json_response['user']['username']).to eq(user.username) + end + end + end +end From 6d651a0260066185fe39b1381d54a5281d13a7f8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 15:09:55 +0200 Subject: [PATCH 109/153] Increase use of variables in css Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/mixins.scss | 2 +- app/assets/stylesheets/generic/common.scss | 2 +- app/assets/stylesheets/generic/lists.scss | 14 ++++++++++++++ app/assets/stylesheets/pages/commits.scss | 6 +++--- app/assets/stylesheets/pages/events.scss | 8 ++++++++ app/assets/stylesheets/pages/projects.scss | 2 +- 6 files changed, 28 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 66417c2bdf..2fd6c192e3 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -187,7 +187,7 @@ &.light { a { - color: #777; + color: $gl-gray; } } } diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 17dec22861..7dfb19e907 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -376,7 +376,7 @@ table { list-style: none; text-align: center; margin-top: 5px; - margin-bottom: 19px; + margin-bottom: 18px; height: 60px; margin-top: -18px; padding-top: 18px; diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 4b7ff84de2..26c2234c8d 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -109,3 +109,17 @@ ul.bordered-list { li.task-list-item { list-style-type: none; } + +ul.content-list { + @include basic-list; + + margin: 0; + padding: 0; + + li { + padding: 18px; + border-color: #f1f2f4; + margin: 0 -18px; + } +} + diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss index 359f4073e8..de2ae93df3 100644 --- a/app/assets/stylesheets/pages/commits.scss +++ b/app/assets/stylesheets/pages/commits.scss @@ -52,7 +52,7 @@ li.commit { } .commit-row-message { - color: #444; + color: $gl-link-color; &:hover { text-decoration: underline; @@ -88,12 +88,12 @@ li.commit { } .commit-row-info { - color: #777; + color: $gl-gray; line-height: 24px; font-size: 13px; a { - color: #777; + color: $gl-gray; } .committed_ago { diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index a90b05da29..1d71a542f8 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -14,6 +14,14 @@ position: relative; top: -2px; } + + .event-title { + line-height: 44px; + } + + .event-item-timestamp { + line-height: 44px; + } } a { diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index f8e3d861c0..2095e73f55 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -184,7 +184,7 @@ ul.nav.nav-projects-tabs { .breadcrumb.repo-breadcrumb { padding: 0; - line-height: 34px; + line-height: 42px; background: white; border: none; font-size: 16px; From 1be79e8e7cd20abaec7d2efcbbf7d7fe4e2a0760 Mon Sep 17 00:00:00 2001 From: "Artem V. Navrotskiy" Date: Thu, 3 Sep 2015 16:32:21 +0300 Subject: [PATCH 110/153] Move get user by ID of an SSH key documentation to separate file --- doc/api/README.md | 1 + doc/api/keys.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ doc/api/users.md | 45 --------------------------------------------- 3 files changed, 47 insertions(+), 45 deletions(-) create mode 100644 doc/api/keys.md diff --git a/doc/api/README.md b/doc/api/README.md index f369c3fd97..6b8528de50 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -21,6 +21,7 @@ - [Groups](groups.md) - [Namespaces](namespaces.md) - [Settings](settings.md) +- [Keys](keys.md) ## Clients diff --git a/doc/api/keys.md b/doc/api/keys.md new file mode 100644 index 0000000000..faa6f212b4 --- /dev/null +++ b/doc/api/keys.md @@ -0,0 +1,46 @@ +# Keys + +## Get SSH key with user by ID of an SSH key + +Get SSH key with user by ID of an SSH key. Note only administrators can lookup SSH key with user by ID of an SSH key. + +``` +GET /keys/:id +``` + +Parameters: + +- `id` (required) - The ID of an SSH key + +```json +{ + "id": 1, + "title": "Sample key 25", + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1256k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", + "created_at": "2015-09-03T07:24:44.627Z", + "user": { + "name": "John Smith", + "username": "john_smith", + "id": 25, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/cfa35b8cd2ec278026357769582fa563?s=40\u0026d=identicon", + "web_url": "http://localhost:3000/u/john_smith", + "created_at": "2015-09-03T07:24:01.670Z", + "is_admin": false, + "bio": null, + "skype": "", + "linkedin": "", + "twitter": "", + "website_url": "", + "email": "john@example.com", + "theme_id": 2, + "color_scheme_id": 1, + "projects_limit": 10, + "current_sign_in_at": null, + "identities": [], + "can_create_group": true, + "can_create_project": true, + "two_factor_enabled": false + } +} +``` diff --git a/doc/api/users.md b/doc/api/users.md index eb6726b60d..7ba2db248f 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -150,51 +150,6 @@ Parameters: } ``` -### Get SSH key with user by ID of an SSH key - -Get SSH key with user by ID of an SSH key. Note only administrators can lookup SSH key with user by ID of an SSH key. - -``` -GET /keys/:id -``` - -Parameters: - -- `id` (required) - The ID of an SSH key - -```json -{ - "id": 1, - "title": "Sample key 25", - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt1256k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=", - "created_at": "2015-09-03T07:24:44.627Z", - "user": { - "name": "John Smith", - "username": "john_smith", - "id": 25, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/cfa35b8cd2ec278026357769582fa563?s=40\u0026d=identicon", - "web_url": "http://localhost:3000/u/john_smith", - "created_at": "2015-09-03T07:24:01.670Z", - "is_admin": false, - "bio": null, - "skype": "", - "linkedin": "", - "twitter": "", - "website_url": "", - "email": "john@example.com", - "theme_id": 2, - "color_scheme_id": 1, - "projects_limit": 10, - "current_sign_in_at": null, - "identities": [], - "can_create_group": true, - "can_create_project": true, - "two_factor_enabled": false - } -} -``` - ## User creation Creates a new user. Note only administrators can create new users. From aeeb31d6b7073921603fefd9118a50f28742009f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 15:46:13 +0200 Subject: [PATCH 111/153] Change some base colors in UI Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_variables.scss | 4 ++-- app/assets/stylesheets/base/mixins.scss | 6 ++++++ app/assets/stylesheets/base/variables.scss | 9 +++++---- app/assets/stylesheets/generic/common.scss | 2 +- app/assets/stylesheets/generic/lists.scss | 11 ----------- app/assets/stylesheets/generic/typography.scss | 5 +++++ app/assets/stylesheets/pages/dashboard.scss | 2 +- app/assets/stylesheets/pages/issues.scss | 2 +- app/assets/stylesheets/pages/merge_requests.scss | 2 +- app/assets/stylesheets/themes/gitlab-theme.scss | 4 ++++ app/views/groups/_projects.html.haml | 2 +- app/views/shared/_clone_panel.html.haml | 6 +++--- 12 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 23aa8029fb..1f71b0a52b 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -112,8 +112,8 @@ $alert-border-radius: 0; $panel-border-radius: 0; $panel-default-text: $text-color; -$panel-default-border: $border-color; -$panel-default-heading-bg: $background-color; +$panel-default-border: #E7E9ED; +$panel-default-heading-bg: #F8FAFC; //== Wells diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 2fd6c192e3..2d2e8b3ded 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -55,6 +55,12 @@ } @mixin md-typography { + color: #444; + + a { + color: #3084bb; + } + img { max-width: 100%; } diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 7d7f481cc4..b0cf1cb6f0 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -1,7 +1,8 @@ $style_color: #474D57; $hover: #FFFAF1; -$gl-text-color: #222222; -$gl-link-color: #4c4e54; +$gl-text-color: #7f8fa4; +$gl-header-color: #4c4e54; +$gl-link-color: #333c48; $nprogress-color: #c0392b; $gl-font-size: 16px; $list-font-size: 16px; @@ -10,8 +11,8 @@ $sidebar_width: 230px; $avatar_radius: 50%; $code_font_size: 13px; $code_line_height: 1.5; -$border-color: #E5E5E5; -$background-color: #f5f5f5; +$border-color: #E7E9ED; +$background-color: #F8FAFC; $header-height: 73px; $fixed-layout-width: 1200px; $gl-gray: #7f8fa4; diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 7dfb19e907..55569bebfa 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -23,7 +23,7 @@ .light { color: $gl-gray; } .slead { - color: #666; + color: $gl-gray; font-size: 15px; margin-bottom: 12px; font-weight: normal; diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 26c2234c8d..766992d7af 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -49,8 +49,6 @@ } } - .author { color: #999; } - .list-item-name { float: left; position: relative; @@ -71,15 +69,6 @@ font-size: $list-font-size; line-height: 18px; } - - .row_title { - color: $gray-dark; - - &:hover { - color: $text-color; - text-decoration: underline; - } - } } } diff --git a/app/assets/stylesheets/generic/typography.scss b/app/assets/stylesheets/generic/typography.scss index 34b4ee3e17..73034c84f9 100644 --- a/app/assets/stylesheets/generic/typography.scss +++ b/app/assets/stylesheets/generic/typography.scss @@ -9,6 +9,11 @@ margin-bottom: 5px; } +h1, h2, h3, h4, h5, h6 { + color: $gl-header-color; + font-weight: 500; +} + /** CODE **/ pre { font-family: $monospace_font; diff --git a/app/assets/stylesheets/pages/dashboard.scss b/app/assets/stylesheets/pages/dashboard.scss index 01ee41d0fa..008c6419f0 100644 --- a/app/assets/stylesheets/pages/dashboard.scss +++ b/app/assets/stylesheets/pages/dashboard.scss @@ -2,7 +2,7 @@ .side { .panel { .panel-heading { - background: #EEE; + background: $background-color; border-top-left-radius: 0; } border-top-left-radius: 0; diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index 3572f33e91..7928b6220f 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -10,7 +10,7 @@ } .issue-info { - color: #999; + color: $gl-gray; font-size: 13px; } diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index 10fce5b3da..f0fb68d342 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -136,7 +136,7 @@ } .merge-request-info { - color: #999; + color: $gl-gray; font-size: 13px; } diff --git a/app/assets/stylesheets/themes/gitlab-theme.scss b/app/assets/stylesheets/themes/gitlab-theme.scss index d523bb8952..8d9a0aae56 100644 --- a/app/assets/stylesheets/themes/gitlab-theme.scss +++ b/app/assets/stylesheets/themes/gitlab-theme.scss @@ -14,6 +14,10 @@ a { color: $color-light; + + h3 { + color: $color-light; + } } &:hover { diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index b2e32ced5e..9ac56b1e5f 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -7,4 +7,4 @@ = link_to new_project_path(namespace_id: @group.id), class: 'btn btn-success' do New project - = render 'shared/projects/list', projects: @projects, projects_limit: 20 + = render 'shared/projects/list', projects: @projects, projects_limit: 20, stars: false diff --git a/app/views/shared/_clone_panel.html.haml b/app/views/shared/_clone_panel.html.haml index 07672359db..2cd422e772 100644 --- a/app/views/shared/_clone_panel.html.haml +++ b/app/views/shared/_clone_panel.html.haml @@ -4,7 +4,7 @@ .input-group-btn %button{ | type: 'button', | - class: "btn btn-sm #{ 'active' if default_clone_protocol == 'ssh' }#{ ' has_tooltip' if current_user && current_user.require_ssh_key? }", | + class: "btn #{ 'active' if default_clone_protocol == 'ssh' }#{ ' has_tooltip' if current_user && current_user.require_ssh_key? }", | :"data-clone" => project.ssh_url_to_repo, | :"data-title" => "Add an SSH key to your profile
to pull or push via SSH", :"data-html" => "true", @@ -13,13 +13,13 @@ .input-group-btn %button{ | type: 'button', | - class: "btn btn-sm #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.require_password? }", | + class: "btn #{ 'active' if default_clone_protocol == 'http' }#{ ' has_tooltip' if current_user && current_user.require_password? }", | :"data-clone" => project.http_url_to_repo, | :"data-title" => "Set a password on your account
to pull or push via #{gitlab_config.protocol.upcase}", :"data-html" => "true", :"data-container" => "body"} = gitlab_config.protocol.upcase - = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control input-sm", readonly: true + = text_field_tag :project_clone, default_url_to_repo(project), class: "js-select-on-focus form-control", readonly: true - if project.kind_of?(Project) .input-group-addon .visibility-level-label.has_tooltip{'data-title' => "#{visibility_level_label(project.visibility_level)} project" } From 0195b085a191dfa07799dcc0f232f76954910124 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 17:21:48 +0200 Subject: [PATCH 112/153] Style groups page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/lists.scss | 4 ++++ app/views/dashboard/groups/index.html.haml | 11 +++++++---- app/views/shared/groups/_group.html.haml | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 766992d7af..04a98fc695 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -109,6 +109,10 @@ ul.content-list { padding: 18px; border-color: #f1f2f4; margin: 0 -18px; + + .avatar { + margin-right: 15px; + } } } diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml index fbe523b4b6..0c7f8a6f2f 100644 --- a/app/views/dashboard/groups/index.html.haml +++ b/app/views/dashboard/groups/index.html.haml @@ -1,14 +1,17 @@ - page_title "Groups" = render 'dashboard/groups_head' -.slead - Group members have access to all group projects. +.gray-content-block - if current_user.can_create_group? %span.pull-right.hidden-xs - = link_to new_group_path, class: "btn btn-new btn-sm" do + = link_to new_group_path, class: "btn btn-new" do %i.fa.fa-plus New Group -%ul.bordered-list + Welcome to the groups! + %br + Group members have access to all group projects. + +%ul.content-list - @group_members.each do |group_member| - group = group_member.group = render 'shared/groups/group', group: group, group_member: group_member diff --git a/app/views/shared/groups/_group.html.haml b/app/views/shared/groups/_group.html.haml index 229ae359bc..2d7f911e35 100644 --- a/app/views/shared/groups/_group.html.haml +++ b/app/views/shared/groups/_group.html.haml @@ -11,7 +11,7 @@ %i.fa.fa-sign-out Leave - = image_tag group_icon(group), class: "avatar s40 avatar-tile hidden-xs" + = image_tag group_icon(group), class: "avatar s48 hidden-xs" = link_to group, class: 'group-name' do %strong= group.name From 89df4a7922431b59c65c91199a93639663da667d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 18:19:31 +0200 Subject: [PATCH 113/153] New UI for explore groups and trending pages Signed-off-by: Dmitriy Zaporozhets --- app/views/explore/groups/index.html.haml | 6 +++--- app/views/explore/projects/trending.html.haml | 4 ++-- app/views/shared/groups/_group.html.haml | 4 +--- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index 80acb91436..86410db2b2 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -1,14 +1,14 @@ - page_title "Groups" - if current_user = render 'dashboard/groups_head' -.clearfix.append-bottom-10 +.gray-content-block.clearfix .pull-left = form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f| = hidden_field_tag :sort, @sort .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input", id: "groups_search" .form-group - = button_tag 'Search', class: "btn btn-primary wide" + = button_tag 'Search', class: "btn btn-default" .pull-right .dropdown.inline @@ -30,7 +30,7 @@ = link_to explore_groups_path(sort: sort_value_oldest_updated) do = sort_title_oldest_updated -%ul.bordered-list +%ul.content-list - @groups.each do |group| = render 'shared/groups/group', group: group - unless @groups.present? diff --git a/app/views/explore/projects/trending.html.haml b/app/views/explore/projects/trending.html.haml index 4c7e7d4473..1590bb9fc6 100644 --- a/app/views/explore/projects/trending.html.haml +++ b/app/views/explore/projects/trending.html.haml @@ -1,12 +1,12 @@ - page_title "Trending Projects" - if current_user = render 'dashboard/projects_head' -.explore-title + +.gray-content-block.explore-title %h3 Explore GitLab %p.lead Discover projects and groups. Share your projects with others -%hr .explore-trending-block .lead %i.fa.fa-comments-o diff --git a/app/views/shared/groups/_group.html.haml b/app/views/shared/groups/_group.html.haml index 2d7f911e35..444410b258 100644 --- a/app/views/shared/groups/_group.html.haml +++ b/app/views/shared/groups/_group.html.haml @@ -5,11 +5,9 @@ - if can?(current_user, :admin_group, group) = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do %i.fa.fa-cogs - Settings = 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 - Leave = image_tag group_icon(group), class: "avatar s48 hidden-xs" = link_to group, class: 'group-name' do @@ -17,7 +15,7 @@ - if group_member as - %strong #{group_member.human_access} + %span #{group_member.human_access} %div.light #{pluralize(group.projects.count, "project")}, #{pluralize(group.users.count, "user")} From 1c8ec154a90d45171b23a22a6b6eaaec7caadb2f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 18:48:35 +0200 Subject: [PATCH 114/153] Refactor colors Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/variables.scss | 3 +-- app/assets/stylesheets/generic/blocks.scss | 11 ++++++++--- app/assets/stylesheets/generic/common.scss | 2 -- app/assets/stylesheets/generic/lists.scss | 6 ++++++ app/assets/stylesheets/pages/commit.scss | 4 ---- app/views/dashboard/groups/index.html.haml | 3 +-- app/views/shared/groups/_group.html.haml | 2 +- 7 files changed, 17 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index b0cf1cb6f0..b87f16eed0 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -1,6 +1,5 @@ -$style_color: #474D57; $hover: #FFFAF1; -$gl-text-color: #7f8fa4; +$gl-text-color: #54565b; $gl-header-color: #4c4e54; $gl-link-color: #333c48; $nprogress-color: #c0392b; diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 16619502a5..01dec66e3d 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -1,18 +1,18 @@ .light-well { - background: #f9f9f9; + background-color: #f8fafc; padding: 15px; } .centered-light-block { text-align: center; - color: #888; + color: $gl-gray; margin: 20px; } .nothing-here-block { text-align: center; padding: 20px; - color: #666; + color: $gl-gray; font-weight: normal; font-size: 16px; line-height: 36px; @@ -25,4 +25,9 @@ margin-bottom: 0px; border-top: 1px solid #e7e9ed; border-bottom: 1px solid #e7e9ed; + color: $gl-gray; + + .title { + color: $gl-text-color; + } } diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 55569bebfa..1f5e972eed 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -74,8 +74,6 @@ pre { color: $gl-link-color; } -.help li { color:$style_color; } - .back-link { font-size: 14px; } diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 04a98fc695..7302f84c3a 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -109,10 +109,16 @@ ul.content-list { padding: 18px; border-color: #f1f2f4; margin: 0 -18px; + color: $gl-gray; .avatar { margin-right: 15px; } + + .controls { + padding-top: 10px; + float: right; + } } } diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss index e7125c0399..5436c6dad9 100644 --- a/app/assets/stylesheets/pages/commit.scss +++ b/app/assets/stylesheets/pages/commit.scss @@ -61,10 +61,6 @@ } } -.file-stats a { - color: $style_color; -} - .file-stats { .new-file { a { diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml index 0c7f8a6f2f..9307812d49 100644 --- a/app/views/dashboard/groups/index.html.haml +++ b/app/views/dashboard/groups/index.html.haml @@ -7,8 +7,7 @@ = link_to new_group_path, class: "btn btn-new" do %i.fa.fa-plus New Group - Welcome to the groups! - %br + .title Welcome to the groups! Group members have access to all group projects. %ul.content-list diff --git a/app/views/shared/groups/_group.html.haml b/app/views/shared/groups/_group.html.haml index 444410b258..55e6370811 100644 --- a/app/views/shared/groups/_group.html.haml +++ b/app/views/shared/groups/_group.html.haml @@ -1,7 +1,7 @@ - group_member = local_assigns[:group_member] %li - if group_member - .pull-right.hidden-xs + .controls.hidden-xs - if can?(current_user, :admin_group, group) = link_to edit_group_path(group), class: "btn-sm btn btn-grouped" do %i.fa.fa-cogs From b7427faa49752f97019d450980c53b8e2339f062 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 19:07:23 +0200 Subject: [PATCH 115/153] Improve starred and trending pages Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/blocks.scss | 4 ++++ app/assets/stylesheets/generic/common.scss | 2 +- app/assets/stylesheets/pages/projects.scss | 11 ---------- app/views/explore/projects/starred.html.haml | 8 +++++--- app/views/explore/projects/trending.html.haml | 20 ++++++++++--------- app/views/layouts/header/_public.html.haml | 2 +- 6 files changed, 22 insertions(+), 25 deletions(-) diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 01dec66e3d..e012ef2f06 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -30,4 +30,8 @@ .title { color: $gl-text-color; } + + .oneline { + line-height: 44px; + } } diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 1f5e972eed..11519268fe 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -301,7 +301,7 @@ table { } .btn-sign-in { - margin-top: 7px; + margin-top: 15px; text-shadow: none; } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 2095e73f55..24fc54ab30 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -259,17 +259,6 @@ pre.light-well { margin-bottom: 0px; border-top: 1px solid #e7e9ed; border-bottom: 1px solid #e7e9ed; - - - .projects-list-filter { - @include input-big; - padding: 5px 18px; - } - - .btn { - @include btn-big; - padding: 5px 18px; - } } /* diff --git a/app/views/explore/projects/starred.html.haml b/app/views/explore/projects/starred.html.haml index 4a9fcae4be..a9df32f3d7 100644 --- a/app/views/explore/projects/starred.html.haml +++ b/app/views/explore/projects/starred.html.haml @@ -1,11 +1,13 @@ - page_title "Starred Projects" - if current_user = render 'dashboard/projects_head' + .explore-trending-block - .lead - %i.fa.fa-star - See most starred projects + .gray-content-block .pull-right = render 'explore/projects/dropdown' + .oneline + %i.fa.fa-star + See most starred projects = render 'projects', projects: @starred_projects = paginate @starred_projects, theme: 'gitlab' diff --git a/app/views/explore/projects/trending.html.haml b/app/views/explore/projects/trending.html.haml index 1590bb9fc6..c1ef06f6cd 100644 --- a/app/views/explore/projects/trending.html.haml +++ b/app/views/explore/projects/trending.html.haml @@ -1,16 +1,18 @@ - page_title "Trending Projects" - if current_user = render 'dashboard/projects_head' - -.gray-content-block.explore-title - %h3 - Explore GitLab - %p.lead - Discover projects and groups. Share your projects with others +- else + .explore-title + %h3 + Explore GitLab + %p.lead + Discover projects and groups. Share your projects with others + %br .explore-trending-block - .lead - %i.fa.fa-comments-o - See most discussed projects for last month + .gray-content-block .pull-right = render 'explore/projects/dropdown' + .oneline + %i.fa.fa-comments-o + See most discussed projects for last month = render 'projects', projects: @trending_projects diff --git a/app/views/layouts/header/_public.html.haml b/app/views/layouts/header/_public.html.haml index 265937c7f4..a6a26518a0 100644 --- a/app/views/layouts/header/_public.html.haml +++ b/app/views/layouts/header/_public.html.haml @@ -3,7 +3,7 @@ .header-content - unless current_controller?('sessions') .pull-right - = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success btn-sm' + = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success' %h1.title= title From 211e775039487552033f27f6e4b6588cd99e206c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 19:08:43 +0200 Subject: [PATCH 116/153] Improve explore proojects page Signed-off-by: Dmitriy Zaporozhets --- app/views/explore/projects/_filter.html.haml | 2 +- app/views/explore/projects/index.html.haml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/views/explore/projects/_filter.html.haml b/app/views/explore/projects/_filter.html.haml index 4b91291caf..5a3d689d1e 100644 --- a/app/views/explore/projects/_filter.html.haml +++ b/app/views/explore/projects/_filter.html.haml @@ -3,7 +3,7 @@ .form-group = search_field_tag :search, params[:search], placeholder: "Filter by name", class: "form-control search-text-input", id: "projects_search" .form-group - = button_tag 'Search', class: "btn btn-primary wide" + = button_tag 'Search', class: "btn btn-success" .pull-right.hidden-sm.hidden-xs - if current_user diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index 0cfdf5cfd1..9df5b3830a 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -1,8 +1,7 @@ - page_title "Projects" - if current_user = render 'dashboard/projects_head' -.clearfix +.gray-content-block.clearfix = render 'filter' -%br = render 'projects', projects: @projects = paginate @projects, theme: "gitlab" From ce9cb516a187a24ec4d8af901ed41d48059aa5e9 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 19:27:13 +0200 Subject: [PATCH 117/153] Fix tab toggle on activity Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/activities.js.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/activities.js.coffee b/app/assets/javascripts/activities.js.coffee index f1afa62f94..6380374741 100644 --- a/app/assets/javascripts/activities.js.coffee +++ b/app/assets/javascripts/activities.js.coffee @@ -12,7 +12,7 @@ class @Activities toggleFilter: (sender) -> - sender.parent().toggleClass "active" + sender.toggleClass "active" event_filters = $.cookie("event_filter") filter = sender.attr("id").split("_")[0] if event_filters From d0a580273a455a1bc1a34759e88c57b5731a6e55 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 19:41:06 +0200 Subject: [PATCH 118/153] Replace obvious tooltips. Fix line-height for top nav Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 2 +- app/helpers/events_helper.rb | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 11519268fe..c6145cdd77 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -385,7 +385,7 @@ table { a { padding: 15px; font-size: 20px; - line-height: 27px; + line-height: 28px; color: #7f8fa4; border-bottom: 2px solid transparent; diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 13347b6eec..76602614bc 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -30,7 +30,6 @@ module EventsHelper class: "event-filter-link btn btn-default #{active}", id: "#{key}_event_filter", title: "Filter by #{tooltip.downcase}", - data: { toggle: 'tooltip', placement: 'top' } } link_to request.path, link_opts do From b008273883ac4c73652e73b418ffece2848fe40b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 21:36:03 +0200 Subject: [PATCH 119/153] Fix even feed title overflow Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/events.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index 1d71a542f8..16f1fdaae5 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -34,8 +34,6 @@ .event-title { @include str-truncated(calc(100% - 174px)); - - max-width: 70%; font-weight: 500; .author_name { From 0145e8ea210b2c0e1fac204126bf460063d1e17f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 21:53:55 +0200 Subject: [PATCH 120/153] Set page title based on content in dashboard area Signed-off-by: Dmitriy Zaporozhets --- app/views/dashboard/_groups_head.html.haml | 2 +- app/views/dashboard/_projects_head.html.haml | 2 +- app/views/dashboard/activity.html.haml | 1 + app/views/dashboard/groups/index.html.haml | 1 + app/views/dashboard/issues.html.haml | 5 +---- app/views/dashboard/merge_requests.html.haml | 6 ++---- app/views/dashboard/milestones/index.html.haml | 5 +---- app/views/dashboard/projects/starred.html.haml | 1 + app/views/dashboard/show.html.haml | 1 + app/views/explore/groups/index.html.haml | 1 + app/views/layouts/dashboard.html.haml | 3 ++- app/views/layouts/explore.html.haml | 3 ++- app/views/layouts/snippets.html.haml | 2 +- app/views/snippets/current_user_index.html.haml | 11 ++++++----- app/views/snippets/index.html.haml | 10 ++++++++-- 15 files changed, 30 insertions(+), 24 deletions(-) diff --git a/app/views/dashboard/_groups_head.html.haml b/app/views/dashboard/_groups_head.html.haml index 8a397a84e0..dcd6c97d44 100644 --- a/app/views/dashboard/_groups_head.html.haml +++ b/app/views/dashboard/_groups_head.html.haml @@ -3,5 +3,5 @@ = link_to dashboard_groups_path, title: 'Your groups', data: {placement: 'right'} do Your Groups = nav_link(page: [explore_groups_path]) do - = link_to explore_groups_path, title: 'Explore groups', data: {toggle: 'tooltip', placement: 'bottom'} do + = link_to explore_groups_path, title: 'Explore groups', data: {placement: 'bottom'} do Explore Groups diff --git a/app/views/dashboard/_projects_head.html.haml b/app/views/dashboard/_projects_head.html.haml index 9ba12036f2..13a5eae3cd 100644 --- a/app/views/dashboard/_projects_head.html.haml +++ b/app/views/dashboard/_projects_head.html.haml @@ -6,5 +6,5 @@ = link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do Starred Projects = nav_link(page: [explore_root_path, trending_explore_projects_path, starred_explore_projects_path, explore_projects_path], html_options: { class: 'hidden-xs' }) do - = link_to explore_root_path, title: 'Explore', data: {toggle: 'tooltip', placement: 'bottom'} do + = link_to explore_root_path, title: 'Explore', data: {placement: 'right'} do Explore Projects diff --git a/app/views/dashboard/activity.html.haml b/app/views/dashboard/activity.html.haml index 72419bf94d..3e24338af6 100644 --- a/app/views/dashboard/activity.html.haml +++ b/app/views/dashboard/activity.html.haml @@ -2,6 +2,7 @@ - if current_user = auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity") +- header_title "Activity", activity_dashboard_path = render 'dashboard/activity_head' %section.activities diff --git a/app/views/dashboard/groups/index.html.haml b/app/views/dashboard/groups/index.html.haml index 9307812d49..c249f5cace 100644 --- a/app/views/dashboard/groups/index.html.haml +++ b/app/views/dashboard/groups/index.html.haml @@ -1,4 +1,5 @@ - page_title "Groups" +- header_title "Groups", dashboard_groups_path = render 'dashboard/groups_head' .gray-content-block diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml index 94318d1bcf..14734ae737 100644 --- a/app/views/dashboard/issues.html.haml +++ b/app/views/dashboard/issues.html.haml @@ -1,14 +1,11 @@ - page_title "Issues" +- header_title "Issues", issues_dashboard_path(assignee_id: current_user.id) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, issues_dashboard_url(format: :atom, private_token: current_user.private_token), title: "#{current_user.name} issues") -%h3.page-title - Issues - %p.light List all issues from all projects you have access to. -%hr .append-bottom-20 .pull-right diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml index 90611d562b..3739a7d5db 100644 --- a/app/views/dashboard/merge_requests.html.haml +++ b/app/views/dashboard/merge_requests.html.haml @@ -1,11 +1,9 @@ - page_title "Merge Requests" -%h3.page-title - Merge Requests - +- header_title "Merge Requests", merge_requests_dashboard_path(assignee_id: current_user.id) %p.light List all merge requests from all projects you have access to. -%hr + .append-bottom-20 = render 'shared/issuable/filter', type: :merge_requests = render 'shared/merge_requests' diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml index 9a9a5e139a..88ad3cd729 100644 --- a/app/views/dashboard/milestones/index.html.haml +++ b/app/views/dashboard/milestones/index.html.haml @@ -1,12 +1,9 @@ - page_title "Milestones" -%h3.page-title - Milestones - %span.pull-right #{@dashboard_milestones.count} milestones +- header_title "Milestones", dashboard_milestones_path %p.light List all milestones from all projects you have access to. -%hr = render 'shared/milestones_filter' .milestones diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml index becd989c1f..2fd7a1cf16 100644 --- a/app/views/dashboard/projects/starred.html.haml +++ b/app/views/dashboard/projects/starred.html.haml @@ -1,4 +1,5 @@ - page_title "Starred Projects" +- header_title "Projects", (current_user ? root_path : explore_root_path) = render 'dashboard/projects_head' - if @projects.any? diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/show.html.haml index 4cf2feb9aa..1d5324e0d7 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/show.html.haml @@ -2,6 +2,7 @@ - if current_user = auto_discovery_link_tag(:atom, dashboard_url(format: :atom, private_token: current_user.private_token), title: "All activity") +- header_title "Projects", (current_user ? root_path : explore_root_path) = render 'dashboard/projects_head' - if @last_push diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index 86410db2b2..e8a6752de8 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -1,4 +1,5 @@ - page_title "Groups" +- header_title "Groups", (current_user ? dashboard_groups_path : explore_groups_path) - if current_user = render 'dashboard/groups_head' .gray-content-block.clearfix diff --git a/app/views/layouts/dashboard.html.haml b/app/views/layouts/dashboard.html.haml index c72eca10bf..fad7de6943 100644 --- a/app/views/layouts/dashboard.html.haml +++ b/app/views/layouts/dashboard.html.haml @@ -1,5 +1,6 @@ - page_title "Dashboard" -- header_title "Dashboard", root_path +- unless @header_title + - header_title "Dashboard", root_path - sidebar "dashboard" = render template: "layouts/application" diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index 17fee9c510..9098554e6f 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -1,6 +1,7 @@ - page_title "Explore" - if current_user - - header_title "Dashboard", root_path + - unless @header_title + - header_title "Projects", (current_user ? root_path : explore_root_path) - else - header_title "Explore GitLab", explore_root_path - sidebar "dashboard" diff --git a/app/views/layouts/snippets.html.haml b/app/views/layouts/snippets.html.haml index b77fe09fc2..d9c90d4fce 100644 --- a/app/views/layouts/snippets.html.haml +++ b/app/views/layouts/snippets.html.haml @@ -1,6 +1,6 @@ - page_title 'Snippets' - if current_user - - header_title "Dashboard", root_path + - header_title "Snippets", user_snippets_path(current_user) - else - header_title 'Snippets', snippets_path - sidebar "dashboard" diff --git a/app/views/snippets/current_user_index.html.haml b/app/views/snippets/current_user_index.html.haml index 62a967a2e0..d704407c4d 100644 --- a/app/views/snippets/current_user_index.html.haml +++ b/app/views/snippets/current_user_index.html.haml @@ -1,14 +1,15 @@ - page_title "Your Snippets" = render 'head' -.slead - Share code pastes with others out of git repository - +.gray-content-block .pull-right - = link_to new_snippet_path, class: "btn btn-new btn-sm", title: "New Snippet" do + = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do Add new snippet -%ul.nav.nav-tabs + .oneline + Share code pastes with others out of git repository + +%ul.nav.nav-tabs.prepend-top-20 = nav_tab :scope, nil do = link_to user_snippets_path(@user) do All diff --git a/app/views/snippets/index.html.haml b/app/views/snippets/index.html.haml index 8608815e0a..3b62dd2a6e 100644 --- a/app/views/snippets/index.html.haml +++ b/app/views/snippets/index.html.haml @@ -2,8 +2,14 @@ - if current_user = render 'head' -.slead - Public snippets created by you and other users are listed here +.gray-content-block + - if current_user + .pull-right + = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do + Add new snippet + + .oneline + Public snippets created by you and other users are listed here = render 'snippets' From c2a9e6ea6716e6b16a1cc83dccb0dba7cf629814 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 22:15:21 +0200 Subject: [PATCH 121/153] Fix tests Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_variables.scss | 2 +- app/helpers/diff_helper.rb | 4 ++-- features/steps/project/merge_requests.rb | 4 ++-- features/steps/shared/diff_note.rb | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 1f71b0a52b..628b22ef90 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -136,7 +136,7 @@ $kbd-bg: #333; //== Buttons // //## -$btn-default-color: #7f8fa4; +$btn-default-color: $gl-text-color; $btn-default-bg: #fff; $btn-default-border: #e7e9ed; diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index 1bd3ec5e0e..6ffa1a7121 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -137,7 +137,7 @@ module DiffHelper # Always use HTML to handle case where JSON diff rendered this button params_copy.delete(:format) - link_to url_for(params_copy), id: "commit-diff-viewtype", class: (params[:view] != 'parallel' ? 'btn btn-sm active' : 'btn btn-sm') do + link_to url_for(params_copy), id: "inline-diff-btn", class: (params[:view] != 'parallel' ? 'btn btn-sm active' : 'btn btn-sm') do 'Inline' end end @@ -148,7 +148,7 @@ module DiffHelper # Always use HTML to handle case where JSON diff rendered this button params_copy.delete(:format) - link_to url_for(params_copy), id: "commit-diff-viewtype", class: (params[:view] == 'parallel' ? 'btn active btn-sm' : 'btn btn-sm') do + link_to url_for(params_copy), id: "parallel-diff-btn", class: (params[:view] == 'parallel' ? 'btn active btn-sm' : 'btn btn-sm') do 'Side-by-side' end end diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb index 778dce0635..7191aa0e03 100644 --- a/features/steps/project/merge_requests.rb +++ b/features/steps/project/merge_requests.rb @@ -225,13 +225,13 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps step 'I click link "Hide inline discussion" of the second file' do page.within '.files [id^=diff]:nth-child(2)' do - find('.js-toggle-diff-comments').click + find('.js-toggle-diff-comments').trigger('click') end end step 'I click link "Show inline discussion" of the second file' do page.within '.files [id^=diff]:nth-child(2)' do - find('.js-toggle-diff-comments').click + find('.js-toggle-diff-comments').trigger('click') end end diff --git a/features/steps/shared/diff_note.rb b/features/steps/shared/diff_note.rb index 27a95aeb19..72621911a3 100644 --- a/features/steps/shared/diff_note.rb +++ b/features/steps/shared/diff_note.rb @@ -198,7 +198,7 @@ module SharedDiffNote end step 'I click side-by-side diff button' do - click_link "Side-by-side" + find('#parallel-diff-btn').trigger('click') end step 'I see side-by-side diff button' do From 858675ff8a98c3b824dd49cc9b08589a198cc34f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 22:25:52 +0200 Subject: [PATCH 122/153] Fix tests Signed-off-by: Dmitriy Zaporozhets --- features/steps/project/merge_requests.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/steps/project/merge_requests.rb b/features/steps/project/merge_requests.rb index 7191aa0e03..c92998631f 100644 --- a/features/steps/project/merge_requests.rb +++ b/features/steps/project/merge_requests.rb @@ -128,7 +128,8 @@ class Spinach::Features::ProjectMergeRequests < Spinach::FeatureSteps end step 'I should see the proper Inline and Side-by-side links' do - expect(page).to have_css('#commit-diff-viewtype', count: 2) + expect(page).to have_css('#parallel-diff-btn', count: 1) + expect(page).to have_css('#inline-diff-btn', count: 1) end step 'I switch to the merge request\'s comments tab' do From a73044320f806c660a21992fdbf63deb161c615e Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 3 Sep 2015 20:49:13 +0000 Subject: [PATCH 123/153] Fix `rake services:doc` generation [ci skip] --- doc/development/rake_tasks.md | 6 ++++++ lib/tasks/services.rake | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md index 53f8095cb1..a4a980cf0e 100644 --- a/doc/development/rake_tasks.md +++ b/doc/development/rake_tasks.md @@ -27,3 +27,9 @@ You can find results under the `doc/code` directory. ``` bundle exec rake gitlab:generate_docs ``` + +## Generate API documentation for project services (e.g. Slack) + +``` +bundle exec rake services:doc +``` diff --git a/lib/tasks/services.rake b/lib/tasks/services.rake index 53d912d2a7..3f276a5e12 100644 --- a/lib/tasks/services.rake +++ b/lib/tasks/services.rake @@ -44,11 +44,11 @@ DELETE /projects/:id/services/<%= service[:dashed_name] %> ERB namespace :services do - task :doc do + task doc: :environment do services = Service.available_services_names.map do |s| service_start = Time.now klass = "#{s}_service".classify.constantize - + service = klass.new service_hash = {} @@ -62,7 +62,7 @@ namespace :services do param_hash[:name] = p[:name] param_hash[:description] = p[:placeholder] || p[:title] - param_hash[:required] = klass.validators_on(p[:name].to_sym).any? do |v| + param_hash[:required] = klass.validators_on(p[:name].to_sym).any? do |v| v.class == ActiveRecord::Validations::PresenceValidator end From 4144c59941e8e91bbaff2c68e757af0f01f7997d Mon Sep 17 00:00:00 2001 From: pilsner Date: Thu, 3 Sep 2015 18:55:43 +0900 Subject: [PATCH 124/153] add Content-Type header of raw image file Add Content-Type header to fix a bug which IE can't show image in markdown when the image is from raw. modified: CHANGELOG modified: app/controllers/projects/raw_controller.rb modified: spec/controllers/projects/raw_controller_spec.rb --- CHANGELOG | 1 + app/controllers/projects/raw_controller.rb | 2 ++ spec/controllers/projects/raw_controller_spec.rb | 14 ++++++++++++++ 3 files changed, 17 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 7a773a7ed1..8154d4333d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -36,6 +36,7 @@ v 8.0.0 (unreleased) - Refactored service API and added automatically service docs generator (Kirill Zaitsev) - Added web_url key project hook_attrs (Kirill Zaitsev) - Add ability to get user information by ID of an SSH key via the API + - Fix bug which IE cannot show image at markdown when the image is raw file of gitlab v 7.14.1 - Improve abuse reports management from admin area diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index 1a3df40dc7..5f6fbce795 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -29,6 +29,8 @@ class Projects::RawController < Projects::ApplicationController def get_blob_type if @blob.text? 'text/plain; charset=utf-8' + elsif @blob.image? + @blob.content_type else 'application/octet-stream' end diff --git a/spec/controllers/projects/raw_controller_spec.rb b/spec/controllers/projects/raw_controller_spec.rb index 1f921d5f05..c114f34202 100644 --- a/spec/controllers/projects/raw_controller_spec.rb +++ b/spec/controllers/projects/raw_controller_spec.rb @@ -19,5 +19,19 @@ describe Projects::RawController do to eq("inline") end end + + context 'image header' do + let(:id) { 'master/files/images/6049019_460s.jpg' } + + it 'set image content type header' do + get(:show, + namespace_id: public_project.namespace.to_param, + project_id: public_project.to_param, + id: id) + + expect(response.status).to eq(200) + expect(response.header['Content-Type']).to eq('image/jpeg') + end + end end end From 16e6913e00dee9118a2c75d6ecdd7f2dcef7234a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 11:17:07 +0200 Subject: [PATCH 125/153] Add awesome font SourceSansPro Signed-off-by: Dmitriy Zaporozhets --- app/assets/fonts/OFL.txt | 92 ++++++++++++++++++ app/assets/fonts/SourceSansPro-Black.ttf | Bin 0 -> 148368 bytes .../fonts/SourceSansPro-BlackItalic.ttf | Bin 0 -> 116360 bytes app/assets/fonts/SourceSansPro-Bold.ttf | Bin 0 -> 148932 bytes app/assets/fonts/SourceSansPro-BoldItalic.ttf | Bin 0 -> 116192 bytes app/assets/fonts/SourceSansPro-ExtraLight.ttf | Bin 0 -> 150528 bytes .../fonts/SourceSansPro-ExtraLightItalic.ttf | Bin 0 -> 117140 bytes app/assets/fonts/SourceSansPro-Italic.ttf | Bin 0 -> 117328 bytes app/assets/fonts/SourceSansPro-Light.ttf | Bin 0 -> 150244 bytes .../fonts/SourceSansPro-LightItalic.ttf | Bin 0 -> 116960 bytes app/assets/fonts/SourceSansPro-Regular.ttf | Bin 0 -> 149972 bytes app/assets/fonts/SourceSansPro-Semibold.ttf | Bin 0 -> 149636 bytes .../fonts/SourceSansPro-SemiboldItalic.ttf | Bin 0 -> 116424 bytes app/assets/stylesheets/base/fonts.scss | 25 +++++ 14 files changed, 117 insertions(+) create mode 100755 app/assets/fonts/OFL.txt create mode 100755 app/assets/fonts/SourceSansPro-Black.ttf create mode 100755 app/assets/fonts/SourceSansPro-BlackItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Bold.ttf create mode 100755 app/assets/fonts/SourceSansPro-BoldItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-ExtraLight.ttf create mode 100755 app/assets/fonts/SourceSansPro-ExtraLightItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Italic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Light.ttf create mode 100755 app/assets/fonts/SourceSansPro-LightItalic.ttf create mode 100755 app/assets/fonts/SourceSansPro-Regular.ttf create mode 100755 app/assets/fonts/SourceSansPro-Semibold.ttf create mode 100755 app/assets/fonts/SourceSansPro-SemiboldItalic.ttf create mode 100644 app/assets/stylesheets/base/fonts.scss diff --git a/app/assets/fonts/OFL.txt b/app/assets/fonts/OFL.txt new file mode 100755 index 0000000000..a9b845ed1d --- /dev/null +++ b/app/assets/fonts/OFL.txt @@ -0,0 +1,92 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/app/assets/fonts/SourceSansPro-Black.ttf b/app/assets/fonts/SourceSansPro-Black.ttf new file mode 100755 index 0000000000000000000000000000000000000000..cb89a2d171e4db582ffaae8b5fe465680921996b GIT binary patch literal 148368 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

CW;@Th7(XPUPmkZ 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Bold.ttf b/app/assets/fonts/SourceSansPro-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..50d81bdad58b06dbf4e3b6201cbdb31814aa5030 GIT binary patch literal 148932 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-ExtraLight.ttf b/app/assets/fonts/SourceSansPro-ExtraLight.ttf new file mode 100755 index 0000000000000000000000000000000000000000..bb4176c6fff742636a9ae8604cc22d2f21505bdf GIT binary patch literal 150528 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

*0fSY=GawYBfnK(*Pfl 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Italic.ttf b/app/assets/fonts/SourceSansPro-Italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..e5a1a86e63104c52033259517e48c73fc9ee55ca GIT binary patch literal 117328 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 PgU%}(Gm}pK)bjrTSP7q7 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Light.ttf b/app/assets/fonts/SourceSansPro-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5f64679f6b98169bd9b877939b94e0387f503b88 GIT binary patch literal 150244 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 dL#lX9xsrRY)++$&uvPWs;azwZUc_v&cw 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 ZlT2_dG*WCr4b1T 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 literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Regular.ttf b/app/assets/fonts/SourceSansPro-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..91e9ea5757fdff812d6690ca14f3a18589c0a723 GIT binary patch literal 149972 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

0T(9G^a8qt)`+5MkfPiowCC<|G& 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 HY0-ZHYYpa> literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-Semibold.ttf b/app/assets/fonts/SourceSansPro-Semibold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5020594826b603961399cec009188a8d11a437d5 GIT binary patch literal 149636 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

;uKu%NE38 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 Cmj74) literal 0 HcmV?d00001 diff --git a/app/assets/fonts/SourceSansPro-SemiboldItalic.ttf b/app/assets/fonts/SourceSansPro-SemiboldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..2c5ad3008c312162980021fd8dd859edffb32f13 GIT binary patch literal 116424 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 N1W4~xZ@RzZ{{!A)KWP8} literal 0 HcmV?d00001 diff --git a/app/assets/stylesheets/base/fonts.scss b/app/assets/stylesheets/base/fonts.scss new file mode 100644 index 0000000000..ed2b58157d --- /dev/null +++ b/app/assets/stylesheets/base/fonts.scss @@ -0,0 +1,25 @@ +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('SourceSansPro-Light.ttf'); +} +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro'), local('SourceSansPro-Regular'), url('SourceSansPro-Regular.ttf'); +} +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), url('SourceSansPro-Semibold.ttf'); +} +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('SourceSansPro-Bold.ttf'); +} From c13ef898627db4f619c80f6be0fb58fe045e44d3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 11:17:25 +0200 Subject: [PATCH 126/153] Make UI more compact Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/application.scss | 1 + app/assets/stylesheets/base/gl_variables.scss | 4 ++-- app/assets/stylesheets/base/variables.scss | 10 ++++++---- app/assets/stylesheets/generic/avatar.scss | 1 + app/assets/stylesheets/generic/blocks.scss | 4 ++-- app/assets/stylesheets/generic/common.scss | 12 ++++++------ app/assets/stylesheets/generic/header.scss | 2 +- app/assets/stylesheets/generic/lists.scss | 5 +++-- app/assets/stylesheets/generic/selects.scss | 2 +- app/assets/stylesheets/generic/sidebar.scss | 18 +++++++++--------- app/assets/stylesheets/pages/dashboard.scss | 2 +- app/assets/stylesheets/pages/projects.scss | 14 ++++++-------- app/views/events/_event.html.haml | 4 ++-- app/views/layouts/_page.html.haml | 2 +- app/views/shared/groups/_group.html.haml | 2 +- app/views/shared/projects/_project.html.haml | 4 ++-- 16 files changed, 45 insertions(+), 42 deletions(-) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 1a5f11df7d..46f7feddf8 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -12,6 +12,7 @@ */ +@import "base/fonts"; @import "base/variables"; @import "base/mixins"; @import "base/layout"; diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 628b22ef90..6d3b4b1e73 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -43,7 +43,7 @@ $font-size-base: $gl-font-size; //## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). $padding-base-vertical: 9px; -$padding-base-horizontal: 18px; +$padding-base-horizontal: $gl-padding; $component-active-color: #fff; $component-active-bg: $brand-info; @@ -143,4 +143,4 @@ $btn-default-border: #e7e9ed; //== Nav // //## -$nav-link-padding: 13px 18px; +$nav-link-padding: 13px $gl-padding; diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index b87f16eed0..f7d4b5d171 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -3,8 +3,8 @@ $gl-text-color: #54565b; $gl-header-color: #4c4e54; $gl-link-color: #333c48; $nprogress-color: #c0392b; -$gl-font-size: 16px; -$list-font-size: 16px; +$gl-font-size: 15px; +$list-font-size: 15px; $sidebar_collapsed_width: 62px; $sidebar_width: 230px; $avatar_radius: 50%; @@ -12,9 +12,11 @@ $code_font_size: 13px; $code_line_height: 1.5; $border-color: #E7E9ED; $background-color: #F8FAFC; -$header-height: 73px; +$header-height: 67px; $fixed-layout-width: 1200px; $gl-gray: #7f8fa4; +$gl-padding: 16px; +$gl-avatar-size: 46px; /* @@ -36,4 +38,4 @@ $deleted: #f77; * Fonts */ $monospace_font: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace; -$regular_font: "Helvetica Neue", Helvetica, Arial, sans-serif; +$regular_font: 'Source Sans Pro', "Helvetica Neue", Helvetica, Arial, sans-serif; diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 0f137fd8c8..5985e8239f 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -23,6 +23,7 @@ &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; } + &.s46 { width: 46px; height: 46px; margin-right: 15px; } &.s48 { width: 48px; height: 48px; margin-right: 10px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; } diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index e012ef2f06..e953ec741a 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -19,9 +19,9 @@ } .gray-content-block { - margin: -18px; + margin: -$gl-padding; background-color: #f8fafc; - padding: 18px; + padding: $gl-padding; margin-bottom: 0px; border-top: 1px solid #e7e9ed; border-bottom: 1px solid #e7e9ed; diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index c6145cdd77..8b3768c2d2 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -374,17 +374,17 @@ table { list-style: none; text-align: center; margin-top: 5px; - margin-bottom: 18px; - height: 60px; - margin-top: -18px; - padding-top: 18px; + margin-bottom: $gl-padding; + height: 56px; + margin-top: -$gl-padding; + padding-top: $gl-padding; li { display: inline-block; a { - padding: 15px; - font-size: 20px; + padding: 14px; + font-size: 17px; line-height: 28px; color: #7f8fa4; border-bottom: 2px solid transparent; diff --git a/app/assets/stylesheets/generic/header.scss b/app/assets/stylesheets/generic/header.scss index d362f179c5..b758a526fb 100644 --- a/app/assets/stylesheets/generic/header.scss +++ b/app/assets/stylesheets/generic/header.scss @@ -70,7 +70,7 @@ header { .title { margin: 0; overflow: hidden; - font-size: 20px; + font-size: 19px; line-height: $header-height; font-weight: normal; color: #4c4e54; diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 7302f84c3a..601fdd1e32 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -106,9 +106,10 @@ ul.content-list { padding: 0; li { - padding: 18px; + padding: $gl-padding; border-color: #f1f2f4; - margin: 0 -18px; + margin-left: -$gl-padding; + margin-right: -$gl-padding; color: $gl-gray; .avatar { diff --git a/app/assets/stylesheets/generic/selects.scss b/app/assets/stylesheets/generic/selects.scss index c6a1047e01..f0860de1c4 100644 --- a/app/assets/stylesheets/generic/selects.scss +++ b/app/assets/stylesheets/generic/selects.scss @@ -4,7 +4,7 @@ background: #FFF; border-color: #DDD; height: 42px; - padding: 8px 18px; + padding: 8px $gl-padding; font-size: $gl-font-size; line-height: 1.42857143; diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 7f3688801a..7089375947 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -25,7 +25,7 @@ .container-fluid { background: #FFF; - padding: 18px; + padding: $gl-padding; border: 1px solid #e7e9ed; min-height: 90vh; } @@ -51,8 +51,8 @@ } a { - padding: 8px 15px; - font-size: 16px; + padding: 7px 15px; + font-size: $gl-font-size; line-height: 24px; color: $gray; display: block; @@ -199,7 +199,7 @@ } .sidebar-user { - padding: 12px 22px; + padding: 9px 22px; position: fixed; bottom: 40px; width: $sidebar_width; @@ -210,7 +210,7 @@ margin-left: 10px; width: $sidebar_width - 2 * 10px; font-size: 16px; - line-height: 49px; + line-height: 44px; } } @@ -227,12 +227,12 @@ float: left; height: $header-height; width: 100%; - padding: 12px 22px; + padding: 10px 22px; overflow: hidden; img { - width: 48px; - height: 48px; + width: $gl-avatar-size; + height: $gl-avatar-size; float: left; } @@ -244,7 +244,7 @@ float: left; margin: 0; margin-left: 14px; - font-size: 20px; + font-size: 19px; line-height: 49px; font-weight: normal; } diff --git a/app/assets/stylesheets/pages/dashboard.scss b/app/assets/stylesheets/pages/dashboard.scss index 008c6419f0..25a86cd0f9 100644 --- a/app/assets/stylesheets/pages/dashboard.scss +++ b/app/assets/stylesheets/pages/dashboard.scss @@ -42,7 +42,7 @@ } .identicon { - line-height: 40px; + line-height: 46px; } } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 24fc54ab30..7e9ec9c88c 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -187,7 +187,6 @@ ul.nav.nav-projects-tabs { line-height: 42px; background: white; border: none; - font-size: 16px; > li + li:before { padding: 0 3px; @@ -253,9 +252,9 @@ pre.light-well { } .projects-search-form { - margin: -18px; + margin: -$gl-padding; background-color: #f8fafc; - padding: 18px; + padding: $gl-padding; margin-bottom: 0px; border-top: 1px solid #e7e9ed; border-bottom: 1px solid #e7e9ed; @@ -268,9 +267,10 @@ pre.light-well { @include basic-list; .project-row { - padding: 18px; + padding: $gl-padding; border-color: #f1f2f4; - margin: 0 -18px; + margin-left: -$gl-padding; + margin-right: -$gl-padding; &.no-description { .project { @@ -280,8 +280,7 @@ pre.light-well { .project-full-name { @include str-truncated; - font-weight: 500; - font-size: 16px; + font-weight: 600; color: #4c4e54; } @@ -292,7 +291,6 @@ pre.light-well { .project-description { color: #7f8fa4; - font-size: 16px; p { @include str-truncated; diff --git a/app/views/events/_event.html.haml b/app/views/events/_event.html.haml index 3cd65edacb..9aacc79d68 100644 --- a/app/views/events/_event.html.haml +++ b/app/views/events/_event.html.haml @@ -3,8 +3,8 @@ .event-item-timestamp #{time_ago_with_tooltip(event.created_at)} - = cache [event, "v2"] do - = image_tag avatar_icon(event.author_email, 48), class: "avatar s48", alt:'' + = cache [event, "v2.1"] do + = image_tag avatar_icon(event.author_email, 46), class: "avatar s46", alt:'' - if event.created_project? = render "events/event/created_project", event: event - elsif event.push? diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 9a9282de22..02ee9910da 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -14,7 +14,7 @@ = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user' do - = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s48' + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s46' .username = current_user.username .content-wrapper diff --git a/app/views/shared/groups/_group.html.haml b/app/views/shared/groups/_group.html.haml index 55e6370811..a54c5fa8c3 100644 --- a/app/views/shared/groups/_group.html.haml +++ b/app/views/shared/groups/_group.html.haml @@ -9,7 +9,7 @@ = 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 - = image_tag group_icon(group), class: "avatar s48 hidden-xs" + = image_tag group_icon(group), class: "avatar s46 hidden-xs" = link_to group, class: 'group-name' do %strong= group.name diff --git a/app/views/shared/projects/_project.html.haml b/app/views/shared/projects/_project.html.haml index fdedcf97cf..5318c6011f 100644 --- a/app/views/shared/projects/_project.html.haml +++ b/app/views/shared/projects/_project.html.haml @@ -3,11 +3,11 @@ - css_class = '' unless local_assigns[:css_class] - css_class += " no-description" unless project.description.present? %li.project-row{ class: css_class } - = cache [project.namespace, project, controller.controller_name, controller.action_name, 'v2'] do + = cache [project.namespace, project, controller.controller_name, controller.action_name, 'v2.1'] do = link_to project_path(project), class: dom_class(project) do - if avatar .dash-project-avatar - = project_icon(project, alt: '', class: 'avatar project-avatar s40') + = project_icon(project, alt: '', class: 'avatar project-avatar s46') %span.project-full-name %span.namespace-name - if project.namespace From dc86a9197972561c323981a40f0c5f874085b88e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 11:31:48 +0200 Subject: [PATCH 127/153] Event feed use gl-padding var Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/events.scss | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index 16f1fdaae5..df7eae869c 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -4,8 +4,9 @@ */ .event-item { font-size: 16px; - padding: 18px; - margin: 0 -18px; + padding: $gl-padding; + margin-left: -$gl-padding; + margin-right: -$gl-padding; border-bottom: 1px solid #f1f2f4; color: #7f8fa4; From af6f739f3532fdd78f347b96937d259cd5ccf3bb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 11:40:15 +0200 Subject: [PATCH 128/153] Fix fonts for assets Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/fonts.scss | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/base/fonts.scss b/app/assets/stylesheets/base/fonts.scss index ed2b58157d..e214567eca 100644 --- a/app/assets/stylesheets/base/fonts.scss +++ b/app/assets/stylesheets/base/fonts.scss @@ -3,23 +3,23 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('SourceSansPro-Light.ttf'); + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), font-url('SourceSansPro-Light.ttf'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 400; - src: local('Source Sans Pro'), local('SourceSansPro-Regular'), url('SourceSansPro-Regular.ttf'); + src: local('Source Sans Pro'), local('SourceSansPro-Regular'), font-url('SourceSansPro-Regular.ttf'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 600; - src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), url('SourceSansPro-Semibold.ttf'); + src: local('Source Sans Pro Semibold'), local('SourceSansPro-Semibold'), font-url('SourceSansPro-Semibold.ttf'); } @font-face { font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('SourceSansPro-Bold.ttf'); + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), font-url('SourceSansPro-Bold.ttf'); } From 8301836b4262ee8bf3da16d089e3d6f4b47258e2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 11:56:32 +0200 Subject: [PATCH 129/153] Small ui improvements to activity feed Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 2 +- app/assets/stylesheets/pages/events.scss | 11 ++++++----- app/assets/stylesheets/pages/projects.scss | 7 ++++++- app/views/events/event/_note.html.haml | 3 +-- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 8b3768c2d2..8dccfcbee0 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -353,7 +353,7 @@ table { } .description { - font-size: 16px; + font-size: $gl-font-size; color: #666; margin-top: 8px; } diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index df7eae869c..ca2ee45542 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -3,7 +3,7 @@ * */ .event-item { - font-size: 16px; + font-size: $gl-font-size; padding: $gl-padding; margin-left: -$gl-padding; margin-right: -$gl-padding; @@ -35,7 +35,7 @@ .event-title { @include str-truncated(calc(100% - 174px)); - font-weight: 500; + font-weight: 600; .author_name { color: #333; @@ -51,7 +51,8 @@ word-wrap: break-word; .md { - font-size: 16px; + color: #7f8fa4; + font-size: $gl-font-size; iframe.twitter-share-button { vertical-align: bottom; @@ -81,7 +82,7 @@ .event-note-icon { color: #777; float: left; - font-size: 16px; + font-size: $gl-font-size; line-height: 16px; margin-right: 5px; } @@ -112,7 +113,7 @@ padding-left: 0; border: none; .commit-row-title { - font-size: 16px; + font-size: $gl-font-size; } } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 7e9ec9c88c..87bb55395b 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -274,7 +274,7 @@ pre.light-well { &.no-description { .project { - line-height: 38px; + line-height: 44px; } } @@ -299,6 +299,11 @@ pre.light-well { } } } + + .bottom { + padding-top: $gl-padding; + padding-bottom: 0; + } } .panel .projects-list li { diff --git a/app/views/events/event/_note.html.haml b/app/views/events/event/_note.html.haml index 07bec1697f..830fec0b4a 100644 --- a/app/views/events/event/_note.html.haml +++ b/app/views/events/event/_note.html.haml @@ -4,7 +4,7 @@ = event.action_name = event_note_title_html(event) at - + - if event.project = link_to_project event.project - else @@ -13,7 +13,6 @@ .event-body .event-note .md - %i.fa.fa-comment-o.event-note-icon = event_note(event.target.note, project: event.project) - note = event.target - if note.attachment.url From 8b5a14fd0aa44e9c7b5b1af6b27c960cc50e2d6f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 14:53:25 +0200 Subject: [PATCH 130/153] Fix failing test Signed-off-by: Dmitriy Zaporozhets --- features/steps/shared/diff_note.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/steps/shared/diff_note.rb b/features/steps/shared/diff_note.rb index 72621911a3..ef567fe7e1 100644 --- a/features/steps/shared/diff_note.rb +++ b/features/steps/shared/diff_note.rb @@ -198,7 +198,7 @@ module SharedDiffNote end step 'I click side-by-side diff button' do - find('#parallel-diff-btn').trigger('click') + find('#parallel-diff-btn').click end step 'I see side-by-side diff button' do From 0362a0f0d77b7d9424da37140ea4c37572bff8d8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 14:57:11 +0200 Subject: [PATCH 131/153] Fix stars align Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/projects.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 87bb55395b..51449b2752 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -285,7 +285,7 @@ pre.light-well { } .pull-right.light { - line-height: 38px; + line-height: 45px; color: #7f8fa4; } From cf36509a349b0fd6d8abe23fc6fbf8cdd5823d2a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 15:00:50 +0200 Subject: [PATCH 132/153] Style dashboard milestones page Signed-off-by: Dmitriy Zaporozhets --- .../dashboard/milestones/index.html.haml | 23 ++++++++++--------- app/views/shared/_milestones_filter.html.haml | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/views/dashboard/milestones/index.html.haml b/app/views/dashboard/milestones/index.html.haml index 88ad3cd729..21b25c3986 100644 --- a/app/views/dashboard/milestones/index.html.haml +++ b/app/views/dashboard/milestones/index.html.haml @@ -1,18 +1,19 @@ - page_title "Milestones" - header_title "Milestones", dashboard_milestones_path -%p.light - List all milestones from all projects you have access to. - = render 'shared/milestones_filter' + +.gray-content-block + .oneline + List all milestones from all projects you have access to. + .milestones - .panel.panel-default - %ul.well-list - - if @dashboard_milestones.blank? - %li - .nothing-here-block No milestones to show - - else - - @dashboard_milestones.each do |milestone| - = render 'milestone', milestone: milestone + %ul.content-list + - if @dashboard_milestones.blank? + %li + .nothing-here-block No milestones to show + - else + - @dashboard_milestones.each do |milestone| + = render 'milestone', milestone: milestone = paginate @dashboard_milestones, theme: "gitlab" diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml index f685ae7726..b513a11ecb 100644 --- a/app/views/shared/_milestones_filter.html.haml +++ b/app/views/shared/_milestones_filter.html.haml @@ -1,5 +1,5 @@ -.milestones-filters.append-bottom-10 - %ul.nav.nav-tabs +.milestones-filters + %ul.center-top-menu %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} = link_to milestones_filter_path(state: 'opened') do %i.fa.fa-exclamation-circle From 147f95b7539225d46accbe23cd708c081225409b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 15:22:33 +0200 Subject: [PATCH 133/153] Apply new style for issues, merge requests and milestone pages Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 7 ++++++ app/assets/stylesheets/generic/filters.scss | 25 ------------------- app/assets/stylesheets/pages/issuable.scss | 11 ++++++++ app/views/dashboard/issues.html.haml | 3 +-- app/views/dashboard/merge_requests.html.haml | 3 --- app/views/projects/issues/_issues.html.haml | 11 ++++---- app/views/projects/issues/index.html.haml | 4 +-- .../merge_requests/_merge_requests.html.haml | 11 ++++---- .../projects/merge_requests/index.html.haml | 4 +-- app/views/shared/issuable/_filter.html.haml | 9 ++----- 10 files changed, 35 insertions(+), 53 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 8dccfcbee0..096698e846 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -398,5 +398,12 @@ table { color: #4c4e54; border-bottom: 2px solid #1cacfc; } + + .badge { + font-weight: normal; + background-color: #fff; + background-color: #eee; + color: #78a; + } } } diff --git a/app/assets/stylesheets/generic/filters.scss b/app/assets/stylesheets/generic/filters.scss index bd93a79722..8e6922c923 100644 --- a/app/assets/stylesheets/generic/filters.scss +++ b/app/assets/stylesheets/generic/filters.scss @@ -2,31 +2,6 @@ margin-right: 15px; } -.issues-state-filters { - li.active a { - border-color: #DDD !important; - - &, &:hover, &:active, &.active { - background: #f5f5f5 !important; - border-bottom: 1px solid #f5f5f5 !important; - } - } -} - -.issues-details-filters { - font-size: 13px; - background: #f5f5f5; - margin: -10px 0; - padding: 10px 15px; - margin-top: -15px; - border-left: 1px solid #DDD; - border-right: 1px solid #DDD; - - .btn { - font-size: 13px; - } -} - @media (min-width: 800px) { .issues-filters, .issues_bulk_update { diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index 586e7b5f8d..2d32d82e10 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -45,3 +45,14 @@ .btn { font-size: 13px; } } + +.project-issuable-filter { + .controls { + float: right; + margin-top: 7px; + } + + .center-top-menu { + text-align: left; + } +} diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml index 14734ae737..09e70f9ae2 100644 --- a/app/views/dashboard/issues.html.haml +++ b/app/views/dashboard/issues.html.haml @@ -4,8 +4,6 @@ - if current_user = auto_discovery_link_tag(:atom, issues_dashboard_url(format: :atom, private_token: current_user.private_token), title: "#{current_user.name} issues") -%p.light - List all issues from all projects you have access to. .append-bottom-20 .pull-right @@ -15,4 +13,5 @@ %i.fa.fa-rss = render 'shared/issuable/filter', type: :issues + = render 'shared/issues' diff --git a/app/views/dashboard/merge_requests.html.haml b/app/views/dashboard/merge_requests.html.haml index 3739a7d5db..d1f332fa0d 100644 --- a/app/views/dashboard/merge_requests.html.haml +++ b/app/views/dashboard/merge_requests.html.haml @@ -1,9 +1,6 @@ - page_title "Merge Requests" - header_title "Merge Requests", merge_requests_dashboard_path(assignee_id: current_user.id) -%p.light - List all merge requests from all projects you have access to. - .append-bottom-20 = render 'shared/issuable/filter', type: :merge_requests = render 'shared/merge_requests' diff --git a/app/views/projects/issues/_issues.html.haml b/app/views/projects/issues/_issues.html.haml index 5d243adb5f..a3399c57aa 100644 --- a/app/views/projects/issues/_issues.html.haml +++ b/app/views/projects/issues/_issues.html.haml @@ -1,9 +1,8 @@ -.panel.panel-default - %ul.well-list.issues-list - = render @issues - - if @issues.blank? - %li - .nothing-here-block No issues to show +%ul.content-list.issues-list + = render @issues + - if @issues.blank? + %li + .nothing-here-block No issues to show - if @issues.present? .pull-right diff --git a/app/views/projects/issues/index.html.haml b/app/views/projects/issues/index.html.haml index d06225f548..24314d1140 100644 --- a/app/views/projects/issues/index.html.haml +++ b/app/views/projects/issues/index.html.haml @@ -3,8 +3,8 @@ - if current_user = auto_discovery_link_tag(:atom, namespace_project_issues_url(@project.namespace, @project, :atom, private_token: current_user.private_token), title: "#{@project.name} issues") -.append-bottom-10 - .pull-right +.project-issuable-filter + .controls .pull-left - if current_user .hidden-xs.pull-left diff --git a/app/views/projects/merge_requests/_merge_requests.html.haml b/app/views/projects/merge_requests/_merge_requests.html.haml index b8a0ca9a42..d86707b3d9 100644 --- a/app/views/projects/merge_requests/_merge_requests.html.haml +++ b/app/views/projects/merge_requests/_merge_requests.html.haml @@ -1,9 +1,8 @@ -.panel.panel-default - %ul.well-list.mr-list - = render @merge_requests - - if @merge_requests.blank? - %li - .nothing-here-block No merge requests to show +%ul.content-list.mr-list + = render @merge_requests + - if @merge_requests.blank? + %li + .nothing-here-block No merge requests to show - if @merge_requests.present? .pull-right diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 72fbe2e27a..d3a576977c 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -1,7 +1,7 @@ - page_title "Merge Requests" = render 'projects/last_push' -.append-bottom-10 - .pull-right +.project-issuable-filter + .controls = render 'shared/issuable/search_form', path: namespace_project_merge_requests_path(@project.namespace, @project) - if can? current_user, :create_merge_request, @project diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index bcaa48c7a1..8f16773077 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -1,33 +1,28 @@ .issues-filters .issues-state-filters - %ul.nav.nav-tabs + %ul.center-top-menu %li{class: ("active" if params[:state] == 'opened')} = link_to page_filter_path(state: 'opened') do - = icon('exclamation-circle') #{state_filters_text_for(:opened, @project)} - if defined?(type) && type == :merge_requests %li{class: ("active" if params[:state] == 'merged')} = link_to page_filter_path(state: 'merged') do - = icon('check-circle') #{state_filters_text_for(:merged, @project)} %li{class: ("active" if params[:state] == 'closed')} = link_to page_filter_path(state: 'closed') do - = icon('ban') #{state_filters_text_for(:closed, @project)} - else %li{class: ("active" if params[:state] == 'closed')} = link_to page_filter_path(state: 'closed') do - = icon('check-circle') #{state_filters_text_for(:closed, @project)} %li{class: ("active" if params[:state] == 'all')} = link_to page_filter_path(state: 'all') do - = icon('compass') #{state_filters_text_for(:all, @project)} - .issues-details-filters + .issues-details-filters.gray-content-block = form_tag page_filter_path(without: [:assignee_id, :author_id, :milestone_title, :label_name]), method: :get, class: 'filter-form' do - if controller.controller_name == 'issues' && can?(current_user, :admin_issue, @project) .check-all-holder From 43394f0a307b0b42b808aa4b6b9ae09eb25fbe19 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 15:23:21 +0200 Subject: [PATCH 134/153] Dont render merge request target branch in list Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/merge_requests/_merge_request.html.haml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 0bcd543fee..4295c828da 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -14,11 +14,6 @@ %span %i.fa.fa-ban CLOSED - - else - %span.hidden-xs.hidden-sm - %span.label-branch< - %i.fa.fa-code-fork - %span= merge_request.target_branch - note_count = merge_request.mr_and_commit_notes.user.count - if merge_request.assignee   From bc6706fd6aceb62eba98280ba2a1a8420a413a46 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 15:28:04 +0200 Subject: [PATCH 135/153] REmove icons from milestone filters Signed-off-by: Dmitriy Zaporozhets --- app/views/dashboard/issues.html.haml | 4 ++-- app/views/shared/_milestones_filter.html.haml | 3 --- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/views/dashboard/issues.html.haml b/app/views/dashboard/issues.html.haml index 09e70f9ae2..cd602e897b 100644 --- a/app/views/dashboard/issues.html.haml +++ b/app/views/dashboard/issues.html.haml @@ -8,8 +8,8 @@ .append-bottom-20 .pull-right - if current_user - .hidden-xs.pull-left - = link_to issues_dashboard_url(format: :atom, private_token: current_user.private_token), class: 'btn' do + .hidden-xs.pull-left.prepend-top-20 + = link_to issues_dashboard_url(format: :atom, private_token: current_user.private_token), class: '' do %i.fa.fa-rss = render 'shared/issuable/filter', type: :issues diff --git a/app/views/shared/_milestones_filter.html.haml b/app/views/shared/_milestones_filter.html.haml index b513a11ecb..cbdecda4ff 100644 --- a/app/views/shared/_milestones_filter.html.haml +++ b/app/views/shared/_milestones_filter.html.haml @@ -2,13 +2,10 @@ %ul.center-top-menu %li{class: ("active" if params[:state].blank? || params[:state] == 'opened')} = link_to milestones_filter_path(state: 'opened') do - %i.fa.fa-exclamation-circle Open %li{class: ("active" if params[:state] == 'closed')} = link_to milestones_filter_path(state: 'closed') do - %i.fa.fa-check-circle Closed %li{class: ("active" if params[:state] == 'all')} = link_to milestones_filter_path(state: 'all') do - %i.fa.fa-compass All From aa75e76a0a06a4c23116145fa9ab86d645ed9a16 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 15:36:25 +0200 Subject: [PATCH 136/153] Fix this crazy random failing test Signed-off-by: Dmitriy Zaporozhets --- features/steps/project/commits/commits.rb | 4 ++++ features/steps/shared/diff_note.rb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/features/steps/project/commits/commits.rb b/features/steps/project/commits/commits.rb index a8532cc18d..e7dd20191b 100644 --- a/features/steps/project/commits/commits.rb +++ b/features/steps/project/commits/commits.rb @@ -98,4 +98,8 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps step 'I see inline diff button' do expect(page).to have_content "Inline" end + + step 'I click side-by-side diff button' do + find('#parallel-diff-btn').click + end end diff --git a/features/steps/shared/diff_note.rb b/features/steps/shared/diff_note.rb index ef567fe7e1..72621911a3 100644 --- a/features/steps/shared/diff_note.rb +++ b/features/steps/shared/diff_note.rb @@ -198,7 +198,7 @@ module SharedDiffNote end step 'I click side-by-side diff button' do - find('#parallel-diff-btn').click + find('#parallel-diff-btn').trigger('click') end step 'I see side-by-side diff button' do From 670544c8fa9602e954df7bca9bddd9bd8785b31f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 16:14:10 +0200 Subject: [PATCH 137/153] Style project home page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/avatar.scss | 4 ++- app/assets/stylesheets/generic/blocks.scss | 5 +++ app/assets/stylesheets/pages/projects.scss | 41 +++++++++++++++------- app/views/projects/_home_panel.html.haml | 2 +- app/views/projects/show.html.haml | 17 +++++---- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 5985e8239f..4fd7fbd21c 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -27,6 +27,7 @@ &.s48 { width: 48px; height: 48px; margin-right: 10px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; } &.s90 { width: 90px; height: 90px; margin-right: 15px; } + &.s140 { width: 140px; height: 140px; margin-right: 20px; } &.s160 { width: 160px; height: 160px; margin-right: 20px; } } @@ -40,5 +41,6 @@ &.s32 { font-size: 22px; line-height: 32px; } &.s60 { font-size: 32px; line-height: 60px; } &.s90 { font-size: 36px; line-height: 90px; } - &.s160 { font-size: 96px; line-height: 1.33; } + &.s140 { font-size: 72px; line-height: 140px; } + &.s160 { font-size: 96px; line-height: 160px; } } diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index e953ec741a..61209f73a2 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -27,6 +27,11 @@ border-bottom: 1px solid #e7e9ed; color: $gl-gray; + &.footer-block { + margin-top: 0; + margin-bottom: -$gl-padding; + } + .title { color: $gl-text-color; } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 51449b2752..0d94fc106b 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -16,6 +16,10 @@ .project-home-panel { text-align: center; + background: #f7f8fa; + margin: -$gl-padding; + padding: $gl-padding; + padding-top: 40px; .project-identicon-holder { margin-bottom: 15px; @@ -37,14 +41,13 @@ .project-home-desc { h1 { margin: 0; - margin-bottom: 10px; - font-size: 26px; - font-weight: bold; + margin-bottom: 5px; + font-size: 23px; + font-weight: normal; } p { - font-size: 18px; - color: #666; + color: #7f8fa4; display: inline; } } @@ -68,11 +71,12 @@ .btn { @extend .btn-info; + text-transform: uppercase; + font-size: 15px; + line-height: 20px; + padding: 10px 16px; + border-radius: 3px; margin-left: 10px; - font-weight: bold; - font-size: 14px; - line-height: 16px; - padding: 8px 12px; .count { padding-left: 7px; @@ -232,10 +236,23 @@ table.table.protected-branches-list tr.no-border { .project-stats { text-align: center; + margin-top: 0; + margin-bottom: 0; + padding-top: 5px; + padding-bottom: 0; - ul.nav-pills { display:inline-block; } - li { display:inline; } - a { float:left; } + ul.nav-pills { + display:inline-block; + } + + li { + display:inline; + } + + a { + float:left; + font-size: 17px; + } li.missing a { color: #bbb; diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index b93036e78e..e83256d368 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -1,7 +1,7 @@ - empty_repo = @project.empty_repo? .project-home-panel.clearfix{:class => ("empty-project" if empty_repo)} .project-identicon-holder - = project_icon(@project, alt: '', class: 'project-avatar avatar s90') + = project_icon(@project, alt: '', class: 'project-avatar avatar s140') .project-home-desc %h1= @project.name - if @project.description.present? diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index 507f2c7beb..d575891fd4 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -11,7 +11,7 @@ = render "home_panel" -.project-stats +.project-stats.gray-content-block %ul.nav.nav-pills %li = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do @@ -63,7 +63,6 @@ = icon("exclamation-triangle fw") Archived project! Repository is read-only -%hr %section - if prefer_readme? = render 'projects/readme' @@ -74,10 +73,10 @@ - if current_user - access = user_max_access_in_project(current_user, @project) - if access - %hr - %p.light - You have #{access} access to this project. - - if @project.project_member_by_id(current_user) - = link_to leave_namespace_project_project_members_path(@project.namespace, @project), - data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project', class: 'cred' do - Leave this project \ No newline at end of file + .prepend-top-20 + .gray-content-block.footer-block.center + You have #{access} access to this project. + - if @project.project_member_by_id(current_user) + = link_to leave_namespace_project_project_members_path(@project.namespace, @project), + data: { confirm: leave_project_message(@project) }, method: :delete, title: 'Leave project', class: 'cred' do + Leave this project From ac6dfbd91cf1d49ddf80896ff8c180613b19369c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 21:21:27 +0200 Subject: [PATCH 138/153] Make header and sidebar avatar more compact Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/variables.scss | 2 +- app/assets/stylesheets/generic/sidebar.scss | 16 ++++++++++------ app/views/layouts/_page.html.haml | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index f7d4b5d171..7f0b7fb2a6 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -12,7 +12,7 @@ $code_font_size: 13px; $code_line_height: 1.5; $border-color: #E7E9ED; $background-color: #F8FAFC; -$header-height: 67px; +$header-height: 61px; $fixed-layout-width: 1200px; $gl-gray: #7f8fa4; $gl-padding: 16px; diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 7089375947..30e367104f 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -127,7 +127,7 @@ width: $sidebar_collapsed_width; a { - padding-left: 7px; + padding-left: 10px; .gitlab-text-container { display: none; @@ -151,8 +151,12 @@ } .sidebar-user { - padding-left: 7px; + padding-left: 10px; width: $sidebar_collapsed_width; + + .username { + display: none; + } } } } @@ -210,7 +214,7 @@ margin-left: 10px; width: $sidebar_width - 2 * 10px; font-size: 16px; - line-height: 44px; + line-height: 36px; } } @@ -231,8 +235,8 @@ overflow: hidden; img { - width: $gl-avatar-size; - height: $gl-avatar-size; + width: 40px; + height: 40px; float: left; } @@ -245,7 +249,7 @@ margin: 0; margin-left: 14px; font-size: 19px; - line-height: 49px; + line-height: 41px; font-weight: normal; } } diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 02ee9910da..0814b63600 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -14,7 +14,7 @@ = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user' do - = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s46' + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s40' .username = current_user.username .content-wrapper From 9793c3460fe164e922cdc1084ef8bd94f16b93d3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 4 Sep 2015 21:36:56 +0200 Subject: [PATCH 139/153] Make project page and header more compact Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/variables.scss | 2 +- app/assets/stylesheets/generic/avatar.scss | 1 + app/assets/stylesheets/generic/sidebar.scss | 10 +++++----- app/assets/stylesheets/pages/projects.scss | 10 +++++++--- app/views/layouts/_page.html.haml | 2 +- app/views/projects/_home_panel.html.haml | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 7f0b7fb2a6..21462b3112 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -12,7 +12,7 @@ $code_font_size: 13px; $code_line_height: 1.5; $border-color: #E7E9ED; $background-color: #F8FAFC; -$header-height: 61px; +$header-height: 58px; $fixed-layout-width: 1200px; $gl-gray: #7f8fa4; $gl-padding: 16px; diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index 4fd7fbd21c..221cb6a04a 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -23,6 +23,7 @@ &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } &.s32 { width: 32px; height: 32px; margin-right: 10px; } + &.s36 { width: 36px; height: 36px; margin-right: 10px; } &.s46 { width: 46px; height: 46px; margin-right: 15px; } &.s48 { width: 48px; height: 48px; margin-right: 10px; } &.s60 { width: 60px; height: 60px; margin-right: 12px; } diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 30e367104f..22720c2e1d 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -127,7 +127,7 @@ width: $sidebar_collapsed_width; a { - padding-left: 10px; + padding-left: 12px; .gitlab-text-container { display: none; @@ -151,7 +151,7 @@ } .sidebar-user { - padding-left: 10px; + padding-left: 12px; width: $sidebar_collapsed_width; .username { @@ -214,7 +214,7 @@ margin-left: 10px; width: $sidebar_width - 2 * 10px; font-size: 16px; - line-height: 36px; + line-height: 34px; } } @@ -235,8 +235,8 @@ overflow: hidden; img { - width: 40px; - height: 40px; + width: 36px; + height: 36px; float: left; } diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 0d94fc106b..64db6a85de 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -41,7 +41,7 @@ .project-home-desc { h1 { margin: 0; - margin-bottom: 5px; + margin-bottom: 10px; font-size: 23px; font-weight: normal; } @@ -55,6 +55,10 @@ .git-clone-holder { max-width: 600px; margin: 20px auto; + + .form-control { + background: #FFF; + } } .visibility-level-label { @@ -65,7 +69,7 @@ } .project-repo-buttons { - margin-top: 25px; + margin-top: $gl-padding; margin-bottom: 25px; .btn { @@ -74,7 +78,7 @@ text-transform: uppercase; font-size: 15px; line-height: 20px; - padding: 10px 16px; + padding: 8px 14px; border-radius: 3px; margin-left: 10px; diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 0814b63600..1275c42000 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -14,7 +14,7 @@ = render partial: 'layouts/collapse_button' - if current_user = link_to current_user, class: 'sidebar-user' do - = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s40' + = image_tag avatar_icon(current_user.email, 60), alt: 'User activity', class: 'avatar avatar s36' .username = current_user.username .content-wrapper diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index e83256d368..b93036e78e 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -1,7 +1,7 @@ - empty_repo = @project.empty_repo? .project-home-panel.clearfix{:class => ("empty-project" if empty_repo)} .project-identicon-holder - = project_icon(@project, alt: '', class: 'project-avatar avatar s140') + = project_icon(@project, alt: '', class: 'project-avatar avatar s90') .project-home-desc %h1= @project.name - if @project.description.present? From cc22a2640f7d9aed743739c583d1fa8f11af2b91 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 4 Sep 2015 17:07:24 -0400 Subject: [PATCH 140/153] Add syntax highlight scheme to notes rendered client-side --- app/assets/javascripts/notes.js.coffee | 1 + app/assets/javascripts/syntax_highlight.coffee | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index 0021d17d85..b7f2c63c5a 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -123,6 +123,7 @@ class @Notes if @isNewNote(note) @note_ids.push(note.id) $('ul.main-notes-list').append(note.html) + $('.js-syntax-highlight').syntaxHighlight() @initTaskList() ### diff --git a/app/assets/javascripts/syntax_highlight.coffee b/app/assets/javascripts/syntax_highlight.coffee index 510f15d1b4..71295cd4b0 100644 --- a/app/assets/javascripts/syntax_highlight.coffee +++ b/app/assets/javascripts/syntax_highlight.coffee @@ -5,5 +5,8 @@ # #

# +$.fn.syntaxHighlight = -> + $(this).addClass(gon.user_color_scheme) + $(document).on 'ready page:load', -> - $('.js-syntax-highlight').addClass(gon.user_color_scheme) + $('.js-syntax-highlight').syntaxHighlight() From 38f1d571fe17725d437dae2f6c4f18006117ef9d Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 4 Sep 2015 16:35:01 -0400 Subject: [PATCH 141/153] Remove style attribute from textarea during ZenMode activation Closes internal https://dev.gitlab.org/gitlab/gitlabhq/issues/2466 --- app/assets/javascripts/zen_mode.js.coffee | 2 ++ spec/javascripts/zen_mode_spec.js.coffee | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/app/assets/javascripts/zen_mode.js.coffee b/app/assets/javascripts/zen_mode.js.coffee index 8a0564a909..a1462cf3ca 100644 --- a/app/assets/javascripts/zen_mode.js.coffee +++ b/app/assets/javascripts/zen_mode.js.coffee @@ -38,6 +38,8 @@ class @ZenMode @active_checkbox = $(checkbox) @active_checkbox.prop('checked', true) @active_zen_area = @active_checkbox.parent().find('textarea') + # Prevent a user-resized textarea from persisting to fullscreen + @active_zen_area.removeAttr('style') @active_zen_area.focus() exitZenMode: => diff --git a/spec/javascripts/zen_mode_spec.js.coffee b/spec/javascripts/zen_mode_spec.js.coffee index 1f4ea58ad4..4cb3836755 100644 --- a/spec/javascripts/zen_mode_spec.js.coffee +++ b/spec/javascripts/zen_mode_spec.js.coffee @@ -29,6 +29,11 @@ describe 'ZenMode', -> enterZen() expect(Mousetrap.pause).toHaveBeenCalled() + it 'removes textarea styling', -> + $('textarea').attr('style', 'height: 400px') + enterZen() + expect('textarea').not.toHaveAttr('style') + describe 'in use', -> beforeEach -> enterZen() From a5314e79f26f7f0de43388a0fde142d91f3ddd96 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Fri, 4 Sep 2015 16:24:01 -0700 Subject: [PATCH 142/153] Fix URL construction for merge requests, issues, notes, and commits for relative URL config Closes https://github.com/gitlabhq/gitlabhq/issues/9605 --- CHANGELOG | 1 + lib/gitlab/url_builder.rb | 8 ++------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 8154d4333d..a69e6b79a6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) + - Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu) - Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU) - Prevent anchors from being hidden by header (Stan Hu) - Fix bug where only the first 15 Bitbucket issues would be imported (Stan Hu) diff --git a/lib/gitlab/url_builder.rb b/lib/gitlab/url_builder.rb index 11b0d44f34..779819bc2b 100644 --- a/lib/gitlab/url_builder.rb +++ b/lib/gitlab/url_builder.rb @@ -23,12 +23,12 @@ module Gitlab def build_issue_url(id) issue = Issue.find(id) - issue_url(issue, host: Gitlab.config.gitlab['url']) + issue_url(issue) end def build_merge_request_url(id) merge_request = MergeRequest.find(id) - merge_request_url(merge_request, host: Gitlab.config.gitlab['url']) + merge_request_url(merge_request) end def build_note_url(id) @@ -37,22 +37,18 @@ module Gitlab namespace_project_commit_url(namespace_id: note.project.namespace, id: note.commit_id, project_id: note.project, - host: Gitlab.config.gitlab['url'], anchor: "note_#{note.id}") elsif note.for_issue? issue = Issue.find(note.noteable_id) issue_url(issue, - host: Gitlab.config.gitlab['url'], anchor: "note_#{note.id}") elsif note.for_merge_request? merge_request = MergeRequest.find(note.noteable_id) merge_request_url(merge_request, - host: Gitlab.config.gitlab['url'], anchor: "note_#{note.id}") elsif note.for_project_snippet? snippet = Snippet.find(note.noteable_id) project_snippet_url(snippet, - host: Gitlab.config.gitlab['url'], anchor: "note_#{note.id}") end end From 30039dae6326e7b1ae7e3e2d321def122cda3e36 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 6 Sep 2015 00:29:41 -0700 Subject: [PATCH 143/153] Upgrade Redis requirement check to 2.4.0 per https://github.com/mperham/sidekiq/pull/957 Closes #2222 Closes #2445 --- lib/tasks/gitlab/check.rake | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index 2b9688c1b4..7999fe0b0e 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -278,7 +278,7 @@ namespace :gitlab do fix_and_rerun end end - + def check_uploads print "Uploads directory setup correctly? ... " @@ -331,15 +331,18 @@ namespace :gitlab do end def check_redis_version - print "Redis version >= 2.0.0? ... " + min_redis_version = "2.4.0" + print "Redis version >= #{min_redis_version}? ... " redis_version = run(%W(redis-cli --version)) - if redis_version.try(:match, /redis-cli 2.\d.\d/) || redis_version.try(:match, /redis-cli 3.\d.\d/) + redis_version = redis_version.try(:match, /redis-cli (.*)/) + if redis_version && + (Gem::Version.new(redis_version[1]) > Gem::Version.new(min_redis_version)) puts "yes".green else puts "no".red try_fixing_it( - "Update your redis server to a version >= 2.0.0" + "Update your redis server to a version >= #{min_redis_version}" ) for_more_information( "gitlab-public-wiki/wiki/Trouble-Shooting-Guide in section sidekiq" From fd6eba34eba76ea348b8e1d65f2c1ccb901095f9 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 6 Sep 2015 07:41:23 -0700 Subject: [PATCH 144/153] Use File.join to prevent extra slash in help message from appearing. Before: ``` Try fixing it: sudo -u git -H /opt/gitlab/embedded/service/gitlab-shell//bin/create-hooks ``` --- lib/tasks/gitlab/check.rake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index 2b9688c1b4..504823f3e1 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -278,7 +278,7 @@ namespace :gitlab do fix_and_rerun end end - + def check_uploads print "Uploads directory setup correctly? ... " @@ -488,7 +488,7 @@ namespace :gitlab do else puts "wrong or missing hooks".red try_fixing_it( - sudo_gitlab("#{gitlab_shell_path}/bin/create-hooks"), + sudo_gitlab("#{File.join(gitlab_shell_path, 'bin/create-hooks')}"), 'Check the hooks_path in config/gitlab.yml', 'Check your gitlab-shell installation' ) From d7812a95cf518dfa1565a0514b87fb40f86949e5 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 6 Sep 2015 07:48:48 -0700 Subject: [PATCH 145/153] Re-annotate models --- app/models/abuse_report.rb | 12 ++ app/models/issue.rb | 27 ++--- app/models/merge_request.rb | 1 + app/models/note.rb | 1 + .../project_services/drone_ci_service.rb | 20 ++++ app/models/sent_notification.rb | 13 +++ app/models/user.rb | 108 +++++++++--------- spec/factories/abuse_reports.rb | 12 ++ spec/factories/merge_requests.rb | 1 + spec/factories/notes.rb | 1 + spec/models/abuse_report_spec.rb | 12 ++ spec/models/application_setting_spec.rb | 1 + spec/models/issue_spec.rb | 27 ++--- spec/models/merge_request_spec.rb | 1 + spec/models/note_spec.rb | 1 + spec/models/user_spec.rb | 108 +++++++++--------- 16 files changed, 208 insertions(+), 138 deletions(-) diff --git a/app/models/abuse_report.rb b/app/models/abuse_report.rb index c8c39db11b..07c87a7fe8 100644 --- a/app/models/abuse_report.rb +++ b/app/models/abuse_report.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: abuse_reports +# +# id :integer not null, primary key +# reporter_id :integer +# user_id :integer +# message :text +# created_at :datetime +# updated_at :datetime +# + class AbuseReport < ActiveRecord::Base belongs_to :reporter, class_name: "User" belongs_to :user diff --git a/app/models/issue.rb b/app/models/issue.rb index 2456b7d0dc..fc7e9abe29 100644 --- a/app/models/issue.rb +++ b/app/models/issue.rb @@ -2,19 +2,20 @@ # # Table name: issues # -# id :integer not null, primary key -# title :string(255) -# assignee_id :integer -# author_id :integer -# project_id :integer -# created_at :datetime -# updated_at :datetime -# position :integer default(0) -# branch_name :string(255) -# description :text -# milestone_id :integer -# state :string(255) -# iid :integer +# id :integer not null, primary key +# title :string(255) +# assignee_id :integer +# author_id :integer +# project_id :integer +# created_at :datetime +# updated_at :datetime +# position :integer default(0) +# branch_name :string(255) +# description :text +# milestone_id :integer +# state :string(255) +# iid :integer +# updated_by_id :integer # require 'carrierwave/orm/activerecord' diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 467b90861f..93faa13387 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -19,6 +19,7 @@ # description :text # position :integer default(0) # locked_at :datetime +# updated_by_id :integer # require Rails.root.join("app/models/commit") diff --git a/app/models/note.rb b/app/models/note.rb index 36cad8f583..89d81ab1de 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -15,6 +15,7 @@ # noteable_id :integer # system :boolean default(FALSE), not null # st_diff :text +# updated_by_id :integer # require 'carrierwave/orm/activerecord' diff --git a/app/models/project_services/drone_ci_service.rb b/app/models/project_services/drone_ci_service.rb index 39f732c811..3e2b7faecd 100644 --- a/app/models/project_services/drone_ci_service.rb +++ b/app/models/project_services/drone_ci_service.rb @@ -1,3 +1,23 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# template :boolean default(FALSE) +# push_events :boolean default(TRUE) +# issues_events :boolean default(TRUE) +# merge_requests_events :boolean default(TRUE) +# tag_push_events :boolean default(TRUE) +# note_events :boolean default(TRUE), not null +# + class DroneCiService < CiService prop_accessor :drone_url, :token, :enable_ssl_verification diff --git a/app/models/sent_notification.rb b/app/models/sent_notification.rb index 460ca40be3..33b113a2a2 100644 --- a/app/models/sent_notification.rb +++ b/app/models/sent_notification.rb @@ -1,3 +1,16 @@ +# == Schema Information +# +# Table name: sent_notifications +# +# id :integer not null, primary key +# project_id :integer +# noteable_id :integer +# noteable_type :string(255) +# recipient_id :integer +# commit_id :string(255) +# reply_key :string(255) not null +# + class SentNotification < ActiveRecord::Base belongs_to :project belongs_to :noteable, polymorphic: true diff --git a/app/models/user.rb b/app/models/user.rb index 48e0e6ed48..bff8eeed96 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,62 +2,58 @@ # # Table name: users # -# id :integer not null, primary key -# email :string(255) default(""), not null -# encrypted_password :string(255) default(""), not null -# reset_password_token :string(255) -# reset_password_sent_at :datetime -# remember_created_at :datetime -# sign_in_count :integer default(0) -# current_sign_in_at :datetime -# last_sign_in_at :datetime -# current_sign_in_ip :string(255) -# last_sign_in_ip :string(255) -# created_at :datetime -# updated_at :datetime -# name :string(255) -# admin :boolean default(FALSE), not null -# projects_limit :integer default(10) -# skype :string(255) default(""), not null -# linkedin :string(255) default(""), not null -# twitter :string(255) default(""), not null -# authentication_token :string(255) -# theme_id :integer default(1), not null -# bio :string(255) -# failed_attempts :integer default(0) -# locked_at :datetime -# username :string(255) -# can_create_group :boolean default(TRUE), not null -# can_create_team :boolean default(TRUE), not null -# state :string(255) -# color_scheme_id :integer default(1), not null -# notification_level :integer default(1), not null -# password_expires_at :datetime -# created_by_id :integer -# last_credential_check_at :datetime -# avatar :string(255) -# confirmation_token :string(255) -# confirmed_at :datetime -# confirmation_sent_at :datetime -# unconfirmed_email :string(255) -# hide_no_ssh_key :boolean default(FALSE) -# website_url :string(255) default(""), not null -# github_access_token :string(255) -# gitlab_access_token :string(255) -# notification_email :string(255) -# hide_no_password :boolean default(FALSE) -# password_automatically_set :boolean default(FALSE) -# bitbucket_access_token :string(255) -# bitbucket_access_token_secret :string(255) -# location :string(255) -# encrypted_otp_secret :string(255) -# encrypted_otp_secret_iv :string(255) -# encrypted_otp_secret_salt :string(255) -# otp_required_for_login :boolean default(FALSE), not null -# otp_backup_codes :text -# public_email :string(255) default(""), not null -# dashboard :integer default(0) -# project_view :integer default(0) +# id :integer not null, primary key +# email :string(255) default(""), not null +# encrypted_password :string(255) default(""), not null +# reset_password_token :string(255) +# reset_password_sent_at :datetime +# remember_created_at :datetime +# sign_in_count :integer default(0) +# current_sign_in_at :datetime +# last_sign_in_at :datetime +# current_sign_in_ip :string(255) +# last_sign_in_ip :string(255) +# created_at :datetime +# updated_at :datetime +# name :string(255) +# admin :boolean default(FALSE), not null +# projects_limit :integer default(10) +# skype :string(255) default(""), not null +# linkedin :string(255) default(""), not null +# twitter :string(255) default(""), not null +# authentication_token :string(255) +# theme_id :integer default(1), not null +# bio :string(255) +# failed_attempts :integer default(0) +# locked_at :datetime +# username :string(255) +# can_create_group :boolean default(TRUE), not null +# can_create_team :boolean default(TRUE), not null +# state :string(255) +# color_scheme_id :integer default(1), not null +# notification_level :integer default(1), not null +# password_expires_at :datetime +# created_by_id :integer +# last_credential_check_at :datetime +# avatar :string(255) +# confirmation_token :string(255) +# confirmed_at :datetime +# confirmation_sent_at :datetime +# unconfirmed_email :string(255) +# hide_no_ssh_key :boolean default(FALSE) +# website_url :string(255) default(""), not null +# notification_email :string(255) +# hide_no_password :boolean default(FALSE) +# password_automatically_set :boolean default(FALSE) +# location :string(255) +# encrypted_otp_secret :string(255) +# encrypted_otp_secret_iv :string(255) +# encrypted_otp_secret_salt :string(255) +# otp_required_for_login :boolean default(FALSE), not null +# otp_backup_codes :text +# public_email :string(255) default(""), not null +# dashboard :integer default(0) +# project_view :integer default(0) # require 'carrierwave/orm/activerecord' diff --git a/spec/factories/abuse_reports.rb b/spec/factories/abuse_reports.rb index 29fcbc5e19..8d287ded29 100644 --- a/spec/factories/abuse_reports.rb +++ b/spec/factories/abuse_reports.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: abuse_reports +# +# id :integer not null, primary key +# reporter_id :integer +# user_id :integer +# message :text +# created_at :datetime +# updated_at :datetime +# + # Read about factories at https://github.com/thoughtbot/factory_girl FactoryGirl.define do diff --git a/spec/factories/merge_requests.rb b/spec/factories/merge_requests.rb index 3b7adfe439..6080d0ccde 100644 --- a/spec/factories/merge_requests.rb +++ b/spec/factories/merge_requests.rb @@ -19,6 +19,7 @@ # description :text # position :integer default(0) # locked_at :datetime +# updated_by_id :integer # FactoryGirl.define do diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb index e1009d5916..9d777ddfcc 100644 --- a/spec/factories/notes.rb +++ b/spec/factories/notes.rb @@ -15,6 +15,7 @@ # noteable_id :integer # system :boolean default(FALSE), not null # st_diff :text +# updated_by_id :integer # require_relative '../support/repo_helpers' diff --git a/spec/models/abuse_report_spec.rb b/spec/models/abuse_report_spec.rb index d83004a838..635a6e2518 100644 --- a/spec/models/abuse_report_spec.rb +++ b/spec/models/abuse_report_spec.rb @@ -1,3 +1,15 @@ +# == Schema Information +# +# Table name: abuse_reports +# +# id :integer not null, primary key +# reporter_id :integer +# user_id :integer +# message :text +# created_at :datetime +# updated_at :datetime +# + require 'rails_helper' RSpec.describe AbuseReport, type: :model do diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb index bc14ff98fd..de0b2ef4cd 100644 --- a/spec/models/application_setting_spec.rb +++ b/spec/models/application_setting_spec.rb @@ -22,6 +22,7 @@ # user_oauth_applications :boolean default(TRUE) # after_sign_out_path :string(255) # session_expire_delay :integer default(10080), not null +# import_sources :text # require 'spec_helper' diff --git a/spec/models/issue_spec.rb b/spec/models/issue_spec.rb index 9bac451c28..cf336d8295 100644 --- a/spec/models/issue_spec.rb +++ b/spec/models/issue_spec.rb @@ -2,19 +2,20 @@ # # Table name: issues # -# id :integer not null, primary key -# title :string(255) -# assignee_id :integer -# author_id :integer -# project_id :integer -# created_at :datetime -# updated_at :datetime -# position :integer default(0) -# branch_name :string(255) -# description :text -# milestone_id :integer -# state :string(255) -# iid :integer +# id :integer not null, primary key +# title :string(255) +# assignee_id :integer +# author_id :integer +# project_id :integer +# created_at :datetime +# updated_at :datetime +# position :integer default(0) +# branch_name :string(255) +# description :text +# milestone_id :integer +# state :string(255) +# iid :integer +# updated_by_id :integer # require 'spec_helper' diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index b91687bc09..17a49013d2 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -19,6 +19,7 @@ # description :text # position :integer default(0) # locked_at :datetime +# updated_by_id :integer # require 'spec_helper' diff --git a/spec/models/note_spec.rb b/spec/models/note_spec.rb index 331505a01b..3a0b194ba1 100644 --- a/spec/models/note_spec.rb +++ b/spec/models/note_spec.rb @@ -15,6 +15,7 @@ # noteable_id :integer # system :boolean default(FALSE), not null # st_diff :text +# updated_by_id :integer # require 'spec_helper' diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a46e789eab..eeb9069aa1 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -2,62 +2,58 @@ # # Table name: users # -# id :integer not null, primary key -# email :string(255) default(""), not null -# encrypted_password :string(255) default(""), not null -# reset_password_token :string(255) -# reset_password_sent_at :datetime -# remember_created_at :datetime -# sign_in_count :integer default(0) -# current_sign_in_at :datetime -# last_sign_in_at :datetime -# current_sign_in_ip :string(255) -# last_sign_in_ip :string(255) -# created_at :datetime -# updated_at :datetime -# name :string(255) -# admin :boolean default(FALSE), not null -# projects_limit :integer default(10) -# skype :string(255) default(""), not null -# linkedin :string(255) default(""), not null -# twitter :string(255) default(""), not null -# authentication_token :string(255) -# theme_id :integer default(1), not null -# bio :string(255) -# failed_attempts :integer default(0) -# locked_at :datetime -# username :string(255) -# can_create_group :boolean default(TRUE), not null -# can_create_team :boolean default(TRUE), not null -# state :string(255) -# color_scheme_id :integer default(1), not null -# notification_level :integer default(1), not null -# password_expires_at :datetime -# created_by_id :integer -# last_credential_check_at :datetime -# avatar :string(255) -# confirmation_token :string(255) -# confirmed_at :datetime -# confirmation_sent_at :datetime -# unconfirmed_email :string(255) -# hide_no_ssh_key :boolean default(FALSE) -# website_url :string(255) default(""), not null -# github_access_token :string(255) -# gitlab_access_token :string(255) -# notification_email :string(255) -# hide_no_password :boolean default(FALSE) -# password_automatically_set :boolean default(FALSE) -# bitbucket_access_token :string(255) -# bitbucket_access_token_secret :string(255) -# location :string(255) -# encrypted_otp_secret :string(255) -# encrypted_otp_secret_iv :string(255) -# encrypted_otp_secret_salt :string(255) -# otp_required_for_login :boolean default(FALSE), not null -# otp_backup_codes :text -# public_email :string(255) default(""), not null -# dashboard :integer default(0) -# project_view :integer default(0) +# id :integer not null, primary key +# email :string(255) default(""), not null +# encrypted_password :string(255) default(""), not null +# reset_password_token :string(255) +# reset_password_sent_at :datetime +# remember_created_at :datetime +# sign_in_count :integer default(0) +# current_sign_in_at :datetime +# last_sign_in_at :datetime +# current_sign_in_ip :string(255) +# last_sign_in_ip :string(255) +# created_at :datetime +# updated_at :datetime +# name :string(255) +# admin :boolean default(FALSE), not null +# projects_limit :integer default(10) +# skype :string(255) default(""), not null +# linkedin :string(255) default(""), not null +# twitter :string(255) default(""), not null +# authentication_token :string(255) +# theme_id :integer default(1), not null +# bio :string(255) +# failed_attempts :integer default(0) +# locked_at :datetime +# username :string(255) +# can_create_group :boolean default(TRUE), not null +# can_create_team :boolean default(TRUE), not null +# state :string(255) +# color_scheme_id :integer default(1), not null +# notification_level :integer default(1), not null +# password_expires_at :datetime +# created_by_id :integer +# last_credential_check_at :datetime +# avatar :string(255) +# confirmation_token :string(255) +# confirmed_at :datetime +# confirmation_sent_at :datetime +# unconfirmed_email :string(255) +# hide_no_ssh_key :boolean default(FALSE) +# website_url :string(255) default(""), not null +# notification_email :string(255) +# hide_no_password :boolean default(FALSE) +# password_automatically_set :boolean default(FALSE) +# location :string(255) +# encrypted_otp_secret :string(255) +# encrypted_otp_secret_iv :string(255) +# encrypted_otp_secret_salt :string(255) +# otp_required_for_login :boolean default(FALSE), not null +# otp_backup_codes :text +# public_email :string(255) default(""), not null +# dashboard :integer default(0) +# project_view :integer default(0) # require 'spec_helper' From 6c1d5c5c9c6b0b52741a5bd72a91042d473c390a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 11:10:40 +0200 Subject: [PATCH 146/153] Fix project page with activity as default home page --- app/assets/stylesheets/pages/projects.scss | 6 ++++++ app/views/projects/_activity.html.haml | 2 +- app/views/projects/show.html.haml | 6 ++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 64db6a85de..6ab01b3e1b 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -331,3 +331,9 @@ pre.light-well { padding: 10px 15px; margin: 0; } + +.project-show-activity { + .activity-filter-block { + margin-top: -1px; + } +} diff --git a/app/views/projects/_activity.html.haml b/app/views/projects/_activity.html.haml index 86133768d7..1261f6254d 100644 --- a/app/views/projects/_activity.html.haml +++ b/app/views/projects/_activity.html.haml @@ -1,5 +1,5 @@ = render 'projects/last_push' -.gray-content-block +.gray-content-block.activity-filter-block - if current_user %ul.nav.nav-pills.event_filter.pull-right %li diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index d575891fd4..d5c4ee7197 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -65,9 +65,11 @@ %section - if prefer_readme? - = render 'projects/readme' + .project-show-readme + = render 'projects/readme' - else - = render 'projects/activity' + .project-show-activity + = render 'projects/activity' - if current_user From aa6d29f0a703810cd57ce89f7447f8d12ff6a252 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 11:44:00 +0200 Subject: [PATCH 147/153] Style commits, branches and tags pages to match new UI --- app/assets/stylesheets/base/mixins.scss | 2 +- app/assets/stylesheets/generic/lists.scss | 2 +- app/assets/stylesheets/pages/projects.scss | 3 ++- app/views/projects/branches/_branch.html.haml | 13 +++++----- app/views/projects/branches/_commit.html.haml | 7 ++++++ app/views/projects/branches/index.html.haml | 8 +++--- app/views/projects/commits/_head.html.haml | 6 +---- app/views/projects/commits/show.html.haml | 25 ++++++++++--------- app/views/projects/compare/_form.html.haml | 2 +- app/views/projects/compare/index.html.haml | 7 +++--- app/views/projects/compare/show.html.haml | 12 ++++----- app/views/projects/tags/_tag.html.haml | 12 ++++----- app/views/projects/tags/index.html.haml | 11 +++----- app/views/projects/tree/_tree.html.haml | 2 +- 14 files changed, 56 insertions(+), 56 deletions(-) create mode 100644 app/views/projects/branches/_commit.html.haml diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 2d2e8b3ded..8698109bc4 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -169,7 +169,7 @@ padding: 0px; list-style: none; - li { + > li { padding: 10px 0; border-bottom: 1px solid #EEE; overflow: hidden; diff --git a/app/assets/stylesheets/generic/lists.scss b/app/assets/stylesheets/generic/lists.scss index 601fdd1e32..3bfed8de77 100644 --- a/app/assets/stylesheets/generic/lists.scss +++ b/app/assets/stylesheets/generic/lists.scss @@ -105,7 +105,7 @@ ul.content-list { margin: 0; padding: 0; - li { + > li { padding: $gl-padding; border-color: #f1f2f4; margin-left: -$gl-padding; diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 6ab01b3e1b..361fd63bc7 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -193,8 +193,9 @@ ul.nav.nav-projects-tabs { .breadcrumb.repo-breadcrumb { padding: 0; line-height: 42px; - background: white; + background: transparent; border: none; + margin: 0; > li + li:before { padding: 0 3px; diff --git a/app/views/projects/branches/_branch.html.haml b/app/views/projects/branches/_branch.html.haml index a693c4b282..cc0ec9483d 100644 --- a/app/views/projects/branches/_branch.html.haml +++ b/app/views/projects/branches/_branch.html.haml @@ -1,20 +1,20 @@ - commit = @repository.commit(branch.target) %li(class="js-branch-#{branch.name}") - %h4 + %div = link_to namespace_project_tree_path(@project.namespace, @project, branch.name) do %strong.str-truncated= branch.name +   - if branch.name == @repository.root_ref - %span.label.label-info default + %span.label.label-primary default - elsif @repository.merged_to_root_ref? branch.name - %span.label.label-primary.has_tooltip(title="Merged into #{@repository.root_ref}") - %i.fa.fa-check + %span.label.label-info.has_tooltip(title="Merged into #{@repository.root_ref}") merged - if @project.protected_branch? branch.name %span.label.label-success %i.fa.fa-lock protected - .pull-right + .controls.hidden-xs - if create_mr_button?(@repository.root_ref, branch.name) = link_to create_mr_path(@repository.root_ref, branch.name), class: 'btn btn-grouped btn-xs' do = icon('plus') @@ -30,8 +30,7 @@ = icon("trash-o") - if commit - %ul.list-unstyled - = render 'projects/commits/inline_commit', commit: commit, project: @project + = render 'projects/branches/commit', commit: commit, project: @project - else %p Cant find HEAD commit for this branch diff --git a/app/views/projects/branches/_commit.html.haml b/app/views/projects/branches/_commit.html.haml new file mode 100644 index 0000000000..68326e65d8 --- /dev/null +++ b/app/views/projects/branches/_commit.html.haml @@ -0,0 +1,7 @@ +.branch-commit.light + = link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id" + · + %span.str-truncated + = link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message" + · + #{time_ago_with_tooltip(commit.committed_date)} diff --git a/app/views/projects/branches/index.html.haml b/app/views/projects/branches/index.html.haml index 80acc93790..6e2dc2d271 100644 --- a/app/views/projects/branches/index.html.haml +++ b/app/views/projects/branches/index.html.haml @@ -1,7 +1,6 @@ - page_title "Branches" = render "projects/commits/head" -%h3.page-title - Branches +.gray-content-block .pull-right - if can? current_user, :push_code, @project = link_to new_namespace_project_branch_path(@project.namespace, @project), class: 'btn btn-create' do @@ -24,9 +23,10 @@ = sort_title_recently_updated = link_to namespace_project_branches_path(sort: 'last_updated') do = sort_title_oldest_updated -%hr + .oneline + Protected branches can be managed in project settings - unless @branches.empty? - %ul.bordered-list.top-list.all-branches + %ul.content-list.all-branches - @branches.each do |branch| = render "projects/branches/branch", branch: branch = paginate @branches, theme: 'gitlab' diff --git a/app/views/projects/commits/_head.html.haml b/app/views/projects/commits/_head.html.haml index e3d8cd0fdd..50c0fd6803 100644 --- a/app/views/projects/commits/_head.html.haml +++ b/app/views/projects/commits/_head.html.haml @@ -1,22 +1,18 @@ -%ul.nav.nav-tabs +%ul.center-top-menu = nav_link(controller: [:commit, :commits]) do = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do - = icon("history") Commits %span.badge= number_with_delimiter(@repository.commit_count) = nav_link(controller: :compare) do = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: @ref || @repository.root_ref) do - = icon("exchange") Compare = nav_link(html_options: {class: branches_tab_class}) do = link_to namespace_project_branches_path(@project.namespace, @project) do - = icon("code-fork") Branches %span.badge.js-totalbranch-count= @repository.branches.size = nav_link(controller: :tags) do = link_to namespace_project_tags_path(@project.namespace, @project) do - = icon("tags") Tags %span.badge.js-totaltags-count= @repository.tags.length diff --git a/app/views/projects/commits/show.html.haml b/app/views/projects/commits/show.html.haml index 55054a3197..a01a99458a 100644 --- a/app/views/projects/commits/show.html.haml +++ b/app/views/projects/commits/show.html.haml @@ -5,22 +5,23 @@ = render "head" -.tree-ref-holder - = render 'shared/ref_switcher', destination: 'commits' +.gray-content-block + .tree-ref-holder + = render 'shared/ref_switcher', destination: 'commits' -.commits-feed-holder.hidden-xs.hidden-sm - - if create_mr_button?(@repository.root_ref, @ref) - = link_to create_mr_path(@repository.root_ref, @ref), class: 'btn btn-success' do - = icon('plus') - Create Merge Request + .commits-feed-holder.hidden-xs.hidden-sm + - if create_mr_button?(@repository.root_ref, @ref) + = link_to create_mr_path(@repository.root_ref, @ref), class: 'btn btn-success' do + = icon('plus') + Create Merge Request - - if current_user && current_user.private_token - = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Commits Feed", class: 'prepend-left-10 btn' do - = icon("rss") + - if current_user && current_user.private_token + = link_to namespace_project_commits_path(@project.namespace, @project, @ref, {format: :atom, private_token: current_user.private_token}), title: "Commits Feed", class: 'prepend-left-10 btn' do + = icon("rss") -%ul.breadcrumb.repo-breadcrumb - = commits_breadcrumbs + %ul.breadcrumb.repo-breadcrumb + = commits_breadcrumbs %div{id: dom_id(@project)} #commits-list= render "commits", project: @project diff --git a/app/views/projects/compare/_form.html.haml b/app/views/projects/compare/_form.html.haml index 3019893d12..efc25eda26 100644 --- a/app/views/projects/compare/_form.html.haml +++ b/app/views/projects/compare/_form.html.haml @@ -1,5 +1,5 @@ = form_tag namespace_project_compare_index_path(@project.namespace, @project), method: :post, class: 'form-inline js-requires-input' do - .clearfix.append-bottom-20 + .clearfix - if params[:to] && params[:from] = link_to 'switch', {from: params[:to], to: params[:from]}, {class: 'commits-compare-switch has_tooltip', title: 'Switch base of comparison'} .form-group diff --git a/app/views/projects/compare/index.html.haml b/app/views/projects/compare/index.html.haml index d1e579a2ed..43d00726c4 100644 --- a/app/views/projects/compare/index.html.haml +++ b/app/views/projects/compare/index.html.haml @@ -1,9 +1,7 @@ - page_title "Compare" = render "projects/commits/head" -%h3.page-title - Compare View -%p.slead +.gray-content-block Compare branches, tags or commit ranges. %br Fill input field with commit id like @@ -14,4 +12,5 @@ %br Changes are shown from the version in the first field to the version in the second field. -= render "form" +.prepend-top-20 + = render "form" diff --git a/app/views/projects/compare/show.html.haml b/app/views/projects/compare/show.html.haml index 3670dd5c13..8800ffdf48 100644 --- a/app/views/projects/compare/show.html.haml +++ b/app/views/projects/compare/show.html.haml @@ -1,16 +1,16 @@ - page_title "#{params[:from]}...#{params[:to]}" = render "projects/commits/head" -%h3.page-title - Compare View -= render "form" +.gray-content-block + = render "form" - if @commits.present? - = render "projects/commits/commit_list" - = render "projects/diffs/diffs", diffs: @diffs, project: @project + .prepend-top-20 + = render "projects/commits/commit_list" + = render "projects/diffs/diffs", diffs: @diffs, project: @project - else - .light-well + .light-well.prepend-top-20 .center %h4 There isn't anything to compare. diff --git a/app/views/projects/tags/_tag.html.haml b/app/views/projects/tags/_tag.html.haml index 28ad272322..2ca295fc5f 100644 --- a/app/views/projects/tags/_tag.html.haml +++ b/app/views/projects/tags/_tag.html.haml @@ -1,13 +1,14 @@ - commit = @repository.commit(tag.target) %li - %h4 + %div = link_to namespace_project_commits_path(@project.namespace, @project, tag.name), class: "" do - %i.fa.fa-tag - = tag.name + %strong + %i.fa.fa-tag + = tag.name - if tag.message.present?   = strip_gpg_signature(tag.message) - .pull-right + .controls - if can? current_user, :download_code, @project = render 'projects/repositories/download_archive', ref: tag.name, btn_class: 'btn-grouped btn-group-xs' - if can?(current_user, :admin_project, @project) @@ -15,8 +16,7 @@ %i.fa.fa-trash-o - if commit - %ul.list-unstyled - = render 'projects/commits/inline_commit', commit: commit, project: @project + = render 'projects/branches/commit', commit: commit, project: @project - else %p Cant find HEAD commit for this tag diff --git a/app/views/projects/tags/index.html.haml b/app/views/projects/tags/index.html.haml index d4652a47cb..1503a4330f 100644 --- a/app/views/projects/tags/index.html.haml +++ b/app/views/projects/tags/index.html.haml @@ -1,21 +1,18 @@ - page_title "Tags" = render "projects/commits/head" -%h3.page-title - Git Tags +.gray-content-block - if can? current_user, :push_code, @project .pull-right = link_to new_namespace_project_tag_path(@project.namespace, @project), class: 'btn btn-create new-tag-btn' do %i.fa.fa-add-sign New tag - -%p.light - Tags give the ability to mark specific points in history as being important -%hr + .oneline + Tags give the ability to mark specific points in history as being important .tags - unless @tags.empty? - %ul.bordered-list + %ul.content-list - @tags.each do |tag| = render 'tag', tag: @repository.find_tag(tag) diff --git a/app/views/projects/tree/_tree.html.haml b/app/views/projects/tree/_tree.html.haml index 5048154cb2..367a87927d 100644 --- a/app/views/projects/tree/_tree.html.haml +++ b/app/views/projects/tree/_tree.html.haml @@ -14,7 +14,7 @@ %small %i.fa.fa-plus -%div#tree-content-holder.tree-content-holder +%div#tree-content-holder.tree-content-holder.prepend-top-20 %table#tree-slider{class: "table_#{@hex_path} tree-table" } %thead %tr From 11f815ac1e0904ea606a44e19842af2ebc48b7d7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 11:58:19 +0200 Subject: [PATCH 148/153] Render flash message out of content block --- app/views/layouts/_page.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 1275c42000..c1746676ae 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -18,8 +18,8 @@ .username = current_user.username .content-wrapper + = render "layouts/flash" %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" } .content - = render "layouts/flash" .clearfix = yield From 9836017c709ee5179575647e8d93065eeb854137 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Wed, 2 Sep 2015 16:45:34 +0300 Subject: [PATCH 149/153] satisfy rubocop --- ..._login_form.feature => login_form.feature} | 2 +- features/steps/crowd_login_form.rb | 21 ---------------- features/steps/login_form.rb | 25 +++++++++++++++++++ 3 files changed, 26 insertions(+), 22 deletions(-) rename features/{crowd_login_form.feature => login_form.feature} (83%) delete mode 100644 features/steps/crowd_login_form.rb create mode 100644 features/steps/login_form.rb diff --git a/features/crowd_login_form.feature b/features/login_form.feature similarity index 83% rename from features/crowd_login_form.feature rename to features/login_form.feature index d5a347b5fd..b4d9575448 100644 --- a/features/crowd_login_form.feature +++ b/features/login_form.feature @@ -1,4 +1,4 @@ -Feature: Crowd login form +Feature: Login form Scenario: I see crowd form Given Crowd integration enabled When I visit sign in page diff --git a/features/steps/crowd_login_form.rb b/features/steps/crowd_login_form.rb deleted file mode 100644 index 31bc6eea3c..0000000000 --- a/features/steps/crowd_login_form.rb +++ /dev/null @@ -1,21 +0,0 @@ -class Spinach::Features::CrowdLoginForm < Spinach::FeatureSteps - include SharedAuthentication - include SharedPaths - include SharedSnippet - include SharedUser - include SharedSearch - - step 'Crowd integration enabled' do - Gitlab::OAuth::Provider.should_receive(:providers).and_return([:crowd]) - allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path) - Gitlab.config.omniauth.should_receive(:enabled).and_return(true) - end - - step 'I should see Crowd login form' do - expect(page).to have_selector '#tab-crowd form' - end - - step 'I visit sign in page' do - visit new_user_session_path - end -end \ No newline at end of file diff --git a/features/steps/login_form.rb b/features/steps/login_form.rb new file mode 100644 index 0000000000..b9ff6ae67f --- /dev/null +++ b/features/steps/login_form.rb @@ -0,0 +1,25 @@ +class Spinach::Features::LoginForm < Spinach::FeatureSteps + include SharedAuthentication + include SharedPaths + include SharedSnippet + include SharedUser + include SharedSearch + + step 'Crowd integration enabled' do + @providers_orig = Gitlab::OAuth::Provider.providers + @omniauth_conf_orig = Gitlab.config.omniauth.enabled + expect(Gitlab::OAuth::Provider).to receive(:providers).and_return([:crowd]) + allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path) + expect(Gitlab.config.omniauth).to receive(:enabled).and_return(true) + end + + step 'I should see Crowd login form' do + expect(page).to have_selector '#tab-crowd form' + Gitlab::OAuth::Provider.stub(:providers).and_return(@providers_orig) + Gitlab.config.omniauth.stub(:enabled).and_return(@omniauth_conf_orig) + end + + step 'I visit sign in page' do + visit new_user_session_path + end +end From 183562bc357adc719b2d11c114b07bebd5ca6f20 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 12:45:06 +0200 Subject: [PATCH 150/153] Fix tests Signed-off-by: Dmitriy Zaporozhets --- features/steps/shared/active_tab.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/steps/shared/active_tab.rb b/features/steps/shared/active_tab.rb index 92e099315d..eb2ccd9d01 100644 --- a/features/steps/shared/active_tab.rb +++ b/features/steps/shared/active_tab.rb @@ -6,7 +6,7 @@ module SharedActiveTab end def ensure_active_sub_tab(content) - expect(find('div.content ul.nav-tabs li.active')).to have_content(content) + expect(find('div.content ul.center-top-menu li.active')).to have_content(content) end def ensure_active_sub_nav(content) @@ -18,7 +18,7 @@ module SharedActiveTab end step 'no other sub tabs should be active' do - expect(page).to have_selector('div.content ul.nav-tabs li.active', count: 1) + expect(page).to have_selector('div.content ul.center-top-menu li.active', count: 1) end step 'no other sub navs should be active' do From dad163b7ee1559f903c672da7165b700b999f970 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 12:52:53 +0200 Subject: [PATCH 151/153] Style project milestones page Signed-off-by: Dmitriy Zaporozhets --- app/views/projects/milestones/index.html.haml | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/app/views/projects/milestones/index.html.haml b/app/views/projects/milestones/index.html.haml index 995eecd783..2b8fd67158 100644 --- a/app/views/projects/milestones/index.html.haml +++ b/app/views/projects/milestones/index.html.haml @@ -1,18 +1,21 @@ - page_title "Milestones" -.pull-right - - if can? current_user, :admin_milestone, @project - = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do - %i.fa.fa-plus - New Milestone = render 'shared/milestones_filter' -.milestones - .panel.panel-default - %ul.well-list - = render @milestones +.gray-content-block + .pull-right + - if can? current_user, :admin_milestone, @project + = link_to new_namespace_project_milestone_path(@project.namespace, @project), class: "pull-right btn btn-new", title: "New Milestone" do + %i.fa.fa-plus + New Milestone + .oneline + Milestone allows you to group issues and set due date for it - - if @milestones.blank? - %li - .nothing-here-block No milestones to show +.milestones + %ul.content-list + = render @milestones + + - if @milestones.blank? + %li + .nothing-here-block No milestones to show = paginate @milestones, theme: "gitlab" From 700a342e0d2a92c8384ffa579bdf376d86a2d7c7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 13:18:11 +0200 Subject: [PATCH 152/153] Restyle group pages. Merge header with page title Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/blocks.scss | 5 ++++ app/assets/stylesheets/generic/common.scss | 1 + app/helpers/groups_helper.rb | 9 +++++++ app/views/groups/issues.html.haml | 25 ++++++++++---------- app/views/groups/merge_requests.html.haml | 23 +++++++++--------- app/views/groups/milestones/index.html.haml | 26 ++++++++------------- app/views/layouts/group.html.haml | 3 ++- 7 files changed, 50 insertions(+), 42 deletions(-) diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 61209f73a2..abf4657dd5 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -27,6 +27,11 @@ border-bottom: 1px solid #e7e9ed; color: $gl-gray; + &.second-block { + margin-top: -1px; + margin-bottom: 0; + } + &.footer-block { margin-top: 0; margin-bottom: -$gl-padding; diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 096698e846..b995486588 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -7,6 +7,7 @@ /** COMMON CLASSES **/ .prepend-top-10 { margin-top:10px } +.prepend-top-default { margin-top: $gl-padding; } .prepend-top-20 { margin-top:20px } .prepend-left-10 { margin-left:10px } .prepend-left-20 { margin-left:20px } diff --git a/app/helpers/groups_helper.rb b/app/helpers/groups_helper.rb index b067cb54a4..82eebf4245 100644 --- a/app/helpers/groups_helper.rb +++ b/app/helpers/groups_helper.rb @@ -30,4 +30,13 @@ module GroupsHelper image_path('no_group_avatar.png') end end + + def group_title(group, name, url) + content_tag :span do + link_to( + simple_sanitize(group.name), group_path(group) + ) + ' · '.html_safe + + link_to(simple_sanitize(name), url) + end + end end diff --git a/app/views/groups/issues.html.haml b/app/views/groups/issues.html.haml index f0d9078255..08d97e418a 100644 --- a/app/views/groups/issues.html.haml +++ b/app/views/groups/issues.html.haml @@ -1,25 +1,24 @@ - page_title "Issues" +- header_title group_title(@group, "Issues", issues_group_path(@group)) = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, issues_group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} issues") -%h3.page-title - Issues -%p.light - Only issues from - %strong #{@group.name} - group are listed here. - - if current_user - To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page. -%hr -.append-bottom-20 += render 'shared/issuable/filter', type: :issues +.gray-content-block.second-block .pull-right - if current_user .hidden-xs.pull-left - = link_to issues_group_url(@group, format: :atom, private_token: current_user.private_token), class: 'btn' do + = link_to issues_group_url(@group, format: :atom, private_token: current_user.private_token) do %i.fa.fa-rss + %div + Only issues from + %strong #{@group.name} + group are listed here. + - if current_user + To see all issues you should visit #{link_to 'dashboard', issues_dashboard_path} page. - = render 'shared/issuable/filter', type: :issues -= render 'shared/issues' +.prepend-top-default + = render 'shared/issues' diff --git a/app/views/groups/merge_requests.html.haml b/app/views/groups/merge_requests.html.haml index ca85a15870..425ad8331b 100644 --- a/app/views/groups/merge_requests.html.haml +++ b/app/views/groups/merge_requests.html.haml @@ -1,14 +1,13 @@ - page_title "Merge Requests" -%h3.page-title - Merge Requests +- header_title group_title(@group, "Merge Requests", merge_requests_group_path(@group)) -%p.light - Only merge requests from - %strong #{@group.name} - group are listed here. - - if current_user - To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page. -%hr -.append-bottom-20 - = render 'shared/issuable/filter', type: :merge_requests -= render 'shared/merge_requests' += render 'shared/issuable/filter', type: :merge_requests +.gray-content-block.second-block + %div + Only merge requests from + %strong #{@group.name} + group are listed here. + - if current_user + To see all merge requests you should visit #{link_to 'dashboard', merge_requests_dashboard_path} page. +.prepend-top-default + = render 'shared/merge_requests' diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml index 385222fa5b..2bbcad5fdf 100644 --- a/app/views/groups/milestones/index.html.haml +++ b/app/views/groups/milestones/index.html.haml @@ -1,23 +1,17 @@ - page_title "Milestones" -%h3.page-title - Milestones - %span.pull-right #{@group_milestones.count} milestones +- header_title group_title(@group, "Milestones", group_milestones_path(@group)) -%p.light += render 'shared/milestones_filter' +.gray-content-block Only milestones from %strong #{@group.name} group are listed here. - -%hr - -= render 'shared/milestones_filter' .milestones - .panel.panel-default - %ul.well-list - - if @group_milestones.blank? - %li - .nothing-here-block No milestones to show - - else - - @group_milestones.each do |milestone| - = render 'milestone', milestone: milestone + %ul.content-list + - if @group_milestones.blank? + %li + .nothing-here-block No milestones to show + - else + - @group_milestones.each do |milestone| + = render 'milestone', milestone: milestone = paginate @group_milestones, theme: "gitlab" diff --git a/app/views/layouts/group.html.haml b/app/views/layouts/group.html.haml index db7dbf9bfe..4f00d01d4c 100644 --- a/app/views/layouts/group.html.haml +++ b/app/views/layouts/group.html.haml @@ -1,5 +1,6 @@ - page_title @group.name -- header_title @group.name, group_path(@group) +- unless @header_title + - header_title @group.name, group_path(@group) - sidebar "group" unless sidebar = render template: "layouts/application" From 2b31989582a7e1edef79ebc541a99ffed95f497c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 14:55:42 +0200 Subject: [PATCH 153/153] Fix compare tests Signed-off-by: Dmitriy Zaporozhets --- features/steps/project/commits/commits.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/features/steps/project/commits/commits.rb b/features/steps/project/commits/commits.rb index e7dd20191b..23e67371f9 100644 --- a/features/steps/project/commits/commits.rb +++ b/features/steps/project/commits/commits.rb @@ -52,7 +52,6 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps end step 'I see compared refs' do - expect(page).to have_content "Compare View" expect(page).to have_content "Commits (1)" expect(page).to have_content "Showing 2 changed files" end