From 4d2f36118a3b21b6bb4ee702b98d032967ba463a Mon Sep 17 00:00:00 2001 From: Joel Koglin Date: Tue, 21 Jul 2015 14:03:26 -0700 Subject: [PATCH 001/247] 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 a2f170b35a67bda4841db0fb5326ce675f4cd5d5 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 24 Aug 2015 11:23:24 -0700 Subject: [PATCH 002/247] Tweak Reply by email docs. --- doc/reply_by_email/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md index 91eea956e5..67dc2b0400 100644 --- a/doc/reply_by_email/README.md +++ b/doc/reply_by_email/README.md @@ -4,9 +4,13 @@ GitLab can be set up to allow users to comment on issues and merge requests by r In order to do this, you need access to an IMAP-enabled email account, with a provider or server that supports [email sub-addressing](https://en.wikipedia.org/wiki/Email_address#Sub-addressing). Sub-addressing is a feature where any email to `user+some_arbitrary_tag@example.com` will end up in the mailbox for `user@example.com`, and is supported by providers such as Gmail, Yahoo! Mail, Outlook.com and iCloud, as well as the [Postfix](http://www.postfix.org/) mail server which you can run on-premises. +If you want to use a Gmail with Reply by email, make sure you have [IMAP access enabled](https://support.google.com/mail/troubleshooter/1668960?hl=en#ts=1665018) and [allow less secure apps to access the account](https://support.google.com/accounts/answer/6010255). + +To set up a basic Postfix mail server with IMAP access on Ubuntu, follow [these instructions](https://help.ubuntu.com/community/PostfixBasicSetupHowto). + ## Set it up -In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. If you're actually using Gmail with Reply by email, make sure you have [IMAP access enabled](https://support.google.com/mail/troubleshooter/1668960?hl=en#ts=1665018) and [allow less secure apps to access the account](https://support.google.com/accounts/answer/6010255). +In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. ### Installations from source From 7d5c6a1ada3da0d3d2c641736cd3c140c598d7eb Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 24 Aug 2015 14:46:45 -0700 Subject: [PATCH 003/247] Expand documentation --- doc/reply_by_email/README.md | 8 +- doc/reply_by_email/postfix.md | 316 ++++++++++++++++++++++++++++++++++ 2 files changed, 321 insertions(+), 3 deletions(-) create mode 100644 doc/reply_by_email/postfix.md diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md index 67dc2b0400..accd83b66d 100644 --- a/doc/reply_by_email/README.md +++ b/doc/reply_by_email/README.md @@ -2,11 +2,13 @@ GitLab can be set up to allow users to comment on issues and merge requests by replying to notification emails. -In order to do this, you need access to an IMAP-enabled email account, with a provider or server that supports [email sub-addressing](https://en.wikipedia.org/wiki/Email_address#Sub-addressing). Sub-addressing is a feature where any email to `user+some_arbitrary_tag@example.com` will end up in the mailbox for `user@example.com`, and is supported by providers such as Gmail, Yahoo! Mail, Outlook.com and iCloud, as well as the [Postfix](http://www.postfix.org/) mail server which you can run on-premises. +## Get a mailbox -If you want to use a Gmail with Reply by email, make sure you have [IMAP access enabled](https://support.google.com/mail/troubleshooter/1668960?hl=en#ts=1665018) and [allow less secure apps to access the account](https://support.google.com/accounts/answer/6010255). +Reply by email requires an IMAP-enabled email account, with a provider or server that supports [email sub-addressing](https://en.wikipedia.org/wiki/Email_address#Sub-addressing). Sub-addressing is a feature where any email to `user+some_arbitrary_tag@example.com` will end up in the mailbox for `user@example.com`, and is supported by providers such as Gmail, Yahoo! Mail, Outlook.com and iCloud, as well as the Postfix mail server which you can run on-premises. -To set up a basic Postfix mail server with IMAP access on Ubuntu, follow [these instructions](https://help.ubuntu.com/community/PostfixBasicSetupHowto). +If you want to use Gmail with Reply by email, make sure you have [IMAP access enabled](https://support.google.com/mail/troubleshooter/1668960?hl=en#ts=1665018) and [allow less secure apps to access the account](https://support.google.com/accounts/answer/6010255). + +To set up a basic Postfix mail server with IMAP access on Ubuntu, follow [these instructions](./postfix.md). ## Set it up diff --git a/doc/reply_by_email/postfix.md b/doc/reply_by_email/postfix.md new file mode 100644 index 0000000000..bab107b958 --- /dev/null +++ b/doc/reply_by_email/postfix.md @@ -0,0 +1,316 @@ +# Set up Postfix for Reply by email + +This document will take you through the steps of setting up a basic Postfix mail server with IMAP authentication on Ubuntu, to be used with Reply by email. + +The instructions make the assumption that you will be using the email address `replies@gitlab.example.com`, that is, username `replies` on host `gitlab.example.com`. Don't forget to change it to your actual host when executing the example code snippets. + +## Configure your server DNS + +1. Add an MX record pointing from `gitlab.example.com` to your server IP. +1. Add an A record pointing from `mail.gitlab.example.com` to your server IP. +1. Verify that the changes have propagated: + + ```sh + dig mx gitlab.example.com + ``` + + ```sh + dig a mail.gitlab.example.com + ``` + + You should see an `ANSWER SECTION` with the expected result in the output for both. + +## Install packages + +1. Install the `postfix` package if it is not installed already: + + ```sh + sudo apt-get install postfix + ``` + + When asked about the environment, select 'Internet Site'. When asked to confirm the hostname, make sure it matches `gitlab.example.com`. + +1. Install the `mailutils` package. + + ```sh + sudo apt-get install mailutils + ``` + +## Create user + +1. Create a user for replies. + + ```sh + sudo useradd -m -s /bin/bash replies + ``` + +1. Set a password for this user. + + ```sh + sudo passwd replies + ``` + + Be sure not to forget this, you'll need it later. + +## Test the out-of-the-box setup + +1. Connect to the local SMTP server: + + ```sh + telnet localhost 25 + ``` + + You should see a prompt like this: + + ```sh + Trying 127.0.0.1... + Connected to localhost. + Escape character is '^]'. + 220 gitlab.example.com ESMTP Postfix (Ubuntu) + ``` + + If you get a `Connection refused` error instead, check if `postfix` is running: + + ```sh + sudo postfix status + ``` + + If it is not, start it: + + ```sh + sudo postfix start + ``` + +1. Send the new `replies` user a dummy email to test SMTP, by entering the following into the SMTP prompt: + + ``` + ehlo localhost + mail from: root@localhost + rcpt to: replies@localhost + data + Subject: Re: Some issue + + Sounds good! + . + quit + ``` + + (Note: The `.` is a literal period on its own line) + +1. Check if the `replies` user received the email: + + ```sh + sh - replies + mail + ``` + + You should see output like this: + + ``` + "/var/mail/replies": 1 message 1 unread + >U 1 root@localhost 59/2842 Re: Some issue + ``` + + Quit the mail app: + + ```sh + q + ``` + +1. Log out of the `replies` account and go back to being `root`: + + ```sh + logout + ``` + +## Configure Postfix to use Maildir-style mailboxes + +Courier, which we will install later to add IMAP authentication, requiers mailboxes to have the Maildir format, rather than mbox. + +1. Configure Postfix to use Maildir-style mailboxes: + + ```sh + sudo postconf -e "home_mailbox = Maildir/" + sudo postconf -e "mailbox_command = " + ``` + +1. Restart Postfix: + + ```sh + sudo postfix restart + ``` + +1. Test the new setup: + + 1. Follow steps 1 and 2 of "Test the out-of-the-box setup". + 2. Check if the `replies` user received the email: + + ```sh + sh - replies + MAIL=/home/replies/Maildir + mail + ``` + + You should see output like this: + + ``` + "/home/replies/Maildir": 1 message 1 unread + >U 1 root@localhost 59/2842 Re: Some issue + ``` + + Quit the mail app: + + ```sh + q + ``` + +1. Log out of the `replies` account and go back to being `root`: + + ```sh + logout + ``` + +## Install the Courier IMAP server + +1. Install the `courier-imap` package: + + ```sh + sudo apt-get install courier-imap + ``` + +## Configure Postfix to receive email from the internet + +1. Let Postfix know about the domains that it should consider local: + + ```sh + sudo postconf -e "mydestination = mail.gitlab.example.com, localhost.localdomain, localhost, gitlab.example.com" + ``` + +1. Let Postfix know about the IPs that it should consider part of the LAN: + + We'll assume `192.168.1.0/24` is your local LAN. You can safely skip this step if you don't have other machines in the same local network. + + ```sh + sudo postconf -e "mynetworks = 127.0.0.0/8, 192.168.1.0/24" + ``` + +1. Configure Postfix to receive mail on all interfaces, which includes the internet: + + ```sh + sudo postconf -e "init_interfaces = all" + ``` + +1. Configure Postfix to receive mail on both IPv4 and IPv6 protocols: + + ```sh + sudo postconf -e "inet_protocols = all" + ``` + +## Test the final setup + +1. Test SMTP under the new setup: + + 1. Connect to the SMTP server: + + ```sh + telnet mail.gitlab.example.com 25 + ``` + + You should see a prompt like this: + + ```sh + Trying 123.123.123.123... + Connected to mail.gitlab.example.com. + Escape character is '^]'. + 220 gitlab.example.com ESMTP Postfix (Ubuntu) + ``` + + If you get a `Connection refused` error instead, make sure your firewall is setup to allow inbound traffic on port 25. + + 1. Send the `replies` user a dummy email to test SMTP, by entering the following into the SMTP prompt: + + ``` + ehlo gitlab.example.com + mail from: root@gitlab.example.com + rcpt to: replies@gitlab.example.com + data + Subject: Re: Some issue + + Sounds good! + . + quit + ``` + + (Note: The `.` is a literal period on its own line) + + 1. Check if the `replies` user received the email: + + ```sh + sh - replies + MAIL=/home/replies/Maildir + mail + ``` + + You should see output like this: + + ``` + "/home/replies/Maildir": 1 message 1 unread + >U 1 root@gitlab.example.com 59/2842 Re: Some issue + ``` + + Quit the mail app: + + ```sh + q + ``` + + 1. Log out of the `replies` account and go back to being `root`: + + ```sh + logout + ``` + +1. Test IMAP under the new setup: + + 1. Connect to the IMAP server: + + ```sh + telnet mail.gitlab.example.com 143 + ``` + + You should see a prompt like this: + + ```sh + Trying 123.123.123.123... + Connected to mail.example.gitlab.com. + Escape character is '^]'. + - OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information. + ``` + + 1. Sign in as the `replies` user to test IMAP, by entering the following into the IMAP prompt: + + ``` + a login replies PASSWORD + ``` + + Replace PASSWORD by the password you set on the `replies` user earlier. + + You should see output like this: + + ``` + a OK LOGIN Ok. + ``` + + 1. Disconnect from the IMAP server: + + ```sh + a logout + ``` + +## Done! + +If all the tests went all right, Postfix is all set up and ready to receive email! Continue with the [Reply by email](./README.md) doc to configure GitLab. + +--------- + +_This document was adapted from https://help.ubuntu.com/community/PostfixBasicSetupHowto, by contributors to the Ubuntu documentation wiki._ From f00fdc71e9ea4e227b405dbfa671bf9c6f94736d Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 25 Aug 2015 10:23:55 -0700 Subject: [PATCH 004/247] Don't overwrite /etc/default/gitlab. --- doc/reply_by_email/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md index accd83b66d..705cb08dd1 100644 --- a/doc/reply_by_email/README.md +++ b/doc/reply_by_email/README.md @@ -36,7 +36,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. As mentioned, the part after `+` is ignored, and this will end up in the mailbox for `gitlab-replies@gmail.com`. -2. Find `config/mail_room.yml.example` and copy it to `config/mail_room.yml`: +2. Copy `config/mail_room.yml.example` to `config/mail_room.yml`: ```sh sudo cp config/mail_room.yml.example config/mail_room.yml @@ -77,10 +77,10 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. ``` -4. Find `lib/support/init.d/gitlab.default.example` and copy it to `/etc/default/gitlab`: +4. Copy `lib/support/init.d/gitlab.default.example` to `/etc/default/gitlab`, if that does not already exist: ```sh - sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab + [ -f /etc/default/gitlab ] || sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab ``` 5. Edit `/etc/default/gitlab` to enable `mail_room`: @@ -89,6 +89,8 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. sudo editor /etc/default/gitlab ``` + Either change `mail_room_enabled=false` to the below, or add it at the bottom of the file: + ```sh mail_room_enabled=true ``` @@ -125,7 +127,7 @@ TODO As mentioned, the part after `+` is ignored, and this will end up in the mailbox for `gitlab-replies@gmail.com`. -2. Find `config/mail_room.yml.example` and copy it to `config/mail_room.yml`: +2. Copy `config/mail_room.yml.example` to `config/mail_room.yml`: ```sh sudo cp config/mail_room.yml.example config/mail_room.yml From 1eba96c636fc441c7fafbffe0a3cdf195a1595f9 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Tue, 25 Aug 2015 20:24:38 +0200 Subject: [PATCH 005/247] 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 5747fa00162a6bc5762bf0a1641ef743a772bdb8 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 25 Aug 2015 12:03:31 -0700 Subject: [PATCH 006/247] Fix docs --- doc/reply_by_email/postfix.md | 22 +++++++++++++++++----- lib/tasks/gitlab/check.rake | 4 ++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/doc/reply_by_email/postfix.md b/doc/reply_by_email/postfix.md index bab107b958..1d80037c1d 100644 --- a/doc/reply_by_email/postfix.md +++ b/doc/reply_by_email/postfix.md @@ -100,7 +100,7 @@ The instructions make the assumption that you will be using the email address `r 1. Check if the `replies` user received the email: ```sh - sh - replies + su - replies mail ``` @@ -137,7 +137,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Restart Postfix: ```sh - sudo postfix restart + sudo /etc/init.d/postfix restart ``` 1. Test the new setup: @@ -146,7 +146,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 2. Check if the `replies` user received the email: ```sh - sh - replies + su - replies MAIL=/home/replies/Maildir mail ``` @@ -197,7 +197,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Configure Postfix to receive mail on all interfaces, which includes the internet: ```sh - sudo postconf -e "init_interfaces = all" + sudo postconf -e "inet_interfaces = all" ``` 1. Configure Postfix to receive mail on both IPv4 and IPv6 protocols: @@ -206,6 +206,18 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo sudo postconf -e "inet_protocols = all" ``` +1. Configure Postfix to use the `+` delimiter for sub-addressing: + + ```sh + sudo postconf -e "recipient_delimiter = +" + ``` + +1. Restart Postfix: + + ```sh + sudo /etc/init.d/postfix restart + ``` + ## Test the final setup 1. Test SMTP under the new setup: @@ -246,7 +258,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Check if the `replies` user received the email: ```sh - sh - replies + su - replies MAIL=/home/replies/Maildir mail ``` diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index 2b9688c1b4..13f1cf58fc 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -595,7 +595,7 @@ namespace :gitlab do else puts "no".red try_fixing_it( - sudo_gitlab("RAILS_ENV=production bin/background_jobs start") + sudo_gitlab("RAILS_ENV=production sudo -u git -H bin/background_jobs start") ) for_more_information( see_installation_guide_section("Install Init Script"), @@ -726,7 +726,7 @@ namespace :gitlab do else puts "no".red try_fixing_it( - sudo_gitlab("RAILS_ENV=production bin/mail_room start") + sudo_gitlab("RAILS_ENV=production sudo -u git -H bin/mail_room start") ) for_more_information( see_installation_guide_section("Install Init Script"), From 5c226d335fa18a9af48fef051c2d309467324f46 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 25 Aug 2015 12:21:54 -0700 Subject: [PATCH 007/247] No DNS setup necessary, but firewall setup may be. --- doc/reply_by_email/postfix.md | 33 ++++++++------------------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/doc/reply_by_email/postfix.md b/doc/reply_by_email/postfix.md index 1d80037c1d..e2a974fbe1 100644 --- a/doc/reply_by_email/postfix.md +++ b/doc/reply_by_email/postfix.md @@ -4,21 +4,10 @@ This document will take you through the steps of setting up a basic Postfix mail The instructions make the assumption that you will be using the email address `replies@gitlab.example.com`, that is, username `replies` on host `gitlab.example.com`. Don't forget to change it to your actual host when executing the example code snippets. -## Configure your server DNS +## Configure your server firewall -1. Add an MX record pointing from `gitlab.example.com` to your server IP. -1. Add an A record pointing from `mail.gitlab.example.com` to your server IP. -1. Verify that the changes have propagated: - - ```sh - dig mx gitlab.example.com - ``` - - ```sh - dig a mail.gitlab.example.com - ``` - - You should see an `ANSWER SECTION` with the expected result in the output for both. +1. Open up port 25 on your server so that people can send email into the server over SMTP. +2. If the mail server is different from the server running GitLab, open up port 143 on your server so that GitLab can read email from the server over IMAP. ## Install packages @@ -183,7 +172,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Let Postfix know about the domains that it should consider local: ```sh - sudo postconf -e "mydestination = mail.gitlab.example.com, localhost.localdomain, localhost, gitlab.example.com" + sudo postconf -e "mydestination = gitlab.example.com, localhost.localdomain, localhost" ``` 1. Let Postfix know about the IPs that it should consider part of the LAN: @@ -200,12 +189,6 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo sudo postconf -e "inet_interfaces = all" ``` -1. Configure Postfix to receive mail on both IPv4 and IPv6 protocols: - - ```sh - sudo postconf -e "inet_protocols = all" - ``` - 1. Configure Postfix to use the `+` delimiter for sub-addressing: ```sh @@ -215,7 +198,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Restart Postfix: ```sh - sudo /etc/init.d/postfix restart + sudo service postfix restart ``` ## Test the final setup @@ -225,14 +208,14 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Connect to the SMTP server: ```sh - telnet mail.gitlab.example.com 25 + telnet gitlab.example.com 25 ``` You should see a prompt like this: ```sh Trying 123.123.123.123... - Connected to mail.gitlab.example.com. + Connected to gitlab.example.com. Escape character is '^]'. 220 gitlab.example.com ESMTP Postfix (Ubuntu) ``` @@ -287,7 +270,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Connect to the IMAP server: ```sh - telnet mail.gitlab.example.com 143 + telnet gitlab.example.com 143 ``` You should see a prompt like this: From 9ae12c398143cb15799eeca301fc761f7e096b2c Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 25 Aug 2015 12:29:11 -0700 Subject: [PATCH 008/247] No mailbox_command needed --- doc/reply_by_email/postfix.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/reply_by_email/postfix.md b/doc/reply_by_email/postfix.md index e2a974fbe1..0b16e5e8e8 100644 --- a/doc/reply_by_email/postfix.md +++ b/doc/reply_by_email/postfix.md @@ -120,7 +120,6 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo ```sh sudo postconf -e "home_mailbox = Maildir/" - sudo postconf -e "mailbox_command = " ``` 1. Restart Postfix: From 4344b8d2d4367b19c6849c3cab0d02d17ddf2304 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 25 Aug 2015 14:31:33 -0700 Subject: [PATCH 009/247] 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 010/247] 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 011/247] 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 012/247] 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 013/247] 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 014/247] 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 015/247] 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 3655e433dd697998578b03dc57191a412f505f5a Mon Sep 17 00:00:00 2001
From: Rowan Wookey 
Date: Mon, 24 Aug 2015 23:06:48 +0100
Subject: [PATCH 016/247] Fixed #1952 docker ssh connection times can be slow
 when UseDNS is enabled

---
 CHANGELOG         | 1 +
 docker/Dockerfile | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/CHANGELOG b/CHANGELOG
index 5940d586d8..7816430a20 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
+  - Disabled DNS lookups for SSH in docker image (Rowan Wookey)
 
 v 7.14.1 (unreleased)
   - Only include base URL in OmniAuth full_host parameter (Stan Hu)
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 05521af696..304bb97409 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -25,6 +25,9 @@ RUN mkdir -p /opt/gitlab/sv/sshd/supervise \
     && ln -s /opt/gitlab/sv/sshd /opt/gitlab/service \
     && mkdir -p /var/run/sshd
 
+# Disabling use DNS in ssh since it tends to slow connecting
+RUN echo "UseDNS no" >> /etc/ssh/sshd_config
+
 # Prepare default configuration
 RUN ( \
   echo "" && \

From bafffb2d14e1924154d5b7c74c7b3cbcf8c898fd Mon Sep 17 00:00:00 2001
From: Valery Sizov 
Date: Tue, 11 Aug 2015 09:59:40 +0300
Subject: [PATCH 017/247] 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 c1fe98e0b9dbe40d564dc5ddad23e14dd0e6e462 Mon Sep 17 00:00:00 2001
From: Stan Hu 
Date: Wed, 26 Aug 2015 07:38:33 -0700
Subject: [PATCH 018/247] 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 019/247] 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 020/247] 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 d0420c68fbb2fe84dee8538df246cdc7e7b85d28 Mon Sep 17 00:00:00 2001
From: Douwe Maan 
Date: Wed, 26 Aug 2015 09:23:25 -0700
Subject: [PATCH 021/247] Simplify doc

---
 doc/reply_by_email/README.md | 18 +++---------------
 1 file changed, 3 insertions(+), 15 deletions(-)

diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md
index 705cb08dd1..6c3d191cc7 100644
--- a/doc/reply_by_email/README.md
+++ b/doc/reply_by_email/README.md
@@ -76,23 +76,11 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
           :worker: EmailReceiverWorker
     ```
 
-
-4.  Copy `lib/support/init.d/gitlab.default.example` to `/etc/default/gitlab`, if that does not already exist:
-    
-    ```sh
-    [ -f /etc/default/gitlab ] || sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab
-    ```
-
-5. Edit `/etc/default/gitlab` to enable `mail_room`:
+5. Edit the init script configuration at `/etc/default/gitlab` to enable `mail_room`:
 
     ```sh
-    sudo editor /etc/default/gitlab
-    ```
-    
-    Either change `mail_room_enabled=false` to the below, or add it at the bottom of the file:
-
-    ```sh
-    mail_room_enabled=true
+    sudo mkdir -p /etc/default
+    echo 'mail_room_enabled=true' | sudo tee -a /etc/default/gitlab
     ```
 
 6. Restart GitLab:

From f197785495e83c996150b05d9bc3ce1effcc5a68 Mon Sep 17 00:00:00 2001
From: Douwe Maan 
Date: Wed, 26 Aug 2015 10:13:11 -0700
Subject: [PATCH 022/247] Use sudu -u git where appropriate

---
 doc/reply_by_email/README.md |  2 +-
 lib/tasks/gitlab/check.rake  | 10 ++++++----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md
index 6c3d191cc7..b33303c7be 100644
--- a/doc/reply_by_email/README.md
+++ b/doc/reply_by_email/README.md
@@ -92,7 +92,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
 7. Check if everything is configured correctly:
 
     ```sh
-    sudo bundle exec rake gitlab:reply_by_email:check RAILS_ENV=production
+    sudo -u git -H bundle exec rake gitlab:reply_by_email:check RAILS_ENV=production
     ```
 
 8. Reply by email should now be working.
diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake
index 13f1cf58fc..f5a900d87c 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -595,7 +595,7 @@ namespace :gitlab do
       else
         puts "no".red
         try_fixing_it(
-          sudo_gitlab("RAILS_ENV=production sudo -u git -H bin/background_jobs start")
+          sudo_gitlab("bin/background_jobs start", "RAILS_ENV=production")
         )
         for_more_information(
           see_installation_guide_section("Install Init Script"),
@@ -726,7 +726,7 @@ namespace :gitlab do
       else
         puts "no".red
         try_fixing_it(
-          sudo_gitlab("RAILS_ENV=production sudo -u git -H bin/mail_room start")
+          sudo_gitlab("bin/mail_room start", "RAILS_ENV=production")
         )
         for_more_information(
           see_installation_guide_section("Install Init Script"),
@@ -879,8 +879,10 @@ namespace :gitlab do
     "doc/install/installation.md in section \"#{section}\""
   end
 
-  def sudo_gitlab(command)
-    "sudo -u #{gitlab_user} -H #{command}"
+  def sudo_gitlab(command, env = nil)
+    cmd = "sudo -u #{gitlab_user} -H #{command}"
+    cmd.prepend "#{env} " if env
+    cmd
   end
 
   def gitlab_user

From 6d43308b5a5ff7663e1782fd6f5493f48c0f7e2a Mon Sep 17 00:00:00 2001
From: Robert Speicher 
Date: Wed, 26 Aug 2015 11:30:11 -0700
Subject: [PATCH 023/247] 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 024/247] 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 025/247] 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 026/247] 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 027/247] 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 028/247] 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 029/247] 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 030/247] 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 031/247] 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 032/247] 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 033/247] 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 034/247] 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 035/247] 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 036/247] 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 037/247] 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 038/247] 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 039/247] 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 040/247] 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 232422f828116d8b2551d63fbd511abc5148ec2e Mon Sep 17 00:00:00 2001
From: Marin Jankovski 
Date: Thu, 27 Aug 2015 10:45:03 +0200
Subject: [PATCH 041/247] Add omnibus-gitlab configuration example.

---
 doc/reply_by_email/README.md | 39 ++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md
index b33303c7be..f1dcef5de2 100644
--- a/doc/reply_by_email/README.md
+++ b/doc/reply_by_email/README.md
@@ -12,7 +12,7 @@ To set up a basic Postfix mail server with IMAP access on Ubuntu, follow [these
 
 ## Set it up
 
-In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. 
+In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
 
 ### Installations from source
 
@@ -27,7 +27,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
     ```sh
     sudo editor config/gitlab.yml
     ```
-    
+
     ```yaml
     reply_by_email:
       enabled: true
@@ -37,7 +37,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
     As mentioned, the part after `+` is ignored, and this will end up in the mailbox for `gitlab-replies@gmail.com`.
 
 2. Copy `config/mail_room.yml.example` to `config/mail_room.yml`:
-    
+
     ```sh
     sudo cp config/mail_room.yml.example config/mail_room.yml
     ```
@@ -84,7 +84,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
     ```
 
 6. Restart GitLab:
-    
+
     ```sh
     sudo service gitlab restart
     ```
@@ -99,14 +99,37 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`.
 
 ### Omnibus package installations
 
-TODO
+In `/etc/gitlab/gitlab.rb`:
+
+```ruby
+
+gitlab_rails['reply_by_email_enabled'] = true
+gitlab_rails['reply_by_email_address'] = "gitlab-replies+%{reply_key}@gmail.com"
+gitlab_rails['reply_by_email_host'] = "imap.gmail.com" # IMAP server host
+gitlab_rails['reply_by_email_port'] = 993 # IMAP server port
+gitlab_rails['reply_by_email_ssl'] = true # Whether the IMAP server uses SSL
+gitlab_rails['reply_by_email_email'] = "gitlab-replies@gmail.com"  # Email account username. Usually the full email address.
+gitlab_rails['reply_by_email_password'] = "password" # Email account password
+gitlab_rails['reply_by_email_mailbox_name'] = "inbox" # The name of the mailbox where incoming mail will end up.
+```
+
+and run `sudo gitlab-ctl reconfigure` for changes to take effect.
+
+After reconfigure run has been successfully completed you will have the following commands available:
+
+```bash
+sudo gitlab-ctl status mailroom
+sudo gitlab-ctl stop mailroom
+sudo gitlab-ctl start mailroom
+sudo gitlab-ctl restart mailroom
+```
 
 ### Development
 
 1. Go to the GitLab installation directory.
 
 1. Find the `reply_by_email` section in `config/gitlab.yml`, enable the feature and enter the email address including a placeholder for the `reply_key`:
-    
+
     ```yaml
     reply_by_email:
       enabled: true
@@ -116,7 +139,7 @@ TODO
     As mentioned, the part after `+` is ignored, and this will end up in the mailbox for `gitlab-replies@gmail.com`.
 
 2. Copy `config/mail_room.yml.example` to `config/mail_room.yml`:
-    
+
     ```sh
     sudo cp config/mail_room.yml.example config/mail_room.yml
     ```
@@ -158,7 +181,7 @@ TODO
     ```
 
 6. Restart GitLab:
-    
+
     ```sh
     bundle exec foreman start
     ```

From ff30b407545b2b873ffbe9d5d3d603e550013cf3 Mon Sep 17 00:00:00 2001
From: Valery Sizov 
Date: Thu, 27 Aug 2015 11:21:57 +0300
Subject: [PATCH 042/247] 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 043/247] 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 58c487e28b3f10c8a871dc82f7d79a45c7876f15 Mon Sep 17 00:00:00 2001
From: Douwe Maan 
Date: Thu, 27 Aug 2015 11:23:23 -0700
Subject: [PATCH 044/247] Tweak check rake task.

---
 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 f5a900d87c..9815582d02 100644
--- a/lib/tasks/gitlab/check.rake
+++ b/lib/tasks/gitlab/check.rake
@@ -595,7 +595,7 @@ namespace :gitlab do
       else
         puts "no".red
         try_fixing_it(
-          sudo_gitlab("bin/background_jobs start", "RAILS_ENV=production")
+          sudo_gitlab("RAILS_ENV=production bin/background_jobs start")
         )
         for_more_information(
           see_installation_guide_section("Install Init Script"),
@@ -726,7 +726,7 @@ namespace :gitlab do
       else
         puts "no".red
         try_fixing_it(
-          sudo_gitlab("bin/mail_room start", "RAILS_ENV=production")
+          sudo_gitlab("RAILS_ENV=production bin/mail_room start")
         )
         for_more_information(
           see_installation_guide_section("Install Init Script"),

From ef6c06c0f3341d9508693930af4979659d6a4b63 Mon Sep 17 00:00:00 2001
From: Stan Hu 
Date: Thu, 27 Aug 2015 13:07:14 -0700
Subject: [PATCH 045/247] 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 046/247] 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 047/247] 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 048/247] 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 049/247] 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 050/247] 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 051/247] 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 052/247] 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 053/247] 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 054/247] 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 055/247] 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 056/247] 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 057/247] 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 058/247] 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 059/247] 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 060/247] 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 061/247] 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 062/247] 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 063/247] 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 064/247] 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 065/247] 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 066/247] 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 067/247] 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 068/247] 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 069/247] 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 070/247] 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 071/247] 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 072/247] 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 073/247] 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 074/247] 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 075/247] 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 076/247] 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 077/247] 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 078/247] 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 079/247] 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 080/247] 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 081/247] 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 082/247] 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 083/247] 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 084/247] 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 085/247] 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 086/247] 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 087/247] 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 088/247] 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 089/247] 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 090/247] 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 091/247] 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 092/247] 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 093/247] 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 57d001309013c4c27e593778ec68b523e7d73b81 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 3 Sep 2015 15:50:23 +0300 Subject: [PATCH 094/247] CRUD for admin labels --- app/controllers/admin/labels_controller.rb | 59 +++++++ app/models/label.rb | 8 +- app/views/admin/labels/_form.html.haml | 35 ++++ app/views/admin/labels/_label.html.haml | 5 + app/views/admin/labels/destroy.js.haml | 2 + app/views/admin/labels/edit.html.haml | 9 + app/views/admin/labels/index.html.haml | 16 ++ app/views/admin/labels/new.html.haml | 7 + app/views/layouts/nav/_admin.html.haml | 6 + config/routes.rb | 2 + .../20150902001023_add_template_to_label.rb | 5 + db/schema.rb | 160 +++++++++++++----- 12 files changed, 275 insertions(+), 39 deletions(-) create mode 100644 app/controllers/admin/labels_controller.rb create mode 100644 app/views/admin/labels/_form.html.haml create mode 100644 app/views/admin/labels/_label.html.haml create mode 100644 app/views/admin/labels/destroy.js.haml create mode 100644 app/views/admin/labels/edit.html.haml create mode 100644 app/views/admin/labels/index.html.haml create mode 100644 app/views/admin/labels/new.html.haml create mode 100644 db/migrate/20150902001023_add_template_to_label.rb diff --git a/app/controllers/admin/labels_controller.rb b/app/controllers/admin/labels_controller.rb new file mode 100644 index 0000000000..bcdfe6c80a --- /dev/null +++ b/app/controllers/admin/labels_controller.rb @@ -0,0 +1,59 @@ + +class Admin::LabelsController < Admin::ApplicationController + before_action :set_label, only: [:show, :edit, :update, :destroy] + + def index + @labels = Label.templates.page(params[:page]).per(PER_PAGE) + end + + def show + end + + def new + @label = Label.new + end + + def edit + end + + def create + @label = Label.new(label_params) + @label.template = true + + if @label.save + redirect_to admin_labels_url, notice: "Label was created" + else + render :new + end + end + + def update + if @label.update(label_params) + redirect_to admin_labels_path, notice: 'label was successfully updated.' + else + render :edit + end + end + + def destroy + @label.destroy + @labels = Label.templates + + respond_to do |format| + format.html do + redirect_to(admin_labels_path, notice: 'Label was removed') + end + format.js + end + end + + private + + def set_label + @label = Label.find(params[:id]) + end + + def label_params + params[:label].permit(:title, :color) + end +end diff --git a/app/models/label.rb b/app/models/label.rb index 230631b518..4a22bd5340 100644 --- a/app/models/label.rb +++ b/app/models/label.rb @@ -24,7 +24,7 @@ class Label < ActiveRecord::Base validates :color, format: { with: /\A#[0-9A-Fa-f]{6}\Z/ }, allow_blank: false - validates :project, presence: true + validates :project, presence: true, unless: Proc.new { |service| service.template? } # Don't allow '?', '&', and ',' for label titles validates :title, @@ -34,6 +34,8 @@ class Label < ActiveRecord::Base default_scope { order(title: :asc) } + scope :templates, -> { where(template: true) } + alias_attribute :name, :title def self.reference_prefix @@ -78,4 +80,8 @@ class Label < ActiveRecord::Base def open_issues_count issues.opened.count end + + def template? + template + end end diff --git a/app/views/admin/labels/_form.html.haml b/app/views/admin/labels/_form.html.haml new file mode 100644 index 0000000000..ad58a3837f --- /dev/null +++ b/app/views/admin/labels/_form.html.haml @@ -0,0 +1,35 @@ += form_for [:admin, @label], html: { class: 'form-horizontal label-form js-requires-input' } do |f| + -if @label.errors.any? + .row + .col-sm-offset-2.col-sm-10 + .alert.alert-danger + - @label.errors.full_messages.each do |msg| + %span= msg + %br + + .form-group + = f.label :title, class: 'control-label' + .col-sm-10 + = f.text_field :title, class: "form-control", required: true + .form-group + = f.label :color, "Background Color", class: 'control-label' + .col-sm-10 + .input-group + .input-group-addon.label-color-preview   + = f.color_field :color, class: "form-control" + .help-block + Choose any color. + %br + Or you can choose one of suggested colors below + + .suggest-colors + - suggested_colors.each do |color| + = link_to '#', style: "background-color: #{color}", data: { color: color } do +   + + .form-actions + = f.submit 'Save', class: 'btn btn-save js-save-button' + = link_to "Cancel", admin_labels_path, class: 'btn btn-cancel' + +:coffeescript + new Labels diff --git a/app/views/admin/labels/_label.html.haml b/app/views/admin/labels/_label.html.haml new file mode 100644 index 0000000000..596e06243d --- /dev/null +++ b/app/views/admin/labels/_label.html.haml @@ -0,0 +1,5 @@ +%li{id: dom_id(label)} + = render_colored_label(label) + .pull-right + = link_to 'Edit', edit_admin_label_path(label), class: 'btn btn-sm' + = link_to 'Remove', admin_label_path(label), class: 'btn btn-sm btn-remove remove-row', method: :delete, remote: true, data: {confirm: "Remove this label? Are you sure?"} diff --git a/app/views/admin/labels/destroy.js.haml b/app/views/admin/labels/destroy.js.haml new file mode 100644 index 0000000000..9d51762890 --- /dev/null +++ b/app/views/admin/labels/destroy.js.haml @@ -0,0 +1,2 @@ +- if @labels.size == 0 + $('.labels').load(document.URL + ' .light-well').hide().fadeIn(1000) diff --git a/app/views/admin/labels/edit.html.haml b/app/views/admin/labels/edit.html.haml new file mode 100644 index 0000000000..45c62a7625 --- /dev/null +++ b/app/views/admin/labels/edit.html.haml @@ -0,0 +1,9 @@ +- page_title "Edit", @label.name, "Labels" +%h3 + Edit label + %span.light #{@label.name} +.back-link + = link_to admin_labels_path do + ← To labels list +%hr += render 'form' diff --git a/app/views/admin/labels/index.html.haml b/app/views/admin/labels/index.html.haml new file mode 100644 index 0000000000..8b11c28c56 --- /dev/null +++ b/app/views/admin/labels/index.html.haml @@ -0,0 +1,16 @@ +- page_title "Labels" += link_to new_admin_label_path, class: "pull-right btn btn-new" do + New label +%h3.page-title + Labels +%hr + +.labels + - if @labels.present? + %ul.bordered-list.manage-labels-list + = render @labels + = paginate @labels, theme: 'gitlab' + - else + .light-well + .nothing-here-block There are no any labels yet + \ No newline at end of file diff --git a/app/views/admin/labels/new.html.haml b/app/views/admin/labels/new.html.haml new file mode 100644 index 0000000000..8d298ad20f --- /dev/null +++ b/app/views/admin/labels/new.html.haml @@ -0,0 +1,7 @@ +- page_title "New Label" +%h3 New label +.back-link + = link_to admin_labels_path do + ← To labels list +%hr += render 'form' diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml index 2065be3828..3fe0127041 100644 --- a/app/views/layouts/nav/_admin.html.haml +++ b/app/views/layouts/nav/_admin.html.haml @@ -57,6 +57,12 @@ %span Service Templates + = nav_link(controller: :labels) do + = link_to admin_labels_path, title: 'Labels', data: {placement: 'right'} do + = icon('tags fw') + %span + Labels + = nav_link(controller: :abuse_reports) do = link_to admin_abuse_reports_path, title: "Abuse reports" do = icon('exclamation-circle fw') diff --git a/config/routes.rb b/config/routes.rb index 920ece518e..d93b5f936a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -201,6 +201,8 @@ Gitlab::Application.routes.draw do resources :services end + resources :labels + root to: 'dashboard#index' end diff --git a/db/migrate/20150902001023_add_template_to_label.rb b/db/migrate/20150902001023_add_template_to_label.rb new file mode 100644 index 0000000000..bd381a97b6 --- /dev/null +++ b/db/migrate/20150902001023_add_template_to_label.rb @@ -0,0 +1,5 @@ +class AddTemplateToLabel < ActiveRecord::Migration + def change + add_column :labels, :template, :boolean, default: false + end +end \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index 36568dd4ed..83757a2772 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: 20150824002011) do +ActiveRecord::Schema.define(version: 20150902001023) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -24,6 +24,17 @@ ActiveRecord::Schema.define(version: 20150824002011) do t.datetime "updated_at" end + create_table "appearances", force: true do |t| + t.string "title" + t.text "description" + t.string "logo" + t.integer "updated_by" + t.datetime "created_at" + t.datetime "updated_at" + t.string "dark_logo" + t.string "light_logo" + end + create_table "application_settings", force: true do |t| t.integer "default_projects_limit" t.boolean "signup_enabled" @@ -36,17 +47,36 @@ ActiveRecord::Schema.define(version: 20150824002011) do t.integer "default_branch_protection", default: 2 t.boolean "twitter_sharing_enabled", default: true t.text "restricted_visibility_levels" - t.boolean "version_check_enabled", default: true t.integer "max_attachment_size", default: 10, null: false t.integer "default_project_visibility" t.integer "default_snippet_visibility" t.text "restricted_signup_domains" + t.boolean "version_check_enabled", default: true t.boolean "user_oauth_applications", default: true t.string "after_sign_out_path" t.integer "session_expire_delay", default: 10080, null: false + t.text "help_text" t.text "import_sources" end + create_table "approvals", force: true do |t| + t.integer "merge_request_id", null: false + t.integer "user_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "approvers", force: true do |t| + t.integer "target_id", null: false + t.string "target_type" + t.integer "user_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "approvers", ["target_id", "target_type"], name: "index_approvers_on_target_id_and_target_type", using: :btree + add_index "approvers", ["user_id"], name: "index_approvers_on_user_id", using: :btree + create_table "audit_events", force: true do |t| t.integer "author_id", null: false t.string "type", null: false @@ -119,6 +149,28 @@ ActiveRecord::Schema.define(version: 20150824002011) do add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree + create_table "git_hooks", force: true do |t| + t.string "force_push_regex" + t.string "delete_branch_regex" + t.string "commit_message_regex" + t.boolean "deny_delete_tag" + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.string "author_email_regex" + t.boolean "member_check", default: false, null: false + t.string "file_name_regex" + t.boolean "is_sample", default: false + t.integer "max_file_size", default: 0 + end + + create_table "historical_data", force: true do |t| + t.date "date", null: false + t.integer "active_user_count" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "identities", force: true do |t| t.string "extern_uid" t.string "provider" @@ -186,10 +238,26 @@ ActiveRecord::Schema.define(version: 20150824002011) do t.integer "project_id" t.datetime "created_at" t.datetime "updated_at" + t.boolean "template", default: false end add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree + create_table "ldap_group_links", force: true do |t| + t.string "cn", null: false + t.integer "group_access", null: false + t.integer "group_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.string "provider" + end + + create_table "licenses", force: true do |t| + t.text "data", null: false + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "members", force: true do |t| t.integer "access_level", null: false t.integer "source_id", null: false @@ -271,14 +339,15 @@ ActiveRecord::Schema.define(version: 20150824002011) do add_index "milestones", ["project_id"], name: "index_milestones_on_project_id", using: :btree create_table "namespaces", force: true do |t| - t.string "name", null: false - t.string "path", null: false + t.string "name", null: false + t.string "path", null: false t.integer "owner_id" t.datetime "created_at" t.datetime "updated_at" t.string "type" - t.string "description", default: "", null: false + t.string "description", default: "", null: false t.string "avatar" + t.boolean "membership_lock", default: false end add_index "namespaces", ["created_at", "id"], name: "index_namespaces_on_created_at_and_id", using: :btree @@ -356,6 +425,14 @@ ActiveRecord::Schema.define(version: 20150824002011) do add_index "oauth_applications", ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type", using: :btree add_index "oauth_applications", ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree + create_table "project_group_links", force: true do |t| + t.integer "project_id", null: false + t.integer "group_id", null: false + t.datetime "created_at" + t.datetime "updated_at" + t.integer "group_access", default: 30, null: false + end + create_table "project_import_data", force: true do |t| t.integer "project_id" t.text "data" @@ -368,25 +445,30 @@ ActiveRecord::Schema.define(version: 20150824002011) do t.datetime "created_at" t.datetime "updated_at" t.integer "creator_id" - t.boolean "issues_enabled", default: true, null: false - t.boolean "wall_enabled", default: true, null: false - t.boolean "merge_requests_enabled", default: true, null: false - t.boolean "wiki_enabled", default: true, null: false + t.boolean "issues_enabled", default: true, null: false + t.boolean "wall_enabled", default: true, null: false + t.boolean "merge_requests_enabled", default: true, null: false + t.boolean "wiki_enabled", default: true, null: false t.integer "namespace_id" - t.string "issues_tracker", default: "gitlab", null: false + t.string "issues_tracker", default: "gitlab", null: false t.string "issues_tracker_id" - t.boolean "snippets_enabled", default: true, null: false + t.boolean "snippets_enabled", default: true, null: false t.datetime "last_activity_at" t.string "import_url" - t.integer "visibility_level", default: 0, null: false - t.boolean "archived", default: false, null: false + t.integer "visibility_level", default: 0, null: false + t.boolean "archived", default: false, null: false t.string "avatar" t.string "import_status" - t.float "repository_size", default: 0.0 - t.integer "star_count", default: 0, null: false + t.float "repository_size", default: 0.0 + t.integer "star_count", default: 0, null: false t.string "import_type" t.string "import_source" - t.integer "commit_count", default: 0 + t.text "merge_requests_template" + t.boolean "merge_requests_rebase_enabled", default: false + t.boolean "merge_requests_rebase_default", default: true + t.integer "approvals_before_merge", default: 0, null: false + t.boolean "reset_approvals_on_push", default: true + t.integer "commit_count", default: 0 end add_index "projects", ["created_at", "id"], name: "index_projects_on_created_at_and_id", using: :btree @@ -487,12 +569,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 +582,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 +606,21 @@ 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 "public_email", default: "", null: false 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.integer "dashboard", default: 0 + t.datetime "admin_email_unsubscribed_at" + t.integer "project_view", default: 0 end add_index "users", ["admin"], name: "index_users_on_admin", using: :btree @@ -573,6 +656,7 @@ ActiveRecord::Schema.define(version: 20150824002011) do 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.integer "group_id" t.boolean "enable_ssl_verification", default: false end From 6d651a0260066185fe39b1381d54a5281d13a7f8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 15:09:55 +0200 Subject: [PATCH 095/247] 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 096/247] 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 097/247] 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 f5ffeac058260de26efdcdae4205804154bc027e Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 3 Sep 2015 17:12:15 +0300 Subject: [PATCH 098/247] Create labels in new project --- CHANGELOG | 1 + app/models/project.rb | 9 +++++++++ app/services/projects/create_service.rb | 2 ++ 3 files changed, 12 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index e46fb5d6c1..276a221971 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) + - Global Labels that are available to all projects v 7.14.1 - Improve abuse reports management from admin area diff --git a/app/models/project.rb b/app/models/project.rb index 8e33a4b2f0..bdedd7aa9e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -401,6 +401,15 @@ class Project < ActiveRecord::Base end end + def create_labels + Label.templates.each do |label| + label = label.dup + label.template = nil + label.project_id = self.id + label.save + end + end + def find_service(list, name) list.find { |service| service.to_param == name } end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index b35aed005d..1bb2462565 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -87,6 +87,8 @@ module Projects @project.build_missing_services + @project.create_labels + event_service.create_project(@project, current_user) system_hook_service.execute_hooks_for(@project, :create) From 0195b085a191dfa07799dcc0f232f76954910124 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 17:21:48 +0200 Subject: [PATCH 099/247] 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 6bd3d72bbdf288ecf2eee718f2943821c1401a22 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Thu, 3 Sep 2015 18:44:58 +0300 Subject: [PATCH 100/247] added spinach for glabal labels --- app/controllers/admin/labels_controller.rb | 1 - db/schema.rb | 157 +++++------------- features/admin/labels.feature | 38 +++++ features/steps/admin/labels.rb | 117 +++++++++++++ spec/services/projects/create_service_spec.rb | 8 + 5 files changed, 200 insertions(+), 121 deletions(-) create mode 100644 features/admin/labels.feature create mode 100644 features/steps/admin/labels.rb diff --git a/app/controllers/admin/labels_controller.rb b/app/controllers/admin/labels_controller.rb index bcdfe6c80a..3b070e65d0 100644 --- a/app/controllers/admin/labels_controller.rb +++ b/app/controllers/admin/labels_controller.rb @@ -1,4 +1,3 @@ - class Admin::LabelsController < Admin::ApplicationController before_action :set_label, only: [:show, :edit, :update, :destroy] diff --git a/db/schema.rb b/db/schema.rb index 83757a2772..55cbd8c293 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -24,17 +24,6 @@ ActiveRecord::Schema.define(version: 20150902001023) do t.datetime "updated_at" end - create_table "appearances", force: true do |t| - t.string "title" - t.text "description" - t.string "logo" - t.integer "updated_by" - t.datetime "created_at" - t.datetime "updated_at" - t.string "dark_logo" - t.string "light_logo" - end - create_table "application_settings", force: true do |t| t.integer "default_projects_limit" t.boolean "signup_enabled" @@ -47,36 +36,17 @@ ActiveRecord::Schema.define(version: 20150902001023) do t.integer "default_branch_protection", default: 2 t.boolean "twitter_sharing_enabled", default: true t.text "restricted_visibility_levels" + t.boolean "version_check_enabled", default: true t.integer "max_attachment_size", default: 10, null: false t.integer "default_project_visibility" t.integer "default_snippet_visibility" t.text "restricted_signup_domains" - t.boolean "version_check_enabled", default: true t.boolean "user_oauth_applications", default: true t.string "after_sign_out_path" t.integer "session_expire_delay", default: 10080, null: false - t.text "help_text" t.text "import_sources" end - create_table "approvals", force: true do |t| - t.integer "merge_request_id", null: false - t.integer "user_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "approvers", force: true do |t| - t.integer "target_id", null: false - t.string "target_type" - t.integer "user_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "approvers", ["target_id", "target_type"], name: "index_approvers_on_target_id_and_target_type", using: :btree - add_index "approvers", ["user_id"], name: "index_approvers_on_user_id", using: :btree - create_table "audit_events", force: true do |t| t.integer "author_id", null: false t.string "type", null: false @@ -149,28 +119,6 @@ ActiveRecord::Schema.define(version: 20150902001023) do add_index "forked_project_links", ["forked_to_project_id"], name: "index_forked_project_links_on_forked_to_project_id", unique: true, using: :btree - create_table "git_hooks", force: true do |t| - t.string "force_push_regex" - t.string "delete_branch_regex" - t.string "commit_message_regex" - t.boolean "deny_delete_tag" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "author_email_regex" - t.boolean "member_check", default: false, null: false - t.string "file_name_regex" - t.boolean "is_sample", default: false - t.integer "max_file_size", default: 0 - end - - create_table "historical_data", force: true do |t| - t.date "date", null: false - t.integer "active_user_count" - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "identities", force: true do |t| t.string "extern_uid" t.string "provider" @@ -243,21 +191,6 @@ ActiveRecord::Schema.define(version: 20150902001023) do add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree - create_table "ldap_group_links", force: true do |t| - t.string "cn", null: false - t.integer "group_access", null: false - t.integer "group_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.string "provider" - end - - create_table "licenses", force: true do |t| - t.text "data", null: false - t.datetime "created_at" - t.datetime "updated_at" - end - create_table "members", force: true do |t| t.integer "access_level", null: false t.integer "source_id", null: false @@ -339,15 +272,14 @@ ActiveRecord::Schema.define(version: 20150902001023) do add_index "milestones", ["project_id"], name: "index_milestones_on_project_id", using: :btree create_table "namespaces", force: true do |t| - t.string "name", null: false - t.string "path", null: false + t.string "name", null: false + t.string "path", null: false t.integer "owner_id" t.datetime "created_at" t.datetime "updated_at" t.string "type" - t.string "description", default: "", null: false + t.string "description", default: "", null: false t.string "avatar" - t.boolean "membership_lock", default: false end add_index "namespaces", ["created_at", "id"], name: "index_namespaces_on_created_at_and_id", using: :btree @@ -425,14 +357,6 @@ ActiveRecord::Schema.define(version: 20150902001023) do add_index "oauth_applications", ["owner_id", "owner_type"], name: "index_oauth_applications_on_owner_id_and_owner_type", using: :btree add_index "oauth_applications", ["uid"], name: "index_oauth_applications_on_uid", unique: true, using: :btree - create_table "project_group_links", force: true do |t| - t.integer "project_id", null: false - t.integer "group_id", null: false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "group_access", default: 30, null: false - end - create_table "project_import_data", force: true do |t| t.integer "project_id" t.text "data" @@ -445,30 +369,25 @@ ActiveRecord::Schema.define(version: 20150902001023) do t.datetime "created_at" t.datetime "updated_at" t.integer "creator_id" - t.boolean "issues_enabled", default: true, null: false - t.boolean "wall_enabled", default: true, null: false - t.boolean "merge_requests_enabled", default: true, null: false - t.boolean "wiki_enabled", default: true, null: false + t.boolean "issues_enabled", default: true, null: false + t.boolean "wall_enabled", default: true, null: false + t.boolean "merge_requests_enabled", default: true, null: false + t.boolean "wiki_enabled", default: true, null: false t.integer "namespace_id" - t.string "issues_tracker", default: "gitlab", null: false + t.string "issues_tracker", default: "gitlab", null: false t.string "issues_tracker_id" - t.boolean "snippets_enabled", default: true, null: false + t.boolean "snippets_enabled", default: true, null: false t.datetime "last_activity_at" t.string "import_url" - t.integer "visibility_level", default: 0, null: false - t.boolean "archived", default: false, null: false + t.integer "visibility_level", default: 0, null: false + t.boolean "archived", default: false, null: false t.string "avatar" t.string "import_status" - t.float "repository_size", default: 0.0 - t.integer "star_count", default: 0, null: false + t.float "repository_size", default: 0.0 + t.integer "star_count", default: 0, null: false t.string "import_type" t.string "import_source" - t.text "merge_requests_template" - t.boolean "merge_requests_rebase_enabled", default: false - t.boolean "merge_requests_rebase_default", default: true - t.integer "approvals_before_merge", default: 0, null: false - t.boolean "reset_approvals_on_push", default: true - t.integer "commit_count", default: 0 + t.integer "commit_count", default: 0 end add_index "projects", ["created_at", "id"], name: "index_projects_on_created_at_and_id", using: :btree @@ -569,12 +488,12 @@ ActiveRecord::Schema.define(version: 20150902001023) 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" @@ -582,22 +501,22 @@ ActiveRecord::Schema.define(version: 20150902001023) 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" @@ -606,21 +525,20 @@ ActiveRecord::Schema.define(version: 20150902001023) 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 "public_email", default: "", null: false 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.integer "dashboard", default: 0 - t.datetime "admin_email_unsubscribed_at" - 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 @@ -656,7 +574,6 @@ ActiveRecord::Schema.define(version: 20150902001023) do 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.integer "group_id" t.boolean "enable_ssl_verification", default: false end diff --git a/features/admin/labels.feature b/features/admin/labels.feature new file mode 100644 index 0000000000..1af0e700bd --- /dev/null +++ b/features/admin/labels.feature @@ -0,0 +1,38 @@ +Feature: Admin Issues Labels + Background: + Given I sign in as an admin + And I have labels: "bug", "feature", "enhancement" + Given I visit admin labels page + + Scenario: I should see labels list + Then I should see label 'bug' + And I should see label 'feature' + + Scenario: I create new label + Given I submit new label 'support' + Then I should see label 'support' + + Scenario: I edit label + Given I visit 'bug' label edit page + When I change label 'bug' to 'fix' + Then I should not see label 'bug' + Then I should see label 'fix' + + Scenario: I remove label + When I remove label 'bug' + Then I should not see label 'bug' + + @javascript + Scenario: I delete all labels + When I delete all labels + Then I should see labels help message + + Scenario: I create a label with invalid color + Given I visit admin new label page + When I submit new label with invalid color + Then I should see label color error message + + Scenario: I create a label that already exists + Given I visit admin new label page + When I submit new label 'bug' + Then I should see label exist error message diff --git a/features/steps/admin/labels.rb b/features/steps/admin/labels.rb new file mode 100644 index 0000000000..d64380abf7 --- /dev/null +++ b/features/steps/admin/labels.rb @@ -0,0 +1,117 @@ +class Spinach::Features::AdminIssuesLabels < Spinach::FeatureSteps + include SharedAuthentication + include SharedProject + include SharedPaths + + step 'I visit \'bug\' label edit page' do + visit edit_admin_label_path(bug_label) + end + + step 'I visit admin new label page' do + visit new_admin_label_path + end + + step 'I visit admin labels page' do + visit admin_labels_path + end + + step 'I remove label \'bug\'' do + page.within "#label_#{bug_label.id}" do + click_link 'Remove' + end + end + + step 'I have labels: "bug", "feature", "enhancement"' do + ["bug", "feature", "enhancement"].each do |title| + Label.create(title: title, template: true) + end + end + + step 'I delete all labels' do + page.within '.labels' do + page.all('.btn-remove').each do |remove| + remove.click + sleep 0.05 + end + end + end + + step 'I should see labels help message' do + page.within '.labels' do + expect(page).to have_content 'There are no any labels yet' + end + end + + step 'I submit new label \'support\'' do + visit new_admin_label_path + fill_in 'Title', with: 'support' + fill_in 'Background Color', with: '#F95610' + click_button 'Save' + end + + step 'I submit new label \'bug\'' do + visit new_admin_label_path + fill_in 'Title', with: 'bug' + fill_in 'Background Color', with: '#F95610' + click_button 'Save' + end + + step 'I submit new label with invalid color' do + visit new_admin_label_path + fill_in 'Title', with: 'support' + fill_in 'Background Color', with: '#12' + click_button 'Save' + end + + step 'I should see label exist error message' do + page.within '.label-form' do + expect(page).to have_content 'Title has already been taken' + end + end + + step 'I should see label color error message' do + page.within '.label-form' do + expect(page).to have_content 'Color is invalid' + end + end + + step 'I should see label \'feature\'' do + page.within '.manage-labels-list' do + expect(page).to have_content 'feature' + end + end + + step 'I should see label \'bug\'' do + page.within '.manage-labels-list' do + expect(page).to have_content 'bug' + end + end + + step 'I should not see label \'bug\'' do + page.within '.manage-labels-list' do + expect(page).not_to have_content 'bug' + end + end + + step 'I should see label \'support\'' do + page.within '.manage-labels-list' do + expect(page).to have_content 'support' + end + end + + step 'I change label \'bug\' to \'fix\'' do + fill_in 'Title', with: 'fix' + fill_in 'Background Color', with: '#F15610' + click_button 'Save' + end + + step 'I should see label \'fix\'' do + page.within '.manage-labels-list' do + expect(page).to have_content 'fix' + end + end + + def bug_label + Label.templates.find_or_create_by(title: 'bug') + end +end diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index 66cdfd5d75..ff4ed2dd48 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -17,6 +17,14 @@ describe Projects::CreateService do expect(project.services).not_to be_empty end + it 'creates labels on Project creation if there are templates' do + Label.create(title: "bug", template: true) + project = create_project(@user, @opts) + project.reload + + expect(project.labels).not_to be_empty + end + context 'user namespace' do before do @project = create_project(@user, @opts) From 89df4a7922431b59c65c91199a93639663da667d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 3 Sep 2015 18:19:31 +0200 Subject: [PATCH 101/247] 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 102/247] 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 103/247] 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 104/247] 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 105/247] 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 106/247] 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 107/247] 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 108/247] 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 109/247] 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 110/247] 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 111/247] 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 112/247] 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 113/247] 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 zcmd4437k~LwLe~UdzcxReR`Yeeea&$rf1(*W?+C}*kM3+0Ra(F2@*s_1tfrkAg=ML zQDc0@7-Eb;Tw{zeK4W~w_y}&`LX0u$^AQ(>p5OP>y|-`o3?%RW^4{n3M{Dlw({<~f zI(6!tQ>V_UW}Gpm$Db^g=-ou#nfhjX8tLIIi7eV9fpip1I__C6}xl z8e%%U?OzB}e`AbJT6c_w_3Q$l0HhkI(Dz*|+k7 z^&2-|{Y)QYQW;|p&OAetXlFyXEVh>8 zg1_@w4%^5^Dc_GlPe2!<2-ESO^C-Sy(oPB3vPtrlFJ#r+1!!KDPM4*Vq%3^M!S{r# z_}A6bjS*lhIV62NluelM5*Opw6O12~KpEy@I%y+YND%gGxk!a9SL$X&Bs;8 zmhd-mU4YM5vL)OZm($ZDNb~Ul=fCHvSGP z;ZNb67U2G0tV?pS`TQ5G7S~$-E=mq_^FQHpG3fC==>GoD+x%tR|CP|Xn(eXF`;o0K+&;Jhd#%36iPPAR2jy)ai#C0Y2!GH#&TH6 z6`x;ag{d*7aXwR_vHzc!MqQV9z8P(tsWeE$PiHE`V`nQ{*;2uO#DnPt{75|cPnB(W z{tSh9JiQRF|Gh% zVJH#y3C2W~9V9=_RQ?FQBf0WFFLB+}zyG|DRc*|V>ui*Xav3@$_jd~Tj&#!a6ra7%Lijux1w0B~{S(FseUmzvkH5_l zC^J!lD0Y-$6bni%N)#o85|KD-o6`lR?qk1x);|7`b6a@3+Y^iqxzxoMaa7h-HyV&2I2%{-2Kf=y&j_H)p) zAN^T|@w$b@*}n{Z2pQAN?t*OdVeHNm<45(I=^6GWu6kx>?w5t@Wcn>{y3!ZBLE^jjjN(&0{Al(zMwWH*rbfFNO_`VROSGf}Z({~e4Y;5Y# zIcm}QStx5K3rVNgL|rLL5%{PCS0AfXt|8oqpue1W)}xdfaXrp{nFdq8Q?K31cQogy zcq9|-!mnY&mP5Y&7v^gOG_tZP*soUU2F#N`F+FUNh5Q@P9WK}yYhXjH!F*lA0(1q9 z>QRdL_d$mxtRBymE2RZjD(Yt=?u|MN`hg-%g}i?o`2QDc0S`{cSWd@P%rABwbAunt zAUl7G@_Uq9sIWzl2Rc^Fj$lq6VS4%u__tARM!6MbKgy#@c^}soQ2xN!(0wT1MtL6P zb(B3QyHKzu8@d98z9ZPTP_9Ecf^t~7r_V1ata+fb#JUDH1=;Lm`-u9e$CpAb?FZj!vP+g>b0Ev+ z2wA4eH2Es)fCR~SD$o;?_%E>zkHGpU2>j`}K8_4%xfhU`Q)Aw1HbTf3%Jy=_9fxUScvJUV0zbMipSo7#%qbhx% zexw)7p(UvjgIuEi{VxToj3+-0blg}rnn#9`kP!}HSG&)MiD`HsF2b=10a{rmsm`jK*^D(TzOUHnxkTe3$64OYwQSUtGhDS0H9bO>E*WgTn^o6B~y8`#sZqK~r=U}OK8{gs{OIXs)^ z@-f`YJ>16wyp@mT-Moj7X)H*Y=L$H?3E9rgr!l0D92(sAjp(kIfV(tk<+DV>l$ll~_CiDl&)ps6fi zha6Csf%cVXr4wx}W}Da*>?!sv`*-#ldz-z-{*!&qtM~-IoL|AW@Ne^d{CoTW#`I78 zFBta*X{#RDTE~Ja=s&r4=$J!^@C)=mm zr`reZ=h$zv-)Vo$k>eq71-w|=NI3_q|IL>uk=-B4?w&QxoO^(|gU%7HzCYQzK zaCuw-SHe}}YIe1`dR!N|zUjKs^)1&P*M8UcT=%$s;CjIIkn3lzLvFp>>~^_5?tnY) zp6OobzTP8wvOPtfQjgJN@i;sYPoHP8XSvtuztjIy|IhtT_``i=6{)c^SJC9P=yo3i}Us6#Dfu_64uy{d}cDn>+cB`EU7g z{vk#voi-1FBOU`^JSQENj_H^#8?-3}ZM?cbiZ=bRX9r+HE!{zWf!j4); zw`00vo@0$;i(`*tpPxZtNfHse2 z&}N4F9QR&@HYK1^c9CnF2{6XW%p)ZC$ z#ob3kA0|(~ABJ-#fKq`HeDC+~z4G3_y$_%K`w8_4#@>UUUj6sZYwwgX_HOFiW3Rt+ z$vY1m`@_41@0`Qfv1d@8KK8`1za2Yq?6YJ4iBEq%_NQa-9eeng;aK6ZykoZ?yY<-2 zV*|&Ujy`$xiK9Pf>?rKSqjw&?@#rN-=N_GQH1THaP3N2TH_P8NznRO}8^3wu;@6*l z{fgID{~?k6-BH4~4!W37s!@O^WXDAO-Hvh_%Ka!$OSRHMX|Ieit2ZCD2Cs1~BPkxujqp;PXe2MW0Ha3DKXgb6^g}b%G*TzcSrh zy5qVJb$Cwur#lWfiuOU` zgZ%v%l6N&E=;M+eQuq_d<)4GLb&$nRNfnrbC!`u_4dm-R()Xo%rBRUk1CacKkp1%@ zHP8Jk z&CA&N@K>zi7PgK%*d^S}F6DmqO&-*>=-Sy8SSxPATKP(>y|?g6o?ut;Ds~MlhpWM3 zTX_xJ0dL(--psDU>U$S&;a%)TK3>tHwWKGG=cU->-tL)ZuR!zTGLU(60*4fzm1 zm;D6x!$H1^{T%DUr}#ze7qB~?fxYre*d5RE4eUkOFMr_IvOmH{ZOu*Z2dh5zI>*p~mo2iWa=3cG_(Wq0$L>>k*P-{-U0 zy;$e{fDf`4_-6KR{BrgZ-@<;!uVOFrtJ%NvYuGD%EBg=rE%pZA!`|fIW^eJml1bPP zX5B<#KjaHbq5w8a5Y|ey^bM(1YLhlex4@qGmGq$W6WAfYliobYSai}sHhSvdPdMK* z_aGnIc98YhABBCUTeL8CknyO?)w`>Yuo{yf86vz?_AeT*Ukyc zcDly7RxVj~Aj>bV_+t6axs|R1Y{uX!{GB=IKF~SWnz~&+cWyJ<$)a}f2&(U#ixyTZ zE#N9Zm8Vf@RCJQ-fG#j~aN6L3Ej`u)ojr4{ZnvxVz|&I)4?Nvtbj-{;D$%ose-X+6N^?%YXj&KUH%4{X`F)4CJ=P(B}IPY(ldHXP8Y06+<} z0ZQ~9k~>;4`t=%L=G^yQl@Xlv1tVpH+%;^QUFCF@Eym+UCnUvg*310@Gbo-KK~0s%y()Fbu=m+%k^egli>#xx7)ZeJTOaGw$5&bjzm-I*U$Mv7-lZG({ zlfh$%8=4K{4ATt@4XX{C3`Y$g8NM`T8H@@Zp2aQh~Uo;*zzGwW@c*>M( zGMHSZsHxF(wP}y(R@1$vhfGhJUNF68I&S*RTx;$$_nQaJ%gpP{o6S4S`^|TnA21&@ zKWl#3{D%1h^NBK6mS0v@<||8-wU+gly;a^?et-ER<))O{n%eR%;e71zG z)z)X5X!~KE#glCOsqi3sUuje+;eV&IsPkUbU9QM5D`P6gDo9i`rUEYNE zA@7sk7rd`|-|>FzJ?YE#mHHgMu$oC@X!4MA5h8f*;q1g8e)2UiBy z2e$-w2X7AE6Fd-nIus2(S5aHhSsPXe`>h9`^)w8RYR>s)kmt2SASNWtSPLq)C6j(YualDYM!rox#o?U4{A=-vfBLGvRYql zPwmv&`L!!+*Vk^T-CKKG?Q6B~)ZJWnxW2T0Vg0KOfrjl3A2<3M4>ft3mNxBedaLPp z)5lGpHzk{En_HWEnzuGT*^=L~q2{V`_}Yr=-bk_vu}UjOMRbBsGhKA!pjpK6E{x0came$hDkS1IyC96{?dM1 zf1p3n-`wBRKhQtezqEf%|Azi8{X6^j_ut-sZ~ue+k4(;=ym<2MlTQqE4_q-NcS_@w z#ZzvZ^8A#Kr`AthJ@vk+pG|9>wtCvL(@srKOrJV^@APM9WY37s*gE5lnVy+zXTCV| ztyz{?duM0OzIgW0IZNj}K4=?!ZtlQ5Y2NC2$#eG4m*%gX|I&i`1=APITd;J&`h}i_ zwF}2B99+11;pT;V7T&q=p@q*b{9xg!MWID27Oh*fdC_f)o?P_7;_Sukix)4xZSiZ1 z-&y?Sl8H;6Uvg^cvZW6$ef8Wi=dL~X_H&RC0gYH-!kRhw7sS#{s4L#sYmoxOVM>fNhvUwvTp zN9UKF-+cb;^Y@dgiK^t~zqn@vA<&DtYyot4&vXuCBhi{pyKV&%S!;)fZp= z@ih~#IdIM6*F1mCtJfU8=A&!A+?utuc&lxzZ);*}>(;)lGq*0@x@POfty{P5-Fn;B z`?fy3_35oIZauv9gKaanE#9_f+s18Mx9#0_+qV0*J-qGdZ7*&+yuEXK|MtP{%eJrE zzIpqO?fbXix&49d2d|Z`ExgupZQ$DKYum4#cdyH)SMFTDbIZIvJyYJuq$nIx$zqI?v?&G^Z+nu~_%yp*gJlE~J?$hf| z?aAF^*yGw0-P5?IXV26<^Y^UWvwqK(J-heZyyu=h2lhO^=lMOa?m4>Wqi>J<_SSE| zxA(TaZ+vIWcV>R)$$f?UR_}ZD`Z3qvyr1ni><{g4-QTnSiv2I#kb6V@4U2EM`i2*8 z`1D5U#_)~vZ(M)l<2QbGQ}s-Jl>!(WJ)G5G%W!&jLNtF#Cn!t*G;uXhlCDy@&gvMFw#s{kYdNGz*;?jbxW zAwsXT=@6b%?{ZRixys$6@I&$whv4s#>!6|HN8yX)ClXb9cZplCD{+_T^p)IO#PuEA z?c@vjt-k4n^Q0CKfQ*}jsZ19z2mG}(dFOpvm#6O6Ckl>>)YgyCQwx;E>;5*Xwr!N5Q zu=fPqjKHk~K0zvO=2sMvxcD)Qjv5AaA{KeFpB6mDviQ+ z0@!5=j{;u#0z*6QOfrVG?GlhQ=ft_!Qz#h?4t%U{Fc;!uTxzJ8xU!>Z&|s@ zxm>NY>T0I=Y=MQHZ7U{(_@sd==2j-04u?NHd2Mg+g#(dLg*{rGn0qBiEa>b9o%2DV zIu*kaRMvRlQSc;Dl4xpH>E{4WM7f6QcB!s5j=Pd2xAb2$(dV1EuK(8kW0$l$9PLZS zu8^*e&)zs`(q(fhgOP#ryE<3*hfhC-K?9vI-tgXE5AXZrvtp4)bjnjW5${KIDCS5G zp3f8GoCC%iC9uoGx4ANQZln0G1b>(CRmorR+~k+MHwmA4=&Mljt&sBW=fyl2d)9Z4 zrgx7%)4NA!yqo5y5i=CUyM&*Y{52n){34E*B~ONua89Z`VFXVEwZ4wv2`|0RtMNpk z=$9A$DighSqNiT*W+!@Wm-{OC#32o5lsa!+O^L!R;mPNByX&Lg0;{F3zG+^E$JI8s zF*c>__7|Mzc6Y3tSRwOEq1jgGumx3)v6THbnEcuuCZ-W%g;g4j)r7OsOB<_0Ae%Zu zqk$`p8u1U7*)Ky_;F|L?s8$1sR#W1|U+N#n1Q4xQ5UdA+0)!^WmZFN8n zJnr=bg8gM};nwDOX|O%kFuiW3Bm(Ept= zQbs^i@gcOC-jgMDcL-Ra2S(DT!s8%>lfw`VJ-ruBi6}aR34S-jH>t4i2(Hi={1EV$`5CxEB4`>#(RVe~ zq*1b=M!Z4?%Nph3257g<7jBRL>++@LRg`Fd=mxXz0yrwmDso|g_TSUBez-tp7j@h7ULHagE4c!bXyKVf29^3Ta1 z^2+4DV_3r7l~d-8Nxp>E@RB&>?oo_KjixV5M0``)Xe0=bpwUqEdLF({0F{Hx1oTM5 z9fI6XFq1$}k;*VOD!DoUiiMO-29lFIbj0yOVEdLe^$+S@k+Nl`%AmzwGrppAfx}`S zsP3L>@`Os4*{TC(N5ep(Z(Z=xio}E#XV_`Zi;cDf>-@f!NLi)J>GXHj+e3C^ZZzK! zY6t|nDyYE*ZKEXKTpmz$VDdxT=HWVd;zQI|IzTgqe(ow`w-a5Atm$H z>HJXW^bIo27Qt>L`BaYhfV0i00-{+#8W9ZyFvvvA!Apb?SD98-V2}ul;`T&`*Vk3$ zhy>cFM#59uVFD&E?4DC+GS$uL=HE%Kp1h*1yu5A2Wa=Xrj{ga`6tT{;;-buMt zOA+Bhiyp>`6oIIBKqR*7Ajoyztg20Vry*-hNpZ>OO_hhMfW(!p%Ud1wb@dK@6|^=- ztOdhv$@w6k3`IfEll1=LU9%fUbd=#hnec<#~Wri@=xz zW9<&gM_$@M4cQVi^2~Wz`Q?S@Ri0N^UYM0<%$pIrzGma-(p&^LjNVXKlzaIbd zt=b)={j{PBBoagZ! zFZss#@c&E6jY(|!6WwTU`$N2cG*)hz|46J0vg~gD5!fT9aip>c%}uda`if5Y1j=X}%Vd7j zVW92cGQ7U>AftsSEmaO-*vpjVD=q!}0@S z){RqUmRcJk)_8}i-9$E@OcJB$G$|%p?_jeGcb*g>h&UwNj5+Nv z&ar%#1-&=NEA)b@qO)`6MWmdRo7B#$)89}P{k`P!r9CBEhg-#|qA-OCG| z(QWJ67LWBhEwQ;Co2z+RRkXjsS%EMQ&T7%;ABgcDzJAv_m_FKPTE92^-SvB|uXRea zdTg1+-01apR9eepUBN(Cx!Kttubk52{-kwLr^jb@n(WS|fkfp%qtj(}*nFPO1%e+5 zzh{S!iDJxa7%CD{8>CX=$I>)`sOS7C5_e>0 zLYLvrEyhIcYYELF8mj@7>r1?%O^zxSvvca#5rp!jiHu6XhI+`*6VAJ zSw3lA*zI+~<9)gcYhlvA6C3z&n#zYG`kX%H^3abm!CQHl za%I4_B!#z2+>ysX<|?HJMjOv@J21UcjuwAyfULfpT5rpw(CnoWB!s21yCT?OEw%U7 z#izA;`J(+w-_C<-euA#2B zzNXsD4Mq0Cfd9e^qut%@Oy{k=48eDmIuQNL=u{N(EQc`RV)SowPva4lg?K!KTERT5%26w#N zLRW8WVXV>UiI_uf-6(Ud!_``rl^3wNVtHAHo~XY)R-QA;Z|Dfn-Iy^2t}=_iuF2UF zv-a_G^gdFV9=+aE<#bg0^pGv{!2?f;xjU%RcZBd9Azp_IPlL?XASH=NdBH-uLU9(? z*tsksY1s_^&CV(D&W{ELswa($*0e;%MWc{_s{>W@7A9Zh@yQcnvE+>;>nDK=zKfX7 zJTw_ou~UpZZS*zKPX280O$1We6A-K>oT?B4mz0>zB`6`hYNn|~Z#3#lOzV>_RAAOKPK88zRT%%WgH_%akt-0-ysyo(TEKYySy-z0J;{1whKp)^Ubb|dH_!N%t-DqM# zd%e7Nl__GXL7tNE5!cO+=8x9pn? zXwtjVw1*~Z6#^7fjbho}A?K9~-Ig7JbVs~;kmbKjixrYvqrtDV^p|+YVYf7}X5r6p6iT8d7_<*}A0q&69;BkE*SI->SLOhzE@Pn(Vc=giqi z^O1DkyTCQW7c@fWX-2iW<3XBP-sh0@n(V5VEk)W!P)(&m32JR15}DHC^|nljLyFdoQ(sOiGe03tP{d>{!oyABxssuBPw18 zje!*NTmvX;W=wE}s_FYWqhQ(7zRn?xREh8v%IZ(H5y^m-ZA4-t*+!&Z%i7!w^{4WW zY9`h>z(;DwvvYQk9pas#Sc#s#K)6q{5GO~&Kb9VCwW%heEu3i~%3~Ac&nkVsQstx( zW25ki)@Q}!()z3!Wwd)GTVAv%m8~(={whM>{;~a4(*V(1*FcMcv)Et47?xaTv%egc z=;`r~F0e<3+h4Mb>_UG_p|6$U`o}UOy>lcHWV4dwK*1ZbTclVK=IU%0+g<7uDeH|C zn)1iwmlnFl+c2@`#u~G-L!)#JJxMrJICEisTnwDjd`w1?LB=#&PRBjsXhc8;rUYBG8%jPMIt4WXt$V1lKrtln=6Sqt>8 z3ZtztW;2FcgZ1-Vb1dGbfXP!0PWzd!_wbKmZ4&qD_eEsre2UAqFwUz`2bqS4vD+%d*Ly$h&;?z4c~&-l@F z89G9HkC^`2pKVt!a*o3rDfK z^^z#%N0YBio={oCmnL0P!`1V!Sx>kk-jLr5Tnk3{v9w94tdulB`of6(SOq|c&`9?M zM)6oR`O7=5RU&SBIN7q}{oA*gMwi?e!)P3mRkZgMSNs9qGf;dNM*1{sSKtY*5i5${CaQf*OKp zKCB#bnh)zIH&zY66PHzBE|?U*;qIzgg|?!sLTlml%CFzwWC$AY|E52Gag8}@G)B#2 zVi8{q`4M?~6a*Wm&M(D)({NVAmj+O9PFwgCfJJ5W;9tYKv4iWH}Q_MOhDDZ?d z;G2NwNI#c`mS%bWJwF$@oypH-<+jtj9{VT$T>*1)A-xJ2H6k`dS1AR^`^$2q zFF5wu&jA1GEby;0;GtAI$Z1P!$DzV?qcY%<3YUg5;3<4`JOjR1t*;xM0oUpmsPLh7 zig`)Z*Q;>M(QMtK6g(#bz9t3tp9LPwfM1iUUy%X7Ed`ILaKa}==b$9$#&UF-cx_2N z7gL`T_-gRV4EPUI^{X=A+WTu%c;@?Mx~lJoJ(oLFgRBHO(uns9Mdx zK4L~|KC(lwM+>lmqiun5W)(A=GArp0z8Uxfh6fMH`)sty*5D1wfka}tUsK(X7Ei=) z&hwXetMUz&g6zpkY!TF}p}bTJFiLihDGY`6K9_a$J0jM|(B-sP3eis^=y?+T%*H}w zvnmBf#6oGxKv7)Uei|A7g+e>f_NII%Z*S7hn!LuLJsEkojclDmcxjodc31sQO6s(qaTUjiEXMf;fJ zcy9rR+ZgyP0gqvW3H4>To@47wz!zu0tqRG@&s zuaL8JCivH9h6BI!`Xq})`;bNHaFRvxdxtXMBwOVAJOfU2k>NTOKGaUJO)0pZhtlvQ znIqTFQR|C-k<1iu>2wDvr%z%?DlIvGwz)2R!@Q4a0JX3TgSp+%= zSrEb%aX&*f{21nli>**+h+^w$`z#||1Dc-1lz|yX!6mY@Nbv-K^RvXfaHY)Fa;ysU zZ@_LL?#F)!MDZ5F)`nY9_GplYsUba{3-OTF5~serv?QN|K-8Z6ts3B^GdhDNOmZtt z{a}|KT@iESgk%(brC5X<^mX2u;E;#ua2i`tU#CmKD-owib4`XDkuPhd&6IfM?gtu2M%& zvBR~|Q;bdxpqQnaVAuAt$(=Js*|4IxE*e-QVqq~i3abr{AL-p9=V$I^qwxzD|J;d#|oQfp??+Q^MYm>*px&8AI*t4l%AWT>ni} z#N3M_kLni~Kcg1WGGgwH(85~a@j*E>Sy5=h<&aAgjN$@^&npCzSv)SxrDCB_eU{M_ zL1(XbtCOgr5pn^vrg*yF2$~iEN18)2?=Kmur1&?`0;>VY4bGaq*DLjNA=jP~ zV@B-+q#?YQEG)Dpw>Pvn<2kGNh7?oTQlt}9JS1999j#y+j5$XB%jDgIgYjSdA{64hGL%4&>I2I{%RW(YYsYy8 z)K}V=A*`3GG?1)OdJc)Nrcyi|RC3QqkZ-7UA1lL03kEyMk1fd@0-q@(5f6&Y~S z(K0-ef&-rvJxNESzk)C5s$-2qf5r(I_d_d~;S1ZQO8Pii?C~^H*pO0r`H5~`{lJ|&0#N^tC;MY*=c~h`J>aI%pR`H{W{XE2Ki7jA=95dH8?{b0- zw7Vy7>ou5vVxL?|p>x)9vwdQWA`#2Y{8Epf!shDdd%JAoTogjrT07`%voH7fDI~FD zMZn>7Q&3{t@&JD{x@i(cD+c{@ObcThMF^eGGtGpqVvaU|P^FmH26$v>YOtZ0VK1lp-^ z$Wod!6lYsQa~$i^2Ass8&{SFKY5br?mMb+Bhn!HRB;<_{@@`zM5d5?Q>l5riuFJR( z`=em9X2j!W=VU5hHGLu#om=9vcb(T4R7tz?+(=NfaqET+#AS|Vvr1Ho*4=t{Oy6!* zboMWYkA|X0C7qx*R=nAAg6!?mEunvYzCEBUXfE!bA z#Hk7!POh&@wbPzaUr+U6lP$$uoCCgzYFslyiYQZ4GoZB?@ky<`%K95S-Z5$A;okZ|7kBq(%1I+Gf<4tW{$}b@LInIxf~V zt|T#QtnOBQU(?)`aei;>f)4kjj{C>>YdXAv?u4}>;PQDUx7upLt~~Gkp@!9$B+mnl zFjD*zF$NS8Olx^q!~`EoP`oQ>D#Ohg%o!j zgH?X;EcuKhL}Q55O(-oMK(Q`_XbgdsWyeB7|_uRbz^lZVMe;qfDhnHH~H z9%*!hqE3U^P@ESi_EzVYn)4Df+p*lpj9>1W-Rv(iv|H3Qi{521=ULiU&~F(KFKxjY zs{uqFDSaHV@KuDnCjPZh7g@^ZLdsJp94UP)Xk}%YBj*SKWs0^|_SZ{lNO4LRj2=^B z^BL5D>r@E#n1zM9Qm96=+gy~D+^Pm%^BdDUG^Rz5Oc=~R8F%8Z--`M16-Vsw8Q@=J zz)44n`p}W-^=W>{?VL`*+le+R96D02kIf|MJuxq__Jd6R0_VQadxyinIt%>k3^>g{ z(GKRH+z!^s{BhAfTBP>b+oJv9@UPAS|2hLs?TdDFqcY&Mo{`}?6%P4?*yR*l&yJ!Goh-FT}^*D=( zY!t;OidCQ+=S3-8JAz4VG!bp-b{}QD%64BNp0o+OuMk$NoO4r%ndrcbEWp(XyH&LW zk^D-Qt6t>cP-Z7NX-fE*v5Pw#j*i7+SKNK~>i&x+A;0sY{#&L^OJ#Eoxs$I;Yt$r9 z-tUxn0O$k%CG-b!r4V`}6-hh7gP~2b$54-UY_lSd;Xw`!o<*@`@DZuGK}K(bnxe8K zzCA5B=-g#+bbZ4Rq12#zf7>^0dIzNip_O*b`)Sf0phtz4iK4txo9J3BlN?P&?))+( zwVAS&D9%-$`TK{1m*MV(U}&^*GZ?>#x>McB=jf{yUs5r{d{Lga0%Q9!P^fuFFo<52eBH z))l4T;S?PBr05)!1l`DfO~*?&I`v#M^&D~p(%|t7cwMS~A_K0yzd8k{_p5Xb%5+uV z4}R_%s^gC$<|U7{vo)$rP&V4M9pPq@3C(HB*-HSCT6_o-p;81>HbYFHeJt;bAds4c zm?(l1D+j`XvJvDsJuk#W9mGUKD#?H%bBE_5WG-sRQ?Di`T$su^h@UArA&_vWUdMQ? zHZl>WiXC^e+3p`lBTYDa#A+29>rT$o#8^XlVu zpt&bCI9DxLV6E!K37L>pwOB78e*!%3B3Y#~;haGkj=Tynw**}JQdw(>e2X;r$uq+t zGvqa%T>qX_`;rF7iHx7I0OU2jmwwYles4R)_oBWGSNGy-u^vf>TX_)AiMUItNQu8) z3l4H(R7FOQV)JTIxLQh?QbUV)!($j~nqLQ*8Fv&Ee+d48QWg@d;zOgwm}!)9N~^wu zEKHjuDPI{SA?OkCs>VAhp0Xe%_S3crzgfwgm^K+%6qim4jFLoNg_>w_|NYTP{1T7N z*)S<`&V@*&csuL#W9^RUWg8lC0st~Crn*Px<#}P-I5L`-6Fp?nE@vmDA#8ha2j_RE~Vh@lpB(Q>$#NHFVZ1${p?hI z>M!X)0hdmt!Cw+OM6T~kgFlf552V9|ZjtMUGT-RTK2dBti%Oj*e9DOTmS-s>zM zJt`|BMMm%?~uzLw!Jc*OBWgaCs@q~b5iI5H_o{-^E2K>#wUvPEWtOqbdQmiPm?hMQcj*}ilH~92cRqa zudw%xJJRz)CQpt&`6Rzeq=p>j7Lgiqztn5bTD8hOPxOOUaQD;r@R;cL=NIFG{x#$B zLK^%_1r9KKFAaWDhKoJek7*7n?VM8JpeuWy{C6^3m!-5rGvr+fl?~VA!j!M#HY1T}eR_Nwbq6(LBSTz&i{XC{v-!iZLDc6kEU*@v4=U}zyGNeGqEScN7Zp@M&JlvPlP=;9k@F+-!A)o> zTT=J{^QBVJ!4z*o{$(0zB_{{(%g64%qFYDwRf{0jGHy^8<3Oj(vCIN@tl-@q+D!G0#15Wgm>yJ4LJU<0*r~IN+eX+*@y2* zJ5?X~NWu=1;l8uL1L<&KAIbGY8E~?XWOz6Q2R+de(w7zAsYcof1W-$=3$zXoKwOqihLicl1F{ z|D^CaCuVO0u2qnFKIT-`q_ohWHL09~ON){Y@hmModSr`G^;(OiC1pFyyYjNxV90T& z)}mO1QrayoMOD*qX?e8G>uZaYmq*%s-nM9Y+|$w@ZeC%rENY&$RG0j*HQwn9wp;b~ z-ujMZ7Te;EaDR(O`t9USM}63u^~tb&vIJ3P{P^zv^{Y!uWAc)-#L?e1Zak9D=BkTK zIXCXOG#fOl(e}h+L?Ha8TPmYWb9<VNs z>4h3il?91de>h?N%6YkDY05DZF~MDwvDP5C%M5O6P><`8eWk(|Nk1)OYF(GKZwv`;pt z{Qb}==tUYo!xf%+JK{Mrk>e>nW)nc=`ot)HO$IJ{r9qchwy`GvG${ z$F%lIU&{5RR6Fe%_4QPrY&7`Vxb#PO#FnWtO9`0JY>g3aHASik_9;LLfKCW!7g&Xk zdXhgMg5OQPlb18Kf|2xen1RedIPED*&Fs`p|Hz`vL!2NWZ;sDjFyOB7>79P3v$DR@ zX$sc4f<1PVz0Or0C@*lv8{$r<&smvh>WxZ<1uKodDqFCjveIGqSuMW$u%kL)v|)eF zTw?X;(m0nE^K{ z{9^={QtfB4tJyZZSLEdhzNr>`^EuBI?F@&1c^3G| z3^>^%ayzFo;AD>oIP8)1_KDBs`bnOZ_Fh`E%k^1CeX=iPcy0!q>=zk6<}C31bhs`* zRo|8Y52fIav%p1wWF@(WqNA(PLWy9}w7`fh2Q3X<>6o_4pzQ>##juhftw4F(X`AOM z2Pf^G!w{n^&vpa`2Km?6JTG_A@kJuRQ_lCy304BNLTi!PWh%@{Hi%SDUaRJQj&eJp zMCG}FK7g0-3o)_|P4Q#~{Bw<00mqoi^`S%4>yw{CZs$}A-cB@9;jmHVz1%Xa6>bo7 zuvVFabHrR24*wFrt3r4Vho8)V(_9nnV6MsaMc$%lzg})%S$7VHe|Z-8$qYEPFWS*% zWxz=X$Z#ngF6M#^*W>qkIPjO>OLIYnXQ$T}K2`z8FWk!OW0B7&@NbaE1;0~BbQlJQ z4oim#1=r)(fyj^33fcIY^eWcBts3_#hO?%XTx2MU!z>;nyIAZw zAA%*B5Yvy6QlQ^pUnjt~CQQE?TpPf@bZy2ol=sY$A+Cn)>D5RrHE_~o##wP<@jxe( zm>bMIuc9TW*Xe_SfWD$FY_vpMmpiI_21nhbSZGp{*U``)kM!FMTf=*bw%Xd=CV#JM zPm$HzI=#|`v!4t(j+(Ll@c0^=)Z>^iXJuRK(q6x-Wp;hljAnNrFmZKwqOGT_Lhmrd z?Gr&vqJ=n@0lokeHW=op5=n_>*JiTfwb6*fi8!2&_fclDwyB|>M?j}QQK%!%?ZHtC z@^LfjHh3Ut9C6q})Hgkrn2;zFM{e>M+be1Fl;VOQ+T`sWb%7-gY*03M&dodztJ2$ylR3IPk}jy8 znDt49d8PA7IHfv@p;^Y^A5sY_EN{B`sk#3r=xyC z1WaqMnAP1gE$4M)nMWqnIV=XZ(c$h|&`L*UIhyA*FJHLw9GPe9hOA-?oLJ$f&Zi%d zh^_3qX`ND*{22PjFt61!PHEd!c4g5~W^!z$oTsgvlA*?*(?BSUqKy&)*4O$b1}077 zj;V=r&ZmvFNS8~O6*5l#-h zC4!On#EUW-_e5ISM~Mi|_sbrSI--==IT5sxk17GF8ZwU6kcy3wB5%x=_n30pTD~CR z&^RF$@3s`YAPxSN z0>^F_FG+)ct-vjSJ1DnKY3H;8hj*J7QEr_KM~t4_K0Ly_kmALa`a=p_#s{%-N`0LI zANF2dK}P*Wsror89CiX|n1T!cInfq*twdV~e%0e_v~`dobfkrZXeR9;%sAOrcYxgT zaiag2@FOjDWh`d6d~$dzC9(!B%haJMYok&Qd=_>tK4aWI zSA5yS;a{Eweli12cCOscsSG&mL>Ue{RQ8q2?PJZS)K6x>vF20igGP&luglGV zlbtTZ^HXrdY>@9lf#VG7Gq#hRs(*qXA>Xu8-G5^JOhrnFr|JX1FpTlIt8cqt8}Hfu(bCJ z+ocY_bxpQQotBv}!gi@4j;=}L==38RJS-&4-x_fAaKnZcaC98{-!Wux1UJlpv|R0f zXxPlQQ%HBdzt~%uz_CsueC2FLPHm?eI1p&JBjD>Q%mu|(z+AXhjH&o6#t5G=7fvc` zG8s;^6L8SZoK_!e3k5D^z!5v3!0R&L!~=3W`5ADU3-WuD8E~3YGW-<5AuPmRD(v!+ zd#RdAJHuWoPVuV}c#lUbZ_=J5hhK^IB-hjkIJGPGBn3QePZBR}pgl<$jy=gc#GYgb zdy)^(9-`ci&Ui5z09_|z@9~y2xY#2HoCE$Y?MaIIi?I`(*nh8AOwUTe=v z?V-Om{G~m~JnfePlvRkJX%G4AiLvxntj1v5b+i|=7W7vjdNc@dc;ieW2TTjMw`qY)(u1Y5IX5+4Z@_RP#iswZa^*hDEmr$OFt5E z2wO1f-2~-H%q^InSTq(Q7{?*$kS*Dc9~ltAeq7yj5!n%`v`O-SVs`>ZBsSFGz*O8F zubAkpJJ)LpI!eky4K71TdE95rEwLJ+Rs6E9e&1kYa9oYU?60yI$_zN1w7$_2X|Q>h z)Oc%4B8H}rx6^J3x)K{ZOMJmdnY+$!N6`LSUku>@?q2c=!;s#%LzP)?02Osy`JWgKiZ zbrnTtnaQUon$yk|4T{Kb^6eT-pUgk^-1$_-PMI>cd+OBuAARr6fBn}xzxSiS4cA}4 zcklJr-#~na%yfR2bS2hisb8p2jxx~Ru9=Ri8mFUm>2M0wiXsbYv}!>SsbNC7XWn>m zu+8k-m3$~Dl{#_^1*h+WWrBB-eex6Z*{(&AD4sFxo!b7SYJZx+-2=r z7OG!5EwO0TrQ;+W3_Sd10mkBoz^g%vr*IOBJDG-8H36!%{Y454cCu>0%teSdq62K? zutxIX9fG`kAc_lPitm zT4EDz7Wd3Xe`lq&x6V-;GCS(VR|MLtf<+e;+s%arf33?6P79j+HTL?h3cJGu1Ro;hwxJ7*q(T(yNakN$)2VWraL(0mx6h6*3Es7+M@QTo) z_dhgsn+yR{^2@+ePg(fA$rX4J-e#e-I&chWyO$#{9PVkLAPO%sBFwyHqU zsv-mtm&ZDS19Qv>jZ z1I9*Ypr_W!-7{jd7T6LUz9s8|U9;k`u5wFxw8i7W&v``ZYG$;!C8Ndan)uDZip26I zQTQQl+qZ1zY`@0_%n*sde}?fWf_bFqgb}hrlT>u%wrV7iY@i>vpx+TF)a7^|&nl0P zOC*2HztuD;X2?n``QEp$=?Pl;cYo*hg+x0Y3t{YkCTQn{pDE>;tEK5zn>HUO5MV;) ze4M~)mHCLV2S3&V4|xq+1kS7w9C47fLr==48f}P)@bLz6suO+Xd~b3=;e2ff8KSDp zBk7ZLW?8t|>uCt$%$9Nfs?L`xBBkysr#0p-wI|w+nEf$xsT&gx$7fe`;@;{iG=`i8 zTTNdiI!*scJtJ(Ha5CsHk%onDcEfBx?tz*c&xjOdtm0sZ-(>%>uK(TSWdS-ElvmGLuY zj_;c>BmcoW@3{Z|JMMfic*DMZd-v|!cLONX1o|8XpXdG^jjWybBOlI8-UNBZ!us;o z2_5Kt;F3_Q*%y_Xg!a3Ns7|`?0Q%4#-EXg^8Y!zYVL{^bLTBzF}G)6pa-^9{`EKAv~S-{ zH(ejN_VUZOZ@>KVYl#-JUDa|1yGnceKW|s@-#W961*bnsx2t;3z+2io|5@Iu7}zin z!b}&u1=DKQqR8Y`?bZg%?_pYXuO93V*adG{E9#d_i%uV0(nQ7;*;YS-Z8aXYRqA(} z6x#~8Jw|J3vZ|2O2m=ZVhC~yEVW~z`kvLc+O@V{;|F?~(fH0y0su2|+BP!%@!iWmN zh#G(qWs5XwMigwQp+{juwFnz(oT?EO3q|yb7@<(~<$v2`+MP7Fn@llN^3&i04_NtQ z$!U0%1vLIK@Cj)&PRE95jPy3pxEyx{3SP2lM4{S%IlJlA)x8c(1#*86*FxNP&D0~z{>Be=EV3V-`l&j zCuHrvZlACx@E*mUz-aYxnao0Q+e6Jtk*>P7{%2rc9egCi*%P+59p zsz^9>lzfok8uInPtdL}?XbU-N{Kg_r{ke%AUsttDa?h@sJKs?~)_?AW{*IaP_*m;p z(fazi9bQW%4wuL8WIR{v9Dm8oiptgJ#wIs9@7R0puGv8sHZ9Q?(vOc|E@l5e+P(xp zvZ6@)<*TZ$KCA0~b>H{ZRb5?OecwGt&wUTfJ;Qx79w5l294-h7Dk8cHf*gv72Z%E& z$_gsTdhEjQA|C7S!Md*NwJO3?|6gRjSFd_{M*a8SAFX*+(fKkXBO@atBO)W&zagkX zTdzi2*DKY{hn_4YBDeNa5{bQL@KPpc5Tb( zwq4oPXO3gNdZzJ~B{C&b*JTRmpvn}C=`T55Jm8(Lfp^;2f3%DBiq8l9{a5_&IOhz1 z3SX}}sc!|8zyJT1*FI_VHkYOXmL{FoZv7DHuE2}-^j{Eb6UQS9Ui&m3uix_VnnnEi z9nuD@O&*Q&^n9sss*qyJT}{{&Lg$+G*=$~~&E|``Js!8q<00J3i>FH;K^-=|4t31= z5O<*tvU$+^+)c%A9Vy3h%-C-8`fN&Iq{5#hvW}JxZ4m>tTLkNIoGX7 ztwAvzWV@D?k77N|!#AhmuSQaH zHJUD~p`-ZNRA6Hfr*TV7Ai}OiFXOugqte=)d)jP~Ov2L>$On_NUVm`?KyoDG@+PuT zhiOzp=hNBQ;r_}%Sjk5m(XcmKRI)?S*ziELKACFmdv$S;U4Xuy2uJk&C^_8`0NjeB z13^K@-Ia|UjxpUzn_rtW97Bm&Zy>m#s^MtoI1)d4Sy4kW7j?u!-bhIxS?dRqO;R#x z3uNx~@}n4^E{RT|z;;PF3(~lzEWVXhJEHPM^YiZl$-!$V%N!`1LY7;yPq#@os4${Pcb7u;2+F0yTjp%M+VpWP!+H1 z`_hMTRzcK-L#M!u*M;rh(g`y{by>V_o6}p&vfm$H7w`pMtOUGLGNv~0Z6|y={QIm= zKM#RZ5h{G~N@U;KBbxz{j@>QFE?&v{q&>(4C1CWoo9S=BEHAB+o@0-|cq(Yu#%Wit z)fKa1&i|eF^2@#dmb%;Zp}QTTZ-XfR-InquQ9fN)T;}v6mw9fy(ev7eTz983nP{cDYy~KJ*6-B*j zIph?F?+2wa(#z~|oKaZz9pSXAMn6A z0{ot3F6j<-kqjw?=AtTYcS^s3>~e4#V`&gH<7dhBo&Vb%iGU56Y8;LvJ(G9#1~Wcy zHej^|vR+>%NOYo{`8Tnb7eA@?lOVV!6!f9I)$HX)VnZs$%k5m;B>fS#cMETmc%9}1 z0-}h8aqR?U0yMugv0}x9e+>WmKXKakuf6vBr&;&?@RCb@xDUD$>W!d|Cz^GbF(SMU zGGg#MpU9?|j_}vVSFRlQe@J~gaOc9E4N*7*IkzzV!_w$rT5}$dsT3r zutQMkqtNykWEg$ZHULKu1EQ(@CYO4$pUYNN@h7tkY`wzTE$pWt8+WlWITpwUEbV4T z%;$?a%WI*d-PYw8)*-KEv{$c;`Jz0Yle6)BThSZ;z>!%Km%@%ry&*BwDGIk zYHF$$E`wd%*2E7{>t^@ z{58xGr?&d4Iu7uM=&wVn)vJgbgeXj#&#s@^vCkYa@9R8u&_6Z9e!Mdg@||(IHj&*Ij8x{7ctfYsksh zUW>q_PB~|I-}~_E*nI*=txlITi8^u42&)S51#PwrymqoVlI_NXCq>tEpcP7sNEUN) zf6Rp&YO2?6jrGTKD*}(&a@kB3F&xfP zDqX=9g*V|w0$0Ei%|?USu~PrA%bNB3OHq3~5b%WhDURC!M_+pDTxGI0b#o zVGQpsw_vMQTB#XX>)z|Od>Y1y;?v9=OCL?DjSA| zHuNiv1E8Zps>1*IDf#W7SQTZ~$m|hIa z36Y5M+KZ^WIKGKPPjnnl9C{KiJKSckXRLCi{|e!l>H6XI>xcJbFDnlXl{dZmS82t5 zGgu#=xaOW*UpjHG@>hrh8raz!yAm>j#=b61anHjbW@#3mL7J%;W5^QN%Sq)A;g>im zH-Ok~IztI>1H6DkC_x8whEz`ky-Bxv(s{}WZohRLr(L9v%QY+RFUFk2B|dPTX(_#2 zUrWyP2ZQ}H$>eM$7_7`D!$TR5CxhE>>-4NA=6n6_9>rEkru!n}O2Flhu(?40%0gjP zH2~K`p|G+)5cKB95{dDmmwXC|vAmb{w)J`(j)-ad+O=oeoHo}Qk|#2|Se}*d1ugv0 zPLV|cG*Iv%X+}A6?Kneefwzq=SVHD6^qU<0H0(m2lF^GK9{H+8>@P8d@Q_lv7nq?? znq(iVhFKMNZ&BnRZudyXaXp;@>H}i&;;cF_5H^PU2T~^E=GbPVDfRTZ$IeU1_g=Am z`xTAn?mqZW|8($fW{t-izXr|`b~g%xwoHkFV*OH7ys%)~ATAN9#?X>1Fk$@sDmLc*qe^Tr>3rtkhb|s3ZF$4WsRJ|7WIC9&#j3Hy#+iIM^MxBi z!<%bU=PYE0&b;-M)o9M=4h{C5a?R%9((K0ruK3^#_xmXXh z)ty!WaWXU-Xac0&Zw$I*)gSyp;U_T6nL^ImNeObN{5+f`%GmEK_ zO#1qvdOmc38imJgS3HfB9)W+9qzdXLYGdX?MiY(cI_FN%m7W$nDf)?G4@k2jpD)QE z%Bf0E51s_4QwLOz4vEzvUHGSJCI*G1;h#8(pGg)sU$SL~Yv*on-1{D1%)5D;Yx^$# zJ^sI3x4T|Qd^GVS{=?&i7hd@DM?XsYO!g3)F)UzTzaA7oyMXP*^992MU>lmSKI~fS zyxhhnjNTpKuuV-^3FXH5yPKOZDmTnwq|S;q`T-l~?~=z!gHapQ?zSeZf^vhr-1a6c z+iZ776E?#xl0Id4E8gANgk=GHABUaNgcV>LcpZBcQ= z{1D|pm&J90E_l9xXg5w571p=7j@5ZN&_#vOy8|2sx~Q-c%8m1PL6??t!yE>>sIY## zJI>z)U79dzgW3gMR9FS&26;KqMTKRX?Sd{UY-Z6UeTsSTF6h!MXOiB>VW5i&D=f}S zuUmX4%7HE_EY|q3bOncjE(F6oA%DaSyA8^c0^5k#dvM0r11Pjb^RI_`Jvy^y%?y3| z>NuTSuXmq&`f2B!bK2?WMt5!9ddewVx1wFl95PS8z^;d%AlBNVIy?E?qqa~K4(6s4 z`;pBg3{q^)-{!D1E<-(iC{YLQlrdkN65yEYrDsF#bu#&9w7_6SC%byQg ziy<0wh)6aL`s0=a#8r~Ug!xLC>(+l^5)mOlltoz_QXnB_0xdi7G~-EINxC|P;JqZw zpf&X}g@UZ0K;fvx4~@p5)ju3beDaftk=u5hwdK6X;lnOi;|1-8fkO-$OA7|7FP78J zrP5B%%}1CJ?a&ehgEUEnrk2J}fmF`HRHinN_ouBM=U4CR>5VJ?Qp^c51*&sykZHKs zS67hyKXFNWw=GtQVyEXI@}R5z7}s$=CvwoHX+Tx_=-3^FA(Vl;XbB+vh*!lZi;b7i zlPM%H#Qsu%)RU>cLeW?D8;9O%iMrgmxFUOMp|J@^wCJDO;4h9wf+?G;p3MxpLo=(` zijE#fcDm$NR@N!f<+R;n+iIR3+UUSMgt>4%G$!&8m^F;`Sxifmwn@~&py--O3WK`I zXblx3-({v`Ib<WvVn@D3EMA#E4CI#|RP!zfv_0(2ZhZ8ylWi1tkD(-thG^I|#fM&JpwWI%9cd`jUaZNVqV1xD@n7rpx`a-F8<;Jnf8^1EF%vekfGwaRsgJfUCD7 zQO{IDiBvG2ersyPX0)Xv#i4r15%Sp0Mtdpl$%bsU5ZR0|{&a5=&Fe0Bi)j2qT5nU- zTim!w{tPm>i7-SuRRV56|5EtY9Di6Vgh@~fToNXIzTwv5mL9-OjmE*gR9~@(;djyS zmq%MhKO9WkKJ5<9t|AV2n;87!vaz38d>m`Svlt(;m7TLrcnsuDShMUcW!#RI0pU?S+M(JhLapk7XsEQ^4{Fr}|UIz`e z3le#mL=o~2W8UIWD>!?tPN%ik8L~NXC$1Bl9jYg`_#WvB)MLXwN3BN>IadL?lToDW zL4Frt zq$>$nAL~I(K9wU~Nx*Oy6dT|$(v<|PgmUBjUDB2Ga>E=(x{`qPShm?N=}H1NBRwU3O8ze1-Pwd?0ec^Zk**}l6_^RS(ngdcT}i-V z@B&@IVWcYw7;<2;pu7dXit{;5lK5TYzi;Hfqxe0~e_xLAf-OvxhpwH#ZWjZD`C{)A zB9d(B_=Sl9DTOIQO9hXh1_ZI35Ex$6L0O*oUX`qTt!_(qknyAg>Hd0+J0ot&4<0^YBRcON?&cy0&;+s^R;>>#Dm4#?Y9KyhrgD#2P2g;I*YN0knJPD zbwU0a1X2|HO`-45`p57gr33bV;AFtFO;{5EgRL1bJLZ>1g{gVg;5clJdQC%TU$QWb zBxP?kJTv7^R|85#F&cwOPrtJ;QtDT#KKW-iOu9ll7APju=?G7`>}#fnR{1?*4iJq4 z@)jrwVPM%w5(pp4_a+QkWWgZihNz~WV;AQfbvxc?qZGKE9Sp^aR);O>D^E`J2hzA3 zsgIf5`H4(sB9H0ev-GYR9b2%`B?mN~V!Vk)aZV#@xg8%8=yaM~j9V9;;x;uJQ`++o zP81QV%BD~f8@YHHpxC8!@A}2AH&Z0-j`#gPaS2Aer zXQorOCP#CM(>{E4Bb~JSqdw)+Zo30^zG-e73WH8X&?x{bEcx~YrH%pvEwYrbg0Kef z5%prn(G0ub05ii1%q;;Hrg7h6WXFOXIh3jdy5yg+iJGryvpNSV9qzcdFog89?%V`| z-t(SNzTes2)jhn@*6r_cebJGLILE5!KYTTqPhW=*LxHA>T_C7Oc6M5u=`^cQ2We3z z%N?i-3eqmp3Pp;m4EnL(T3xl;e5u{uPnPa90>;AFV*uPhuejFyLt z@XMl)mq4y<0l&^7Dqfk$AWD^5cG&iSJTxirfq+!nCbSnX@E~IGD z5=|>}p23pTW*$%%X7LaM3++o=p6T!l*l(0k%!CCI%&Dd(1n_*VQk_i3r_4%MI$r9w zD&1DEJ(BlWm9Dc_SZwx4&eP-X?zH$~vqJ;!%xGeK#Wj&iB@!={{wWwO20Tt?@TGEL zW4q7p47MA43PEo!WHp&0T?kyDZ|&_)i_I0!xY9v;@fW33DxXiKaJ>`!<2|gO&-)*I-2sXpIxk5}k%Xr*7j*$HH3_MNe9ps*NPAhBlMg z)ZO88qoN%+-7Xu#B*Il3e+B-INkx^nJ;0GpiF3~x=208w5&5-9qQl#Z*+te}M^!<( z8XT49Lc4W<^^p#mjLu4Ag+m#N3>1^WtScW#;olraeNEXDne?XSYu|V(KY(!;|El=( z10Ofm6oG>axKJMn4>}V^c#z!IaiE1wnAbRip;>pGIIPX;cPssBYs6v@H$9xm5Gx2- zhjmwSU`_C&B_ZoH<(j0MPqfio5rmDe^)%L}LxX8WNe_m!XL)qAj1My@`H3`N53nwz zC-O>kVQg%HKE#i(KEDO)<`%wgl2%5Prgf8Mk=9Gvp3zz<`b#TmOMf+$7Z&xUYh)1X zcXN>(aLdWoHF8bHt}T)F(F>k!T_dqh0Vn7sphuKzirv74IF)dsjIy*Q(Lryq`RH!a zC&@Ers}Yi9?!>YL{i3-dF{|wC4^H!CX&`Gf1(Un;6>UZO-MGWEa|0159d6X`Ej;dW zIOCNNCzId>>4(6{2EG$ivbIo&_<%eRI$ad8WYg3MB70^&=(2Q}tnEt4k(SpChhyfr zEJt(CbG~kayBvuo%RzfQ2n&A78?HFq_NXrs>2~>h?a82htel)w*jk%A=JENv%)RcA z%Np|ZIxW7Q-iX6uw{+psJXgq_8}N}1z~IL+N#Btlz}z5t!np-Fi_9hD2O-{}jM#)V zWqtsz@ftiZbiWPPW3)rcbNy9QWX~Q?$m#6tiF8*IaxP@pvnTrHaH1n*G7lHg9NHVk z9I41_)VWBS3&{l&J|r)79n?4wwfePI`WP%Pacg!!F)D+ZA;svergoRBURkO2 z$!nh8vEym_G@d-Nd-oA)pYXS#eH$Ma;!%=UGCpR=c_U^#-JnU^`7X&UcqpxQ38G%K zcFF1aO4JxG{UricQ)hzqWd)EvMta<-E8;6InSE6>LYgioZ__=mwL;bX#ct9sI zDG}d#)QrzP_-5lRQI6NaNoJ@b{|iZMu!F&Zb3p03zo#dV>1w|=z0hv&Fq*CH6RFGE zoq+_7rguEpR)~Ap^cS3EkEf`7p>Zz`IoaEw?@12y)c_nipwEKaI1bvDop_M4hag%A za?1p+@Ix?HT?X)<<8${u|G6iA&5&a*sxF@6Co7SHa867FlgF5QI7dlIvuP>y*N7WfFba(+PFie#oLFeW&_0TxsnzUL)2lt|MkkmY$Nt9=Zaj(Y4>t3(?p?yyy$IF; z;y|KN5Hx~xQ%91n1QN2t0i4M1L{x)E6|@qo?>K8+1i90%C99IY7Oqh$zH(Le7R7oP z^p#u&Q*hOEc-Z?U-USz&eb)ZRt-XUqN5$#izFI@~;n9^2+Z|rzewW>WOo~G*xjcY= zDeZ$EXaKfCZp!45#1cFLJ@{vhH2RlAW^ar95LT}+_D)A>{l>fGcLTjKql7lC?RuB% zI3I9lBM2hMy0vG#Sd8Ptp0I`rfj}W_wT9^#!mT*TRDXXeiChh6HzXa#Ihq*s%0X`B zQnG6xN{lO>6evdfCB#&iv0Z{( zGanz96PkfB%s%6vQN|;Po|yH~Z`-tQ7QbiuXNvA*e<0AGbZgIBW<6u^#Dr%qFz-?n z*F4h8O(f!Dp4q^h8;;l)V#66l$qdKn{3a6g0?EAK)K~sNg-#lXWxSa;8GDt(BUdg;+Mk)QVtN@_H-{u^{I;W|!C@L)B*w zHEtg2HyKZx@pQR%Z5WtWg08_#xG!vVb$#UTjmA_glkrE+8gV3SQA27?dc&?<(C>|r zdndCxov_876Pu$*cS&n2wnOl7Uj?~%tu}^gju^dfs!K-)s0q2ahsB6jVRywc?^VA+ zkU_u+@k(jR$tXcj5+St7B9+<$QjnPkA%py{+8vvYmgSnXH~Nqxs7fEh`n}eO-RKD0 z_Ld&L^MMB*DBgG9eRn)0U-jkaEMkbFUv4}ST^akxM`A0ZY$N*Sferpej9X1QU+del z=r7$Ud=xq{oe`pmR|2{e?L%>KG;;Jz(phVKr_<~Sjyk1UqY$tN|3w;rn5=64urx+8 zHBdtuJ$#wq*L|sqI^x9JoUj>*F(s=Jdoi+psIV}UGEYx1HZg5ZjcqCy7u-R2J-%^& z7jrj$&e(5$)pP2q++=Wbp+7OZZ!Bo+a&~pt+k?jO19OQ|#2-pta(1-c*3sqaik|Vt zOqS%)#NtnIUgzzYaTEh~lrYE8kQ~Hp12KSr%#-T%L8_wn|M(SzzhWXC~R~KTG|1VTqk%^V36pu0(OHO#$A54+TOnUtp zor*s$pLf17HoCbwuxT`AyzqQEt^}NZxp9>oatog9TKph8ikvMOMDeI{B}sB6Nw=Si zOC#;P3na?v=!6&)u~>BhX-dOL{zba(QjNyxg_0guH9+n#s$-8(ui}(EMKZBZbO&9& zgaSv_jkg3%u0$=7^7nWG{-n=h4D6eYm^KV(4ozP{jhz&R0C;iPNfYP`fmmk^EQXIH##{Jk1$tg?Lc>^I~A~mt<~ZE z+j_#?<{q=l*&VVd2}{uJn@f!bYHp)E*Jfz<-gf?`H>V7_e)-@bQ|~2zmwE4**FK<} zeTcQ4^}4Qz!ymC7`wGfiT*^|S?XTFDy1*2~u-wtfA+m^EUHwRM}h=q9hb#GZxR zHezOXV+U5mowiHoicS~xn3oPv(`o8l1Q#MnVD6NJEe-rb5`q*F#3*5UQNV$SG^Cg# zl8h8vPBf%clRZ3kQjwB;wIlgR4t7z7C`s>-tRz>zOMQyl1H@FNzf(3wx_6K2jp94i z8^<#a7=6#vRIbI9s)7%;j;=KQYZ40tMU`TKsME)Wi+*6ith(4Kdpz@OWZZa(XDypC zPZ*hT_3FXx7iHJszrnp{Wmhxr$0;b5IdbdLZrG%HgN)!rotCsXQvWHwi!Ar#*P>?# z{dLgJ!)0@U<>DszJm`vEo{y3?eM@9we8^_^SZVpD-bwN{OuFn(QzdJkA=M5-(im~-@<6@uC9Cz|!J0LTf z@qY!HDuou2tV(e{cOWlNo@Pt|Jw%ov^qOjbUjn)=d2QN2HyYn=Jjrg=t3HVa1gG2G zX#J%njGmO4l;CMRseA@c3Vq0{&oa#mQXDY{lqLMaPsu_SweSs15nAr5Y(Ha$7n1Ya zt>5}b`?eVtn=>#ryV`!idg3DR(c1HzYuLxkz3ooh?A3jh{j9PfpSZy8Xt%USW~aeY zHwBEde&gW*iX$DsdiOZiyR3en{IVQadX5pY8uW5|5I6`Fq23wQ-jK8)OBL8(y1~$e2U3L|0Z@*;qEg$bW?Vwx=L4V4wJ$H8Y{B^mo^DAl`hgi#h#r3CVcKl^pWb3(K z(g-ohfWH^18t`tl8a$~Fd-j%%$Pw? zE3iWxuml~8^!|OC3{caQ=`u~v=^;+C5oaI4Y!Hc1X@*L3cU#1V}_b6(6GCO3m$bW4I z=eaQV-1vC$p;2)IcUp&Bct-G~nEyD*B9Y;Y_MGH_NK-b#8hxs+y30%-+arlhv#ulyJx;H6Z0E3#vFt!%VDmtt_SH}BPVC-{PvhUIKa0B% z(e@kYyvxtG@l~23(#ebiZXaP6r5d+(%O5+25D&zkXzwA;0(pFw|EBmt`569|mPLF@ zTK*6_7q22-g;9VWzEK(DLEbib3ez|xG%2l-uGHw-8vn&N`FcJ(RpU@IS#c3aI=Kk6 zhY|omN{R#-P{qcIv~pq>Vjh~%boT|N*cXfZ6rQy8S^=Uf=&hmUz<;X)3T|Yfd_l`< zg`X@{(vzHO1II;{vY#&j3=OgOE&(9+l<3TQmPMd8zOxJzT?PSZ5g)Vw`hSztf5YN0 zVYedsZzrnDn-LwRm-*pwWhQx;=j#@^mM=vAdmZ+`c%Y;$S zOT3h29e6LZJZa{t?@>(=c<*DkB zZm?5h#{ei-CSi`!PHt8|{9*syANJjSx9`Ju-*f-{fd?N9;NJ%@j1*IGKKhYFy$a?T zo!f+7g#8#z5efwr_DQULP5Y$I=7yG#w>0qmPpjK)wYgk%{;$pIzMpsCdAGyn#ucLO z#+Sv@{UW*qKKuvfW*&AiWwem4W-$(nN#6lI{y|R34@+ktuk6Fnas<6^1D8L0{fV>?0ww=iUq+0=UlCi)lBRQ zjnki9J@sfNmwP8;OX0Xt9kwkDYQ`X{O!_%Kbc4xfpG|&! zRT8LzhS15_-y`2hhu(Wt4ns#58+)jZ+_i?vAQlVf3R`wv)5hsEFXuB zpy3==Y_j|ig5o?c^m0{8rSrNHW>62Fw0e^+M!PyXVPc_`4+!HEZJsKLn&Y=#c>Ni_ zWQGmd4fLgPY(w_jsrypbTtoi|+%v3`J;rVXm#5KgJ6aP-ut;yEGl#072JH|;K|B1$ z;t;9JFDk#0zMFkJF^-7q&Q4ub$N{a8oYdj^YW1< zFGF@<&YPNZo|YuEh;*4Xn)TVnEo{$!LP9Xf4}0N%u^$2N?b-;d`S_5@Wrt8 zw2vMrKty$-b0nVVLISLc~s${RuOFt(6R5Azk?h=S;S$@>$$O1GZ4>`LS{^net?YhLa5NHJjI13 z8QR5})p|>a2VA7;DNPEvLITOS#lTJMBC?u7n4q>%bOYricq~vw07zyq93IHUEJj2;5PQe3WFc3Y_9n8A*(H13RO1$x^G=Dg(I8elaIO6gW=dv+U1U> zal|X3cygmSxmol&q9wm274zINIp&Dwy@<7UOg}W4uZ-6Et7GWE?!_UDC5=y0BDAV_ zWb~pr(Y#hlL<&+&0s=;M7Y0W1^Z5d9SBb4DCkLD|T~_>^b*uZTpl)PiuHufKdMC(* zb6?7%q627}XLq($%xb&-=wY)N1v(-LkHWwp?W!2vCF z=lSeRf3!WjAz7NqIbF%}oPVK^L$=by%%0)cL^&83+E^=YjWSPeI2M`k_>(ic>!l=} zn~n`--SUcHEWYr@&0B9gH0Z0WD3mvkMzirwN7tG&rvd>l@%6~!L1s5N;a4F~7|DSQ zUvsbn$4-mqx1iV#G1MAV(PK=ba?X7 zP`CN@IJ{S!&eq=c_Uo&qjUzDw?yZx(rI}3ahPPig(6?bU+QxIER2JVW2Mx%6%I78F zL-NHLP<)o5cb^7GQ>8sL8vd{C57eYgMZ+K*Dt+s6>?9C5_ zUPv32u{FEvt1sPFDs8)Tb$$1mF~tZ?VRZe0vB|R*ve|{RCdUq}A9Y0u3(2wgHuiJu zpL)OxD%$Gmiv6E(k_yYZ47AClgLT`0qaIP0!+?K~0LJ-W?7_yZ|M_S3zD5CQbWV+? zjg3z>K4HwD0i4fTe4AWC{bqfxs_Pf(*J^Y`A^q^#%f3}^+=AlAIz-ZYncuZ|hWst8 zw^jXarWg@6Ch1w^^?kRnD#W;*g|5@1aXkXvs#g*)+KZF@m)084mt6cVo;b{Dr?p^e9pL1m??C2xjVy_kd3A4>&ouctIGTLY)_@KLkX+jMtoa>?)zKtZ3I$g zjW!CZZ%wzvwO&FJ1vM!uM7y(_tV^BT{U%}w$TkPQqS-u1IpTGJ6Ow~08VfQf+`Z#$ zAk9U&*}?#+KAyd3dhU(6f&SaJFI=;~Uf+Ms!s=`G4;_2bXkwpj>&#s+F@0gqU^1T9 zR~xU6t*Y(1Y{iPpcGc+FZhXA0s=UMXZzD{O z)QXXt7dkL@;39LHu_3A?{k;I|kS&eh`F`H;v7i0ihfM|QOaY&DO?*h(ri><#H_+XY z$r+MHUWa#nM(_L#@BF#(Cyr3#Poh63z)2M-Vo$(vf=`v>WMXv%HfUS|hnouj82DcL zC4b{j9^PLxK>g)38k8QEe##C4lco7-aA^AzpI`?+LwNT}H?nT*^t3Vtj6Zl7?*HDa zuDp`9Uvb5isLKGq#V&R^`wVIdW5$F*^9bG+o<54sq1-9@xgJFOHaF1b=AxuUL1=5f z5J2B?Mj}pEIP8j!_xb&OX{4@%d=o_#ei@8GKv^_3P;|utGVB*CYLEbD)VBp z@~RQZxa4M8YA1^mRYtU8zzC4Ng&3FK*S^W>H;CAz&A_W;&othP`_%|(<~!Q>JN7wV zFZDZ#e#fjN)4W8kw>X(!Bs$tL3 z&o}1j{bTG0joa7-3AvGAFQFLlbRnYZcg=ny;!CudM8FL$jCcv{C0GDNK87~6veaf3 z{ch)_so&y`59+t}jcTIPAHKzC#@L(IHe@+=doByiYqH-r z;FnjP`P;Xc*WWzh8M|Tj4gYZtI`c2-zGJu6t$yc+-|CsXdBrJ@J#^=IWb8d3J#qk) z4KMyXdrE!`5sEI1x(Rk!;`VktO`Oj}UJWwV`u)jCcc(YwuWWNR)+g&pJD48x zZt)NBMNpp3UY$SwMqN;B()_IIFvKTizOfFo(fca*-BW&(3%HgYu&bHSbKP`{3S<0=4o65R~RDk^xV23#DPfghS z0K0<2{=6J!=oT;_;*)LCy!-{wcj=mGj{EX$VfhOWp?<5pSNg5|7PQ%ru2I{p%45<$ zp#C=bPv;U24*b4{|NaBa;iz}9Lz-WFRIQgFG=5>kKTNje+txfp^}a)%XE%Vi%<^kZ z9Pf~~vnyf0G~=c;t$%kyV7*zi--Nweo?>s2KZ|lw6ZSdTkKA)#1FXFTHiG*TK`%pR z6ZTViE8@}b1x#+jo>?rj_2752!Oi%QSK#+N?xQ}FRvLpxl*62V0R0?7eJy?k)t1Tg zDU)9TG1Bp!1G`i5SKda%VvFyPpOTV>z9x+YFH^CLM|NinednOe*HG`yrS+;h8n2h~ z@fqUvsy(%PKps=;{T}MQxLGgp9-kv9X2|Rwk)NV^Z$Z6>ssGq}tI}P)K}gU4+}eRQ z7+EAJU$mmpX-m-^Iz{P7?MtpPu1TU>hYs<6-Guhvfc7arB&|6##=@&gcTE|vBQqcc zAC4EA->^ToKZBQn(>beF5lya@=P^eZpPOBa#N5R0{}#iLMzc?04TS zmGU>Fw-_?ODUSX~u=A13HDOOp{SsDjGCxuVADXhlsuo|;`lvJP_w`!ch9K*-du`5; z-{1Ttf5VO&JbXCwX|=m-A)hVcr?3<7$6o1T@VAJ+rC4~uMy~k9KmM`&7TVuq9Dg7k zHqZ*+I!`Gg{_szJVvu>6zmun=OE4!~*iA28$@LvxE0Mb}N)$svryFhPO&V(nnJuu> zF@*DhUO6iFxNx>3HSF!hMK)Fkj>dC7xEVQ}Uk5%QPbQs0BR)h_ z3u-3sJdKcAJ2#3@?ZGV7ZcL{gL1#CwJ12kD8A{rGr5S#TOzvMMVvDp+w{|!86i?8M+I${# z4DmMod`1aM66gK5nt9$~qeJ{QhxSA>pvg0GT3QJ?X~l@qyrpcL#P3!-X*N;x18zg& z`}T-GvCZf$L>*Rt%q~y2d)-At1g!0MI0Mcek`h$k7p0YkegBR6{-xdPqWU^SeHN-u zUVK>gOPhfo(Vj5u29z*tgQi6owvJw_yE5L_7pIRq6msJu`^%|xxtvaweNlfP8V&ei zNfGsbUfOKf|KF-VRz{AGaM(%pf4-1P7K_PL!50YlLLvOC)juLV$Yr@1`kFcuRcnxt zx-{{?H!=pcjrgXDkU)Goi(6vPmA1y@uiSVej`b6+_d>=#$Ys14a!F|WG`lFSi#!bE zS>RRReX3&jY-Qskm5m9KwC9j>5aV-#H9*yM^ff?bZ3qfFQ3_3ptJmbeFo`9N&XdLu z^A%tpmbOEOXc1zIOV>Z7Gh&wwC0PCY^SGPP<#^BvwN)MTt%tsgYS+$+L8IXk%se z*2KmNrxW_|yd0Bq@^j!}k`ol2#@A9DeQqac5U z(>5L%;YtHrd_l&!$7VfUd~WeMrKj7cP{v%q!{oLuwVsjQtX9vcTF;-@W73t7f887( z3D4HK$xkY@mrIs-N9U>`_Rnq6ki+S;_Gk)!HHyhT1$nsXUO5?&E{P3qQ{)8#@#*D_E^{%boLlRZ62rMG6jhTA6qQrEUb*JAJs=ss;>)L z0@VkW5pgD3jqUNEC!toE3d%$6;gD9POL4ag`Yo-~#`&6}a0Flc_v(CRv4*=#kw=t| ziB-jq66?UU$fNR9C)QxWUx?>I4zJzXm9oZ5m!)RhzKMu>gDVhZi_b1r5vilq)s1nY zz9QbKwI1Twv3NRyifr9+6!q{ck<&92AkG&54tQO%_z?64TE8XUM?~^s;?ep| z+JWnD(GH#!%7Lf1*P|&14E(fTx_I$gRc|q%cEVGEAN1m%{NygEEs}w+wTBJF>BMuS zdkL`IZxI+;$P8ka`jRiA4TwzuI=M==NT|hN`s5jtBkACdorWP;hken;a2?Wv6k&4Cl~!+)pk zWcvKUw;k8EVf>u$Xg$`R)V90`8wGN){1U5w7hh}IxkMxhB)EapYQBpUo5*+)v%rzs znwU0DCzxD1H7Y-Rc>VfEE~L6{#rprW;XE#9Xx$Psi8zZ^0WpKQHo_GMzA260Ufv!( zl-ZSDVO)_moOe$8w3(SEULSA4s|#xrap_6%!e}({az=OcalEFRc-_&0m!Rqi@FLYl z?dKiQ?R}?dc**C?w&L}ep$+tMb7=+M;CPYGm+)%`och|-3Dx>=D2HqGJlfK%VfwTy zu+mT*wf}Ts?8K{K3=a=ig?*1+MVP7qutx*Y)79%M2d?UU80B5Bxy_FF$`Scnc!b1YyEC}Kr#?#Oec?Xd{o^oNc4tSgKyf0(xX zhK>t%(YhY3W6N(-xBO`D9oX|&W$(vI9_3P*%X(I2_FZ~VZw7h665+Y%7i2T)7 z>R#KFA`4@}Cx?Ap$ z&p2i8u1j8Cz3sY-o>;&BQ-|I-GMZewan*`9M{j29W~Qfx8^7z?IKThEr$PqyrS+Su zYe6&k8OZAO?}k1^WRs<<&A=|j1MoWHS+;XHbi;z2d1Rhe=o7Gcv zoKkPgECdo01+OhJl1;47%gL?9@~W~YHo7hsUlWr}$#v@rU;N@Ju|OCX*XLFZgtDo8 zxDcJ#J~+C2Di-z?<@uoT?6ae%avChYhQ}}D&&nxA$%NVrNM_1uGXNU=Z-V3O7|}*} zfkZC$3|P1wKDF+RIARpCNk+6SRvOvd9$ zBZPu4%~gb}Xp5^vB8oNaA-<>ekbE(BLO=L_ZI>$o7cQIDeEC1FUGT_(#r=p$co*nE zT!d&l7U%TYy||xv1n{s5$6jA8pWx+j5|fvQ&I>q|{|YakQQ?^PR2~!kpAGk;9x{xW zji)f!`~fHWf5DIeJjUTW8QKS2@GO<*Jd5(8em-8jJRdLPPVQ0TcRwKy(67LFntfC3 zfHnJO({6|02+Bx;yP&QXmrWU7e$9iXF&|>UuxZhxzrKE;q-SAqGOi-D;0u)Q&ql z0SkjIj{DT&@*{y`=b?WTFCyVSHLWb&vLVh{RB7H-AB|sem;7$ZK5%gHo2Zk{)>56M zxu~((bbL2{kjh>OG6ia35k9k3c63 z+PLu0&U^?nZ9AkVjaMf`hJ*TnPaR`+@JDZY(~lzAthgX9Xo#Usx-;#+TIz&H4{eb^ zqG);%DoIus8Fi9mHlj|l8c~nUhz0vEs&jSr4%8OJwR5Nw{l}RM8Fl^zntmnNz_tu! zUChnzs1s#%nmU>^MP;`NT2cRHls`FLkx$}6jjp)+Zb{kW>3TH`OCMJhsjg$O?vLMn*Mkq*ZoWQCz|ao-v>Xa%^*8NS#b2-|QP<@osMpT(`GSA=U46LJgzqUSUcTNkE6=xW zoZXP_X>Z>+n;LVxLG2Cu!St?o-F{j&vaau4x0cJ-QAemlL~FVi`I-N5TA%EITq~^^ zJ8;%n2k5hE>(*8D0ij(Wc=yA1edwbf{m@+xr{8niZSQ>NZMVJW*G*z`{?Kr4|9_yj zMrG2HTj?!MkT0V*QoN}IUqbIU+PAIBPB|^@o!eJ#&0VQ>i2Z1K&%16%uBOO_^1E)` ze;xIO`b6u%8uZ}(@;!(UP2n3wuhIEf30T;0tB|UZsONn|#3x;Lpr4RcOX$Z#$lPF& zx;d*$NQXymdHSWL8c!kwml7G%T?a4|;Uo{6j@bge#$LZI_Kg=ON>BDZS$=L$X+yEN zp|mIYfGjnLFKB&x9(eVFI&prZSF5L2$4oz(bcFO&RcEBkW0aeL_D5DJDv$#=i`>SP zVUA8-lQa~XB2SqQ?NNjh;dV1c9EHWV1Mk~0Q@5Un z7%ZgJ?lyLg)z&VsNTpoPfBv;De<3p1{~{29EW?_M{3zX+lfxQi_2YCZAzOp$DRxiD z5jtB{oL_ooW3(Z9rVZ64-V{@h#_hEp%uxL zH>3pLboM!yg~EYED!GEfLont<+n<8A-H>n1*g{p9>6GoFAan?P3S*~ilRy|)Q8FV= zHxWdeXFO+d2@9_6z+0ydOhqD7`=_qG=7Q6`)s6KnvJ{`$H#)j+Hj#Y&S(S~$k;Ve( zLhXML?RV)B@5@@(qrpYHGTIgX2f79Xdj^a!h3k_AQ9Ip$vrbX2>*9HURU5B<|NE@B z@ei_;dOZ2Rh~3q;-_7~GIVQ{6)}t!*+f{We(0i?&IB(^pmk?i;`bzRQ+L-?%#ypCA z(&`W|8*_c1bd>lITuDJ^`smYc=`V~vwm4N}2O#5FJu$OusJ>e9yGDw8&pmT*a@=|K zL%wZwx|Ck9KpI&`gO{Fj_T>)S`;z~xLN!s?sqqTYs9QSyZ>N!piB2PZ9vwlC;RXi(3Qi_pKFNOphek#p0qA?=yd|?lSFO4Rl6X6BIW-lyKp<-?;n92meeR{a;4K>2_FX>NHo4S zxI}R%DQ-wpesqlY_(d6G?!vL0EE{u&V~6ub*_a2;-@EWamTX9DDzZLyxba<G9-O-vk`PbTN-xgwQ~ zjBc$BY#j|>dQNTYXhd5Zo&pW&KGBm)$kxk`D3hiLo2B(Z?B3ONb;&iM2j0K;+;jJy zU%GwE+6`MzlcniR>la@5^WgYI-;X$L4$JMJjji>JkZNJlX`}PlQP@~$2S$>Uvh2{I zNMSz`VdtcE7iho3&o^l&J=zd|PE)_6W_A`-L>vN{7tREUayr4--CZg7%Kh%r8e9pX zk~BQDuH;y#I{aOX)wYdAqqtLu)30GSwJi*ra`XF!H3E<9Tah*P6-;En6>IL-Kv#;% zZ0cFd(qk^uv-DXeOeS<8frwA0*ykgp&`2FBTlRB97?dsA;URMp#j_~yIOq0ttIuI= z?>=1ma1P9{Fm*d?KX16$NWuLs^+s!{@l_o^2a2c&=d{>e7=sG3rl^xaJ@u=PK#8;h zf zYlRQjPf^0T+D5O>JChxp9w@C0^hNC6zM1Ugp7?=Cda&q;D7KDZr!SK6;Q}K^0=iD9 zoJ(gMp)Ms{2#2aESDrLN%7rU2=#`*-GuBpJUi5yoE^Txa5U+rrC_;(y9OFPUoo9}J z;}h(rhfD0mRH~us6Z=537g4uYKcl=%4lf&KJ+Gv8Edib8rGt22RBeI6Oy5^h(zRf) zmht2x19OqqCd{ zE+*Zb3pvVWqn=PTRt{PHR-@HxJy`lo1t|QWZ$qiHp^wF|A|po)82oay8E%DoI*7=oL48^qQF%Sxbcw!_hB=yZ2& zD{Sp@cN;rwowJ2ER}QsX%tj=8I?zvROKwXJ|Ht~Gf0Nkea6J^NhZ_%bUc!M!_AWl& z&9$=iJQhb>UGep<>B@*Yt#mm?+b3l3Ob7@2s5C<**=4X6KIbo%i+c?ebWR7Nu)XnRWc}owlgk9kspl&y7F7*Fo1AINnPw zVueOLKkcuYyz+n3587A>WT9BWR@+3(;EF$ZUwM-yWHt5%EgQ@Cm!4zQJA<`ApccHd z@!WINc0c~1`PjklTj3;ImUl!KeA+2yia%MJeZ0sMOlbb}px30{WI=6lHFsEdTqjt98)#5o=I`P#@WfPTY9Ex!%@CINbuCY@Dzr1x8&ZECOdRY9D&A}jq-sDuou za_FQV!|WF}AG+j9BtX<}oCLaL@G)T<7&pf;K}CXNw#VQd@Qt!>HJ(4RuaEVyk>5S@ z%+t)3Kc#ruU8%e878`ZKn|6j0`x)@IKwrw^j%F3FR$o~XScnW!{t|4gwGXWPtxJ9o)~WESpxrYm_p5Lkqd%ZuZN`i!huG(^?P7 zT3)}wv;?NCpddx&?lO%US`?w!lAVAXz8ic@56-)cOTkOK_5PgfAw*0m!8RGz%G~K2NG$ z?N>vnxv*;*=VV*VZ=*11D;IJ3P(wA=8C>DC8*$Yl9(vlLkAtD2(E~nAL06g=|H%0c zoDIHvm6e+Fr3DT@eJh;CpO?qH(BOTjhvuVzyO`kX|JcnZ(qw2h?p}Y?F5gg-y=xlik<4ZAR*J&fHTI6+^t{&pn z0j*n{Ry~y~*ap~VNaKW#g?J4K5k$22A$?0MUKDlP0|;>fmH~)W3w}`+Ov-CTI#``N zbbOb@Ge*J!=&G`>HeO28SC=D!dKw zU-0o0M!@fqi9bYng9@gGJ1#{*iSB-_ zN?*qKx%6x(%jTzU{{+p+_Nwn0Re-vP^BLSubFOMze#!u5L|;swUFWM!z*)YIXE}qBNoIb#b_XXU=n5dtZZ^Dt~?|afOdHIPYl;V^G~T(**hCA?A%$p=bm)>^L?2<7HGV( zJ-z*7qMu}|1zpbM^m4GFCSAVA>3bHzp);hKYfcLsva1zNb48Rtrok8c7;LB-9OIg5 zsh{QqFAtfi)&u&smUn37p)<6?{VH78K#9-J=6L>*g*90X+o%qIFOmVGU30TM*?eiu7x3gs z;OSO4*9AoR>=HQX0s@|I!U-P@f6@ieU(Vsc3w&2v{Do{qP7}&;*{81-Y7~yXIOskp zvPcB^tu@-3-=Y4db2xc!;X~{u_?WzcM^LXQOO_y@8XezqX| zk*Y{t=Bd-&+`>Oc8y$*a#JvQ3Hd73vIP*@)4=E42C?{4(g5h2r_+5Bb5N#U-?^rCw z_(ebRC`00tnbT(2R&0fiHSW3oTGsu#vweeGhRciOHszknx3Mj+I~(59Fnd(s4nG3Y zV8d2k)-AO;vX1 zHcH@C-AoRnIkR_kR&ucv4U6W0SXr zfsQTU2e2NBJt@V$(b!m<>q`q9>x&A#}YWnXDXkT7pWdD z$F%qMFR9P3z9)PZB>&DAcuBwKcpVRa^~7-4)3ows@_lIa7!>JO9N!Z9(F%7-h15?`S+lbP>K58jlNT zJV4(c^YI8Gj|;3*O}GNRjh6>~Tj4J0$0~ec3Ea_y?_UD`>bkZcbD-tO`6 zS55+dbqSpG3Q^CoC2-O!I2?LKYyHHxqWt0#coQGYuh#Np=N0vIEP?CgyG{b{X@whD zv!37*IPH-|{o#|qqbGsKoA3$pYc=a}FnD<|zJi{l=ZN~vR33c14>kw#gBA7o!(|e* zKuc7iWr8Ni-BhD&=jaY$y~DC73!%Nh^<+qd3h#f|NXGO(zN1x>Rc(W z=D~_m|DrAZYxVm?(Uo>|g{-7PDNuDDvxrAI9)DVAGF2%ZY)Fosm#tgWFw~YABWp|Som%v-*4B!}JQ6B4RYkABKwH|$LOb~4} zICNscEBF_FLE`C))j7GA&&lKAudoxtUtI#HxyS3l+!N)oABPW%>Zij8_{2c|GvqwAMp1Uce0+9DANC`P>k2hx8>rH$=NMHw4_QmFIYpOyO|(m&3W8f8zKb2Zs!8g%du!Jk}f)4t#_R6>tX+l%l&&xqTLTX;{C}QB`Afy+)sN znx3fL=Rz4?dL=K{bi1MH!pyFk)9DrwGN%V&`)LLM^3Xd64?M6S9*|Dr)PAQ10^WM- zwq|hPx^-$W;L+%d?0Z^(;9^+*5p*%qGbsLq&KjLO{zQ+dI!e0`EP|SQLS#Ed1e%EK zTpEE=I)Bf36oPWwmJJ&>BLwBtnT_k#y!md#pp<@ywkI%8WUR%Vh^B8wKrHi>=)PMm zcDfT3CJ!!R5kaL0rxHzbQUO69HF;CA^>hwq`@mo=O8cKS^SK6p-$XJsRSp>%5BRqZ zBBCS`o7h^dZW;+Q_HKFaj@%0WPfH8rL|rKT+?!6#9~vJ&v@(@md0^OJHlF^52o8T3 zcs}o+0{%+4Oa;9Ww zEj-yfXT`x;6?4@|+J`ym;SGC>#zA?Sq;?KP>C#(3M0t_i=s4*yV`SHKbX5t>>6A#2MUR z>a+z{^en8Lv9M6wJwI+*3N5n4Il=%JqHHm1m&aKSS8SXclIR`1V?9vSPSw&0FRYKK z$+cpYn321rp|4@Vs&)DGbF%YV%C>A@RDXJPR@uB8k6xL*wyV7%*Sl`<+}R74wA3!% z(spX4#KBmgiS9W)4>T=z*A0(*gKPR2(K$K2V2W-j)2o%7mDRUFfRij*OH3L{>%Zu* z>BSzh(BS!;{tEMJg0*ITow ze#hLC=j5+0DPOm6T26k}(z1DTais!NnEkMD(g*v49 zneC3ontqXMqutlBGzT-yym}>TqgM!8xQWVk{h^XHJ5O`=v>$pAzjWa@vUGtU&NRoy zBe4`$qovGDzf!bzEW<@-3ClWezb>OPV_MGi2Nzv($z0qtM@!BYfajkCeFg4%X7>(f zGaPYuH0t%t`hd;_#*pZJBt&P_780w8#dJvo1j604h`oN*sq+>U=VX^Ip1EmFu6K4$ zrbvEf$_#JL!u8&4Pgz~wg36_NY1>m~PD{ziE1kE>mpOIXp~c@%nVM0sX6e%P%d%24 zXQx8S>p(Z@W*W@V7Kg89FQ&^^(_>?4p_SPB)p0H;N421>TLKrYXrzU9xz-Yv7W3+u z3NTM#GcC|4wM%2o0e|bI;U_|?#|u? ztDBcCU7a;&dT!C&$_;r-PC7+gIb+7`m8bbUi`$wPu39$h{rg*oeDkwm-AVp)0S=%p zrr@Ll!}@V^(yq0kTTYyHkx7sOI_Z|y%cQG>1(&LsU>BCm>?o_vpKdR2I(MkAa`Bwi z!SDxYg9vn`8vOeP_%{U>pw8{nkL$v(qsC>OUJt07jWql$WTQV7yeFftZwaKm7j#>+ z6Ix+h(I$b$rPL-kJBw%*iY|nw%i#@A^^x_CIu^^ojKvl6*KEx8uFYGz_LhbDt5MTRKN)=Lv`jvXF|OA)JJL*9ibuy&?M;}=WWW1 z-_S5?>AdOHHJN2Od8?Pt6*-%iZr(b(u-dbucfqQrrOVdNd^vYX>*;jeNR{u~nVGYz zPpO~3xUGdG>jV2+gODt&s-s&nuv$mtq1MOmc`W$B4@4fUua0+AoHbEAy!|T>jYn@0 zc?(TE`Ju_;$zA`risE4`Y0eVH*}s2czDkiMPR5zHv=^xe5}t-PkyG(aH`|Kno;|XE zI9G+Gigtd`+eum*=PZVEHW|G!J1r|!revkf`N}mVi@&hs^9ACL&H2=2TD;lwU*h_s z^pX!HUV}WlkSFakqLWQ1H@vx7emgoW0`Ej=u}dPJ)a}u4bdI-&i2K9XkxtiC@`~IU zYu;Deiqj6Oc5Xg@Xnj?6byLT>4ZfNVd1q-=ZdsB_EH7HO?oh$ff(2jtU13?#vRjCU zxgt)ShP})4(U-$%C7>w|)?V)pnu~I4dm5eMi3$xZWHwg|#UaHx?FEPoFt$`GSSj1v6VWWtXOReKfOf8SW0x7SENnt(u>U(`e_+Eond%Oie$} zbKQ*W`K#L9a_wPWNWZIy@Ub|d7?CZ0r6+!)&k5aA-_+~IY$%Y=hi?%XM-q=0*VJs; zQd83`8WZPFU%7eO!qv-WF+=LSb8)@bf+;KWr_4+g&+j<%%pKbUfulhcSGm+)u&Sk` ztc`ecQkl24dZ9gkz9JPce4#dv&IohbJd%QR&`!Jf_3;Qao1ou4(v@6#)B?+^+m{Tp zx`2~FEe=uhrVxzCM<8m4H1f$-bXD$bXNzR#TwnBI#23d9r4srDW6rl z$Xk^xX2;AQM`vYMFP`ox$jVycnZ9uL zl1gj^STY+r_Ri83dFknSE0zlT=v!s=OQ%g+T3?1dEJIrwa&e@b^3j_s^i9FjV%N(r zSkj!9k*?CFr*0|u6s+0d{JO=9>+)eSARp*~0N*R1IhV)yxu7=-U#&f~xLD(*9nN&p zPqJBloQ?R7l(=j2T^IJ*=?)XNMocZJNKA`YiBpqm7u6+AO;QP|i4}|d%bF6B<5YY~ z!lq^N&es<&nH5)Wi z46>diS9;+vSy{)0*3_}BqxLx9WHzT;x8UOkmewUrNm0q^iS-3%pTA^dQbwvuo}RR^ zK)m#;v$2W#XGG~kE zj0FXkTp};h?RbG46y?WF!vlcSqle^0*__XyOg^zRPaT~{Y3Q6DoVCwquO?vb2@+0g z-pmG8P)8!<9KottP3oGkAORgZI%u`wsi#!I?s^PAfJ>jrPiJS6g>ZY94iYyhos+r+ z=k$N`%vF>Wp91k5N}xYJJhYp38v2ZzZZX?lbNL z>kR7;#+_)*5i5-weILGK9Sz^W}<4&;do-t(HiB|bcuW{qdiFe7|w0Ex38+ zwZ@%pZLD_UOtt1!f5-Swvy!VH&~B7>R`qX<8(R~q4;r_$X0D>q9m*vX+}MrCZk)@! zs<19NbRg8%(>v_JihXY(!BS66S8#X0(|#a492f|D8V5Urp`l>NKOE>P_SE$Ed)g>L z*wYpW2SR({*&ZATbs~X(Fzjg!1wBm^-WKQ?>Gy|9ioF%yRWN)z8SDZ_iQ(;yO`evaz@U!Yq$3o@NI^+)6rV{>m^y<)7+!mJ2l|8i3aOsR)88Ks zdi;C+ef|F3{Q=D$zo((*B#(c%+GDsF?hN$}4Tp=vef`D3P|xy~h9=6O=)Hf^lDQDA zzGhEDOLK>(sj<%2-0q7lgQv(-TIp#B><*3iLkFN~-m3p)mTAeYZN8cM1}mmw2cehJ&8)aNhv*a~LcNhWfkq^>qb2U4gye<GA((|>&W%GmLjlBvA_uy=5x}JQJ4yHYI=O!O`v!YP z`jB-ekPi%uK+&K}y6!*|u0{GRSm01wn?ki?=p1c?Tjdq_j~_4al4GBsh(fd2rh z-xKadp}MpL3=k6hK+GY3Xm}8&rMGWL%K__f*vJw%)X)TRf$)U62vNbLvcM}ys7D~F zg<#f57euYlGZ5_R>n5Qi+K?y866)JMLgs=iLuvYnkifuh%q)>> zG!@2Lac*oH2wm7wKf~ZIP~jiuoI=Kidj`Q`Xpf?Mw%oFw5|HjtriW;w$`h(aGE%2+a88K%^%gDmBFP801m46&skR_S^V4+T1nVC(EX z{_bI8ondB87a>e7BJmZa(fC`?cjz1R_d9kj7CZ5XObF}+*#uPfD0Y$s7zz#o8^kW` ziB+Y^d8l*U;%K4iC&cE;)$gj$0IUxQvcHR!YdBblD(?>rLmUb{kb>~YZkVIt5%Ta9 z6**>ug4oss(T2dA1y|eE7_uEpJBA6Un**NCUjHCi(*uDE4fx3xhRB-?rXz}@*+HV~ z84T?61P1r^g@S{`XITE8XnY~VeLXO5umzM+fLze;9@xqOat{YOdk6bEQ8)WS z=+B@B<8)$%AjGJUeZ4`{0d;4z0W)GfiYg|c)z`MAvArES;aTjdYiX``^rJNp8t4mi z*A1eI{!suW1ObDvhlSdPQ!@hV+!NpygV<D*;@)(YiB^-u@Eb^m8MW-dOf7oM;U+>6(f3OJM zjV|ux^}<1x8FYi4WO&dVgn~n%KI-5MfJi8a8+{-!jD*AJX7mO6yTaT#pmdZ0Q0#_9 zLkCS8b`asV=Rpu_(ioc2y7j?!@9hih(=8@t4v7tM{ggpGg5#=m@>)ScrhdHH*6jyc zny@FZe+c~R8)m&8M)wFB6{Chm|H#;A3mifl4@1lLuP$08x>+)<3}V0x7&|>ky%@Bn zq#ed4fRSjOz!GW?sl_0RJ%m)SQ6vhwL8M~qRIMq;DO*UY(rqMD;NUjP<8$;bU=pt@PkavSY1NY{hfg!R%?Ifp26Tg z^rd<<%cGVMx*bEuL^M;QO{|R}I;1<8@I{~E7!|})QK7jrs))vnQP&d1aLp9k2kOWg z*@n^XN0A3c!rZ@#Z8cFB=scnF#&?snIpjo!iLnWFd~V`UfY2!IgjN05_sK?af?3o- zO-^$S^~20K(wGc%Dq%dS&o=^zpqkhl>_czA+p)A%F^>6hOm(zd3&m&j^^NUyO*M^M zd~LwK(Wi%O?JW%*+iTi`hQ^L&!r1_%HJ;X*wvNWStxYv;p4P2xtt}W^ z)-=}xZF6IDLmP7OZSi5;2}E@*tvlNqH*D-EM4}FO7J53`YU+JkYT7mz5``@&a+`;v z6oX3O@c6b-;`WU-O-&wRNEC->V@p##V%PdWeGNvMnj93I8CdA4uh~+wflA=urD&!E zE(eHH8+^^awwk6wPkXDcu8|yIU1OWC4g?}5*p0%&7nsn=X!o786&{G^WPv)^=ws4B za}ECMNIZ0jn^8i-)6vof9vD)#H@5oy z1Epv~+AzK$oN^Ta=3?LsS|j+~iQkliA2=yyEBu0ZHbv7@+8)I1N1PBSEe5R>_^v`; z^;RwBmRF6!=HSwpiefP76fK-)8&eZTEpCv`D) zMiN~EpmY!LQ=D$l+mBp!gU`jFo4zX%%X@+}kLFV!^T>}JhrtU!I7xLveAxrPAaZ+e zHRl0^#D!tV1l7k@{OZFmsw=9UVdO!-sD`Mfy72CkYM%1cX~<17F@jK{t&d|Dzb83r zMIKb&9@H<%)JB7q14<9rVKD@I&LQj3{_0fY@hVuwJ%zgFHoSp9Y4G%aBb z+sAzEMXAQ>ga-?~Nft>bn^CF((C@+OhFA&6XMUWhj#16UYT5sL(vya_vh?i$pEdO^ zkEm?j;MP9yD#X0fF-Y6Us*pX=@=G#FnnE(_NO(J}SQCD?u$++WyO_!LxERPTPGk$n z5{;*Cbnc{Aq%))$LvU+)$g1|kXCF(1)+Z;XA0c6ck)G|vw-3Mlupa$LLub;ER+99P z4QPONoy6{8=!9pCEQXOQ>ERGkgh4CWx_&%KZ+oC4ElA%KEkO}hQ2hJTjY`%6eUI#SXKo%f;6 zwx9)Sg3FO?s@WdYi>`aejysZidL}lN6B*^g|~| zo=7u145@7Na#A+p131Qm1@m1E`%Q zdDMNXFv4|BQ48zfr36sBbIV0_OCgkoY|?I|bb1#K zm;0GJex{6Qq`D*wE~UghN4f_QgCvP;B}p>zmBMwIsGmx*OcG7}@Nf%4oN!A<6ccwl z5l@%H$#IY|=@x^eTuUY4a&%`8uu^)GMUn>19V!*IG-RtakEnM>VO{uh{Eo#7EeB5D z$}L;0-PhDn*yz^JksB?+#1Y~J(XQ)(xI=lz_QO4(S4%N*c`R?8+IDz*JdRAvXPrCI zGf{fYN9s@S18v0PPz-0CTGsp}>WQ}`6U0rA;kRztiFZ^+R}+W>x*zCRkI|AIOE2L* z3;6n&N7VPy_D@@&Sh*pr)IL)R(rK-sWBV8r^+kvSL8KyHJ0IPFj-wV+7YYoVMrde)uSyo)r(VlqL6A@YnW4?x;Hy|7J)1~QB69b z{nGslr=OsussS~iHFm6YI(-1@eNg*Jv8ar? zo+oRS-isW@mURnq8{HOeL*Aqvn(oQU>eSOjwo*$fg*XE^Kq(fVC>hFIp`7v5UTxj``v?I)FP7>X@Alw z;sW(wslP#bvkzfogS0ZLv&gYEfX|~ z4X|uGHK^Oo(PgJOOtMTQ5sp+)T{||+!Fl}BlT7NIbiasxJAL2-rq4p-1MSxJ=TPYO z11Xi;Pu6j%>=W4`ic3OnOR}l$To^MG&S<2B+v;YNR?lKktrOPc>nQb>D6XSZ+L{m+vgDLI<*7$+ zH1a1t5iMiw5OI`Z(}-wnTcmS1p54~{Ri_`I`=z93v11TT7u6Td{yL>E<BxhgYtW-EEyJUG9J&Xs zXX+fPb?S-w-o?P&!IDP3QKEp#>2Qc-!WjqZUf^gMb^3%vC&^k7o_dT*xX4oN2c)*i z>Dv-7deKUdqzocHahzIfcP@{lUe9FcKC_lTEuAh8XmmjB5Wzmgr@VCi5+^BkU_$I< ze~4Pjk)E11lF2UC8D~W4t9+^BK)&DzTo2 zB)p`r)Z%K6kM4148ykwzpE6@Ts3kj|mcAEV(K)*E*9N+%M9w>_*coDHem-{mK|LdC z+o=DrAN8fjnq&*y_L^#sq)xX{6Ssz=+drqL=ST!;LI{79m+oV^{l7YvlhIldJ6dvd zK2Q2>fAV-GcT>f-II+DrHwL{!bLg79FGOuW^-Oh}?2P8Mz15{5 zTdGT`HJDmvs(-Q!Bn31VK$=fFqqUB-RnLG>ZRilP9#j{{lX#7FKde{)azVAA^CpYC z2RLYcg(S3#drfW$NuEac3AG$d%#Rc0v$m3ME)#Q_>cX)@PFy`t@!mAZZEGt=$SgGfCY_@8m)e3s z)Qq+fPF?LqD9zE5B$2Ig`5$X}#`b>3_Nplz$qVH`HAiwxExt=VjltS69%};ajj$gy zV$-y5gqvD3=Pg@1Tn#AScEqGNRJ6jQ9gyBvwcy=nBgS(+d_5TJ)^G@g=dmT*j?fOg zp>M&OfeysbINA`8-r((o58cD}IxE1N>@De$7Zl`BHouk5Zixr5*5ha~(|;Vb=K(WtuZ}D1)ZC2Ds_nFyY$C z`O}PO2l933B+e0~HTbpywjq?>Q*K2n`bEB5@oYsr{oax=6IDbl&8;?rCvE)P0IWoT ze&4BiMPukzw1a;>)CghHK9ruMhvd7?a8Tpa(oI}-;%Xl1nGCAG zlTe$Q?;79OQc$_JGtXSEYd#Z&Bqx-kGfU#uG37}#JM@suk}Nrz;Btkuj3}X;sIKW3 z-mYt-7c&RC*TGre+ zK3;9TPJB&`^L}SJ_icK(KUR!>*)XhOKS~`tEAOlebJmzO!T#zsaP5do;}RN?kzGC; zPa1Qz0}su{Iq_)RQ-d${;zF>y&S=a(p>Ge;Q#`Wr8gC=EVe=<)6ILrs@Uc(ErfD2R zf*rRDaRTXLto|uLPi84jxGuyfuNbQ~Xsuo;&YdX7IV65kux zVl-NtU=Nxg6=ZQ*A;E2+rUP=k4U)P8wq+OY`8@?^lYQ6vne|iaT5Gqkaf(f+h!+VW zQ6!0Eks?yDSD#M4n<}P>=_13r7~J`X$h0D2hL|a`#4It}dJtv1U(B%{5OYPg$icb1 z^Myy`iafCZJM|Zd#UkH&LllT5I5TgVC=^9Fs&cvTTEDb@Zv8@(SPzL(>n(v3a72Zu z6jfq{SShM;%;9Pr)UsBrvz`*`MUAMnx<#F+7e3Ko{l@y0^=s=ot4C}Q8%3koBsPmC zu|+hC7SU?`w{^WZNwkS}(IK{qZDPCFA$E#g;$(4(I8~g6-QmxOGlXC47M-F?1Vp#! z5xt_%dc^vz^*eE<)hqUhelZ{hMNkak#IBGCi(xS$_KJOCzc?Vy7Vi`97atJkh;zkx z;)B+U;zQQ$;(T#|_^|kh_^9=qxKMn|`m6PlxCkpD`q1}=B#MuVPgsNElj2k2zr@Aj zzs0A;XT)d4=foxA^WswR1#y{m1?26h_#zJCxLkZmd|7-&2)vKP$U$6Tg~gTPtKw_o z>*5>YD)CKmwfL5}Mtoa*M|{_MQ(P;q6W5FHi5tZC#f{=7aWl_N?-jRL`^2r{2RMb{ zc5#Qe)B3%*OZ-sWEq)~K5kD69il2!4#80iK#r@)E;sI;Fcu@RY{6ah=ehK+MV7<@! zfc1XyEAeabu=tJmt@xdIMEqVnD*j+yX?;)N>{;=+_#g2n@n`Xbcv3tio)*uDXT@{k zFXDOYS@Bo#f_PCJv_2+Y5-*FtiC4tm#jDo2xIOSZ@tXBPaY!5%N5t#m4e_RUOS~=K z5&sZJMFi&p3!EaWq%GrcvRMLdHBOSr)87( z%M6@6lZBJ6X5&E_t#%MV^YgdQO*TNWa`I zJ7t#)$Zpvqdu5+I6Q@f|!8cq%IoCy@_V>p;`{POd6T?Z-Xd?sInKAq z+vOedPI;I7p}brENZuoVEbo;+k@v};%KPQdj`D6I2ErFRHDL3i7G{dsM#~P=hL{hSXUq zq{3=gji|k9pW3eusI%4k)ce&3)H&*0b)Nd5`j9$bU7$X!KB7LVE>s^=7pae{PpD6- zPpSV>7pwnPpH`nypH-hzm#ELHOVtVEYz^?-U%{apP*J*0lAex-h`9#+3mzg53ekEq|PN7WzHW9pCUarHmy zPwLO=3H79UNaXer^`bhcUQ#cszo}Q$-_@(?HFZcGR!7w9>J9a# zdP}{n-ckQhM^ywDTnXHCuWZ|nv*T^tp=>AF$##mJYNy%h_7r=nJcD9{k&$H*-9y{00vlrM4?M3!tJKrv_m)J|~Wp<%mWEb1ZZLeKom)d1^ zxm{sb+Ew-nd!=1%ud-L$YwWf5I(xlcW7pbscD?Ph8|)4CM!V78WN)^c>@9Y)-D0=e zC)sUwyWL@LwYS;Z?H%?`dzXE(eTsdmeVTo`eTMC~ciWwImmRRX?H;?=Zr<9|Bdr{+Sc89RFI{_Q^y(M+^^epk!c+IoaJj>0q(mYp~XN`H*nWs-bYfbuElfKrZ zudPg|3HD&e-=37Z&b|I`*thPt}S1fQX9Lkx8rMxnIYg)L<{Iu{ZAahvFNDvAH{t(5TBmalrQm9k29#{kv2KiUYB7Y@4CHt~Q}hQ<7w!#a$_9 zj>Zh@QI)!<2Zx*t_G8;+UuS&3*0p{n&h7`<8he=$w=z?0WhR$0!=Li9_(7d?Fj_8e zNz|Yi`pZq~@|7ur{-GfDCkKam0|`N0j=@_AU!+)(@B|fcOc&>~K zy2?{;sH``&SZ`|4XKK;MSYT{w<3n5uUFeFc_)xSoCB6!SrNUsTXowGU?3D0WwpMTk zupWj@l_sOgviRXBMsG=_&bPG0V6HTnD-C@stKxBp1ywb+#S z8d!hvWV3-Mn+-f2vteq)hZ-@)X2j)}&yejibomTjK0{YSN&G%-Z1!me>~k5Av@dFG z4rpU@zzx*m43hzoE%7xNA{vZXG^~t2oAD)|JxX6-Yz(8c_<2h!n4fquq2AKU64iZr zH@?HFvDly3$QhG^(G~mC8eJO5o0(edPib^$E%qmwcDdM}+8E6p-lmz>t`c9}im0oG z5^3fY`;{Mf{Z77qCtv@ld~t{iDiitoWAZiDlah1g7W)(YRK3x>eNK)wB~e#d)Kw96 zRYhGZqpsSht3K*#a9p)fe6>-0wNZSvgwNPmln?Zz#h5gZ+hfR0b*-DmO!ke!S<;=% zN|9L_G1IH998mTnk~TQxFtOvw=s0-F>YU_d(bAPgOIL={CH9ADlWnoz?gqLf+G$%n zG&nMlh`y$F4DZuE$-})cbnKVZjZ=4w3&&vTc;UYN>_`ryK^WA|0PWb-5pk@ENz8c+ zJ9)5!@*s!FgPb}K?V>z59_7LDbRO)~d2mF|gI%0Q(8+@xlm|IX9^}+{Xcy(d@hA_D zr}JQ^&VwUz9^_&h=dGzv?(XXu!EqtrB6;DkKvv7rk`h+S(vnhdf`7QU6GuL2_J&7> z!pvTF5Lx6fWRX*orCmf8$0M>ho+gW(nk>3Pekz@x^Mh?R>a%!Gw7g5IXh%%0+DPyOmj3Y8-c#QG=DtP?T=^L{I+i-6lCozSy`Hf)3$JK6s*}W4r{Ud`$B%Lr8SlDLpZBt*l%~? zXgckuJIkeBJ^IE|YqD4OX7QVQ0i~rS70KFa;t;-0s(c*a6Y5Gr<+CH41TU`5-c&Z4 z+8s_IoiXlIu6Xl z@$atSKJL|)R_OVN(h7{w$u?Egaf4r4RZ*IN!)^RMCS`>l9+XyKo`K_Gc);OZ29NH) zBR%($@#GE!`VIPbWr_Y>Rl*&O(#lHBDQ_9~KTEx3rURnK1Kv_Svw$ZLbMQ1BK0S{2 zmTEfj)cvkf^v1c~>$v}g`2sz6fF}$qmmYq46o6-pUn!3a%Dkm9er3k5EXJ?g_?5@_ zRT{s_7{4mxR~6&8!uYL-@mp#9R>t_%7{8hrzgpv08{=1J{OV%-8jN3q>sO*jkY$?Z z-ZI?_2Fo?C%k=ySesi7TX=pEvp}o}5UK&GtsjicKmwaGBS1%BW`0StY)Djh^E8)8z1wzcWxwmL+v? zxBElOf4Q#Pl2WY)CFQ!VN>;EQqT|RT4U8Nec_BVj#*{lM%NW$NT;OSj4`pWVqRb2{ zN=&%!$CUVBGe9ezOauBk+E#eWIM33u5~c}H=Qq=a->loERhXDTdOUT%$XBXugHOwA zsZYx*o)z)j=6e(LBW#{SiTd|YIIgdFIJC#EDGqnqwFK%2)D!R#XdtkGz(xX%1U3=a zOrVLt76Q!#S_rffIEg?Tfp!8N1hx{`MqoRE9Rzj~*aeVOW7;UVObgYSUK2B9p(uLH z67Ec`i4I!AoylernUUymK)5rphQ}=kC7HmSGD69T*&VOzEOnjbuCvm0u5g{iA%lTf zWSqn!?W}e2*1C9WUA(o7*GxSlSzL{i*jrj&7RBSGXqcJC;jcIz7w)9GC_iH6t2scA zQ^K8T?&LN3>-lTAG-XhdsFSipI89`e%NJ$3FPe#OG}HBTHzKF{VwrBHzZr?c^fY%8 z9R7waE(>d27S_5X)jC|jfYxPUoy)>HmxXoALNh-e&7y>S(_?1KiKq=xqTH!-lY(Z? zIf}zRO=&6Ro=)OorqStV%uKpTT>|BDom8X*no`Fz$&B^M73F5^XrBV2BJ7U$!769K zkE)Cr@oOH^%zQLMjQJhT)-gMsQNI(nlsKCnGhuJy)0}-YX&IFuNzdT3E0z;9j}OlT zn#y-m#3Xh}C?gV*nsf)wp{tyktLOMBxY zhZ%7#geH;SGemQ#cU7R?&9L6h(C238b26ki4^fiK-MAIZX#Gk8;Ys?fL^NiFOIn4K z9xaZWZ3Ur9(l06CN{@L@!2wRa>DuDh?8JKulSzrM(xtbO$VuzLVUd`>-QAC|iZKBz zIUoH-!+4^>iekrGH}6E?pQK-lz?H~v zM&Ot_>g5PLbQ$X%GYrvigcHsxHv+~=PFzwFN><|Yx$@v+rkj^0h>*zdP289+=c09r z^lqtrZuK@0Ym@Yw6m~@!5c56-0jbefDilkBX>bLo zfn{62ej(hu9N9>7-^IXRvtuPyZM<(7L*LHC4w}j}LEe%TWXV$f19V6)qy#^7hXnCy zk_-=?Dd|kq6J!YH=`nip97$(9&yaK`n)#8=L>~4L9z8eGnbdm#^Z1lw63*?U={Rx? z7?o&ai^r)O{vKH24}Ccu}Fi{gAkj25#I6XIX;obX|&7MOE;l z6@daP9eV+T_>)+Zbq?HDV7-yBuEw9Bm3e^A;!ogq%eO6oHHow|Yo@^cjbaW~`$??y z%K=;_mH}c_AN)(Pl22mo9qwYmio2bFy`mRBSSbhhC0OGou)gh!@cFX%GT>JPZdIXm zY=F05wVI%nX@K{M`w;p7)}#rnym=1r75NI_5mja>tZ1nKT(4>XPgcX0z{-(}0Kcie z33!*f3-B5B4B!ju1>9SLl@uri?)pReY4FVk7Qt8qW5I$uuqYYp-!8OdeM3`+mEP|k z9>f|Un|KFK(lZV*reLj?s@di9SPScLYNS=#(YD!xHCH+g-NBfGyDs%Fy5}YpE4uVA zg%wF@SeK=L*;qT4POHcE;HXCHY=-AC{0PHOF#I$f?`~bn@G6EkGQ5Z3uLkxE?6LmD z@EL|LFnopKk#OJH0qY%t!eVGM#B?NlNG6Ed$zdFaNvuNEWv7_${+9sPDCI=(G=%KJ zcN@NK_%`F40Pf8K-wUwDbp`lJc?+y*<)>Y3o|o!p0&cvd@Pv(4JStEm90Y~9zbNtL z^h~T$bv|Ovjx~@G)Wr*seoOoc-$(vUPs;1xk)O_EKUR<0ShYJ9TAD5Lu;R8DYig^p zdbRSx7e;tH%Q{SH=;-ikG%pTgSE2e9(< z5quxV%FgGpg7c7g3kDz_YcQu>=VyajmXD9RXVxFx$KT( z|3@Tjll3;c!{l$BC9eVuGdzo9UdpNFFic^X#_@m3@L`4@lm~!0iQSJ8#9C+K#)Ax> zW%xKjtX{ntp+2GwYh{U7n;6zJ+(r;9j0wY!7$!2DN)W4?$$tjBFX#BF;t+hY*gpk# zAPSKp??B8aWhvaL3_Y?Q?o4*aGfZSy#4wj2_)qck8O~;(bJ)Ft;bMmK8O~rhm7sNq z;nVDs!|va)yNTV8FuaH1>jbL{s=Y{+3d>E_VIF^zuvVAOswl)d`W09;TaUH!kRp5p z+Ae}=4B0}86mnzTCc%f;U*GNaGW-0I;L0afzRbDgv8{U;extvqVjb@NNc~&jc>>Sp ztb^98)*Ga;ST7EpwSGIP)@qGiZ*+DDT6-ZhnY4Du=Z>`rBPBjXISJB#6bhDi(y80HeR?q~N3hSS;S9fnV{PY%0( z$L=O}|B2z<43845dbtXk2-%(vXkjfn-8$+@HvGgBp#4GlG3dRNUxK@reJ&PAja>$i zS@9#tfvCEz3jMCAme57*<-p~|{*u*LTfPyka|c@MGq8_k7k0mdu)F;n>jH#bgdHIl zaqh@WJV?5L9T9+7fllrQhN~HVp5b`}u_B#9s~KL-K7VC+KKq=@u%DriA!{7^n@Cl0 zVO1^D%I!Hc$$~Cf|CT4^_3y|}=YiW|QJW;oF|8chx<8PQL@&LvmU}?usE@B>XTTv? zkOJ(OX+k^Di(M)gqBXx4`!n9aZIUandtnFm7!0BPypdW@tUC8%1^5oE=I+G`?F+HW z`fjX1&c^EB4y^F)vd^@K?Mv+M*f-mE+Yi}?;^N~nAs@5R3!WQ!(JG4^wkjeA#X@U_ zSY+jk#rWo1i{z}xVVN7bP8M1@vIx=>&#^1ut3$3rNWL0E|2GXd-T;o*L>~HY3vqMg zB5N7&ECZebQNXxf0j~Ryq7t~ukSYVc=(5NWq&fn8kIF@O7FwAIok=)V2zYIzIf#(M z2w8!U>9ELiIX?NmV6aWM6ym*%Uvm*B$&v{Bwk$%)DE-ZH0b{>O`{+EaB={bbg^}m6 zod1c)5%Cnh&ml#!_%mEjM4lE;MqXmyrz4MwXW;iNem@s^Qaq1zpNTw)Mc9!BV44t+72-c9==LJxANgPkx_?oXPuN31wt zcG5;e!Ts0ZdkAILRAEn1{(xdSEAR`B@Fuuv)r>-~6;nzUhA3)n7JI?%I6{-=`7p89cdWtQ_>*GR5oozJc%Cpcr+B5%CaoMXFHb zA9iH~Ed${54Bxb*T@-oUE{pu#O0)~%Dvlhnmq*^Ry^+7zrIA+y=^ylPiOUa{g3 z_Z5Wv(JtXMFCpY*#_$H>y~M6VaJ_6PgY|W!d)-O`=ELk$jC9NK^+tXJ9Fzm$cnS0z zvTVfoo5}xeriie-!aika6KypVc^+kW6Fx-oAxoBANLI4+vZ{I5^H`6*%;S+OB7X$D z0X@KGopl9wz+(EziUC+W7E)k57bd$^H-c{KwGo zyMI43(3&kApKIh%?S~!?WI1v@;!OM3Slq~?k-s62!zRDOCg%*aG&7=pM-T&F`a}*# zUXNUkR4+z;;83YUM!`&s2U37F1AXw!$U(&ajg!Zyc+nqJQil#$QP2~42Ob&d@A4-$ zHQIKjhgt#FqsiN%B=o2=fFN08AqY%KPH9}2O`=Oee=mTosjJ#z+X#VQB zpGl-Y{a75wD26_nJd-wY4pd*MD0vp1Zr#x=+9V&6O?-*tfXp-EHkARAYC>Y#UGVkq z6bto|fqA{jK64P3f_BpIf>RuZ<{XLq&D1MPgPS~ZA=-|gY0HUr<~eHjU?~nqe!+1P zsqJUkIm|R#kyn6gIC4GzUFYJN$Q8K>y;FQZ`%fZ2#;5`s6uI{p+CBye@_0OQFFfat z2^jYiJ?jZSkwcNUkgpZFe^fAO@+2QF>+7*n0*jIauF{xVTZ^cbFmge4LZ2i~8x0+m z!A#Uh25Mj`WZqaJgeS(v(fp0|d5`WSvQn`nc#n8Ena1N-1%oLG+#riga{8*4VRp0a zHC)1Y>lpbG50X&g=}7JJ1C}1LM}2Z`Nsi4C^pjERsNWOlCr=({@{ozCpOCLfkkIM6 z9I-SzZf<=K$F?2ga2LRbq?~MrYd>P;-sRG`#M%SxDa+mom1t6I+Dc54#iZV-w;NCw zk4Esu02bv>k!SJu0JrbIhQ_}bxdGpMBbejF^OuAMb|w?=JgvwVCqjz2cSasS=(DgL z&*~VF$0Bz`ehr)O2*yYEMXp7t>D^3(0ihR}bbq9{$Np%V#>a^~O(h!piTq)#&)DCw z`T`8ec=L_Agtnlyb>l`JaovtFkR^mXOKNpy^-BZCu187<9_oNC0&#HtCZ zpZD+?jV~5~YoWpGOjr-Jc4R*xwe-g=UF62t6gc$>GvJf(gCfHIP>aG}`pqpTQZR=J zYL^Zg4Sc`s0_QBuQws--&z=p?`LgQ{3pTlS$r{x>%3mk_gk~eM9$HsMjLn|<+%6;*d#?CY#1ario=p}rgW9xD_ z@(iT}|7dJ*%nwq>)Q*v{M~`haT!dtIDE;Id8y(mE<+?!i)ATEr4*WVskJpS}OiPNm zEX^*)iCo-AnkZn5--+OIl9;wc+bgm@6MhIIjr-gW>i@W-hA}cixTlQqa}lzOsjFU zdm|5--`__+dEy?VLB)Lu(g?zkiZRC+`7rgy<0WzvHPCA2==H1ywDU-55|04o6QtBWqkp`E%4cev-!sNPh)kt3^8d|HU~X~0&UYA z`EZ^HU5T&3!@eH+J@JRFOLXKz762)9j;kk55$ijV{feQ3@#s+~Mx#8YbLcWyqGcmq znNcssQ_LNzqhr>1EG4cRZO3~^<)nA#3L|f@ZK8IcKQZNUyiVvjHl49!W2E!gs2t0D zypoNP(_c8XkNQ`#?CJsj{==#Y|Efij2hh?ldcmCB*}?N&k3eEk!aH~%UHL0LBfpK}nvPZ+)&suB?E6RK zTd*IDTkDIXoo=|1)2J>*{^5pA<~q^##gVU3IH}hF1>{a! z-e{arDM$T?m1?vg(LM%8GU<&R^B8h`t-JtQp8}B6_jf$)h<;c0Za&e4#+%Y8JCooJp#u^`cGM@?g>rymvvSf@Rq1D>T z(ddyru;lk*9`zL-NzsV=a3sueCYe*$sT?@Ub{S7CU$7ttfpt{x-$@nwj9g7~7c|os z`9ZAz|K9Dqw>VKu{3hr`BTo`92FE00qDd0E-ZXnU9adXgF4zCvxMmVZk$~DZ&$~$& z6Zc<7$1&#Do%~tL4vn>PI+Sdp8R3}TvXkoFJSWCIIR@^B(0ibyaW?M+dqTjS#Cu-! zJd7(Ju50q_qap6xihg?%4fwY^B5#^37yfUuCQBB5N2d|tJ>g`ZF>Tjm(f$woA(4Nf zca}5{@W0J|^bF7#?u^xYVFnY_?HQHyUH_n2aI_TY zLjdc+<4IrSgSzj6R`)aSI;&`c(VWoUZds$z{sSDxt96&^vG(KL5I=SXl+sSt2hw|@td@Z5KD6~OVSf7v&wspzw=h@>;q+3EMb(784^9AVFF-b4=h@L$ zCy$4G?lAPdbfWW<<0%5={AOTu$g%k0v>TKHrKkA^8re`=M^-qI+ZL<|b#S;Ygiik9 z_b=mu(awPzJg=l7=P@qYD35p57K}>CKODM8g&eP6s3W(IN;AQa_c}(H0M$6J$m8U7 zEJ=9pxwFNJj)6Fz=v?18LSj5fJ|cgN@tDBrj`1c4oWu)Q?}_}+B!R}8+Bvi(?`oWV zY>aN`_@2+?yk$CKXINY`?82xaI#2L!sb!lqswP}qW3n0d)19Fl7xaJT5xF#GChDI` z#WCtVG9k2ex8o#;H>i4Yw5>DX8%6}K_{0)ORPmI~Z(guPF= zf2iH6!W}{9S}Q>LCDuyZ^K+S1&GfIq-96v7)-wI;a2wA(C^emTPy?FJv}$pW#<11K zbe@cRAg1Gp0UffRHu0`@+=h5ghvT;(Wl26lDLMF}c!|JBXbGq?@u&tvcN5!l5t_P!q6(G!RJ zc5-pMj=2*Cw}PCBn?FL)TPR}gpa9p3K%oa*%fr1^`fXM&R#$}Zdl+tPm}9$Ye#|HhI=`d${yUyQ6zhDBS)F+qdPg|nc&FX z;E0Vni^E?UYBnAxOeElM25K@9H+oS|Yc=|>$v8(M1%K=4EvK~}anrCXGaY}^kzxvJ za4KS~!!KH4oPoa$kO#V(i2kx5&ofcSS@@d^>6iuX&&JX*vE%p+R2A z72b?O&PwrDfnQ~~eXJaRRrpnbd&nyBw*tSa@D6hY=tzadXhzxT-oz=`b-EoT*Z~W& z3O8v5QA)Z=cO4|=9Pr^>{MB0L;cvS2LHuRlzM~J}2DJ0Bzcj=881|;F!);(!0K=8| zTLnG+COAPSoXo&2O4ouP*Fo}T<9?;v!Gk+sk8+^J52N(Iu^vI`e~&wQa&cGBQz-Y- z_?uxpgTF@B@)_6(`Zjp*4*r(lPBdXH<}*@?Ai*=OCDW4=VW1vqC;2 zr3lho1OHlalC>Orwc8NCUF@*DZ0(lguCmjuQgMdpw#uN5J=RIs&pBX~i$QUYRRN1~ z0j$f1#f7jg9}^eDy8O5JEUXLJnB~xoOA+S_;tOzJ276P%C$22z6IaS%3$C$hV0(TB ze`tuUW#!|z7hx4(*RaIiVHgYSki>;GRtI!G&Pt%0xvZ_Y zn=8>O!TnrG);8=hO@=!K_jGN8?xkC8xTkB1)h?&vwyrkZ)-?_8>A0n<6*glQZlHo@ zS}mlRfY3}pXr`3{oqPg#o|I2o+n|}%RvKrkK2v9txRZsAL5(|+q@CC9PNR-U-etF&^ioQ zb8zF)pp^~V8niaS{ta18xc%rX%Yz$`LRK?wK?+-WxCv<(`vpgEQcX48a)jJJr9O?^ zKcg-IHdqtnd$+n9`Qm0G5}}+zC`*HIVfIg!RGBJXjwq8P=x)`{*j|O6**exZ{d!&@{F_ zG*+h3GTE0|Y)#0D&>vZl>1;tHTM+Dd#GjWfh|LzHlr2acTaXO4ATwY&@{oqC#!R*v z@vtO|kuD#932Zf1!)g>FP7(fAv+c-Y+p(H$#~QXBbJ%uJ3snXyLAE22ZO2Ns9Z76E z*0SxG##SQ}He1a5YLn+CH7NT|(O*M)^t4ZPxQR*7FS3a{=9c2ipD* zXmS>7ay-seD70p?Ca=c1D#h5V>J?sVH8goWU@cBN%3{4;&3e0rHFgd(_5y1z>uMtF zY7*<}THN{fd0-%2&0;Ohf|h>Sn#uaPj`cGOckcZLK2L}ztVOJ)1!#j0Vc#j~YCh}g zRMyp6*43%3t4mo|m$9yvv#u7hu2!(FR+MC7tnZ^2<$@-ba`dN-!#&#hNY3T~q(i+y%B53Iu=pB)M7OCB8H{7J9DbUhh zxJf^YSU+o6KZ{sDYgj*vSwB-*KbNz9mau-Nv3{1Zex|d2PGS9Afjh`P37n*#MbOXB z!Tou4H6Uqe5$+bd0dCUO6zJ;D;C@g&4EP)9XA$dX4eMty>t`zT6Ee;Ena28=&iXk8 zH+C(tYFIND5KDKVdEQ|7}EHp$&R|isi?t6noGwILq(vAC^}$yq@8$4DV)me`jg9Q~rwKqYR&5 z_&mc`=mG-y2E(HSmCZ1j;ndE~fgv@M;X;O`4A(PkrsM9_DGYZr>}5E}aG1_2R%bK3 zfZ?YYUdr&R{e3-t^&N&cFuaxFT@3H-4|eve2N?c};Ujc_y?UJCQw*PH_%g#obn}9G zi=b^W#2I{Wr!t(5bMFW3Sq$efT*z=KLoeNHVOKI-&9Ii?MuyE{@Ye2Ncm~6MhWi;_ z5bhi7wl8LQ3B$`7ewE?X;epN}`&x!KGrWu8eGDH8hrK2CBMcvB_!PtE8NLiyY9C_w z7Qr}+VLZcBz_PgM3}-Q%$8aITrGVveUWSznS2L_-xDl`-u9;y6!(9x|VAvfV*&UAS zXBc9*pW!(SFQB9Q;x1x%3B#{4yq4i@bP#jgeGGrj@L`6JGW-+t79A|s@8dst{|e$C z`-u|^7~{k+4tf-a_B{dZCfSVl_Di5oKvYi*75eSz=&xI7Q%}q#V6zC{WKi=a7N&Ci z$spN7!B%l1IF&;ugEKgEVrauE;$Bx+APby(cWxS$6IByKiN00}!jJh(LjT*EllTrp zI*)5kB2GdCq!WbZaOhkPotsFZb2)S_ht5s%z$ZJ2PLRn?%4CSMjNndWI1ex=V7FGF>Y+V0{y$|ty?jo{yEOrdK{y)gSh?m9h`5MDl&2E-9pSMmE%U~ zdeH>Tz@E4pl8R@_TKyZITGoz2Q{YD2X5-o>&O{jySA@*-84eNh8l6_&sGoMLd7i1C z@x*7Oi_bI9)tpYnSI0NSpJx1s!xZPs=6Sh!-fW(9vKoayVxGSp^ZQZr`!Vx;+&o{^ z&xFP1X--c}Xw_v%*QYj#^v_x%{h%r*2>UP-lAee5ycq3lwY45RNtACfJPJ6S-P3Wm ztwisS{PWmd$nHY8nWyQu0o#3?FWqAf>c{!W^!Kx$=G=S}>pO^f1*h|{i)=|HdNFZ$ z>Uph&YB5HlN7O>VH`G$VcNC~ZHU)rmB4je84W&@U9Iue$;Z#z@^Nxv;$1&z{jBLQ8 z%7Yltfpjl$EJkmt8q(H`{CA@VwHLDXY1|Ba73AzT+{G-A*A~Pl{jt$Ea$Go1Rg$*a zn4xg|u8z8X9(BF#xCD+>q+D@|3;KG%Cm|)Nm^}aXOb){-t2!@%(wO)=qkfdX z#u3d`;0#ryRhCHm2);K`J>ZKnrVU%aL=XF4eV6ZhxySe2+~RvTdf)%-8+>1y^!DC= z@!h?c6Zj$S5B?->CB7Qt2$@=Kr621)U&JW3e)a!sEjl+b-^DjEQ!UNrB8V8JKg!-Eqf5-R>YX-)_A%x9yiBZBKbS8JQDzLL_b--+@q^B8pJFxSBNXcSH;)F*TpyR zuHl<_$M7x8ql)C!pf1taYn*CrEx;U(#OPTj7l=Z|`~kzp^jOCVCGyk)Pcmy(HoCob@`@zTmC~vlu$~=sRWgzQdF9n zqO#O%m80gXT(v+gQu%6$TBeHBa#fM6Iv(yp@)Ya^nU9I`q)w= z;*{e|oC@y|i^rWgJ^H+9ecJTp(59=QsW(C^?}5J2Nz;#uXT%HQ6>&togPF`k%u8m< zIhbu+jG4t!Sev!5BAaBZ+y-m9TlT`94a>9TdGaGD;iu)L^2_q;@)~))yjk8M?~(V* zhvaYNW0;A2P9Bu6$~VxvvsJR1inqMkDo+)tVpWd0$@O?!(4^Y<9Lz4vAD)f3#h0mT z)NSek^%%X&!?v-<3l0K;}0;IQ3J=i$o%yjPa$6gdcZszh&8ohF9>PnTx_o*_es z<(FZ+aR!BQ7{7L@PC0^KU2-pAK<wrHH-vGQ#Tm^W$_$J^Tg8I*Qif;kl1-mQNi1-fRUh!SPed1cc{o*>n1LAtXv&HuS z-zRPWe82cU;0MHwfai#t0M8XS1D=Q52Bi9+xE1h2;s=1|3$)hi0&zRwhs7O$9}#x~ zepK8Ac%k?q;K#(>|6g}k0uSZd_C3#xeJxwEjeX}CO9k?jBbK72i*+m5u^grV&od6zaW*6mT;}_qevC}E=6uYdJJN2D4_z@ z$VCa)Ao7M1t|PUORw8wfRw4C}f+Rp%jog9sCUO_nO4Nn5d-;j_fO$8N0y~Jzzks{} z>WjLAF1AM=!%DvVL_^dMB*PT_3F7uWkT*h?p`M_p9bnyOSXGmVq07+)ptT*54x|_I zWR!+dK!-bl%)N%ZF-VjbzD6w4iM)Zl2}(y7f_|R^afd$0o1y_AcQau<_b%iu!z?zwur9x~3;$52H33gBu z0ck+M%LoyisSr<Md?ewT2t5spZCL>bMaaKr7U9AFqcSi4uZ%t^(8pV*`;P@L2(38C)9_ zt|Nf`2(wu?)CXFXhZcaRaO?^uT!H^`L#boe5-bRoaD*_{R*0nYLtF7!Hq6hV?6DEV z(J~6X!+Qqhj<@0kAW;av3i91!rNOUuxJwZ=`rnKuJVhPoB^j}RmPVt|;ERQKpP+@f z=MsMh0D*OtSMtb$jlCLtR(R|2HzattaYF=Uqin8?h{EXLzDxYg1ssJ4#7$6$XIQ{n zH#`uf?1bpaCxn;h03c8X-h)ws=X8PloNjSrjJ4e7bRU0CaB~BEbbt-sA-c#Yd}cu( zjSySBC5Ro~62u;_8TkosG2#II|A06Gq6T3XfFX1UnGMMLgv>!l&=F)VAdClb29%-5 zJU|)|aRIdPA+CTp0c1X)P6%-WKcmfKiAqxPB3J3+zsDyYCNCXnH z5KyU#cmp!k5h|cl6IlcZ)kYQrN_CMXfK+|N2heJWECs}3h%cbl81ch(F|rIK!WmhC zBMbrk1>-gL78yQfrrfc%-hsv zK(Fw(w2)D6?p<&beB&Sdn}_5G-?+CJ{*kP)M3M!cplA)ck6hX+s zm>?goo)`h0&dY<*_=NQMz}1;(jv~Z-3g(IFPdcKoUnyPzz=eO@!Ii~^@LDj0**New z3;$p$lL{kB?GL{dU|m{nPF?n@1m6b zv4om)moU*UtwiAM5NsK@d4z>TK1p;Tg)ECn^Fc;PQp_86*QPK7L-a|`A#_8sIcA2R z5SBD_fL+$vBomTHgnuxTPV!*EKEA9Nk^_UqVXk1(VQ2f$5R!ca2X>xfa$+zgSy9Uw zu;-s8#{IWMR@B%6_FjdJ;ms_~ESLQA4M@nF+-HzlLc%s4EMW_pkib*Dbn(7-@>>z9 zGKqGg-NO#*v6W7CX-Oi&cTAd_r_{ej7b$BD=pJ_DEq+B%j*i=xc{Z1)SZ!Tn$;SP3 zrz)0KO~32)i153XZ`^vBib zolIIIrF+HqhX=Sa3=@K!4xt2q)8yvCBOyS$&bv<4tJl}$ahH;8J2?DFXi8G*@7fB1 z8AfYQR}QuJb?>~Om=>&m*t3S+RCt-v=hmosITE2JWcaDPy>nu;>$b|GTBdA=qrx6J zN6RfsTlesYdv8N`_3q!{QwSfG8nl5{j1Clch0994rEo zB2?Jt8TL&gIncrwWGQSaewbfU*fE0TPYa2JEjAfsaVU)oIX#tR>b7Tpe8kT z;9F>sl`%#9G(l2k{InNyHPiyTnlVEHNe=cn;>fVqv@!WB;&8ZO6NvMh)L4N0cy&UO zQj{3jJCDPllN>@>VWBK8lA#d8vFfzGoW?68Q6_4nFj$dHI)e>WlMG06j6v>HCl3&g zxI{#p2aXG&iQpeOQF6-J%jIWT2Y62Smf6 ztl+6rfA^W#3QmpcgR(3hbYOn(rLr@Q>Z@v(Ia%FttaF&kmQ74ymg(KvrBuR_*PI`& ze1hCI>Mu73hB<4so)65Ek2_Sc&!BYc%Y)C0 zwPe=O26DouTzKkH;L_x$&s%9yv+SHiiVKaenlB@A#MrJ@*7hA6cx_kGCHni@`SL)*GHwhv#q#v8U_ z#(V<6mb|?D2tw4v)G^hGJccC81aUZFGmVTw>Fh8=4i`Fx^w8B@j44XOJ|aW`j1Rux z-8jq^9-*Q#(E^)+ndTekW66f&H`7_clkPPdL)2tI!8V_84HwUf8blFHXrcuK0Za@p zRUEI02y()QY2*1RL={ZA5I{wi!(_*hBY_vl#fyP4W@=$To(vC=A6()Ig1ggV-o!1& zir)nNI@BSkc-}pc&)0m}!3B9T+g>VU2s(zmU){54E!O>!xlN5NJT-LAky6VkgSsbn zAD>>ay=QSY&(S)O`6q9a4+<>RUGwSb8bzw>VaBueK_CavRp4#uAA;K;l1+OT4_GRrK=g7W4Cko>{YRWJiD3;(wmC zL5MNfiybt@7qvl#toeixC*1s2ivLt`jnjp&q|AgyBYCkR*c_4@12#Kkts>9FEbzx9 zEJ@a;>yV5wYzArK$}!ysQawAAMWT(Vv^9(XQUsep3JnR4fgPtE#vZZt#4V)%Og-X^ zVfL4daZFu6Kxd8FzU3mtT`pE`t!pn>J1Lykdpx3pexwQ<2-qmC_5SVA8{{p%s@=N9 z2Y))1Hh6a7nG z&+B<#kbc#~xygaPa)Ha;wC*s^`FFN3W2?eGoNArQc^K>K;(agsl5|wT@&5f9?~W;C z1WxPh=Oez^aTZ>(ZJYV4+$egk-}?3AlpgbxSN#u4-hJq^Io1}DZX&0sV0Vk7E~k>& zEHzT1yPzuVKGFHvHu{{+*31pJM&?}9Tkl@Evs7$v!ySjqf$R<`f%ToXdF5qvT(WKZs*3vfl?`*J>Bq_$Vj41P<2?%w4GjIZ8If%6F}x(xFV!JL z7!pi&zRFx+Eaz$9c-M1mX-<-C1rTy&n ziI3!thmpORq9V@~_l7TOt$F1C{>d5%v}sMN)e!Y!^^3IGDwcVk4A<>5%eC#p6oHct z04Jr4bCOtnzr~G_OJ*U&rj=axG4@aE^)b5wc2WIGN%&sYmJ^iZ|1Bf^g87L;x-L?7rX)w(=squ-a^V(fF=Z`YE;d$m2pWM5}Lq**z6D%MZ+7S5RS>6g+E zD{SVJgt59Zx|Y>SoV~UoAWQC|M*NfRyQ)RE&!KAyqB4CL6|ZGE7wnUDTLoNGGg8wH z_C+}=2Q?n%L_HMqF;4MLF}c`Gzu~-hW@Y6|6XCmW56JhYlsBKErdT~99$KS%QoYo$ zDy*{HZG)!3u<*qr?z;q@NNBT)YbTh33L{0qM7}TuY>kG=;5iLkUH=O;&L5AlC&UGe zjzElo=}zQ9e3Zt;hr>4DN>CK+vpjA!a*Yr3FV~{UdS9=lF=>Y1U24Q(vkmApgFs_L zI)jB-}<{RZ3Ouid8QvSu=KxhB1l-V8P3G)yM`#}?V7=_78r;Pz~^Rav?&k859=KV}|%AW4fqblS;B8m;*aS%l(b zH;uepJAy)6T}R90i+pLo=7Jp~Tr?#b$A?|)+PP6SpM329; z$UQN$MKE0AlR`{cd~6A`|MQ;HA~Je!<9q~dcKbY)xha{jn#a&W^sr8v{*#maOO7DN zr1$6>ImXF-gKo?-0SR+6A(c+W~XpZe}1jHg zO(m3l%M*X!akjlDDJ zx;TUe!2AYS2cJ+GV`S{htO~Q7#D1XIAUnZ+3HQG3mLxU>FJC}X$blBjTmjoqGil^0 zT;&ZjKmiIZgfuUd%^<5`D)@CmQq%1NLj9rM7??3aXTa+)J_}<6kf&l2+@4Aadc}k> zz#I$VkY{ma26}Ji$P8q1Xu%|B$1m2G0ck#y&I)CRuHcX;kVMf~43alABw)-x5otV8 zG2vfT{Fi)t=IRuRul9c0Jz_(6xwYl2C6|>H&hMyNfoCFVJ!_km+=yQFKJulpLp#ehm&M%1<8@bXcwftl ztB;R3G-Pn*owPuMM@E^kcR@Ow(n<%{+ansi zxvSS@Pex&F!Sv5*0{f0m@NF!NR1~^l_P#nfiaZNTyyaW=_2E$=5ygYd>l04{y@XHeZBTEf;Onf(y zBVgeZtPPCM!07*`!DKaY7l!_zH#p`0S#N;vClhV`t|KpFHTzwvx2HYm=s<;qu&t>my?TwXcv#QEkLhrw=Y^3x_Mvu$k|(G zR`p)BV95KE9UtyKYH4z5W7cRe&&P9FS^2wty4;lw2#X(g>~EttUg*^0Ah8C8Je(O1 z{W5m#9*mVed#TOB^|^l1kehCc#IF1O+jb_H^ahCUp6jS;x{RM5{xGQKj_0UFdrP<2 zsVgrvjtQI+*?SYqyeYE2%__c0ZNJcc8I4wvmWOS|gkN_n58YYtu{l>)Vpi&jpXKch zk0>KXq0WM>!Dsa9;+l+FYu0^WDz#@RR#!$AJsmLBi@euwI7{m3%a!);+I!=~j9Oop ze&7ujva@^ZuCjH*hQia^`2(fd4SdU6ueHdfxM-W5zVZZ1rWPUd_d?=)ua3(* zCpX-FuVr>YL)hX_Dt)i)0fC}ljt|$a^iOoXuhJsl{I(;>YOAjMMxPysd-b76i8w97 z+Vax%>#nqYw2cMr4ca-p@gJcTfA*8H1&(8YS0?i{LhgQdL-=Ps( zf5}#%$0&QKb5qpyU%gMRvGT$w^6mbnqe^%Bmt<;h>~xiNTkrF^FmqR2d+nRTh&OMf zKg{VGlw&m+nod7hcF1-8#q;hWHq^IR7K*d8p^n!(r zF(?xQtM*$4_5Kg$x?jv;6vdRL|M|QaOpR}~0C>p$&nLoMrDK5UVLJI*`5MU+)8{{^ z8r(5p5NO6#G=FdUj60=4vB+Rj6Ka8ge)&cCa|?aK`kL?I;%s1SU@^%;|Dj%(tT=w? zZ1{nN?ydUVwD213*4(qmQSZY6;?1e)*Us07bRJ!kuNv1r$6}sA@SV8u>1$tw9XZkG z{!CniG9>Lc!pU(~-j=4%NXnSi;>{$BA=I*wVpKKU28p>?!w9|G= z)T?RMxR7q`Q1(rAHN9!w)M?%rT12{N+N0TAD%w?0$F5|1wq6VCgp_5VlZ9)YF|i$ul;LI1drVmNW_cb-Y*(%r{l9-5~lXGa3UF; z_=_GtaTL)iES>9aEz@fm9_iMlXEa&YLM()si0~8`S>G3BjNHGymm_h)eq((7wygNt zZEXT!>SE~~X;b%lE(v!W96oGty+c0fjP(Ud?ovm;168{3x9F+-awVN1bp2&>+I_Xp z>=g-@N@#8=Pn=RtTu!R$p53YQrgOGc6|r$-uV{D2aa)<}q~WrUiM6Q-u>)5IowRD^ z)y}vWuNYK!c8DrmckwP?&ajiyn%;|5aXWeMot?W!kaN3p7jNgZ=hX6-*YwP;yD<5w zK}H{=WIarr#fcU9=?{DaTv_3vI&&N4tb1~L8=H^S|H`YP`LISc`eAdqAf{^Xd}?R@ z@`B`CbePA&9QQQTwtvuNM^fDp}`*Lhw?yi;~c>uqr3m3NNcXTG%m^wuUCvpUviq%pO| zDE_ukz%vKg=N*XjX|?jfZDckjTt5HPfQs5b=HYdA!96y~jXN!a7&kYBYIR2lDx0lPy z_EIRUs@0hbdYWo~Ub;4oA|g3IuVRH>O`M+9<2P#5x2+!U&KS$Q6Jy5XbZ0og 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 114/247] 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 115/247] 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 116/247] 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 117/247] 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 118/247] 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 119/247] 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 120/247] 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 121/247] 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 122/247] 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 123/247] 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 124/247] 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 125/247] 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 126/247] 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 127/247] 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 128/247] 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 129/247] 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 130/247] 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 131/247] 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 132/247] 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 133/247] 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 8820785c8fe267789a5c6edf7f4fcb196c48b4a8 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 6 Sep 2015 09:42:39 -0700 Subject: [PATCH 134/247] Fix emoji URLs in Markdown when relative_url_root is used Also adds the ability to run rspecs with relative_url_defined on the enviornment. For example: RELATIVE_URL_ROOT=/gitlab rspec Closes #1728 --- CHANGELOG | 1 + lib/gitlab/markdown.rb | 2 +- spec/spec_helper.rb | 1 + spec/support/matchers/markdown_matchers.rb | 3 +++ spec/support/relative_url.rb | 8 ++++++++ 5 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 spec/support/relative_url.rb diff --git a/CHANGELOG b/CHANGELOG index 8154d4333d..329ce74a5d 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 emoji URLs in Markdown when relative_url_root is used (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/markdown.rb b/lib/gitlab/markdown.rb index 097caf67a6..ae5f254469 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -77,7 +77,7 @@ module Gitlab pipeline: options[:pipeline], # EmojiFilter - asset_root: Gitlab.config.gitlab.url, + asset_root: Gitlab.config.gitlab.base_url, asset_host: Gitlab::Application.config.asset_host, # TableOfContentsFilter diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d0f1873ee2..0780c4f320 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -28,6 +28,7 @@ RSpec.configure do |config| config.include LoginHelpers, type: :feature config.include LoginHelpers, type: :request config.include StubConfiguration + config.include RelativeUrl, type: feature config.include TestEnv config.infer_spec_type_from_file_location! diff --git a/spec/support/matchers/markdown_matchers.rb b/spec/support/matchers/markdown_matchers.rb index 9df226c3af..7500d0fdf8 100644 --- a/spec/support/matchers/markdown_matchers.rb +++ b/spec/support/matchers/markdown_matchers.rb @@ -27,6 +27,9 @@ module MarkdownMatchers match do |actual| expect(actual).to have_selector('img.emoji', count: 10) + + image = actual.at_css('img.emoji') + expect(image['src'].to_s).to start_with(Gitlab.config.gitlab.url + '/assets') end end diff --git a/spec/support/relative_url.rb b/spec/support/relative_url.rb new file mode 100644 index 0000000000..72e3ccce75 --- /dev/null +++ b/spec/support/relative_url.rb @@ -0,0 +1,8 @@ +# Fix route helpers in tests (e.g. root_path, ...) +module RelativeUrl + extend ActiveSupport::Concern + + included do + default_url_options[:script_name] = Rails.application.config.relative_url_root + end +end From 6c1d5c5c9c6b0b52741a5bd72a91042d473c390a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 11:10:40 +0200 Subject: [PATCH 135/247] 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 136/247] 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 137/247] 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 138/247] 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 139/247] 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 140/247] 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 8d59b1ac456575496e0bceb6812c59545b1e9b50 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Mon, 7 Sep 2015 13:05:29 +0200 Subject: [PATCH 141/247] Do not let NGINX buffer Git HTTP requests Before this change NGINX would convert a chunked HTTP POST (e.g. git push) into a HTTP 1.0 single large POST. This creates an unnecessary delay, and it creates unnecessary memory pressure on gitlab-git-http-server. For the response ('proxy_buffering') I am less sure that NGINX 's buffering behavior is harmful, but it still makes more sense to me not to interfere with gitlab-git-http-server (and the Golang net/http server). --- lib/support/nginx/gitlab | 7 +++++++ lib/support/nginx/gitlab-ssl | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab index 17f89c8beb..1cd81ea769 100644 --- a/lib/support/nginx/gitlab +++ b/lib/support/nginx/gitlab @@ -124,6 +124,13 @@ server { proxy_connect_timeout 300; proxy_redirect off; + # Do not buffer Git HTTP responses + proxy_buffering off; + + # Pass chunked request bodies to gitlab-git-http-server as-is + proxy_request_buffering off; + proxy_http_version 1.1; + 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; diff --git a/lib/support/nginx/gitlab-ssl b/lib/support/nginx/gitlab-ssl index 5ba39fc41a..83aad321aa 100644 --- a/lib/support/nginx/gitlab-ssl +++ b/lib/support/nginx/gitlab-ssl @@ -171,6 +171,13 @@ server { proxy_connect_timeout 300; proxy_redirect off; + # Do not buffer Git HTTP responses + proxy_buffering off; + + # Pass chunked request bodies to gitlab-git-http-server as-is + proxy_request_buffering off; + proxy_http_version 1.1; + proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Ssl on; From 700a342e0d2a92c8384ffa579bdf376d86a2d7c7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 13:18:11 +0200 Subject: [PATCH 142/247] 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 143/247] 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 From 783791fd08e8144a2ab97307a12df9d2a40e0421 Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Mon, 7 Sep 2015 14:59:32 +0200 Subject: [PATCH 144/247] The good stuff needs NGINX 1.7.11 --- lib/support/nginx/gitlab | 8 +++++--- lib/support/nginx/gitlab-ssl | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/support/nginx/gitlab b/lib/support/nginx/gitlab index 1cd81ea769..7218a4d2f2 100644 --- a/lib/support/nginx/gitlab +++ b/lib/support/nginx/gitlab @@ -127,9 +127,11 @@ server { # Do not buffer Git HTTP responses proxy_buffering off; - # Pass chunked request bodies to gitlab-git-http-server as-is - proxy_request_buffering off; - proxy_http_version 1.1; + # The following settings only work with NGINX 1.7.11 or newer + # + # # Pass chunked request bodies to gitlab-git-http-server as-is + # proxy_request_buffering off; + # proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; diff --git a/lib/support/nginx/gitlab-ssl b/lib/support/nginx/gitlab-ssl index 83aad321aa..7dabfba87e 100644 --- a/lib/support/nginx/gitlab-ssl +++ b/lib/support/nginx/gitlab-ssl @@ -174,9 +174,11 @@ server { # Do not buffer Git HTTP responses proxy_buffering off; - # Pass chunked request bodies to gitlab-git-http-server as-is - proxy_request_buffering off; - proxy_http_version 1.1; + # The following settings only work with NGINX 1.7.11 or newer + # + # # Pass chunked request bodies to gitlab-git-http-server as-is + # proxy_request_buffering off; + # proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; From 243bfc975eb670f56e9a7179533c86bfd605104d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 7 Sep 2015 22:04:23 +0200 Subject: [PATCH 145/247] Small restyle of issue and merge request pages Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_variables.scss | 4 +++ app/assets/stylesheets/generic/blocks.scss | 5 +++ app/assets/stylesheets/generic/issue_box.scss | 9 +++-- app/assets/stylesheets/pages/issuable.scss | 19 +++++++++++ app/views/projects/issues/show.html.haml | 34 +++++++++---------- .../projects/merge_requests/_show.html.haml | 4 +-- .../merge_requests/show/_mr_box.html.haml | 21 ++++++------ .../merge_requests/show/_mr_title.html.haml | 9 ++--- 8 files changed, 68 insertions(+), 37 deletions(-) diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 6d3b4b1e73..2447ee2189 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -22,6 +22,10 @@ $brand-info: $gl-info; $brand-warning: $gl-warning; $brand-danger: $gl-danger; +$border-radius-base: 3px !default; +$border-radius-large: 5px !default; +$border-radius-small: 2px !default; + //== Scaffolding // diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index abf4657dd5..27a4c4db8c 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; + &.middle-block { + margin-top: 0; + margin-bottom: 0; + } + &.second-block { margin-top: -1px; margin-bottom: 0; diff --git a/app/assets/stylesheets/generic/issue_box.scss b/app/assets/stylesheets/generic/issue_box.scss index 869e586839..b1fb87a683 100644 --- a/app/assets/stylesheets/generic/issue_box.scss +++ b/app/assets/stylesheets/generic/issue_box.scss @@ -5,10 +5,13 @@ */ .issue-box { + @include border-radius(3px); + display: inline-block; - padding: 4px 13px; + padding: 10px $gl-padding; font-weight: normal; - margin-right: 5px; + margin-right: 10px; + font-size: $gl-font-size; &.issue-box-closed { background-color: $gl-danger; @@ -21,7 +24,7 @@ } &.issue-box-open { - background-color: $gl-success; + background-color: #019875; color: #FFF; } diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index 2d32d82e10..afcbc2d997 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -56,3 +56,22 @@ text-align: left; } } + +.issuable-details { + .page-title { + margin-top: -15px; + padding: 10px 0; + margin-bottom: 0; + color: $gl-gray; + font-size: 16px; + + .author { + color: $gl-gray; + } + + .issue-id { + font-size: 19px; + color: $gl-text-color; + } + } +} diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index e7b14e7582..6ed472f2d9 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -1,15 +1,16 @@ - page_title "#{@issue.title} (##{@issue.iid})", "Issues" .issue .issue-details.issuable-details - %h4.page-title + .page-title .issue-box{ class: issue_box_class(@issue) } - if @issue.closed? Closed - else Open - Issue ##{@issue.iid} - %small.creator - · created by #{link_to_member(@project, @issue.author)} + %span.issue-id Issue ##{@issue.iid} + %span.creator + · created by #{link_to_member(@project, @issue.author, size: 24)} + · = time_ago_with_tooltip(@issue.created_at, placement: 'bottom', html_class: 'issue_created_ago') - if @issue.updated_at != @issue.created_at %span @@ -32,18 +33,17 @@ = icon('pencil-square-o') Edit - %hr - %h2.issue-title - = gfm escape_once(@issue.title) - %div - - if @issue.description.present? - .description{class: can?(current_user, :update_issue, @issue) ? 'js-task-list-container' : ''} - .wiki - = preserve do - = markdown(@issue.description) - %textarea.hidden.js-task-list-field - = @issue.description + .gray-content-block.middle-block + %h2.issue-title + = gfm escape_once(@issue.title) + %div + - if @issue.description.present? + .description{class: can?(current_user, :update_issue, @issue) ? 'js-task-list-container' : ''} + .wiki + = preserve do + = markdown(@issue.description) + %textarea.hidden.js-task-list-field + = @issue.description - %hr - .issue-discussion + .issue-discussion.prepend-top-default = render 'projects/issues/discussion' diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index ec1838eb48..516e5e3ffc 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -5,10 +5,8 @@ .merge-request{'data-url' => merge_request_path(@merge_request)} .merge-request-details.issuable-details = render "projects/merge_requests/show/mr_title" - %hr = render "projects/merge_requests/show/mr_box" - %hr - .append-bottom-20.mr-source-target + .append-bottom-20.mr-source-target.prepend-top-default - if @merge_request.open? .pull-right - if @merge_request.source_branch_exists? diff --git a/app/views/projects/merge_requests/show/_mr_box.html.haml b/app/views/projects/merge_requests/show/_mr_box.html.haml index e3cd434687..b4f62a7589 100644 --- a/app/views/projects/merge_requests/show/_mr_box.html.haml +++ b/app/views/projects/merge_requests/show/_mr_box.html.haml @@ -1,11 +1,12 @@ -%h2.issue-title - = gfm escape_once(@merge_request.title) +.gray-content-block.middle-block + %h2.issue-title + = gfm escape_once(@merge_request.title) -%div - - if @merge_request.description.present? - .description{class: can?(current_user, :update_merge_request, @merge_request) ? 'js-task-list-container' : ''} - .wiki - = preserve do - = markdown(@merge_request.description) - %textarea.hidden.js-task-list-field - = @merge_request.description + %div + - if @merge_request.description.present? + .description{class: can?(current_user, :update_merge_request, @merge_request) ? 'js-task-list-container' : ''} + .wiki + = preserve do + = markdown(@merge_request.description) + %textarea.hidden.js-task-list-field + = @merge_request.description diff --git a/app/views/projects/merge_requests/show/_mr_title.html.haml b/app/views/projects/merge_requests/show/_mr_title.html.haml index 9a1eb36fc8..2bf9cd597a 100644 --- a/app/views/projects/merge_requests/show/_mr_title.html.haml +++ b/app/views/projects/merge_requests/show/_mr_title.html.haml @@ -1,10 +1,11 @@ -%h4.page-title +.page-title .issue-box{ class: issue_box_class(@merge_request) } = @merge_request.state_human_name - Merge Request ##{@merge_request.iid} - %small.creator + %span.issue-id Merge Request ##{@merge_request.iid} + %span.creator + · + created by #{link_to_member(@project, @merge_request.author, size: 24)} · - created by #{link_to_member(@project, @merge_request.author)} = time_ago_with_tooltip(@merge_request.created_at) - if @merge_request.updated_at != @merge_request.created_at %span From 6887075b2eed6115277173dd14b812bb79cf322a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 01:25:51 +0200 Subject: [PATCH 146/247] Style issue page, comments and part of merge request page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/mixins.scss | 38 +++++++- app/assets/stylesheets/generic/common.scss | 32 +------ app/assets/stylesheets/generic/timeline.scss | 95 +++++-------------- app/assets/stylesheets/pages/issues.scss | 4 - .../stylesheets/pages/merge_requests.scss | 17 +--- app/assets/stylesheets/pages/note_form.scss | 10 +- .../projects/issues/_discussion.html.haml | 23 +++-- app/views/projects/issues/show.html.haml | 2 +- .../merge_requests/_discussion.html.haml | 17 ++-- .../projects/merge_requests/_show.html.haml | 2 +- 10 files changed, 96 insertions(+), 144 deletions(-) diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 8698109bc4..0f661d6b1b 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -177,7 +177,7 @@ margin: 0px; &:last-child { - border:none + border-bottom: none; } &.active { @@ -215,3 +215,39 @@ font-size: 16px; line-height: 24px; } + +@mixin nav-menu { + padding: 0; + margin: 0; + list-style: none; + margin-top: 5px; + height: 56px; + + li { + display: inline-block; + + a { + padding: 14px; + font-size: 17px; + line-height: 28px; + color: #7f8fa4; + border-bottom: 2px solid transparent; + + &:hover, &:active, &:focus { + text-decoration: none; + } + } + + &.active a { + 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/common.scss b/app/assets/stylesheets/generic/common.scss index b995486588..5e191d5dd4 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -370,41 +370,11 @@ table { } .center-top-menu { - padding: 0; - margin: 0; - list-style: none; + @include nav-menu; text-align: center; margin-top: 5px; margin-bottom: $gl-padding; height: 56px; margin-top: -$gl-padding; padding-top: $gl-padding; - - li { - display: inline-block; - - a { - padding: 14px; - font-size: 17px; - line-height: 28px; - color: #7f8fa4; - border-bottom: 2px solid transparent; - - &:hover, &:active, &:focus { - text-decoration: none; - } - } - - &.active a { - 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/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 97831eb7c2..54dc4c5241 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -1,89 +1,38 @@ .timeline { - list-style: none; - padding: 20px 0 20px; - position: relative; + @include basic-list; - &:before { - top: 0; - bottom: 0; - position: absolute; - content: " "; - width: 3px; - background-color: #eeeeee; - margin-left: 29px; - } + margin: 0; + padding: 0; - .timeline-entry { - position: relative; - margin-top: 5px; - margin-left: 30px; - margin-bottom: 10px; - clear: both; + > li { + padding: $gl-padding; + border-color: #f1f2f4; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + color: $gl-gray; + border-right: 1px solid #f1f2f4; - - &:target { - .timeline-entry-inner .timeline-content { - -webkit-animation:target-note 2s linear; - background: $hover; - } + .avatar { + margin-right: 15px; } - .timeline-entry-inner { - position: relative; - margin-left: -20px; + .controls { + padding-top: 10px; + float: right; + } + } - &:before, &:after { - content: " "; - display: table; - } - - .timeline-icon { - margin-top: 2px; - background: #fff; - color: #737881; - float: left; - @include border-radius($avatar_radius); - @include box-shadow(0 0 0 3px #EEE); - overflow: hidden; - - .avatar { - margin: 0; - padding: 0; - } - } - - .timeline-content { - position: relative; - background: $background-color; - padding: 10px 15px; - margin-left: 60px; - - img { - max-width: 100%; - } - - &:after { - content: ''; - display: block; - position: absolute; - width: 0; - height: 0; - border-style: solid; - border-width: 9px 9px 9px 0; - border-color: transparent $background-color transparent transparent; - left: 0; - top: 10px; - margin-left: -9px; - } - } + .note-text { + p:last-child { + margin-bottom: 0; } } .system-note .timeline-entry-inner { .timeline-icon { - background: none; + float: left; margin-left: 12px; - margin-top: 0; + margin-top: 8px; @include box-shadow(none); span { diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index 7928b6220f..c407d53118 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -47,10 +47,6 @@ } } -.participants { - margin-bottom: 20px; -} - .issue-search-form { margin: 0; height: 24px; diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index f0fb68d342..d5ede5349d 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -89,20 +89,11 @@ } } -@media(min-width: $screen-sm-max) { - .merge-request .merge-request-tabs{ - li { - a { - padding: 15px 40px; - font-size: 14px; - } - } - } -} - .merge-request .merge-request-tabs{ - margin-top: 30px; - margin-bottom: 20px; + @include nav-menu; + margin-bottom: -15px; + margin-top: 26px; + text-align: left; } .mr_source_commit, diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss index 203f9374ce..85804f5ee6 100644 --- a/app/assets/stylesheets/pages/note_form.scss +++ b/app/assets/stylesheets/pages/note_form.scss @@ -72,9 +72,13 @@ .common-note-form { margin: 0; - background: #F9F9F9; - padding: 5px; - border: 1px solid #DDD; + background: #f8fafc; + padding: $gl-padding; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + border-right: 1px solid #f1f2f4; + border-top: 1px solid #f1f2f4; + margin-bottom: -$gl-padding; } .note-form-actions { diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index f61ae95720..d4a98eca47 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -7,21 +7,24 @@ = render 'shared/show_aside' +.gray-content-block.second-block + .row + .col-md-9 + .votes-holder.pull-right + #votes= render 'votes/votes_block', votable: @issue + .participants + %span= pluralize(@participants.count, 'participant') + - @participants.each do |participant| + = link_to_member(@project, participant, name: false, size: 24) + .col-md-3 + %span.slead.has_tooltip{title: 'Cross-project reference'} + = cross_project_reference(@project, @issue) + .row %section.col-md-9 - .votes-holder.pull-right - #votes= render 'votes/votes_block', votable: @issue - .participants - %span= pluralize(@participants.count, 'participant') - - @participants.each do |participant| - = link_to_member(@project, participant, name: false, size: 24) .voting_notes#notes= render 'projects/notes/notes_with_form' %aside.col-md-3 .issuable-affix - .clearfix - %span.slead.has_tooltip{title: 'Cross-project reference'} - = cross_project_reference(@project, @issue) - %hr .context = render 'shared/issuable/context', issuable: @issue diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml index 6ed472f2d9..0908064229 100644 --- a/app/views/projects/issues/show.html.haml +++ b/app/views/projects/issues/show.html.haml @@ -45,5 +45,5 @@ %textarea.hidden.js-task-list-field = @issue.description - .issue-discussion.prepend-top-default + .issue-discussion = render 'projects/issues/discussion' diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index f855dfec32..38e66c3828 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -7,18 +7,21 @@ = render 'shared/show_aside' +.gray-content-block.second-block + .row + .col-md-9 + .votes-holder.pull-right + #votes= render 'votes/votes_block', votable: @merge_request + = render "projects/merge_requests/show/participants" + .col-md-3 + %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} + = cross_project_reference(@project, @merge_request) + .row %section.col-md-9 - .votes-holder.pull-right - #votes= render 'votes/votes_block', votable: @merge_request - = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" %aside.col-md-3 .issuable-affix - .clearfix - %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} - = cross_project_reference(@project, @merge_request) - %hr .context = render 'shared/issuable/context', issuable: @merge_request diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 516e5e3ffc..721993fb27 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -37,7 +37,7 @@ = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal" - if @commits.present? - %ul.nav.nav-tabs.merge-request-tabs + %ul.merge-request-tabs %li.notes-tab = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#notes', action: 'notes', toggle: 'tab'} do = icon('comments') From 31fc6b26d845c938b98bd34ddd4648b89572b4ca Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 01:47:36 +0200 Subject: [PATCH 147/247] Style comment form Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/markdown_area.scss | 7 +++++-- app/assets/stylesheets/generic/zen.scss | 4 ++-- app/assets/stylesheets/pages/issuable.scss | 10 +--------- app/views/projects/_md_preview.html.haml | 4 ++-- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss index a4fc82e90b..2dcff516e8 100644 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ b/app/assets/stylesheets/generic/markdown_area.scss @@ -65,8 +65,11 @@ position: relative; } -.md-header ul { - float: left; +.md-header { + ul { + float: left; + margin-bottom: 1px; + } } .referenced-users { diff --git a/app/assets/stylesheets/generic/zen.scss b/app/assets/stylesheets/generic/zen.scss index 7e86a0fe4b..32e2c020e0 100644 --- a/app/assets/stylesheets/generic/zen.scss +++ b/app/assets/stylesheets/generic/zen.scss @@ -4,7 +4,7 @@ } .zen-enter-link { - color: #888; + color: $gl-gray; position: absolute; top: 0px; right: 4px; @@ -13,7 +13,7 @@ .zen-leave-link { display: none; - color: #888; + color: $gl-text-color; position: absolute; top: 10px; right: 10px; diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index afcbc2d997..e13c8f9eb9 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -25,8 +25,6 @@ } .issuable-context-title { - font-size: 14px; - line-height: 1.4; margin-bottom: 5px; .avatar { @@ -34,18 +32,12 @@ } label { - color: #666; + color: $gl-gray; font-weight: normal; margin-right: 4px; } } -.issuable-affix .context { - font-size: 13px; - - .btn { font-size: 13px; } -} - .project-issuable-filter { .controls { float: right; diff --git a/app/views/projects/_md_preview.html.haml b/app/views/projects/_md_preview.html.haml index b7bca6dae0..507757f6a2 100644 --- a/app/views/projects/_md_preview.html.haml +++ b/app/views/projects/_md_preview.html.haml @@ -1,6 +1,6 @@ .md-area .md-header.clearfix - %ul.nav.nav-tabs + %ul.center-top-menu %li.active = link_to '#md-write-holder', class: 'js-md-write-button', tabindex: '-1' do Write @@ -14,7 +14,7 @@ You are about to add %strong %span.js-referenced-users-count 0 - people + people to the discussion. Proceed with caution. %div From 1240a7e06586f36ea1094dc87b2d04efaf524896 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 09:32:06 +0200 Subject: [PATCH 148/247] Improve font size on issues/mr list Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/issues.scss | 3 +-- app/assets/stylesheets/pages/merge_requests.scss | 1 - app/views/projects/issues/_issue.html.haml | 2 +- app/views/projects/merge_requests/_merge_request.html.haml | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index c407d53118..1732072b5b 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -1,6 +1,6 @@ .issues-list { .issue { - padding: 10px 15px; + padding: 10px $gl-padding; position: relative; .issue-title { @@ -11,7 +11,6 @@ .issue-info { color: $gl-gray; - font-size: 13px; } .issue-check { diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index d5ede5349d..a8db3d401b 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -128,7 +128,6 @@ .merge-request-info { color: $gl-gray; - font-size: 13px; } } diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index b6910c8f79..55ce912829 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -41,4 +41,4 @@ = issue.task_status .pull-right.issue-updated-at - %small updated #{time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago')} + %span updated #{time_ago_with_tooltip(issue.updated_at, placement: 'bottom', html_class: 'issue_update_ago')} diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index 4295c828da..25e4e8ba80 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -43,4 +43,4 @@ = merge_request.task_status .pull-right.hidden-xs - %small updated #{time_ago_with_tooltip(merge_request.updated_at, placement: 'bottom', html_class: 'merge_request_updated_ago')} + %span updated #{time_ago_with_tooltip(merge_request.updated_at, placement: 'bottom', html_class: 'merge_request_updated_ago')} From def4d8b90617dae50f3fa23e67b2ee383f84f82e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 09:58:43 +0200 Subject: [PATCH 149/247] Improve issue/mr title and description styles Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/issuable.scss | 12 ++++++++++++ app/assets/stylesheets/pages/issues.scss | 5 ----- app/assets/stylesheets/pages/notes.scss | 5 ++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index e13c8f9eb9..b5c61f7f91 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -66,4 +66,16 @@ color: $gl-text-color; } } + + .issue-title { + margin: 0; + } + + .description { + margin-top: 6px; + + p:last-child { + margin-bottom: 0; + } + } } diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index 1732072b5b..4bf58cb4a5 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -132,11 +132,6 @@ form.edit-issue { } } -h2.issue-title { - margin-top: 0; - font-weight: bold; -} - .issue-form .select2-container { width: 250px !important; } diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 85c828ec1a..77a112f8c7 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -59,7 +59,7 @@ ul.notes { margin-top: 1px; border: 1px solid #bbb; background-color: transparent; - color: #999; + color: $gl-gray; } } @@ -176,8 +176,7 @@ ul.notes { a { margin-left: 5px; - - color: #999; + color: $gl-gray; i.fa { font-size: 16px; From 4bea030c88d1462be70a67b72505cb093868ec29 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 10:12:14 +0200 Subject: [PATCH 150/247] Style system notes Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_variables.scss | 7 ++++ app/assets/stylesheets/generic/timeline.scss | 36 ++----------------- app/assets/stylesheets/pages/notes.scss | 9 +++-- app/views/projects/notes/_note.html.haml | 11 ++---- 4 files changed, 16 insertions(+), 47 deletions(-) diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index 2447ee2189..d18b48eaca 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -148,3 +148,10 @@ $btn-default-border: #e7e9ed; // //## $nav-link-padding: 13px $gl-padding; + +//== Code +// +//## +$pre-bg: #f8fafc !default; +$pre-color: $gl-gray !default; +$pre-border-color: #e7e9ed; diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 54dc4c5241..668a6f848c 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -28,39 +28,9 @@ } } - .system-note .timeline-entry-inner { - .timeline-icon { - float: left; - margin-left: 12px; - margin-top: 8px; - @include box-shadow(none); - - span { - margin: 0 2px; - font-size: 16px; - color: #eeeeee; - } - } - - .timeline-content { - background: none; - margin-left: 45px; - padding: 0px 15px; - - &:after { border: 0; } - - .note-header { - span { font-size: 12px; } - - .avatar { - margin-right: 5px; - } - } - - .note-text { - font-size: 12px; - margin-left: 20px; - } + .system-note { + .note-text { + color: $gl-gray !important; } } } diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 77a112f8c7..9603624a65 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -34,10 +34,8 @@ ul.notes { content: "\00b7"; } - font-size: 13px; - a { - @extend .cgray; + color: $gl-gray; &:hover { text-decoration: underline; @@ -45,8 +43,9 @@ ul.notes { } } .author { - color: #333; - font-weight: bold; + color: #4c4e54; + margin-right: 3px; + &:hover { color: $gl-link-color; } diff --git a/app/views/projects/notes/_note.html.haml b/app/views/projects/notes/_note.html.haml index de75d44fc4..9bfbde02ca 100644 --- a/app/views/projects/notes/_note.html.haml +++ b/app/views/projects/notes/_note.html.haml @@ -1,11 +1,8 @@ %li.timeline-entry{ id: dom_id(note), class: [dom_class(note), "note-row-#{note.id}", ('system-note' if note.system)], data: { discussion: note.discussion_id } } .timeline-entry-inner .timeline-icon - - if note.system - %span= icon('circle') - - else - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: 'avatar s40', alt: '' + = link_to user_path(note.author) do + = image_tag avatar_icon(note.author_email), class: 'avatar s40', alt: '' .timeline-content .note-header - if note_editable?(note) @@ -22,10 +19,6 @@ %span.note-role.label = member.human_access - - if note.system - = link_to user_path(note.author) do - = image_tag avatar_icon(note.author_email), class: 'avatar s16', alt: '' - = link_to_member(note.project, note.author, avatar: false) %span.author-username From 0250bab8e928a18faf09c4668ba2fcbbfa64da48 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 10:23:09 +0200 Subject: [PATCH 151/247] Style wiki pages Signed-off-by: Dmitriy Zaporozhets --- .../projects/wikis/_main_links.html.haml | 7 +++++++ app/views/projects/wikis/_nav.html.haml | 11 +--------- app/views/projects/wikis/git_access.html.haml | 17 ++++++++------- app/views/projects/wikis/history.html.haml | 7 ++++--- app/views/projects/wikis/pages.html.haml | 7 ++++--- app/views/projects/wikis/show.html.haml | 21 ++++++++++--------- 6 files changed, 36 insertions(+), 34 deletions(-) diff --git a/app/views/projects/wikis/_main_links.html.haml b/app/views/projects/wikis/_main_links.html.haml index acc2c8b2f7..14f2582225 100644 --- a/app/views/projects/wikis/_main_links.html.haml +++ b/app/views/projects/wikis/_main_links.html.haml @@ -1,4 +1,9 @@ %span.pull-right + - if can?(current_user, :create_wiki, @project) + = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new btn-grouped", "data-toggle" => "modal" do + %i.fa.fa-plus + New Page + - if (@page && @page.persisted?) = link_to namespace_project_wiki_history_path(@project.namespace, @project, @page), class: "btn btn-grouped" do Page History @@ -6,3 +11,5 @@ = link_to namespace_project_wiki_edit_path(@project.namespace, @project, @page), class: "btn btn-grouped" do %i.fa.fa-pencil-square-o Edit + += render 'projects/wikis/new' diff --git a/app/views/projects/wikis/_nav.html.haml b/app/views/projects/wikis/_nav.html.haml index ec87c3c765..fffb4eb31a 100644 --- a/app/views/projects/wikis/_nav.html.haml +++ b/app/views/projects/wikis/_nav.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-tabs +%ul.center-top-menu = nav_link(html_options: {class: params[:id] == 'home' ? 'active' : '' }) do = link_to 'Home', namespace_project_wiki_path(@project.namespace, @project, :home) @@ -7,13 +7,4 @@ = nav_link(path: 'wikis#git_access') do = link_to namespace_project_wikis_git_access_path(@project.namespace, @project) do - %i.fa.fa-download Git Access - - - if can?(current_user, :create_wiki, @project) - .pull-right - = link_to '#modal-new-wiki', class: "add-new-wiki btn btn-new", "data-toggle" => "modal" do - %i.fa.fa-plus - New Page - -= render 'projects/wikis/new' diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml index 825f2a161c..62071e29d7 100644 --- a/app/views/projects/wikis/git_access.html.haml +++ b/app/views/projects/wikis/git_access.html.haml @@ -1,15 +1,16 @@ - page_title "Git Access", "Wiki" = render 'nav' -.row - .col-sm-6 - %h3.page-title - Git access for - %strong= @project_wiki.path_with_namespace +.gray-content-block + .row + .col-sm-6 + %h3.page-title + Git access for + %strong= @project_wiki.path_with_namespace - .col-sm-6 - = render "shared/clone_panel", project: @project_wiki + .col-sm-6 + = render "shared/clone_panel", project: @project_wiki -.git-empty +.git-empty.prepend-top-default %fieldset %legend Install Gollum: %pre.dark diff --git a/app/views/projects/wikis/history.html.haml b/app/views/projects/wikis/history.html.haml index 673ec2d20e..7c81ad53d3 100644 --- a/app/views/projects/wikis/history.html.haml +++ b/app/views/projects/wikis/history.html.haml @@ -1,8 +1,9 @@ - page_title "History", @page.title, "Wiki" = render 'nav' -%h3.page-title - %span.light History for - = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) +.gray-content-block + %h3.page-title + %span.light History for + = link_to @page.title, namespace_project_wiki_path(@project.namespace, @project, @page) %table.table %thead diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 890ff1aed7..7fb91507eb 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -1,8 +1,9 @@ - page_title "All Pages", "Wiki" = render 'nav' -%h3.page-title - All Pages -%ul.bordered-list +.gray-content-block + %h3.page-title + All Pages +%ul.content-list - @wiki_pages.each do |wiki_page| %li %h4 diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 90c4b83cf3..126810811e 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -1,25 +1,26 @@ - page_title @page.title, "Wiki" = render 'nav' -%h3.page-title - = @page.title - = render 'main_links' -.wiki-last-edit-by - Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} +.gray-content-block + = render 'main_links' + %h3.page-title + = @page.title.capitalize + + .wiki-last-edit-by + Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} - 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", namespace_project_wiki_history_path(@project.namespace, @project, @page)}. -%hr -.wiki-holder +.wiki-holder.prepend-top-default .wiki = preserve do = render_wiki_content(@page) -%hr -.wiki-last-edit-by - Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} +.gray-content-block.footer-block + .wiki-last-edit-by + Last edited by #{@page.commit.author.name} #{time_ago_with_tooltip(@page.commit.authored_date)} From 1e1376f230c98d4610eb77131b0b67b2296abecc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 11:14:48 +0200 Subject: [PATCH 152/247] Style milestones Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_bootstrap.scss | 6 +-- app/assets/stylesheets/pages/milestone.scss | 4 ++ .../dashboard/milestones/_milestone.html.haml | 24 ++++++----- .../groups/milestones/_milestone.html.haml | 36 +++++++++------- .../projects/milestones/_milestone.html.haml | 42 +++++++++++-------- 5 files changed, 64 insertions(+), 48 deletions(-) diff --git a/app/assets/stylesheets/base/gl_bootstrap.scss b/app/assets/stylesheets/base/gl_bootstrap.scss index 21acbfa5e5..ae72c5b8d9 100644 --- a/app/assets/stylesheets/base/gl_bootstrap.scss +++ b/app/assets/stylesheets/base/gl_bootstrap.scss @@ -85,14 +85,14 @@ // Labels .label { padding: 2px 4px; - font-size: 12px; + font-size: 13px; font-style: normal; font-weight: normal; display: inline-block; &.label-gray { - background-color: #eee; - color: #999; + background-color: #f8fafc; + color: $gl-gray; text-shadow: none; } diff --git a/app/assets/stylesheets/pages/milestone.scss b/app/assets/stylesheets/pages/milestone.scss index 15e3948e40..e80dc9e84a 100644 --- a/app/assets/stylesheets/pages/milestone.scss +++ b/app/assets/stylesheets/pages/milestone.scss @@ -6,4 +6,8 @@ li.milestone { h4 { font-weight: bold; } + + .progress { + height: 6px; + } } diff --git a/app/views/dashboard/milestones/_milestone.html.haml b/app/views/dashboard/milestones/_milestone.html.haml index d6f3e029a3..55080d6b3f 100644 --- a/app/views/dashboard/milestones/_milestone.html.haml +++ b/app/views/dashboard/milestones/_milestone.html.haml @@ -1,20 +1,22 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } - %h4 - = link_to_gfm truncate(milestone.title, length: 100), dashboard_milestone_path(milestone.safe_title, title: milestone.title) + .row + .col-sm-6 + %strong + = link_to_gfm truncate(milestone.title, length: 100), dashboard_milestone_path(milestone.safe_title, title: milestone.title) + .col-sm-6 + .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to issues_dashboard_path(milestone_title: milestone.title) do = pluralize milestone.issue_count, 'Issue' -   + · = link_to merge_requests_dashboard_path(milestone_title: milestone.title) do = pluralize milestone.merge_requests_count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete - .col-sm-6 = milestone_progress_bar(milestone) - %div - - milestone.milestones.each do |milestone| - = link_to milestone_path(milestone) do - %span.label.label-gray - = milestone.project.name_with_namespace + .row + .col-sm-6 + - milestone.milestones.each do |milestone| + = link_to milestone_path(milestone) do + %span.label.label-gray + = milestone.project.name_with_namespace diff --git a/app/views/groups/milestones/_milestone.html.haml b/app/views/groups/milestones/_milestone.html.haml index ba30e6e07c..41dffdd2fb 100644 --- a/app/views/groups/milestones/_milestone.html.haml +++ b/app/views/groups/milestones/_milestone.html.haml @@ -1,25 +1,29 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone.milestones.first) } - .pull-right - - if can?(current_user, :admin_group, @group) - - if milestone.closed? - = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-sm btn-grouped btn-reopen" - - else - = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-sm btn-close" - %h4 - = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) + .row + .col-sm-6 + %strong + = link_to_gfm truncate(milestone.title, length: 100), group_milestone_path(@group, milestone.safe_title, title: milestone.title) + .col-sm-6 + .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to issues_group_path(@group, milestone_title: milestone.title) do = pluralize milestone.issue_count, 'Issue' -   + · = link_to merge_requests_group_path(@group, milestone_title: milestone.title) do = pluralize milestone.merge_requests_count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete .col-sm-6 = milestone_progress_bar(milestone) - %div - - milestone.milestones.each do |milestone| - = link_to milestone_path(milestone) do - %span.label.label-gray - = milestone.project.name + .row + .col-sm-6 + %div + - milestone.milestones.each do |milestone| + = link_to milestone_path(milestone) do + %span.label.label-gray + = milestone.project.name + .col-sm-6 + - if can?(current_user, :admin_group, @group) + - if milestone.closed? + = link_to 'Reopen Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :activate }), method: :put, class: "btn btn-xs btn-grouped btn-reopen" + - else + = link_to 'Close Milestone', group_milestone_path(@group, milestone.safe_title, title: milestone.title, milestone: {state_event: :close }), method: :put, class: "btn btn-xs btn-close" diff --git a/app/views/projects/milestones/_milestone.html.haml b/app/views/projects/milestones/_milestone.html.haml index 2ce5358fa7..5e93d55b1f 100644 --- a/app/views/projects/milestones/_milestone.html.haml +++ b/app/views/projects/milestones/_milestone.html.haml @@ -1,28 +1,34 @@ %li{class: "milestone milestone-#{milestone.closed? ? 'closed' : 'open'}", id: dom_id(milestone) } - .pull-right - - if can?(current_user, :admin_milestone, milestone.project) and milestone.active? - = link_to edit_namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), class: "btn btn-sm edit-milestone-link btn-grouped" do - %i.fa.fa-pencil-square-o - Edit - = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-sm btn-close" - = link_to namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-sm btn-remove" do - %i.fa.fa-trash-o - Remove + .row + .col-sm-6 + %strong + = link_to_gfm truncate(milestone.title, length: 100), namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - %h4 - = link_to_gfm truncate(milestone.title, length: 100), namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone) - - if milestone.expired? and not milestone.closed? - %span.cred (Expired) - %small - = milestone.expires_at + .col-sm-6 + .pull-right.light #{milestone.percent_complete}% complete .row .col-sm-6 = link_to namespace_project_issues_path(milestone.project.namespace, milestone.project, milestone_title: milestone.title) do = pluralize milestone.issues.count, 'Issue' -   + · = link_to namespace_project_merge_requests_path(milestone.project.namespace, milestone.project, milestone_title: milestone.title) do = pluralize milestone.merge_requests.count, 'Merge Request' -   - %span.light #{milestone.percent_complete}% complete .col-sm-6 = milestone_progress_bar(milestone) + + .row + .col-sm-6 + - if milestone.expired? and not milestone.closed? + %span.cred (Expired) + - if milestone.expires_at + %span + = milestone.expires_at + .col-sm-6 + - if can?(current_user, :admin_milestone, milestone.project) and milestone.active? + = link_to edit_namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), class: "btn btn-xs edit-milestone-link btn-grouped" do + %i.fa.fa-pencil-square-o + Edit + = link_to 'Close Milestone', namespace_project_milestone_path(@project.namespace, @project, milestone, milestone: {state_event: :close }), method: :put, remote: true, class: "btn btn-xs btn-close" + = link_to namespace_project_milestone_path(milestone.project.namespace, milestone.project, milestone), data: { confirm: 'Are you sure?' }, method: :delete, class: "btn btn-xs btn-remove" do + %i.fa.fa-trash-o + Remove From 925d3926820b019c72bf29b2cf6cb6af2a28d91f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 11:21:33 +0200 Subject: [PATCH 153/247] Make comment form bigger Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/markdown_area.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/generic/markdown_area.scss b/app/assets/stylesheets/generic/markdown_area.scss index 2dcff516e8..ed0333d233 100644 --- a/app/assets/stylesheets/generic/markdown_area.scss +++ b/app/assets/stylesheets/generic/markdown_area.scss @@ -83,7 +83,7 @@ .md-preview-holder { background: #FFF; border: 1px solid #ddd; - min-height: 100px; + min-height: 169px; padding: 5px; box-shadow: none; } @@ -108,7 +108,7 @@ .markdown-area { background: #FFF; border: 1px solid #ddd; - min-height: 100px; + min-height: 140px; padding: 5px; box-shadow: none; width: 100%; From 9f31f95adad5500045ef35b57d133c633cd08524 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 11:18:55 +0100 Subject: [PATCH 154/247] Escape user-provided content in preserved HAML sections --- app/views/projects/empty.html.haml | 6 +++--- .../merge_requests/show/_how_to_merge.html.haml | 16 ++++++++-------- app/views/projects/wikis/git_access.html.haml | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index e577d35d56..798f1c47da 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -22,15 +22,15 @@ %h5 Git global setup %pre.light-well :preserve - git config --global user.name "#{git_user_name}" - git config --global user.email "#{git_user_email}" + git config --global user.name "#{h git_user_name}" + git config --global user.email "#{h git_user_email}" %fieldset %h5 Create a new repository %pre.light-well :preserve git clone #{ content_tag(:span, default_url_to_repo, class: 'clone')} - cd #{@project.path} + cd #{h @project.path} touch README.md git add README.md git commit -m "add README" diff --git a/app/views/projects/merge_requests/show/_how_to_merge.html.haml b/app/views/projects/merge_requests/show/_how_to_merge.html.haml index db1575f899..f18cf96c17 100644 --- a/app/views/projects/merge_requests/show/_how_to_merge.html.haml +++ b/app/views/projects/merge_requests/show/_how_to_merge.html.haml @@ -11,12 +11,12 @@ %pre.dark - if @merge_request.for_fork? :preserve - git fetch #{@merge_request.source_project.http_url_to_repo} #{@merge_request.source_branch} - git checkout -b #{@merge_request.source_project_path}-#{@merge_request.source_branch} FETCH_HEAD + git fetch #{h @merge_request.source_project.http_url_to_repo} #{h @merge_request.source_branch} + git checkout -b #{h @merge_request.source_project_path}-#{h @merge_request.source_branch} FETCH_HEAD - else :preserve git fetch origin - git checkout -b #{@merge_request.source_branch} origin/#{@merge_request.source_branch} + git checkout -b #{h @merge_request.source_branch} origin/#{h @merge_request.source_branch} %p %strong Step 2. Review the changes locally @@ -27,18 +27,18 @@ %pre.dark - if @merge_request.for_fork? :preserve - git checkout #{@merge_request.target_branch} - git merge --no-ff #{@merge_request.source_project_path}-#{@merge_request.source_branch} + git checkout #{h @merge_request.target_branch} + git merge --no-ff #{h @merge_request.source_project_path}-#{h @merge_request.source_branch} - else :preserve - git checkout #{@merge_request.target_branch} - git merge --no-ff #{@merge_request.source_branch} + git checkout #{h @merge_request.target_branch} + git merge --no-ff #{h @merge_request.source_branch} %p %strong Step 4. Push the result of the merge to GitLab %pre.dark :preserve - git push origin #{@merge_request.target_branch} + git push origin #{h @merge_request.target_branch} - unless @merge_request.can_be_merged_by?(current_user) %p Note that pushing to GitLab requires write access to this repository. diff --git a/app/views/projects/wikis/git_access.html.haml b/app/views/projects/wikis/git_access.html.haml index 825f2a161c..fd266baf66 100644 --- a/app/views/projects/wikis/git_access.html.haml +++ b/app/views/projects/wikis/git_access.html.haml @@ -20,7 +20,7 @@ %pre.dark :preserve git clone #{ content_tag(:span, default_url_to_repo(@project_wiki), class: 'clone')} - cd #{@project_wiki.path} + cd #{h @project_wiki.path} %legend Start Gollum And Edit Locally: %pre.dark From 7fe6d11a3d29884db70729c46a2f8fcd19955a65 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 15:02:51 +0200 Subject: [PATCH 155/247] Move group member title to header Signed-off-by: Dmitriy Zaporozhets --- app/views/groups/group_members/index.html.haml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/views/groups/group_members/index.html.haml b/app/views/groups/group_members/index.html.haml index dba395cc8f..3a6d07ebdd 100644 --- a/app/views/groups/group_members/index.html.haml +++ b/app/views/groups/group_members/index.html.haml @@ -1,15 +1,13 @@ - page_title "Members" +- header_title group_title(@group, "Members", group_group_members_path(@group)) - show_roles = should_user_see_group_roles?(current_user, @group) -%h3.page-title - Group members - if show_roles %p.light Members of group have access to all group projects. Read more about permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" -%hr .clearfix.js-toggle-container = form_tag group_group_members_path(@group), method: :get, class: 'form-inline member-search-form' do From 2fde90a2c23c7bdb7daffd9b15e3b416fb15d33f Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 15:35:25 +0200 Subject: [PATCH 156/247] Fix small font size for diff comments Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/diff.scss | 4 ++-- app/assets/stylesheets/pages/notes.scss | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 1557c243db..f816d32a93 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -45,7 +45,7 @@ overflow-y: hidden; background: #FFF; color: #333; - font-size: $code_font_size; + .old { span.idiff { background-color: #f8cbcb; @@ -82,7 +82,7 @@ border: none; margin: 0px; padding: 0px; - td { + .line_holder td { line-height: $code_line_height; font-size: $code_font_size; } diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 9603624a65..bd9e91a351 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -132,8 +132,6 @@ ul.notes { } .diff-file .notes_holder { - font-size: 13px; - line-height: 18px; font-family: $regular_font; td { From 70aecc34cfbdc9dbb10439c4c92679c00f767e2d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 15:40:14 +0200 Subject: [PATCH 157/247] Improve commit page style Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/commit.scss | 5 ----- app/views/projects/commit/_commit_box.html.haml | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss index 5436c6dad9..f9e9b024d4 100644 --- a/app/assets/stylesheets/pages/commit.scss +++ b/app/assets/stylesheets/pages/commit.scss @@ -47,11 +47,6 @@ } .commit-box { - margin: 10px 0; - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - padding: 20px 0; - .commit-title { margin: 0; } diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index 3f645b8139..2ac79e87b4 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -41,7 +41,7 @@ .commit-info-row.branches %i.fa.fa-spinner.fa-spin -.commit-box +.commit-box.gray-content-block.middle-block %h3.commit-title = gfm escape_once(@commit.title) - if @commit.description.present? From c258e97747f13cdc60ca2765789213292099c87a Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 14:42:30 +0100 Subject: [PATCH 158/247] Make Help accessible for guests. --- app/controllers/help_controller.rb | 2 ++ app/views/help/show.html.haml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb index 71831c5380..ad00948da5 100644 --- a/app/controllers/help_controller.rb +++ b/app/controllers/help_controller.rb @@ -1,4 +1,6 @@ class HelpController < ApplicationController + skip_before_action :authenticate_user!, :reject_blocked + layout 'help' def index diff --git a/app/views/help/show.html.haml b/app/views/help/show.html.haml index 8551496b98..0398afb4c1 100644 --- a/app/views/help/show.html.haml +++ b/app/views/help/show.html.haml @@ -1,3 +1,3 @@ - page_title @file.humanize, *@category.split("/").reverse.map(&:humanize) .documentation.wiki - = markdown @markdown.gsub('$your_email', current_user.email) + = markdown @markdown.gsub('$your_email', current_user.try(:email) || "email@example.com") From d92696d39d10d1862e6235742897c94bc85ab8a4 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 14:42:39 +0100 Subject: [PATCH 159/247] Link to help from signin page bottom. --- app/views/layouts/devise.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/layouts/devise.html.haml b/app/views/layouts/devise.html.haml index 1987bf1592..95e077c339 100644 --- a/app/views/layouts/devise.html.haml +++ b/app/views/layouts/devise.html.haml @@ -31,5 +31,5 @@ .container .footer-links = link_to "Explore", explore_root_path - = link_to "Documentation", "http://doc.gitlab.com/" + = link_to "Help", help_path = link_to "About GitLab", "https://about.gitlab.com/" From 260fcd45209b59ace6b3fd6dcca6c32c2c75a8f1 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 14:43:41 +0100 Subject: [PATCH 160/247] Consistently case `Back to X` links. --- app/views/layouts/nav/_group.html.haml | 2 +- app/views/layouts/nav/_profile.html.haml | 2 +- app/views/layouts/nav/_project.html.haml | 4 ++-- features/steps/groups.rb | 2 +- features/steps/project/project.rb | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 695ce68a20..f57ec7e13f 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -3,7 +3,7 @@ = link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Dashboard + Back to dashboard %li.separate-item diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 33fd5fcef6..729a584457 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -3,7 +3,7 @@ = link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Dashboard + Back to dashboard %li.separate-item diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 5e7b902622..1d22a7442e 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -4,13 +4,13 @@ = link_to group_path(@project.group), title: 'Back to group', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Group + Back to group - else = nav_link do = link_to root_path, title: 'Back to dashboard', data: {placement: 'right'}, class: 'back-link' do = icon('caret-square-o-left fw') %span - Back to Dashboard + Back to dashboard %li.separate-item diff --git a/features/steps/groups.rb b/features/steps/groups.rb index 18a1c4d32c..a5c2eed4dd 100644 --- a/features/steps/groups.rb +++ b/features/steps/groups.rb @@ -6,7 +6,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps include Select2Helper step 'I should see back to dashboard button' do - expect(page).to have_content 'Back to Dashboard' + expect(page).to have_content 'Back to dashboard' end step 'gitlab user "Mike"' do diff --git a/features/steps/project/project.rb b/features/steps/project/project.rb index 0404fd5e59..079a190e35 100644 --- a/features/steps/project/project.rb +++ b/features/steps/project/project.rb @@ -124,10 +124,10 @@ class Spinach::Features::Project < Spinach::FeatureSteps end step 'I should see back to dashboard button' do - expect(page).to have_content 'Back to Dashboard' + expect(page).to have_content 'Back to dashboard' end step 'I should see back to group button' do - expect(page).to have_content 'Back to Group' + expect(page).to have_content 'Back to group' end end From 5d785457db3017a17722314a52433543dd925164 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 14:49:20 +0100 Subject: [PATCH 161/247] Clean up overlap between dashboard and explore. - Split up SnippetsController into separate dashboard and explore sections. - Use consistent page titles, header titles and sidebars between dashboard and explore sections when signed in or not. --- .../dashboard/projects_controller.rb | 15 +++++++ .../dashboard/snippets_controller.rb | 10 +++++ app/controllers/dashboard_controller.rb | 19 -------- .../explore/application_controller.rb | 2 + app/controllers/explore/groups_controller.rb | 3 -- .../explore/projects_controller.rb | 3 -- .../explore/snippets_controller.rb | 6 +++ app/controllers/groups_controller.rb | 4 ++ app/controllers/projects_controller.rb | 4 ++ app/controllers/root_controller.rb | 5 ++- app/controllers/snippets_controller.rb | 8 +--- app/views/dashboard/_groups_head.html.haml | 4 +- app/views/dashboard/_projects_head.html.haml | 4 +- app/views/dashboard/_snippets_head.html.haml | 7 +++ app/views/dashboard/activity.html.haml | 4 +- .../{ => projects}/_projects.html.haml | 0 .../index.atom.builder} | 6 +-- .../index.html.haml} | 6 ++- .../dashboard/projects/starred.html.haml | 5 ++- app/views/dashboard/snippets/index.html.haml | 38 ++++++++++++++++ app/views/explore/_head.html.haml | 6 +++ app/views/explore/groups/index.html.haml | 8 +++- app/views/explore/projects/index.html.haml | 7 ++- app/views/explore/projects/starred.html.haml | 6 ++- app/views/explore/projects/trending.html.haml | 12 +++-- app/views/explore/snippets/index.html.haml | 18 ++++++++ app/views/layouts/_page.html.haml | 4 ++ app/views/layouts/explore.html.haml | 6 +-- app/views/layouts/nav/_dashboard.html.haml | 44 +++++++++---------- app/views/layouts/nav/_explore.html.haml | 21 +++++++++ app/views/layouts/snippets.html.haml | 7 +-- app/views/projects/activity.html.haml | 1 + app/views/snippets/_head.html.haml | 7 --- .../snippets/current_user_index.html.haml | 36 --------------- app/views/snippets/index.html.haml | 22 +++++----- app/views/snippets/show.html.haml | 4 +- app/views/snippets/user_index.html.haml | 13 ------ config/routes.rb | 20 +++++---- features/steps/snippets/user.rb | 2 +- 39 files changed, 227 insertions(+), 170 deletions(-) create mode 100644 app/controllers/dashboard/snippets_controller.rb create mode 100644 app/controllers/explore/snippets_controller.rb create mode 100644 app/views/dashboard/_snippets_head.html.haml rename app/views/dashboard/{ => projects}/_projects.html.haml (100%) rename app/views/dashboard/{show.atom.builder => projects/index.atom.builder} (52%) rename app/views/dashboard/{show.html.haml => projects/index.html.haml} (53%) create mode 100644 app/views/dashboard/snippets/index.html.haml create mode 100644 app/views/explore/_head.html.haml create mode 100644 app/views/explore/snippets/index.html.haml create mode 100644 app/views/layouts/nav/_explore.html.haml delete mode 100644 app/views/snippets/_head.html.haml delete mode 100644 app/views/snippets/current_user_index.html.haml delete mode 100644 app/views/snippets/user_index.html.haml diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb index da96171e88..467d0f81ac 100644 --- a/app/controllers/dashboard/projects_controller.rb +++ b/app/controllers/dashboard/projects_controller.rb @@ -1,6 +1,21 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController before_action :event_filter + def index + @projects = current_user.authorized_projects.sorted_by_activity.non_archived + @projects = @projects.includes(:namespace) + @last_push = current_user.recent_push + + respond_to do |format| + format.html + format.atom do + event_filter + load_events + render layout: false + end + end + end + def starred @projects = current_user.starred_projects @projects = @projects.includes(:namespace, :forked_from_project, :tags) diff --git a/app/controllers/dashboard/snippets_controller.rb b/app/controllers/dashboard/snippets_controller.rb new file mode 100644 index 0000000000..f4354c6d8c --- /dev/null +++ b/app/controllers/dashboard/snippets_controller.rb @@ -0,0 +1,10 @@ +class Dashboard::SnippetsController < Dashboard::ApplicationController + def index + @snippets = SnippetsFinder.new.execute(current_user, + filter: :by_user, + user: current_user, + scope: params[:scope] + ) + @snippets = @snippets.page(params[:page]).per(PER_PAGE) + end +end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 2bc2e5e58f..4ebb3d7276 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -1,23 +1,8 @@ class DashboardController < Dashboard::ApplicationController - before_action :load_projects, except: :activity before_action :event_filter, only: :activity respond_to :html - def show - @projects = @projects.includes(:namespace) - @last_push = current_user.recent_push - - respond_to do |format| - format.html - format.atom do - event_filter - load_events - render layout: false - end - end - end - def merge_requests @merge_requests = get_merge_requests_collection @merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE) @@ -50,10 +35,6 @@ class DashboardController < Dashboard::ApplicationController protected - def load_projects - @projects = current_user.authorized_projects.sorted_by_activity.non_archived - end - def load_events project_ids = if params[:filter] == "starred" diff --git a/app/controllers/explore/application_controller.rb b/app/controllers/explore/application_controller.rb index 4b275033d2..461fc059a3 100644 --- a/app/controllers/explore/application_controller.rb +++ b/app/controllers/explore/application_controller.rb @@ -1,3 +1,5 @@ class Explore::ApplicationController < ApplicationController + skip_before_action :authenticate_user!, :reject_blocked + layout 'explore' end diff --git a/app/controllers/explore/groups_controller.rb b/app/controllers/explore/groups_controller.rb index 55cda0cff1..9575a87ee4 100644 --- a/app/controllers/explore/groups_controller.rb +++ b/app/controllers/explore/groups_controller.rb @@ -1,7 +1,4 @@ class Explore::GroupsController < Explore::ApplicationController - skip_before_action :authenticate_user!, - :reject_blocked, :set_current_user_for_observers - def index @groups = GroupsFinder.new.execute(current_user) @groups = @groups.search(params[:search]) if params[:search].present? diff --git a/app/controllers/explore/projects_controller.rb b/app/controllers/explore/projects_controller.rb index 6c733c1ae4..a5aeaed66c 100644 --- a/app/controllers/explore/projects_controller.rb +++ b/app/controllers/explore/projects_controller.rb @@ -1,7 +1,4 @@ class Explore::ProjectsController < Explore::ApplicationController - skip_before_action :authenticate_user!, - :reject_blocked - def index @projects = ProjectsFinder.new.execute(current_user) @tags = @projects.tags_on(:tags) diff --git a/app/controllers/explore/snippets_controller.rb b/app/controllers/explore/snippets_controller.rb new file mode 100644 index 0000000000..b70ac51d06 --- /dev/null +++ b/app/controllers/explore/snippets_controller.rb @@ -0,0 +1,6 @@ +class Explore::SnippetsController < Explore::ApplicationController + def index + @snippets = SnippetsFinder.new.execute(current_user, filter: :all) + @snippets = @snippets.page(params[:page]).per(PER_PAGE) + end +end diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 279c6ef0f4..85bf44ee9a 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -14,6 +14,10 @@ class GroupsController < Groups::ApplicationController layout :determine_layout + def index + redirect_to (current_user ? dashboard_groups_path : explore_groups_path) + end + def new @group = Group.new end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index dafc11d070..540bfa9ac0 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -10,6 +10,10 @@ class ProjectsController < ApplicationController layout :determine_layout + def index + redirect_to (current_user ? root_path : explore_root_path) + end + def new @project = Project.new end diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index fdfe00dc13..a3aa86de5b 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -6,10 +6,10 @@ # # For users who haven't customized the setting, we simply delegate to # `DashboardController#show`, which is the default. -class RootController < DashboardController +class RootController < Dashboard::ProjectsController before_action :redirect_to_custom_dashboard, only: [:show] - def show + def index super end @@ -20,6 +20,7 @@ class RootController < DashboardController case current_user.dashboard when 'stars' + flash.keep redirect_to starred_dashboard_projects_path else return diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index 8e7e45c781..f5938da936 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -24,13 +24,9 @@ class SnippetsController < ApplicationController scope: params[:scope] }). page(params[:page]).per(PER_PAGE) - if @user == current_user - render 'current_user_index' - else - render 'user_index' - end + render 'index' else - @snippets = SnippetsFinder.new.execute(current_user, filter: :all).page(params[:page]).per(PER_PAGE) + redirect_to (current_user ? dashboard_snippets_path : explore_snippets_path) end end diff --git a/app/views/dashboard/_groups_head.html.haml b/app/views/dashboard/_groups_head.html.haml index dcd6c97d44..64bd356f54 100644 --- a/app/views/dashboard/_groups_head.html.haml +++ b/app/views/dashboard/_groups_head.html.haml @@ -1,7 +1,7 @@ %ul.center-top-menu - = nav_link(page: [dashboard_groups_path]) do + = nav_link(page: dashboard_groups_path) do = link_to dashboard_groups_path, title: 'Your groups', data: {placement: 'right'} do Your Groups - = nav_link(page: [explore_groups_path]) do + = nav_link(page: explore_groups_path) 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 13a5eae3cd..ed480b8caf 100644 --- a/app/views/dashboard/_projects_head.html.haml +++ b/app/views/dashboard/_projects_head.html.haml @@ -1,6 +1,6 @@ %ul.center-top-menu - = nav_link(path: ['dashboard#show', 'root#show']) do - = link_to dashboard_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do + = nav_link(path: ['projects#index', 'root#index']) do + = link_to dashboard_projects_path, title: 'Home', class: 'shortcuts-activity', data: {placement: 'right'} do Your Projects = nav_link(page: starred_dashboard_projects_path) do = link_to starred_dashboard_projects_path, title: 'Starred Projects', data: {placement: 'right'} do diff --git a/app/views/dashboard/_snippets_head.html.haml b/app/views/dashboard/_snippets_head.html.haml new file mode 100644 index 0000000000..0ae62d6f1b --- /dev/null +++ b/app/views/dashboard/_snippets_head.html.haml @@ -0,0 +1,7 @@ +%ul.center-top-menu + = nav_link(page: dashboard_snippets_path, html_options: {class: 'home'}) do + = link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do + Your Snippets + = nav_link(page: explore_snippets_path) do + = link_to explore_snippets_path, title: 'Explore snippets', data: {placement: 'right'} do + Explore Snippets diff --git a/app/views/dashboard/activity.html.haml b/app/views/dashboard/activity.html.haml index 3e24338af6..aa57df14c2 100644 --- a/app/views/dashboard/activity.html.haml +++ b/app/views/dashboard/activity.html.haml @@ -1,8 +1,10 @@ = 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") + = auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity") +- page_title "Activity" - header_title "Activity", activity_dashboard_path + = render 'dashboard/activity_head' %section.activities diff --git a/app/views/dashboard/_projects.html.haml b/app/views/dashboard/projects/_projects.html.haml similarity index 100% rename from app/views/dashboard/_projects.html.haml rename to app/views/dashboard/projects/_projects.html.haml diff --git a/app/views/dashboard/show.atom.builder b/app/views/dashboard/projects/index.atom.builder similarity index 52% rename from app/views/dashboard/show.atom.builder rename to app/views/dashboard/projects/index.atom.builder index e9a612231d..d2c5148684 100644 --- a/app/views/dashboard/show.atom.builder +++ b/app/views/dashboard/projects/index.atom.builder @@ -1,9 +1,9 @@ xml.instruct! xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do xml.title "Activity" - xml.link href: dashboard_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" - xml.link href: dashboard_url, rel: "alternate", type: "text/html" - xml.id dashboard_url + xml.link href: dashboard_projects_url(format: :atom, private_token: current_user.try(:private_token)), rel: "self", type: "application/atom+xml" + xml.link href: dashboard_projects_url, rel: "alternate", type: "text/html" + xml.id dashboard_projects_url xml.updated @events.maximum(:updated_at).strftime("%Y-%m-%dT%H:%M:%SZ") if @events.any? @events.each do |event| diff --git a/app/views/dashboard/show.html.haml b/app/views/dashboard/projects/index.html.haml similarity index 53% rename from app/views/dashboard/show.html.haml rename to app/views/dashboard/projects/index.html.haml index 1d5324e0d7..7a16b811f6 100644 --- a/app/views/dashboard/show.html.haml +++ b/app/views/dashboard/projects/index.html.haml @@ -1,8 +1,10 @@ = 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") + = auto_discovery_link_tag(:atom, dashboard_projects_url(format: :atom, private_token: current_user.private_token), title: "All activity") + +- page_title "Projects" +- header_title "Projects", root_path -- header_title "Projects", (current_user ? root_path : explore_root_path) = render 'dashboard/projects_head' - if @last_push diff --git a/app/views/dashboard/projects/starred.html.haml b/app/views/dashboard/projects/starred.html.haml index 2fd7a1cf16..339362701d 100644 --- a/app/views/dashboard/projects/starred.html.haml +++ b/app/views/dashboard/projects/starred.html.haml @@ -1,9 +1,10 @@ - page_title "Starred Projects" -- header_title "Projects", (current_user ? root_path : explore_root_path) +- header_title "Projects", projects_path + = render 'dashboard/projects_head' - if @projects.any? - = render 'dashboard/projects' + = render '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. diff --git a/app/views/dashboard/snippets/index.html.haml b/app/views/dashboard/snippets/index.html.haml new file mode 100644 index 0000000000..d3908062f4 --- /dev/null +++ b/app/views/dashboard/snippets/index.html.haml @@ -0,0 +1,38 @@ +- page_title "Snippets" +- header_title "Snippets", dashboard_snippets_path + += render 'dashboard/snippets_head' + +.gray-content-block + .pull-right + = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do + Add new snippet + + .oneline + Share code pastes with others out of git repository + +%ul.nav.nav-tabs.prepend-top-20 + = nav_tab :scope, nil do + = link_to dashboard_snippets_path do + All + %span.badge + = current_user.snippets.count + = nav_tab :scope, 'are_private' do + = link_to dashboard_snippets_path(scope: 'are_private') do + Private + %span.badge + = current_user.snippets.are_private.count + = nav_tab :scope, 'are_internal' do + = link_to dashboard_snippets_path(scope: 'are_internal') do + Internal + %span.badge + = current_user.snippets.are_internal.count + = nav_tab :scope, 'are_public' do + = link_to dashboard_snippets_path(scope: 'are_public') do + Public + %span.badge + = current_user.snippets.are_public.count + +.my-snippets + = render 'snippets/snippets' + diff --git a/app/views/explore/_head.html.haml b/app/views/explore/_head.html.haml new file mode 100644 index 0000000000..d8a5756078 --- /dev/null +++ b/app/views/explore/_head.html.haml @@ -0,0 +1,6 @@ +.explore-title + %h3 + Explore GitLab + %p.lead + Discover projects, groups and snippets. Share your projects with others + %br diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index e8a6752de8..83d4d321c8 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -1,7 +1,11 @@ -- page_title "Groups" -- header_title "Groups", (current_user ? dashboard_groups_path : explore_groups_path) +- page_title "Groups" +- header_title "Groups", dashboard_groups_path + - if current_user = render 'dashboard/groups_head' +- else + = render 'explore/head' + .gray-content-block.clearfix .pull-left = form_tag explore_groups_path, method: :get, class: 'form-inline form-tiny' do |f| diff --git a/app/views/explore/projects/index.html.haml b/app/views/explore/projects/index.html.haml index 9df5b3830a..67e38ca312 100644 --- a/app/views/explore/projects/index.html.haml +++ b/app/views/explore/projects/index.html.haml @@ -1,6 +1,11 @@ -- page_title "Projects" +- page_title "Projects" +- header_title "Projects", root_path + - if current_user = render 'dashboard/projects_head' +- else + = render 'explore/head' + .gray-content-block.clearfix = render 'filter' = render 'projects', projects: @projects diff --git a/app/views/explore/projects/starred.html.haml b/app/views/explore/projects/starred.html.haml index a9df32f3d7..596cb0a96c 100644 --- a/app/views/explore/projects/starred.html.haml +++ b/app/views/explore/projects/starred.html.haml @@ -1,6 +1,10 @@ -- page_title "Starred Projects" +- page_title "Projects" +- header_title "Projects", root_path + - if current_user = render 'dashboard/projects_head' +- else + = render 'explore/head' .explore-trending-block .gray-content-block diff --git a/app/views/explore/projects/trending.html.haml b/app/views/explore/projects/trending.html.haml index c1ef06f6cd..5ea6d81c5b 100644 --- a/app/views/explore/projects/trending.html.haml +++ b/app/views/explore/projects/trending.html.haml @@ -1,13 +1,11 @@ -- page_title "Trending Projects" +- page_title "Projects" +- header_title "Projects", root_path + - if current_user = render 'dashboard/projects_head' - else - .explore-title - %h3 - Explore GitLab - %p.lead - Discover projects and groups. Share your projects with others - %br + = render 'explore/head' + .explore-trending-block .gray-content-block .pull-right diff --git a/app/views/explore/snippets/index.html.haml b/app/views/explore/snippets/index.html.haml new file mode 100644 index 0000000000..7e4fa7d487 --- /dev/null +++ b/app/views/explore/snippets/index.html.haml @@ -0,0 +1,18 @@ +- page_title "Snippets" +- header_title "Snippets", snippets_path + +- if current_user + = render 'dashboard/snippets_head' +- else + = render 'explore/head' + +.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/snippets' diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index c1746676ae..68e5da571e 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -6,10 +6,14 @@ = brand_header_logo .gitlab-text-container %h3 GitLab + - if defined?(sidebar) && sidebar = render "layouts/nav/#{sidebar}" - elsif current_user = render 'layouts/nav/dashboard' + - else + = render 'layouts/nav/explore' + .collapse-nav = render partial: 'layouts/collapse_button' - if current_user diff --git a/app/views/layouts/explore.html.haml b/app/views/layouts/explore.html.haml index 9098554e6f..df65792be7 100644 --- a/app/views/layouts/explore.html.haml +++ b/app/views/layouts/explore.html.haml @@ -1,9 +1,5 @@ - page_title "Explore" -- if current_user - - unless @header_title - - header_title "Projects", (current_user ? root_path : explore_root_path) -- else +- unless current_user - header_title "Explore GitLab", explore_root_path -- sidebar "dashboard" = render template: "layouts/application" diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 0cf1c3d5d2..68f816b86a 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,31 +1,30 @@ %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 + = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do + = link_to root_path, title: 'Projects', data: {placement: 'right'} do = icon('home fw') %span Projects = nav_link(path: 'dashboard#activity') do - = link_to activity_dashboard_path, title: 'Activity', data: {placement: 'right'} do + = link_to activity_dashboard_path, class: 'shortcuts-activity', 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 + = link_to dashboard_groups_path, title: 'Groups', data: {placement: 'right'} do = icon('group fw') %span Groups - - if current_user - = nav_link(controller: :milestones) do - = link_to dashboard_milestones_path, title: 'Milestones', data: {placement: 'right'} do - = icon('clock-o fw') - %span - Milestones - = nav_link(path: 'dashboard#issues') do - = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues', data: {placement: 'right'} do - = icon('exclamation-circle fw') - %span - Issues - %span.count= current_user.assigned_issues.opened.count + = nav_link(controller: :milestones) do + = link_to dashboard_milestones_path, title: 'Milestones', data: {placement: 'right'} do + = icon('clock-o fw') + %span + Milestones + = nav_link(path: 'dashboard#issues') do + = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'shortcuts-issues', data: {placement: 'right'} do + = icon('exclamation-circle fw') + %span + Issues + %span.count= current_user.assigned_issues.opened.count = nav_link(path: 'dashboard#merge_requests') do = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'shortcuts-merge_requests', data: {placement: 'right'} do = icon('tasks fw') @@ -33,16 +32,15 @@ Merge Requests %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 + = link_to dashboard_snippets_path, title: 'Your snippets', data: {placement: 'right'} do = icon('clipboard fw') %span Snippets - - if current_user - = nav_link(controller: :profile) do - = link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do - = icon('user fw') - %span - Profile Settings + = nav_link(controller: :profile) do + = link_to profile_path, title: 'Profile settings', data: {placement: 'bottom'} do + = icon('user fw') + %span + 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/nav/_explore.html.haml b/app/views/layouts/nav/_explore.html.haml new file mode 100644 index 0000000000..21e565972a --- /dev/null +++ b/app/views/layouts/nav/_explore.html.haml @@ -0,0 +1,21 @@ +%ul.nav.nav-sidebar + = nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do + = link_to explore_root_path, title: 'Projects', data: {placement: 'right'} do + = icon('home fw') + %span + Projects + = nav_link(controller: :groups) do + = link_to explore_groups_path, title: 'Groups', data: {placement: 'right'} do + = icon('group fw') + %span + Groups + = nav_link(controller: :snippets) do + = link_to explore_snippets_path, title: 'Snippets', data: {placement: 'right'} do + = icon('clipboard fw') + %span + Snippets + = nav_link(controller: :help) do + = link_to help_path, title: 'Help', data: {placement: 'right'} do + = icon('question-circle fw') + %span + Help diff --git a/app/views/layouts/snippets.html.haml b/app/views/layouts/snippets.html.haml index d9c90d4fce..02ca3ee7a2 100644 --- a/app/views/layouts/snippets.html.haml +++ b/app/views/layouts/snippets.html.haml @@ -1,8 +1,3 @@ -- page_title 'Snippets' -- if current_user - - header_title "Snippets", user_snippets_path(current_user) -- else - - header_title 'Snippets', snippets_path -- sidebar "dashboard" +- header_title "Snippets", snippets_path = render template: "layouts/application" diff --git a/app/views/projects/activity.html.haml b/app/views/projects/activity.html.haml index 65674913bb..5f6e5f3b64 100644 --- a/app/views/projects/activity.html.haml +++ b/app/views/projects/activity.html.haml @@ -1 +1,2 @@ +- page_title "Activity" = render 'projects/activity' diff --git a/app/views/snippets/_head.html.haml b/app/views/snippets/_head.html.haml deleted file mode 100644 index 0adf6b91f2..0000000000 --- a/app/views/snippets/_head.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%ul.center-top-menu - = nav_link(page: user_snippets_path(current_user), html_options: {class: 'home'}) do - = link_to user_snippets_path(current_user), title: 'Your snippets', data: {placement: 'right'} do - Your Snippets - = nav_link(page: snippets_path) do - = link_to snippets_path, title: 'Explore snippets', data: {placement: 'right'} do - Explore Snippets diff --git a/app/views/snippets/current_user_index.html.haml b/app/views/snippets/current_user_index.html.haml deleted file mode 100644 index d704407c4d..0000000000 --- a/app/views/snippets/current_user_index.html.haml +++ /dev/null @@ -1,36 +0,0 @@ -- page_title "Your Snippets" -= render 'head' - -.gray-content-block - .pull-right - = link_to new_snippet_path, class: "btn btn-new", title: "New Snippet" do - Add new snippet - - .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 - %span.badge - = @user.snippets.count - = nav_tab :scope, 'are_private' do - = link_to user_snippets_path(@user, scope: 'are_private') do - Private - %span.badge - = @user.snippets.are_private.count - = nav_tab :scope, 'are_internal' do - = link_to user_snippets_path(@user, scope: 'are_internal') do - Internal - %span.badge - = @user.snippets.are_internal.count - = nav_tab :scope, 'are_public' do - = link_to user_snippets_path(@user, scope: 'are_public') do - Public - %span.badge - = @user.snippets.are_public.count - -.my-snippets - = render 'snippets' - diff --git a/app/views/snippets/index.html.haml b/app/views/snippets/index.html.haml index 3b62dd2a6e..7e4918a608 100644 --- a/app/views/snippets/index.html.haml +++ b/app/views/snippets/index.html.haml @@ -1,15 +1,13 @@ -- page_title "Public Snippets" -- if current_user - = render 'head' +- page_title "By #{@user.name}", "Snippets" -.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 +%ol.breadcrumb + %li + = link_to snippets_path do + Snippets + %li + = @user.name + .pull-right.hidden-xs + = link_to user_path(@user) do + #{@user.name} profile page = render 'snippets' - diff --git a/app/views/snippets/show.html.haml b/app/views/snippets/show.html.haml index aed00f9cae..97374e073d 100644 --- a/app/views/snippets/show.html.haml +++ b/app/views/snippets/show.html.haml @@ -20,10 +20,10 @@ .back-link - if @snippet.author == current_user - = link_to user_snippets_path(current_user) do + = link_to dashboard_snippets_path do ← your snippets - else - = link_to snippets_path do + = link_to explore_snippets_path do ← explore snippets .file-holder diff --git a/app/views/snippets/user_index.html.haml b/app/views/snippets/user_index.html.haml deleted file mode 100644 index 7af5352da3..0000000000 --- a/app/views/snippets/user_index.html.haml +++ /dev/null @@ -1,13 +0,0 @@ -- page_title "Snippets", @user.name - -%ol.breadcrumb - %li - = link_to snippets_path do - Snippets - %li - = @user.name - .pull-right.hidden-xs - = link_to user_path(@user) do - #{@user.name} profile page - -= render 'snippets' diff --git a/config/routes.rb b/config/routes.rb index 25c286b308..720aee2d2a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -134,6 +134,7 @@ Gitlab::Application.routes.draw do end resources :groups, only: [:index] + resources :snippets, only: [:index] root to: 'projects#trending' end @@ -252,24 +253,25 @@ Gitlab::Application.routes.draw do # # Dashboard Area # - resource :dashboard, controller: 'dashboard', only: [:show] do - member do - get :issues - get :merge_requests - get :activity - end + resource :dashboard, controller: 'dashboard', only: [] do + get :issues + get :merge_requests + get :activity scope module: :dashboard do resources :milestones, only: [:index, :show] resources :groups, only: [:index] + resources :snippets, only: [:index] - resources :projects, only: [] do + resources :projects, only: [:index] do collection do get :starred end end end + + root to: "dashboard/projects#index" end # @@ -293,7 +295,7 @@ Gitlab::Application.routes.draw do end end - resources :projects, constraints: { id: /[^\/]+/ }, only: [:new, :create] + resources :projects, constraints: { id: /[^\/]+/ }, only: [:index, :new, :create] devise_for :users, controllers: { omniauth_callbacks: :omniauth_callbacks, registrations: :registrations , passwords: :passwords, sessions: :sessions, confirmations: :confirmations } @@ -301,7 +303,7 @@ Gitlab::Application.routes.draw do get '/users/auth/:provider/omniauth_error' => 'omniauth_callbacks#omniauth_error', as: :omniauth_error end - root to: "root#show" + root to: "root#index" # # Project Area diff --git a/features/steps/snippets/user.rb b/features/steps/snippets/user.rb index 007fcb2893..dea3256229 100644 --- a/features/steps/snippets/user.rb +++ b/features/steps/snippets/user.rb @@ -4,7 +4,7 @@ class Spinach::Features::SnippetsUser < Spinach::FeatureSteps include SharedSnippet step 'I visit my snippets page' do - visit user_snippets_path(current_user) + visit dashboard_snippets_path end step 'I should see "Personal snippet one" in snippets' do From 46511558815306cf76b0c83637bee018f3caa926 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 16:11:41 +0200 Subject: [PATCH 162/247] Make system note different from regular comments Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/notes.scss | 13 +++++++++++++ app/views/projects/notes/_discussion.html.haml | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index bd9e91a351..2544356a5f 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -14,6 +14,19 @@ ul.notes { margin: 0px; padding: 0px; + .system-note { + font-size: 14px; + padding-top: 10px; + padding-bottom: 10px; + background: #f8fafc; + + .timeline-icon { + .avatar { + visibility: hidden; + } + } + } + .discussion-header, .note-header { @extend .cgray; diff --git a/app/views/projects/notes/_discussion.html.haml b/app/views/projects/notes/_discussion.html.haml index b8068835b3..6daf2d15d0 100644 --- a/app/views/projects/notes/_discussion.html.haml +++ b/app/views/projects/notes/_discussion.html.haml @@ -1,5 +1,5 @@ - note = discussion_notes.first -.timeline-entry +.timeline-entry.prepend-top-default .timeline-entry-inner .timeline-icon = link_to user_path(note.author) do From 1489d225d6763b0fdc3f418692e646587e06938a Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 15:14:14 +0100 Subject: [PATCH 163/247] Move partial to right place and fix tests. --- app/controllers/groups_controller.rb | 2 +- app/controllers/projects_controller.rb | 2 +- app/controllers/snippets_controller.rb | 2 +- .../{ => projects}/_zero_authorized_projects.html.haml | 0 spec/controllers/root_controller_spec.rb | 8 ++++---- spec/routing/routing_spec.rb | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) rename app/views/dashboard/{ => projects}/_zero_authorized_projects.html.haml (100%) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 85bf44ee9a..486c6b2819 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -15,7 +15,7 @@ class GroupsController < Groups::ApplicationController layout :determine_layout def index - redirect_to (current_user ? dashboard_groups_path : explore_groups_path) + redirect_to(current_user ? dashboard_groups_path : explore_groups_path) end def new diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 540bfa9ac0..0bbaa93b0d 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -11,7 +11,7 @@ class ProjectsController < ApplicationController layout :determine_layout def index - redirect_to (current_user ? root_path : explore_root_path) + redirect_to(current_user ? root_path : explore_root_path) end def new diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index f5938da936..9f9f9a92f1 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -26,7 +26,7 @@ class SnippetsController < ApplicationController render 'index' else - redirect_to (current_user ? dashboard_snippets_path : explore_snippets_path) + redirect_to(current_user ? dashboard_snippets_path : explore_snippets_path) end end diff --git a/app/views/dashboard/_zero_authorized_projects.html.haml b/app/views/dashboard/projects/_zero_authorized_projects.html.haml similarity index 100% rename from app/views/dashboard/_zero_authorized_projects.html.haml rename to app/views/dashboard/projects/_zero_authorized_projects.html.haml diff --git a/spec/controllers/root_controller_spec.rb b/spec/controllers/root_controller_spec.rb index abbbf6855f..64dfe8f34e 100644 --- a/spec/controllers/root_controller_spec.rb +++ b/spec/controllers/root_controller_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe RootController do - describe 'GET show' do + describe 'GET index' do context 'with a user' do let(:user) { create(:user) } @@ -16,15 +16,15 @@ describe RootController do end it 'redirects to their specified dashboard' do - get :show + get :index expect(response).to redirect_to starred_dashboard_projects_path end end context 'who uses the default dashboard setting' do it 'renders the default dashboard' do - get :show - expect(response).to render_template 'dashboard/show' + get :index + expect(response).to render_template 'dashboard/projects/index' end end end diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb index dd04582669..dfa18f69e0 100644 --- a/spec/routing/routing_spec.rb +++ b/spec/routing/routing_spec.rb @@ -206,7 +206,7 @@ end # dashboard_merge_requests GET /dashboard/merge_requests(.:format) dashboard#merge_requests describe DashboardController, "routing" do it "to #index" do - expect(get("/dashboard")).to route_to('dashboard#show') + expect(get("/dashboard")).to route_to('dashboard/projects#index') end it "to #issues" do @@ -220,8 +220,8 @@ end # root / root#show describe RootController, 'routing' do - it 'to #show' do - expect(get('/')).to route_to('root#show') + it 'to #index' do + expect(get('/')).to route_to('root#index') end end From e9cf79da2f90a33d1058a1735d8a71a38df8f442 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 16:42:18 +0200 Subject: [PATCH 164/247] Style merge request page Signed-off-by: Dmitriy Zaporozhets --- .../stylesheets/pages/merge_requests.scss | 25 +++++++++++++------ .../projects/merge_requests/_show.html.haml | 3 --- .../widget/open/_accept.html.haml | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index a8db3d401b..d8c8e5ad0a 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -3,10 +3,10 @@ * */ .mr-state-widget { - background: #FAFAFA; + background: #f8fafc; margin-bottom: 20px; - color: #666; - border: 1px solid #e5e5e5; + color: $gl-gray; + border: 1px solid #eef0f2; @include box-shadow(0 1px 1px rgba(0, 0, 0, 0.05)); @include border-radius(3px); @@ -29,6 +29,14 @@ padding: 5px; line-height: 20px; + &.right { + float: right; + padding-top: 12px; + a { + color: $gl-gray; + } + } + .remove_source_checkbox { margin: 0; } @@ -36,7 +44,7 @@ } .ci_widget { - border-bottom: 1px solid #EEE; + border-bottom: 1px solid #eef0f2; i { margin-right: 4px; @@ -91,9 +99,12 @@ .merge-request .merge-request-tabs{ @include nav-menu; - margin-bottom: -15px; - margin-top: 26px; - text-align: left; + margin: -$gl-padding; + padding: $gl-padding; + text-align: center; + border-top: 1px solid #e7e9ed; + margin-top: 18px; + margin-bottom: 3px; } .mr_source_commit, diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index 721993fb27..61e04dce5a 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -40,17 +40,14 @@ %ul.merge-request-tabs %li.notes-tab = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#notes', action: 'notes', toggle: 'tab'} do - = icon('comments') Discussion %span.badge= @merge_request.mr_and_commit_notes.user.count %li.commits-tab = link_to commits_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#commits', action: 'commits', toggle: 'tab'} do - = icon('history') Commits %span.badge= @commits.size %li.diffs-tab = link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: {target: '#diffs', action: 'diffs', toggle: 'tab'} do - = icon('list-alt') Changes %span.badge= @merge_request.diffs.size diff --git a/app/views/projects/merge_requests/widget/open/_accept.html.haml b/app/views/projects/merge_requests/widget/open/_accept.html.haml index b61e193fc4..613525437a 100644 --- a/app/views/projects/merge_requests/widget/open/_accept.html.haml +++ b/app/views/projects/merge_requests/widget/open/_accept.html.haml @@ -9,7 +9,7 @@ = label_tag :should_remove_source_branch, class: "remove_source_checkbox" do = check_box_tag :should_remove_source_branch Remove source branch - .accept-control + .accept-control.right = link_to "#", class: "modify-merge-commit-link js-toggle-button" do = icon('edit') Modify commit message From 86556a079e34eb1267e63f7b39cc018665e21bfc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 8 Sep 2015 17:22:26 +0200 Subject: [PATCH 165/247] Improve diff UI and mr compare page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/commit.scss | 8 -------- app/assets/stylesheets/pages/diff.scss | 10 ++++++++-- app/views/projects/diffs/_diffs.html.haml | 4 ++-- app/views/projects/diffs/_stats.html.haml | 2 +- .../projects/merge_requests/_new_compare.html.haml | 2 +- .../projects/merge_requests/_new_submit.html.haml | 4 +--- 6 files changed, 13 insertions(+), 17 deletions(-) diff --git a/app/assets/stylesheets/pages/commit.scss b/app/assets/stylesheets/pages/commit.scss index f9e9b024d4..051ca3792c 100644 --- a/app/assets/stylesheets/pages/commit.scss +++ b/app/assets/stylesheets/pages/commit.scss @@ -26,14 +26,6 @@ margin-top: 10px; } -.commit-stat-summary { - color: #666; - font-size: 14px; - font-weight: normal; - padding: 3px 0; - margin-bottom: 10px; -} - .commit-info-row { margin-bottom: 10px; .avatar { diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index f816d32a93..487b600e31 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -1,6 +1,8 @@ .diff-file { - border: 1px solid $border-color; - margin-bottom: 1em; + margin-left: -16px; + margin-right: -16px; + border: none; + border-bottom: 1px solid #E7E9EE; .diff-header { position: relative; @@ -367,3 +369,7 @@ white-space: pre-wrap; } +.inline-parallel-buttons { + float: right; + margin-top: -5px; +} diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml index 30943f49bb..2f24dc7c90 100644 --- a/app/views/projects/diffs/_diffs.html.haml +++ b/app/views/projects/diffs/_diffs.html.haml @@ -1,8 +1,8 @@ - if params[:view] == 'parallel' - fluid_layout true -.prepend-top-20.append-bottom-20 - .pull-right +.gray-content-block.second-block + .inline-parallel-buttons .btn-group = inline_diff_btn = parallel_diff_btn diff --git a/app/views/projects/diffs/_stats.html.haml b/app/views/projects/diffs/_stats.html.haml index 1625930615..c4d7f26430 100644 --- a/app/views/projects/diffs/_stats.html.haml +++ b/app/views/projects/diffs/_stats.html.haml @@ -10,7 +10,7 @@ and %strong.cred #{@commit.stats.deletions} deletions .file-stats.js-toggle-content.hide - %ul.bordered-list + %ul - diffs.each_with_index do |diff, i| %li - if diff.deleted_file diff --git a/app/views/projects/merge_requests/_new_compare.html.haml b/app/views/projects/merge_requests/_new_compare.html.haml index 7709330611..452006162d 100644 --- a/app/views/projects/merge_requests/_new_compare.html.haml +++ b/app/views/projects/merge_requests/_new_compare.html.haml @@ -37,7 +37,7 @@ %h4 Compare failed %p We can't compare selected branches. It may be because of huge diff. Please try again or select different branches. - else - .light-well + .light-well.append-bottom-10 .center %h4 There isn't anything to merge. diff --git a/app/views/projects/merge_requests/_new_submit.html.haml b/app/views/projects/merge_requests/_new_submit.html.haml index 76f44211da..46aeecd873 100644 --- a/app/views/projects/merge_requests/_new_submit.html.haml +++ b/app/views/projects/merge_requests/_new_submit.html.haml @@ -18,15 +18,13 @@ = f.hidden_field :target_branch .mr-compare.merge-request - %ul.nav.nav-tabs.merge-request-tabs + %ul.merge-request-tabs %li.commits-tab = link_to url_for(params), data: {target: '#commits', action: 'commits', toggle: 'tab'} do - = icon('history') Commits %span.badge= @commits.size %li.diffs-tab.active = link_to url_for(params), data: {target: '#diffs', action: 'diffs', toggle: 'tab'} do - = icon('list-alt') Changes %span.badge= @diffs.size From f87f6480b2ff6a80b50aa275f9c5d60c30d75b40 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Tue, 8 Sep 2015 17:14:02 +0100 Subject: [PATCH 166/247] Use new routing helper --- app/controllers/invites_controller.rb | 4 ++-- app/controllers/projects/project_members_controller.rb | 2 +- app/controllers/projects_controller.rb | 2 +- app/views/dashboard/_activities.html.haml | 2 +- features/steps/shared/paths.rb | 2 +- spec/features/atom/dashboard_spec.rb | 4 ++-- spec/features/profiles/preferences_spec.rb | 2 +- spec/features/security/dashboard_access_spec.rb | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/controllers/invites_controller.rb b/app/controllers/invites_controller.rb index eb3c823353..8ef10a17f5 100644 --- a/app/controllers/invites_controller.rb +++ b/app/controllers/invites_controller.rb @@ -24,7 +24,7 @@ class InvitesController < ApplicationController path = if current_user - dashboard_path + dashboard_projects_path else new_user_session_path end @@ -73,7 +73,7 @@ class InvitesController < ApplicationController path = group_path(group) else label = "who knows what" - path = dashboard_path + path = dashboard_projects_path end [label, path] diff --git a/app/controllers/projects/project_members_controller.rb b/app/controllers/projects/project_members_controller.rb index b82b6f45d5..cf73bc01c8 100644 --- a/app/controllers/projects/project_members_controller.rb +++ b/app/controllers/projects/project_members_controller.rb @@ -78,7 +78,7 @@ class Projects::ProjectMembersController < Projects::ApplicationController @project.project_members.find_by(user_id: current_user).destroy respond_to do |format| - format.html { redirect_to dashboard_path } + format.html { redirect_to dashboard_projects_path } format.js { render nothing: true } end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 0bbaa93b0d..f4d1a828aa 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -109,7 +109,7 @@ class ProjectsController < ApplicationController if request.referer.include?('/admin') redirect_to admin_namespaces_projects_path else - redirect_to dashboard_path + redirect_to dashboard_projects_path end rescue Projects::DestroyService::DestroyError => ex redirect_to edit_project_path(@project), alert: ex.message diff --git a/app/views/dashboard/_activities.html.haml b/app/views/dashboard/_activities.html.haml index 1db56542af..19d919f9b6 100644 --- a/app/views/dashboard/_activities.html.haml +++ b/app/views/dashboard/_activities.html.haml @@ -5,7 +5,7 @@ - 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 + = link_to dashboard_projects_path(:atom, { private_token: current_user.private_token }), class: 'rss-btn' do %i.fa.fa-rss = render 'shared/event_filter' diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index b4deccb652..2ec126e1e9 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -68,7 +68,7 @@ module SharedPaths # ---------------------------------------- step 'I visit dashboard page' do - visit dashboard_path + visit dashboard_projects_path end step 'I visit dashboard activity page' do diff --git a/spec/features/atom/dashboard_spec.rb b/spec/features/atom/dashboard_spec.rb index ad157d742f..f81a3c117f 100644 --- a/spec/features/atom/dashboard_spec.rb +++ b/spec/features/atom/dashboard_spec.rb @@ -6,7 +6,7 @@ describe "Dashboard Feed", feature: true do context "projects atom feed via private token" do it "should render projects atom feed" do - visit dashboard_path(:atom, private_token: user.private_token) + visit dashboard_projects_path(:atom, private_token: user.private_token) expect(body).to have_selector('feed title') end end @@ -20,7 +20,7 @@ describe "Dashboard Feed", feature: true do project.team << [user, :master] issue_event(issue, user) note_event(note, user) - visit dashboard_path(:atom, private_token: user.private_token) + visit dashboard_projects_path(:atom, private_token: user.private_token) end it "should have issue opened event" do diff --git a/spec/features/profiles/preferences_spec.rb b/spec/features/profiles/preferences_spec.rb index 9bc6145dda..8f645438cf 100644 --- a/spec/features/profiles/preferences_spec.rb +++ b/spec/features/profiles/preferences_spec.rb @@ -70,7 +70,7 @@ describe 'Profile > Preferences', feature: true do expect(page.current_path).to eq starred_dashboard_projects_path click_link 'Your Projects' - expect(page.current_path).to eq dashboard_path + expect(page.current_path).to eq dashboard_projects_path end end diff --git a/spec/features/security/dashboard_access_spec.rb b/spec/features/security/dashboard_access_spec.rb index c38cddbb90..0301913941 100644 --- a/spec/features/security/dashboard_access_spec.rb +++ b/spec/features/security/dashboard_access_spec.rb @@ -4,7 +4,7 @@ describe "Dashboard access", feature: true do include AccessMatchers describe "GET /dashboard" do - subject { dashboard_path } + subject { dashboard_projects_path } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } From 983a102bd028bf7a6335b6674059eb004d4171f3 Mon Sep 17 00:00:00 2001 From: Patricio Cano Date: Tue, 8 Sep 2015 12:28:28 -0500 Subject: [PATCH 167/247] Added meta tag for referrer, so that only the origin is sent to third party sites, instead of the entire URL, thus avoiding the leak of sensitive information like password reset tokens. --- app/views/layouts/_head.html.haml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index 397649dacf..c3b137e3dd 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -3,6 +3,7 @@ %meta{charset: "utf-8"} %meta{'http-equiv' => 'X-UA-Compatible', content: 'IE=edge'} %meta{content: "GitLab Community Edition", name: "description"} + %meta{name: 'referrer', content: 'origin'} %title= page_title From 4d6f8a6aee345d12d81f03f8dc1dfdfc2e3bd777 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 8 Sep 2015 13:31:54 -0400 Subject: [PATCH 168/247] Bump gitlab-shell to v2.6.5 --- GITLAB_SHELL_VERSION | 2 +- doc/install/installation.md | 2 +- doc/update/6.x-or-7.x-to-7.14.md | 4 ++-- doc/update/7.13-to-7.14.md | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index 2714f5313a..57cf282ebb 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -2.6.4 +2.6.5 diff --git a/doc/install/installation.md b/doc/install/installation.md index 52031e9b9a..ee13b0f253 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -299,7 +299,7 @@ We recommend using a PostgreSQL database. For MySQL check [MySQL setup guide](da GitLab Shell is an SSH access and repository management software developed specially for GitLab. # Run the installation task for gitlab-shell (replace `REDIS_URL` if needed): - sudo -u git -H bundle exec rake gitlab:shell:install[v2.6.3] REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production + sudo -u git -H bundle exec rake gitlab:shell:install[v2.6.5] REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production # By default, the gitlab-shell config is generated from your main GitLab config. # You can review (and modify) the gitlab-shell config as follows: diff --git a/doc/update/6.x-or-7.x-to-7.14.md b/doc/update/6.x-or-7.x-to-7.14.md index a1488474f6..5bc1f84270 100644 --- a/doc/update/6.x-or-7.x-to-7.14.md +++ b/doc/update/6.x-or-7.x-to-7.14.md @@ -127,7 +127,7 @@ sudo apt-get install nodejs ```bash cd /home/git/gitlab-shell sudo -u git -H git fetch -sudo -u git -H git checkout v2.6.4 +sudo -u git -H git checkout v2.6.5 ``` ## 7. Install libs, migrations, etc. @@ -167,7 +167,7 @@ git diff 6-0-stable:config/gitlab.yml.example 7.14-stable:config/gitlab.yml.exam * Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-14-stable/config/gitlab.yml.example but with your settings. * Make `/home/git/gitlab/config/unicorn.rb` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-14-stable/config/unicorn.rb.example but with your settings. -* Make `/home/git/gitlab-shell/config.yml` the same as https://gitlab.com/gitlab-org/gitlab-shell/blob/v2.6.0/config.yml.example but with your settings. +* Make `/home/git/gitlab-shell/config.yml` the same as https://gitlab.com/gitlab-org/gitlab-shell/blob/v2.6.5/config.yml.example but with your settings. * Copy rack attack middleware config ```bash diff --git a/doc/update/7.13-to-7.14.md b/doc/update/7.13-to-7.14.md index 7c2d3f4498..6dd9727fb4 100644 --- a/doc/update/7.13-to-7.14.md +++ b/doc/update/7.13-to-7.14.md @@ -63,7 +63,7 @@ sudo -u git -H git checkout 7-14-stable-ee ```bash cd /home/git/gitlab-shell sudo -u git -H git fetch -sudo -u git -H git checkout v2.6.4 +sudo -u git -H git checkout v2.6.5 ``` ### 5. Install libs, migrations, etc. From e156f42079ebf8247b6a39fa6314d4d5c6b73d12 Mon Sep 17 00:00:00 2001 From: Jared Szechy Date: Tue, 4 Aug 2015 18:21:12 -0400 Subject: [PATCH 169/247] FogBugz project import --- CHANGELOG | 1 + Gemfile | 4 + Gemfile.lock | 6 + app/controllers/application_controller.rb | 7 +- app/controllers/import/fogbugz_controller.rb | 106 +++++++ app/models/application_setting.rb | 2 +- app/models/project.rb | 2 + app/services/projects/download_service.rb | 43 +++ app/views/import/fogbugz/new.html.haml | 25 ++ .../import/fogbugz/new_user_map.html.haml | 49 +++ app/views/import/fogbugz/status.html.haml | 51 +++ app/views/projects/new.html.haml | 5 + app/workers/repository_import_worker.rb | 35 +- config/initializers/1_settings.rb | 2 +- config/routes.rb | 9 + doc/workflow/importing/README.md | 1 + .../fogbugz_import_finished.png | Bin 0 -> 53276 bytes .../fogbugz_importer/fogbugz_import_login.png | Bin 0 -> 44444 bytes .../fogbugz_import_select_fogbogz.png | Bin 0 -> 35415 bytes .../fogbugz_import_select_project.png | Bin 0 -> 62552 bytes .../fogbugz_import_user_map.png | Bin 0 -> 157856 bytes .../importing/import_projects_from_fogbugz.md | 29 ++ lib/gitlab/fogbugz_import/client.rb | 56 ++++ lib/gitlab/fogbugz_import/importer.rb | 298 ++++++++++++++++++ lib/gitlab/fogbugz_import/project_creator.rb | 38 +++ lib/gitlab/fogbugz_import/repository.rb | 31 ++ lib/gitlab/import_sources.rb | 1 + .../import/fogbugz_controller_spec.rb | 39 +++ .../projects/download_service_spec.rb | 65 ++++ 29 files changed, 889 insertions(+), 16 deletions(-) create mode 100644 app/controllers/import/fogbugz_controller.rb create mode 100644 app/services/projects/download_service.rb create mode 100644 app/views/import/fogbugz/new.html.haml create mode 100644 app/views/import/fogbugz/new_user_map.html.haml create mode 100644 app/views/import/fogbugz/status.html.haml create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_finished.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_login.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_select_fogbogz.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_select_project.png create mode 100644 doc/workflow/importing/fogbugz_importer/fogbugz_import_user_map.png create mode 100644 doc/workflow/importing/import_projects_from_fogbugz.md create mode 100644 lib/gitlab/fogbugz_import/client.rb create mode 100644 lib/gitlab/fogbugz_import/importer.rb create mode 100644 lib/gitlab/fogbugz_import/project_creator.rb create mode 100644 lib/gitlab/fogbugz_import/repository.rb create mode 100644 spec/controllers/import/fogbugz_controller_spec.rb create mode 100644 spec/services/projects/download_service_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 247eb1e364..dd48bab978 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -47,6 +47,7 @@ v 7.14.1 - 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) - Ability to enable SSL verification for Webhooks + - Add FogBugz project import (Jared Szechy) v 7.14.0 - Fix bug where non-project members of the target project could set labels on new merge requests. diff --git a/Gemfile b/Gemfile index cca8fc38e5..d609ff6610 100644 --- a/Gemfile +++ b/Gemfile @@ -157,6 +157,9 @@ gem "slack-notifier", "~> 1.0.0" # Asana integration gem 'asana', '~> 0.0.6' +# FogBugz integration +gem 'ruby-fogbugz' + # d3 gem 'd3_rails', '~> 3.5.5' @@ -259,6 +262,7 @@ group :test do gem 'email_spec', '~> 1.6.0' gem 'webmock', '~> 1.21.0' gem 'test_after_commit' + gem 'sham_rack' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 2df318f338..dce7e4964a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -575,6 +575,8 @@ GEM powerpack (~> 0.0.6) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.4) + ruby-fogbugz (0.1.1) + crack ruby-progressbar (1.7.1) ruby-saml (1.0.0) nokogiri (>= 1.5.10) @@ -609,6 +611,8 @@ GEM thor (~> 0.14) settingslogic (2.0.9) sexp_processor (4.4.5) + sham_rack (1.3.6) + rack shoulda-matchers (2.8.0) activesupport (>= 3.0.0) sidekiq (3.3.0) @@ -845,12 +849,14 @@ DEPENDENCIES rqrcode-rails3 rspec-rails (~> 3.3.0) rubocop (= 0.28.0) + ruby-fogbugz sanitize (~> 2.0) sass-rails (~> 4.0.5) sdoc seed-fu select2-rails (~> 3.5.9) settingslogic + sham_rack shoulda-matchers (~> 2.8.0) sidekiq (~> 3.3) sidetiq (= 0.6.3) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cb1cf13d34..4c112534ae 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,5 @@ require 'gon' +require 'fogbugz' class ApplicationController < ActionController::Base include Gitlab::CurrentSettings @@ -20,7 +21,7 @@ class ApplicationController < ActionController::Base protect_from_forgery with: :exception helper_method :abilities, :can?, :current_application_settings - helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :git_import_enabled? + helper_method :import_sources_enabled?, :github_import_enabled?, :github_import_configured?, :gitlab_import_enabled?, :gitlab_import_configured?, :bitbucket_import_enabled?, :bitbucket_import_configured?, :gitorious_import_enabled?, :google_code_import_enabled?, :fogbugz_import_enabled?, :git_import_enabled? rescue_from Encoding::CompatibilityError do |exception| log_exception(exception) @@ -337,6 +338,10 @@ class ApplicationController < ActionController::Base current_application_settings.import_sources.include?('google_code') end + def fogbugz_import_enabled? + current_application_settings.import_sources.include?('fogbugz') + end + def git_import_enabled? current_application_settings.import_sources.include?('git') end diff --git a/app/controllers/import/fogbugz_controller.rb b/app/controllers/import/fogbugz_controller.rb new file mode 100644 index 0000000000..bda534fb4d --- /dev/null +++ b/app/controllers/import/fogbugz_controller.rb @@ -0,0 +1,106 @@ +class Import::FogbugzController < Import::BaseController + before_action :verify_fogbugz_import_enabled + before_action :user_map, only: [:new_user_map, :create_user_map] + + # Doesn't work yet due to bug in ruby-fogbugz, see below + rescue_from Fogbugz::AuthenticationException, with: :fogbugz_unauthorized + + def new + + end + + def callback + begin + res = Gitlab::FogbugzImport::Client.new(import_params.symbolize_keys) + rescue + # Needed until https://github.com/firmafon/ruby-fogbugz/pull/9 is merged + return redirect_to :back, alert: 'Could not authenticate with FogBugz, check your URL, email, and password' + end + session[:fogbugz_token] = res.get_token + session[:fogbugz_uri] = params[:uri] + + redirect_to new_user_map_import_fogbugz_path + end + + def new_user_map + + end + + def create_user_map + user_map = params[:users] + + unless user_map.is_a?(Hash) && user_map.all? { |k, v| !v[:name].blank? } + flash.now[:alert] = 'All users must have a name.' + + render 'new_user_map' and return + end + + session[:fogbugz_user_map] = user_map + + flash[:notice] = 'The user map has been saved. Continue by selecting the projects you want to import.' + + redirect_to status_import_fogbugz_path + end + + def status + unless client.valid? + return redirect_to new_import_fogbugz_path + end + + @repos = client.repos + + @already_added_projects = current_user.created_projects.where(import_type: 'fogbugz') + already_added_projects_names = @already_added_projects.pluck(:import_source) + + @repos.reject! { |repo| already_added_projects_names.include? repo.name } + end + + def jobs + jobs = current_user.created_projects.where(import_type: 'fogbugz').to_json(only: [:id, :import_status]) + render json: jobs + end + + def create + @repo_id = params[:repo_id] + repo = client.repo(@repo_id) + fb_session = { uri: session[:fogbugz_uri], token: session[:fogbugz_token] } + @target_namespace = current_user.namespace + @project_name = repo.name + + namespace = @target_namespace + + umap = session[:fogbugz_user_map] || client.user_map + + @project = Gitlab::FogbugzImport::ProjectCreator.new(repo, fb_session, namespace, current_user, umap).execute + end + + private + + def client + @client ||= Gitlab::FogbugzImport::Client.new(token: session[:fogbugz_token], uri: session[:fogbugz_uri]) + end + + def user_map + @user_map ||= begin + user_map = client.user_map + + stored_user_map = session[:fogbugz_user_map] + user_map.update(stored_user_map) if stored_user_map + + user_map + end + end + + def fogbugz_unauthorized(exception) + flash[:alert] = exception.message + redirect_to new_import_fogbugz_path + end + + def import_params + params.permit(:uri, :email, :password) + end + + def verify_fogbugz_import_enabled + not_found! unless fogbugz_import_enabled? + end +end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 8f27e35d72..c8841178e9 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -83,7 +83,7 @@ class ApplicationSetting < ActiveRecord::Base default_project_visibility: Settings.gitlab.default_projects_features['visibility_level'], default_snippet_visibility: Settings.gitlab.default_projects_features['visibility_level'], restricted_signup_domains: Settings.gitlab['restricted_signup_domains'], - import_sources: ['github','bitbucket','gitlab','gitorious','google_code','git'] + import_sources: ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'] ) end diff --git a/app/models/project.rb b/app/models/project.rb index 8e33a4b2f0..c2d7fa5fcb 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -43,6 +43,8 @@ class Project < ActiveRecord::Base extend Gitlab::ConfigHelper extend Enumerize + UNKNOWN_IMPORT_URL = 'http://unknown.git' + default_value_for :archived, false default_value_for :visibility_level, gitlab_config_features.visibility_level default_value_for :issues_enabled, gitlab_config_features.issues diff --git a/app/services/projects/download_service.rb b/app/services/projects/download_service.rb new file mode 100644 index 0000000000..99f22293d0 --- /dev/null +++ b/app/services/projects/download_service.rb @@ -0,0 +1,43 @@ +module Projects + class DownloadService < BaseService + + WHITELIST = [ + /^[^.]+\.fogbugz.com$/ + ] + + def initialize(project, url) + @project, @url = project, url + end + + def execute + return nil unless valid_url?(@url) + + uploader = FileUploader.new(@project) + uploader.download!(@url) + uploader.store! + + filename = uploader.image? ? uploader.file.basename : uploader.file.filename + + { + 'alt' => filename, + 'url' => uploader.secure_url, + 'is_image' => uploader.image? + } + end + + private + + def valid_url?(url) + url && http?(url) && valid_domain?(url) + end + + def http?(url) + url =~ /\A#{URI::regexp(['http', 'https'])}\z/ + end + + def valid_domain?(url) + host = URI.parse(url).host + WHITELIST.any? { |entry| entry === host } + end + end +end diff --git a/app/views/import/fogbugz/new.html.haml b/app/views/import/fogbugz/new.html.haml new file mode 100644 index 0000000000..e1bb88ca4e --- /dev/null +++ b/app/views/import/fogbugz/new.html.haml @@ -0,0 +1,25 @@ +- page_title "FogBugz Import" +%h3.page-title + %i.fa.fa-bug + Import projects from FogBugz +%hr + += form_tag callback_import_fogbugz_path, class: 'form-horizontal' do + %p + To get started you enter your FogBugz URL and login information below. + In the next steps, you'll be able to map users and select the projects + you want to import. + .form-group + = label_tag :uri, 'FogBugz URL', class: 'control-label' + .col-sm-4 + = text_field_tag :uri, nil, placeholder: 'https://mycompany.fogbugz.com', class: 'form-control' + .form-group + = label_tag :email, 'FogBugz Email', class: 'control-label' + .col-sm-4 + = text_field_tag :email, nil, class: 'form-control' + .form-group + = label_tag :password, 'FogBugz Password', class: 'control-label' + .col-sm-4 + = password_field_tag :password, nil, class: 'form-control' + .form-actions + = submit_tag 'Continue to the next step', class: 'btn btn-create' diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml new file mode 100644 index 0000000000..25cebfb366 --- /dev/null +++ b/app/views/import/fogbugz/new_user_map.html.haml @@ -0,0 +1,49 @@ +- page_title 'User map', 'FogBugz import' +%h3.page-title + %i.fa.fa-bug + Import projects from FogBugz +%hr + += form_tag create_user_map_import_fogbugz_path, class: 'form-horizontal' do + %p + Customize how FogBugz email addresses and usernames are imported into GitLab. + In the next step, you'll be able to select the projects you want to import. + %p + The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames wil be imported into GitLab. You can change this by populating the table below. + %ul + %li + %strong Default: Map a FogBugz account ID to a full name + %p + An empty GitLab User field will add the FogBugz user's full name + (e.g. "By John Smith") in the description of all issues and comments. + It will also associate and/or assign these issues and comments with + the project creator. + %li + %strong Map a FogBugz account ID to a GitLab user + %p + Selecting a GitLab user will add a link to the GitLab user in the descriptions + of issues and comments (e.g. "By @johnsmith"). It will also + associate and/or assign these issues and comments with the selected user. + + %table.table + %thead + %tr + %th ID + %th Name + %th Email + %th GitLab User + %tbody + - @user_map.each do |id, user| + %tr + %td= id + %td= text_field_tag "users[#{id}][name]", user[:name], class: 'form-control' + %td= text_field_tag "users[#{id}][email]", user[:email], class: 'form-control' + %td + = users_select_tag("users[#{id}][gitlab_user]", class: 'custom-form-control', + scope: :all, email_user: true, selected: user[:gitlab_user]) + + .form-actions + = submit_tag 'Continue to the next step', class: 'btn btn-create' + +:coffeescript + new UsersSelect() diff --git a/app/views/import/fogbugz/status.html.haml b/app/views/import/fogbugz/status.html.haml new file mode 100644 index 0000000000..f179ece402 --- /dev/null +++ b/app/views/import/fogbugz/status.html.haml @@ -0,0 +1,51 @@ +- page_title "FogBugz import" +%h3.page-title + %i.fa.fa-bug + Import projects from FogBugz + +- if @repos.any? + %p.light + Select projects you want to import. + %p.light + Optionally, you can + = link_to 'customize', new_user_map_import_fogbugz_path + how FogBugz email addresses and usernames are imported into GitLab. + %hr + %p + = button_tag 'Import all projects', class: 'btn btn-success js-import-all' + +%table.table.import-jobs + %thead + %tr + %th From FogBugz + %th To GitLab + %th Status + %tbody + - @already_added_projects.each do |project| + %tr{id: "project_#{project.id}", class: "#{project_status_css_class(project.import_status)}"} + %td + = project.import_source + %td + %strong= link_to project.path_with_namespace, [project.namespace.becomes(Namespace), project] + %td.job-status + - if project.import_status == 'finished' + %span + %i.fa.fa-check + done + - elsif project.import_status == 'started' + %i.fa.fa-spinner.fa-spin + started + - else + = project.human_import_status_name + + - @repos.each do |repo| + %tr{id: "repo_#{repo.id}"} + %td + = repo.name + %td.import-target + = "#{current_user.username}/#{repo.name}" + %td.import-actions.job-status + = button_tag "Import", class: "btn js-add-to-import" + +:coffeescript + new ImporterStatus("#{jobs_import_fogbugz_path}", "#{import_fogbugz_path}") diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 636218368c..bccea21e7a 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -72,6 +72,11 @@ %i.fa.fa-google Google Code + - if fogbugz_import_enabled? + = link_to new_import_fogbugz_path, class: 'btn import_fogbugz' do + %i.fa.fa-bug + Fogbugz + - if git_import_enabled? = link_to "#", class: 'btn js-toggle-button import_git' do %i.fa.fa-git diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb index f2ba2e15e7..ea2808045e 100644 --- a/app/workers/repository_import_worker.rb +++ b/app/workers/repository_import_worker.rb @@ -7,22 +7,31 @@ class RepositoryImportWorker def perform(project_id) project = Project.find(project_id) - import_result = gitlab_shell.send(:import_repository, + unless project.import_url == Project::UNKNOWN_IMPORT_URL + import_result = gitlab_shell.send(:import_repository, project.path_with_namespace, project.import_url) - return project.import_fail unless import_result + return project.import_fail unless import_result + else + unless project.create_repository + return project.import_fail + end + end - data_import_result = if project.import_type == 'github' - Gitlab::GithubImport::Importer.new(project).execute - elsif project.import_type == 'gitlab' - Gitlab::GitlabImport::Importer.new(project).execute - elsif project.import_type == 'bitbucket' - Gitlab::BitbucketImport::Importer.new(project).execute - elsif project.import_type == 'google_code' - Gitlab::GoogleCodeImport::Importer.new(project).execute - else - true - end + data_import_result = case project.import_type + when 'github' + Gitlab::GithubImport::Importer.new(project).execute + when 'gitlab' + Gitlab::GitlabImport::Importer.new(project).execute + when 'bitbucket' + Gitlab::BitbucketImport::Importer.new(project).execute + when 'google_code' + Gitlab::GoogleCodeImport::Importer.new(project).execute + when 'fogbugz' + Gitlab::FogbugzImport::Importer.new(project).execute + else + true + end return project.import_fail unless data_import_result Gitlab::BitbucketImport::KeyDeleter.new(project).execute if project.import_type == 'bitbucket' diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index c47e5dab27..689c3f3049 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -158,7 +158,7 @@ Settings.gitlab.default_projects_features['snippets'] = false if Settings. Settings.gitlab.default_projects_features['visibility_level'] = Settings.send(:verify_constant, Gitlab::VisibilityLevel, Settings.gitlab.default_projects_features['visibility_level'], Gitlab::VisibilityLevel::PRIVATE) Settings.gitlab['repository_downloads_path'] = File.absolute_path(Settings.gitlab['repository_downloads_path'] || 'tmp/repositories', Rails.root) Settings.gitlab['restricted_signup_domains'] ||= [] -Settings.gitlab['import_sources'] ||= ['github','bitbucket','gitlab','gitorious','google_code','git'] +Settings.gitlab['import_sources'] ||= ['github','bitbucket','gitlab','gitorious','google_code','fogbugz','git'] # # Reply by email diff --git a/config/routes.rb b/config/routes.rb index 25c286b308..5bf721d6b1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -99,6 +99,15 @@ Gitlab::Application.routes.draw do get :new_user_map, path: :user_map post :create_user_map, path: :user_map end + + resource :fogbugz, only: [:create, :new], controller: :fogbugz do + get :status + post :callback + get :jobs + + get :new_user_map, path: :user_map + post :create_user_map, path: :user_map + end end # diff --git a/doc/workflow/importing/README.md b/doc/workflow/importing/README.md index 5cde90993d..7ccf06fbd6 100644 --- a/doc/workflow/importing/README.md +++ b/doc/workflow/importing/README.md @@ -3,6 +3,7 @@ 1. [Bitbucket](import_projects_from_bitbucket.md) 2. [GitHub](import_projects_from_github.md) 3. [GitLab.com](import_projects_from_gitlab_com.md) +4. [FogBugz](import_projects_from_fogbugz.md) 4. [SVN](migrating_from_svn.md) ### Note diff --git a/doc/workflow/importing/fogbugz_importer/fogbugz_import_finished.png b/doc/workflow/importing/fogbugz_importer/fogbugz_import_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..205c515bd3f804342e4302f7d012201ad0320bfc GIT binary patch literal 53276 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 literal 0 HcmV?d00001 diff --git a/doc/workflow/importing/fogbugz_importer/fogbugz_import_login.png b/doc/workflow/importing/fogbugz_importer/fogbugz_import_login.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e348d46ad6ecae30a9f0965ccbedee1cdeb03b GIT binary patch literal 44444 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 Vc&1XfWEb$crKWSeNX7d8{{YbBhTZ@G literal 0 HcmV?d00001 diff --git a/doc/workflow/importing/fogbugz_importer/fogbugz_import_select_fogbogz.png b/doc/workflow/importing/fogbugz_importer/fogbugz_import_select_fogbogz.png new file mode 100644 index 0000000000000000000000000000000000000000..ed362846909bf0edf0ef5ee220faa79df99b99ff GIT binary patch literal 35415 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 QGr$Kfqb!{(`S9s~0WWJC`~Uy| literal 0 HcmV?d00001 diff --git a/doc/workflow/importing/fogbugz_importer/fogbugz_import_user_map.png b/doc/workflow/importing/fogbugz_importer/fogbugz_import_user_map.png new file mode 100644 index 0000000000000000000000000000000000000000..b1cc4b58525154dbb83e89479f1a25788d344f70 GIT binary patch literal 157856 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 UUeE 0 + res['cases']['case'] + end + + def categories + @api.command(:listCategories) + end + end + end +end diff --git a/lib/gitlab/fogbugz_import/importer.rb b/lib/gitlab/fogbugz_import/importer.rb new file mode 100644 index 0000000000..61e08b2354 --- /dev/null +++ b/lib/gitlab/fogbugz_import/importer.rb @@ -0,0 +1,298 @@ +module Gitlab + module FogbugzImport + class Importer + attr_reader :project, :repo + + def initialize(project) + @project = project + + import_data = project.import_data.try(:data) + repo_data = import_data['repo'] if import_data + @repo = FogbugzImport::Repository.new(repo_data) + + @known_labels = Set.new + end + + def execute + return true unless repo.valid? + + data = project.import_data.try(:data) + + client = Gitlab::FogbugzImport::Client.new(token: data['fb_session']['token'], uri: data['fb_session']['uri']) + + @cases = client.cases(@repo.id.to_i) + @categories = client.categories + + import_cases + + true + end + + private + + def user_map + @user_map ||= begin + user_map = Hash.new + import_data = project.import_data.try(:data) + stored_user_map = import_data['user_map'] if import_data + user_map.update(stored_user_map) if stored_user_map + + user_map + end + end + + def import_labels + @categories['categories']['category'].each do |label| + create_label(label['sCategory']) + @known_labels << name + end + end + + def nice_label_color(name) + case name + when 'Blocker' + '#ff0000' + when 'Crash' + '#ffcfcf' + when 'Major' + '#deffcf' + when 'Minor' + '#cfe9ff' + when 'Bug' + '#d9534f' + when 'Feature' + '#44ad8e' + when 'Technical Task' + '#4b6dd0' + else + '#e2e2e2' + end + end + + def create_label(name) + color = nice_label_color(name) + Label.create!(project_id: project.id, title: name, color: color) + end + + def user_info(person_id) + user_hash = user_map[person_id.to_s] + + user_name = '' + gitlab_id = nil + + unless user_hash.nil? + user_name = user_hash['name'] + if user = User.find_by(id: user_hash['gitlab_user']) + user_name = "@#{user.username}" + gitlab_id = user.id + end + end + + { name: user_name, gitlab_id: gitlab_id } + end + + def import_cases + return unless @cases + + while bug = @cases.shift + author = user_info(bug['ixPersonOpenedBy'])[:name] + date = DateTime.parse(bug['dtOpened']) + + comments = bug['events']['event'] + + content = format_content(opened_content(comments)) + body = format_issue_body(author, date, content) + + labels = [] + [bug['sCategory'], bug['sPriority']].each do |label| + unless label.blank? + labels << label + unless @known_labels.include?(label) + create_label(label) + @known_labels << label + end + end + end + + assignee_id = user_info(bug['ixPersonAssignedTo'])[:gitlab_id] + author_id = user_info(bug['ixPersonOpenedBy'])[:gitlab_id] || project.creator_id + + issue = Issue.create!( + project_id: project.id, + title: bug['sTitle'], + description: body, + author_id: author_id, + assignee_id: assignee_id, + state: bug['fOpen'] == 'true' ? 'opened' : 'closed' + ) + issue.add_labels_by_names(labels) + + if issue.iid != bug['ixBug'] + issue.update_attribute(:iid, bug['ixBug']) + end + + import_issue_comments(issue, comments) + + issue.update_attribute(:created_at, date) + + last_update = DateTime.parse(bug['dtLastUpdated']) + issue.update_attribute(:updated_at, last_update) + end + end + + def opened_content(comments) + while comment = comments.shift + if comment['sVerb'] == 'Opened' + return comment['s'] + end + end + '' + end + + def import_issue_comments(issue, comments) + Note.transaction do + while comment = comments.shift + verb = comment['sVerb'] + + next if verb == 'Opened' || verb === 'Closed' + + content = format_content(comment['s']) + attachments = format_attachments(comment['rgAttachments']) + updates = format_updates(comment) + + next if content.blank? && attachments.empty? && updates.empty? + + author = user_info(comment['ixPerson'])[:name] + author_id = user_info(comment['ixPerson'])[:gitlab_id] || project.creator_id + date = DateTime.parse(comment['dt']) + + body = format_issue_comment_body( + comment['ixBugEvent'], + author, + date, + content, + attachments, + updates + ) + + note = Note.create!( + project_id: project.id, + noteable_type: "Issue", + noteable_id: issue.id, + author_id: author_id, + note: body + ) + + note.update_attribute(:created_at, date) + note.update_attribute(:updated_at, date) + end + end + end + + def linkify_issues(s) + s = s.gsub(/([Ii]ssue) ([0-9]+)/, '\1 #\2') + s = s.gsub(/([Cc]ase) ([0-9]+)/, '\1 #\2') + s + end + + def escape_for_markdown(s) + s = s.gsub(/^#/, "\\#") + s = s.gsub(/^-/, "\\-") + s = s.gsub("`", "\\~") + s = s.gsub("\r", "") + s = s.gsub("\n", " \n") + s + end + + def format_content(raw_content) + return raw_content if raw_content.nil? + linkify_issues(escape_for_markdown(raw_content)) + end + + def format_attachments(raw_attachments) + return [] unless raw_attachments + + attachments = case raw_attachments['attachment'] + when Array + raw_attachments['attachment'] + when Hash + [raw_attachments['attachment']] + else + [] + end + + attachments.map! { |a| format_attachment(a) } + attachments.compact + end + + def format_attachment(attachment) + link = build_attachment_url(attachment['sURL']) + + res = ::Projects::DownloadService.new(project, link).execute + + return nil if res.nil? + + text = "[#{res['alt']}](#{res['url']})" + text = "!#{text}" if res['is_image'] + text + end + + def build_attachment_url(rel_url) + data = project.import_data.try(:data) + uri = data['fb_session']['uri'] + token = data['fb_session']['token'] + "#{uri}/#{rel_url}&token=#{token}" + end + + def format_updates(comment) + updates = [] + + if comment['sChanges'] + updates << "*Changes: #{linkify_issues(comment['sChanges'].chomp)}*" + end + + if comment['evtDescription'] + updates << "*#{comment['evtDescription']}*" + end + + updates + end + + def format_issue_body(author, date, content) + body = [] + body << "*By #{author} on #{date} (imported from FogBugz)*" + body << '---' + + if content.blank? + content = '*(No description has been entered for this issue)*' + end + body << content + + body.join("\n\n") + end + + def format_issue_comment_body(id, author, date, content, attachments, updates) + body = [] + body << "*By #{author} on #{date} (imported from FogBugz)*" + body << '---' + + if content.blank? + content = "*(No comment has been entered for this change)*" + end + body << content + + if updates.any? + body << '---' + body += updates + end + + if attachments.any? + body << '---' + body += attachments + end + + body.join("\n\n") + end + end + end +end diff --git a/lib/gitlab/fogbugz_import/project_creator.rb b/lib/gitlab/fogbugz_import/project_creator.rb new file mode 100644 index 0000000000..f02ea43910 --- /dev/null +++ b/lib/gitlab/fogbugz_import/project_creator.rb @@ -0,0 +1,38 @@ +module Gitlab + module FogbugzImport + class ProjectCreator + attr_reader :repo, :fb_session, :namespace, :current_user, :user_map + + def initialize(repo, fb_session, namespace, current_user, user_map = nil) + @repo = repo + @fb_session = fb_session + @namespace = namespace + @current_user = current_user + @user_map = user_map + end + + def execute + project = ::Projects::CreateService.new(current_user, + name: repo.safe_name, + path: repo.path, + namespace: namespace, + creator: current_user, + visibility_level: Gitlab::VisibilityLevel::INTERNAL, + import_type: 'fogbugz', + import_source: repo.name, + import_url: Project::UNKNOWN_IMPORT_URL + ).execute + + import_data = project.create_import_data( + data: { + 'repo' => repo.raw_data, + 'user_map' => user_map, + 'fb_session' => fb_session + } + ) + + project + end + end + end +end diff --git a/lib/gitlab/fogbugz_import/repository.rb b/lib/gitlab/fogbugz_import/repository.rb new file mode 100644 index 0000000000..d1dc63db2b --- /dev/null +++ b/lib/gitlab/fogbugz_import/repository.rb @@ -0,0 +1,31 @@ +module Gitlab + module FogbugzImport + class Repository + attr_accessor :raw_data + + def initialize(raw_data) + @raw_data = raw_data + end + + def valid? + raw_data.is_a?(Hash) + end + + def id + raw_data['ixProject'] + end + + def name + raw_data['sProject'] + end + + def safe_name + name.gsub(/[^\s\w.-]/, '') + end + + def path + safe_name.gsub(/[\s]/, '_') + end + end + end +end diff --git a/lib/gitlab/import_sources.rb b/lib/gitlab/import_sources.rb index 991b70aab6..ccfdfbe73e 100644 --- a/lib/gitlab/import_sources.rb +++ b/lib/gitlab/import_sources.rb @@ -19,6 +19,7 @@ module Gitlab 'GitLab.com' => 'gitlab', 'Gitorious.org' => 'gitorious', 'Google Code' => 'google_code', + 'FogBugz' => 'fogbugz', 'Any repo by URL' => 'git', } end diff --git a/spec/controllers/import/fogbugz_controller_spec.rb b/spec/controllers/import/fogbugz_controller_spec.rb new file mode 100644 index 0000000000..27b11267d2 --- /dev/null +++ b/spec/controllers/import/fogbugz_controller_spec.rb @@ -0,0 +1,39 @@ +require 'spec_helper' +require_relative 'import_spec_helper' + +describe Import::FogbugzController do + include ImportSpecHelper + + let(:user) { create(:user) } + + before do + sign_in(user) + end + + describe 'GET status' do + before do + @repo = OpenStruct.new(name: 'vim') + stub_client(valid?: true) + end + + it 'assigns variables' do + @project = create(:project, import_type: 'fogbugz', creator_id: user.id) + stub_client(repos: [@repo]) + + get :status + + expect(assigns(:already_added_projects)).to eq([@project]) + expect(assigns(:repos)).to eq([@repo]) + end + + it 'does not show already added project' do + @project = create(:project, import_type: 'fogbugz', creator_id: user.id, import_source: 'vim') + stub_client(repos: [@repo]) + + get :status + + expect(assigns(:already_added_projects)).to eq([@project]) + expect(assigns(:repos)).to eq([]) + end + end +end diff --git a/spec/services/projects/download_service_spec.rb b/spec/services/projects/download_service_spec.rb new file mode 100644 index 0000000000..f12e09c58c --- /dev/null +++ b/spec/services/projects/download_service_spec.rb @@ -0,0 +1,65 @@ +require 'spec_helper' + +describe Projects::DownloadService do + describe 'File service' do + before do + @user = create :user + @project = create :project, creator_id: @user.id, namespace: @user.namespace + end + + context 'for a URL that is not on whitelist' do + before do + url = 'https://code.jquery.com/jquery-2.1.4.min.js' + @link_to_file = download_file(@project, url) + end + + it { expect(@link_to_file).to eq(nil) } + end + + context 'for URLs that are on the whitelist' do + before do + sham_rack_app = ShamRack.at('mycompany.fogbugz.com').stub + sham_rack_app.register_resource('/rails_sample.jpg', File.read(Rails.root + 'spec/fixtures/rails_sample.jpg'), 'image/jpg') + sham_rack_app.register_resource('/doc_sample.txt', File.read(Rails.root + 'spec/fixtures/doc_sample.txt'), 'text/plain') + end + + after do + ShamRack.unmount_all + end + + context 'an image file' do + before do + url = 'http://mycompany.fogbugz.com/rails_sample.jpg' + @link_to_file = download_file(@project, url) + end + + it { expect(@link_to_file).to have_key('alt') } + it { expect(@link_to_file).to have_key('url') } + it { expect(@link_to_file).to have_key('is_image') } + it { expect(@link_to_file['is_image']).to be true } + it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") } + it { expect(@link_to_file['url']).to match('rails_sample.jpg') } + it { expect(@link_to_file['alt']).to eq('rails_sample') } + end + + context 'a txt file' do + before do + url = 'http://mycompany.fogbugz.com/doc_sample.txt' + @link_to_file = download_file(@project, url) + end + + it { expect(@link_to_file).to have_key('alt') } + it { expect(@link_to_file).to have_key('url') } + it { expect(@link_to_file).to have_key('is_image') } + it { expect(@link_to_file['is_image']).to be false } + it { expect(@link_to_file['url']).to match("/#{@project.path_with_namespace}") } + it { expect(@link_to_file['url']).to match('doc_sample.txt') } + it { expect(@link_to_file['alt']).to eq('doc_sample.txt') } + end + end + end + + def download_file(repository, url) + Projects::DownloadService.new(repository, url).execute + end +end From be59f4338ffc1e075e32b09d43c19503b1216533 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 09:25:49 +0100 Subject: [PATCH 170/247] Fix RootController --- app/controllers/root_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/root_controller.rb b/app/controllers/root_controller.rb index a3aa86de5b..54171ff67c 100644 --- a/app/controllers/root_controller.rb +++ b/app/controllers/root_controller.rb @@ -7,7 +7,7 @@ # For users who haven't customized the setting, we simply delegate to # `DashboardController#show`, which is the default. class RootController < Dashboard::ProjectsController - before_action :redirect_to_custom_dashboard, only: [:show] + before_action :redirect_to_custom_dashboard, only: [:index] def index super From b7431ec042bc14052c407fd277177681e189c892 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Fri, 4 Sep 2015 21:40:26 +0300 Subject: [PATCH 171/247] Make all group public --- CHANGELOG | 2 +- app/models/ability.rb | 2 +- app/models/group.rb | 4 ---- app/views/groups/show.html.haml | 14 ++++++------- features/explore/groups.feature | 14 ------------- features/groups.feature | 11 ++++++++++ features/steps/groups.rb | 20 +++++++++++++++++++ .../controllers/namespaces_controller_spec.rb | 6 ++---- spec/controllers/uploads_controller_spec.rb | 8 -------- spec/features/security/group_access_spec.rb | 18 ++++++++--------- 10 files changed, 51 insertions(+), 48 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index dd48bab978..e7f209c1cd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -29,7 +29,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 - - Make all profiles public + - Make all profiles and group public - 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 diff --git a/app/models/ability.rb b/app/models/ability.rb index f8e5afa9b0..64cfdb6ea8 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -54,7 +54,7 @@ class Ability nil end - if group && group.public_profile? + if group [:read_group] else [] diff --git a/app/models/group.rb b/app/models/group.rb index 9cd146bb73..702d7825d5 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -119,10 +119,6 @@ class Group < Namespace end end - def public_profile? - projects.public_only.any? - end - def post_create_hook Gitlab::AppLogger.info("Group \"#{name}\" was created") diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 0577f4ec14..7fd1b3f18c 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -22,16 +22,16 @@ - if current_user = render "events/event_last_push", event: @last_push - - if current_user - %ul.nav.nav-pills.event_filter.pull-right - %li - = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do - %i.fa.fa-rss + %ul.nav.nav-pills.event_filter.pull-right + %li + = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do + %i.fa.fa-rss = render 'shared/event_filter' %hr .content_list = spinner - %aside.side.col-md-5 - = render "projects", projects: @projects + - if @projects.any? + %aside.side.col-md-5 + = render "projects", projects: @projects diff --git a/features/explore/groups.feature b/features/explore/groups.feature index c11634bd74..a42e59c98f 100644 --- a/features/explore/groups.feature +++ b/features/explore/groups.feature @@ -3,20 +3,6 @@ Feature: Explore Groups Background: Given group "TestGroup" has private project "Enterprise" - Scenario: I should not see group with private projects as visitor - When I visit group "TestGroup" page - Then I should be redirected to sign in page - - Scenario: I should not see group with private projects group as user - When I sign in as a user - And I visit group "TestGroup" page - Then page status code should be 404 - - Scenario: I should not see group with private and internal projects as visitor - Given group "TestGroup" has internal project "Internal" - When I visit group "TestGroup" page - Then I should be redirected to sign in page - Scenario: I should see group with private and internal projects as user Given group "TestGroup" has internal project "Internal" When I sign in as a user diff --git a/features/groups.feature b/features/groups.feature index d5272fdddc..db37fa3b37 100644 --- a/features/groups.feature +++ b/features/groups.feature @@ -159,3 +159,14 @@ Feature: Groups When I visit group "Owned" projects page Then I should see group "Owned" projects list And I should see "archived" label + + # Public group + @javascript + Scenario: Signed out user should see group + Given "Mary Jane" is owner of group "Owned" + And I am a signed out user + And Group "Owned" has a public project "Public-project" + When I visit group "Owned" page + Then I should see group "Owned" + Then I should see project "Public-project" + diff --git a/features/steps/groups.rb b/features/steps/groups.rb index 18a1c4d32c..45201c85f2 100644 --- a/features/steps/groups.rb +++ b/features/steps/groups.rb @@ -17,6 +17,26 @@ class Spinach::Features::Groups < Spinach::FeatureSteps find(:css, 'button.btn-new').click end + step 'I should see group "Owned"' do + expect(page).to have_content '@owned' + end + + step 'I am a signed out user' do + logout + end + + step 'Group "Owned" has a public project "Public-project"' do + group = Group.find_by(name: "Owned") + + @project = create :empty_project, :public, + group: group, + name: "Public-project" + end + + step 'I should see project "Public-project"' do + expect(page).to have_content 'Public-project' + end + step 'I select "Mike" as "Reporter"' do user = User.find_by(name: "Mike") diff --git a/spec/controllers/namespaces_controller_spec.rb b/spec/controllers/namespaces_controller_spec.rb index 9c8619722c..74702f9330 100644 --- a/spec/controllers/namespaces_controller_spec.rb +++ b/spec/controllers/namespaces_controller_spec.rb @@ -46,13 +46,11 @@ describe NamespacesController do context "when the project doesn't have public projects" do context "when not signed in" do - it "redirects to the sign in page" do + it "does not redirect to the sign in page" do get :show, id: group.path - - expect(response).to redirect_to(new_user_session_path) + expect(response).not_to redirect_to(new_user_session_path) end end - context "when signed in" do before do sign_in(user) diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb index 0f9780356b..af5d043cf0 100644 --- a/spec/controllers/uploads_controller_spec.rb +++ b/spec/controllers/uploads_controller_spec.rb @@ -156,14 +156,6 @@ describe UploadsController do end context "when the project doesn't have public projects" do - context "when not signed in" do - it "redirects to the sign in page" do - get :show, model: "group", mounted_as: "avatar", id: group.id, filename: "image.png" - - expect(response).to redirect_to(new_user_session_path) - end - end - context "when signed in" do before do sign_in(user) diff --git a/spec/features/security/group_access_spec.rb b/spec/features/security/group_access_spec.rb index 8ce1538860..3f708b5ebe 100644 --- a/spec/features/security/group_access_spec.rb +++ b/spec/features/security/group_access_spec.rb @@ -68,7 +68,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end context 'with no projects' do @@ -77,8 +77,8 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:reporter) } it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } - it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :user } + it { is_expected.to be_allowed_for :visitor } end end @@ -118,7 +118,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end context 'with no projects' do @@ -128,7 +128,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end end @@ -168,7 +168,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end context 'with no projects' do @@ -178,7 +178,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end end @@ -218,7 +218,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end context 'with no projects' do @@ -228,7 +228,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_denied_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end end From 5c961b9cc5a48cfdfe7c1bee91f29138e167b058 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 09:28:09 +0100 Subject: [PATCH 172/247] Fix spec --- features/steps/invites.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/steps/invites.rb b/features/steps/invites.rb index 5e8feff509..dac972172a 100644 --- a/features/steps/invites.rb +++ b/features/steps/invites.rb @@ -63,7 +63,7 @@ class Spinach::Features::Invites < Spinach::FeatureSteps end step 'I should be redirected to the dashboard' do - expect(current_path).to eq(dashboard_path) + expect(current_path).to eq(dashboard_projects_path) end step 'I should see a notice telling me I have declined' do From 89f166021f12aec575ec1b9f4dc82a824bc19950 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 09:29:42 +0100 Subject: [PATCH 173/247] Fix snippets exploration test --- features/steps/shared/paths.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index 2ec126e1e9..eb978620da 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -460,7 +460,7 @@ module SharedPaths end step 'I visit snippets page' do - visit snippets_path + visit explore_snippets_path end step 'I visit new snippet page' do From e4b30f9db3d0b2a2d3b7274d312872fe41d22104 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 10:22:19 +0100 Subject: [PATCH 174/247] Fix help access spec --- spec/features/security/dashboard_access_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/security/dashboard_access_spec.rb b/spec/features/security/dashboard_access_spec.rb index 0301913941..788581a26c 100644 --- a/spec/features/security/dashboard_access_spec.rb +++ b/spec/features/security/dashboard_access_spec.rb @@ -40,7 +40,7 @@ describe "Dashboard access", feature: true do it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_denied_for :visitor } + it { is_expected.to be_allowed_for :visitor } end describe "GET /projects/new" do From c9d78a00c583c0439aeea7416eeea2e50e0d59e4 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 9 Sep 2015 11:36:55 +0200 Subject: [PATCH 175/247] Fix UI bugs with discussions Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/timeline.scss | 19 ++++++++++++++++++- app/assets/stylesheets/pages/note_form.scss | 6 +++--- .../projects/notes/_discussion.html.haml | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/generic/timeline.scss b/app/assets/stylesheets/generic/timeline.scss index 668a6f848c..74bbaabad3 100644 --- a/app/assets/stylesheets/generic/timeline.scss +++ b/app/assets/stylesheets/generic/timeline.scss @@ -4,14 +4,19 @@ margin: 0; padding: 0; - > li { + .timeline-entry { padding: $gl-padding; border-color: #f1f2f4; margin-left: -$gl-padding; margin-right: -$gl-padding; color: $gl-gray; + border-bottom: 1px solid #f1f2f4; border-right: 1px solid #f1f2f4; + &:last-child { + border-bottom: none; + } + .avatar { margin-right: 15px; } @@ -33,6 +38,13 @@ color: $gl-gray !important; } } + + .diff-file { + border: 1px solid $border-color; + border-bottom: none; + margin-left: 0; + margin-right: 0; + } } @media (max-width: $screen-xs-max) { @@ -51,3 +63,8 @@ } } } + +.discussion .timeline-entry { + margin: 0; + border-right: none; +} diff --git a/app/assets/stylesheets/pages/note_form.scss b/app/assets/stylesheets/pages/note_form.scss index 85804f5ee6..b311d26d67 100644 --- a/app/assets/stylesheets/pages/note_form.scss +++ b/app/assets/stylesheets/pages/note_form.scss @@ -146,9 +146,9 @@ } .discussion-reply-holder { - background: #f9f9f9; + background: $background-color; padding: 10px 15px; - border-top: 1px solid #DDD; + border-top: 1px solid $border-color; } } @@ -170,6 +170,6 @@ background: #FFF; padding: 5px; margin-top: -11px; - border: 1px solid #DDD; + border: 1px solid $border-color; font-size: 13px; } diff --git a/app/views/projects/notes/_discussion.html.haml b/app/views/projects/notes/_discussion.html.haml index 6daf2d15d0..b8068835b3 100644 --- a/app/views/projects/notes/_discussion.html.haml +++ b/app/views/projects/notes/_discussion.html.haml @@ -1,5 +1,5 @@ - note = discussion_notes.first -.timeline-entry.prepend-top-default +.timeline-entry .timeline-entry-inner .timeline-icon = link_to user_path(note.author) do From d8795297fa7847d2dc672c30e1aabffd3687bdcc Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 12:10:47 +0100 Subject: [PATCH 176/247] Restructure omnibus instructions to match those for source installations. --- doc/reply_by_email/README.md | 48 +++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md index 1f704e65bc..1886650164 100644 --- a/doc/reply_by_email/README.md +++ b/doc/reply_by_email/README.md @@ -34,7 +34,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. address: "gitlab-replies+%{reply_key}@gmail.com" ``` - As mentioned, the part after `+` is ignored, and this will end up in the mailbox for `gitlab-replies@gmail.com`. + As mentioned, the part after `+` in the address is ignored, and any email sent here will end up in the mailbox for `gitlab-replies@gmail.com`. 2. Copy `config/mail_room.yml.example` to `config/mail_room.yml`: @@ -91,7 +91,7 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. sudo service gitlab restart ``` -7. Check if everything is configured correctly: +7. Verify that everything is configured correctly: ```sh sudo -u git -H bundle exec rake gitlab:reply_by_email:check RAILS_ENV=production @@ -101,30 +101,34 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. ### Omnibus package installations -In `/etc/gitlab/gitlab.rb`: +1. Find the `reply_by_email` section in `/etc/gitlab/gitlab.rb`, enable the feature, enter the email address including a placeholder for the `reply_key` and fill in the details for your specific IMAP server and email account: -```ruby + ```ruby + gitlab_rails['reply_by_email_enabled'] = true + gitlab_rails['reply_by_email_address'] = "gitlab-replies+%{reply_key}@gmail.com" + gitlab_rails['reply_by_email_host'] = "imap.gmail.com" # IMAP server host + gitlab_rails['reply_by_email_port'] = 993 # IMAP server port + gitlab_rails['reply_by_email_ssl'] = true # Whether the IMAP server uses SSL + gitlab_rails['reply_by_email_email'] = "gitlab-replies@gmail.com" # Email account username. Usually the full email address. + gitlab_rails['reply_by_email_password'] = "password" # Email account password + gitlab_rails['reply_by_email_mailbox_name'] = "inbox" # The name of the mailbox where incoming mail will end up. Usually "inbox". + ``` -gitlab_rails['reply_by_email_enabled'] = true -gitlab_rails['reply_by_email_address'] = "gitlab-replies+%{reply_key}@gmail.com" -gitlab_rails['reply_by_email_host'] = "imap.gmail.com" # IMAP server host -gitlab_rails['reply_by_email_port'] = 993 # IMAP server port -gitlab_rails['reply_by_email_ssl'] = true # Whether the IMAP server uses SSL -gitlab_rails['reply_by_email_email'] = "gitlab-replies@gmail.com" # Email account username. Usually the full email address. -gitlab_rails['reply_by_email_password'] = "password" # Email account password -gitlab_rails['reply_by_email_mailbox_name'] = "inbox" # The name of the mailbox where incoming mail will end up. -``` + As mentioned, the part after `+` in the address is ignored, and any email sent here will end up in the mailbox for `gitlab-replies@gmail.com`. -and run `sudo gitlab-ctl reconfigure` for changes to take effect. +1. Reconfigure GitLab for the changes to take effect: -After reconfigure run has been successfully completed you will have the following commands available: + ```sh + sudo gitlab-ctl reconfigure + ``` -```bash -sudo gitlab-ctl status mailroom -sudo gitlab-ctl stop mailroom -sudo gitlab-ctl start mailroom -sudo gitlab-ctl restart mailroom -``` +1. Verify that everything is configured correctly: + + ```sh + sudo gitlab-rake gitlab:reply_by_email:check + ``` + +1. Reply by email should now be working. ### Development @@ -190,7 +194,7 @@ sudo gitlab-ctl restart mailroom bundle exec foreman start ``` -7. Check if everything is configured correctly: +7. Verify that everything is configured correctly: ```sh bundle exec rake gitlab:reply_by_email:check RAILS_ENV=development From 3b89a6830261a7252899674ddaef49b6d19a66d9 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 12:11:08 +0100 Subject: [PATCH 177/247] Move source section below omnibus section. --- doc/reply_by_email/README.md | 62 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/doc/reply_by_email/README.md b/doc/reply_by_email/README.md index 1886650164..e9187298d7 100644 --- a/doc/reply_by_email/README.md +++ b/doc/reply_by_email/README.md @@ -14,6 +14,37 @@ To set up a basic Postfix mail server with IMAP access on Ubuntu, follow [these In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. +### Omnibus package installations + +1. Find the `reply_by_email` section in `/etc/gitlab/gitlab.rb`, enable the feature, enter the email address including a placeholder for the `reply_key` and fill in the details for your specific IMAP server and email account: + + ```ruby + gitlab_rails['reply_by_email_enabled'] = true + gitlab_rails['reply_by_email_address'] = "gitlab-replies+%{reply_key}@gmail.com" + gitlab_rails['reply_by_email_host'] = "imap.gmail.com" # IMAP server host + gitlab_rails['reply_by_email_port'] = 993 # IMAP server port + gitlab_rails['reply_by_email_ssl'] = true # Whether the IMAP server uses SSL + gitlab_rails['reply_by_email_email'] = "gitlab-replies@gmail.com" # Email account username. Usually the full email address. + gitlab_rails['reply_by_email_password'] = "password" # Email account password + gitlab_rails['reply_by_email_mailbox_name'] = "inbox" # The name of the mailbox where incoming mail will end up. Usually "inbox". + ``` + + As mentioned, the part after `+` in the address is ignored, and any email sent here will end up in the mailbox for `gitlab-replies@gmail.com`. + +1. Reconfigure GitLab for the changes to take effect: + + ```sh + sudo gitlab-ctl reconfigure + ``` + +1. Verify that everything is configured correctly: + + ```sh + sudo gitlab-rake gitlab:reply_by_email:check + ``` + +1. Reply by email should now be working. + ### Installations from source 1. Go to the GitLab installation directory: @@ -99,37 +130,6 @@ In this example, we'll use the Gmail address `gitlab-replies@gmail.com`. 8. Reply by email should now be working. -### Omnibus package installations - -1. Find the `reply_by_email` section in `/etc/gitlab/gitlab.rb`, enable the feature, enter the email address including a placeholder for the `reply_key` and fill in the details for your specific IMAP server and email account: - - ```ruby - gitlab_rails['reply_by_email_enabled'] = true - gitlab_rails['reply_by_email_address'] = "gitlab-replies+%{reply_key}@gmail.com" - gitlab_rails['reply_by_email_host'] = "imap.gmail.com" # IMAP server host - gitlab_rails['reply_by_email_port'] = 993 # IMAP server port - gitlab_rails['reply_by_email_ssl'] = true # Whether the IMAP server uses SSL - gitlab_rails['reply_by_email_email'] = "gitlab-replies@gmail.com" # Email account username. Usually the full email address. - gitlab_rails['reply_by_email_password'] = "password" # Email account password - gitlab_rails['reply_by_email_mailbox_name'] = "inbox" # The name of the mailbox where incoming mail will end up. Usually "inbox". - ``` - - As mentioned, the part after `+` in the address is ignored, and any email sent here will end up in the mailbox for `gitlab-replies@gmail.com`. - -1. Reconfigure GitLab for the changes to take effect: - - ```sh - sudo gitlab-ctl reconfigure - ``` - -1. Verify that everything is configured correctly: - - ```sh - sudo gitlab-rake gitlab:reply_by_email:check - ``` - -1. Reply by email should now be working. - ### Development 1. Go to the GitLab installation directory. From d3730b071365dd3dbfa0b8ec4433e1f18a93c969 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 9 Sep 2015 14:54:34 +0100 Subject: [PATCH 178/247] Fix highlighting of deleted lines in diffs. --- CHANGELOG | 1 + config/initializers/rouge_diff_lexer.rb | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 config/initializers/rouge_diff_lexer.rb diff --git a/CHANGELOG b/CHANGELOG index 247eb1e364..ddb31fc430 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -40,6 +40,7 @@ v 8.0.0 (unreleased) - 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 - Add support for Crowd + - Fix highlighting of deleted lines in diffs. v 7.14.1 - Improve abuse reports management from admin area diff --git a/config/initializers/rouge_diff_lexer.rb b/config/initializers/rouge_diff_lexer.rb new file mode 100644 index 0000000000..fdb2d7b748 --- /dev/null +++ b/config/initializers/rouge_diff_lexer.rb @@ -0,0 +1,24 @@ +# Here until https://github.com/jneen/rouge/pull/297 is merged into Rouge and the gem is updated in GitLab. +module Rouge + module Lexers + class Diff + def self.analyze_text(text) + return 1 if text.start_with?('Index: ') + return 1 if text.start_with?('diff ') + return 0.9 if text.start_with?('--- ') + end + + state :root do + rule(/^ .*\n/, Text) + rule(/^---\n/, Text) + rule(/^\+.*\n/, Generic::Inserted) + rule(/^-+.*\n/, Generic::Deleted) + rule(/^!.*\n/, Generic::Strong) + rule(/^@.*\n/, Generic::Subheading) + rule(/^([Ii]ndex|diff).*\n/, Generic::Heading) + rule(/^=.*\n/, Generic::Heading) + rule(/.*\n/, Text) + end + end + end +end From 0d66d4d342c72d141578d746aad766a6234fc872 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Wed, 9 Sep 2015 15:19:58 +0100 Subject: [PATCH 179/247] Fix reading session_expire_delay when application settings are not yet created and migrations are not yet done --- config/initializers/session_store.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index 6d274cd95a..88651394d1 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -2,7 +2,12 @@ require 'gitlab/current_settings' include Gitlab::CurrentSettings -Settings.gitlab['session_expire_delay'] = current_application_settings.session_expire_delay + +# allow it to fail: it may to do so when create_from_defaults is executed before migrations are actually done +begin + Settings.gitlab['session_expire_delay'] = current_application_settings.session_expire_delay +rescue +end Gitlab::Application.config.session_store( :redis_store, # Using the cookie_store would enable session replay attacks. From fa40759768518d3457cc95204d6496db999aa7ca Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 9 Sep 2015 22:36:13 +0200 Subject: [PATCH 180/247] Separate profile settings link from the rest on sidebar Signed-off-by: Dmitriy Zaporozhets --- app/views/layouts/nav/_dashboard.html.haml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 0cf1c3d5d2..7d3764a76a 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -37,14 +37,15 @@ = icon('clipboard fw') %span Snippets - - if current_user - = nav_link(controller: :profile) do - = link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do - = icon('user fw') - %span - Profile Settings = nav_link(controller: :help) do = link_to help_path, title: 'Help', data: {placement: 'right'} do = icon('question-circle fw') %span Help + - if current_user + %li.separate-item + = nav_link(controller: :profile) do + = link_to profile_path, title: 'Profile settings', data: {toggle: 'tooltip', placement: 'bottom'} do + = icon('user fw') + %span + Profile Settings From 1e3ce07714efcc5ac18bb2f167c5b4956e114839 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 9 Sep 2015 23:05:47 +0200 Subject: [PATCH 181/247] Use page title for header title too Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/blocks.scss | 4 ++++ app/views/layouts/nav/_profile.html.haml | 2 +- app/views/layouts/profile.html.haml | 3 ++- app/views/profiles/accounts/show.html.haml | 9 +++------ app/views/profiles/applications.html.haml | 9 ++++----- app/views/profiles/audit_log.html.haml | 9 ++++++--- app/views/profiles/emails/index.html.haml | 10 ++++------ app/views/profiles/keys/index.html.haml | 13 +++++++------ app/views/profiles/notifications/show.html.haml | 10 +++++----- app/views/profiles/passwords/edit.html.haml | 10 +++++----- app/views/profiles/passwords/new.html.haml | 2 +- app/views/profiles/preferences/show.html.haml | 8 ++++---- app/views/profiles/show.html.haml | 9 ++------- 13 files changed, 48 insertions(+), 50 deletions(-) diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 27a4c4db8c..48d9f890f6 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -27,6 +27,10 @@ border-bottom: 1px solid #e7e9ed; color: $gl-gray; + &.top-block { + border-top: none; + } + &.middle-block { margin-top: 0; margin-bottom: 0; diff --git a/app/views/layouts/nav/_profile.html.haml b/app/views/layouts/nav/_profile.html.haml index 33fd5fcef6..abdb754465 100644 --- a/app/views/layouts/nav/_profile.html.haml +++ b/app/views/layouts/nav/_profile.html.haml @@ -11,7 +11,7 @@ = link_to profile_path, title: 'Profile', data: {placement: 'right'} do = icon('user fw') %span - Profile + Profile Settings = nav_link(controller: [:accounts, :two_factor_auths]) do = link_to profile_account_path, title: 'Account', data: {placement: 'right'} do = icon('gear fw') diff --git a/app/views/layouts/profile.html.haml b/app/views/layouts/profile.html.haml index 77d2ccbf76..b80ce0dfc7 100644 --- a/app/views/layouts/profile.html.haml +++ b/app/views/layouts/profile.html.haml @@ -1,5 +1,6 @@ - page_title "Profile Settings" -- header_title "Profile Settings", profile_path +- unless @header_title + - header_title "Profile Settings", profile_path - sidebar "profile" = render template: "layouts/application" diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 767fe2e0e9..2d2a9ac800 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -1,9 +1,6 @@ - page_title "Account" -%h3.page-title - = page_title -%p.light - Change your username and basic account settings. -%hr +- header_title page_title, profile_account_path + - if current_user.ldap_user? .alert.alert-info Some options are unavailable for LDAP accounts @@ -69,7 +66,7 @@ - button_based_providers.each do |provider| .btn-group = link_to provider_image_tag(provider), user_omniauth_authorize_path(provider), method: :post, class: "btn btn-lg #{'active' if auth_active?(provider)}", "data-no-turbolink" => "true" - + - if auth_active?(provider) = link_to unlink_profile_account_path(provider: provider), method: :delete, class: 'btn btn-lg' do = icon('close') diff --git a/app/views/profiles/applications.html.haml b/app/views/profiles/applications.html.haml index 3a3e6e1b1c..2342936a5d 100644 --- a/app/views/profiles/applications.html.haml +++ b/app/views/profiles/applications.html.haml @@ -1,13 +1,12 @@ - page_title "Applications" -%h3.page-title - = page_title -%p.light +- header_title page_title, applications_profile_path + +.gray-content-block.top-block - if user_oauth_applications? - Manage applications that can use GitLab as an OAuth provider, + Manage applications that can use GitLab as an OAuth provider, and applications that you've authorized to use your account. - else Manage applications that you've authorized to use your account. -%hr - if user_oauth_applications? .oauth-applications diff --git a/app/views/profiles/audit_log.html.haml b/app/views/profiles/audit_log.html.haml index 698d603742..8fdba45b19 100644 --- a/app/views/profiles/audit_log.html.haml +++ b/app/views/profiles/audit_log.html.haml @@ -1,5 +1,8 @@ - page_title "Audit Log" -%h3.page-title Audit Log -%p.light History of authentications +- header_title page_title, audit_log_profile_path -= render 'event_table', events: @events \ No newline at end of file +.gray-content-block.top-block + History of authentications + +.prepend-top-default += render 'event_table', events: @events diff --git a/app/views/profiles/emails/index.html.haml b/app/views/profiles/emails/index.html.haml index 66812872c4..1d140347a5 100644 --- a/app/views/profiles/emails/index.html.haml +++ b/app/views/profiles/emails/index.html.haml @@ -1,12 +1,10 @@ - page_title "Emails" -%h3.page-title - = page_title -%p.light +- header_title page_title, profile_emails_path + +.gray-content-block.top-block Control emails linked to your account -%hr - -%ul +%ul.prepend-top-default %li Your %b Primary Email diff --git a/app/views/profiles/keys/index.html.haml b/app/views/profiles/keys/index.html.haml index 06655f7ba3..14adba1c79 100644 --- a/app/views/profiles/keys/index.html.haml +++ b/app/views/profiles/keys/index.html.haml @@ -1,11 +1,12 @@ - page_title "SSH Keys" -%h3.page-title - = page_title +- header_title page_title, profile_keys_path + +.gray-content-block.top-block .pull-right = link_to "Add SSH Key", new_profile_key_path, class: "btn btn-new" -%p.light - Before you can add an SSH key you need to - = link_to "generate it.", help_page_path("ssh", "README") -%hr + .oneline + Before you can add an SSH key you need to + = link_to "generate it.", help_page_path("ssh", "README") +.prepend-top-default = render 'key_table' diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index db7fa2eabe..ea4e5f3e18 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -1,10 +1,10 @@ - page_title "Notifications" -%h3.page-title - = page_title -%p.light - These are your global notification settings. -%hr +- header_title page_title, profile_notifications_path +.gray-content-block.top-block + These are your global notification settings. + +.prepend-top-default = form_for @user, url: profile_notifications_path, method: :put, html: { class: 'update-notifications form-horizontal global-notifications-form' } do |f| -if @user.errors.any? %div.alert.alert-danger diff --git a/app/views/profiles/passwords/edit.html.haml b/app/views/profiles/passwords/edit.html.haml index 399ae98adf..fab7c45c9b 100644 --- a/app/views/profiles/passwords/edit.html.haml +++ b/app/views/profiles/passwords/edit.html.haml @@ -1,13 +1,13 @@ - page_title "Password" -%h3.page-title - = page_title -%p.light +- header_title page_title, edit_profile_password_path + +.gray-content-block.top-block - if @user.password_automatically_set? Set your password. - else Change your password or recover your current one. -%hr -.update-password + +.update-password.prepend-top-default = form_for @user, url: profile_password_path, method: :put, html: { class: 'form-horizontal' } do |f| %div %p.slead diff --git a/app/views/profiles/passwords/new.html.haml b/app/views/profiles/passwords/new.html.haml index 9c6204963e..d165f758c8 100644 --- a/app/views/profiles/passwords/new.html.haml +++ b/app/views/profiles/passwords/new.html.haml @@ -12,7 +12,7 @@ %ul - @user.errors.full_messages.each do |msg| %li= msg - + - unless @user.password_automatically_set? .form-group = f.label :current_password, class: 'control-label' diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index aa0361a0a1..f8cbdb7932 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -1,11 +1,11 @@ - page_title 'Preferences' -%h3.page-title - = page_title -%p.light +- header_title page_title, profile_preferences_path + +.gray-content-block.top-block These settings allow you to customize the appearance and behavior of the site. They are saved with your account and will persist to any device you use to access the site. -%hr +.prepend-top-default = form_for @user, url: profile_preferences_path, remote: true, method: :put, html: {class: 'js-preferences-form form-horizontal'} do |f| .panel.panel-default.application-theme diff --git a/app/views/profiles/show.html.haml b/app/views/profiles/show.html.haml index c519e52e59..47412e2ef0 100644 --- a/app/views/profiles/show.html.haml +++ b/app/views/profiles/show.html.haml @@ -1,14 +1,9 @@ -- page_title "Profile" -%h3.page-title - = page_title -%p.light +.gray-content-block.top-block This information will appear on your profile. - if current_user.ldap_user? Some options are unavailable for LDAP accounts -%hr - - +.prepend-top-default = form_for @user, url: profile_path, method: :put, html: { multipart: true, class: "edit_user form-horizontal" }, authenticity_token: true do |f| -if @user.errors.any? %div.alert.alert-danger From 10b6a9248159830f45012a1d551e82d86aeb75d0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 9 Sep 2015 23:29:19 +0200 Subject: [PATCH 182/247] Style panels and add blank container Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_bootstrap.scss | 14 +++++++++++- app/assets/stylesheets/base/gl_variables.scss | 11 +++++----- app/assets/stylesheets/generic/buttons.scss | 2 +- app/assets/stylesheets/generic/sidebar.scss | 6 +++++ app/helpers/page_layout_helper.rb | 22 +++++++++++++++++++ app/views/layouts/_page.html.haml | 2 +- app/views/profiles/preferences/show.html.haml | 4 ++-- app/views/projects/edit.html.haml | 7 +++--- 8 files changed, 55 insertions(+), 13 deletions(-) diff --git a/app/assets/stylesheets/base/gl_bootstrap.scss b/app/assets/stylesheets/base/gl_bootstrap.scss index ae72c5b8d9..94508b902c 100644 --- a/app/assets/stylesheets/base/gl_bootstrap.scss +++ b/app/assets/stylesheets/base/gl_bootstrap.scss @@ -157,8 +157,10 @@ * */ .panel { + box-shadow: none; .panel-heading { - font-weight: bold; + font-size: 17px; + line-height: 38px; .panel-head-actions { position: relative; @@ -182,6 +184,10 @@ .pagination { margin: 0; } + + .btn { + min-width: 124px; + } } &.panel-small { @@ -209,6 +215,12 @@ } } +.alert-help { + background-color: $background-color; + border: 1px solid $border-color; + color: $gl-gray; +} + // Typography ================================================================= .text-primary, diff --git a/app/assets/stylesheets/base/gl_variables.scss b/app/assets/stylesheets/base/gl_variables.scss index d18b48eaca..bfef5f78f8 100644 --- a/app/assets/stylesheets/base/gl_variables.scss +++ b/app/assets/stylesheets/base/gl_variables.scss @@ -114,11 +114,12 @@ $alert-border-radius: 0; // //## -$panel-border-radius: 0; -$panel-default-text: $text-color; -$panel-default-border: #E7E9ED; -$panel-default-heading-bg: #F8FAFC; - +$panel-border-radius: 2px; +$panel-default-text: $text-color; +$panel-default-border: $border-color; +$panel-default-heading-bg: $background-color; +$panel-footer-bg: $background-color; +$panel-inner-border: $border-color; //== Wells // diff --git a/app/assets/stylesheets/generic/buttons.scss b/app/assets/stylesheets/generic/buttons.scss index e823750909..46ef595ddf 100644 --- a/app/assets/stylesheets/generic/buttons.scss +++ b/app/assets/stylesheets/generic/buttons.scss @@ -10,7 +10,7 @@ } &.btn-save { - @extend .btn-primary; + @extend .btn-success; } &.btn-remove { diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 22720c2e1d..f501bd579e 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -28,6 +28,12 @@ padding: $gl-padding; border: 1px solid #e7e9ed; min-height: 90vh; + + &.container-blank { + background: none; + padding: 0; + border: none; + } } } diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb index 8473d6d75d..bfbaf11c25 100644 --- a/app/helpers/page_layout_helper.rb +++ b/app/helpers/page_layout_helper.rb @@ -31,4 +31,26 @@ module PageLayoutHelper @fluid_layout end end + + def blank_container(enabled = false) + if @blank_container.nil? + @blank_container = enabled + else + @blank_container + end + end + + def container_class + css_class = "container-fluid" + + if fluid_layout + css_class += " container-limited" + end + + if blank_container + css_class += " container-blank" + end + + css_class + end end diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index c1746676ae..707905ee92 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -19,7 +19,7 @@ = current_user.username .content-wrapper = render "layouts/flash" - %div{ class: fluid_layout ? "container-fluid" : "container-fluid container-limited" } + %div{ class: container_class } .content .clearfix = yield diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index f8cbdb7932..60289bfe7c 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -1,11 +1,11 @@ - page_title 'Preferences' - header_title page_title, profile_preferences_path +- @blank_container = true -.gray-content-block.top-block +.alert.alert-help These settings allow you to customize the appearance and behavior of the site. They are saved with your account and will persist to any device you use to access the site. -.prepend-top-default = form_for @user, url: profile_preferences_path, remote: true, method: :put, html: {class: 'js-preferences-form form-horizontal'} do |f| .panel.panel-default.application-theme diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index e8e65d87f4..90dce73999 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -1,10 +1,11 @@ +- @blank_container = true + .project-edit-container .project-edit-errors .project-edit-content - %div - %h3.page-title + .panel.panel-default + .panel-heading Project settings - %hr .panel-body = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit_project form-horizontal fieldset-form" }, authenticity_token: true do |f| From 12ad9b4ba0341ac7b5012dd52b1d6cd6e68f778a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 9 Sep 2015 23:38:27 +0200 Subject: [PATCH 183/247] Enable blank container for group settings page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/gl_bootstrap.scss | 10 +++++++--- app/views/groups/edit.html.haml | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/base/gl_bootstrap.scss b/app/assets/stylesheets/base/gl_bootstrap.scss index 94508b902c..eb8d23d645 100644 --- a/app/assets/stylesheets/base/gl_bootstrap.scss +++ b/app/assets/stylesheets/base/gl_bootstrap.scss @@ -156,12 +156,16 @@ * Add some extra stuff to panels * */ + +.container-blank .panel .panel-heading { + font-size: 17px; + line-height: 38px; +} + .panel { box-shadow: none; - .panel-heading { - font-size: 17px; - line-height: 38px; + .panel-heading { .panel-head-actions { position: relative; top: -5px; diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index 2ff4b7e23e..ac7d9ba0f4 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -1,3 +1,4 @@ +- @blank_container = true .panel.panel-default .panel-heading %strong= @group.name From 960a1880ab09f8c12d6f7a7c22296c876ddad1ac Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 9 Sep 2015 23:49:34 +0200 Subject: [PATCH 184/247] Fix last element of sidebar being hidden for small screens Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/sidebar.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index f501bd579e..41ffd35857 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -39,7 +39,7 @@ .nav-sidebar { margin-top: 14 + $header-height; - margin-bottom: 50px; + margin-bottom: 100px; transition-duration: .3s; list-style: none; overflow: hidden; From def939a5628fb3df24b39dbe7b39636968c294ed Mon Sep 17 00:00:00 2001 From: Darby Date: Wed, 9 Sep 2015 15:04:38 -0700 Subject: [PATCH 185/247] Turned off autocomplete for new issue titles --- app/views/shared/issuable/_form.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index 09327d645f..1aa1e3c6c9 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -9,7 +9,7 @@ = f.label :title, class: 'control-label' do %strong= 'Title *' .col-sm-10 - = f.text_field :title, maxlength: 255, autofocus: true, + = f.text_field :title, maxlength: 255, autofocus: true, autocomplete: 'off', class: 'form-control pad js-gfm-input', required: true - if issuable.is_a?(MergeRequest) From a0359fbd77c0a4fcbac30c15544b1a3432bfe8bf Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 00:34:09 +0200 Subject: [PATCH 186/247] Improve accounts page UI Signed-off-by: Dmitriy Zaporozhets --- app/views/profiles/accounts/show.html.haml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index 2d2a9ac800..cd7b1b0fe0 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -1,5 +1,6 @@ - page_title "Account" - header_title page_title, profile_account_path +- @blank_container = true - if current_user.ldap_user? .alert.alert-info From 19cba632d846c9fcf736133eb62db1b8905c5009 Mon Sep 17 00:00:00 2001 From: Duke Date: Wed, 9 Sep 2015 21:20:51 -0300 Subject: [PATCH 187/247] fix 7.14 stable branch name --- doc/update/6.x-or-7.x-to-7.14.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/update/6.x-or-7.x-to-7.14.md b/doc/update/6.x-or-7.x-to-7.14.md index 5bc1f84270..b34fb12da6 100644 --- a/doc/update/6.x-or-7.x-to-7.14.md +++ b/doc/update/6.x-or-7.x-to-7.14.md @@ -162,7 +162,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab TIP: to see what changed in `gitlab.yml.example` in this release use next command: ``` -git diff 6-0-stable:config/gitlab.yml.example 7.14-stable:config/gitlab.yml.example +git diff 6-0-stable:config/gitlab.yml.example 7-14-stable:config/gitlab.yml.example ``` * Make `/home/git/gitlab/config/gitlab.yml` the same as https://gitlab.com/gitlab-org/gitlab-ce/blob/7-14-stable/config/gitlab.yml.example but with your settings. From 253bc0ca15a9b2f459aef94a33de926984747f35 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 10 Sep 2015 00:19:53 -0700 Subject: [PATCH 188/247] Fix test --- features/steps/admin/users.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/features/steps/admin/users.rb b/features/steps/admin/users.rb index 2e17d5c4c2..4bc290b6bd 100644 --- a/features/steps/admin/users.rb +++ b/features/steps/admin/users.rb @@ -4,11 +4,13 @@ class Spinach::Features::AdminUsers < Spinach::FeatureSteps include SharedAdmin before do - allow(Devise).to receive(:omniauth_providers).and_return([:twitter, :twitter_updated]) + allow(Gitlab::OAuth::Provider).to receive(:providers).and_return([:twitter, :twitter_updated]) + allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_return(root_path) end after do - allow(Devise).to receive(:omniauth_providers).and_call_original + allow(Gitlab::OAuth::Provider).to receive(:providers).and_call_original + allow_any_instance_of(ApplicationHelper).to receive(:user_omniauth_authorize_path).and_call_original end step 'I should see all users' do From af3b6f6362d34077d100385b71f9fe2a0ce8a446 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 09:51:37 +0200 Subject: [PATCH 189/247] Fix fixed layout Signed-off-by: Dmitriy Zaporozhets --- app/helpers/page_layout_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb index bfbaf11c25..df37be51ce 100644 --- a/app/helpers/page_layout_helper.rb +++ b/app/helpers/page_layout_helper.rb @@ -43,7 +43,7 @@ module PageLayoutHelper def container_class css_class = "container-fluid" - if fluid_layout + unless fluid_layout css_class += " container-limited" end From d7501c7bb914151ac77a9c07342a7d129724cb6c Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Thu, 10 Sep 2015 09:25:41 +0100 Subject: [PATCH 190/247] Fix sudo_gitlab helper --- lib/tasks/gitlab/check.rake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/tasks/gitlab/check.rake b/lib/tasks/gitlab/check.rake index bcd25ccbaf..b8eb13a4fe 100644 --- a/lib/tasks/gitlab/check.rake +++ b/lib/tasks/gitlab/check.rake @@ -882,10 +882,8 @@ namespace :gitlab do "doc/install/installation.md in section \"#{section}\"" end - def sudo_gitlab(command, env = nil) - cmd = "sudo -u #{gitlab_user} -H #{command}" - cmd.prepend "#{env} " if env - cmd + def sudo_gitlab(command) + "sudo -u #{gitlab_user} -H #{command}" end def gitlab_user From 86ef2eb7281346df5b473f3cf3196a1f76caf002 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 12:35:37 +0200 Subject: [PATCH 191/247] Conver forked from button to text Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/projects.scss | 1 - app/views/projects/_home_panel.html.haml | 13 +++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 361fd63bc7..d3c8459570 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -48,7 +48,6 @@ p { color: #7f8fa4; - display: inline; } } diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index b93036e78e..dbecd1e719 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -7,6 +7,13 @@ - if @project.description.present? = markdown(@project.description, pipeline: :description) + - if forked_from_project = @project.forked_from_project + %p + Forked from + = link_to project_path(forked_from_project) do + = forked_from_project.namespace.try(:name) + + .project-repo-buttons = render 'projects/buttons/star' @@ -14,12 +21,6 @@ - unless empty_repo = render 'projects/buttons/fork' - - if forked_from_project = @project.forked_from_project - = link_to project_path(forked_from_project), class: 'btn' do - = icon("code-fork fw") - Forked from - = forked_from_project.namespace.try(:name) - - if can? current_user, :download_code, @project = link_to archive_namespace_project_repository_path(@project.namespace, @project, ref: @ref, format: 'zip'), class: 'btn', rel: 'nofollow' do = icon('download fw') From 6933da1ee0eb42146978be751e4feaa889e4790a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 12:38:07 +0200 Subject: [PATCH 192/247] Refactor md variables Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/base/mixins.scss | 4 ++-- app/assets/stylesheets/base/variables.scss | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/base/mixins.scss b/app/assets/stylesheets/base/mixins.scss index 0f661d6b1b..a2f6c3e21f 100644 --- a/app/assets/stylesheets/base/mixins.scss +++ b/app/assets/stylesheets/base/mixins.scss @@ -55,10 +55,10 @@ } @mixin md-typography { - color: #444; + color: $md-text-color; a { - color: #3084bb; + color: $md-link-color; } img { diff --git a/app/assets/stylesheets/base/variables.scss b/app/assets/stylesheets/base/variables.scss index 21462b3112..2fc7bf1720 100644 --- a/app/assets/stylesheets/base/variables.scss +++ b/app/assets/stylesheets/base/variables.scss @@ -2,6 +2,8 @@ $hover: #FFFAF1; $gl-text-color: #54565b; $gl-header-color: #4c4e54; $gl-link-color: #333c48; +$md-text-color: #444; +$md-link-color: #3084bb; $nprogress-color: #c0392b; $gl-font-size: 15px; $list-font-size: 15px; From df51b029abb92c78c168c9f9e18f5a90c7da32f6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 13:14:25 +0200 Subject: [PATCH 193/247] Improve project fork page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/pages/projects.scss | 26 ++++++++-------------- app/views/projects/forks/new.html.haml | 21 ++++++++--------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index d3c8459570..53004fca35 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -203,26 +203,18 @@ ul.nav.nav-projects-tabs { } .fork-namespaces { - .thumbnail { + .fork-thumbnail { + text-align: center; + margin-bottom: $gl-padding; - &.fork-exists-thumbnail { - border-color: #EEE; - - .caption { - color: #999; - } + .caption { + padding: $gl-padding 0; + min-height: 30px; } - &.fork-thumbnail { - border-color: #AAA; - - &:hover { - background-color: $hover; - } - } - - a { - text-decoration: none; + img { + @include border-radius(50%); + max-width: 100px; } } } diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index b7a2ed68e2..cd5f3a5d39 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -10,21 +10,22 @@ - group.each do |namespace| .col-md-2.col-sm-3 - if fork = namespace.find_fork_of(@project) - .thumbnail.fork-exists-thumbnail + .fork-thumbnail = link_to project_path(fork), title: "Visit project fork", class: 'has_tooltip' do - = image_tag namespace_icon(namespace, 200) + = image_tag namespace_icon(namespace, 100) .caption - %h4=namespace.human_name - %p - = namespace.path + %strong + = namespace.human_name + %div.text-primary + Already forked + - else - .thumbnail.fork-thumbnail + .fork-thumbnail = link_to namespace_project_fork_path(@project.namespace, @project, namespace_key: namespace.id), title: "Fork here", method: "POST", class: 'has_tooltip' do - = image_tag namespace_icon(namespace, 200) + = image_tag namespace_icon(namespace, 100) .caption - %h4=namespace.human_name - %p - = namespace.path + %strong + = namespace.human_name %p.light Fork is a copy of a project repository. From b08c5521f5858d6643d53b5a8e4bc180d2780022 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 13:25:09 +0200 Subject: [PATCH 194/247] Style blob show page Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/files.scss | 5 ++++- app/assets/stylesheets/pages/diff.scss | 6 +++--- app/assets/stylesheets/pages/tree.scss | 7 ++----- app/views/projects/blob/_blob.html.haml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/generic/files.scss b/app/assets/stylesheets/generic/files.scss index f845342c67..952d4ecdbe 100644 --- a/app/assets/stylesheets/generic/files.scss +++ b/app/assets/stylesheets/generic/files.scss @@ -3,7 +3,10 @@ * */ .file-holder { - border: 1px solid $border-color; + margin-left: -$gl-padding; + margin-right: -$gl-padding; + border: none; + border-top: 1px solid #E7E9EE; margin-bottom: 1em; table { diff --git a/app/assets/stylesheets/pages/diff.scss b/app/assets/stylesheets/pages/diff.scss index 487b600e31..5e7e59a6af 100644 --- a/app/assets/stylesheets/pages/diff.scss +++ b/app/assets/stylesheets/pages/diff.scss @@ -1,6 +1,6 @@ .diff-file { - margin-left: -16px; - margin-right: -16px; + margin-left: -$gl-padding; + margin-right: -$gl-padding; border: none; border-bottom: 1px solid #E7E9EE; @@ -8,7 +8,7 @@ position: relative; background: $background-color; border-bottom: 1px solid $border-color; - padding: 10px 15px; + padding: 10px 16px; color: #555; z-index: 10; diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index 587d09a04a..d93b43b204 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -132,17 +132,14 @@ list-style: none; margin: 0; padding: 0; - margin-bottom: 10px; + margin-bottom: 5px; .commit { - padding: 10px 15px; + padding: $gl-padding 0; .commit-row-title { - font-size: 13px; - .commit-row-message { font-weight: normal; - color: #555; } } } diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 65c3ab10e0..b4c7d8b9b7 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -15,7 +15,7 @@ - else = link_to title, '#' -%ul.blob-commit-info.well.hidden-xs +%ul.blob-commit-info.hidden-xs - blob_commit = @repository.last_commit_for_path(@commit.id, blob.path) = render blob_commit, project: @project From 059b8828d38e763d9776e55d5b4962f5fc419ddb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 10 Sep 2015 13:36:42 +0200 Subject: [PATCH 195/247] Style syntax highlight area for white theme Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/files.scss | 32 +++++++++++++++++++-- app/assets/stylesheets/highlight/white.scss | 8 ++++-- app/assets/stylesheets/pages/tree.scss | 30 ------------------- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/app/assets/stylesheets/generic/files.scss b/app/assets/stylesheets/generic/files.scss index 952d4ecdbe..9dd7774788 100644 --- a/app/assets/stylesheets/generic/files.scss +++ b/app/assets/stylesheets/generic/files.scss @@ -7,6 +7,7 @@ margin-right: -$gl-padding; border: none; border-top: 1px solid #E7E9EE; + border-bottom: 1px solid #E7E9EE; margin-bottom: 1em; table { @@ -52,7 +53,7 @@ } &.wiki { - padding: 25px; + padding: $gl-padding; .highlight { margin-bottom: 9px; @@ -93,7 +94,7 @@ border-right: none; } background: #fff; - padding: 8px; + padding: 10px $gl-padding; } .lines { pre { @@ -103,6 +104,33 @@ border: none; } } + img.avatar { + border: 0 none; + float: none; + margin: 0; + padding: 0; + } + td.blame-commit { + background: #f9f9f9; + min-width: 350px; + + .commit-author-link { + color: #888; + } + } + td.blame-numbers { + pre { + color: #AAA; + white-space: pre; + } + background: #f1f1f1; + border-left: 1px solid #DDD; + } + td.lines { + code { + font-family: $monospace_font; + } + } } &.logs { diff --git a/app/assets/stylesheets/highlight/white.scss b/app/assets/stylesheets/highlight/white.scss index e0edfb80b4..5de589109b 100644 --- a/app/assets/stylesheets/highlight/white.scss +++ b/app/assets/stylesheets/highlight/white.scss @@ -5,15 +5,19 @@ pre.code.highlight.white, background-color: #fff; color: #333; - pre.highlight, .line-numbers, .line-numbers a { + background-color: $background-color !important; + color: $gl-gray !important; + } + + pre.highlight { background-color: #fff !important; color: #333 !important; } pre.code { - border-left: 1px solid #bbb; + border-left: 1px solid $border-color; } // highlight line via anchor diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index d93b43b204..71ca37c0cd 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -78,36 +78,6 @@ } } } - - .blame { - img.avatar { - border: 0 none; - float: none; - margin: 0; - padding: 0; - } - td.blame-commit { - background: #f9f9f9; - min-width: 350px; - - .commit-author-link { - color: #888; - } - } - td.blame-numbers { - pre { - color: #AAA; - white-space: pre; - } - background: #f1f1f1; - border-left: 1px solid #DDD; - } - td.lines { - code { - font-family: $monospace_font; - } - } - } } .tree-ref-holder { From 9d3344adbbfc84ef8abc96366bdfa695293cd6c0 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 10 Sep 2015 08:23:10 -0700 Subject: [PATCH 196/247] Gracefully handle errors in syntax highlighting by leaving the block unformatted Closes #2433 --- CHANGELOG | 1 + .../markdown/syntax_highlight_filter.rb | 6 ++++- .../markdown/syntax_highlight_filter_spec.rb | 22 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 36ee3e69ab..2c135d3475 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) + - Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu) - Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu) - Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu) - Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU) diff --git a/lib/gitlab/markdown/syntax_highlight_filter.rb b/lib/gitlab/markdown/syntax_highlight_filter.rb index 86f4385753..f9527c7286 100644 --- a/lib/gitlab/markdown/syntax_highlight_filter.rb +++ b/lib/gitlab/markdown/syntax_highlight_filter.rb @@ -21,7 +21,11 @@ module Gitlab language = node.attr('class') code = node.text - highlighted = block_code(code, language) + begin + highlighted = block_code(code, language) + rescue + highlighted = "

#{code}
" + end # Replace the parent `pre` element with the entire highlighted block node.parent.replace(highlighted) diff --git a/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb b/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb new file mode 100644 index 0000000000..ecef31853f --- /dev/null +++ b/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +module Gitlab::Markdown + describe SyntaxHighlightFilter do + include FilterSpecHelper + + let(:project) { create(:empty_project) } + let(:reference) { snippet.to_reference } + + it 'highlights valid code blocks' do + result = filter('
def fun end')
+      expect(result.to_html).to eq("
def fun end
\n") + end + + it 'passes through invalid code blocks' do + allow_any_instance_of(SyntaxHighlightFilter).to receive(:block_code).and_raise(StandardError) + + result = filter('
This is a test
') + expect(result.to_html).to eq('
This is a test
') + end + end +end From 9bda4b8d88fc93b8938d8c4d001d6660d112ae1c Mon Sep 17 00:00:00 2001 From: Petheo Bence Date: Thu, 3 Sep 2015 15:38:54 +0200 Subject: [PATCH 197/247] Added service API endpoint to retrieve service parameters --- CHANGELOG | 1 + doc/api/services.md | 160 +++++++++++++++++++++++++++++ lib/api/services.rb | 10 ++ lib/tasks/services.rake | 9 ++ spec/requests/api/services_spec.rb | 10 ++ 5 files changed, 190 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 36ee3e69ab..710f6e6891 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -43,6 +43,7 @@ v 8.0.0 (unreleased) - Add support for Crowd - Global Labels that are available to all projects - Fix highlighting of deleted lines in diffs. + - Added service API endpoint to retrieve service parameters (Petheő Bence) v 7.14.1 - Improve abuse reports management from admin area diff --git a/doc/api/services.md b/doc/api/services.md index bc5049dd30..7d45b2cf46 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -27,6 +27,14 @@ Delete Asana service for a project. DELETE /projects/:id/services/asana ``` +### Get Asana service settings + +Get Asana service settings for a project. + +``` +GET /projects/:id/services/asana +``` + ## Assembla Project Management Software (Source Commits Endpoint) @@ -52,6 +60,14 @@ Delete Assembla service for a project. DELETE /projects/:id/services/assembla ``` +### Get Assembla service settings + +Get Assembla service settings for a project. + +``` +GET /projects/:id/services/assembla +``` + ## Atlassian Bamboo CI A continuous integration and build server @@ -81,6 +97,14 @@ Delete Atlassian Bamboo CI service for a project. DELETE /projects/:id/services/bamboo ``` +### Get Atlassian Bamboo CI service settings + +Get Atlassian Bamboo CI service settings for a project. + +``` +GET /projects/:id/services/bamboo +``` + ## Buildkite Continuous integration and deployments @@ -107,6 +131,14 @@ Delete Buildkite service for a project. DELETE /projects/:id/services/buildkite ``` +### Get Buildkite service settings + +Get Buildkite service settings for a project. + +``` +GET /projects/:id/services/buildkite +``` + ## Campfire Simple web-based real-time group chat @@ -133,6 +165,14 @@ Delete Campfire service for a project. DELETE /projects/:id/services/campfire ``` +### Get Campfire service settings + +Get Campfire service settings for a project. + +``` +GET /projects/:id/services/campfire +``` + ## Custom Issue Tracker Custom issue tracker @@ -161,6 +201,14 @@ Delete Custom Issue Tracker service for a project. DELETE /projects/:id/services/custom-issue-tracker ``` +### Get Custom Issue Tracker service settings + +Get Custom Issue Tracker service settings for a project. + +``` +GET /projects/:id/services/custom-issue-tracker +``` + ## Drone CI Drone is a Continuous Integration platform built on Docker, written in Go @@ -187,6 +235,14 @@ Delete Drone CI service for a project. DELETE /projects/:id/services/drone-ci ``` +### Get Drone CI service settings + +Get Drone CI service settings for a project. + +``` +GET /projects/:id/services/drone-ci +``` + ## Emails on push Email the commits and diff of each push to a list of recipients. @@ -213,6 +269,14 @@ Delete Emails on push service for a project. DELETE /projects/:id/services/emails-on-push ``` +### Get Emails on push service settings + +Get Emails on push service settings for a project. + +``` +GET /projects/:id/services/emails-on-push +``` + ## External Wiki Replaces the link to the internal wiki with a link to an external wiki. @@ -237,6 +301,14 @@ Delete External Wiki service for a project. DELETE /projects/:id/services/external-wiki ``` +### Get External Wiki service settings + +Get External Wiki service settings for a project. + +``` +GET /projects/:id/services/external-wiki +``` + ## Flowdock Flowdock is a collaboration web app for technical teams. @@ -261,6 +333,14 @@ Delete Flowdock service for a project. DELETE /projects/:id/services/flowdock ``` +### Get Flowdock service settings + +Get Flowdock service settings for a project. + +``` +GET /projects/:id/services/flowdock +``` + ## Gemnasium Gemnasium monitors your project dependencies and alerts you about updates and security vulnerabilities. @@ -286,6 +366,14 @@ Delete Gemnasium service for a project. DELETE /projects/:id/services/gemnasium ``` +### Get Gemnasium service settings + +Get Gemnasium service settings for a project. + +``` +GET /projects/:id/services/gemnasium +``` + ## GitLab CI Continuous integration server from GitLab @@ -312,6 +400,14 @@ Delete GitLab CI service for a project. DELETE /projects/:id/services/gitlab-ci ``` +### Get GitLab CI service settings + +Get GitLab CI service settings for a project. + +``` +GET /projects/:id/services/gitlab-ci +``` + ## HipChat Private group chat and IM @@ -341,6 +437,14 @@ Delete HipChat service for a project. DELETE /projects/:id/services/hipchat ``` +### Get HipChat service settings + +Get HipChat service settings for a project. + +``` +GET /projects/:id/services/hipchat +``` + ## Irker (IRC gateway) Send IRC messages, on update, to a list of recipients through an Irker gateway. @@ -371,6 +475,14 @@ Delete Irker (IRC gateway) service for a project. DELETE /projects/:id/services/irker ``` +### Get Irker (IRC gateway) service settings + +Get Irker (IRC gateway) service settings for a project. + +``` +GET /projects/:id/services/irker +``` + ## JIRA Jira issue tracker @@ -400,6 +512,14 @@ Delete JIRA service for a project. DELETE /projects/:id/services/jira ``` +### Get JIRA service settings + +Get JIRA service settings for a project. + +``` +GET /projects/:id/services/jira +``` + ## PivotalTracker Project Management Software (Source Commits Endpoint) @@ -424,6 +544,14 @@ Delete PivotalTracker service for a project. DELETE /projects/:id/services/pivotaltracker ``` +### Get PivotalTracker service settings + +Get PivotalTracker service settings for a project. + +``` +GET /projects/:id/services/pivotaltracker +``` + ## Pushover Pushover makes it easy to get real-time notifications on your Android device, iPhone, iPad, and Desktop. @@ -452,6 +580,14 @@ Delete Pushover service for a project. DELETE /projects/:id/services/pushover ``` +### Get Pushover service settings + +Get Pushover service settings for a project. + +``` +GET /projects/:id/services/pushover +``` + ## Redmine Redmine issue tracker @@ -479,6 +615,14 @@ Delete Redmine service for a project. DELETE /projects/:id/services/redmine ``` +### Get Redmine service settings + +Get Redmine service settings for a project. + +``` +GET /projects/:id/services/redmine +``` + ## Slack A team communication tool for the 21st century @@ -505,6 +649,14 @@ Delete Slack service for a project. DELETE /projects/:id/services/slack ``` +### Get Slack service settings + +Get Slack service settings for a project. + +``` +GET /projects/:id/services/slack +``` + ## JetBrains TeamCity CI A continuous integration and build server @@ -534,3 +686,11 @@ Delete JetBrains TeamCity CI service for a project. DELETE /projects/:id/services/teamcity ``` +### Get JetBrains TeamCity CI service settings + +Get JetBrains TeamCity CI service settings for a project. + +``` +GET /projects/:id/services/teamcity +``` + diff --git a/lib/api/services.rb b/lib/api/services.rb index 73645cedea..d170b3067e 100644 --- a/lib/api/services.rb +++ b/lib/api/services.rb @@ -49,6 +49,16 @@ module API end end end + + # Get service settings for project + # + # Example Request: + # + # GET /project/:id/services/gitlab-ci + # + get ':id/services/:service_slug' do + present project_service + end end end end diff --git a/lib/tasks/services.rake b/lib/tasks/services.rake index 3f276a5e12..39541c0b9c 100644 --- a/lib/tasks/services.rake +++ b/lib/tasks/services.rake @@ -40,6 +40,15 @@ DELETE /projects/:id/services/<%= service[:dashed_name] %> ``` +### Get <%= service[:title] %> service settings + +Get <%= service[:title] %> service settings for a project. + +``` +GET /projects/:id/services/<%= service[:dashed_name] %> + +``` + <% end %> ERB diff --git a/spec/requests/api/services_spec.rb b/spec/requests/api/services_spec.rb index c297904614..fb3b235446 100644 --- a/spec/requests/api/services_spec.rb +++ b/spec/requests/api/services_spec.rb @@ -47,5 +47,15 @@ describe API::API, api: true do expect(project.send(service_method).activated?).to be_falsey end end + + describe "GET /projects/:id/services/#{service.dasherize}" do + include_context service + + it "should get #{service} settings" do + get api("/projects/#{project.id}/services/#{dashed_service}", user) + + expect(response.status).to eq(200) + end + end end end From c86865c1cf29cb39d0e2896351c3cf6c1925af6d Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 10 Sep 2015 13:59:27 -0400 Subject: [PATCH 198/247] Add missing 7.14.x CHANGELOG entries --- CHANGELOG | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 402fe61bbc..b41237f867 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -9,7 +9,6 @@ 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) - 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) @@ -37,15 +36,21 @@ v 8.0.0 (unreleased) - 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) + - 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 + - Fix bug which IE cannot show image at markdown when the image is raw file of gitlab - Add support for Crowd - Global Labels that are available to all projects - Fix highlighting of deleted lines in diffs. - Added service API endpoint to retrieve service parameters (Petheő Bence) +v 7.14.3 + - No changes + +v 7.14.2 + - Upgrade gitlab_git to 7.2.15 to fix `git blame` errors with ISO-encoded files (Stan Hu) + v 7.14.1 - Improve abuse reports management from admin area - Fix "Reload with full diff" URL button in compare branch view (Stan Hu) From 201f50b94f5fcd5fa2987fe1870947c4d3fa7739 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 10 Sep 2015 11:45:46 -0700 Subject: [PATCH 199/247] Fix some CHANGELOG entries --- CHANGELOG | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b41237f867..f03e7c489a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -44,6 +44,7 @@ v 8.0.0 (unreleased) - Global Labels that are available to all projects - Fix highlighting of deleted lines in diffs. - Added service API endpoint to retrieve service parameters (Petheő Bence) + - Add FogBugz project import (Jared Szechy) v 7.14.3 - No changes @@ -55,12 +56,9 @@ v 7.14.1 - Improve abuse reports management from admin area - Fix "Reload with full diff" URL button in compare branch view (Stan Hu) - Disabled DNS lookups for SSH in docker image (Rowan Wookey) - -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) - Ability to enable SSL verification for Webhooks - - Add FogBugz project import (Jared Szechy) v 7.14.0 - Fix bug where non-project members of the target project could set labels on new merge requests. From 3223a2a5ae477d82784998359f895ccddef42e1d Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 10 Sep 2015 11:51:48 -0700 Subject: [PATCH 200/247] Bump rouge to 1.10 to remove warning noise and fix other syntax highlighting bugs Closes #2128 Closes #2433 --- CHANGELOG | 1 + Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b41237f867..8cce3a1543 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) + - Bump rouge to 1.10 to remove warning noise and fix other syntax highlighting bugs (Stan Hu) - Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu) - Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu) - Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu) diff --git a/Gemfile.lock b/Gemfile.lock index dce7e4964a..647eb17d97 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -291,7 +291,7 @@ GEM github-markup (~> 1.3.1) gollum-grit_adapter (~> 0.1, >= 0.1.1) nokogiri (~> 1.6.4) - rouge (~> 1.9) + rouge (~> 1.10) sanitize (~> 2.1.0) stringex (~> 2.5.1) gon (5.0.1) @@ -544,7 +544,7 @@ GEM netrc (~> 0.7) rinku (1.7.3) rotp (1.6.1) - rouge (1.9.1) + rouge (1.10.0) rqrcode (0.4.2) rqrcode-rails3 (0.1.7) rqrcode (>= 0.4.2) From 7cbf5e4d18f6ba0bf1afbddcb090fa39837e9529 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Sat, 5 Sep 2015 17:50:47 -0400 Subject: [PATCH 201/247] Prevent result of SyntaxHighlightFilter being sanitized --- lib/gitlab/markdown/sanitization_filter.rb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/gitlab/markdown/sanitization_filter.rb b/lib/gitlab/markdown/sanitization_filter.rb index 68ed57f625..54faf981b7 100644 --- a/lib/gitlab/markdown/sanitization_filter.rb +++ b/lib/gitlab/markdown/sanitization_filter.rb @@ -67,12 +67,16 @@ module Gitlab def clean_spans lambda do |env| - return unless env[:node_name] == 'span' - return unless env[:node].has_attribute?('class') + node = env[:node] - unless has_ancestor?(env[:node], 'pre') - env[:node].remove_attribute('class') + return unless node.name == 'span' + return unless node.has_attribute?('class') + + unless has_ancestor?(node, 'pre') + node.remove_attribute('class') end + + {node_whitelist: [node]} end end end From 404a01ab148417f6314c94d213769dd72fd0589e Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 10 Sep 2015 15:28:42 -0400 Subject: [PATCH 202/247] Add specs for syntax_highlight JS Also makes it work when given a parent element containing a `.js-syntax-highlight` element so for dynamically-added things like notes or Markdown previews, we can more accurately target just the element we care about. --- .../javascripts/syntax_highlight.coffee | 10 ++++- .../syntax_highlight_spec.js.coffee | 42 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 spec/javascripts/syntax_highlight_spec.js.coffee diff --git a/app/assets/javascripts/syntax_highlight.coffee b/app/assets/javascripts/syntax_highlight.coffee index 71295cd4b0..980f0232d1 100644 --- a/app/assets/javascripts/syntax_highlight.coffee +++ b/app/assets/javascripts/syntax_highlight.coffee @@ -1,3 +1,5 @@ +# Syntax Highlighter +# # Applies a syntax highlighting color scheme CSS class to any element with the # `js-syntax-highlight` class # @@ -6,7 +8,13 @@ #
# $.fn.syntaxHighlight = -> - $(this).addClass(gon.user_color_scheme) + if $(this).hasClass('js-syntax-highlight') + # Given the element itself, apply highlighting + $(this).addClass(gon.user_color_scheme) + else + # Given a parent element, recurse to any of its applicable children + $children = $(this).find('.js-syntax-highlight') + $children.syntaxHighlight() if $children.length $(document).on 'ready page:load', -> $('.js-syntax-highlight').syntaxHighlight() diff --git a/spec/javascripts/syntax_highlight_spec.js.coffee b/spec/javascripts/syntax_highlight_spec.js.coffee new file mode 100644 index 0000000000..6a73b6bf32 --- /dev/null +++ b/spec/javascripts/syntax_highlight_spec.js.coffee @@ -0,0 +1,42 @@ +#= require syntax_highlight + +describe 'Syntax Highlighter', -> + stubUserColorScheme = (value) -> + window.gon ?= {} + window.gon.user_color_scheme = value + + describe 'on a js-syntax-highlight element', -> + beforeEach -> + fixture.set('
') + + it 'applies syntax highlighting', -> + stubUserColorScheme('monokai') + + $('.js-syntax-highlight').syntaxHighlight() + + expect($('.js-syntax-highlight')).toHaveClass('monokai') + + describe 'on a parent element', -> + beforeEach -> + fixture.set """ +
+
+
+
+
+ """ + + it 'applies highlighting to all applicable children', -> + stubUserColorScheme('monokai') + + $('.parent').syntaxHighlight() + + expect($('.parent, .foo')).not.toHaveClass('monokai') + expect($('.monokai').length).toBe(2) + + it 'prevents an infinite loop when no matches exist', -> + fixture.set('
') + + highlight = -> $('div').syntaxHighlight() + + expect(highlight).not.toThrow() From 4e54b82326e0a24c3b5196956f1e957b3f7c02e9 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 10 Sep 2015 15:29:56 -0400 Subject: [PATCH 203/247] Apply syntax highlighting to Markdown previews --- app/assets/javascripts/dropzone_input.js.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index a0dcaa8c27..6f789e668a 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -167,6 +167,7 @@ class @DropzoneInput dataType: "json" ).success (data) -> preview.html data.body + preview.syntaxHighlight() renderReferencedUsers data.references.users From 19c0bf2723bb0895159e4e4e0c6f47bc73157449 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 10 Sep 2015 15:30:06 -0400 Subject: [PATCH 204/247] Simplify syntax highlighting of new notes --- app/assets/javascripts/notes.js.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/notes.js.coffee b/app/assets/javascripts/notes.js.coffee index b7f2c63c5a..ce638c2641 100644 --- a/app/assets/javascripts/notes.js.coffee +++ b/app/assets/javascripts/notes.js.coffee @@ -122,8 +122,9 @@ class @Notes # or skip if rendered if @isNewNote(note) @note_ids.push(note.id) - $('ul.main-notes-list').append(note.html) - $('.js-syntax-highlight').syntaxHighlight() + $('ul.main-notes-list'). + append(note.html). + syntaxHighlight() @initTaskList() ### From e3c97ede9663fe7905fcb350875c46526cb4f832 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 10 Sep 2015 16:06:24 -0400 Subject: [PATCH 205/247] RU-BO-COOOOOOOOP --- lib/gitlab/markdown/sanitization_filter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/gitlab/markdown/sanitization_filter.rb b/lib/gitlab/markdown/sanitization_filter.rb index 54faf981b7..e368de7d84 100644 --- a/lib/gitlab/markdown/sanitization_filter.rb +++ b/lib/gitlab/markdown/sanitization_filter.rb @@ -76,7 +76,7 @@ module Gitlab node.remove_attribute('class') end - {node_whitelist: [node]} + { node_whitelist: [node] } end end end From e20529cec4f6de0c2c1589da99abb8714ea1c1c1 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 10 Sep 2015 13:38:43 -0700 Subject: [PATCH 206/247] Bump rouge to 1.10.1 --- CHANGELOG | 2 +- Gemfile.lock | 4 ++-- config/initializers/rouge_diff_lexer.rb | 24 ------------------------ 3 files changed, 3 insertions(+), 27 deletions(-) delete mode 100644 config/initializers/rouge_diff_lexer.rb diff --git a/CHANGELOG b/CHANGELOG index 8cce3a1543..c325d6b612 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,7 @@ Please view this file on the master branch, on stable branches it's out of date. v 8.0.0 (unreleased) - - Bump rouge to 1.10 to remove warning noise and fix other syntax highlighting bugs (Stan Hu) + - Bump rouge to 1.10.1 to remove warning noise and fix other syntax highlighting bugs (Stan Hu) - Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu) - Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu) - Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu) diff --git a/Gemfile.lock b/Gemfile.lock index 647eb17d97..f3091857b7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -291,7 +291,7 @@ GEM github-markup (~> 1.3.1) gollum-grit_adapter (~> 0.1, >= 0.1.1) nokogiri (~> 1.6.4) - rouge (~> 1.10) + rouge (~> 1.10.1) sanitize (~> 2.1.0) stringex (~> 2.5.1) gon (5.0.1) @@ -544,7 +544,7 @@ GEM netrc (~> 0.7) rinku (1.7.3) rotp (1.6.1) - rouge (1.10.0) + rouge (1.10.1) rqrcode (0.4.2) rqrcode-rails3 (0.1.7) rqrcode (>= 0.4.2) diff --git a/config/initializers/rouge_diff_lexer.rb b/config/initializers/rouge_diff_lexer.rb deleted file mode 100644 index fdb2d7b748..0000000000 --- a/config/initializers/rouge_diff_lexer.rb +++ /dev/null @@ -1,24 +0,0 @@ -# Here until https://github.com/jneen/rouge/pull/297 is merged into Rouge and the gem is updated in GitLab. -module Rouge - module Lexers - class Diff - def self.analyze_text(text) - return 1 if text.start_with?('Index: ') - return 1 if text.start_with?('diff ') - return 0.9 if text.start_with?('--- ') - end - - state :root do - rule(/^ .*\n/, Text) - rule(/^---\n/, Text) - rule(/^\+.*\n/, Generic::Inserted) - rule(/^-+.*\n/, Generic::Deleted) - rule(/^!.*\n/, Generic::Strong) - rule(/^@.*\n/, Generic::Subheading) - rule(/^([Ii]ndex|diff).*\n/, Generic::Heading) - rule(/^=.*\n/, Generic::Heading) - rule(/.*\n/, Text) - end - end - end -end From 267687993a437e0651eb5064c04479e65a43251f Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Thu, 10 Sep 2015 14:21:14 -0700 Subject: [PATCH 207/247] Add comments and clean up test for !1274 --- lib/gitlab/markdown/syntax_highlight_filter.rb | 2 ++ spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/gitlab/markdown/syntax_highlight_filter.rb b/lib/gitlab/markdown/syntax_highlight_filter.rb index f9527c7286..8597e02f0d 100644 --- a/lib/gitlab/markdown/syntax_highlight_filter.rb +++ b/lib/gitlab/markdown/syntax_highlight_filter.rb @@ -24,6 +24,8 @@ module Gitlab begin highlighted = block_code(code, language) rescue + # Gracefully handle syntax highlighter bugs/errors to ensure + # users can still access an issue/comment/etc. highlighted = "
#{code}
" end diff --git a/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb b/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb index ecef31853f..6a49067372 100644 --- a/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb +++ b/spec/lib/gitlab/markdown/syntax_highlight_filter_spec.rb @@ -4,9 +4,6 @@ module Gitlab::Markdown describe SyntaxHighlightFilter do include FilterSpecHelper - let(:project) { create(:empty_project) } - let(:reference) { snippet.to_reference } - it 'highlights valid code blocks' do result = filter('
def fun end')
       expect(result.to_html).to eq("
def fun end
\n") From 9995f0806b29934cf498607f59d2c5ec358a0d5a Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 1 Sep 2015 00:56:40 -0700 Subject: [PATCH 208/247] Import forked repositories asynchronously to prevent large repositories from timing out Use import_status to track async import status and give feedback to the user Closes #2388 Closes #2400 --- CHANGELOG | 1 + app/controllers/projects/forks_controller.rb | 12 ++++--- app/models/project.rb | 24 +++++++------ app/services/projects/create_service.rb | 4 +-- app/workers/repository_fork_worker.rb | 34 +++++++++++++++++++ features/steps/project/fork.rb | 2 +- spec/services/projects/create_service_spec.rb | 11 ++++++ spec/services/projects/fork_service_spec.rb | 5 ++- spec/workers/repository_fork_worker_spec.rb | 29 ++++++++++++++++ 9 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 app/workers/repository_fork_worker.rb create mode 100644 spec/workers/repository_fork_worker_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 2ae83d5b3c..ddfd384f8c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,7 @@ v 8.0.0 (unreleased) - Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu) - Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU) - Fix broken Wiki Page History (Stan Hu) + - Import forked repositories asynchronously to prevent large repositories from timing out (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/forks_controller.rb b/app/controllers/projects/forks_controller.rb index 9e72597ea8..8a785076bb 100644 --- a/app/controllers/projects/forks_controller.rb +++ b/app/controllers/projects/forks_controller.rb @@ -13,10 +13,14 @@ class Projects::ForksController < Projects::ApplicationController @forked_project = ::Projects::ForkService.new(project, current_user, namespace: namespace).execute if @forked_project.saved? && @forked_project.forked? - redirect_to( - namespace_project_path(@forked_project.namespace, @forked_project), - notice: 'Project was successfully forked.' - ) + if @forked_project.import_in_progress? + redirect_to namespace_project_import_path(@forked_project.namespace, @forked_project) + else + redirect_to( + namespace_project_path(@forked_project.namespace, @forked_project), + notice: 'Project was successfully forked.' + ) + end else render :error end diff --git a/app/models/project.rb b/app/models/project.rb index 072d7d73f4..49525eb922 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -144,7 +144,7 @@ class Project < ActiveRecord::Base validates_uniqueness_of :path, scope: :namespace_id validates :import_url, format: { with: /\A#{URI.regexp(%w(ssh git http https))}\z/, message: 'should be a valid url' }, - if: :import? + if: :external_import? validates :star_count, numericality: { greater_than_or_equal_to: 0 } validate :check_limit, on: :create validate :avatar_type, @@ -275,7 +275,13 @@ class Project < ActiveRecord::Base end def add_import_job - RepositoryImportWorker.perform_in(2.seconds, id) + if forked? + unless RepositoryForkWorker.perform_async(id, forked_from_project.path_with_namespace, self.namespace.path) + import_fail + end + else + RepositoryImportWorker.perform_in(2.seconds, id) + end end def clear_import_data @@ -283,6 +289,10 @@ class Project < ActiveRecord::Base end def import? + external_import? || forked? + end + + def external_import? import_url.present? end @@ -702,14 +712,8 @@ class Project < ActiveRecord::Base end def create_repository - if forked? - if gitlab_shell.fork_repository(forked_from_project.path_with_namespace, self.namespace.path) - true - else - errors.add(:base, 'Failed to fork repository via gitlab-shell') - false - end - else + # Forked import is handled asynchronously + unless forked? if gitlab_shell.add_repository(path_with_namespace) true else diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 1bb2462565..e54a13ed6c 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -55,9 +55,7 @@ module Projects @project.save if @project.persisted? && !@project.import? - unless @project.create_repository - raise 'Failed to create repository' - end + raise 'Failed to create repository' unless @project.create_repository end end diff --git a/app/workers/repository_fork_worker.rb b/app/workers/repository_fork_worker.rb new file mode 100644 index 0000000000..acd1c43f06 --- /dev/null +++ b/app/workers/repository_fork_worker.rb @@ -0,0 +1,34 @@ +class RepositoryForkWorker + include Sidekiq::Worker + include Gitlab::ShellAdapter + + sidekiq_options queue: :gitlab_shell + + def perform(project_id, source_path, target_path) + project = Project.find_by_id(project_id) + + unless project.present? + logger.error("Project #{project_id} no longer exists!") + return + end + + result = gitlab_shell.fork_repository(source_path, target_path) + + unless result + logger.error("Unable to fork project #{project_id} for repository #{source_path} -> #{target_path}") + project.import_fail + project.save + return + end + + if project.valid_repo? + ProjectCacheWorker.perform_async(project.id) + project.import_finish + else + project.import_fail + logger.error("Project #{id} had an invalid repository after fork") + end + + project.save + end +end diff --git a/features/steps/project/fork.rb b/features/steps/project/fork.rb index 0e433781d7..370960845c 100644 --- a/features/steps/project/fork.rb +++ b/features/steps/project/fork.rb @@ -15,7 +15,7 @@ class Spinach::Features::ProjectFork < Spinach::FeatureSteps end step 'I should see the forked project page' do - expect(page).to have_content "Project was successfully forked." + expect(page).to have_content "Forked from" end step 'I already have a project named "Shop" in my namespace' do diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index ff4ed2dd48..25277f0748 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -96,6 +96,17 @@ describe Projects::CreateService do expect(project.saved?).to be(true) end end + + context 'repository creation' do + it 'should synchronously create the repository' do + expect_any_instance_of(Project).to receive(:create_repository) + + project = create_project(@user, @opts) + expect(project).to be_valid + expect(project.owner).to eq(@user) + expect(project.namespace).to eq(@user.namespace) + end + end end def create_project(user, opts) diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb index c04e842c67..7c4bb74b77 100644 --- a/spec/services/projects/fork_service_spec.rb +++ b/spec/services/projects/fork_service_spec.rb @@ -28,8 +28,7 @@ describe Projects::ForkService do context 'fork project failure' do it "fails due to transaction failure" do @to_project = fork_project(@from_project, @to_user, false) - expect(@to_project.errors).not_to be_empty - expect(@to_project.errors[:base]).to include("Failed to fork repository via gitlab-shell") + expect(@to_project.import_failed?) end end @@ -100,7 +99,7 @@ describe Projects::ForkService do end def fork_project(from_project, user, fork_success = true, params = {}) - allow_any_instance_of(Gitlab::Shell).to receive(:fork_repository).and_return(fork_success) + allow(RepositoryForkWorker).to receive(:perform_async).and_return(fork_success) Projects::ForkService.new(from_project, user, params).execute end end diff --git a/spec/workers/repository_fork_worker_spec.rb b/spec/workers/repository_fork_worker_spec.rb new file mode 100644 index 0000000000..aa03110696 --- /dev/null +++ b/spec/workers/repository_fork_worker_spec.rb @@ -0,0 +1,29 @@ +require 'spec_helper' + +describe RepositoryForkWorker do + let(:project) { create(:project) } + let(:fork_project) { create(:project, forked_from_project: project) } + + subject { RepositoryForkWorker.new } + + describe "#perform" do + it "creates a new repository from a fork" do + expect_any_instance_of(Gitlab::Shell).to receive(:fork_repository).with( + project.path_with_namespace, + fork_project.namespace.path). + and_return(true) + expect(ProjectCacheWorker).to receive(:perform_async) + + subject.perform(project.id, + project.path_with_namespace, + fork_project.namespace.path) + end + + it "handles bad fork" do + expect_any_instance_of(Gitlab::Shell).to receive(:fork_repository).and_return(false) + subject.perform(project.id, + project.path_with_namespace, + fork_project.namespace.path) + end + end +end From 001738e992515400453abd7575493e382e5d1e0f Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Sat, 12 Sep 2015 14:01:01 +0200 Subject: [PATCH 209/247] Improve english of error message --- app/services/files/create_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb index 91d715b2d6..c2da0c30ba 100644 --- a/app/services/files/create_service.rb +++ b/app/services/files/create_service.rb @@ -22,7 +22,7 @@ module Files blob = repository.blob_at_branch(@current_branch, @file_path) if blob - raise_error("Your changes could not be committed, because file with such name exists") + raise_error("Your changes could not be committed because a file with the same name already exists") end end end From f07fabc1cd9db2bc03dd455e404b70bb17a16de9 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Sat, 12 Sep 2015 09:50:44 -0500 Subject: [PATCH 210/247] Keep add-diff-note button the same size on hover. Fixes #2497 --- app/assets/stylesheets/pages/notes.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/assets/stylesheets/pages/notes.scss b/app/assets/stylesheets/pages/notes.scss index 2544356a5f..2a77f065ae 100644 --- a/app/assets/stylesheets/pages/notes.scss +++ b/app/assets/stylesheets/pages/notes.scss @@ -235,8 +235,6 @@ ul.notes { filter: alpha(opacity=0); &:hover { - width: 38px; - font-size: 20px; background: $gl-info; color: #FFF; @include show-add-diff-note; From 8e523f49a0b6b251a06dbcabfb59d7e905b87d03 Mon Sep 17 00:00:00 2001 From: karen Carias Date: Sun, 13 Sep 2015 21:27:29 -0700 Subject: [PATCH 211/247] added note --- doc/raketasks/backup_restore.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md index 6a68c8e828..4ff5e74d43 100644 --- a/doc/raketasks/backup_restore.md +++ b/doc/raketasks/backup_restore.md @@ -369,4 +369,7 @@ For more information see similar questions on postgresql issue tracker[here](htt ## Note This documentation is for GitLab CE. -We backup GitLab.com and make sure your data is secure, but you can't use these methods to export / backup your data yourself from GitLab.com. +We backup GitLab.com and make sure your data is secure, but you can't use these methods +to export / backup your data yourself from GitLab.com. + +Issues are stored in the database. They can't be stored in Git itself. From 0ced0ace28a56787442a6db5915fc43e6665f3ea Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Mon, 14 Sep 2015 09:54:38 +0300 Subject: [PATCH 212/247] Add LATEST_TAG variable --- doc/update/patch_versions.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/doc/update/patch_versions.md b/doc/update/patch_versions.md index 22b9be059d..a66a863f6c 100644 --- a/doc/update/patch_versions.md +++ b/doc/update/patch_versions.md @@ -1,7 +1,7 @@ # Universal update guide for patch versions *Make sure you view this [upgrade guide](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/patch_versions.md) from the `master` branch for the most up to date instructions.* -For example from 6.2.0 to 6.2.1, also see the [semantic versioning specification](http://semver.org/). +For example from 7.14.0 to 7.14.3, also see the [semantic versioning specification](http://semver.org/). ### 0. Backup @@ -23,17 +23,16 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production cd /home/git/gitlab sudo -u git -H git fetch --all sudo -u git -H git checkout -- Gemfile.lock db/schema.rb -sudo -u git -H git checkout LATEST_TAG +LATEST_TAG=$(git describe --tags `git rev-list --tags --max-count=1`) +sudo -u git -H git checkout $LATEST_TAG -b $LATEST_TAG ``` -Replace LATEST_TAG with the latest GitLab tag you want to upgrade to, for example `v6.6.3`. - ### 3. Update gitlab-shell to the corresponding version ```bash cd /home/git/gitlab-shell sudo -u git -H git fetch -sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` +sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` -b v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` ``` ### 4. Install libs, migrations, etc. From 4c060074b792519e23403c0b21d4c2b3b49a8f36 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 11:05:23 +0200 Subject: [PATCH 213/247] Skip auth for group page but return auth for other group pages --- app/assets/stylesheets/generic/sidebar.scss | 2 +- app/controllers/groups_controller.rb | 2 +- app/models/ability.rb | 2 +- app/models/group.rb | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/generic/sidebar.scss b/app/assets/stylesheets/generic/sidebar.scss index 22720c2e1d..fdc554f3a9 100644 --- a/app/assets/stylesheets/generic/sidebar.scss +++ b/app/assets/stylesheets/generic/sidebar.scss @@ -146,7 +146,6 @@ } .collapse-nav a { - left: 0px; width: $sidebar_collapsed_width; } @@ -165,6 +164,7 @@ width: $sidebar_width; position: fixed; bottom: 0; + left: 0; font-size: 13px; background: transparent; height: 40px; diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index 279c6ef0f4..9f4702c6f5 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -4,7 +4,7 @@ class GroupsController < Groups::ApplicationController before_action :group, except: [:new, :create] # Authorize - before_action :authorize_read_group!, except: [:new, :create] + before_action :authorize_read_group!, except: [:show, :new, :create] before_action :authorize_admin_group!, only: [:edit, :update, :destroy, :projects] before_action :authorize_create_group!, only: [:new, :create] diff --git a/app/models/ability.rb b/app/models/ability.rb index 64cfdb6ea8..f8e5afa9b0 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -54,7 +54,7 @@ class Ability nil end - if group + if group && group.public_profile? [:read_group] else [] diff --git a/app/models/group.rb b/app/models/group.rb index 702d7825d5..9cd146bb73 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -119,6 +119,10 @@ class Group < Namespace end end + def public_profile? + projects.public_only.any? + end + def post_create_hook Gitlab::AppLogger.info("Group \"#{name}\" was created") From 4e1c6019c8f0d3b00e32fd6cd546d2ef445a285d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 11:16:54 +0200 Subject: [PATCH 214/247] Allow access to group from root url --- app/controllers/namespaces_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/namespaces_controller.rb b/app/controllers/namespaces_controller.rb index 83eec1bf4a..282012c60a 100644 --- a/app/controllers/namespaces_controller.rb +++ b/app/controllers/namespaces_controller.rb @@ -14,7 +14,7 @@ class NamespacesController < ApplicationController if user redirect_to user_path(user) - elsif group && can?(current_user, :read_group, group) + elsif group redirect_to group_path(group) elsif current_user.nil? authenticate_user! From 1d2173819bf004eaf9676aeb72b2ae6f79db9a64 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 11:41:19 +0200 Subject: [PATCH 215/247] Show activity/projects depends on access --- app/views/groups/show.html.haml | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 7fd1b3f18c..79bfb1ad17 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -16,22 +16,26 @@ = render 'shared/show_aside' - .row - %section.activities.col-md-7 - .hidden-xs - - if current_user - = render "events/event_last_push", event: @last_push + - if can?(current_user, :read_group, @group) + .row + %section.activities.col-md-7 + .hidden-xs + - if current_user + = render "events/event_last_push", event: @last_push - %ul.nav.nav-pills.event_filter.pull-right - %li - = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do - %i.fa.fa-rss + %ul.nav.nav-pills.event_filter.pull-right + %li + = link_to group_path(@group, { format: :atom, private_token: current_user.private_token }), title: "Feed", class: 'rss-btn' do + %i.fa.fa-rss - = render 'shared/event_filter' - %hr + = render 'shared/event_filter' + %hr - .content_list - = spinner - - if @projects.any? + .content_list + = spinner %aside.side.col-md-5 = render "projects", projects: @projects + - else + %p + = icon('lock') + This is a private group From 66840f03cc3444c1ce5027e654632d1a65845752 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 12:15:11 +0200 Subject: [PATCH 216/247] Fix tests for group access --- spec/features/security/group_access_spec.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/features/security/group_access_spec.rb b/spec/features/security/group_access_spec.rb index 3f708b5ebe..4b78e3a61f 100644 --- a/spec/features/security/group_access_spec.rb +++ b/spec/features/security/group_access_spec.rb @@ -118,7 +118,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } + it { is_expected.to be_denied_for :visitor } end context 'with no projects' do @@ -128,7 +128,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_denied_for :user } - it { is_expected.to be_allowed_for :visitor } + it { is_expected.to be_denied_for :visitor } end end @@ -168,7 +168,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } + it { is_expected.to be_denied_for :visitor } end context 'with no projects' do @@ -178,7 +178,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_denied_for :user } - it { is_expected.to be_allowed_for :visitor } + it { is_expected.to be_denied_for :visitor } end end @@ -218,7 +218,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_allowed_for :user } - it { is_expected.to be_allowed_for :visitor } + it { is_expected.to be_denied_for :visitor } end context 'with no projects' do @@ -228,7 +228,7 @@ describe 'Group access', feature: true do it { is_expected.to be_allowed_for group_member(:guest) } it { is_expected.to be_allowed_for :admin } it { is_expected.to be_denied_for :user } - it { is_expected.to be_allowed_for :visitor } + it { is_expected.to be_denied_for :visitor } end end From b8225324ef24eeb6f0b0b6cefb54282788a80210 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 12:46:24 +0200 Subject: [PATCH 217/247] Hide group sidebar menu if user cant access it --- app/views/layouts/nav/_group.html.haml | 59 +++++++++++++------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/app/views/layouts/nav/_group.html.haml b/app/views/layouts/nav/_group.html.haml index 695ce68a20..6e0ced2e75 100644 --- a/app/views/layouts/nav/_group.html.haml +++ b/app/views/layouts/nav/_group.html.haml @@ -12,34 +12,35 @@ = icon('dashboard fw') %span Group - - if current_user - = nav_link(controller: [:group, :milestones]) do - = link_to group_milestones_path(@group), title: 'Milestones', data: {placement: 'right'} do - = icon('clock-o fw') + - if can?(current_user, :read_group, @group) + - if current_user + = nav_link(controller: [:group, :milestones]) do + = link_to group_milestones_path(@group), title: 'Milestones', data: {placement: 'right'} do + = icon('clock-o fw') + %span + Milestones + = nav_link(path: 'groups#issues') do + = link_to issues_group_path(@group), title: 'Issues', data: {placement: 'right'} do + = icon('exclamation-circle fw') %span - Milestones - = nav_link(path: 'groups#issues') do - = link_to issues_group_path(@group), title: 'Issues', data: {placement: 'right'} do - = icon('exclamation-circle fw') - %span - Issues - - if current_user - %span.count= Issue.opened.of_group(@group).count - = nav_link(path: 'groups#merge_requests') do - = link_to merge_requests_group_path(@group), title: 'Merge Requests', data: {placement: 'right'} do - = icon('tasks fw') - %span - Merge Requests - - if current_user - %span.count= MergeRequest.opened.of_group(@group).count - = nav_link(controller: [:group_members]) do - = link_to group_group_members_path(@group), title: 'Members', data: {placement: 'right'} do - = icon('users fw') - %span - Members - - if can?(current_user, :admin_group, @group) - = nav_link(html_options: { class: "separate-item" }) do - = link_to edit_group_path(@group), title: 'Settings', data: {placement: 'right'} do - = icon ('cogs fw') + Issues + - if current_user + %span.count= Issue.opened.of_group(@group).count + = nav_link(path: 'groups#merge_requests') do + = link_to merge_requests_group_path(@group), title: 'Merge Requests', data: {placement: 'right'} do + = icon('tasks fw') %span - Settings + Merge Requests + - if current_user + %span.count= MergeRequest.opened.of_group(@group).count + = nav_link(controller: [:group_members]) do + = link_to group_group_members_path(@group), title: 'Members', data: {placement: 'right'} do + = icon('users fw') + %span + Members + - if can?(current_user, :admin_group, @group) + = nav_link(html_options: { class: "separate-item" }) do + = link_to edit_group_path(@group), title: 'Settings', data: {placement: 'right'} do + = icon ('cogs fw') + %span + Settings From db197aa61a3451bbe8eff1dea5dc992997b11b61 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 14:16:08 +0200 Subject: [PATCH 218/247] Fix tests and improve wording --- app/views/groups/show.html.haml | 3 +-- spec/controllers/namespaces_controller_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 79bfb1ad17..2e81dffcee 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -37,5 +37,4 @@ = render "projects", projects: @projects - else %p - = icon('lock') - This is a private group + This group does not have public projects diff --git a/spec/controllers/namespaces_controller_spec.rb b/spec/controllers/namespaces_controller_spec.rb index 74702f9330..7743695871 100644 --- a/spec/controllers/namespaces_controller_spec.rb +++ b/spec/controllers/namespaces_controller_spec.rb @@ -84,10 +84,10 @@ describe NamespacesController do end context "when the user doesn't have access to the project" do - it "responds with status 404" do + it "redirects to the group's page" do get :show, id: group.path - expect(response.status).to eq(404) + expect(response).to redirect_to(group_path(group)) end end end From 3e97de838c6a2a37e1daa5ab8c3cd1fa350b1a7e Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 15:01:04 +0200 Subject: [PATCH 219/247] Hide search panel for group page if you dont have access --- app/views/groups/show.html.haml | 3 +++ app/views/layouts/header/_default.html.haml | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 2e81dffcee..a9ba9d2ba1 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,3 +1,6 @@ +- unless can?(current_user, :read_group, @group) + - @disable_search_panel = true + = content_for :meta_tags do - if current_user = auto_discovery_link_tag(:atom, group_url(@group, format: :atom, private_token: current_user.private_token), title: "#{@group.name} activity") diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 3892f71c0e..c31b1cbe9a 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -7,8 +7,9 @@ .navbar-collapse.collapse %ul.nav.navbar-nav.pull-right - %li.hidden-sm.hidden-xs - = render 'layouts/search' + - unless @disable_search_panel + %li.hidden-sm.hidden-xs + = render 'layouts/search' %li.visible-sm.visible-xs = link_to search_path, title: 'Search', data: {toggle: 'tooltip', placement: 'bottom'} do = icon('search') From 539f30ddcfd0cdbe54525e80ee4a7ac46df2bcf0 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Mon, 14 Sep 2015 08:45:16 -0500 Subject: [PATCH 220/247] Fix tooltip display in list views --- app/helpers/application_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index a803b66c50..c3da54fd55 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -201,7 +201,7 @@ module ApplicationHelper class: "#{html_class} js-timeago", datetime: time.getutc.iso8601, title: time.in_time_zone.stamp('Aug 21, 2011 9:23pm'), - data: { toggle: 'tooltip', placement: placement } + data: { toggle: 'tooltip', placement: placement, container: 'body' } element += javascript_tag "$('.js-timeago').timeago()" unless skip_js From 0d010088761a0116a5e4317f2dd0c61b510ee1b3 Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Mon, 14 Sep 2015 18:10:23 +0200 Subject: [PATCH 221/247] Update gitlab_emoji to 0.1.1 --- Gemfile.lock | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f3091857b7..29f7213bd6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -253,7 +253,7 @@ GEM ruby-progressbar (~> 1.4) gemnasium-gitlab-service (0.2.6) rugged (~> 0.21) - gemojione (2.0.0) + gemojione (2.0.1) json gherkin-ruby (0.3.1) racc @@ -272,7 +272,7 @@ GEM charlock_holmes (~> 0.6.6) escape_utils (~> 0.2.4) mime-types (~> 1.19) - gitlab_emoji (0.1.0) + gitlab_emoji (0.1.1) gemojione (~> 2.0) gitlab_git (7.2.15) activesupport (~> 4.0) @@ -889,6 +889,3 @@ DEPENDENCIES virtus webmock (~> 1.21.0) wikicloth (= 0.8.1) - -BUNDLED WITH - 1.10.5 From 789d06e48bd613e4d736ccd5504fb0d53d74b2f7 Mon Sep 17 00:00:00 2001 From: Drew Blessing Date: Mon, 14 Sep 2015 11:20:18 -0500 Subject: [PATCH 222/247] Fix empty project UI --- app/views/projects/empty.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index 798f1c47da..185ebf2393 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -4,7 +4,7 @@ = render "home_panel" -.center.light-well +.gray-content-block.center %h3.page-title The repository for this project is empty %p From 0c8f07774c2a128aa8aff6be00ed91be2a08cddb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 19:46:58 +0200 Subject: [PATCH 223/247] Add page titles to header for group and project Signed-off-by: Dmitriy Zaporozhets --- app/helpers/gitlab_routing_helper.rb | 8 +++ app/helpers/projects_helper.rb | 69 ++++++++++++++++++------ app/views/groups/edit.html.haml | 2 + app/views/groups/projects.html.haml | 2 + app/views/layouts/nav/_project.html.haml | 4 +- app/views/layouts/project.html.haml | 2 +- 6 files changed, 67 insertions(+), 20 deletions(-) diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb index d0fae255a0..e0816f4e71 100644 --- a/app/helpers/gitlab_routing_helper.rb +++ b/app/helpers/gitlab_routing_helper.rb @@ -17,6 +17,14 @@ module GitlabRoutingHelper namespace_project_path(project.namespace, project, *args) end + def project_files_path(project, *args) + namespace_project_tree_path(project.namespace, project, @ref || project.repository.root_ref) + end + + def project_commits_path(project, *args) + namespace_project_commits_path(project.namespace, project, @ref || project.repository.root_ref) + end + def activity_project_path(project, *args) activity_namespace_project_path(project.namespace, project, *args) end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index ab9b068de0..268c563700 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -43,24 +43,22 @@ module ProjectsHelper end end - def project_title(project) - if project.group - content_tag :span do - link_to( - simple_sanitize(project.group.name), group_path(project.group) - ) + ' / ' + - link_to(simple_sanitize(project.name), - project_path(project)) - end - else - owner = project.namespace.owner - content_tag :span do - link_to( - simple_sanitize(owner.name), user_path(owner) - ) + ' / ' + - link_to(simple_sanitize(project.name), - project_path(project)) + def project_title(project, name = nil, url = nil) + namespace_link = + if project.group + link_to(simple_sanitize(project.group.name), group_path(project.group)) + else + owner = project.namespace.owner + link_to(simple_sanitize(owner.name), user_path(owner)) end + + project_link = link_to(simple_sanitize(project.name), project_path(project)) + + full_title = namespace_link + ' / ' + project_link + full_title += ' · '.html_safe + link_to(simple_sanitize(name), url) if name + + content_tag :span do + full_title end end @@ -315,6 +313,43 @@ module ProjectsHelper end end + def detect_project_title(project) + current_ref = @ref || project.repository.root_ref + + name, url = + if current_controller? 'wikis' + ['Wiki', get_project_wiki_path(project)] + elsif current_controller? 'project_members' + ['Members', namespace_project_project_members_path(project.namespace, project)] + elsif current_controller? 'labels' + ['Labels', namespace_project_labels_path(project.namespace, project)] + elsif current_controller? 'members' + ['Members', project_files_path(project)] + elsif current_controller? 'commits' + ['Commits', project_commits_path(project)] + elsif current_controller? 'graphs' + ['Graphs', namespace_project_graph_path(project.namespace, project, current_ref)] + elsif current_controller? 'network' + ['Network', namespace_project_network_path(project.namespace, project, current_ref)] + elsif current_controller? 'milestones' + ['Milestones', namespace_project_milestones_path(project.namespace, project)] + elsif current_controller? 'snippets' + ['Snippets', namespace_project_snippets_path(project.namespace, project)] + elsif current_controller? 'issues' + ['Issues', namespace_project_issues_path(project.namespace, project)] + elsif current_controller? 'merge_requests' + ['Merge Requests', namespace_project_merge_requests_path(project.namespace, project)] + elsif current_controller? 'tree', 'blob' + ['Files', project_files_path(project)] + elsif current_path? 'projects#activity' + ['Activity', activity_project_path(project)] + else + [nil, nil] + end + + project_title(project, name, url) + end + private def filename_path(project, filename) diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index ac7d9ba0f4..ae8fc9f85f 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -1,4 +1,6 @@ +- header_title group_title(@group, "Settings", edit_group_path(@group)) - @blank_container = true + .panel.panel-default .panel-heading %strong= @group.name diff --git a/app/views/groups/projects.html.haml b/app/views/groups/projects.html.haml index d06cfa7ff9..f1d507a50c 100644 --- a/app/views/groups/projects.html.haml +++ b/app/views/groups/projects.html.haml @@ -1,4 +1,6 @@ - page_title "Projects" +- header_title group_title(@group, "Projects", projects_group_path(@group)) + .panel.panel-default .panel-heading %strong= @group.name diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 1d22a7442e..2159d931da 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -26,14 +26,14 @@ Activity - if project_nav_tab? :files = nav_link(controller: %w(tree blob blame edit_tree new_tree)) do - = link_to namespace_project_tree_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Files', class: 'shortcuts-tree', data: {placement: 'right'} do + = link_to project_files_path(@project), title: 'Files', class: 'shortcuts-tree', data: {placement: 'right'} do = icon('files-o fw') %span Files - if project_nav_tab? :commits = nav_link(controller: %w(commit commits compare repositories tags branches)) do - = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Commits', class: 'shortcuts-commits', data: {placement: 'right'} do + = link_to project_commits_path(@project), title: 'Commits', class: 'shortcuts-commits', data: {placement: 'right'} do = icon('history fw') %span Commits diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index 44afa33dfe..5c4dd67f0e 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -1,5 +1,5 @@ - page_title @project.name_with_namespace -- header_title project_title(@project) +- header_title detect_project_title(@project) - sidebar "project" unless sidebar - content_for :scripts_body_top do From d3be65a811f1e5e30cba919e65de162217d9f7cc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 20:08:35 +0200 Subject: [PATCH 224/247] Remove repeating titles on members and label pages Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/blocks.scss | 2 +- app/views/projects/labels/index.html.haml | 15 +++---- .../projects/project_members/index.html.haml | 42 +++++++++---------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 48d9f890f6..1bd016e0df 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -51,6 +51,6 @@ } .oneline { - line-height: 44px; + line-height: 42px; } } diff --git a/app/views/projects/labels/index.html.haml b/app/views/projects/labels/index.html.haml index d44fe48621..284adb40e9 100644 --- a/app/views/projects/labels/index.html.haml +++ b/app/views/projects/labels/index.html.haml @@ -1,14 +1,15 @@ - page_title "Labels" -- if can? current_user, :admin_label, @project - = link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do - New label -%h3.page-title - Labels -%hr + +.gray-content-block.top-block + - if can? current_user, :admin_label, @project + = link_to new_namespace_project_label_path(@project.namespace, @project), class: "pull-right btn btn-new" do + New label + .oneline + Labels can be applied to issues and merge requests. .labels - if @labels.present? - %ul.bordered-list.manage-labels-list + %ul.content-list.manage-labels-list = render @labels = paginate @labels, theme: 'gitlab' - else diff --git a/app/views/projects/project_members/index.html.haml b/app/views/projects/project_members/index.html.haml index 162583e4b1..a40d151367 100644 --- a/app/views/projects/project_members/index.html.haml +++ b/app/views/projects/project_members/index.html.haml @@ -1,30 +1,28 @@ - page_title "Members" -%h3.page-title - Users with access to this project -%p.light +.gray-content-block.top-block + .clearfix.js-toggle-container + = form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do + .form-group + = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input' } + = button_tag 'Search', class: 'btn' + + - if can?(current_user, :admin_project_member, @project) + %span.pull-right + = button_tag class: 'btn btn-new btn-grouped js-toggle-button', type: 'button' do + Add members + %i.fa.fa-chevron-down + = link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do + Import members + + .js-toggle-content.hide.new-group-member-holder + = render "new_project_member" + +%p.prepend-top-default.light + Users with access to this project are listed below. Read more about project permissions %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" -%hr - -.clearfix.js-toggle-container - = form_tag namespace_project_project_members_path(@project.namespace, @project), method: :get, class: 'form-inline member-search-form' do - .form-group - = search_field_tag :search, params[:search], { placeholder: 'Find existing member by name', class: 'form-control search-text-input' } - = button_tag 'Search', class: 'btn' - - - if can?(current_user, :admin_project_member, @project) - %span.pull-right - = button_tag class: 'btn btn-new btn-grouped js-toggle-button', type: 'button' do - Add members - %i.fa.fa-chevron-down - = link_to import_namespace_project_project_members_path(@project.namespace, @project), class: "btn btn-grouped", title: "Import members from another project" do - Import members - - .js-toggle-content.hide.new-group-member-holder - = render "new_project_member" - = render "team", members: @project_members - if @group From b5c681c0c931df9408dc266a5d2d0326e23c7cb8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 14 Sep 2015 20:23:01 +0200 Subject: [PATCH 225/247] Add current_ref helper method Signed-off-by: Dmitriy Zaporozhets --- app/helpers/projects_helper.rb | 6 ++++-- app/views/layouts/nav/_project.html.haml | 4 ++-- app/views/projects/commits/_head.html.haml | 4 ++-- app/views/projects/show.html.haml | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 268c563700..6a2de0de77 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -313,9 +313,11 @@ module ProjectsHelper end end - def detect_project_title(project) - current_ref = @ref || project.repository.root_ref + def current_ref + @ref || @repository.try(:root_ref) + end + def detect_project_title(project) name, url = if current_controller? 'wikis' ['Wiki', get_project_wiki_path(project)] diff --git a/app/views/layouts/nav/_project.html.haml b/app/views/layouts/nav/_project.html.haml index 2159d931da..8ce46d4865 100644 --- a/app/views/layouts/nav/_project.html.haml +++ b/app/views/layouts/nav/_project.html.haml @@ -40,14 +40,14 @@ - if project_nav_tab? :network = nav_link(controller: %w(network)) do - = link_to namespace_project_network_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Network', class: 'shortcuts-network', data: {placement: 'right'} do + = link_to namespace_project_network_path(@project.namespace, @project, current_ref), title: 'Network', class: 'shortcuts-network', data: {placement: 'right'} do = icon('code-fork fw') %span Network - if project_nav_tab? :graphs = nav_link(controller: %w(graphs)) do - = link_to namespace_project_graph_path(@project.namespace, @project, @ref || @repository.root_ref), title: 'Graphs', class: 'shortcuts-graphs', data: {placement: 'right'} do + = link_to namespace_project_graph_path(@project.namespace, @project, current_ref), title: 'Graphs', class: 'shortcuts-graphs', data: {placement: 'right'} do = icon('area-chart fw') %span Graphs diff --git a/app/views/projects/commits/_head.html.haml b/app/views/projects/commits/_head.html.haml index 50c0fd6803..a849bf8469 100644 --- a/app/views/projects/commits/_head.html.haml +++ b/app/views/projects/commits/_head.html.haml @@ -1,10 +1,10 @@ %ul.center-top-menu = nav_link(controller: [:commit, :commits]) do - = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do + = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do 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 + = link_to namespace_project_compare_index_path(@project.namespace, @project, from: @repository.root_ref, to: current_ref) do Compare = nav_link(html_options: {class: branches_tab_class}) do diff --git a/app/views/projects/show.html.haml b/app/views/projects/show.html.haml index d5c4ee7197..aa5914e3ed 100644 --- a/app/views/projects/show.html.haml +++ b/app/views/projects/show.html.haml @@ -14,7 +14,7 @@ .project-stats.gray-content-block %ul.nav.nav-pills %li - = link_to namespace_project_commits_path(@project.namespace, @project, @ref || @repository.root_ref) do + = link_to namespace_project_commits_path(@project.namespace, @project, current_ref) do = pluralize(number_with_delimiter(@project.commit_count), 'commit') %li = link_to namespace_project_branches_path(@project.namespace, @project) do From e2ece2bc350bf881e9716e51c01a59eecac65fc9 Mon Sep 17 00:00:00 2001 From: liyakun Date: Thu, 10 Sep 2015 16:18:40 +0200 Subject: [PATCH 226/247] Add "Replace" and "Upload" features Refactor upload and replace functionality Rename file and move CSS Fix typo Make dropzone a div Remove unnecessary file Change color of "upload existing one" Add missing changes --- CHANGELOG | 1 + .../blob/blob_file_dropzone.js.coffee | 52 ++++++++++++ app/assets/stylesheets/pages/tree.scss | 12 +++ app/controllers/projects/blob_controller.rb | 28 ++++++- app/services/files/create_service.rb | 4 +- app/views/projects/blob/_actions.html.haml | 6 +- app/views/projects/blob/_replace.html.haml | 28 +++++++ app/views/projects/blob/_upload.html.haml | 28 +++++++ app/views/projects/blob/new.html.haml | 10 ++- app/views/projects/blob/show.html.haml | 1 + config/routes.rb | 10 +++ features/project/source/browse_files.feature | 23 +++++ features/steps/project/source/browse_files.rb | 83 ++++++++++++++++++- 13 files changed, 274 insertions(+), 12 deletions(-) create mode 100644 app/assets/javascripts/blob/blob_file_dropzone.js.coffee create mode 100644 app/views/projects/blob/_replace.html.haml create mode 100644 app/views/projects/blob/_upload.html.haml diff --git a/CHANGELOG b/CHANGELOG index b41237f867..2b1edf54c4 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) - Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu) + - Add "replace" and "upload" functionalities to allow user replace existing file and upload new file into current repository - Fix URL construction for merge requests, issues, notes, and commits for relative URL config (Stan Hu) - Fix emoji URLs in Markdown when relative_url_root is used (Stan Hu) - Omit filename in Content-Disposition header in raw file download to avoid RFC 6266 encoding issues (Stan HU) diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js.coffee b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee new file mode 100644 index 0000000000..090af9bb37 --- /dev/null +++ b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee @@ -0,0 +1,52 @@ +class @BlobFileDropzone + constructor: (form, method) -> + form_dropzone = form.find('.dropzone') + Dropzone.autoDiscover = false + dropzone = form_dropzone.dropzone( + autoDiscover: false + autoProcessQueue: false + url: form.attr('action') + # Rails uses a hidden input field for PUT + # http://stackoverflow.com/questions/21056482/how-to-set-method-put-in-form-tag-in-rails + method: method + clickable: true + uploadMultiple: false + paramName: "file" + maxFilesize: gon.max_file_size or 10 + parallelUploads: 1 + maxFiles: 1 + addRemoveLinks: true + previewsContainer: '.dropzone-previews' + headers: + "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") + + success: (header, response) -> + window.location.href = response.filePath + return + + error: (temp, errorMessage) -> + stripped = $("
").html(errorMessage).text(); + $('.dropzone-alerts').html('Error uploading file: \"' + stripped + '\"').show() + return + + maxfilesexceeded: (file) -> + @removeFile file + return + + removedfile: (file) -> + $('.dropzone-previews')[0].removeChild(file.previewTemplate) + $('.dropzone-alerts').html('').hide() + return true + + sending: (file, xhr, formData) -> + formData.append('commit_message', form.find('#commit_message').val()) + return + ) + + submitButton = form.find('#submit-all')[0] + submitButton.addEventListener 'click', (e) -> + e.preventDefault() + e.stopPropagation() + alert "Please select a file" if dropzone[0].dropzone.getQueuedFiles().length == 0 + dropzone[0].dropzone.processQueue() + return false diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index 71ca37c0cd..df7fab07a5 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -116,3 +116,15 @@ } #modal-remove-blob > .modal-dialog { width: 850px; } + +.blob-upload-dropzone-previews { + text-align: center; + border: 2px; + border-style: dashed; + min-height: 200px; +} + +.upload-link { + font-weight: normal; + color: #0000EE; +} diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 100d3d3b31..8776721d24 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -26,10 +26,16 @@ class Projects::BlobController < Projects::ApplicationController if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) + respond_to do |format| + format.html { redirect_to namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) } + format.json { render json: { message: "success", filePath: namespace_project_blob_path(@project.namespace, @project, File.join(@target_branch, @file_path)) } } + end else flash[:alert] = result[:message] - render :new + respond_to do |format| + format.html { render :new } + format.json { render json: { message: "failed", filePath: namespace_project_new_blob_path(@project.namespace, @project, @id) } } + end end end @@ -45,10 +51,16 @@ class Projects::BlobController < Projects::ApplicationController if result[:status] == :success flash[:notice] = "Your changes have been successfully committed" - redirect_to after_edit_path + respond_to do |format| + format.html { redirect_to after_edit_path } + format.json { render json: { message: "success", filePath: after_edit_path } } + end else flash[:alert] = result[:message] - render :edit + respond_to do |format| + format.html { render :edit } + format.json { render json: { message: "failed", filePath: namespace_project_new_blob_path(@project.namespace, @project, @id) } } + end end end @@ -146,11 +158,19 @@ class Projects::BlobController < Projects::ApplicationController @file_path = if action_name.to_s == 'create' + if params[:file].present? + params[:file_name] = params[:file].original_filename + end File.join(@path, File.basename(params[:file_name])) else @path end + if params[:file].present? + params[:content] = Base64.encode64(params[:file].read) + params[:encoding] = 'base64' + end + @commit_params = { file_path: @file_path, current_branch: @current_branch, diff --git a/app/services/files/create_service.rb b/app/services/files/create_service.rb index 91d715b2d6..ffbb599327 100644 --- a/app/services/files/create_service.rb +++ b/app/services/files/create_service.rb @@ -19,10 +19,12 @@ module Files end unless project.empty_repo? + @file_path.slice!(0) if @file_path.start_with?('/') + blob = repository.blob_at_branch(@current_branch, @file_path) if blob - raise_error("Your changes could not be committed, because file with such name exists") + raise_error("Your changes could not be committed because a file with the same name already exists") end end end diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index 13f8271b97..5b61846fe6 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -17,6 +17,6 @@ tree_join(@commit.sha, @path)), class: 'btn btn-sm' - if allowed_tree_edit? - = button_tag class: 'remove-blob btn btn-sm btn-remove', - 'data-toggle' => 'modal', 'data-target' => '#modal-remove-blob' do - Remove + .btn-group{:role => "group"} + %button.btn.btn-default{class: 'btn-primary', href: '#modal-replace-blob', 'data-target' => '#modal-replace-blob', 'data-toggle' => 'modal'} Replace + %button.btn.btn-default{class: 'btn-remove', href: '#modal-remove-blob', 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal'} Remove diff --git a/app/views/projects/blob/_replace.html.haml b/app/views/projects/blob/_replace.html.haml new file mode 100644 index 0000000000..84abf0303d --- /dev/null +++ b/app/views/projects/blob/_replace.html.haml @@ -0,0 +1,28 @@ +#modal-replace-blob.modal + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3.page-title Replace #{@blob.name} + %p.light + From branch + %strong= @ref + .modal-body + = form_tag namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: 'blob-file-upload-form-js form-horizontal' do + .dropzone + .dropzone-previews{class: "blob-upload-dropzone-previews"} + %p.dz-message{class: "hint"}< + Attach files by dragging & dropping or  + %a{href: '#', class: "markdown-selector"}>click to upload + %br + .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} + = render 'shared/commit_message_container', params: params, + placeholder: 'Replace this file because...' + .form-group + .col-sm-offset-2.col-sm-10 + = button_tag 'Replace file', class: 'btn btn-small btn-primary btn-replace-file', id: 'submit-all' + = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" + +:coffeescript + disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-replace-file' + new BlobFileDropzone($('.blob-file-upload-form-js'), 'put') diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml new file mode 100644 index 0000000000..5a6a3358a1 --- /dev/null +++ b/app/views/projects/blob/_upload.html.haml @@ -0,0 +1,28 @@ +#modal-upload-blob.modal + .modal-dialog + .modal-content + .modal-header + %a.close{href: "#", "data-dismiss" => "modal"} × + %h3.page-title Upload + %p.light + From branch + %strong= @ref + .modal-body + = form_tag namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'blob-file-upload-form-js form-horizontal' do + .dropzone + .dropzone-previews{class: "blob-upload-dropzone-previews"} + %p.dz-message{class: "hint"}< + Attach files by dragging & dropping or  + %a{href: '#', class: "markdown-selector"}>click to upload + %br + .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} + = render 'shared/commit_message_container', params: params, + placeholder: 'Upload this file because...' + .form-group + .col-sm-offset-2.col-sm-10 + = button_tag 'Upload file', class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all' + = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" + +:coffeescript + disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-upload-file' + new BlobFileDropzone($('.blob-file-upload-form-js'), 'post') diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 7c2a4fece9..6fb46ea204 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,5 +1,11 @@ -- page_title "New File", @ref -%h3.page-title New file +%h3.page-title< + Create new file or  + %a.upload-link{href: '#modal-upload-blob', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'}>upload existing one + +.file-title + = render 'projects/blob/upload' + %br + .file-editor = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal form-new-file js-requires-input') do = render 'projects/blob/editor', ref: @ref diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml index bd2fc43633..19e876ec34 100644 --- a/app/views/projects/blob/show.html.haml +++ b/app/views/projects/blob/show.html.haml @@ -10,3 +10,4 @@ - if allowed_tree_edit? = render 'projects/blob/remove' + = render 'projects/blob/replace' diff --git a/config/routes.rb b/config/routes.rb index 011af4825f..ab1d8f7ce9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -356,6 +356,16 @@ Gitlab::Application.routes.draw do to: 'blob#destroy', constraints: { id: /.+/, format: false } ) + put( + '/blob/*id', + to: 'blob#update', + constraints: { id: /.+/, format: false } + ) + post( + '/blob/*id', + to: 'blob#create', + constraints: { id: /.+/, format: false } + ) end scope do diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature index d3a77466a3..b5b6abe6af 100644 --- a/features/project/source/browse_files.feature +++ b/features/project/source/browse_files.feature @@ -33,6 +33,29 @@ Feature: Project Source Browse Files And I click on "Commit Changes" Then I am redirected to the new file And I should see its new content + + @javascript + Scenario: I can upload file and commit + Given I click on "new file" link in repo + Then I can see new file page + And I can see "upload existing one" + And I click on "upload existing one" + And I upload a new text file + And I fill the upload file commit message + And I click on "Upload file" + Then I can see the new text file + And I can see the new commit message + + @javascript + Scenario: I can replace file and commit + Given I click on ".gitignore" file in repo + And I see the ".gitignore" + And I click on "Replace" + And I replace it with a text file + And I fill the replace file commit message + And I click on "Replace file" + Then I can see the new text file + And I can see the replacement commit message @javascript Scenario: I can create and commit file and specify new branch diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb index 5cb085db20..7a0ee4df45 100644 --- a/features/steps/project/source/browse_files.rb +++ b/features/steps/project/source/browse_files.rb @@ -1,3 +1,4 @@ +# coding: utf-8 class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps include SharedAuthentication include SharedProject @@ -78,7 +79,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps end step 'I fill the commit message' do - fill_in :commit_message, with: 'Not yet a commit message.' + fill_in :commit_message, with: 'Not yet a commit message.', visible: true end step 'I click link "Diff"' do @@ -97,6 +98,14 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps click_button 'Remove file' end + step 'I click on "Replace"' do + click_button "Replace" + end + + step 'I click on "Replace file"' do + click_button 'Replace file' + end + step 'I see diff' do expect(page).to have_css '.line_holder.new' end @@ -106,10 +115,55 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps end step 'I can see new file page' do - expect(page).to have_content "New file" + expect(page).to have_content "new file" expect(page).to have_content "Commit message" end + step 'I can see "upload existing one"' do + expect(page).to have_content "upload existing one" + end + + step 'I click on "upload existing one"' do + click_link 'upload existing one' + end + + step 'I click on "Upload file"' do + click_button 'Upload file' + end + + step 'I can see the new commit message' do + expect(page).to have_content "New upload commit message" + end + + step 'I upload a new text file' do + drop_in_dropzone test_text_file + end + + step 'I fill the upload file commit message' do + page.within('#modal-upload-blob') do + fill_in :commit_message, with: 'New upload commit message' + end + end + + step 'I replace it with a text file' do + drop_in_dropzone test_text_file + end + + step 'I fill the replace file commit message' do + page.within('#modal-replace-blob') do + fill_in :commit_message, with: 'Replacement file commit message' + end + end + + step 'I can see the replacement commit message' do + expect(page).to have_content "Replacement file commit message" + end + + step 'I can see the new text file' do + expect(page).to have_content "Lorem ipsum dolor sit amet" + expect(page).to have_content "Sed ut perspiciatis unde omnis" + end + step 'I click on files directory' do click_link 'files' end @@ -232,4 +286,29 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps def new_file_name 'not_a_file.md' end + + def drop_in_dropzone(file_path) + # Generate a fake input selector + page.execute_script <<-JS + var fakeFileInput = window.$('').attr( + {id: 'fakeFileInput', type: 'file'} + ).appendTo('body'); + JS + # Attach the file to the fake input selector with Capybara + attach_file("fakeFileInput", file_path) + # Add the file to a fileList array and trigger the fake drop event + page.execute_script <<-JS + var fileList = [$('#fakeFileInput')[0].files[0]]; + var e = jQuery.Event('drop', { dataTransfer : { files : fileList } }); + $('.dropzone')[0].dropzone.listeners[0].events.drop(e); + JS + end + + def test_text_file + File.join(Rails.root, 'spec', 'fixtures', 'doc_sample.txt') + end + + def test_image_file + File.join(Rails.root, 'spec', 'fixtures', 'banana_sample.gif') + end end From 558084f403d2198569537729b471b93befbdbbae Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 15 Sep 2015 09:54:42 +0200 Subject: [PATCH 227/247] Improve project settings button on profile Signed-off-by: Dmitriy Zaporozhets --- app/views/users/show.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index aa4e8722fb..37d5dba033 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -16,8 +16,8 @@ - if @user == current_user .pull-right.hidden-xs = link_to profile_path, class: 'btn btn-sm' do - %i.fa.fa-pencil-square-o - Edit Profile settings + = icon('user') + Profile settings - elsif current_user .pull-right %span.dropdown From a635e1a395ec465319bf900734cbbf715f3b9e9a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 15 Sep 2015 11:02:37 +0200 Subject: [PATCH 228/247] Fix last push widget Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/blocks.scss | 5 +++++ app/views/events/_event_last_push.html.haml | 24 ++++++++++----------- app/views/projects/_last_push.html.haml | 23 ++++++++++---------- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/app/assets/stylesheets/generic/blocks.scss b/app/assets/stylesheets/generic/blocks.scss index 1bd016e0df..ce024272a3 100644 --- a/app/assets/stylesheets/generic/blocks.scss +++ b/app/assets/stylesheets/generic/blocks.scss @@ -36,6 +36,11 @@ margin-bottom: 0; } + &.clear-block { + margin-bottom: $gl-padding - 1px; + padding-bottom: $gl-padding; + } + &.second-block { margin-top: -1px; margin-bottom: 0; diff --git a/app/views/events/_event_last_push.html.haml b/app/views/events/_event_last_push.html.haml index 6a0c6cba41..ffc37ad617 100644 --- a/app/views/events/_event_last_push.html.haml +++ b/app/views/events/_event_last_push.html.haml @@ -1,14 +1,14 @@ - if show_last_push_widget?(event) - .event-last-push - .event-last-push-text - %span You pushed to - = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do - %strong= event.ref_name - %span at - %strong= link_to_project event.project - #{time_ago_with_tooltip(event.created_at)} + .gray-content-block.clear-block + .event-last-push + .event-last-push-text + %span You pushed to + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do + %strong= event.ref_name + %span at + %strong= link_to_project event.project + #{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-info btn-sm" do - Create Merge Request - %hr + .pull-right + = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do + Create Merge Request diff --git a/app/views/projects/_last_push.html.haml b/app/views/projects/_last_push.html.haml index 30622d8a91..f0a3e416db 100644 --- a/app/views/projects/_last_push.html.haml +++ b/app/views/projects/_last_push.html.haml @@ -1,14 +1,15 @@ - if event = last_push_event - if show_last_push_widget?(event) - .hidden-xs.center - .slead - %span You pushed to - = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do - %strong= event.ref_name - branch - #{time_ago_with_tooltip(event.created_at)} - %div - = link_to new_mr_path_from_push_event(event), title: "New Merge Request", class: "btn btn-info btn-sm" do - Create Merge Request - %hr + .gray-content-block.top-block.clear-block.hidden-xs + .event-last-push + .event-last-push-text + %span You pushed to + = link_to namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) do + %strong= event.ref_name + branch + #{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-info btn-sm" do + Create Merge Request From dacff8f014d822fce13bc3bb64582e6db45672d0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 15 Sep 2015 11:17:22 +0200 Subject: [PATCH 229/247] Fix UI for web editor Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 4 ++++ app/assets/stylesheets/pages/editor.scss | 18 +++++++++++++++--- app/views/projects/blob/edit.html.haml | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 5e191d5dd4..3a237bf322 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -377,4 +377,8 @@ table { height: 56px; margin-top: -$gl-padding; padding-top: $gl-padding; + + &.no-bottom { + margin-bottom: 0; + } } diff --git a/app/assets/stylesheets/pages/editor.scss b/app/assets/stylesheets/pages/editor.scss index 759ba6b1c2..1d565477dd 100644 --- a/app/assets/stylesheets/pages/editor.scss +++ b/app/assets/stylesheets/pages/editor.scss @@ -9,6 +9,10 @@ width: 100%; } + .ace_gutter-cell { + background-color: $background-color; + } + .cancel-btn { color: #B94A48; &:hover { @@ -32,14 +36,12 @@ .file-title { @extend .monospace; - font-size: 14px; - padding: 5px; } .editor-ref { background: $background-color; padding: 11px 15px; - border-right: 1px solid #CCC; + border-right: 1px solid $border-color; display: inline-block; margin: -5px -5px; margin-right: 10px; @@ -50,5 +52,15 @@ display: inline-block; width: 200px; } + + .form-control { + margin-top: -3px; + } + } + + .form-actions { + margin: -$gl-padding; + margin-top: 0; + padding: $gl-padding } } diff --git a/app/views/projects/blob/edit.html.haml b/app/views/projects/blob/edit.html.haml index a12cd660fc..648f15418e 100644 --- a/app/views/projects/blob/edit.html.haml +++ b/app/views/projects/blob/edit.html.haml @@ -1,6 +1,6 @@ - page_title "Edit", @blob.path, @ref .file-editor - %ul.nav.nav-tabs.js-edit-mode + %ul.center-top-menu.no-bottom.js-edit-mode %li.active = link_to '#editor' do %i.fa.fa-edit From 4d2b67acc0bbd3337e8d96ac9878a3dc08e23ac0 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Mon, 14 Sep 2015 22:31:45 -0700 Subject: [PATCH 230/247] Don't display "git clone --bare " if no URL is available Introduced in !1231 --- app/views/projects/imports/show.html.haml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index 39fe0fc1c4..91ecd82c04 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -4,7 +4,8 @@ %h2 %i.fa.fa-spinner.fa-spin Import in progress. - %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} + - if @project.import_url.present? + %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} %p Please wait while we import the repository for you. Refresh at will. :javascript new ProjectImport(); From 2abe7338665a87581ac99db93c3c60e5fc95ac1a Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 15 Sep 2015 06:45:03 -0700 Subject: [PATCH 231/247] Display "Forking in Progress" when importing a forked project --- app/views/projects/imports/show.html.haml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/projects/imports/show.html.haml b/app/views/projects/imports/show.html.haml index 91ecd82c04..06886d215a 100644 --- a/app/views/projects/imports/show.html.haml +++ b/app/views/projects/imports/show.html.haml @@ -3,8 +3,11 @@ .center %h2 %i.fa.fa-spinner.fa-spin - Import in progress. - - if @project.import_url.present? + - if @project.forked? + Forking in progress. + - else + Import in progress. + - unless @project.forked? %p.monospace git clone --bare #{hidden_pass_url(@project.import_url)} %p Please wait while we import the repository for you. Refresh at will. :javascript From b9cc41cf34d2a5b347689bfafa72f12ae2979aac Mon Sep 17 00:00:00 2001 From: fscherwi Date: Tue, 15 Sep 2015 18:07:28 +0200 Subject: [PATCH 232/247] change coverage image to svg [ci skip] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 52e12bb66a..99d5bc0b6c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![build status](https://ci.gitlab.com/projects/1/status.png?ref=master)](https://ci.gitlab.com/projects/1?ref=master) [![Build Status](https://semaphoreci.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/400484/shields_badge.svg)](https://semaphoreci.com/gitlabhq/gitlabhq) [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq) -[![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.png?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master) +[![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.svg?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master) ## Canonical source From d420b608e6aa5fb9803e9412826c9087c44cb72f Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 15 Sep 2015 13:24:38 -0400 Subject: [PATCH 233/247] Minor editing of the 7.14-to-8.0 update guide --- doc/update/7.14-to-8.0.md | 72 +++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/doc/update/7.14-to-8.0.md b/doc/update/7.14-to-8.0.md index 29a38d07b3..e3d131d322 100644 --- a/doc/update/7.14-to-8.0.md +++ b/doc/update/7.14-to-8.0.md @@ -10,9 +10,9 @@ 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. +Run the following command to get your current Git version: -``` +```sh /usr/local/bin/git --version ``` @@ -63,28 +63,33 @@ sudo -u git -H git checkout 8-0-stable-ee ```bash cd /home/git/gitlab-shell sudo -u git -H git fetch -sudo -u git -H git checkout v2.6.4 +sudo -u git -H git checkout v2.6.5 ``` ### 5. Install gitlab-git-http-server -First we download Go 1.5 and install it into /usr/local/go. +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 +```bash +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. +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 +```bash +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. +If your Git repositories are in a directory other than `/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. @@ -111,20 +116,27 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### 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`. +There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: -``` +```sh 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 + +#### 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. + +View changes between the previous recommended Nginx configuration and the +current one: + +```sh +# For HTTPS configurations git diff origin/7-14-stable:lib/support/nginx/gitlab-ssl origin/8-0-stable:lib/support/nginx/gitlab-ssl + +# For HTTP configurations +git diff origin/7-14-stable:lib/support/nginx/gitlab origin/8-0-stable:lib/support/nginx/gitlab ``` ### 8. Start application @@ -138,7 +150,7 @@ 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: +To make sure you didn't miss anything run a more thorough check: sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production @@ -147,13 +159,15 @@ 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: +### 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. + +If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. From f01aaba778a908ea3bc8ae5438547083e1196b14 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 15 Sep 2015 13:41:29 -0400 Subject: [PATCH 234/247] Reorder the `--without` arugments so the database comes first Hopefully this will make it a bit clearer that we're excluding a certain database type. [ci skip] --- doc/update/7.14-to-8.0.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/update/7.14-to-8.0.md b/doc/update/7.14-to-8.0.md index e3d131d322..3ae0f9616a 100644 --- a/doc/update/7.14-to-8.0.md +++ b/doc/update/7.14-to-8.0.md @@ -96,11 +96,11 @@ See `lib/support/init.d/gitlab.default.example` for the options. ```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 +# MySQL installations (note: the line below states '--without postgres') +sudo -u git -H bundle install --without postgres development test --deployment -# PostgreSQL installations (note: the line below states '--without ... mysql') -sudo -u git -H bundle install --without development test mysql --deployment +# PostgreSQL installations (note: the line below states '--without mysql') +sudo -u git -H bundle install --without mysql development test --deployment # Run database migrations sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production From 34e1ce130f829605fc6ba34bc12ea7e0412d9bba Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Tue, 15 Sep 2015 20:46:11 +0200 Subject: [PATCH 235/247] Add a help text to the Slack Service When setting up the service I was not sure which webhook I should use, by adding this Help text I hope we can help people in the future with setting up this hook Signed-off-by: Jeroen van Baarsen --- app/models/project_services/slack_service.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb index 36d9874edd..7cd5e89250 100644 --- a/app/models/project_services/slack_service.rb +++ b/app/models/project_services/slack_service.rb @@ -34,6 +34,12 @@ class SlackService < Service 'slack' end + def help + 'This service sends notifications to your Slack channel.
+ To setup this Service you need to create a new "Incoming webhook" in your Slack integration panel, + and enter the Webhook URL below.' + end + def fields [ { type: 'text', name: 'webhook', From 93bb8f14ef2b19128c078250b36c62f681f30ee0 Mon Sep 17 00:00:00 2001 From: Jared Szechy Date: Tue, 15 Sep 2015 15:23:30 -0400 Subject: [PATCH 236/247] Use fixed version of fogbugz gem This allows us to properly handle authentication errors. --- Gemfile | 2 +- Gemfile.lock | 6 +++--- app/controllers/import/fogbugz_controller.rb | 8 +++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Gemfile b/Gemfile index d609ff6610..5510d7ee63 100644 --- a/Gemfile +++ b/Gemfile @@ -158,7 +158,7 @@ gem "slack-notifier", "~> 1.0.0" gem 'asana', '~> 0.0.6' # FogBugz integration -gem 'ruby-fogbugz' +gem 'ruby-fogbugz', '~> 0.2.0' # d3 gem 'd3_rails', '~> 3.5.5' diff --git a/Gemfile.lock b/Gemfile.lock index 29f7213bd6..4f16e14c89 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -575,8 +575,8 @@ GEM powerpack (~> 0.0.6) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.4) - ruby-fogbugz (0.1.1) - crack + ruby-fogbugz (0.2.0) + crack (~> 0.4) ruby-progressbar (1.7.1) ruby-saml (1.0.0) nokogiri (>= 1.5.10) @@ -849,7 +849,7 @@ DEPENDENCIES rqrcode-rails3 rspec-rails (~> 3.3.0) rubocop (= 0.28.0) - ruby-fogbugz + ruby-fogbugz (~> 0.2.0) sanitize (~> 2.0) sass-rails (~> 4.0.5) sdoc diff --git a/app/controllers/import/fogbugz_controller.rb b/app/controllers/import/fogbugz_controller.rb index bda534fb4d..849646cd66 100644 --- a/app/controllers/import/fogbugz_controller.rb +++ b/app/controllers/import/fogbugz_controller.rb @@ -2,7 +2,6 @@ class Import::FogbugzController < Import::BaseController before_action :verify_fogbugz_import_enabled before_action :user_map, only: [:new_user_map, :create_user_map] - # Doesn't work yet due to bug in ruby-fogbugz, see below rescue_from Fogbugz::AuthenticationException, with: :fogbugz_unauthorized def new @@ -13,8 +12,8 @@ class Import::FogbugzController < Import::BaseController begin res = Gitlab::FogbugzImport::Client.new(import_params.symbolize_keys) rescue - # Needed until https://github.com/firmafon/ruby-fogbugz/pull/9 is merged - return redirect_to :back, alert: 'Could not authenticate with FogBugz, check your URL, email, and password' + # If the URI is invalid various errors can occur + return redirect_to new_import_fogbugz_path, alert: 'Could not connect to FogBugz, check your URL' end session[:fogbugz_token] = res.get_token session[:fogbugz_uri] = params[:uri] @@ -92,8 +91,7 @@ class Import::FogbugzController < Import::BaseController end def fogbugz_unauthorized(exception) - flash[:alert] = exception.message - redirect_to new_import_fogbugz_path + redirect_to new_import_fogbugz_path, alert: exception.message end def import_params From e14aa19e39baf67bbc5bb4099627ae28844a4f5b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 15 Sep 2015 14:56:42 +0200 Subject: [PATCH 237/247] Cleanup some html/css for upload feature Signed-off-by: Dmitriy Zaporozhets --- app/assets/stylesheets/generic/common.scss | 8 ++++++++ app/assets/stylesheets/pages/tree.scss | 3 ++- app/views/projects/blob/_actions.html.haml | 6 +++--- app/views/projects/blob/_replace.html.haml | 8 ++++---- app/views/projects/blob/_upload.html.haml | 9 +++++---- app/views/projects/blob/new.html.haml | 11 +++++------ 6 files changed, 27 insertions(+), 18 deletions(-) diff --git a/app/assets/stylesheets/generic/common.scss b/app/assets/stylesheets/generic/common.scss index 3a237bf322..48fad7701e 100644 --- a/app/assets/stylesheets/generic/common.scss +++ b/app/assets/stylesheets/generic/common.scss @@ -382,3 +382,11 @@ table { margin-bottom: 0; } } + +.dropzone .dz-preview .dz-progress { + border-color: $border-color !important; +} + +.dropzone .dz-preview .dz-progress .dz-upload { + background: $gl-success !important; +} diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index df7fab07a5..271cc547e2 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -121,10 +121,11 @@ text-align: center; border: 2px; border-style: dashed; + border-color: $border-color; min-height: 200px; } .upload-link { font-weight: normal; - color: #0000EE; + color: $md-link-color; } diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index 5b61846fe6..131818d2a8 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -17,6 +17,6 @@ tree_join(@commit.sha, @path)), class: 'btn btn-sm' - if allowed_tree_edit? - .btn-group{:role => "group"} - %button.btn.btn-default{class: 'btn-primary', href: '#modal-replace-blob', 'data-target' => '#modal-replace-blob', 'data-toggle' => 'modal'} Replace - %button.btn.btn-default{class: 'btn-remove', href: '#modal-remove-blob', 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal'} Remove + .btn-group{ role: "group" } + %button.btn.btn-default{ 'data-target' => '#modal-replace-blob', 'data-toggle' => 'modal' } Replace + %button.btn.btn-remove{ 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal' } Remove diff --git a/app/views/projects/blob/_replace.html.haml b/app/views/projects/blob/_replace.html.haml index 84abf0303d..1d11fb0ae7 100644 --- a/app/views/projects/blob/_replace.html.haml +++ b/app/views/projects/blob/_replace.html.haml @@ -10,10 +10,10 @@ .modal-body = form_tag namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: 'blob-file-upload-form-js form-horizontal' do .dropzone - .dropzone-previews{class: "blob-upload-dropzone-previews"} - %p.dz-message{class: "hint"}< - Attach files by dragging & dropping or  - %a{href: '#', class: "markdown-selector"}>click to upload + .dropzone-previews.blob-upload-dropzone-previews + %p.dz-message.light + Attach files by dragging & dropping or + = link_to 'click to upload', '#', class: "markdown-selector" %br .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} = render 'shared/commit_message_container', params: params, diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml index 5a6a3358a1..4666faca01 100644 --- a/app/views/projects/blob/_upload.html.haml +++ b/app/views/projects/blob/_upload.html.haml @@ -10,10 +10,11 @@ .modal-body = form_tag namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'blob-file-upload-form-js form-horizontal' do .dropzone - .dropzone-previews{class: "blob-upload-dropzone-previews"} - %p.dz-message{class: "hint"}< - Attach files by dragging & dropping or  - %a{href: '#', class: "markdown-selector"}>click to upload + .dropzone-previews.blob-upload-dropzone-previews + %p.dz-message.light + Attach files by dragging & dropping or + = link_to 'click to upload', '#', class: "markdown-selector" + %br .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} = render 'shared/commit_message_container', params: params, diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 6fb46ea204..9a50a52c45 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,10 +1,9 @@ -%h3.page-title< - Create new file or  - %a.upload-link{href: '#modal-upload-blob', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'}>upload existing one +.gray-content-block.top-block + Create new file or + = link_to 'upload existing one', '#modal-upload-blob', + { class: 'upload-link', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'} -.file-title - = render 'projects/blob/upload' - %br += render 'projects/blob/upload' .file-editor = form_tag(namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'form-horizontal form-new-file js-requires-input') do From 0a8ef29b3d2504ba66cd0a98992c1f5f70b11daa Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Tue, 15 Sep 2015 15:31:33 +0200 Subject: [PATCH 238/247] Improve wording for header and placeholders --- app/views/projects/blob/_replace.html.haml | 4 ++-- app/views/projects/blob/_upload.html.haml | 5 ++--- app/views/projects/blob/new.html.haml | 5 +++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/projects/blob/_replace.html.haml b/app/views/projects/blob/_replace.html.haml index 1d11fb0ae7..ed584d19ed 100644 --- a/app/views/projects/blob/_replace.html.haml +++ b/app/views/projects/blob/_replace.html.haml @@ -12,12 +12,12 @@ .dropzone .dropzone-previews.blob-upload-dropzone-previews %p.dz-message.light - Attach files by dragging & dropping or + Attach a file by drag & drop or = link_to 'click to upload', '#', class: "markdown-selector" %br .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} = render 'shared/commit_message_container', params: params, - placeholder: 'Replace this file because...' + placeholder: 'Replace file' .form-group .col-sm-offset-2.col-sm-10 = button_tag 'Replace file', class: 'btn btn-small btn-primary btn-replace-file', id: 'submit-all' diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml index 4666faca01..4ed36cb8aa 100644 --- a/app/views/projects/blob/_upload.html.haml +++ b/app/views/projects/blob/_upload.html.haml @@ -12,13 +12,12 @@ .dropzone .dropzone-previews.blob-upload-dropzone-previews %p.dz-message.light - Attach files by dragging & dropping or + Attach a file by drag & drop or = link_to 'click to upload', '#', class: "markdown-selector" - %br .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} = render 'shared/commit_message_container', params: params, - placeholder: 'Upload this file because...' + placeholder: 'Upload new file' .form-group .col-sm-offset-2.col-sm-10 = button_tag 'Upload file', class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all' diff --git a/app/views/projects/blob/new.html.haml b/app/views/projects/blob/new.html.haml index 9a50a52c45..68c9ec7f80 100644 --- a/app/views/projects/blob/new.html.haml +++ b/app/views/projects/blob/new.html.haml @@ -1,7 +1,8 @@ .gray-content-block.top-block - Create new file or - = link_to 'upload existing one', '#modal-upload-blob', + Create a new file or + = link_to 'upload', '#modal-upload-blob', { class: 'upload-link', 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal'} + an existing one = render 'projects/blob/upload' From d9af6f79ed439308d13f44a0cfade6a355607f14 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 15 Sep 2015 06:58:49 -0700 Subject: [PATCH 239/247] Change the replace placeholder to use the filename Dynamically adjust placedholder for uploads and fix Dropzone event handlers Override error handler to prevent error messages from being inserted underneath image preview Fix tests Use regexp instead of startsWith for better browser compatibility Remove duplicate code in _replace.html.haml and use one template Remove files upon error and retain alert messages until user adds a new file --- .../blob/blob_file_dropzone.js.coffee | 47 ++++++++++++------- app/controllers/projects/blob_controller.rb | 11 +++++ app/views/projects/blob/_actions.html.haml | 2 +- app/views/projects/blob/_replace.html.haml | 28 ----------- app/views/projects/blob/_upload.html.haml | 12 ++--- app/views/projects/blob/show.html.haml | 2 +- features/project/source/browse_files.feature | 6 +-- features/steps/project/source/browse_files.rb | 10 ++-- 8 files changed, 58 insertions(+), 60 deletions(-) delete mode 100644 app/views/projects/blob/_replace.html.haml diff --git a/app/assets/javascripts/blob/blob_file_dropzone.js.coffee b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee index 090af9bb37..3ab3ba6675 100644 --- a/app/assets/javascripts/blob/blob_file_dropzone.js.coffee +++ b/app/assets/javascripts/blob/blob_file_dropzone.js.coffee @@ -20,27 +20,42 @@ class @BlobFileDropzone headers: "X-CSRF-Token": $("meta[name=\"csrf-token\"]").attr("content") - success: (header, response) -> - window.location.href = response.filePath - return + init: -> + this.on 'addedfile', (file) -> + $('.dropzone-alerts').html('').hide() + commit_message = form.find('#commit_message')[0] - error: (temp, errorMessage) -> + if /^Upload/.test(commit_message.placeholder) + commit_message.placeholder = 'Upload ' + file.name + + return + + this.on 'removedfile', (file) -> + commit_message = form.find('#commit_message')[0] + + if /^Upload/.test(commit_message.placeholder) + commit_message.placeholder = 'Upload new file' + + return + + this.on 'success', (header, response) -> + window.location.href = response.filePath + return + + this.on 'maxfilesexceeded', (file) -> + @removeFile file + return + + this.on 'sending', (file, xhr, formData) -> + formData.append('commit_message', form.find('#commit_message').val()) + return + + # Override behavior of adding error underneath preview + error: (file, errorMessage) -> stripped = $("
").html(errorMessage).text(); $('.dropzone-alerts').html('Error uploading file: \"' + stripped + '\"').show() - return - - maxfilesexceeded: (file) -> @removeFile file return - - removedfile: (file) -> - $('.dropzone-previews')[0].removeChild(file.previewTemplate) - $('.dropzone-alerts').html('').hide() - return true - - sending: (file, xhr, formData) -> - formData.append('commit_message', form.find('#commit_message').val()) - return ) submitButton = form.find('#submit-all')[0] diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 8776721d24..d7be212c33 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -18,6 +18,12 @@ class Projects::BlobController < Projects::ApplicationController before_action :after_edit_path, only: [:edit, :update] def new + @title = 'Upload' + @placeholder = 'Upload new file' + @button_title = 'Upload file' + @form_path = namespace_project_create_blob_path(@project.namespace, @project, @id) + @method = :post + commit unless @repository.empty? end @@ -40,6 +46,11 @@ class Projects::BlobController < Projects::ApplicationController end def show + @title = "Replace #{@blob.name}" + @placeholder = @title + @button_title = 'Replace file' + @form_path = namespace_project_update_blob_path(@project.namespace, @project, @id) + @method = :put end def edit diff --git a/app/views/projects/blob/_actions.html.haml b/app/views/projects/blob/_actions.html.haml index 131818d2a8..373b3a0c5b 100644 --- a/app/views/projects/blob/_actions.html.haml +++ b/app/views/projects/blob/_actions.html.haml @@ -18,5 +18,5 @@ - if allowed_tree_edit? .btn-group{ role: "group" } - %button.btn.btn-default{ 'data-target' => '#modal-replace-blob', 'data-toggle' => 'modal' } Replace + %button.btn.btn-default{ 'data-target' => '#modal-upload-blob', 'data-toggle' => 'modal' } Replace %button.btn.btn-remove{ 'data-target' => '#modal-remove-blob', 'data-toggle' => 'modal' } Remove diff --git a/app/views/projects/blob/_replace.html.haml b/app/views/projects/blob/_replace.html.haml deleted file mode 100644 index ed584d19ed..0000000000 --- a/app/views/projects/blob/_replace.html.haml +++ /dev/null @@ -1,28 +0,0 @@ -#modal-replace-blob.modal - .modal-dialog - .modal-content - .modal-header - %a.close{href: "#", "data-dismiss" => "modal"} × - %h3.page-title Replace #{@blob.name} - %p.light - From branch - %strong= @ref - .modal-body - = form_tag namespace_project_update_blob_path(@project.namespace, @project, @id), method: :put, class: 'blob-file-upload-form-js form-horizontal' do - .dropzone - .dropzone-previews.blob-upload-dropzone-previews - %p.dz-message.light - Attach a file by drag & drop or - = link_to 'click to upload', '#', class: "markdown-selector" - %br - .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} - = render 'shared/commit_message_container', params: params, - placeholder: 'Replace file' - .form-group - .col-sm-offset-2.col-sm-10 - = button_tag 'Replace file', class: 'btn btn-small btn-primary btn-replace-file', id: 'submit-all' - = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" - -:coffeescript - disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-replace-file' - new BlobFileDropzone($('.blob-file-upload-form-js'), 'put') diff --git a/app/views/projects/blob/_upload.html.haml b/app/views/projects/blob/_upload.html.haml index 4ed36cb8aa..2cfb79486d 100644 --- a/app/views/projects/blob/_upload.html.haml +++ b/app/views/projects/blob/_upload.html.haml @@ -3,26 +3,26 @@ .modal-content .modal-header %a.close{href: "#", "data-dismiss" => "modal"} × - %h3.page-title Upload + %h3.page-title #{@title} %p.light From branch %strong= @ref .modal-body - = form_tag namespace_project_create_blob_path(@project.namespace, @project, @id), method: :post, class: 'blob-file-upload-form-js form-horizontal' do + = form_tag @form_path, method: @method, class: 'blob-file-upload-form-js form-horizontal' do .dropzone .dropzone-previews.blob-upload-dropzone-previews %p.dz-message.light Attach a file by drag & drop or = link_to 'click to upload', '#', class: "markdown-selector" %br - .dropzone-alerts{class: "alert alert-danger data", "data-dismiss" => "alert", style: "display:none"} + .dropzone-alerts{class: "alert alert-danger data", style: "display:none"} = render 'shared/commit_message_container', params: params, - placeholder: 'Upload new file' + placeholder: @placeholder .form-group .col-sm-offset-2.col-sm-10 - = button_tag 'Upload file', class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all' + = button_tag @button_title, class: 'btn btn-small btn-primary btn-upload-file', id: 'submit-all' = link_to "Cancel", '#', class: "btn btn-cancel", "data-dismiss" => "modal" :coffeescript disableButtonIfEmptyField $('.blob-file-upload-form-js').find('#commit_message'), '.btn-upload-file' - new BlobFileDropzone($('.blob-file-upload-form-js'), 'post') + new BlobFileDropzone($('.blob-file-upload-form-js'), '#{@method}') diff --git a/app/views/projects/blob/show.html.haml b/app/views/projects/blob/show.html.haml index 19e876ec34..4e66a43bbd 100644 --- a/app/views/projects/blob/show.html.haml +++ b/app/views/projects/blob/show.html.haml @@ -10,4 +10,4 @@ - if allowed_tree_edit? = render 'projects/blob/remove' - = render 'projects/blob/replace' + = render 'projects/blob/upload' diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature index b5b6abe6af..58574166ef 100644 --- a/features/project/source/browse_files.feature +++ b/features/project/source/browse_files.feature @@ -33,13 +33,13 @@ Feature: Project Source Browse Files And I click on "Commit Changes" Then I am redirected to the new file And I should see its new content - + @javascript Scenario: I can upload file and commit Given I click on "new file" link in repo Then I can see new file page - And I can see "upload existing one" - And I click on "upload existing one" + And I can see "upload an existing one" + And I click on "upload" And I upload a new text file And I fill the upload file commit message And I click on "Upload file" diff --git a/features/steps/project/source/browse_files.rb b/features/steps/project/source/browse_files.rb index 7a0ee4df45..a1a49dd58a 100644 --- a/features/steps/project/source/browse_files.rb +++ b/features/steps/project/source/browse_files.rb @@ -119,12 +119,12 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps expect(page).to have_content "Commit message" end - step 'I can see "upload existing one"' do - expect(page).to have_content "upload existing one" + step 'I can see "upload an existing one"' do + expect(page).to have_content "upload an existing one" end - step 'I click on "upload existing one"' do - click_link 'upload existing one' + step 'I click on "upload"' do + click_link 'upload' end step 'I click on "Upload file"' do @@ -150,7 +150,7 @@ class Spinach::Features::ProjectSourceBrowseFiles < Spinach::FeatureSteps end step 'I fill the replace file commit message' do - page.within('#modal-replace-blob') do + page.within('#modal-upload-blob') do fill_in :commit_message, with: 'Replacement file commit message' end end From c95b8476c7d7464071afed0e3f4279ab116d8a2f Mon Sep 17 00:00:00 2001 From: Jared Szechy Date: Tue, 15 Sep 2015 16:09:32 -0400 Subject: [PATCH 240/247] bump fogbugz gem --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 5510d7ee63..6d371f27a3 100644 --- a/Gemfile +++ b/Gemfile @@ -158,7 +158,7 @@ gem "slack-notifier", "~> 1.0.0" gem 'asana', '~> 0.0.6' # FogBugz integration -gem 'ruby-fogbugz', '~> 0.2.0' +gem 'ruby-fogbugz', '~> 0.2.1' # d3 gem 'd3_rails', '~> 3.5.5' diff --git a/Gemfile.lock b/Gemfile.lock index 4f16e14c89..ab743c7d59 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -575,7 +575,7 @@ GEM powerpack (~> 0.0.6) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.4) - ruby-fogbugz (0.2.0) + ruby-fogbugz (0.2.1) crack (~> 0.4) ruby-progressbar (1.7.1) ruby-saml (1.0.0) @@ -849,7 +849,7 @@ DEPENDENCIES rqrcode-rails3 rspec-rails (~> 3.3.0) rubocop (= 0.28.0) - ruby-fogbugz (~> 0.2.0) + ruby-fogbugz (~> 0.2.1) sanitize (~> 2.0) sass-rails (~> 4.0.5) sdoc From c9389d0e7450850423c8c87062f6c26422b78422 Mon Sep 17 00:00:00 2001 From: Allister Antosik Date: Tue, 15 Sep 2015 22:48:24 +0100 Subject: [PATCH 241/247] Sorted autocomplete users list by name --- CHANGELOG | 1 + app/controllers/autocomplete_controller.rb | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 007e47f744..eb4c59d620 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -48,6 +48,7 @@ v 8.0.0 (unreleased) - Fix highlighting of deleted lines in diffs. - Added service API endpoint to retrieve service parameters (Petheő Bence) - Add FogBugz project import (Jared Szechy) + - Sort users autocomplete lists by user (Allister Antosik) v 7.14.3 - No changes diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb index 904d26a39f..202e9da9ee 100644 --- a/app/controllers/autocomplete_controller.rb +++ b/app/controllers/autocomplete_controller.rb @@ -32,6 +32,7 @@ class AutocompleteController < ApplicationController @users ||= User.none @users = @users.search(params[:search]) if params[:search].present? @users = @users.active + @users = @users.reorder(:name) @users = @users.page(params[:page]).per(PER_PAGE) unless params[:search].present? From 1c289ac0c3b7993cfca961a9b446267b700a97c7 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 15 Sep 2015 22:38:48 -0700 Subject: [PATCH 242/247] Fix broken sort in merge request API Closes #2266 --- CHANGELOG | 1 + lib/api/merge_requests.rb | 2 +- spec/requests/api/merge_requests_spec.rb | 25 ++++++++++++------------ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index eb4c59d620..71238630d3 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 sort in merge request API (Stan Hu) - Bump rouge to 1.10.1 to remove warning noise and fix other syntax highlighting bugs (Stan Hu) - Gracefully handle errors in syntax highlighting by leaving the block unformatted (Stan Hu) - Add "replace" and "upload" functionalities to allow user replace existing file and upload new file into current repository diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 7412274b04..63ea2f0543 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -55,7 +55,7 @@ module API else merge_requests end - merge_requests.reorder(issuable_order_by => issuable_sort) + merge_requests = merge_requests.reorder(issuable_order_by => issuable_sort) present paginate(merge_requests), with: Entities::MergeRequest end diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 942768fa25..35b3d3e296 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -2,11 +2,12 @@ require "spec_helper" describe API::API, api: true do include ApiHelpers + let(:base_time) { Time.now } let(:user) { create(:user) } let!(:project) {create(:project, creator_id: user.id, namespace: user.namespace) } - let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") } - let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test") } - let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test") } + let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test", created_at: base_time) } + let!(:merge_request_closed) { create(:merge_request, state: "closed", author: user, assignee: user, source_project: project, target_project: project, title: "Closed test", created_at: base_time + 1.seconds) } + let!(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignee: user, source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds) } let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") } let!(:note2) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "another comment on a MR") } @@ -74,8 +75,8 @@ describe API::API, api: true do expect(response.status).to eq(200) expect(json_response).to be_an Array expect(json_response.length).to eq(3) - expect(json_response.last['id']).to eq(@mr_earlier.id) - expect(json_response.first['id']).to eq(@mr_later.id) + response_dates = json_response.map{ |merge_request| merge_request['created_at'] } + expect(response_dates).to eq(response_dates.sort) end it "should return an array of merge_requests in descending order" do @@ -83,8 +84,8 @@ describe API::API, api: true do expect(response.status).to eq(200) expect(json_response).to be_an Array expect(json_response.length).to eq(3) - expect(json_response.first['id']).to eq(@mr_later.id) - expect(json_response.last['id']).to eq(@mr_earlier.id) + response_dates = json_response.map{ |merge_request| merge_request['created_at'] } + expect(response_dates).to eq(response_dates.sort.reverse) end it "should return an array of merge_requests ordered by updated_at" do @@ -92,17 +93,17 @@ describe API::API, api: true do expect(response.status).to eq(200) expect(json_response).to be_an Array expect(json_response.length).to eq(3) - expect(json_response.last['id']).to eq(@mr_earlier.id) - expect(json_response.first['id']).to eq(@mr_later.id) + response_dates = json_response.map{ |merge_request| merge_request['updated_at'] } + expect(response_dates).to eq(response_dates.sort.reverse) end it "should return an array of merge_requests ordered by created_at" do - get api("/projects/#{project.id}/merge_requests?sort=created_at", user) + get api("/projects/#{project.id}/merge_requests?order_by=created_at&sort=asc", user) expect(response.status).to eq(200) expect(json_response).to be_an Array expect(json_response.length).to eq(3) - expect(json_response.last['id']).to eq(@mr_earlier.id) - expect(json_response.first['id']).to eq(@mr_later.id) + response_dates = json_response.map{ |merge_request| merge_request['created_at'] } + expect(response_dates).to eq(response_dates.sort) end end end From b92c03730bfd95e8ad6d984e240aaf15b22e4b5a Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Wed, 16 Sep 2015 09:09:09 +0200 Subject: [PATCH 243/247] Tweak text --- doc/reply_by_email/postfix.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/reply_by_email/postfix.md b/doc/reply_by_email/postfix.md index 0b16e5e8e8..b8ab07d9fe 100644 --- a/doc/reply_by_email/postfix.md +++ b/doc/reply_by_email/postfix.md @@ -58,7 +58,7 @@ The instructions make the assumption that you will be using the email address `r 220 gitlab.example.com ESMTP Postfix (Ubuntu) ``` - If you get a `Connection refused` error instead, check if `postfix` is running: + If you get a `Connection refused` error instead, verify that `postfix` is running: ```sh sudo postfix status @@ -114,7 +114,7 @@ The instructions make the assumption that you will be using the email address `r ## Configure Postfix to use Maildir-style mailboxes -Courier, which we will install later to add IMAP authentication, requiers mailboxes to have the Maildir format, rather than mbox. +Courier, which we will install later to add IMAP authentication, requires mailboxes to have the Maildir format, rather than mbox. 1. Configure Postfix to use Maildir-style mailboxes: @@ -130,7 +130,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo 1. Test the new setup: - 1. Follow steps 1 and 2 of "Test the out-of-the-box setup". + 1. Follow steps 1 and 2 of _[Test the out-of-the-box setup](#test-the-out-of-the-box-setup)_. 2. Check if the `replies` user received the email: ```sh @@ -287,7 +287,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo a login replies PASSWORD ``` - Replace PASSWORD by the password you set on the `replies` user earlier. + Replace PASSWORD with the password you set on the `replies` user earlier. You should see output like this: @@ -303,7 +303,7 @@ Courier, which we will install later to add IMAP authentication, requiers mailbo ## Done! -If all the tests went all right, Postfix is all set up and ready to receive email! Continue with the [Reply by email](./README.md) doc to configure GitLab. +If all the tests were successfull, Postfix is all set up and ready to receive email! Continue with the [Reply by email](./README.md) guide to configure GitLab. --------- From b81043b1693780ed50c80952132abfb48a6981c6 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 16 Sep 2015 12:21:15 +0200 Subject: [PATCH 244/247] Fix missing style --- app/assets/stylesheets/pages/appearances.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/appearances.scss b/app/assets/stylesheets/pages/appearances.scss index 93c02f10f3..e2070f17c3 100644 --- a/app/assets/stylesheets/pages/appearances.scss +++ b/app/assets/stylesheets/pages/appearances.scss @@ -4,7 +4,7 @@ } .appearance-light-logo-preview { - background-color: $style_color; + background-color: $background-color; max-width: 72px; padding: 10px; margin-bottom: 10px; From 2754d6e6a6424f09f3f96b432761c9639d23256b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 16 Sep 2015 18:54:23 +0200 Subject: [PATCH 245/247] Fix tests --- features/steps/groups_management.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/features/steps/groups_management.rb b/features/steps/groups_management.rb index b7f98b0208..f870c64b7a 100644 --- a/features/steps/groups_management.rb +++ b/features/steps/groups_management.rb @@ -34,6 +34,8 @@ class Spinach::Features::GroupsManagement < Spinach::FeatureSteps end step 'I reload "Open" project members page' do + visit root_path + click_link 'Sourcing / Open' click_link 'Members' end From 0d64f2c4a972b50cfb4b539d57d7afa7c506cc41 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 16 Sep 2015 14:15:21 -0400 Subject: [PATCH 246/247] Attempt to fix failing feature that only fails on CI --- features/steps/groups_management.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/features/steps/groups_management.rb b/features/steps/groups_management.rb index f870c64b7a..3b7a74c0ad 100644 --- a/features/steps/groups_management.rb +++ b/features/steps/groups_management.rb @@ -36,7 +36,9 @@ class Spinach::Features::GroupsManagement < Spinach::FeatureSteps step 'I reload "Open" project members page' do visit root_path click_link 'Sourcing / Open' - click_link 'Members' + page.within('.nav-sidebar') do + click_link 'Members' + end end step 'I go to group settings page' do From 2180ea91f53fce575e497a975b169033fe26098c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 16 Sep 2015 20:52:21 +0200 Subject: [PATCH 247/247] Annotate mode Signed-off-by: Dmitriy Zaporozhets --- app/models/appearance.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/models/appearance.rb b/app/models/appearance.rb index 1f8c4a2204..95f2ab3d28 100644 --- a/app/models/appearance.rb +++ b/app/models/appearance.rb @@ -1,3 +1,18 @@ +# == Schema Information +# +# Table name: appearances +# +# id :integer not null, primary key +# title :string(255) +# description :text +# logo :string(255) +# updated_by :integer +# created_at :datetime +# updated_at :datetime +# dark_logo :string(255) +# light_logo :string(255) +# + class Appearance < ActiveRecord::Base validates :title, presence: true validates :description, presence: true