From 434c4a2b5d0a6b89d050f3b7b4e4e4442ffde733 Mon Sep 17 00:00:00 2001 From: sbeh Date: Wed, 26 Nov 2014 00:31:50 +0100 Subject: [PATCH 01/96] Socket [::]:123 on Linux listens on IPv4 and IPv6 This will ensure nginx starts up without the following errors messages: nginx: [emerg] bind() to [::]:443 failed (98: Address already in use) nginx: [emerg] bind() to [::]:443 failed (98: Address already in use) nginx: [emerg] bind() to [::]:443 failed (98: Address already in use) nginx: [emerg] bind() to [::]:443 failed (98: Address already in use) nginx: [emerg] bind() to [::]:443 failed (98: Address already in use) nginx: [emerg] still could not bind() Googling for them leads you to this site: https://chrisjean.com/2014/02/10/fix-nginx-emerg-bind-to-80-failed-98-address-already-in-use/ --- lib/support/nginx/gitlab-ssl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/support/nginx/gitlab-ssl b/lib/support/nginx/gitlab-ssl index 4e53d5e8b5..19af010a9f 100644 --- a/lib/support/nginx/gitlab-ssl +++ b/lib/support/nginx/gitlab-ssl @@ -39,7 +39,7 @@ upstream gitlab { ## Redirects all HTTP traffic to the HTTPS host server { listen 0.0.0.0:80; - listen [::]:80 default_server; + listen [::]:80 ipv6only=on default_server; server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com server_tokens off; ## Don't show the nginx version number, a security best practice return 301 https://$server_name$request_uri; @@ -51,7 +51,7 @@ server { ## HTTPS host server { listen 0.0.0.0:443 ssl; - listen [::]:443 ssl default_server; + listen [::]:443 ipv6only=on ssl default_server; server_name YOUR_SERVER_FQDN; ## Replace this with something like gitlab.example.com server_tokens off; ## Don't show the nginx version number, a security best practice root /home/git/gitlab/public; From 96a648ded25a46335302a7fa392cddfd2e3f4acb Mon Sep 17 00:00:00 2001 From: DJ Mountney Date: Mon, 8 Dec 2014 16:22:28 -0800 Subject: [PATCH 02/96] Fixes the search test that fails whenever faker uses a name with Bar in it. Limit check to being within the search results div. --- features/search.feature | 16 ++++++++-------- features/steps/search.rb | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/features/search.feature b/features/search.feature index 54708c1757..def21e0092 100644 --- a/features/search.feature +++ b/features/search.feature @@ -13,15 +13,15 @@ Feature: Search And project has issues When I search for "Foo" And I click "Issues" link - Then I should see "Foo" link - And I should not see "Bar" link + Then I should see "Foo" link in the search results + And I should not see "Bar" link in the search results Scenario: I should see merge requests I am looking for And project has merge requests When I search for "Foo" When I click "Merge requests" link - Then I should see "Foo" link - And I should not see "Bar" link + Then I should see "Foo" link in the search results + And I should not see "Bar" link in the search results Scenario: I should see project code I am looking for When I click project "Shop" link @@ -33,14 +33,14 @@ Feature: Search When I click project "Shop" link And I search for "Foo" And I click "Issues" link - Then I should see "Foo" link - And I should not see "Bar" link + Then I should see "Foo" link in the search results + And I should not see "Bar" link in the search results Scenario: I should see project merge requests And project has merge requests When I click project "Shop" link And I search for "Foo" And I click "Merge requests" link - Then I should see "Foo" link - And I should not see "Bar" link + Then I should see "Foo" link in the search results + And I should not see "Bar" link in the search results diff --git a/features/steps/search.rb b/features/steps/search.rb index f3d8bd80f1..6f0e038c4d 100644 --- a/features/steps/search.rb +++ b/features/steps/search.rb @@ -59,11 +59,11 @@ class Spinach::Features::Search < Spinach::FeatureSteps create(:merge_request, :simple, title: "Bar", source_project: project, target_project: project) end - step 'I should see "Foo" link' do - page.should have_link "Foo" + step 'I should see "Foo" link in the search results' do + find(:css, '.search-results').should have_link 'Foo' end - step 'I should not see "Bar" link' do - page.should_not have_link "Bar" + step 'I should not see "Bar" link in the search results' do + find(:css, '.search-results').should_not have_link 'Bar' end end From c33d078f53244c5b2d4d6cd49f62befed8e2471a Mon Sep 17 00:00:00 2001 From: DJ Mountney Date: Wed, 10 Dec 2014 15:51:54 -0800 Subject: [PATCH 03/96] Use the font variables instead of hardcoding fonts in notes. --- app/assets/stylesheets/sections/notes.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/sections/notes.scss b/app/assets/stylesheets/sections/notes.scss index 783f6ae02d..82f1a6b633 100644 --- a/app/assets/stylesheets/sections/notes.scss +++ b/app/assets/stylesheets/sections/notes.scss @@ -76,7 +76,7 @@ ul.notes { .diff-file .notes_holder { font-size: 13px; line-height: 18px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: $regular_font; td { border: 1px solid #ddd; From 0ed4ae7295ef1cf5d3a63be64315738a19a178b1 Mon Sep 17 00:00:00 2001 From: "Christian E. Hopps" Date: Sun, 14 Dec 2014 21:01:02 -0500 Subject: [PATCH 04/96] Add []s around user@ipv6addr (e.g., "[git@::1]/repo.git") --- config/initializers/1_settings.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 27bb83784b..d7af4e10cd 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -13,7 +13,11 @@ class Settings < Settingslogic if gitlab_shell.ssh_port != 22 "ssh://#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}:#{gitlab_shell.ssh_port}/" else - "#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}:" + if gitlab_shell.ssh_host.include? ':' + "[#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}]:" + else + "#{gitlab_shell.ssh_user}@#{gitlab_shell.ssh_host}:" + end end end From 09152bad0c3dd950d3d6dd0c0ea7f31056df1fdf Mon Sep 17 00:00:00 2001 From: Timo Lilja Date: Sat, 17 Jan 2015 16:15:20 +0200 Subject: [PATCH 05/96] Fix "500: Encoding error" on blame view This change forces encoding of source line data into UTF-8 and thus fixes the encoding error at least partially. The issue is described in https://gitlab.com/gitlab-org/gitlab-ce/issues/894 --- app/views/projects/blame/show.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/blame/show.html.haml b/app/views/projects/blame/show.html.haml index c507ecf2e4..51a2f20d1e 100644 --- a/app/views/projects/blame/show.html.haml +++ b/app/views/projects/blame/show.html.haml @@ -30,5 +30,5 @@ %code :erb <% lines.each do |line| %> - <%= highlight(@blob.name, line, true).html_safe %> + <%= highlight(@blob.name, line.force_encoding("utf-8"), true).html_safe %> <% end %> From c68742ed560b0bbf84c9fe6f6707cf47e9ed792c Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Wed, 21 Jan 2015 15:14:46 +0100 Subject: [PATCH 06/96] Make omnibus the default in repo import docs --- doc/raketasks/import.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/doc/raketasks/import.md b/doc/raketasks/import.md index 32fe4dc8d0..dbce6aae89 100644 --- a/doc/raketasks/import.md +++ b/doc/raketasks/import.md @@ -19,15 +19,20 @@ your repositories are located by looking at `config/gitlab.yml` under the `gitla New folder needs to have git user ownership and read/write/execute access for git user and its group: ``` -$ mkdir new_group -$ chown git:git new_group -$ chmod 770 new_group +# Replace /var/opt/gitlab/git-data with /home/git if you are using an +# installation from source. +sudo -u git mkdir /var/opt/gitlab/git-data/repositories/new_group ``` ### Copy your bare repositories inside this newly created folder: ``` -$ cp -r /old/git/foo.git/ /home/git/repositories/new_group/ +# Replace /var/opt/gitlab/git-data with /home/git if you are using an +# installation from source. +sudo cp -r /old/git/foo.git /var/opt/gitlab/git-data/repositories/new_group/ + +# Do this once when you are done copying git repositories +sudo chown -R git:git /var/opt/gitlab/git-data/repositories/new_group/ ``` `foo.git` needs to be owned by the git user and git users group. From 85b3c87b7f35843f26a9ead60f0bbfcb1d64dc2a Mon Sep 17 00:00:00 2001 From: Fred Chasen Date: Fri, 23 Jan 2015 14:57:48 -0500 Subject: [PATCH 07/96] Expose Link header in CORS Api calls --- config/application.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/application.rb b/config/application.rb index a7d371c78e..ac21d23294 100644 --- a/config/application.rb +++ b/config/application.rb @@ -70,7 +70,7 @@ module Gitlab config.middleware.use Rack::Cors do allow do origins '*' - resource '/api/*', headers: :any, methods: [:get, :post, :options, :put, :delete] + resource '/api/*', headers: :any, methods: [:get, :post, :options, :put, :delete], expose: ["Link"] end end From 13c4e25d6fd7ce4ae34340667d6ee5640ff925a1 Mon Sep 17 00:00:00 2001 From: Fred Chasen Date: Fri, 23 Jan 2015 15:30:48 -0500 Subject: [PATCH 08/96] Split up line and use single qoutes to declare Cors settings --- config/application.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/application.rb b/config/application.rb index ac21d23294..d5a69aa8a7 100644 --- a/config/application.rb +++ b/config/application.rb @@ -70,7 +70,10 @@ module Gitlab config.middleware.use Rack::Cors do allow do origins '*' - resource '/api/*', headers: :any, methods: [:get, :post, :options, :put, :delete], expose: ["Link"] + resource '/api/*', + :headers => :any, + :methods => [:get, :post, :options, :put, :delete], + :expose => ['Link'] end end From 1f5ecf6c502b1dffa26986b1e62cf46cbc58f981 Mon Sep 17 00:00:00 2001 From: Fred Chasen Date: Fri, 23 Jan 2015 15:33:20 -0500 Subject: [PATCH 09/96] use new hash syntax --- config/application.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/application.rb b/config/application.rb index d5a69aa8a7..24ba219cf3 100644 --- a/config/application.rb +++ b/config/application.rb @@ -70,10 +70,10 @@ module Gitlab config.middleware.use Rack::Cors do allow do origins '*' - resource '/api/*', - :headers => :any, - :methods => [:get, :post, :options, :put, :delete], - :expose => ['Link'] + resource '/api/*', + headers: :any, + methods: [:get, :post, :options, :put, :delete], + expose: ['Link'] end end From aad6ceaef9ccfba8e058012a0877b80c103a3838 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 16:33:54 +0100 Subject: [PATCH 10/96] Allow configuring protection of the default branch upon first push --- CHANGELOG | 2 +- .../admin/application_settings_controller.rb | 1 + app/models/application_setting.rb | 2 ++ app/services/git_push_service.rb | 10 ++++++++-- .../application_settings/_form.html.haml | 4 ++++ config/initializers/1_settings.rb | 1 + ...0_add_default_branch_protection_setting.rb | 5 +++++ db/schema.rb | 3 ++- lib/gitlab/access.rb | 16 ++++++++++++++++ lib/gitlab/current_settings.rb | 1 + spec/models/application_setting_spec.rb | 19 ++++++++++--------- spec/services/git_push_service_spec.rb | 2 +- 12 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 db/migrate/20150125163100_add_default_branch_protection_setting.rb diff --git a/CHANGELOG b/CHANGELOG index dd9b13ceac..26cef6c6c1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -28,7 +28,7 @@ v 7.8.0 - - - - - + - Allow configuring protection of the default branch upon first push (Marco Wessel) - - - diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index a937f48487..7458542fc7 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -22,6 +22,7 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController def application_setting_params params.require(:application_setting).permit( :default_projects_limit, + :default_branch_protection, :signup_enabled, :signin_enabled, :gravatar_enabled, diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 45ae79a75c..3285a1a248 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -4,6 +4,7 @@ # # id :integer not null, primary key # default_projects_limit :integer +# default_branch_protection :integer # signup_enabled :boolean # signin_enabled :boolean # gravatar_enabled :boolean @@ -25,6 +26,7 @@ class ApplicationSetting < ActiveRecord::Base def self.create_from_defaults create( default_projects_limit: Settings.gitlab['default_projects_limit'], + default_branch_protection: Settings.gitlab['default_branch_protection'], signup_enabled: Settings.gitlab['signup_enabled'], signin_enabled: Settings.gitlab['signin_enabled'], gravatar_enabled: Settings.gravatar['enabled'], diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index 872b886c57..b45ca0a5e6 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -1,5 +1,7 @@ class GitPushService attr_accessor :project, :user, :push_data, :push_commits + include Gitlab::CurrentSettings + include Gitlab::Access # This method will be called after each git update # and only if the provided user and project is present in GitLab. @@ -29,8 +31,12 @@ class GitPushService if is_default_branch?(ref) # Initial push to the default branch. Take the full history of that branch as "newly pushed". @push_commits = project.repository.commits(newrev) - # Default branch is protected by default - project.protected_branches.create({ name: project.default_branch }) + + # Set protection on the default branch if configured + if (current_application_settings.default_branch_protection != PROTECTION_NONE) + developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false + project.protected_branches.create({ name: project.default_branch, developers_can_push: developers_can_push }) + end else # Use the pushed commits that aren't reachable by the default branch # as a heuristic. This may include more commits than are actually pushed, but diff --git a/app/views/admin/application_settings/_form.html.haml b/app/views/admin/application_settings/_form.html.haml index 9423a20706..bf0ee49d2f 100644 --- a/app/views/admin/application_settings/_form.html.haml +++ b/app/views/admin/application_settings/_form.html.haml @@ -25,6 +25,10 @@ = f.label :default_projects_limit, class: 'control-label' .col-sm-10 = f.number_field :default_projects_limit, class: 'form-control' + .form-group + = f.label :default_branch_protection, class: 'control-label' + .col-sm-10 + = f.select :default_branch_protection, options_for_select(Gitlab::Access.protection_options, @application_setting.default_branch_protection), {}, class: 'form-control' .form-group = f.label :home_page_url, class: 'control-label' .col-sm-10 diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 1ec842761f..2c8441ece0 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -87,6 +87,7 @@ Settings['issues_tracker'] ||= {} # Settings['gitlab'] ||= Settingslogic.new({}) Settings.gitlab['default_projects_limit'] ||= 10 +Settings.gitlab['default_branch_protection'] ||= 2 Settings.gitlab['default_can_create_group'] = true if Settings.gitlab['default_can_create_group'].nil? Settings.gitlab['default_theme'] = Gitlab::Theme::MARS if Settings.gitlab['default_theme'].nil? Settings.gitlab['host'] ||= 'localhost' diff --git a/db/migrate/20150125163100_add_default_branch_protection_setting.rb b/db/migrate/20150125163100_add_default_branch_protection_setting.rb new file mode 100644 index 0000000000..5020daf55f --- /dev/null +++ b/db/migrate/20150125163100_add_default_branch_protection_setting.rb @@ -0,0 +1,5 @@ +class AddDefaultBranchProtectionSetting < ActiveRecord::Migration + def change + add_column :application_settings, :default_branch_protection, :integer, :default => 2 + end +end diff --git a/db/schema.rb b/db/schema.rb index 29466f048e..124023545f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,13 +11,14 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20150116234544) do +ActiveRecord::Schema.define(version: 20150125163100) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" create_table "application_settings", force: true do |t| t.integer "default_projects_limit" + t.integer "default_branch_protection" t.boolean "signup_enabled" t.boolean "signin_enabled" t.boolean "gravatar_enabled" diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb index 411b2b9a3c..ad05bfadaf 100644 --- a/lib/gitlab/access.rb +++ b/lib/gitlab/access.rb @@ -11,6 +11,11 @@ module Gitlab MASTER = 40 OWNER = 50 + # Branch protection settings + PROTECTION_NONE = 0 + PROTECTION_DEV_CAN_PUSH = 1 + PROTECTION_FULL = 2 + class << self def values options.values @@ -43,6 +48,17 @@ module Gitlab master: MASTER, } end + + def protection_options + { + "None" => PROTECTION_NONE, + "Protect, developers can push" => PROTECTION_DEV_CAN_PUSH, + "Full protection" => PROTECTION_FULL, + } + end + def protection_values + protection_options.values + end end def human_access diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index 2c5660df37..75afc024a6 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -12,6 +12,7 @@ module Gitlab def fake_application_settings OpenStruct.new( default_projects_limit: Settings.gitlab['default_projects_limit'], + default_branch_protection: Settings.gitlab['default_branch_protection'], signup_enabled: Settings.gitlab['signup_enabled'], signin_enabled: Settings.gitlab['signin_enabled'], gravatar_enabled: Settings.gravatar['enabled'], diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb index 1723eba9ec..ac68e3d925 100644 --- a/spec/models/application_setting_spec.rb +++ b/spec/models/application_setting_spec.rb @@ -2,15 +2,16 @@ # # Table name: application_settings # -# id :integer not null, primary key -# default_projects_limit :integer -# signup_enabled :boolean -# signin_enabled :boolean -# gravatar_enabled :boolean -# sign_in_text :text -# created_at :datetime -# updated_at :datetime -# home_page_url :string(255) +# id :integer not null, primary key +# default_projects_limit :integer +# default_branch_protection :interger +# signup_enabled :boolean +# signin_enabled :boolean +# gravatar_enabled :boolean +# sign_in_text :text +# created_at :datetime +# updated_at :datetime +# home_page_url :string(255) # require 'spec_helper' diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index 19b442573f..02c8133d2c 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -106,7 +106,7 @@ describe GitPushService do it "when pushing a branch for the first time" do project.should_receive(:execute_hooks) project.default_branch.should == "master" - project.protected_branches.should_receive(:create).with({ name: "master" }) + project.protected_branches.should_receive(:create).with({ name: "master", developers_can_push: false }) service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') end From b20fc14133957d0e71bcf48aed4b426d439681db Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 18:34:02 +0100 Subject: [PATCH 11/96] Fix indentation --- db/schema.rb | 6 +++--- lib/gitlab/current_settings.rb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/db/schema.rb b/db/schema.rb index 124023545f..32e49ff7a7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -18,7 +18,6 @@ ActiveRecord::Schema.define(version: 20150125163100) do create_table "application_settings", force: true do |t| t.integer "default_projects_limit" - t.integer "default_branch_protection" t.boolean "signup_enabled" t.boolean "signin_enabled" t.boolean "gravatar_enabled" @@ -26,6 +25,7 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.datetime "created_at" t.datetime "updated_at" t.string "home_page_url" + t.integer "default_branch_protection", default: 2 end create_table "broadcast_messages", force: true do |t| @@ -323,12 +323,12 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.string "import_url" 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.string "import_type" t.string "import_source" - t.string "avatar" end add_index "projects", ["creator_id"], name: "index_projects_on_creator_id", using: :btree @@ -426,6 +426,7 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.integer "notification_level", default: 1, null: false t.datetime "password_expires_at" t.integer "created_by_id" + t.datetime "last_credential_check_at" t.string "avatar" t.string "confirmation_token" t.datetime "confirmed_at" @@ -433,7 +434,6 @@ ActiveRecord::Schema.define(version: 20150125163100) do t.string "unconfirmed_email" t.boolean "hide_no_ssh_key", default: false t.string "website_url", default: "", null: false - t.datetime "last_credential_check_at" t.string "github_access_token" end diff --git a/lib/gitlab/current_settings.rb b/lib/gitlab/current_settings.rb index 75afc024a6..90f0d648f9 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -12,7 +12,7 @@ module Gitlab def fake_application_settings OpenStruct.new( default_projects_limit: Settings.gitlab['default_projects_limit'], - default_branch_protection: Settings.gitlab['default_branch_protection'], + default_branch_protection: Settings.gitlab['default_branch_protection'], signup_enabled: Settings.gitlab['signup_enabled'], signin_enabled: Settings.gitlab['signin_enabled'], gravatar_enabled: Settings.gravatar['enabled'], From c821412e305b3e7226485d561ce39ab0d419e990 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 18:36:11 +0100 Subject: [PATCH 12/96] indentation --- app/services/git_push_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index b45ca0a5e6..c775f79ec2 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -34,7 +34,7 @@ class GitPushService # Set protection on the default branch if configured if (current_application_settings.default_branch_protection != PROTECTION_NONE) - developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false + developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false project.protected_branches.create({ name: project.default_branch, developers_can_push: developers_can_push }) end else From afce47923cf184bd11a6122c25fb57fe98f73148 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 18:38:35 +0100 Subject: [PATCH 13/96] actually fix indentation --- 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 90f0d648f9..93e7edf508 100644 --- a/lib/gitlab/current_settings.rb +++ b/lib/gitlab/current_settings.rb @@ -12,7 +12,7 @@ module Gitlab def fake_application_settings OpenStruct.new( default_projects_limit: Settings.gitlab['default_projects_limit'], - default_branch_protection: Settings.gitlab['default_branch_protection'], + default_branch_protection: Settings.gitlab['default_branch_protection'], signup_enabled: Settings.gitlab['signup_enabled'], signin_enabled: Settings.gitlab['signin_enabled'], gravatar_enabled: Settings.gravatar['enabled'], From 2a4502111e03c233861b545ae3ff3afd95614c4a Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sun, 25 Jan 2015 22:23:28 +0100 Subject: [PATCH 14/96] Spelling error --- spec/models/application_setting_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/models/application_setting_spec.rb b/spec/models/application_setting_spec.rb index ac68e3d925..cd6d03e6c1 100644 --- a/spec/models/application_setting_spec.rb +++ b/spec/models/application_setting_spec.rb @@ -4,7 +4,7 @@ # # id :integer not null, primary key # default_projects_limit :integer -# default_branch_protection :interger +# default_branch_protection :integer # signup_enabled :boolean # signin_enabled :boolean # gravatar_enabled :boolean From addb2555841510bb48bc0fb9f1a90d80a7ed87fe Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Mon, 26 Jan 2015 17:03:04 +0100 Subject: [PATCH 15/96] Separate out the instructions for source installs --- doc/raketasks/import.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/doc/raketasks/import.md b/doc/raketasks/import.md index dbce6aae89..9a10c8d685 100644 --- a/doc/raketasks/import.md +++ b/doc/raketasks/import.md @@ -19,16 +19,15 @@ your repositories are located by looking at `config/gitlab.yml` under the `gitla New folder needs to have git user ownership and read/write/execute access for git user and its group: ``` -# Replace /var/opt/gitlab/git-data with /home/git if you are using an -# installation from source. sudo -u git mkdir /var/opt/gitlab/git-data/repositories/new_group ``` +If you are using an installation from source, replace `/var/opt/gitlab/git-data` +with `/home/git`. + ### Copy your bare repositories inside this newly created folder: ``` -# Replace /var/opt/gitlab/git-data with /home/git if you are using an -# installation from source. sudo cp -r /old/git/foo.git /var/opt/gitlab/git-data/repositories/new_group/ # Do this once when you are done copying git repositories @@ -37,6 +36,9 @@ sudo chown -R git:git /var/opt/gitlab/git-data/repositories/new_group/ `foo.git` needs to be owned by the git user and git users group. +If you are using an installation from source, replace `/var/opt/gitlab/git-data` +with `/home/git`. + ### Run the command below depending on your type of installation: #### Omnibus Installation From bf44938cc0b9c3023dd486fc23e7ddbf6be8b573 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Wed, 28 Jan 2015 08:50:31 +0200 Subject: [PATCH 16/96] Drop comments on cookbook installing from source now that it uses Omnibus. --- doc/raketasks/backup_restore.md | 6 +++--- doc/raketasks/cleanup.md | 4 ++-- doc/raketasks/maintenance.md | 4 ++-- doc/raketasks/user_management.md | 8 ++++---- doc/raketasks/web_hooks.md | 12 ++++++------ 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md index f9d2f5dc4e..50cd0d08b5 100644 --- a/doc/raketasks/backup_restore.md +++ b/doc/raketasks/backup_restore.md @@ -13,7 +13,7 @@ You can only restore a backup to exactly the same version of GitLab that you cre # use this command if you've installed GitLab with the Omnibus package sudo gitlab-rake gitlab:backup:create -# if you've installed GitLab from source or using the cookbook +# if you've installed GitLab from source sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production ``` @@ -147,7 +147,7 @@ You can only restore a backup to exactly the same version of GitLab that you cre # Omnibus package installation sudo gitlab-rake gitlab:backup:restore -# installation from source or cookbook +# installation from source bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` @@ -192,7 +192,7 @@ Deleting tmp directories...[DONE] For Omnibus package installations, see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md#scheduling-a-backup . -For installation from source or cookbook: +For installation from source: ``` cd /home/git/gitlab sudo -u git -H editor config/gitlab.yml # Enable keep_time in the backup section to automatically delete old backups diff --git a/doc/raketasks/cleanup.md b/doc/raketasks/cleanup.md index 9e48f56c95..96d67f7b5d 100644 --- a/doc/raketasks/cleanup.md +++ b/doc/raketasks/cleanup.md @@ -8,7 +8,7 @@ Remove namespaces(dirs) from `/home/git/repositories` if they don't exist in Git # omnibus-gitlab sudo gitlab-rake gitlab:cleanup:dirs -# installation from source or cookbook +# installation from source bundle exec rake gitlab:cleanup:dirs RAILS_ENV=production ``` @@ -18,6 +18,6 @@ Remove repositories (global only for now) from `/home/git/repositories` if they # omnibus-gitlab sudo gitlab-rake gitlab:cleanup:repos -# installation from source or cookbook +# installation from source bundle exec rake gitlab:cleanup:repos RAILS_ENV=production ``` diff --git a/doc/raketasks/maintenance.md b/doc/raketasks/maintenance.md index 8bef92e55f..c31ef9f5ef 100644 --- a/doc/raketasks/maintenance.md +++ b/doc/raketasks/maintenance.md @@ -8,7 +8,7 @@ This command gathers information about your GitLab installation and the System i # omnibus-gitlab sudo gitlab-rake gitlab:env:info -# installation from source or cookbook +# installation from source bundle exec rake gitlab:env:info RAILS_ENV=production ``` @@ -59,7 +59,7 @@ You may also have a look at our [Trouble Shooting Guide](https://github.com/gitl # omnibus-gitlab sudo gitlab-rake gitlab:check -# installation from source or cookbook +# installation from source bundle exec rake gitlab:check RAILS_ENV=production ``` diff --git a/doc/raketasks/user_management.md b/doc/raketasks/user_management.md index 3c67753ad2..80b01ca404 100644 --- a/doc/raketasks/user_management.md +++ b/doc/raketasks/user_management.md @@ -6,7 +6,7 @@ # omnibus-gitlab sudo gitlab-rake gitlab:import:user_to_projects[username@domain.tld] -# installation from source or cookbook +# installation from source bundle exec rake gitlab:import:user_to_projects[username@domain.tld] RAILS_ENV=production ``` @@ -20,7 +20,7 @@ Notes: # omnibus-gitlab sudo gitlab-rake gitlab:import:all_users_to_all_projects -# installation from source or cookbook +# installation from source bundle exec rake gitlab:import:all_users_to_all_projects RAILS_ENV=production ``` @@ -30,7 +30,7 @@ bundle exec rake gitlab:import:all_users_to_all_projects RAILS_ENV=production # omnibus-gitlab sudo gitlab-rake gitlab:import:user_to_groups[username@domain.tld] -# installation from source or cookbook +# installation from source bundle exec rake gitlab:import:user_to_groups[username@domain.tld] RAILS_ENV=production ``` @@ -44,6 +44,6 @@ Notes: # omnibus-gitlab sudo gitlab-rake gitlab:import:all_users_to_all_groups -# installation from source or cookbook +# installation from source bundle exec rake gitlab:import:all_users_to_all_groups RAILS_ENV=production ``` diff --git a/doc/raketasks/web_hooks.md b/doc/raketasks/web_hooks.md index e1a58835d8..5a8b94af9b 100644 --- a/doc/raketasks/web_hooks.md +++ b/doc/raketasks/web_hooks.md @@ -4,42 +4,42 @@ # omnibus-gitlab sudo gitlab-rake gitlab:web_hook:add URL="http://example.com/hook" - # source installations or cookbook + # source installations bundle exec rake gitlab:web_hook:add URL="http://example.com/hook" RAILS_ENV=production ## Add a web hook for projects in a given **NAMESPACE**: # omnibus-gitlab sudo gitlab-rake gitlab:web_hook:add URL="http://example.com/hook" NAMESPACE=acme - # source installations or cookbook + # source installations bundle exec rake gitlab:web_hook:add URL="http://example.com/hook" NAMESPACE=acme RAILS_ENV=production ## Remove a web hook from **ALL** projects using: # omnibus-gitlab sudo gitlab-rake gitlab:web_hook:rm URL="http://example.com/hook" - # source installations or cookbook + # source installations bundle exec rake gitlab:web_hook:rm URL="http://example.com/hook" RAILS_ENV=production ## Remove a web hook from projects in a given **NAMESPACE**: # omnibus-gitlab sudo gitlab-rake gitlab:web_hook:rm URL="http://example.com/hook" NAMESPACE=acme - # source installations or cookbook + # source installations bundle exec rake gitlab:web_hook:rm URL="http://example.com/hook" NAMESPACE=acme RAILS_ENV=production ## List **ALL** web hooks: # omnibus-gitlab sudo gitlab-rake gitlab:web_hook:list - # source installations or cookbook + # source installations bundle exec rake gitlab:web_hook:list RAILS_ENV=production ## List the web hooks from projects in a given **NAMESPACE**: # omnibus-gitlab sudo gitlab-rake gitlab:web_hook:list NAMESPACE=/ - # source installations or cookbook + # source installations bundle exec rake gitlab:web_hook:list NAMESPACE=/ RAILS_ENV=production > Note: `/` is the global namespace. From e0e6574ff7ae42e50afcf11bde4889f1e849ff48 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Wed, 28 Jan 2015 09:07:27 +0200 Subject: [PATCH 17/96] Add assets precompile and redis clear cache to maintenance tasks. --- doc/raketasks/maintenance.md | 74 +++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/doc/raketasks/maintenance.md b/doc/raketasks/maintenance.md index 8bef92e55f..6f921bcdae 100644 --- a/doc/raketasks/maintenance.md +++ b/doc/raketasks/maintenance.md @@ -16,30 +16,31 @@ Example output: ``` System information -System: Debian 6.0.7 -Current User: git -Using RVM: no -Ruby Version: 2.0.0-p481 -Gem Version: 1.8.23 -Bundler Version:1.3.5 -Rake Version: 10.0.4 +System: Debian 7.8 +Current User: git +Using RVM: no +Ruby Version: 2.1.5p273 +Gem Version: 2.4.3 +Bundler Version: 1.7.6 +Rake Version: 10.3.2 +Sidekiq Version: 2.17.8 GitLab information -Version: 5.1.0.beta2 -Revision: 4da8b37 -Directory: /home/git/gitlab -DB Adapter: mysql2 -URL: http://example.com -HTTP Clone URL: http://example.com/some-project.git -SSH Clone URL: git@example.com:some-project.git -Using LDAP: no -Using Omniauth: no +Version: 7.7.1 +Revision: 41ab9e1 +Directory: /home/git/gitlab +DB Adapter: postgresql +URL: https://gitlab.example.com +HTTP Clone URL: https://gitlab.example.com/some-project.git +SSH Clone URL: git@gitlab.example.com:some-project.git +Using LDAP: no +Using Omniauth: no GitLab Shell -Version: 1.2.0 -Repositories: /home/git/repositories/ -Hooks: /home/git/gitlab-shell/hooks/ -Git: /usr/bin/git +Version: 2.4.1 +Repositories: /home/git/repositories/ +Hooks: /home/git/gitlab-shell/hooks/ +Git: /usr/bin/git ``` ## Check GitLab configuration @@ -127,7 +128,6 @@ sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites In some case it is necessary to rebuild the `authorized_keys` file. - For Omnibus-packages: ``` sudo gitlab-rake gitlab:shell:setup @@ -143,6 +143,36 @@ sudo -u git -H bundle exec rake gitlab:shell:setup RAILS_ENV=production This will rebuild an authorized_keys file. You will lose any data stored in authorized_keys file. Do you want to continue (yes/no)? yes +``` -............................ +## Clear redis cache + +If for some reason the dashboard shows wrong information you might want to +clear Redis' cache. + +For Omnibus-packages: +``` +sudo gitlab-rake cache:clear +``` + +For installations from source: +``` +cd /home/git/gitlab +sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production +``` + +## Precompile the assets + +Sometimes during version upgrades you might end up with some wrong CSS or +missing some icons. In that case, try to precompile the assets again. + +For Omnibus-packages: +``` +sudo gitlab-rake assets:precompile +``` + +For installations from source: +``` +cd /home/git/gitlab +sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production ``` From 8633bbc9b852d8809f20db86a3cdfa2cd3b8dd95 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 02:41:36 -0500 Subject: [PATCH 18/96] Add `icon` helper method --- app/helpers/icons_helper.rb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index aaa8f8d007..61c03d9007 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -1,21 +1,30 @@ module IconsHelper + # Creates an icon tag given icon name(s) and possible icon modifiers. + # + # Right now this method simply delegates directly to `fa_icon` from the + # font-awesome-rails gem, but should we ever use a different icon pack in the + # future we won't have to change hundreds of method calls. + def icon(names, options = {}) + fa_icon(names, options) + end + def boolean_to_icon(value) if value.to_s == "true" - content_tag :i, nil, class: 'fa fa-circle cgreen' + icon('circle', class: 'cgreen') else - content_tag :i, nil, class: 'fa fa-power-off clgray' + icon('power-off', class: 'clgray') end end def public_icon - content_tag :i, nil, class: 'fa fa-globe' + icon('globe') end def internal_icon - content_tag :i, nil, class: 'fa fa-shield' + icon('shield') end def private_icon - content_tag :i, nil, class: 'fa fa-lock' + icon('lock') end end From fe831dcd6f4af535abba1a9dc350c4d8a0f809e9 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 03:30:27 -0500 Subject: [PATCH 19/96] Move `spinner` helper into IconsHelper Also updates it to use the new `icon` method. --- app/helpers/application_helper.rb | 9 --------- app/helpers/icons_helper.rb | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 104ae517a0..d00f1aac2d 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -247,15 +247,6 @@ module ApplicationHelper Gitlab::MarkdownHelper.gitlab_markdown?(filename) end - def spinner(text = nil, visible = false) - css_class = 'loading' - css_class << ' hide' unless visible - - content_tag :div, class: css_class do - content_tag(:i, nil, class: 'fa fa-spinner fa-spin') + text - end - end - def link_to(name = nil, options = nil, html_options = nil, &block) begin uri = URI(options) diff --git a/app/helpers/icons_helper.rb b/app/helpers/icons_helper.rb index 61c03d9007..18260f0ed4 100644 --- a/app/helpers/icons_helper.rb +++ b/app/helpers/icons_helper.rb @@ -8,6 +8,15 @@ module IconsHelper fa_icon(names, options) end + def spinner(text = nil, visible = false) + css_class = 'loading' + css_class << ' hide' unless visible + + content_tag :div, class: css_class do + icon('spinner spin') + text + end + end + def boolean_to_icon(value) if value.to_s == "true" icon('circle', class: 'cgreen') From 4e7a4cd95696746bcab78a4f9ec071dd4089397a Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 03:32:48 -0500 Subject: [PATCH 20/96] Use `icon` helper method in helper modules --- app/helpers/commits_helper.rb | 6 ++---- app/helpers/events_helper.rb | 11 +++++------ app/helpers/issues_helper.rb | 2 +- app/helpers/notes_helper.rb | 6 +++--- app/helpers/notifications_helper.rb | 8 ++++---- app/helpers/projects_helper.rb | 4 ++-- app/helpers/tree_helper.rb | 9 ++------- 7 files changed, 19 insertions(+), 27 deletions(-) diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 2a3e51ada5..1a322ac048 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -65,8 +65,7 @@ module CommitsHelper branches.sort.map do |branch| link_to(project_tree_path(project, branch)) do content_tag :span, class: 'label label-gray' do - content_tag(:i, nil, class: 'fa fa-code-fork') + ' ' + - branch + icon('code-fork') + ' ' + branch end end end.join(" ").html_safe @@ -78,8 +77,7 @@ module CommitsHelper sorted.map do |tag| link_to(project_commits_path(project, project.repository.find_tag(tag).name)) do content_tag :span, class: 'label label-gray' do - content_tag(:i, nil, class: 'fa fa-tag') + ' ' + - tag + icon('tag') + ' ' + tag end end end.join(" ").html_safe diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 903a500961..d05f6df5f9 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -27,18 +27,17 @@ module EventsHelper content_tag :li, class: "filter_icon #{active}" do link_to request.path, class: 'has_tooltip event_filter_link', id: "#{key}_event_filter", 'data-original-title' => tooltip do - content_tag(:i, nil, class: icon_for_event[key]) + - content_tag(:span, ' ' + tooltip) + icon(icon_for_event[key]) + content_tag(:span, ' ' + tooltip) end end end def icon_for_event { - EventFilter.push => 'fa fa-upload', - EventFilter.merged => 'fa fa-check-square-o', - EventFilter.comments => 'fa fa-comments', - EventFilter.team => 'fa fa-user', + EventFilter.push => 'upload', + EventFilter.merged => 'check-square-o', + EventFilter.comments => 'comments', + EventFilter.team => 'user', } end diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index 2bf430f914..5fcc825acc 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -62,7 +62,7 @@ module IssuesHelper ts << capture_haml do haml_tag :span do haml_concat '·' - haml_concat ' ' + haml_concat icon('edit', title: 'edited') haml_concat time_ago_with_tooltip(issue.updated_at, 'bottom', 'issue_edited_ago') end end diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 8f493f5d33..d41d561739 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -22,7 +22,7 @@ module NotesHelper ts << capture_haml do haml_tag :span do haml_concat '·' - haml_concat ' ' + haml_concat icon('edit', title: 'edited') haml_concat time_ago_with_tooltip(note.updated_at, 'bottom', 'note_edited_ago') end end @@ -57,7 +57,7 @@ module NotesHelper button_tag(class: 'btn add-diff-note js-add-diff-note-button', data: data, title: 'Add a comment to this line') do - content_tag :i, nil, class: 'fa fa-comment-o' + icon('comment-o') end end @@ -74,7 +74,7 @@ module NotesHelper button_tag class: 'btn reply-btn js-discussion-reply-button', data: data, title: 'Add a reply' do - link_text = content_tag(:i, nil, class: 'fa fa-comment') + link_text = icon('comment') link_text << ' Reply' end end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index bad380e98a..f771fe761e 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -1,13 +1,13 @@ module NotificationsHelper def notification_icon(notification) if notification.disabled? - content_tag :i, nil, class: 'fa fa-volume-off ns-mute' + icon('volume-off', class: 'ns-mute') elsif notification.participating? - content_tag :i, nil, class: 'fa fa-volume-down ns-part' + icon('volume-down', class: 'ns-part') elsif notification.watch? - content_tag :i, nil, class: 'fa fa-volume-up ns-watch' + icon('volume-up', class: 'ns-watch') else - content_tag :i, nil, class: 'fa fa-circle-o ns-default' + icon('circle-o', class: 'ns-default') end end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 351641e19a..0b01be7962 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -83,7 +83,7 @@ module ProjectsHelper ' Star' end - content_tag('i', ' ', class: 'fa fa-star') + toggle_text + icon('star') + toggle_text end count_html = content_tag('span', class: 'count') do @@ -107,7 +107,7 @@ module ProjectsHelper end def link_to_toggle_fork - out = content_tag(:i, '', class: 'fa fa-code-fork') + out = icon('code-fork') out << ' Fork' out << content_tag(:span, class: 'count') do @project.forks_count.to_s diff --git a/app/helpers/tree_helper.rb b/app/helpers/tree_helper.rb index 727ec3fb23..b6fb7a8aa5 100644 --- a/app/helpers/tree_helper.rb +++ b/app/helpers/tree_helper.rb @@ -38,13 +38,8 @@ module TreeHelper # # type - String type of the tree item; either 'folder' or 'file' def tree_icon(type) - icon_class = if type == 'folder' - 'fa fa-folder' - else - 'fa fa-file-o' - end - - content_tag :i, nil, class: icon_class + icon_class = type == 'folder' ? 'folder' : 'file-o' + icon(icon_class) end def tree_hex_class(content) From 1f0e16569f1924ed967bff9f4f78bbee874251db Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 01:20:17 -0800 Subject: [PATCH 21/96] Load contribution calendar via AJAX --- app/controllers/users_controller.rb | 31 ++++++++++++------- ..._calendar.html.haml => calendar.html.haml} | 1 + app/views/users/show.html.haml | 10 ++++-- config/routes.rb | 7 ++--- 4 files changed, 32 insertions(+), 17 deletions(-) rename app/views/users/{_calendar.html.haml => calendar.html.haml} (90%) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9e5ea6cfa4..8c96f67a2a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,14 +1,7 @@ class UsersController < ApplicationController - skip_before_filter :authenticate_user!, only: [:show, :activities] layout :determine_layout def show - @user = User.find_by_username!(params[:username]) - - unless current_user || @user.public_profile? - return authenticate_user! - end - # Projects user can view visible_projects = ProjectsFinder.new.execute(current_user) authorized_projects_ids = visible_projects.pluck(:id) @@ -25,6 +18,15 @@ class UsersController < ApplicationController @title = @user.name + respond_to do |format| + format.html + format.atom { render layout: false } + end + end + + def calendar + visible_projects = ProjectsFinder.new.execute(current_user) + # Get user repositories and collect timestamps for commits user_repositories = visible_projects.map(&:repository) calendar = Gitlab::CommitsCalendar.new(user_repositories, @user) @@ -32,10 +34,7 @@ class UsersController < ApplicationController @starting_year = (Time.now - 1.year).strftime("%Y") @starting_month = Date.today.strftime("%m").to_i - respond_to do |format| - format.html - format.atom { render layout: false } - end + render 'calendar', layout: false end def determine_layout @@ -45,4 +44,14 @@ class UsersController < ApplicationController 'public_users' end end + + private + + def authenticate_user! + @user = User.find_by_username!(params[:username]) + + unless current_user || @user.public_profile? + return authenticate_user! + end + end end diff --git a/app/views/users/_calendar.html.haml b/app/views/users/calendar.html.haml similarity index 90% rename from app/views/users/_calendar.html.haml rename to app/views/users/calendar.html.haml index b16a7305a3..727faf2367 100644 --- a/app/views/users/_calendar.html.haml +++ b/app/views/users/calendar.html.haml @@ -1,3 +1,4 @@ +%h4 Calendar: #cal-heatmap.calendar :javascript new calendar( diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index c248a28047..445f43cd50 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -19,8 +19,9 @@ = render 'groups', groups: @groups %hr - %h4 Calendar: - %div= render 'calendar' + .user-calendar + %h4.center.light + %i.fa.fa-spinner.fa-spin %hr %h4 User Activity: @@ -36,3 +37,8 @@ = render 'profile', user: @user - if @projects.present? = render 'projects', projects: @projects + + +:coffeescript + $ -> + $(".user-calendar").load("#{user_calendar_path}") diff --git a/config/routes.rb b/config/routes.rb index 5d61de29b9..e122777314 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -157,10 +157,9 @@ Gitlab::Application.routes.draw do end end - # route for commits used by the cal-heatmap - get 'u/:username/activities' => 'users#activities', as: :user_activities, - constraints: { username: /(?:[^.]|\.(?!atom$))+/, format: /atom/ }, - via: :get + get 'u/:username/calendar' => 'users#calendar', as: :user_calendar, + constraints: { username: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } + get '/u/:username' => 'users#show', as: :user, constraints: { username: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } From 4ce18089f6d3f242bb48fd6c72161144b38b6e29 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Thu, 29 Jan 2015 17:13:38 +0200 Subject: [PATCH 22/96] Remove text about hidden settings. --- app/views/projects/edit.html.haml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 31bdbb562a..367bd8806d 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -3,8 +3,7 @@ .project-edit-content %div %h3.page-title - Project settings: - %p.light Some settings, such as "Transfer Project", are hidden inside the danger area below. + Project settings %hr .panel-body = form_for @project, remote: true, html: { multipart: true, class: "edit_project form-horizontal" }, authenticity_token: true do |f| From 35bf471a13abe0ec68ca8ceb19f896be5ce63c46 Mon Sep 17 00:00:00 2001 From: Vincent Robert Date: Thu, 29 Jan 2015 16:34:01 +0100 Subject: [PATCH 23/96] Bump Gitlab for Docker to 7.7.1 --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 445fdd6d06..70d6c721f1 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,7 +11,7 @@ RUN apt-get update -q \ # If the Omnibus package version below is outdated please contribute a merge request to update it. # If you run GitLab Enterprise Edition point it to a location where you have downloaded it. RUN TMP_FILE=$(mktemp); \ - wget -q -O $TMP_FILE https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.6.2-omnibus.5.3.0.ci.1-1_amd64.deb \ + wget -q -O $TMP_FILE https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.7.1-omnibus.5.4.1.ci-1_amd64.deb \ && dpkg -i $TMP_FILE \ && rm -f $TMP_FILE From 08582f153249d91d361977d7968126a420739a8b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 08:55:57 -0800 Subject: [PATCH 24/96] Improve user calendar authentification and tests --- app/controllers/users_controller.rb | 4 +++- spec/controllers/users_controller_spec.rb | 10 +++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 8c96f67a2a..ff5e31067f 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1,4 +1,6 @@ class UsersController < ApplicationController + skip_before_filter :authenticate_user! + before_filter :set_user layout :determine_layout def show @@ -47,7 +49,7 @@ class UsersController < ApplicationController private - def authenticate_user! + def set_user @user = User.find_by_username!(params[:username]) unless current_user || @user.public_profile? diff --git a/spec/controllers/users_controller_spec.rb b/spec/controllers/users_controller_spec.rb index 0c537a552c..44225c054f 100644 --- a/spec/controllers/users_controller_spec.rb +++ b/spec/controllers/users_controller_spec.rb @@ -9,18 +9,18 @@ describe UsersController do describe "GET #show" do render_views - before do - get :show, username: user.username - end it "renders the show template" do + get :show, username: user.username expect(response.status).to eq(200) expect(response).to render_template("show") end + end + describe "GET #calendar" do it "renders calendar" do - controller.prepend_view_path 'app/views/users' - expect(response).to render_template("_calendar") + get :calendar, username: user.username + expect(response).to render_template("calendar") end end end From 4eafc188437e0214c09d59083586ea871b625b14 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 28 Jan 2015 23:08:28 -0500 Subject: [PATCH 25/96] Refactor Repository to use new RepositoryCache class Abstracts away the lower-level implementation details from the Repository model. --- app/models/repository.rb | 61 ++++++++++++------------------- lib/repository_cache.rb | 25 +++++++++++++ spec/lib/repository_cache_spec.rb | 34 +++++++++++++++++ 3 files changed, 83 insertions(+), 37 deletions(-) create mode 100644 lib/repository_cache.rb create mode 100644 spec/lib/repository_cache_spec.rb diff --git a/app/models/repository.rb b/app/models/repository.rb index f6400f7aff..4e45a6723b 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -30,7 +30,7 @@ class Repository commit = Gitlab::Git::Commit.find(raw_repository, id) commit = Commit.new(commit) if commit commit - rescue Rugged::OdbError => ex + rescue Rugged::OdbError nil end @@ -61,25 +61,25 @@ class Repository end def add_branch(branch_name, ref) - Rails.cache.delete(cache_key(:branch_names)) + cache.expire(:branch_names) gitlab_shell.add_branch(path_with_namespace, branch_name, ref) end def add_tag(tag_name, ref, message = nil) - Rails.cache.delete(cache_key(:tag_names)) + cache.expire(:tag_names) gitlab_shell.add_tag(path_with_namespace, tag_name, ref, message) end def rm_branch(branch_name) - Rails.cache.delete(cache_key(:branch_names)) + cache.expire(:branch_names) gitlab_shell.rm_branch(path_with_namespace, branch_name) end def rm_tag(tag_name) - Rails.cache.delete(cache_key(:tag_names)) + cache.expire(:tag_names) gitlab_shell.rm_tag(path_with_namespace, tag_name) end @@ -97,19 +97,15 @@ class Repository end def branch_names - Rails.cache.fetch(cache_key(:branch_names)) do - raw_repository.branch_names - end + cache.fetch(:branch_names) { raw_repository.branch_names } end def tag_names - Rails.cache.fetch(cache_key(:tag_names)) do - raw_repository.tag_names - end + cache.fetch(:tag_names) { raw_repository.tag_names } end def commit_count - Rails.cache.fetch(cache_key(:commit_count)) do + cache.fetch(:commit_count) do begin raw_repository.commit_count(self.root_ref) rescue @@ -121,26 +117,19 @@ class Repository # Return repo size in megabytes # Cached in redis def size - Rails.cache.fetch(cache_key(:size)) do - raw_repository.size - end + cache.fetch(:size) { raw_repository.size } end def expire_cache - Rails.cache.delete(cache_key(:size)) - Rails.cache.delete(cache_key(:branch_names)) - Rails.cache.delete(cache_key(:tag_names)) - Rails.cache.delete(cache_key(:commit_count)) - Rails.cache.delete(cache_key(:graph_log)) - Rails.cache.delete(cache_key(:readme)) - Rails.cache.delete(cache_key(:version)) - Rails.cache.delete(cache_key(:contribution_guide)) + %i(size branch_names tag_names commit_count graph_log + readme version contribution_guide).each do |key| + cache.expire(key) + end end def graph_log - Rails.cache.fetch(cache_key(:graph_log)) do - commits = raw_repository.log(limit: 6000, - skip_merges: true, + cache.fetch(:graph_log) do + commits = raw_repository.log(limit: 6000, skip_merges: true, ref: root_ref) commits.map do |rugged_commit| @@ -176,10 +165,6 @@ class Repository end end - def cache_key(type) - "#{type}:#{path_with_namespace}" - end - def method_missing(m, *args, &block) raw_repository.send(m, *args, &block) end @@ -199,13 +184,11 @@ class Repository end def readme - Rails.cache.fetch(cache_key(:readme)) do - tree(:head).readme - end + cache.fetch(:readme) { tree(:head).readme } end def version - Rails.cache.fetch(cache_key(:version)) do + cache.fetch(:version) do tree(:head).blobs.find do |file| file.name.downcase == 'version' end @@ -213,9 +196,7 @@ class Repository end def contribution_guide - Rails.cache.fetch(cache_key(:contribution_guide)) do - tree(:head).contribution_guide - end + cache.fetch(:contribution_guide) { tree(:head).contribution_guide } end def head_commit @@ -351,4 +332,10 @@ class Repository [] end end + + private + + def cache + @cache ||= RepositoryCache.new(path_with_namespace) + end end diff --git a/lib/repository_cache.rb b/lib/repository_cache.rb new file mode 100644 index 0000000000..0d52f50be9 --- /dev/null +++ b/lib/repository_cache.rb @@ -0,0 +1,25 @@ +# Interface to the Redis-backed cache store used by the Repository model +class RepositoryCache + attr_reader :namespace + + def initialize(namespace, backend = Rails.cache) + @namespace = namespace + @backend = backend + end + + def cache_key(type) + "#{type}:#{namespace}" + end + + def expire(key) + backend.delete(cache_key(key)) + end + + def fetch(key, &block) + backend.fetch(cache_key(key), &block) + end + + private + + attr_reader :backend +end diff --git a/spec/lib/repository_cache_spec.rb b/spec/lib/repository_cache_spec.rb new file mode 100644 index 0000000000..af399f3a73 --- /dev/null +++ b/spec/lib/repository_cache_spec.rb @@ -0,0 +1,34 @@ +require 'rspec' +require_relative '../../lib/repository_cache' + +describe RepositoryCache do + let(:backend) { double('backend').as_null_object } + let(:cache) { RepositoryCache.new('example', backend) } + + describe '#cache_key' do + it 'includes the namespace' do + expect(cache.cache_key(:foo)).to eq 'foo:example' + end + end + + describe '#expire' do + it 'expires the given key from the cache' do + cache.expire(:foo) + expect(backend).to have_received(:delete).with('foo:example') + end + end + + describe '#fetch' do + it 'fetches the given key from the cache' do + cache.fetch(:bar) + expect(backend).to have_received(:fetch).with('bar:example') + end + + it 'accepts a block' do + p = -> {} + + cache.fetch(:baz, &p) + expect(backend).to have_received(:fetch).with('baz:example', &p) + end + end +end From ff56b2d9edee0ed0c5bb6964446fab1d66222f38 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 29 Jan 2015 03:30:21 -0500 Subject: [PATCH 26/96] Use pry-rails gem instead of pry pry-rails has pry as a dependency and this lets us have all that pry when we run `rails console` :heart: --- Gemfile | 2 +- Gemfile.lock | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index a0f5b70de3..e9301e59ca 100644 --- a/Gemfile +++ b/Gemfile @@ -221,7 +221,7 @@ group :development, :test do gem 'spinach-rails' gem "rspec-rails" gem "capybara", '~> 2.2.1' - gem "pry" + gem "pry-rails" gem "awesome_print" gem "database_cleaner" gem "launchy" diff --git a/Gemfile.lock b/Gemfile.lock index 4b5b718c87..3a8ae194be 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -366,6 +366,8 @@ GEM coderay (~> 1.0) method_source (~> 0.8) slop (~> 3.4) + pry-rails (0.3.2) + pry (>= 0.9.10) pyu-ruby-sasl (0.0.3.3) quiet_assets (1.0.2) railties (>= 3.1, < 5.0) @@ -694,7 +696,7 @@ DEPENDENCIES org-ruby (= 0.9.12) pg poltergeist (~> 1.5.1) - pry + pry-rails quiet_assets (~> 1.0.1) rack-attack rack-cors From 9de4e696a68b7a0fb4d1e04becac24813fc4c922 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 29 Jan 2015 12:01:27 -0500 Subject: [PATCH 27/96] Remove errant print statements from votes spec This caused those random "true" outputs in the rspec output. --- spec/lib/votes_spec.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/lib/votes_spec.rb b/spec/lib/votes_spec.rb index 2c01a34756..a88a10d927 100644 --- a/spec/lib/votes_spec.rb +++ b/spec/lib/votes_spec.rb @@ -161,8 +161,8 @@ describe Issue, 'Votes' do add_note '+1 I still like this' add_note '+1 I really like this' add_note '+1 Give me this now!!!!' - p issue.downvotes.should == 0 - p issue.upvotes.should == 1 + issue.downvotes.should == 0 + issue.upvotes.should == 1 end it 'should count a users vote only once without caring about comments' do @@ -171,8 +171,8 @@ describe Issue, 'Votes' do add_note 'Another comment' add_note '+1 vote' add_note 'final comment' - p issue.downvotes.should == 0 - p issue.upvotes.should == 1 + issue.downvotes.should == 0 + issue.upvotes.should == 1 end end From ed17adfbcd7f279747ac8f23da079808299b06e6 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 29 Jan 2015 12:15:15 -0500 Subject: [PATCH 28/96] Update shoulda-matchers This outdated gem was the cause of those annoying MiniTest errors. Also updates one use of `ensure_inclusion_of` which was deprecated in favor of `validate_inclusion_of`. --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- spec/models/members_spec.rb | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile b/Gemfile index a0f5b70de3..5c18a20af1 100644 --- a/Gemfile +++ b/Gemfile @@ -254,7 +254,7 @@ end group :test do gem "simplecov", require: false - gem "shoulda-matchers", "~> 2.1.0" + gem "shoulda-matchers", "~> 2.7.0" gem 'email_spec' gem "webmock" gem 'test_after_commit' diff --git a/Gemfile.lock b/Gemfile.lock index 4b5b718c87..cd02837008 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -260,7 +260,7 @@ GEM multi_xml (>= 0.5.2) httpauth (0.2.1) httpclient (2.5.3.3) - i18n (0.6.11) + i18n (0.7.0) ice_nine (0.10.0) jasmine (2.0.2) jasmine-core (~> 2.0.0) @@ -279,7 +279,7 @@ GEM turbolinks jquery-ui-rails (4.2.1) railties (>= 3.2.16) - json (1.8.1) + json (1.8.2) jwt (0.1.13) multi_json (>= 1.5) kaminari (0.15.1) @@ -495,7 +495,7 @@ GEM sass (~> 3.2) settingslogic (2.0.9) sexp_processor (4.4.0) - shoulda-matchers (2.1.0) + shoulda-matchers (2.7.0) activesupport (>= 3.0.0) sidekiq (3.3.0) celluloid (>= 0.16.0) @@ -719,7 +719,7 @@ DEPENDENCIES select2-rails semantic-ui-sass (~> 1.8.0) settingslogic - shoulda-matchers (~> 2.1.0) + shoulda-matchers (~> 2.7.0) sidekiq (~> 3.3) simplecov sinatra diff --git a/spec/models/members_spec.rb b/spec/models/members_spec.rb index 6866c4794c..cea653ec28 100644 --- a/spec/models/members_spec.rb +++ b/spec/models/members_spec.rb @@ -10,7 +10,7 @@ describe Member do it { should validate_presence_of(:user) } it { should validate_presence_of(:source) } - it { should ensure_inclusion_of(:access_level).in_array(Gitlab::Access.values) } + it { should validate_inclusion_of(:access_level).in_array(Gitlab::Access.values) } end describe "Delegate methods" do From ca701a964971a3291270e60669757c9853e3cf66 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 13:28:41 -0800 Subject: [PATCH 29/96] Improvements to LDAP::User model * method #changed? also tracks changes of identites (fixes issue with email mapping) * find ldap identity before initialize one --- lib/gitlab/ldap/user.rb | 8 ++++++-- spec/lib/gitlab/ldap/user_spec.rb | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/ldap/user.rb b/lib/gitlab/ldap/user.rb index 3ef494ba13..cfa8692659 100644 --- a/lib/gitlab/ldap/user.rb +++ b/lib/gitlab/ldap/user.rb @@ -40,12 +40,16 @@ module Gitlab def update_user_attributes gl_user.email = auth_hash.email - gl_user.identities.build(provider: auth_hash.provider, extern_uid: auth_hash.uid) + + # 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) + gl_user end def changed? - gl_user.changed? + gl_user.changed? || gl_user.identities.any?(&:changed?) end def needs_blocking? diff --git a/spec/lib/gitlab/ldap/user_spec.rb b/spec/lib/gitlab/ldap/user_spec.rb index f73884e644..63ffc21ba3 100644 --- a/spec/lib/gitlab/ldap/user_spec.rb +++ b/spec/lib/gitlab/ldap/user_spec.rb @@ -13,6 +13,23 @@ describe Gitlab::LDAP::User do double(uid: 'my-uid', provider: 'ldapmain', info: double(info)) end + describe :changed? do + it "marks existing ldap user as changed" do + existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain') + expect(gl_user.changed?).to be_true + end + + it "marks existing non-ldap user if the email matches as changed" do + existing_user = create(:user, email: 'john@example.com') + expect(gl_user.changed?).to be_true + end + + it "dont marks existing ldap user as changed" do + existing_user = create(:omniauth_user, email: 'john@example.com', extern_uid: 'my-uid', provider: 'ldapmain') + expect(gl_user.changed?).to be_false + end + end + describe :find_or_create do it "finds the user if already existing" do existing_user = create(:omniauth_user, extern_uid: 'my-uid', provider: 'ldapmain') From 65a4e64b3ab54e53badce9bff5372188f51c3044 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 15:38:22 -0800 Subject: [PATCH 30/96] Bump gitlab-shell version --- GITLAB_SHELL_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index 005119baaa..8e8299dcc0 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -2.4.1 +2.4.2 From 5ec36902dd41d1e6383373006ab16f2d1303ee0d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 16:00:46 -0800 Subject: [PATCH 31/96] Fix calendar js --- app/assets/javascripts/calendar.js.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/assets/javascripts/calendar.js.coffee b/app/assets/javascripts/calendar.js.coffee index 6a0d5e4356..70940e1385 100644 --- a/app/assets/javascripts/calendar.js.coffee +++ b/app/assets/javascripts/calendar.js.coffee @@ -9,8 +9,6 @@ class @calendar cal.init itemName: ["commit"] data: timestamps - domain: "year" - subDomain: "month" start: new Date(starting_year, starting_month) domainLabelFormat: "%b" id: "cal-heatmap" From f1cf49218fb40b61f82ff74dbb7eaba32b439a5a Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 17:07:44 -0800 Subject: [PATCH 32/96] Improve contribution calendar on user page * cache user contributions for day * ignore forks in calendar contribtuions --- app/controllers/users_controller.rb | 9 +++------ app/models/project_contributions.rb | 23 +++++++++++++++++++++++ lib/gitlab/commits_calendar.rb | 16 ++++++++++++---- 3 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 app/models/project_contributions.rb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ff5e31067f..57d8ef09fa 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -28,13 +28,10 @@ class UsersController < ApplicationController def calendar visible_projects = ProjectsFinder.new.execute(current_user) - - # Get user repositories and collect timestamps for commits - user_repositories = visible_projects.map(&:repository) - calendar = Gitlab::CommitsCalendar.new(user_repositories, @user) + calendar = Gitlab::CommitsCalendar.new(visible_projects, @user) @timestamps = calendar.timestamps - @starting_year = (Time.now - 1.year).strftime("%Y") - @starting_month = Date.today.strftime("%m").to_i + @starting_year = calendar.starting_year + @starting_month = calendar.starting_month render 'calendar', layout: false end diff --git a/app/models/project_contributions.rb b/app/models/project_contributions.rb new file mode 100644 index 0000000000..8ab2d814a9 --- /dev/null +++ b/app/models/project_contributions.rb @@ -0,0 +1,23 @@ +class ProjectContributions + attr_reader :project, :user + + def initialize(project, user) + @project, @user = project, user + end + + def commits_log + repository = project.repository + + if !repository.exists? || repository.empty? + return {} + end + + Rails.cache.fetch(cache_key) do + repository.commits_per_day_for_user(user) + end + end + + def cache_key + "#{Date.today.to_s}-commits-log-#{project.id}-#{user.email}" + end +end diff --git a/lib/gitlab/commits_calendar.rb b/lib/gitlab/commits_calendar.rb index ccc80d080a..2f30d238e6 100644 --- a/lib/gitlab/commits_calendar.rb +++ b/lib/gitlab/commits_calendar.rb @@ -2,15 +2,15 @@ module Gitlab class CommitsCalendar attr_reader :timestamps - def initialize(repositories, user) + def initialize(projects, user) @timestamps = {} date_timestamps = [] - repositories.select(&:exists?).reject(&:empty?).each do |raw_repository| - commits_log = raw_repository.commits_per_day_for_user(user) - date_timestamps << commits_log + projects.reject(&:forked?).each do |project| + date_timestamps << ProjectContributions.new(project, user).commits_log end + # Sumarrize commits from all projects per days date_timestamps = date_timestamps.inject do |collection, date| collection.merge(date) { |k, old_v, new_v| old_v + new_v } end @@ -21,5 +21,13 @@ module Gitlab @timestamps[timestamp] = commits if timestamp end end + + def starting_year + (Time.now - 1.year).strftime("%Y") + end + + def starting_month + Date.today.strftime("%m").to_i + end end end From 31245a40c10a556998a9923be21b9ac947232824 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 17:13:28 -0800 Subject: [PATCH 33/96] Remove : from headers --- app/views/users/calendar.html.haml | 2 +- app/views/users/show.html.haml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml index 727faf2367..13bdc5ed1e 100644 --- a/app/views/users/calendar.html.haml +++ b/app/views/users/calendar.html.haml @@ -1,4 +1,4 @@ -%h4 Calendar: +%h4 Calendar #cal-heatmap.calendar :javascript new calendar( diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 445f43cd50..e47fed5513 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -15,7 +15,7 @@ .clearfix - if @groups.any? - %h4 Groups: + %h4 Groups = render 'groups', groups: @groups %hr @@ -24,7 +24,7 @@ %i.fa.fa-spinner.fa-spin %hr %h4 - User Activity: + User Activity - if current_user %span.rss-icon.pull-right From 78d7c5087bafc316d298ac01745579990e3dd93c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 17:30:51 -0800 Subject: [PATCH 34/96] Use tile avatars for user/group show pages --- app/assets/stylesheets/generic/avatar.scss | 4 ++++ app/views/groups/show.html.haml | 2 +- app/views/users/show.html.haml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/generic/avatar.scss b/app/assets/stylesheets/generic/avatar.scss index b688620673..b88cdd8393 100644 --- a/app/assets/stylesheets/generic/avatar.scss +++ b/app/assets/stylesheets/generic/avatar.scss @@ -15,6 +15,10 @@ &.s24 { margin-right: 4px; } } + &.avatar-tile { + @include border-radius(0px); + } + &.s16 { width: 16px; height: 16px; margin-right: 6px; } &.s24 { width: 24px; height: 24px; margin-right: 8px; } &.s26 { width: 26px; height: 26px; margin-right: 8px; } diff --git a/app/views/groups/show.html.haml b/app/views/groups/show.html.haml index 81f0e1dd2d..484bebca2d 100644 --- a/app/views/groups/show.html.haml +++ b/app/views/groups/show.html.haml @@ -1,6 +1,6 @@ .dashboard %div - = image_tag group_icon(@group.path), class: "avatar s90" + = image_tag group_icon(@group.path), class: "avatar avatar-tile s90" .clearfix %h2 = @group.name diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index e47fed5513..b05918b019 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -1,7 +1,7 @@ .row .col-md-8 %h3.page-title - = image_tag avatar_icon(@user.email, 90), class: "avatar s90", alt: '' + = image_tag avatar_icon(@user.email, 90), class: "avatar avatar-tile s90", alt: '' = @user.name - if @user == current_user .pull-right From 7a5784ec41c6d51df75dc7cf284045edfc644c7c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 22:03:34 -0800 Subject: [PATCH 35/96] Update changelog with version 7.7.2 --- CHANGELOG | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index 4dc66e8e32..2db5beb002 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -63,6 +63,10 @@ v 7.8.0 - - Added support for firing system hooks on group create/destroy and adding/removing users to group (Boyan Tabakov) +v 7.7.2 + - Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch + - Fix issue when LDAP user can't login with existing GitLab account + v 7.7.1 - Improve mention autocomplete performance - Show setup instructions for GitHub import if disabled From 23c31a0b12eaae7f7f25f30eca1066968bcb6059 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 23:06:43 -0800 Subject: [PATCH 36/96] Skip tricky test for semaphore --- features/project/source/browse_files.feature | 2 +- lib/tasks/spinach.rake | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature index ccb29293a8..ec2aff4377 100644 --- a/features/project/source/browse_files.feature +++ b/features/project/source/browse_files.feature @@ -24,7 +24,7 @@ Feature: Project Source Browse Files Given I click on "new file" link in repo Then I can see new file page - @javascript + @javascript @tricky Scenario: I can create and commit file Given I click on "new file" link in repo And I edit code diff --git a/lib/tasks/spinach.rake b/lib/tasks/spinach.rake index 507b315759..ac885f315b 100644 --- a/lib/tasks/spinach.rake +++ b/lib/tasks/spinach.rake @@ -2,9 +2,15 @@ Rake::Task["spinach"].clear if Rake::Task.task_defined?('spinach') desc "GITLAB | Run spinach" task :spinach do + tags = if ENV['SEMAPHORE'] + '~@tricky,~@wip' + else + '~@wip' + end + cmds = [ %W(rake gitlab:setup), - %W(spinach), + %W(spinach --tags #{tags}), ] run_commands(cmds) end From b21565f18d297c167f05f4c7861e01c916c15682 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 23:28:38 -0800 Subject: [PATCH 37/96] Fix semaphore spinach tags --- lib/tasks/spinach.rake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/tasks/spinach.rake b/lib/tasks/spinach.rake index ac885f315b..4aefc18ce1 100644 --- a/lib/tasks/spinach.rake +++ b/lib/tasks/spinach.rake @@ -3,9 +3,9 @@ Rake::Task["spinach"].clear if Rake::Task.task_defined?('spinach') desc "GITLAB | Run spinach" task :spinach do tags = if ENV['SEMAPHORE'] - '~@tricky,~@wip' + '~@tricky' else - '~@wip' + '~@semaphore' end cmds = [ From d5d1802096ab8751dfa1e4cf535e9bee79457328 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 29 Jan 2015 23:48:00 -0800 Subject: [PATCH 38/96] Set right test as tricky --- features/project/source/browse_files.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/project/source/browse_files.feature b/features/project/source/browse_files.feature index ec2aff4377..ee8d0bffa9 100644 --- a/features/project/source/browse_files.feature +++ b/features/project/source/browse_files.feature @@ -24,7 +24,7 @@ Feature: Project Source Browse Files Given I click on "new file" link in repo Then I can see new file page - @javascript @tricky + @javascript Scenario: I can create and commit file Given I click on "new file" link in repo And I edit code @@ -34,7 +34,7 @@ Feature: Project Source Browse Files Then I am redirected to the new file And I should see its new content - @javascript + @javascript @tricky Scenario: I can create file in empty repo Given I own an empty project And I visit my empty project page From c47328948b5fff218c68279260a57ab6b03e7423 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Fri, 30 Jan 2015 00:22:51 -0800 Subject: [PATCH 39/96] Fix specs for icons --- spec/helpers/notifications_helper_spec.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/spec/helpers/notifications_helper_spec.rb b/spec/helpers/notifications_helper_spec.rb index 31ecdacf28..dcc3318e4f 100644 --- a/spec/helpers/notifications_helper_spec.rb +++ b/spec/helpers/notifications_helper_spec.rb @@ -1,6 +1,9 @@ require 'spec_helper' describe NotificationsHelper do + include FontAwesome::Rails::IconHelper + include IconsHelper + describe 'notification_icon' do let(:notification) { double(disabled?: false, participating?: false, watch?: false) } From 1a1d7085fa02e1ef681b10e15c2f144cc5224a9d Mon Sep 17 00:00:00 2001 From: Jacob Vosmaer Date: Fri, 30 Jan 2015 16:03:27 +0100 Subject: [PATCH 40/96] Mention libkrb5-dev dependency --- doc/update/6.x-or-7.x-to-7.7.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/update/6.x-or-7.x-to-7.7.md b/doc/update/6.x-or-7.x-to-7.7.md index 6501a8d214..0cbea5d599 100644 --- a/doc/update/6.x-or-7.x-to-7.7.md +++ b/doc/update/6.x-or-7.x-to-7.7.md @@ -89,6 +89,9 @@ sudo apt-get install logrotate # Install pkg-config and cmake, which is needed for the latest versions of rugged sudo apt-get install pkg-config cmake + +# Install Kerberos header files, which are needed for GitLab EE Kerberos support +sudo apt-get install libkrb5-dev ``` ## 5. Configure Redis to use sockets From 8ac227bab2334c41784c567faf7aafb1ebd75890 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 30 Jan 2015 10:17:55 -0500 Subject: [PATCH 41/96] Fix RepositoryCache backend attr_reader --- lib/repository_cache.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/repository_cache.rb b/lib/repository_cache.rb index 0d52f50be9..fa016a170c 100644 --- a/lib/repository_cache.rb +++ b/lib/repository_cache.rb @@ -1,6 +1,6 @@ # Interface to the Redis-backed cache store used by the Repository model class RepositoryCache - attr_reader :namespace + attr_reader :namespace, :backend def initialize(namespace, backend = Rails.cache) @namespace = namespace @@ -18,8 +18,4 @@ class RepositoryCache def fetch(key, &block) backend.fetch(cache_key(key), &block) end - - private - - attr_reader :backend end From e6e337088bbb4736983119928b6b6b451bd3ef20 Mon Sep 17 00:00:00 2001 From: Ewan Edwards Date: Fri, 30 Jan 2015 10:24:45 -0800 Subject: [PATCH 42/96] Make all non-config/non-operational mentions of URL consistently capitalized. Make the plural version consistently "URLs". Fix an instance where the article "the" before URL was missing. --- doc/api/README.md | 4 ++-- doc/api/services.md | 2 +- doc/customization/libravatar.md | 12 ++++++------ doc/integration/shibboleth.md | 4 ++-- doc/integration/slack.md | 2 +- doc/markdown/markdown.md | 10 +++++----- doc/raketasks/features.md | 2 +- doc/update/4.2-to-5.0.md | 4 ++-- doc/update/5.4-to-6.0.md | 2 +- doc/update/7.6-to-7.7.md | 4 ++-- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/doc/api/README.md b/doc/api/README.md index 8f919f5257..8cbba8598d 100644 --- a/doc/api/README.md +++ b/doc/api/README.md @@ -97,7 +97,7 @@ Return values: ## Sudo -All API requests support performing an api call as if you were another user, if your private token is for an administration account. You need to pass `sudo` parameter by url or header with an id or username of the user you want to perform the operation as. If passed as header, the header name must be "SUDO" (capitals). +All API requests support performing an api call as if you were another user, if your private token is for an administration account. You need to pass `sudo` parameter by URL or header with an id or username of the user you want to perform the operation as. If passed as header, the header name must be "SUDO" (capitals). If a non administrative `private_token` is provided then an error message will be returned with status code 403: @@ -142,7 +142,7 @@ When listing resources you can pass the following parameters: - `page` (default: `1`) - page number - `per_page` (default: `20`, max: `100`) - number of items to list per page -[Link headers](http://www.w3.org/wiki/LinkHeader) are send back with each response. These have `rel` prev/next/first/last and contain the relevant URL. Please use these instead of generating your own urls. +[Link headers](http://www.w3.org/wiki/LinkHeader) are send back with each response. These have `rel` prev/next/first/last and contain the relevant URL. Please use these instead of generating your own URLs. ## id vs iid diff --git a/doc/api/services.md b/doc/api/services.md index ab9f9c00c6..93534d5502 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -13,7 +13,7 @@ PUT /projects/:id/services/gitlab-ci Parameters: - `token` (required) - CI project token -- `project_url` (required) - CI project url +- `project_url` (required) - CI project URL ### Delete GitLab CI service diff --git a/doc/customization/libravatar.md b/doc/customization/libravatar.md index 4dffd3027a..ee57fdc659 100644 --- a/doc/customization/libravatar.md +++ b/doc/customization/libravatar.md @@ -16,7 +16,7 @@ the configuration options as follows: ```yml gravatar: enabled: true - # gravatar urls: possible placeholders: %{hash} %{size} %{email} + # gravatar URLs: possible placeholders: %{hash} %{size} %{email} plain_url: "http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon" ``` @@ -25,14 +25,14 @@ the configuration options as follows: ```yml gravatar: enabled: true - # gravatar urls: possible placeholders: %{hash} %{size} %{email} + # gravatar URLs: possible placeholders: %{hash} %{size} %{email} ssl_url: "https://seccdn.libravatar.org/avatar/%{hash}?s=%{size}&d=identicon" ``` ## Self-hosted -If you are [running your own libravatar service](http://wiki.libravatar.org/running_your_own/) the url will be different in the configuration -but the important part is to provide the same placeholders so GitLab can parse the url correctly. +If you are [running your own libravatar service](http://wiki.libravatar.org/running_your_own/) the URL will be different in the configuration +but the important part is to provide the same placeholders so GitLab can parse the URL correctly. For example, you host a service on `http://libravatar.example.com` the `plain_url` you need to supply in `gitlab.yml` is @@ -65,5 +65,5 @@ Run `sudo gitlab-ctl reconfigure` for changes to take effect. [Libravatar supports different sets](http://wiki.libravatar.org/api/) of `missing images` for emails not found on the Libravatar service. -In order to use a different set other than `identicon`, replace `&d=identicon` portion of the url with another supported set. -For example, you can use `retro` set in which case url would look like: `plain_url: "http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=retro"` +In order to use a different set other than `identicon`, replace `&d=identicon` portion of the URL with another supported set. +For example, you can use `retro` set in which case the URL would look like: `plain_url: "http://cdn.libravatar.org/avatar/%{hash}?s=%{size}&d=retro"` diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md index 78317a5c0f..1b03197b6c 100644 --- a/doc/integration/shibboleth.md +++ b/doc/integration/shibboleth.md @@ -14,7 +14,7 @@ Check https://wiki.shibboleth.net/ for more info. Following changes are needed to enable shibboleth: -protect omniauth-shibboleth callback url: +protect omniauth-shibboleth callback URL: ``` AuthType shibboleth @@ -32,7 +32,7 @@ protect omniauth-shibboleth callback url: SetHandler shib ``` -exclude shibboleth urls from rewriting, add "RewriteCond %{REQUEST_URI} !/Shibboleth.sso" and "RewriteCond %{REQUEST_URI} !/shibboleth-sp", config should look like this: +exclude shibboleth URLs from rewriting, add "RewriteCond %{REQUEST_URI} !/Shibboleth.sso" and "RewriteCond %{REQUEST_URI} !/shibboleth-sp", config should look like this: ``` #apache equivalent of nginx try files RewriteEngine on diff --git a/doc/integration/slack.md b/doc/integration/slack.md index f2e73f272e..2fd22c513a 100644 --- a/doc/integration/slack.md +++ b/doc/integration/slack.md @@ -35,7 +35,7 @@ After Slack is ready we need to setup GitLab. Here are the steps to achieve this 1. Fill in your Slack details - Mark it as active - - Paste in the webhook url you got from Slack + - Paste in the webhook URL you got from Slack Have fun :) diff --git a/doc/markdown/markdown.md b/doc/markdown/markdown.md index edb7a97550..7b79cd5d98 100644 --- a/doc/markdown/markdown.md +++ b/doc/markdown/markdown.md @@ -250,17 +250,17 @@ The IDs are generated from the content of the header according to the following For example: ``` -###### ..Ab_c-d. e [anchor](url) ![alt text](url).. +###### ..Ab_c-d. e [anchor](URL) ![alt text](URL).. ``` which renders as: -###### ..Ab_c-d. e [anchor](url) ![alt text](url).. +###### ..Ab_c-d. e [anchor](URL) ![alt text](URL).. will first be converted by step 1) into a string like: ``` -..Ab_c-d. e <a href="url">anchor</a> <img src="url" alt="alt text"/>.. +..Ab_c-d. e <a href="URL">anchor</a> <img src="URL" alt="alt text"/>.. ``` After removing the tags in step 2) we get: @@ -277,8 +277,8 @@ ab_c-d-e-anchor Note in particular how: -- for markdown anchors `[text](url)`, only the `text` is used -- markdown images `![alt](url)` are completely ignored +- for markdown anchors `[text](URL)`, only the `text` is used +- markdown images `![alt](URL)` are completely ignored ## Emphasis diff --git a/doc/raketasks/features.md b/doc/raketasks/features.md index 99b3d5525b..f9a4619354 100644 --- a/doc/raketasks/features.md +++ b/doc/raketasks/features.md @@ -6,7 +6,7 @@ This command will enable the namespaces feature introduced in v4.0. It will move Note: -- Because the **repository location will change**, you will need to **update all your git url's** to point to the new location. +- Because the **repository location will change**, you will need to **update all your git URLs** to point to the new location. - Username can be changed at [Profile / Account](/profile/account) **Example:** diff --git a/doc/update/4.2-to-5.0.md b/doc/update/4.2-to-5.0.md index cde679598f..7974ae47ff 100644 --- a/doc/update/4.2-to-5.0.md +++ b/doc/update/4.2-to-5.0.md @@ -41,8 +41,8 @@ git checkout v1.1.0 # copy config cp config.yml.example config.yml -# change url to GitLab instance -# ! make sure url end with '/' like 'https://gitlab.example/' +# change URL to GitLab instance +# ! make sure the URL ends with '/' like 'https://gitlab.example/' vim config.yml # rewrite hooks diff --git a/doc/update/5.4-to-6.0.md b/doc/update/5.4-to-6.0.md index 7bf7bce6aa..ba8f8e3958 100644 --- a/doc/update/5.4-to-6.0.md +++ b/doc/update/5.4-to-6.0.md @@ -10,7 +10,7 @@ GitLab 6.0 is affected by critical security vulnerabilities CVE-2013-4490 and CV The root (global) namespace for projects is deprecated. -So you need to move all your global projects under groups or users manually before update or they will be automatically moved to the project owner namespace during the update. When a project is moved all its members will receive an email with instructions how to update their git remote url. Please make sure you disable sending email when you do a test of the upgrade. +So you need to move all your global projects under groups or users manually before update or they will be automatically moved to the project owner namespace during the update. When a project is moved all its members will receive an email with instructions how to update their git remote URL. Please make sure you disable sending email when you do a test of the upgrade. ### Teams diff --git a/doc/update/7.6-to-7.7.md b/doc/update/7.6-to-7.7.md index 51084576f3..8f4fd197b7 100644 --- a/doc/update/7.6-to-7.7.md +++ b/doc/update/7.6-to-7.7.md @@ -101,8 +101,8 @@ If all items are green, then congratulations upgrade is complete! ### 8. GitHub settings (if applicable) -If you are using GitHub as an OAuth provider for authentication, you should change the callback url so that it -only contains a root url (ex. `https://gitlab.example.com/`) +If you are using GitHub as an OAuth provider for authentication, you should change the callback URL so that it +only contains a root URL (ex. `https://gitlab.example.com/`) ## Things went south? Revert to previous version (7.6) From ab6f7164e03139889c09a6a207e9df3481e57b3b Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 30 Jan 2015 15:40:04 -0500 Subject: [PATCH 43/96] Make the structure of spec/models match app/models --- spec/models/{ => hooks}/project_hook_spec.rb | 0 spec/models/{ => hooks}/service_hook_spec.rb | 0 spec/models/{ => hooks}/system_hook_spec.rb | 0 spec/models/{ => hooks}/web_hook_spec.rb | 0 spec/models/{ => members}/group_member_spec.rb | 0 spec/models/{ => members}/project_member_spec.rb | 0 spec/models/{ => project_services}/assembla_service_spec.rb | 0 spec/models/{ => project_services}/buildbox_service_spec.rb | 0 spec/models/{ => project_services}/flowdock_service_spec.rb | 0 spec/models/{ => project_services}/gemnasium_service_spec.rb | 0 spec/models/{ => project_services}/gitlab_ci_service_spec.rb | 0 spec/models/{ => project_services}/jira_service_spec.rb | 0 spec/models/{ => project_services}/pushover_service_spec.rb | 0 spec/models/{ => project_services}/slack_message_spec.rb | 0 spec/models/{ => project_services}/slack_service_spec.rb | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename spec/models/{ => hooks}/project_hook_spec.rb (100%) rename spec/models/{ => hooks}/service_hook_spec.rb (100%) rename spec/models/{ => hooks}/system_hook_spec.rb (100%) rename spec/models/{ => hooks}/web_hook_spec.rb (100%) rename spec/models/{ => members}/group_member_spec.rb (100%) rename spec/models/{ => members}/project_member_spec.rb (100%) rename spec/models/{ => project_services}/assembla_service_spec.rb (100%) rename spec/models/{ => project_services}/buildbox_service_spec.rb (100%) rename spec/models/{ => project_services}/flowdock_service_spec.rb (100%) rename spec/models/{ => project_services}/gemnasium_service_spec.rb (100%) rename spec/models/{ => project_services}/gitlab_ci_service_spec.rb (100%) rename spec/models/{ => project_services}/jira_service_spec.rb (100%) rename spec/models/{ => project_services}/pushover_service_spec.rb (100%) rename spec/models/{ => project_services}/slack_message_spec.rb (100%) rename spec/models/{ => project_services}/slack_service_spec.rb (100%) diff --git a/spec/models/project_hook_spec.rb b/spec/models/hooks/project_hook_spec.rb similarity index 100% rename from spec/models/project_hook_spec.rb rename to spec/models/hooks/project_hook_spec.rb diff --git a/spec/models/service_hook_spec.rb b/spec/models/hooks/service_hook_spec.rb similarity index 100% rename from spec/models/service_hook_spec.rb rename to spec/models/hooks/service_hook_spec.rb diff --git a/spec/models/system_hook_spec.rb b/spec/models/hooks/system_hook_spec.rb similarity index 100% rename from spec/models/system_hook_spec.rb rename to spec/models/hooks/system_hook_spec.rb diff --git a/spec/models/web_hook_spec.rb b/spec/models/hooks/web_hook_spec.rb similarity index 100% rename from spec/models/web_hook_spec.rb rename to spec/models/hooks/web_hook_spec.rb diff --git a/spec/models/group_member_spec.rb b/spec/models/members/group_member_spec.rb similarity index 100% rename from spec/models/group_member_spec.rb rename to spec/models/members/group_member_spec.rb diff --git a/spec/models/project_member_spec.rb b/spec/models/members/project_member_spec.rb similarity index 100% rename from spec/models/project_member_spec.rb rename to spec/models/members/project_member_spec.rb diff --git a/spec/models/assembla_service_spec.rb b/spec/models/project_services/assembla_service_spec.rb similarity index 100% rename from spec/models/assembla_service_spec.rb rename to spec/models/project_services/assembla_service_spec.rb diff --git a/spec/models/buildbox_service_spec.rb b/spec/models/project_services/buildbox_service_spec.rb similarity index 100% rename from spec/models/buildbox_service_spec.rb rename to spec/models/project_services/buildbox_service_spec.rb diff --git a/spec/models/flowdock_service_spec.rb b/spec/models/project_services/flowdock_service_spec.rb similarity index 100% rename from spec/models/flowdock_service_spec.rb rename to spec/models/project_services/flowdock_service_spec.rb diff --git a/spec/models/gemnasium_service_spec.rb b/spec/models/project_services/gemnasium_service_spec.rb similarity index 100% rename from spec/models/gemnasium_service_spec.rb rename to spec/models/project_services/gemnasium_service_spec.rb diff --git a/spec/models/gitlab_ci_service_spec.rb b/spec/models/project_services/gitlab_ci_service_spec.rb similarity index 100% rename from spec/models/gitlab_ci_service_spec.rb rename to spec/models/project_services/gitlab_ci_service_spec.rb diff --git a/spec/models/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb similarity index 100% rename from spec/models/jira_service_spec.rb rename to spec/models/project_services/jira_service_spec.rb diff --git a/spec/models/pushover_service_spec.rb b/spec/models/project_services/pushover_service_spec.rb similarity index 100% rename from spec/models/pushover_service_spec.rb rename to spec/models/project_services/pushover_service_spec.rb diff --git a/spec/models/slack_message_spec.rb b/spec/models/project_services/slack_message_spec.rb similarity index 100% rename from spec/models/slack_message_spec.rb rename to spec/models/project_services/slack_message_spec.rb diff --git a/spec/models/slack_service_spec.rb b/spec/models/project_services/slack_service_spec.rb similarity index 100% rename from spec/models/slack_service_spec.rb rename to spec/models/project_services/slack_service_spec.rb From a7a45dc949b9475dff674be57e8d3a7aa8811857 Mon Sep 17 00:00:00 2001 From: Vincent Robert Date: Fri, 30 Jan 2015 22:29:41 +0100 Subject: [PATCH 44/96] Bump GitLab for Docker to version 7.7.2 --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 70d6c721f1..ec0923bd4c 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,7 +11,7 @@ RUN apt-get update -q \ # If the Omnibus package version below is outdated please contribute a merge request to update it. # If you run GitLab Enterprise Edition point it to a location where you have downloaded it. RUN TMP_FILE=$(mktemp); \ - wget -q -O $TMP_FILE https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.7.1-omnibus.5.4.1.ci-1_amd64.deb \ + wget -q -O $TMP_FILE https://downloads-packages.s3.amazonaws.com/ubuntu-14.04/gitlab_7.7.2-omnibus.5.4.2.ci-1_amd64.deb \ && dpkg -i $TMP_FILE \ && rm -f $TMP_FILE From 0fe1c9b64869703b8d803d56955422dceabf6e37 Mon Sep 17 00:00:00 2001 From: Tim Bishop Date: Fri, 30 Jan 2015 23:49:01 +0000 Subject: [PATCH 45/96] Fix group search to check path as well as name. The API documentation says: "You can search for groups by name or path with: /groups?search=Rails" But you can't because the search query only checks the name, not the path. This fixes that. --- app/models/group.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/group.rb b/app/models/group.rb index e098dfb3cd..042b79a785 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -91,7 +91,7 @@ class Group < Namespace class << self def search(query) - where("LOWER(namespaces.name) LIKE :query", query: "%#{query.downcase}%") + where("LOWER(namespaces.name) LIKE :query or LOWER(namespaces.path) LIKE :query", query: "%#{query.downcase}%") end def sort(method) From ac7af45d8987422c2a529d3d87eae6d9bd608e12 Mon Sep 17 00:00:00 2001 From: Marco Wessel Date: Sat, 31 Jan 2015 09:10:17 +0100 Subject: [PATCH 46/96] Add test for default branch protection configuration --- spec/services/git_push_service_spec.rb | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index 02c8133d2c..3a75d65b5b 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -110,6 +110,24 @@ describe GitPushService do service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') end + it "when pushing a branch for the first time with default branch protection disabled" do + ApplicationSetting.any_instance.stub(default_branch_protection: 0) + + project.should_receive(:execute_hooks) + project.default_branch.should == "master" + project.protected_branches.should_not_receive(:create) + service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') + end + + it "when pushing a branch for the first time with default branch protection set to 'developers can push'" do + ApplicationSetting.any_instance.stub(default_branch_protection: 1) + + project.should_receive(:execute_hooks) + project.default_branch.should == "master" + project.protected_branches.should_receive(:create).with({ name: "master", developers_can_push: true }) + service.execute(project, user, @blankrev, 'newrev', 'refs/heads/master') + end + it "when pushing new commits to existing branch" do project.should_receive(:execute_hooks) service.execute(project, user, 'oldrev', 'newrev', 'refs/heads/master') From a54e9e5459cd45173b5db76a8bcce76b2e050433 Mon Sep 17 00:00:00 2001 From: Marco Cyriacks Date: Fri, 30 Jan 2015 21:50:00 +0100 Subject: [PATCH 47/96] Fix raw image paste from clipboard This patch binds the textarea (markdown area) paste event to the handlePaste() function (that was already present). Furthermore the event processing is improved in the following way: - The default paste event handler of the browser is only disabled if the browser fully supports clipboardData AND there realy is image data in the event object. In all other cases (no support or no image) the default handler processes the text paste. - Some obsolete code was removed. - The pasteText() function (which is somehow buggy because it places the cursor at the end of the text independantly from its position before the paste) is only used to place the image link after image data was pasted. --- .../javascripts/dropzone_input.js.coffee | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/dropzone_input.js.coffee b/app/assets/javascripts/dropzone_input.js.coffee index a0f0d98a8d..abb5bf519e 100644 --- a/app/assets/javascripts/dropzone_input.js.coffee +++ b/app/assets/javascripts/dropzone_input.js.coffee @@ -13,6 +13,8 @@ class @DropzoneInput form_textarea = $(form).find("textarea.markdown-area") form_textarea.wrap "
" + form_textarea.bind 'paste', (event) => + handlePaste(event) form_dropzone = $(form).find('.div-dropzone') form_dropzone.parent().addClass "div-dropzone-wrapper" @@ -133,24 +135,17 @@ class @DropzoneInput formatLink = (str) -> "![" + str.alt + "](" + str.url + ")" - handlePaste = (e) -> - e.preventDefault() - my_event = e.originalEvent + handlePaste = (event) -> + pasteEvent = event.originalEvent + if pasteEvent.clipboardData and pasteEvent.clipboardData.items + image = isImage(pasteEvent) + if image + event.preventDefault() - if my_event.clipboardData and my_event.clipboardData.items - processItem(my_event) - - processItem = (e) -> - image = isImage(e) - if image - filename = getFilename(e) or "image.png" - text = "{{" + filename + "}}" - pasteText(text) - uploadFile image.getAsFile(), filename - - else - text = e.clipboardData.getData("text/plain") - pasteText(text) + filename = getFilename(pasteEvent) or "image.png" + text = "{{" + filename + "}}" + pasteText(text) + uploadFile image.getAsFile(), filename isImage = (data) -> i = 0 From 7b3fd03155eb757b07f53fdee37ce355d2234d89 Mon Sep 17 00:00:00 2001 From: Marco Cyriacks Date: Mon, 2 Feb 2015 09:32:10 +0100 Subject: [PATCH 48/96] Add raw image paste fix changelog entry --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 2db5beb002..d57f0d6563 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -42,7 +42,7 @@ v 7.8.0 - Password reset token validity increased from 2 hours to 2 days since it is also send on account creation. - - - - + - Enable raw image paste from clipboard, currently Chrome only (Marco Cyriacks) - - - Add action property to merge request hook (Julien Bianchi) From 561a7153082ef6cad7ec244d7881b8ddd35b9f8c Mon Sep 17 00:00:00 2001 From: Job van der Voort Date: Mon, 2 Feb 2015 10:00:05 -0800 Subject: [PATCH 49/96] add clear documentation on searching between groups --- doc/api/groups.md | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/doc/api/groups.md b/doc/api/groups.md index e6893d7177..9217c7a7f2 100644 --- a/doc/api/groups.md +++ b/doc/api/groups.md @@ -20,7 +20,7 @@ GET /groups ] ``` -You can search for groups by name or path with: `/groups?search=Rails` +You can search for groups by name or path, see below. ## Details of a group @@ -73,6 +73,26 @@ Parameters: - `id` (required) - The ID of a user group +## Search for group + +Get all groups that match your string in their name or path. + +``` +GET /groups?search=foobar +``` + +```json +[ + { + "id": 1, + "name": "Foobar Group", + "path": "foo-bar", + "owner_id": 18, + "description": "An interesting group" + } +] +``` + ## Group members **Group access levels** From c0acb28c4ec710c90eb55dc996251a30001c8e79 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 10:24:40 -0800 Subject: [PATCH 50/96] Annotate models --- app/models/project.rb | 2 +- .../custom_issue_tracker_service.rb | 14 ++++++++++++++ .../gitlab_issue_tracker_service.rb | 14 ++++++++++++++ .../project_services/issue_tracker_service.rb | 14 ++++++++++++++ app/models/project_services/jira_service.rb | 14 ++++++++++++++ app/models/project_services/redmine_service.rb | 14 ++++++++++++++ spec/factories/projects.rb | 1 + spec/models/project_services/jira_service_spec.rb | 14 ++++++++++++++ spec/models/project_spec.rb | 2 +- 9 files changed, 87 insertions(+), 2 deletions(-) diff --git a/app/models/project.rb b/app/models/project.rb index b26c697a7b..f3dddc28ad 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -14,7 +14,7 @@ # merge_requests_enabled :boolean default(TRUE), not null # wiki_enabled :boolean default(TRUE), not null # namespace_id :integer -# issues_tracker :string(255) default('gitlab'), not null +# issues_tracker :string(255) default("gitlab"), not null # issues_tracker_id :string(255) # snippets_enabled :boolean default(TRUE), not null # last_activity_at :datetime diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index 2476b62da8..b6b79589f1 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class CustomIssueTrackerService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/gitlab_issue_tracker_service.rb b/app/models/project_services/gitlab_issue_tracker_service.rb index 25f5f23bdf..25e399883b 100644 --- a/app/models/project_services/gitlab_issue_tracker_service.rb +++ b/app/models/project_services/gitlab_issue_tracker_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class GitlabIssueTrackerService < IssueTrackerService include Rails.application.routes.url_helpers prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index 632f053d17..acc8b33178 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class IssueTrackerService < Service validates :project_url, :issues_url, :new_issue_url, presence: true, if: :activated? diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index b0d668948d..7a32b0e8c2 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class JiraService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb index 11cce3e056..547b240183 100644 --- a/app/models/project_services/redmine_service.rb +++ b/app/models/project_services/redmine_service.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + class RedmineService < IssueTrackerService prop_accessor :title, :description, :project_url, :issues_url, :new_issue_url diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 5ae57718c1..0899a7603f 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -26,6 +26,7 @@ # star_count :integer default(0), not null # import_type :string(255) # import_source :string(255) +# avatar :string(255) # FactoryGirl.define do diff --git a/spec/models/project_services/jira_service_spec.rb b/spec/models/project_services/jira_service_spec.rb index 0c73a68c92..99ca04eff6 100644 --- a/spec/models/project_services/jira_service_spec.rb +++ b/spec/models/project_services/jira_service_spec.rb @@ -1,3 +1,17 @@ +# == Schema Information +# +# Table name: services +# +# id :integer not null, primary key +# type :string(255) +# title :string(255) +# project_id :integer not null +# created_at :datetime +# updated_at :datetime +# active :boolean default(FALSE), not null +# properties :text +# + require 'spec_helper' describe JiraService do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 092c02d552..4669a9fd87 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -14,7 +14,7 @@ # merge_requests_enabled :boolean default(TRUE), not null # wiki_enabled :boolean default(TRUE), not null # namespace_id :integer -# issues_tracker :string(255) default('gitlab'), not null +# issues_tracker :string(255) default("gitlab"), not null # issues_tracker_id :string(255) # snippets_enabled :boolean default(TRUE), not null # last_activity_at :datetime From 2bd70b6a01b6b5b3406718d1f539f9f480cf3bec Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 15:47:51 -0800 Subject: [PATCH 51/96] Improve project icons for dashboard --- app/assets/stylesheets/sections/dashboard.scss | 10 ++++++++++ app/views/dashboard/_groups.html.haml | 3 ++- app/views/dashboard/_project.html.haml | 4 ++-- app/views/groups/_projects.html.haml | 4 ++-- app/views/users/_groups.html.haml | 4 ++-- 5 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/assets/stylesheets/sections/dashboard.scss b/app/assets/stylesheets/sections/dashboard.scss index 90010781af..17c0cd81b9 100644 --- a/app/assets/stylesheets/sections/dashboard.scss +++ b/app/assets/stylesheets/sections/dashboard.scss @@ -97,7 +97,17 @@ .dash-project-avatar { float: left; + + .avatar { + margin-top: -8px; + margin-left: -15px; + @include border-radius(0px); + } + .identicon { + line-height: 40px; + } } + .dash-project-access-icon { float: left; margin-right: 5px; diff --git a/app/views/dashboard/_groups.html.haml b/app/views/dashboard/_groups.html.haml index ddabd6e0d5..ddf4427080 100644 --- a/app/views/dashboard/_groups.html.haml +++ b/app/views/dashboard/_groups.html.haml @@ -10,7 +10,8 @@ - groups.each do |group| %li.group-row = link_to group_path(id: group.path), class: dom_class(group) do - = image_tag group_icon(group.path), class: "avatar s24" + .dash-project-avatar + = image_tag group_icon(group.path), class: "avatar s40" %span.group-name.filter-title = truncate(group.name, length: 35) %span.arrow diff --git a/app/views/dashboard/_project.html.haml b/app/views/dashboard/_project.html.haml index 76b95264fd..e9f411725a 100644 --- a/app/views/dashboard/_project.html.haml +++ b/app/views/dashboard/_project.html.haml @@ -1,8 +1,8 @@ = link_to project_path(project), class: dom_class(project) do + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) - .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s24') %span.str-truncated %span.namespace-name - if project.namespace diff --git a/app/views/groups/_projects.html.haml b/app/views/groups/_projects.html.haml index 34221595fd..a2f1d28a27 100644 --- a/app/views/groups/_projects.html.haml +++ b/app/views/groups/_projects.html.haml @@ -12,10 +12,10 @@ - projects.each do |project| %li.project-row = link_to project_path(project), class: dom_class(project) do + .dash-project-avatar + = project_icon(project.to_param, alt: '', class: 'avatar s40') .dash-project-access-icon = visibility_level_icon(project.visibility_level) - .dash-project-avatar - = project_icon(project.to_param, alt: '', class: 'avatar s24') %span.str-truncated %span.project-name = project.name diff --git a/app/views/users/_groups.html.haml b/app/views/users/_groups.html.haml index 32a1dc83b5..b66a8808f8 100644 --- a/app/views/users/_groups.html.haml +++ b/app/views/users/_groups.html.haml @@ -1,4 +1,4 @@ .clearfix - groups.each do |group| - = link_to group, class: 'profile-groups-avatars', title: group.name do - = image_tag group_icon(group.path), class: 'avatar avatar-inline s40' + = link_to group, class: 'profile-groups-avatars inline', title: group.name do + = image_tag group_icon(group.path), class: 'avatar avatar-tile s40' From 7ba97ab4a53eba8d28d028a04e20e6ead1cd9f52 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 16:43:51 -0800 Subject: [PATCH 52/96] Web editor documnetation --- doc/workflow/README.md | 1 + doc/workflow/web_editor.md | 23 ++++++++++++++++++++++ doc/workflow/web_editor/edit_file.png | Bin 0 -> 99624 bytes doc/workflow/web_editor/empty_project.png | Bin 0 -> 122296 bytes doc/workflow/web_editor/new_file.png | Bin 0 -> 100516 bytes doc/workflow/web_editor/show_file.png | Bin 0 -> 111479 bytes 6 files changed, 24 insertions(+) create mode 100644 doc/workflow/web_editor.md create mode 100644 doc/workflow/web_editor/edit_file.png create mode 100644 doc/workflow/web_editor/empty_project.png create mode 100644 doc/workflow/web_editor/new_file.png create mode 100644 doc/workflow/web_editor/show_file.png diff --git a/doc/workflow/README.md b/doc/workflow/README.md index 33176aaba4..3c0007d819 100644 --- a/doc/workflow/README.md +++ b/doc/workflow/README.md @@ -10,3 +10,4 @@ - [Migrating from SVN to GitLab](migrating_from_svn.md) - [Project importing from GitHub to GitLab](import_projects_from_github.md) - [Protected branches](protected_branches.md) +- [Web Editor](web_editor.md) diff --git a/doc/workflow/web_editor.md b/doc/workflow/web_editor.md new file mode 100644 index 0000000000..c83715deff --- /dev/null +++ b/doc/workflow/web_editor.md @@ -0,0 +1,23 @@ +# GitLab Web Editor + +In GitLab you can create new files and edit existing one using our web editor. +Its really useful if you dont have access to command line or you want to make a quick small fix. +You can access to web editor in several ways depends on context. +Lets start from newly created project. +Click on `Add a file` button to start web editor for creating first file. + +![web editor 1](web_editor/empty_project.png) + +Fill in file name, content, commit message and press commit button. +After this file will be saved to repository. + +![web editor 2](web_editor/new_file.png) + +You can edit any text file in repository by pressing edit button when browsing file. + +![web editor 3](web_editor/show_file.png) + +Edit of file is pretty same as creating new file. +Except you can see preview of your changes to file in separate tab + +![web editor 3](web_editor/edit_file.png) diff --git a/doc/workflow/web_editor/edit_file.png b/doc/workflow/web_editor/edit_file.png new file mode 100644 index 0000000000000000000000000000000000000000..1522c50b62fcf5d4fd1c3d0abdc1232e8e09ca98 GIT binary patch literal 99624 zcmagFWmKF|(=CWgBaOR5a1HJ*A-KD{dvJ$_pdnb$#v6Bc2o3>)I|O%k8@~76nf1-A zd+)5(f4W!yc%C{{yQ=oyCt5{G77aiIfP#WT`ywZ$1_cEVgo1*lMnd@b1qE?$5ekX| z>Wh@PhPTm4Hlja{=E7j^QrBT8>=!wtPsu702lSy)05ineVA5KYBc|_W1CigU7|ooK zs7#=74m+DwU>FMTn=&Vwe%*gN`#fg#1qK-d`utJEi1L@){x89H&Uc?b{1OHd*2wRd zHY-)zK?cx)4+hXxP};#vJ-C|y7x)&K|IgPmKvV!3h~`T$y?CCASgDE_mh|E$F*SM< ze7Hp%7z(7sWEh+zC^;;oCggmiMhIMmmrWyp9!}7%jA^TMLEMy6+>)Ep^H`oluMs1u z2nUc3hB9#{4OfF+JVeY1UMB~n5HU8AiD&evW{$6HO+Dhs+tN*bAv>+J}N+ zX%E_A%h_yy8EXwV;(qf7(z+hY=9)OKU1FQ{q&c%0m zF^Neg46GS6D^DnzI9`QfJqVoOO^#hUvkc-x;Vm3IEXZwmvqr?bWit<*E^YfFv0w6S z`hRl*|MNgx%3#b!smHTr5rkE#nsa)Fb5i)SD8Q>W;k{-dORRkc_8|kTpQlQ&aK=j^ zGd6j_NXS$#ubrF7O#UZUvlb<03v9;VCLwJ3(u@#EE0|=s#XP9j>VE8lV9<^X4V;ZO z#6&wPcmjc5GZ+k7F6aKoMjXdu_|y-%h*a8#pEe6IY!EBQHsM$StJxFYXw2?{P8NrC zzXaKIxV;F~3WGpZGa-V&$06ANeJ*{xNpL&N-TF^3xWVEI0n0+2o{}MjUH6n-&yk*< zDJ)uytcV@kzygvemrL!bTZavY1D-9-!>L5N#n{sIK(&qOiY%gn6=Q+ZQ9en<$p0=b zaYa~W5;kfnhKGQW!fcrFHfRveEUJf6G*2vCof$lDh}dhgAfe&i!wOJg!oiRhjPe1% z=%>GSn@6E(f8O~c+5D?#i}Ky&f0_FKPbIi$iyd(y147ty;E2C!Yr)!am)WxnvsH?v zv_|^CAv1nyAP<2P*1!^1L=;MflZ}&H zay-arItg4|^%?$nTCV@|)AGf^G<}3vqnwbhK@KZfPgucA@M?@vRZkPS9c)qh8x9Sb ztZvmD9+yc78txM!(hbhZMRRh2|9&pJlMxIO_pIu`78%ZIMRHzJQpzVxjM-oc@lqU0 zJ)LG8P%j3IhkTD!35^Z(j$>hNy$roPv{xq9G^~@<5G8MK88U(cz^2qDUw+~x4wdZh zd$ydWR|IHB!UI0$e?0sDPo()sg-)&sBt7y&De|ynGD(Z(=IG0L`l#eE;JF=C#LNzR z=-z5NO!kmHT9BkM-{t|3YarNruwyrI8FUut$4nsZKq2J&T0jtjkq)dqZ%AX#ERRG>K2Rg)oYL)k+G?Ue%XBKqVm zmGjo%?mfJAO6CssndD!kWNKnE^^fWhl2?E#qvkO_)p~0n`Zwe*8(&XB@(c zU>i; zZCupyLaE9*K%<^d{$O6g3S(B%Ib-T#x~o1)dhts55qf+~u>)aHfu zO4d_|pKig&D0yu{%nEM&nF z67mU3Nb#tB%0X425Iug$V30*vGtIv<)c}`UTv$qEdH?I<+y|f6z~m(x6viGWkbIpO z3i7NNp*deP8WZCkBp%C*gO}A1&fzi%sc0UMdZKpF50(T8b6H-nZCgKK z;Of~(Ba1)=9`ZUl>~sKJp=f|?Eb_oN!M$^VK@-}QY&H0iGn=e@xFRjT9$Fvp_ORfT z?UdXOF%6`V48uW7>-#jf{Sq!&+k()`?v@e>S=%3MbYP~-+=X=OfA76nG9iHhe$@1Q zI52)FlVKkT*n)$TNQ3!lAY!q`b*#vR?}gw$&ANw>$>iXfnK>z{?@A3vH4G>2dl7St z7jjZkQi8IWWHb~Nw_x6h<$oaw@vIt)5Il8-U|MfWAg0)H6c$%apX{eR_e}OxPA{B5 zy*ik$UZfFPr4a*8GU4(OnTR(%w~}g`CHSgp8KCZYhu?o*ACY1bq`fWR%D{v9b1Ofz zbtj1OAUdD99ChQW7S`gGU}Xz>z@ZYA))X_-Zbfg2TX`=l^;JG{#0^-sn&o*a^dBFS z<`rG-)Z$17ki(Jh)s=_3ys-sOW=b|qir&hOqO13!#mEET|3TmXLc1ePu<-^?czC2l zwJOi?dg9pVM?M>*1Ex5^BWALyl+eE?@b@SlA^#&HJ}N!zn?A{!nt70X9GP~sDO*+h zW>_9#@V$%9;|UxJ1Fo*wnMf$;#{8(R0;l2vhq=b-9WC5EK*4;VLe7ld$5y~5$1H_NvA zFRw!fAf=7$!EzKTI0G`yIEIdi4MO6w^{se`4pV*)HUHwy8fIQsXU=VdZj3`CxAJ<^ z+27EaUv}|H6en%3G`22kMv^XZ|6jw~Y{KuiO;N|sG zX}kemI^SN=`=7|6B1kbN4v0u%ht6B@BFnH|8eKW(NttC@ZHB+|{X9v@?7)iCL zfC!{8dWpQ-@ahuL6TBV=u0C4%n$jCSBi*otZi6UC{vs7d+}N>c_M5IB2W}IuNT(t& zyWBiBQFdxAvqB!i|J=`nXmtOX86r)D~Z44eh0DVJoJv3`KTw>8g;S=CWg;0Lg5s%iA-*bh~Azxgtd5sA|N2WwQSVRk=4re(y+ zIKiXiN~NhQeKCdJUX)tPZWfi8jDeGZU8zC?kz$%nA_PpM$Js<$4w17vWlnbULM! zJJGc;FVJn{7P_8sH!3$^V@OpP;UYh?!5|w*B^>WL=+o! zfz-jVjrQ>LK*7n0tzIk?7CWwhgPSHU%~CQlIs&#alr0!Ai21Q#6g~2juE4W=9#U2| zSOFC6IWzRD@!QCwRsQx7RAxfskpEXuI{_}zg!h;f7G;+Cb;mO zi)3UpRI@bX7cN&}TA`O5yBG!p8JU9#7d$1I#1*WCxX7%c7dzFD8YdBMQ5I}^?Oa3t zfFgzl<3Y44S|?g{xQ-C?_6nRQW0m%nV?XQMb@OICsriMb^4-gusUcV*qN7X=CpE3# zNwc;s@@<{$;{GnYS_v%$B)V6z80^FJ4g42|-qt@UJ1Kek_6qsHW4DvO6gN+W$rQh5 z@K~<2iumk8MM?kddQx=y#A%E-wu|V;mT8U7={UcfY5fxWa{=&jI;%Aia(NStWAUXf z@0;5C}PxY7SfTzKJ>h9>8SeeFl9{K?^Yr)2z#*uZE%|d%FN4 z^}SV?qZ;`7B1n|aOI9yPRI5u^LPATb$?;AWLHu8NsY>$kLM6}y?e$6|hM4HU+q>Vu zvnC;Gic>Sw=uZk*Ub~SD*6_fUp&_%o6W#QuRrmC_tFfrqSPPc~ip>n}a(1f|!;9_sQGBeqP&Y#&}yGa(uCJ&CTjvCJa0> z^q2uak(x=3>v97=yXnhX%Y8_6O`>&ubnliaHvD#s`+whWZN#9@gm%=!m|Sd`dbYNT z0sO@$vd^2fHQ^)# z<5f(}JP>2fgI1%_ZAWK%(!u(p|KbYnw)U=GKsEyVu5x4xp(I*U> zr(vf`yPT-01LzKB*U(tVZ!1QyO9@|ua(;OBrs^CF*A;#FK8F}XiA*GC$C4~!dcgP3 zN$Q>;heew@@DnN)~t-a*lC1n4&xpts$Q=N+0CO z_?aCR{gW)zsHFc|y@aZ^9+qhNRHJ5kT44YeOTeb2Uz1)^YN=MvcFgVQv-od9=MDtX zcZ!bJJHe^LhLdmAT~CZ=X68DX$E9ptd*MG6e_fD}@kq0DG5_}kFC-Fo^CEE)y{f0E z@*^qJ?jCn#hdz39R+*S*0-a0vW}XrJmrqd1`3m9#u!O@{P(KNYIuY`vl%zO4^q{TO zaZQ?gCx;Nd%n2EJnZsJ{$&uK>eile%?dDwhumOq28o|PcOOQsL#58><^2Vszf~sI8 zu3l}GejW7~H}N>-?pI`8ODt4cCIud_rxcWc?1QOyH;vS%hW={%`K_@HuTAepI6<6? z?}zc|+8gj2!%~YhpJrxcVHagvX{PhfIlnva*AU5_$z!_$ zxgya>BM)av>N#{Bwdmnwv9Yyn4wQIz8!VQ5yg%>inl)mP+D>5Qyl&Lfvoa12kq5Lw0Jq-UrMEL)Sh%wtQzP`RxG&BV9O~@rc z$v8~uhzY+Ok=OajS1i3sJgb-pHG;gELlu2}zq42 z^83fNjkmYl)vgoo%$jxC--nzr32~#d1-&+7*t+{ZrWDubmK9x6$>r7)5|5sVpXmLO z0#sw@QVW*0hA>e$$$Kxi3&xbx)Ue{>;&NXO!)9k;y|;=M^3?dDwu}Bc^7GMSXrp(c zBB}vR7jjZMcwDR z1P;`>ytn&kat7Z)!||m-8|zU{Gl1@wCqX-f;+QACU31+U8wNZ33H;mIi{Ag>M+k}{ zG&+#2fwOO@AD6Eg@Un7|m~-o)$KnT9?9hUZ?67}FF==LxKl<=gcq4A3L+>ZTGfzPJ z2jVMHJ|h^eueAjz6Zr`IqMF>+5v0v*^x_ML`W1YNXR|`(V02PEpbE7xZjB ze#XyPzSNe8Ll{4;{0c=jW##0Qv=0W0Fjpv}Sj_Z%$d!f;kv0yHq=pt@h_c8X{{)i9 z46TGClcyF^C{jt=rBt(&u_xyi_zhRkzy&Oot=l4>B_bO6e)78Vqb&#@L8iHvX;LUY zV&gq@W1%9__*v%x0R;Z0_AQxQ^m{y|!0+%!s8G@*a3rDLiBKYPn5LMX7iAJ6uym8A?Gk^L$@);v}iWt7pj@~1uW~riLe(TrgdUpii zmovz)%J`!Vo>j*!ZKRPa{9r60O3XlCR;XKxq@=bOJ)1f?mxm|i=-9}FX4m_hpu=hl z=Jrs+P>UdKk5^y7QUk-L&XYesaE=kTSlJJOD2^xw?>*#}xS7k=J6nKeGnQlht2=&YCRFf zV(wd%!YHbQLd zupY6p_gzS)bNz~{nnA4jP<&oX%Y$*sodmIQ_uDH52~O@5kotiwKF+L0Es?-A&c~V5vOS<|V(z^uho9hP4~H15Rpiol)AC&g1018cL}l~2@s_nOrkhcxM!G=IOqP_!Y& zgfSK+Z*a^E7WM<0j2IJ71y0G?Z2xo}KLYBj2okVh-4NkQjRX!}Tx4-6{7~juJ6Lk0 z6>`}S_TKwtZQ7`pr&gMkoodU!kZie-*)^z^W;m0&8!)nxC&Sc`0JI7SzF&XFkZ(Mz zaH5^W7wYhL2~zMe!y32Z{9Ipmd7!SI=@FL&^p+E=*DROQ(A4Bbf%5V53nBRtAw9rO zWS`+7M7rGE&oqr$>+N>|$%KMeSB37*=PUIKYHAWMf1a`h}2#b9{icAV(i?5ai^1qRB+BZX4l)6Z&AYuF*<>9f3qg{m0Yils=0 zF7p!Td!6;I&uVx$Ef7X?kb>v^wrm2Sg&OoAl{^P>R1xs@P0kW73e2Aq_QCcJvJL2Q z!HrD-t#(}bY&>!C-ivvA3|!o3LqDMT{hNkHDh|8Ks#6bA@`1joa~!^hYk;b~I+PY? zGC<6O$!2P5Z0Q5=EM-kW=&m{!Gs-7%?22lD1rN(7UNo7&0%qm#rz4WlG5LJ&(FxMZ z^CL5wW%)*Qbs(8%SDe!y8bRZWi#5U-Ogy~MAg${DxPt0|umqvFSlSLWe)5YN{->;R zPbY!^v@=ps^o4a7!LafD&-B^8^X=89M={mr&wqsX-DcvPV%GP@-_JPx@3$rH_SNFQ zB9k@E`eeMl;5PR{tej*8zt?{fD);8M)Cm&1-M4UuX+uLZ)x z!>I-CW)V9g2W2tylQ{T}18d6%R6I%X?3)EJ@7S6b}sy zqFhZjoZvv=R5V;KS!k1nCGJgIF&>gE$iTx4Qg*N?3=B-RT}pB)xUeO>6+H|F_9Hrb zFNWgc&^*rTt7fC4+Xa(Fq$|w@75Slan*|Meb|gnzThMWOryj$NI}aA#i#Qxw6*?gq z8O4NB8FjCNsh`|chT=(o1TvEnvGn$bIJiFDzr8+BcbOyZ?C()^846KRQJFUCTt1U` z*ITxE9QK(|4J3W~`lp;9+-2T^v1PiEY~;Naq&&~m+H3QhW&6yWEmV&Y3kwSaA3x#d z#+B(|3A^6aNs+$9F;LA2-2(qO8*@+OEwKr=e&SRfY@3IYg_F3vAZ-nOH;Y%bBYiu- zmi%U`E#MhlLnE1*l@*ouKAOju@*V^fao$G22 zurUAu?EtpZD50U?kh!z9crbh?=L><`5|ql1)$xk$2iLc1Fc1k~Y)l^8YRiRAA{6UM zOk!M7wQ@552~!e;Dq#W^Wn?U?@jlGu^X8l2w{iobA8jB8z1AZP{pHLSRsM1oVkG<% zgJ5&=?|gmyehpFZz^5XIU+w24F*`%aWGzNq)v0Gorn2o|e>sV`lqj^^fz zUCjOrv~6`r51P8Oy_R4XOx9lf=JeAQr!_~f##Uhmypp>#{EU2 zP*61K%647v>n|g%7mnXY(`#c z_4(ryAk%jd@js|w=`u0*&AiqoJXv&dlf)WD1(L6tsRhM@QR6pU$tkH|M}NQYNa-w| zh+iUU&Ca^O&h?*_+gpcFKQvQt`P>emxb#@sJe9jBaGcPEgtTEdnynGT910l*e)aUb zH=f7X3Z4lVDwvCsn>&8-US#0FymUpcQJTyZ^g0t$y8D7p^eRNdh12~2;IZpH7#ax`$>f=KpPzq#!KT8>oyBjj zXybILo|q^OFFHC}PSh)wzv4hh<+Q(}Lue2~Pk>d*Tdt_lsr@z*p(x$uyolLKEIu6b*+F^HYk924MvfI;yy?F0xb+0Jo9WVXYD6TWmWDV?7*@Q$^J_7;+yz zXYnyg&}-TeB+D}!J|euqC>&pv?#n%Wmj^jRsF`G7>@_ry+}8xAij)HtDDoMe z@Ym4g*7yRU0ipXoY>A2o4DF=oGfi1}`G3)Td+Q2E^YFyHj{V%!k@KZKe20ak3-`WJ?X1;3p~Ojr$}%vcBaOq&BYK-Jxu39jZ&Qm(EHT9vv9Y#)5e=|A(!dHWfY z=9tAUcV2sk=~8nTh&ZzN62E)5*)td@Q#K&W4x+HL)Z~W!3CE6jcOF)foAo=e$^PCb zeL~CQaPAw6#uCpDO70${051hA%wkR^DQ(J=<57 z5-#`9F;D`@z|Tnq^JUen572UaxtS>Yo&AWBF_2s1Xx)={1>E7*5C8S@L>8z72D#5^Z|xu*VWbuP7ZVL zofnLEr=r7e>x=%Bh$FGuIo9+3F#R5HVPUY-<+50#OpH2ut*cYTT^S%a65E`={?uZM zxz=kx+iG~1$;U-};%!La#%x#T5MbMlh7Hqa8#x8L6O?lR&d$yX9YI20b&DrC+jx+M z121n|OAUPm6d%w3$7JV|i|LS5`@&U}Tv*96X4Mcb~7LqjPD4Vfa-?)#%Tg()Q&yS5-_Q z8gG0OlJEKXFpCvD4^NLA_m+~T>>8Yk`Ff3}F^MSCD?>nlxXB8}Db?2qT0|qsA3w9B zPbyF!5c%R$f?0YcVOmcGJxzz?fhTTjUv!V_{+iv9GLRE@a*3+<xp?Cf(KaYzXy}7VQXn=^{lKQ ze);m{gO)b8%19+JHor&|nM`FhJjzny>Y|inwZ28SS8QZK$B1URITytU3Go!IUfXY< zvl__Iv^T*%ZE;(y5m?}8#V)lS?Z(8X66!cxF2CsM{5H>o7|^^fbY^tdv7#n^kC4gZ zBxO4N#pbljnUHLB0~S9C)-_;yeUNvqAmy1%~wH+QtO_2@%$Gnxo|N82-Tb4_@p1*CZk@5}c!CjVat49O{2~t}E_bcT#j0m0g|GRFJB7mdhn4U>&f+aC z%%1Gex!UN(1$>$AdivF~?p(@59|y}P`zIF=?}Z-VGAD1mqD&xuqyR#hN$-701Z{>t zUaV6*fe%mEdsF(|uJzX>Gn2c#nxbq5ePY}Zf_LgEw;I`)U+-3}I9tZq?*(3xLSpJjI(JPQ6$+V;9pmUI3DEn-ol$g(kr8J5JScX8x6=sZ zych7h>L)1oA$O)#4l0w&&69x5@BuBp$ojHjcjgaF*MC_TT^JZX2o>*(9wUOdIV50$ zghe^eA5{F-9W?RIn*xyO=Q)bJ04i9?vt1VhZW^d2$1z`o-$*<>cyOI}XX}5&aG-_M zE2Bd=<*DOi-FoB1$`3vf&b^@^BTE{zqdWY1=^#;gl_1Jovyzn4;p^+8 z{t<)8^wy5I+aaNp-^TUA_3t03!CXnZbY&w-A*E5 z-@D*BJ7?Em0wSzXk$~sVaaV5FE)=&=?W`ZQKE+?li6akRmq0!gpDnnxy&aP*!Z0kS zY^@~e#zMyLpU(Yr2u<)17XPu`<@?0U>e@NGR9YYz-ZHT`_4q973 z_2ZKLy+5rnmDEi;AN(ibM)8IlK9VQ zpci06udiL%SKGI()9A!c7I1*K$lUng(<>^cM2G++H=ZT1$Hc-2U)G}zm3*bJnPo3~ z!CY)3HS#&+KUr;Y8($PGK`V zwQPL2(tb#2sQ+E+-VpizwwxZ3k#`_tyBI#3Q7EQ1nl($YZFhWT4a}<7bN28b+Z^e~ z4?vaoqmd;5&ueOtJ z1S~j$_fXHK4%>ccZ-w}sS-8Zg`5wEIjjs6H?>ST$G|uzGxrwnFKCrkeCBeq^k&-3V zyY6Mq=nCvrBper8w3ievAOd%bKPQ(7o$m4;lLXnwu|vdT+Wj0~NX=cw;tJSri+BlI z@*zO7QC99yW4K-e$tvi}?aA(cW6psV-5K{I&*PV}L%y`}{BB}_BG$BDrRhv&b(mjw z^>=o6Iq4V!KFpI*{I6ZwsQCHe;cWDgkh-gBZulb(`HgAKVZ(p{ zPlWn_I<4;qG-XI*gJdb{TSMGele5~vP0BBRCkLiG`&N?YTO(N(aLq_3Bc*Y5FCex1 z&j<6Be$FNR(OF@-gtF81--2woh*HlKdddx-l};>qq>av83(18;MPAv=S7_*^hs3v? zNlzi2(kpANj@V)PJ6;78P%>kl=W`&(m`zIQgq(n^+b-bA%D~xA;xb`xfRKX;G2CMt zO*ZqtbAesCZN+14N|8MC>;_Aiv^C!wt21GMTe#YCi+@(tMIwdqAO{HH${mWI>QGsd zn`F0Ec4$yA`zN;yte4ZqxEOQD&{IRdHGY$1cjHTCnoKtbu5}0pwKpCoEA98O38nlfZSl@4O_hI&fmJJ1 z!*eCd-)9&Y-m5+hE|7T3p{dK69+5aSF6+TjsHK{zHPbviJl1GfhW0XPzZvfTDpem+ zVn$nK{SKk87PGQKaC3Ldo^XXk>VM@PwcY3vK2TPt78E2F^g6LQvYRl<=}LRLJ&YJp zR)G1XwF6e@{n$5%IM0U{)a$?f4aYUyqRe(Tld;Ca2Z$N0Kj9(iaVL8ThBEziZS+8D z{&poDH5dhu{N%N_V?Ni#<*=w9MO1*RtlWZ^-QNIVWRrDhzk9HJGlo<_22Q_igct|v zgT8;KTK%?AIR(K-l_scrhlvm9-=$Zvm z`ujr&=5U+!{4a@z-TT7CU*sFBQ@bOxU#6Hd!C{P0>o>rP)=`KCYU@9M!(t8D;US^- z?yffbx3dyCIUA7Y@jNv>{jg6zeM!AS?i-cJuV-!{A;`1h%s+$ve&B{5Y2}9)xEGJ8 zGr`S2Y$}`BhYL|@qb(9ud#dp3kNZ%Ew~O{mW?jifdxkq70Yxu=bN7ooBT3tp0#!$$ z6eHu}di$TmCi}?u@(LSf4=LP1pc`?n=P*K>4^aS(xY=ytNwMNC)4o#Z@qsuDl>Fy$ zCUl@Ai!VcR2U3XR;A>x^#;7aYZt-_-uDRBB%&SQ$;3Dy_jI2?>r?0u5=RG7uM5u0P zZ4zHYLA~P86?tR7;2bmWTxoBqa=dS#QHejN&+!%#rMKUo$T}GXhP6}5()E536*Y#; zF{WNA&ATsnoYrTfG`NR?^x_Z}HU!?1YyIDMhg3>6TOOPImd;nVD8-%2P9Ikr7ARXi z8;{q@5s?hK@Amw3+5JtKk+7gFyvOWjT5JYxf%3TLtCeqi zoFrs9zA_)%=iTWFkdm^*i?Za{Wh|BD&$5?Mj?uwNHJiN>m8_Byx;sP8qzfr|k+Sn* z%@5(3HU$1zDk@TLX~TjK_~G(Ch@+H@q~PXGF$4+#N&jvCQ&m$Nk3aU8Q8B@I0v>D} zw4$J)NaiNv?0^2H`)jdt%#_OZ5IjguD!@mwuNeIyq=%8z?h76eUX>1!NlCQxS=oS% z0Hn)9^`F1$>Mm7e&2(ZrSx+vEz3D|L?*-1;JXX4MukZCqE(d+JU0AGTRqh~%lm;7p z?xFJo=0st$FAhP)wc%-rhie{2&j|vl$wPE%otS(F5Vq@nBYE3#Rj@_$>O}upYunPv z!7b;prkd4Gh_4j>fkBEa4%Z++I&OvHK8xL>EZl(I1uZZrBJ~p~6VkVl*_5|zA(5Dd zw*?K2gc21hQwh@i)KjG;UU1)EJI<_;N)n-0J(xXfnpU8B4?M9;cBJDER+= z$ddKiS9bzLjYVaSBqb$l?eAG19-r!n2bwnm5!H(oWaQ-N-->zByfDibDxeLssH@rl zc8yq~Z(QUHaYVb}DW4fimJv4sU%87rZ-{Pk;+qQLwPxL(P!=lgv(&{uVI`DWU0`eMPNU-_#b6(83-cK%Qk z-yLplCDYMzENbNbOeBdD4dQJ^ccAiy%-FHtRUuB=JgLZkQ^=fexn2h;w+o4@$d{7( zOt|m_0_2a2tVl%P>t=O-Mi6;nC=~l9>f%l%nWvOvLeYA-S(6uXmpn@jSFs!tQr3*L8++BNo*f%{(PEq+Oyj>bkx zN((txs~#t7X-DCpv+D?w0*|*N_nN;=wClWN)YbgRNoyaLEYZ4Jb4nFO_dopAML=%;%%`r_+b5|rD~rI+!iq*`OjMN%|*GY-#Pe^ z3_m12=rlpn*c}_D@kvSf?w^OrXM*L`rt*WeT*;|;9K41Bs^mf*=ZpSrj$ClSwRV=Y zRJ`rYH{pZ1c2U0;*9Z_7kDG~=wPhVqcp)r5EQ4Xz-yg)pe%&FGM||W+sA>THp+9R` z7gL&F3C+~(>X{5^#S}_McK*^l8~}jd&R0jtejlNfF?_k@w(Z_wO_@nwOWVD;(74qD zkkQi7QB(cXxX?0C5VMCRCg4UnSgPM=i2pY}u5hv*5V)1}{4hEyUu!<3l$dAL(-Sf- ztgryxDfKPkgRxTIq%1NozEKP@`i9k`rpN_T&!k;t(fBy2t=*NwNbz zXJVX8&D3vRnrtPbwnPtn>D8~G3njTBl=&5|;TCOosP2_(uTmXCzRxDGAjxm(HxU6! z=9XCyoQMhHOdVQ9TpY#Bs|;PY1NB$MXct0r@^J)~O60Sh15{bfyBaJ@&M=1}`nI+oU*`;O^B>s}U zLZzZVCZet&fq`m;35q}IKlss~I3)n!m*sT15JT|rHGV*N?4!~#t&KYPTf{j!#`!~6 zBTAUtbog2+l9dNu#=CyjO8m2=iFZ;40dEDw0Q0gU8zizW!2IS(NkyH1v72VRnPFco z?V{q6?KCzZJ&=BLLBp)mf)Vh1Gw>TkTU#~4rkor9@**@JWqz47(Bk_WX-|Y^<*3c` zcrgyFbRN=9rx2`E-T!>vnUFYTGXAtFX%O^!Ah4;T^!T#Z?(A}VQC@2`VJF0UYPood zM&rT@o@fmR)%C{$oEPvtRvY*9_T&puLfUFY9uLAEUdGM|q}HE$(ApsRFb60g(M zXir00Ir+p`wNM7`^n4EQhxH2O+LP*^##nGPr3jQE^=TX4&GG#)6eM%af}}#pA#>Y5 zbE{`KG6u0W&q3$i8T~}PDyMRQP-PF)?LlRs(|xSop4{%-m^pi%x|)8%~Y zdnW>+#EcH98idalq$ObA_*xD}9Y(GY=~n*lS!97Co0M~wM7&#h>gXX^zh<+a+cHTb zyw$wTRK0-;M06S9(;UKR_Vb!467&z&Lm zJZlh@qXwaB+V}HM*3@Z{e?&nbYhTNY-4CTOLy#1;lU-`RQ1TfTyG?Fg@ROSM*XEom?cM$DVEMK83;gj)W{W`du;Dsy0-h ziWv4%y!tQ1v!DW+&lg*byyea`iL+s3Qys@Wl4X`(_Sy0z_tkGo z_C62Y z{oeAJ*x2<8hu7I+baL|gl#Sci0 zz5HT#1icqUeQ#U6V{zvu?&Xj)##QQvRrk40#XzsmAllYec2Y3Q{y>a1Ig%kcoA>pR z!Md=y17mKt`}XenPy6!+GptrHw$%?>cqZKv@b--_EM`b*Vc_X1Tg5uc`d~o$YNsHulBeV51UE&3CXq&3=nikh)T@&-vM2 zrQ&;UZ3>EudMH*x0%`nBXS+!SNB(b<$aOlXY^-*1hF_ZnkkB<&la&yOLb5T5?qpUQ zQe4!OPCOz^l_)*0^)f{S`dPpMmw+6MiW7a$LU-lwHZ1an?mOg%-zDJRG&O!q@CU8g zXC;tND6PQgY*i}GTcgx;230ILdK!3|D4mNbT^V5jOW%He?+eStHczI5N|+x@ zqu=GFq{2-XrGv5)(XiR!M8JuXxtV>v&JZkqO_&UCv6i+QB>;o?rR zZndgh@MLNwJI%&HnAIH|KRx#xm8LTD(sF``W~a78Ky(FVWy{c9BXRdHOrAUpf^w6H zLN}LpeV)8)hYsEng2lD3SKDb7*qr>t469pt{vyt~7Z}ImtE-94U$a|Fzt-6gKU09e zdh&lb3~qetZQjx<@@3 z_kmLGKgE;{%5J!OR@U4A;2|G`mb{e&IkwikqEgyP3C})K!nO&YQ-~(+ASdTfG|A_2 zcf}1aVcE|@G%a%R)BsuG{zjxC8K&CH+dfHOBd~_s0#RIp)7>R1$)tj;e0T47z}}Hi zVS`%+VzS$*05JSOiueEa0vxnwtVZITK^?1{i_ZFF?{R0e*meNF}i>?lU9Y8qvNU1E4`zQe@aTq@Wg~=F8PhaF&PVY zR}31N+JtGSlggS_+}A_ur59b{v=ouguXqM7q)+!#oKU+ z@{tJwS7-}{YZhpb=mU=Czlw_M!?s#3=S>Rxv317={f+2U*~hoUNF+I;3-;>qu0AUx zQ|VWUHo~FlSJ^GyAo72=G8(#el%*b1Ux`jO(h%O8)@pp8jl7Rf3Ff<*XzU3`V^bh^ zQ9a~{Oc&Z+yv%u>Kd$%jTUOb~&xQH%%$8gaJ`tD2X<6*0 z-k3cUk3vpYcnjLva0If6E~hJ}xJB?7+tCtnYL=z%jK5UMTG=wJKY4N7rAtn4@6m0N zuEEP>VqqnN-y>)w7@`y5`au7XZ6GF_s%E#6@M0UK5gfzgTA}!=C>Y zERma@uXiqX*m9nAzXxjlRJwZ|$xgQQ@y%2y9hOhQQWoYW%=N!wXj0kVDResd>T`3u zuw9MIl$e?txtVAp=k=r0HC587O5#10xZ>quCZXbCAB}f43Mk@D?mYQ&5NlW2qMYOo z58U0O(cpF5%HKH3j@f}wgK#`e0(M5;Ya=OUqj~9g$?t`4EV4bB{0@>r#ZEFJ%I=3e0Xwm2s}dR(WGzk#9OwdhH~ ziy}!Ft<8!>a%PAidf1A7;%@y;U+6W$&$;SQHU9CZS|vugX$s@O@#$(YZedKVAPrR! z53aZU;-u)LCXESLlCh_^H}kk=-zdV4T1% z)DO`rO}6uF!E8PYEzvv+{lYL4XwK+7bqu%h*>t}eZ_KTxCjL(LE-e%XZ|gKY3}m*x`(g&YwAy7 zidDn=U3peRYEY*9w=;v1A3=;CYA(*P^0hN5(^QqEM{Pb@#iaeqM-Vxb#4Hc=Hf;4&atcNsp3Di9bbI7ij|)ROkGk?5gGt!< z0M^bAFN>iYUAMOf8knUv2Djv3X30K}Cv+d4F!>TIX2)i}X?V6+{;7tRj--`el*3+e z7q%jWwpDoibxkQUN=y08w@BMgS4X93ZQb0oIw>*25;xak?k8mx%tHFpon91IXsA?L zg%F@QUuU}3jWb_gzP2Uy$U#;*z2&Lb?vJn#+k);cafRf|6vOfrB1T1az__I9=Bn;W zUjWMv^iFFa6HgS`zkYX|5;{0=t@hXwJ}J0B(YvSyVmq(E%nyCbCC>f_du&5BO@-)+ z`#3^3Pjo`k7m+J}|zq z;={QXzi&CXtbQS%-}6v5PhEzcjX?<=Z>MadrYl38Sc!Ro@tkC1iD@b?+J}@PJ77re zb->uT!J?TQ7Gin2w%Y%T>ndB8=vdN?QfG0D!EX2(ua7Y1nTypr#{3avTdpA9&b^j@2L_x2b;`%#E>!B^Ol zC709tYPFWq@jmGFs&^r>^;!LkH z(xqJ47Wb{j6?`x%Sr)%I4V4o|DX7L=xUNF6?fphfNf{hP-2ha0XTFN0i;3Z>5YEpOWY6O_jhP-`te{H$0dbpgA;={>6ApGQhmBE! z9cXCcPUiz7#DYqENbdN2+K_pluJNU~{UGh$!&aCab?&y!2TUGZaxSyr)&N;B%Pb#e zJ~JZZNwQ2sVDwr}ARgMq2i`SA4cTo~k-E8a^BtgyezR~~bF;CtlYTzqoVavmW4>vv zE;;HixCBTZ$zlv+f`oN?6W>2q^<;5lcr&h)68yGdCu>*8tK=g&NJje8J2tF2O%j{v z_}5;-&+-DSEJ5Z(NjbVDq*3!QG?#rk%J+o~N*+LY_N046Xv>jCSaN%-7w_nkdg6_o z^se`Q;@o!>LS0!j@eR@$4E%wV663q2h0v%vXKIQGm%{ZqFCyg;Cme7gzoc!HrXJUm zklkzfB$@Vx{T;*_z53qv18=2crn@I&H!GLdZyWXp?o{Ez_Nhdag;I#*Y2w=ob4m zZVS4RmqUgc8XEAm$I5Yg`Jqu3w4-)O-`gdC+S%$Y1E<6{*~xJMekXYb8ZRu?Rv0+= zagvgfwm*EM@4OxU_OR7sD{|dNalG_FOnM#sJbmOi0+rAt$cN)i3ybi1OWAr)8RcabdRV0Hw-ClqIqI1r&*ep!%fCi~w$=Dec# zgka5p3*`KOp@r&)KB>FkT1Pz}*o{55#i(m9BTStvMHEEAQO&C?+tPv7Ur&r(P0Enx z%2`3s_!82D?d%710pjQDM{&g9)C)h@_QVi0HXil!ftd=+m49OpxyDA7yz_{M>_{A+ zxfFlijth|NEz3n>+7QdAe%|A)pGXzZ>q7gU0yu+g$!Ha`Ws9k94)>kMGT@{#JWsVR zfhuuY%oxw*(_UCAre8MeNr4*w_DRI(^t};jO}fCw(TE z>@=1>>T`U2ysFmTeu8C?`S2`Hc5ow~x6+n+GNWC*tnYwKJgnKoKPoPh&iNzzW>}Qg z`dd3&V@ZFuBj2d4ci9E)SV%-~?$k!SNByFXEB@)H?puiZB1t-`)!w8Ny= zr@WL;ZKtd?)DEAm-uo-r10c42I9d4M!ev)SC@X#O)%|y=k$qsyg0U`IH}sFQ<2keS zc{_Ss?uqEP$gUXv^|A;twn9KV^-abXsUX&0Ye7yEWKTQ zn9){FeaBr~SlHONS#9CAaA>0|!@ib6T%@o>zd-B*Lf-tcz#7#R+wMDcgW41Xz`{<& zHq>N}DYx7RYN~YyA4<+0Qz^`!G>>k`imh2o#HWQv3FN0i@9>92LiZgwh|eukkw*uLz$gVdZLaY5 zq7FQ1NOL>(c%Lu%gPa6HI40u8R(nfx*c!Mb(xc#V~{p-e)+(iBXJrK3cO6 zpl(e_5J7WA*Vt@5XO)&4ZrJ2N1KNGZ2_n*p2|j;sm~F2B$$;&om_*3(d}QMU9_nzG zR&G$ItkQx&{T*OjoM_d|r!(-b^?}$HqU3=$3!d1fkz5_)vmg^ym;D_NGYUU7(!QB}~ z20H3ZC6|FAPROLchf#c2Lt_F(|I>lYLR+`^%t{!LGXb0cbc|tgkgz-6!8P*-!tprn z5BI0Ae7Mo^&nT&Ny4p35n!iWqa0xr>4sDt#C}jI5d2^q3H)7NYf|-Zz;(h69kau|Y z5DYdFM@9Q6thEfUcDKk`!(@-kzQhgiuP`qrnA9>s%0@;Nw+^q@27P`-?9qYdxeX85 z-rgQB_kD7k6U&f7rZh5QP0jhD9AhG2ZLA6PGGCG5+ncbC9wEvJ)dZ!WAWBXSMES85 z<*>SaXhJUG)}_qId%F+V*+J+xed^1tTAa~sGw+3YQHAo!IV48=$1&OcILjo0dYQt^ z`92QZPPgLnvX@>HE-q|Lzf69!OU^F;91jpL}A*7)LU&{#ru3Gjlx!0C104h;h$_jLMhJjeJUT^H)4>Pg)F8tH=&6st!(*mb(Gr8a7(y2 z4JI&*&VHm~XhdX(GRV0XajLX^aA8*aHlJ@hS~Ir8i0Co|V~T~#_!_DMjK zb?p~f=$p!>_TIWW)$C6Lj2eZfNux$U4f4{9`*pATeH9+B?@g>tS( zIgXnk9d%J>dLF)b%cd!uY50Nm8#`EKI$YXel__Df$g7frRNp0lu``M^6 z1$Ibe^fNdG(&FV$ldZ&MJO)llnvSvtZ;wsXK{xlv##43l9d5Y4CEIBP!o4_?%FXhF zeAP7FVz^~(cXXUkWZ5GN&$CYUp@u{~iX_YEJ(IfRR<0MjraEr>K_7WUok=U&SE+05 zw~f5!LJ+Woo_W7LBff~~i`RTXr&ws-=U>tx8*lj*wSE-m_)^arMadKjIlk*WWPMc@ zu3vBW0OY$aljXPTv;L!=X1DE76?_RTwX&00Nm*~flZuG)cs?%nm0@%gDt99oFLB>3 zTKLw$dgq%re-VosRF6vDK-B0V?4flb zlP_wkI5>7bStypX)~-@{Z5ZNU-FTsdp*nTDoKS9`+%wZ%0yPYL9ii0R+-#-qO)D%g z5C5Jcj^m)K84McIfNaP(COz+%@2E2urI=b$72R39iJ}_L1)Iv%{)UW zG6g()SquaUt&8&==IGhp^4)E~A6Q(dAwPjo4O0oD^b**_!LuUkN8E#EED1JDaq7de{eLG_(7Jh!@(u zx2Q9Y`5mX3Qw-gc?&MeEdCj@ts!E+(ILv1`a}bS)Ub_q2E@VJy&wX+PF4v~}28IM? zY7DybCUPe$`T;!%jT13UxNTi}di0~6!Z_$!$S`P`3)0+v`|&|iPP79nr7^Y6L__gsf(G~21p5gQ*(VqxS>korfNvg z_5GEREA*S6ZYcDnfv~=YJ4^)Yua(uL&=0LfdJa-CD1}!TQp)w>>qsTCHdMo}?ldjR zj?zcYCEHnD_|kpAhIFnBPI~*yDvClDQBu;=pnG3GbLOh_65402^BtJ<&6meb*G+5; zM~*m0;Y*3q8KQ}YL*TZka;hc-QI1v9@2Fkzzm$``@~p*viS2Ck4fqIHpEU0xPj8S@ z3weP;cEkhaw8cpSXFi%t_s#FNnJQY8q6fw3Sq+0>*h#n#4QPrWtUrRTw@gGg3X>tD zGFXUnik#jZuUXvU0ZpE6#=UYR?{H^{o$+_{CO%x{$!3A$3h^c>#wm=I9v1ELWWC&- zCEwI$v1vB8hqDO%$YUQhBjsO&mb<6!4IlM29GMwKCj|-Dfu;_hN~2<#5fjkV&}Tic zN4UV%t&~HCRzq9cP$1&ZQ|1WN0uOPE$cxP6RIO8r1QqQRxDOl{9rP|}ZZ0<5(5J32 z!=p{z&=;|z#@L9U>{#x-+SZ^5eEVCV19l2ALRRXs9)e{KGYQJqOU7#=4oCA`p&)(B z@i+~=s3qjUl&Ca1IG5s~T>Ml-*^yS=?kw6!{3Rui|0NB-A1MAh9!#7wxXOktDBJZ8 zKYRdD=XkzA4kHLh&HA~;PxIxx*@sF5On}wsd2%cJS%hc4{RW^kN|Hosw#(-0rk#eF zDu-$QS^vWz$N*PkzDlOB6*d19U!AAe;U!wtG_+_;N35=1_3HsENClHUT` zscm1O?czehs<^E`vub+~qT}5p;4A(DARwSs81CG?;(Cu%FOWg~3jE94eEC9+75G2R z#rP0VlaXhWUNZ$w{>RVpv2_YcT+^@K!{T^E{E%mArPcY8b!WfydwDfb-+8Mo_TAng3-*rGn2PLys}ci4EirQg9~&SPGfn}^WT{isv8ETRhT zBo&ULddU^vZ9sOde{(rd*$Yh?2a0Y?=RzCO4}R(Up@qKR(=Ax7at4aKLZoL z9A#xXfJt9e}&wb6-VIP_cQrkvn1LU|*(|B?~~hfoNIIdK+{ z`sCK2V|S9ou16R-bldV~dhGq%o}z8W+<4fTJg*e8aI(fIr`q_*g5dgQZagH z$HTCWv1IR%UZA}dHpjd;-i7U+eMGVNZJ7V3CXw`GSQFBQm|#?B(K1|k)0PJN10o{+~KBk1vCB@kx&7Ff$Fa*DW$&@vu&yN%QJqYxR4}WUT^hAv-@hOoZZj2iBH=F&w4 z4_8p3L4;7ucjK#p@lC4GRa4w@NkyCQM9*QG^d+p8I2rmbb&KY!u@*Yq+*8F`R2xuW zuz$Ey5fdZ)i3)N_3lD$%Z9v{RPr9_6{kgWGx_~F3@7#7Jn)Y zFniPC?j>=9QF;dL`X3Su8JLWDFzRD+>hquS>0Iz;!BvPQHnJm|a zyrrEhDF&3O9pk9`@xv@$2O@nd9|TT1Bk4&2vyEa`W*8R8kIGzO;Z^q~o_u$tY)UFA zqXVac)gjpMa8%QK=~@KgY6;z2z;mM5j>P|o&4hww{+PDO59{hOYdNXWlIq*GjDV21 zjT?i*>3cBB!*e(MZB>eG&#tZNJfGSkNH{8XYAUpQ<0}Er(=dYYL;c0qF8B7AD8?6S zTTRWoLB%ZTsqf{-C*ikM#JUFCvUl6oM{5bMb_Gcz4B5iago~q^S!DB2wh=_zEZ{ms zwz4nfhr9P!x+bfYE6X_u=a;#}OMMa43nyT`mwES@Z>CQ7N0k|udG02UP zCGaLr@06E33JTL@+XDTE{r(c_f7ux&hHCV*fCB>GBb%6I0@_#cTy9CbY$33pJ!gC5 zrZ>3}O-F45W6kndXCf5$hjtW7h7x4aU0|?;#R+GYuAQe53nniE3pZC(dpt$1WNwBM z$TvV)L7%0wI!s=qIO{v2K5CVqd%(y_D=eWg=NTR*6~1HEdO}h zQ@CpoO3s}4Qj*A{&xgsY`GfUB%C#7BR$)s$dOo6o@cs2~^*lvG*J$T=SQ95`<64gt zhz;Q+RWRq_#hOq9m|TU=+5DGQ2C!f&lK=;P)L5MhxxUa9Veo%y0qPwh3lgNrnG|yz zGDHI|1PudrJlNRSKBwio2F51mn%5Y|Lt&pUmOj=0BZ%82!GIwxY;!ADKzN7~xEA8Z(3mhq08^b%&_)zFMWyYqB3CgWDsCVlVwU z$jf-Te+1KWbS|4(!X&Ib6S@GYfkK4lV@FWl^wym zbOwm%7}Z`A`xl6lUgHQtTS|coep)GSUe{1hxN`rZ^8U*Lw5HtYIll z)n)=};wS5~xPI>25%^!uDKCFsBE!+(t#0OqZu2F5IOvOnDJWE+aMTAjq)6C3Jcd4% zXIV~~?CWS=PYD>mIED4DDZU2>$9ft;25R?Aw@*8vdl2M!k#|C;Sd+1NUxKRbM$_>R z1KulmGOy!_|FgIJbTn7OSK7n)FZ5w^`4~7b)f6lT>}k5Qvrr>akOBc=X$>zWTg3Q= z>|2T9D`!X8#k@*$i&+V>N}REs=f8UAzqT%sLd$rXAHYSt+3T z3_oGkUqpO+5;NpI-T2y2?^^BZ%LiGy$#3phA5J1y1m&J!QwBNVc^aq|A_|ebNxsUC zssC0OzZ`=9K2{TZAC3~U;h!z`4}C7wd$e>;IN$B1e9N21kPy#huv~-7-ILdT8d?l~ zb+j6{5B1wy94-b4X6Cv(&yiyt(Y#_hd4#T_S!2feFdX(Geu)&T!=RNkea-{-Y5&v2 zEp%=gPlkAK)g$4Qhfz$l(ud!{XEE2oahYZ4M6M`|ir6w|P2Tsj@<^Mqrr*}Tx!FiN@+L0dJmjU5#LxkKr(nAdb}@&bCVs(aZ9y-*NpEfCaW-N`N8 z!HHpz1wuD6j%~eWKJ@3yZJ^C`D!&HUVRHVN_1{?jzmFjn6lbPzCDIgfrbUlyDvB~;1VudEUvP0=+#u}9^Jt+7n-T806ChFGoEr~`41lDdaJRy? z8A%ARh+WZ%YA}WbEh3|^eHK-}cAr&t!l*mxOs*SH-O?%}=QgC-h{ChC=tEOq1vW{l zS`-%Mxv<4@DrCnk6H;NmXvRm*EDrU_=-FXPUAka)Ml9WC}SxoCois`;U zXV9-)-SH7+;n@Y|P^OULZD4?UN+*?%?YllmA<7L3DjuOG7`v#6&-~~8EcbJHrRqCt zpn4vik=)nqm+sx5xt1}1wDG>*`jMP6iXtD z>Kz+umG>9d?Z7M3h$tLF``d^ys{iiuZ!G?v@h;d4$%pg?V_%@HR?mS%{AY#4hT^W? zXpmkg^ZL!xx;y+Jx%S&7=$wm>EowgVhdyrF0s3Lx*&0@yBLz&+`caWBM%X{X;2QeT z-^(7B9i}cd?>i%I(sLDVb;O!(YM!5&En!iP7E=H%aEnj&yPktkWu-)AEg`OJmf@ye zMehYyq;28xC7MCf33tMfn^U#>7b#SbAKTKR;Z;MCrlPT))2)aeHy&6L7AV+uAs}Y@ z(CWQkZjQ}V1-`zZZG6=ubOV$s2}5jX_TOdsKimIqy!ZjZ zRBbW#lGK^|@ze=j;-*T-%uY{H&3%T6u%aFPVQp=K!(P~GQE#MZ{5I9pc_DBXJ0@zzIig35KH zv)X72i+z$-kx;557#VjM({>aWDJHEkDJE36^8+@`RJmeh2ipEhlqPbJ;*pE;OE{6j zsFfTWt-{)@PSf%md&qX8Ts35#HU<4@(mXTnUThErMO+7pf$-0QBmuN;SNg13!!K)L zYe-2l5C^#InnK~9B|4HBd1TgWK6&(R9o~Y^-^Ske#NNV_kGnC#RM`ublot9rx#RJk zljLZJFC%#FFJou*3 zb~(Y?bW(yfTCalXbUF2fO}7=5=5Q*{cG*GDHU(Ei776c1V5h*y>(B@>26GI|3zZ zz@WOVQL==%+}PW|3pCl_>CuS#H(4!NPNz#IOe5VB)+VpIF5-|yA4~(jvJC1WISoNP zC!2E=4c{2R!mOwr3|Xoo{&FpBU@dQWV#lVh&c7nL|0?dk4qM$XL=lrNQa*+}PtVxg zdt0@x-ySu+H*BbbL~sjEZSpK9)|Bm4NBgO?jxS~?H&!(2&$HdAy`=Qyu#f=E_iat2 zo~?9uI_cxp;bmsJ@kG(t!iA!9N_S_fT?fQz-Oky{xY#~FV2XOV5ZKBTH00`_-$@Rj z>yKM{@hj(?WglCQ#wWsF59JZ*IL-za*_PPM7Cy*1zfuHWZ=AB7xY!9yNz7ifHSj{F z`HB%CrOvWr2iiz)Lu9k#8D|jP{N=h_mc%Bl=u>Ya8behPD1zuJ>PX%DBeLqmgfg4) zA8qxUF1Jg%h}XG6fG7yk0!U0&71Jx;enaWx`0{-yE)P(-84q^`uFp6+C-xMpDrv$V zw^CIcAm^&G9+6_>WJ677Jc>evgzrEk4B6aJA_%(ZaG1C(dehXY<}+`ED%vjz-1|Hi zcWEkRbGTkbbPh!baAD|)0kN%IAF>6}AV!2IQDvpfC`%ymjp%XhoIWCz-EDtV!o*Bj zFZf>JohW>SDdiB2<47pkLgXfz+| zCxiI4+bldJG>9HRj`}6@1+Ma=?+Ay>nZa)xw_GbvfXfhWjUv$ej$}-Y?mT_^ln5eL zWqPi0CF+L>jKqw%X}`>CE2MQwz!J`+n-9C>0C-#Xk|%cff4d`p+dlr2#T}TctPewQ zRWINpqhmR+5n?8ecRZNCJu=^(tfOl2*me+BL;6s}pAX(Oy+vyt4pLHkbxRj@$q4uTmUe4gVx5_bBk zsMlr9!O$Gz=HkM4AhK5Ab7*CgF$eI^P)`{BvtFLe{%Vh5ep4?o;sY!Q>rG6cGD6ArQ)vl9E2#tf(v&m8z-t?MWS8dz~;?`-wz~J?rK_ z?)TT$@1u8!AK$-6enBMb)0Lo5Vv8Lv*JoEtljFTFwmsI)+EV98*a&<5B__RVj*X5> zydE}k7z866FV1_BUIFjCmF`*#8}Eshwu&OCz2`b=g~g<(#uj^^P9!B-Rp*T#Pc2Du z^M=R?RQ(7T26A^;p@a?h9C_&6$tWO!8~2UB+WYJM6-&!}qnXLRuS&4faqFd!)4;CE zb1C?Zh|#;#yI5iHQa2H>_s`??iBFQKnK1~$i=>?7IBDMCZ#DcWDd}eC(T}SAhd8cU zAa{n_7ySh#OcxgrW-cx+VFZNlz6(3e>YCvFlP3FxRG~)0l#_d_L~Q z{DtKHT@?T2Slp2RQc~&*SpUOLwAlak3hKYF`?s%E_tu@G9IgAg8Gh99kFSuHBT@fp z_Sl&d?4TrPGQ#msnvhvN8`xw-)I=QdKZiBUqtY0pfXQ@tFK3d#^?#QDf25*nJCV{JZef_C3ODiAK6UOv~?k2dAiEg0F7+h<*bh$g;y zgPJ}-78Iu$^LIY_7rNRiEsZcEg~GH;ba1U$Wo@U_EtT}jtN$mfbL@A9r#ch>UEIW=x5)BV9RA(7lbdMpPf z7s_qWfH&9b^}^;Y`T}?4lg{fCnja00t#de!b!f>cC^ApUs96Gw1s<=QigIzOkiB}n zknM~5JBz}f+=+-frUeb>KB5P59rB)@C#s%tstFV!S6BXJMy=#Vt)AsIPp(LO+Kn~K zi;Pev0%&WTVMCT`{Mk*-Y+a3h_l?hMg2}3jy5NhwWFRKIhr3MfTG;dVzpe3 z+-Ss0E32YU1j!#q^a6C%)!);jGC$AVeEvHr-#h(E>xqH0#N1dej<;Sk&X4N3a8?xr zT6%wcI^ML?A};dmTHjhco9%aAe!~1q-pokw*VZMYp|JJoo~=|eP>=n{N2A}#Nu&&H zABWIfY@X!A7>Dp)!`9|3P#Nw~H2(VcpC&#AzK0CNG6spCF94KIj$@m#9>T2cB=*OH z-@l-m^p{59ODg zmzCkc1B_qyDP5fIB?vqIU>;MSt53*BLZ&YEqFXt^vt*ks#lP#~&zZqcm?$A3FgQ78 zEys^QE)oxjqvm(do~WpN0q!o?|6yN=sO|;H0rL!Ud{(LI9A|{*dkke86cJ{!o-?XK z`Ur&T{)WZxGNVKSFrfs?X?m+q?WEsInqjI9#RWKxw)iIqc0}^$4 zX!E{XXQ%7@M+maVfd*K&hi-dvqiio4qc7;=A_Qun6RHa0T+-9VE( zHcgL+!fQ?AF^RVvNP8z;SXPE-TsfsRSZ_Z?0MrLY&N(Hpn*+`jwTM%j=IQM7KCN_I zw+p^v#zwmdyVm0IgERxDI}(ReCP6|7#vpu3-uL|s&SUxVlwz(c1etD#2#Tdyw~_J# zfh;M(G)l`B@wM)uG+zdeLk0CNmz{I;us_RgJ_xy$Q=0Uk;ryA+>C zoSe8*Mqb%>2{}#ne&x(EgzO==*Qd+DXapZ|t+Pj_wGoW?YeSjV&_!UrisN{oPQK^H zHw?eMc9ELe+R}gqfaZj_6x_3`ZddVq$T?t&!eD)Vz(d_ClsfSFN^(I!X?8~k6qe2M z9piV^#&8$i^NDwp`-X<5Wdq<=%JnT4C?jP`>39#T$fduWk?YVx@#@iLwY>u?<`ipNnHxf543 zE#YLj_Okgy_PTPy;+g>ng=B+IV8aGLrl z1t{tKBDX)bIF0_28pKb!v`Q~vH3;w7Z(5EQU}Th&$D~c_&GFlP9fF4CBrwOXpPguf zFw^d4bR3r00}Et(`zcy@p8t08Z9p8cPl|OKx zXagmh#Y@26ur3qK*k)dwOG!vry)^P^@;$cGtZ%;DZOtsI9ihC~7m_OWK#GaQ`9Z_) z+DzB{^h7fW%vs>Vd}E#MF)2)oXV+X|Wo5;p3f_MV@f9qk^E=tLMGc@nl;{g1gJyZQ zxhyM~5AK`B(FX?k1n6WafbbrsKh%3^yhezp>oWLBcgs|?e{H#WV`F1|zP;5JmoT1Q zXRb#44c3f!z=gXeBkg$@Mnk%Gsl=zz@*PURK{VhCF#cV_-aKcpLNJEOVe&2noMykf z|FzR#LNnmh9s3ls{|7Ie+6euw09Zy!1(yP4l@*zwvUQWmKWNT`~pK#u1 zjSldp`pyg%5|m&9!=h+ZR8)(r;&?QtKmhhvnK4DSHkX zDoTOxl4pxyDov-GrIi`M3FD*ZUKJi+*;nw;s22Hotsp}TBjQr$EBAQue!>fx(3XMI z|Is#N`yDT#S&CIoDPABlCQD}_Umo}HSy`bZFo1JtZMw7UljCF=)!8gqH}xDC$(aeM zm*Qk411T(b*0dD;uJf5Qqz9pLIvnjc7h5*-ZO!kX{m8^1>yM^%Wfm```#6{aBZF40 zDNT`khJ<_>iuvJDI*`6-ZcJ;PkNU}riGfJ~(@|n-rV`rY%U%E?7gm&?*iFpY;naEU zS=+;yumh;b6YlmS4NbA0-~=*9yi*SP*{fwhV~d!P$yEXzNywd!iT}VB6hk_?|Y#`nFe~NE6G_08gib zY)c<<*!Ki@Ss9D}#YV9TL*FNrNUKTJxor`9O|phC^LTSuM#k{X^=hUwWd92VP0;Sq zkPv10Q~47fljVhTUkmTPwe!88Tl-Ksr=xq*!(0Xpi-Q6qf)mAM9CaMF=U!5*lE9TV z<~^jP#^(;S))GIG+8WFOSJ?5(k|3lb`pAdFWUiANRcx7%Di-%(qQN4PPx0mU1kjOSx31!ph#RsqD;dM0P3 zeZLqo9+63?E#(c|nVDqIH3D4_rl^+%FPI(w3 z{bl@e*urzw7bdNqj`Eq_j`7bc0={nc^&t~;%_ANJ@pf^@Z7pWRL0h?je){^FE7?*|8PmWQ2Fi>iqXAEwUo&491Kp<)D`=Xgpm0e zrYTI7IALx1{HGr?K)p>)9U~VJ3ryv#PhY!UAqZf)Itx4NukZ+g>m4sRIK|87VyU)y z6D_>mPNuCh2Wm0~KRujD1vuAAb-H46F~uNK_1NPxKiEQk-oUxtvWWeVN^G?g7-$ys zOmCGGf@zgiGvw0MFCFQfWo0DmAKScJE^mmwCWGLQU-6x-ewgre@mkHM`HqBFo zaj2Td&Ju-o--VH4>Xd=)7disIe|xSM8vcLMEUR_H=_GH5&>)Uv5L>Um@Sb= zLom{ZXQs6Q(rXn);&dOjvE;9#a{$b;4>X)fB8x23S~)t-lZyfppSnIo+crb6z7c%{ zqft4-n*|wFc54qC?N;%_R!0@fRo`Shre-UqQfa;JK1c#!8~YfN$?CQhE6jAyP3iTu z2eL@!J}6W80|(cHgyP1biA*D!6TkVm)wePX)5g&7xX$kp2U|!`!Buj=(`7VYKS|uYOl1rc$87S~ z32Z#`iY%Ut|2*T@12}6wDmsLRprqb#~eA$@kG zk)$BtrV~&Zn?&`0%AHr|8?a z@Ls+l3)C)u-X}x?yh*v1o9;4+k(iT-limZLP^^ej$qfv-_bW_!8>cDS0Qc1SG&xnx z36(3|!K>E2{wf_GWJTtrub(mP|Iwh)$*SOHD~!nZYZ91{KpiD#W^ZbrxUW;0UPpT0XcZ zhhiUnAI7z{C}^oe<5Ga7^OldzRtaGyi1|VVXt_LuSDO#*P|YGo@M0(zdEd5feky(T z_8f?%-bIgng33jz%pQdz2#f1nuO%>_9+QC%#AhFd+3#2XNW}7rw@NLl?=cQI-|0tI zb>x^?!{h?@niz2}Q-fB$(k8m`BB(eNL1m1np$NOvxtsaU!PHS`Bb?FLxRMv=sl~+(>!2Jc@N1y%-7>z=IcuF3~)E}KM;no zR=l=~h`PtB`uXbou=MI-F|W0yB|CT)gDGy@LQJ=*wNeP9o@L0itB-wiyYZ7JO2t

YCYR-&AWBy>G94tnC9JD-C{@9{m$j7KCbTjY1x#!Kz@^GS` z4Uo*NsC5G%5wBq$;t?J1x3AiZgq8o6Y5nym9q<=d=ttraH9IjDrzwES?#GrfuUK)kJ{MUpt4T#AEfA8L;g zYe>PD0jM~eO_q~-0GaW;o%nG4KZhgaAd(7Kc{4}eg8E@I3mO2WDpI7Lv<6bAWjCwi z05IwuP{Eq^e`eGeLV|EU3xZ=$34kbfPqJ?7M=^jAOz(Y?05AgWgO7hhr-^vZdv_q z>xqj0f}eUeMq?|j0587s=9RoXDX2$Q@APj_@?Vc3-V}eqPxHMthIMKPGedW|XEb?8 z-lEx-cYl0u$zQ0ki@4x&sUFb!Q2OZQ7AGCBVr3L!<{)j_(G`pLQ{?D z|D**_a8L&{KhA?*Aj~AAqLkCQ>Hp|1@^UjFiRc2@h2M3=V1_Ag%T|AOivjBihjy)xflztETm=j+Ci~!)G&pyk%|3l#Z&AsnALI9%-;5ZR9{F)3z(f~F> z!yl4k^v7cV!mP=F6`3%@fEY0zw7<~yzuE?hxq@LgxTx~F5-H@ zT6p@auK3SosNV#05Hk4!VeX@|&1v;;sNb9H^L^^|*qprHh?6|F1tEhWFJg@2#V zl8R}1cvPmaBNTuSz+?2dW*WP4(bZMI8FLZ z4gZ^Cx*nnbN(DG`@Zl4dFY-!C(qYlL69N509``_)VKM?9J_u+83)tc(BMhd_rsYhi zpNu>4!W#~tjTy75xlc?(fQkKdJ2Q=Hi>&J7|G^m0ICZ{-S~LiZcz4N!i&( zW42k}!2V|tTCZ7`=b6K0NM801CO#kRh$ud@NtJ()*N-2hp+KO|mIe0V2L)a22Z1@1 z*_;87UBL0(7Dx&}L0Gho&i$K?zA3wO-NAZ0Nvxw?927&r1F=`rQ zFJKxMho=gDx9UKfl`aDUD%Uy}5AcuK$@aAOVh9#T=%dI`!|}vU${&29SrT5{zuNC+ zy_e%e_u3ABO|`xUI-oYhtp=1Ka6)j(IJsZ0NAh6?(8f_~a;)_S1BE=MP-;RZ+LLu0 z4okchvM2vFXzCuhekZm8 z%f-4%{s|}eS^n_%f$r3hke?RUjqnDb7A66K zd)(=z`S+6~_}$`Q0FuB4em3lqg;WC!7@}33@K0^1^faXKE}@>8u7*aazzBH!nf0o> zW#nsc*)dUhJ-(QuUTV}6v7CD+dB7GOrb-ZhQm&9(X&sq3o~Gwx;~1)8Xy^ci{X&v} z!KVC`iZ?aT$Hn6%NZyhtk0r@0pip{CpkDV6(=bYeP9hA>5_P!`#Fn|yki^s|JQ5)2 z$DIW*a3B!@6V5Do>{$ebMe^3&+oA&eFP)&0KkKbSBJU?c5P5S>y`Qv8d4a}gM`2~N zC>MQxFFh;yd@_*EL=w^wm!k9OdBqRS&WDH-?Nw~pNsTv;y7`FWdMZ3H|R({Wj!))QL ztF6eV{*aRsW?P(X<*Bc#qB3U|#0_Kt6zKy5;~(94M?~Sftn^L`aDroN37-D}lmnaP zMSXG)q(A zKR$)^hwM8y5#hcC$ZCxLqg?7jQy8L4u7+vhL5pBWW^ z0Ao6dme2hUg;mn+xXjw#ed?nZ+S#ONa$7Gva?7_a_bEXg02_Iq|4biZG731JfP4Kf z_TDQj%BWuE3+A$)Bt zw|=?Q;H`T7bH|Yy(SHKj?s}B(O$b#HH27%F_jI#n;K$Y}s)cSy>hKlb!@j=0o!{>g zL1WNGD=?>ywn-3Uofb{0mjY2DKL9j6#Q?mB4uC*q%_=>hzn=7Or#zuPhJJ65o(90f ziu6L9ARh>wMW7-F;C3fC#9Tl*A45>89DgSQFg7C_hErf!-d+1~`FpmkPT@0ro8tUfj3uV1I{VCM&Tzva1*5t zGW_azHscP)O4~csdFncydh`A%&_^Iaj`nUWV21))j@|~iU3)ZJcGTY9Q$8nk&<{4p zkS}nXf@1z{EKhsgO17hXrq*k5rHA>!yaVZ^$p6r!yFA$B{P3qW2~+@q z!M92;FHYY9(qMV{#*G_CJKc0;fD3sQbTBRoNUVYNmDfH{VW+VNwo5eKH?OtW4ZL*j z;J53i^dt&j1+zc`aNu9d=SW8nW8TXJLBRPhE-%l2ZrG9sr`Ny=7&SQzG-c=1e7u}R z?&v9S1bzf0DK!-s2-H^#8V5Z#I~zB z4+2C{xO4VB2h!SM;n56gKzu4$4g&;}fRfKLYu#m{vM10Re1CZth$X(1T6Jg`lKb(Q z+9G?`xy>6XbAnGk;dKL1iKgg_^mGH)cWe`L45vrHv_ObFOl0aQ8Ijc9SLc)PHimEm zX~EGoo6wEjV+~aUu`}x&cN+H%!|oVzPK~3ZoXazu!zmxS1b|Mw@>|X%M^&s<6*zhX zn!0}>??PwVXY-%$d{uyCHXAhuit)6Zc@R(ubpAr+rD(|m%24y`F`(Eo97n5P|Ma3P zqz*Y*WgA`rD+yf8UetBIKWYJRe~Vne28v!BEpYNEWP$%T@jUleX|zo-C?!PKiz+lG zsi4Y^B8O|)N~nKk1#1dm?*-j;S-GRf{Ey;0!gwvXbJ6E<#L?ViwE}&i!P1bp?#5it430MK%KHGA!&r9}*|M}kO zIqNGJWlwMQt5-C;4ynq-_~UVKjV^ ze4s}1n((*y`zc8(hY5WF>`4G@Pbf2vu^I$N5KO-IB@IESsAh&0QTQ$W6M#4#7sCYnNqCe*Uz3}8#QN53wdQ##qgU>UnqcgySJsK1or15LVx@7xWt z``*95w&||D4nA3BC8+ppltXR{_!T2Rb6W~SV}c8cNocD^!-Q!^)OQm7AXq0d4Q}E)t1=2Cx}f2E!RGp@ESF< z=eSar3CS1ne61My0vO=FtgK*N$Yfv%x2g_rIijHfgyLxt70xfWC@aS9dz?b!c3N}G z_d@FV+-$S_K(E-#sCB`=B^}Jf7+-;RV+zs4&~hxqFuxe#3!QYT3_j5U2R?xJ5j+(Q zN@0NJr+bhQMXG=vPa&NQSI`D7Nd5yq&Ns+WoXf)IsFS_D=x(JvclOXW;wrSTt|*sJ zptYiYsGgUTjt&$I&R9I_(x#{+=Y>6|Na>Lm&eJ(zko*tjG5z(IAQ$PcqO2_A7{njo zfZOl$KL;$Iz}dX6voucO-SJBroT865^p1La?h3S8!^MGa?_PX+r()3PbfcZ%+%QbV zAhIoBvnm}gniCEua56|N5-)`bj9PU? zeQ?aHiSte}?TpzJY8-baN_~3tISG@pB{-+}hEI;gXY36J;w_5YyVjHve1P0Adi@`z zxaxI~Gd@2i z&COu2c>8@9&#ACIxK*J9uLJgeTXB#YZ6bm1m|(u4XTSS~8`m%Z=)C6t&$}5Y{npFC z(i@I|L+D&aoNRs?Y8Da|e@(KYEhI7`=?VvY*~rB?pk|pQ&n`|;1GludI{TgoPUlcR zE%lGRnuGz&30}p-#Ax_-dfi$XeC_xlq8uHoqs}Cv`AN+exxZHXc>yRg95|SmAlNDd zJ+(}HB8t%j5GvvwzqfUcE`Z9{;)RabYM5V+QW+>yPOKoXo5 zVprPtMC;&&f)MA?(hGC!;l1Ui>f6wA2qmNE0+|-=3M;3+FA_8<-WQwfC@}mSdkhkd zOPdJ~ug#*KQAt3ewf6A$y7zqQAK4moqRUAkPbCncq8Bh+9IN8cKb8aqDdXp%zbBNk zjJN=PwC4R100?4!#{~jM+Lj4ynEsNLW`}}{WV>vX-V=h=qASU%_P=r&1tcqlcS||0 ziZ!KXWtHA>+n#M>eN~z8@;MyT$Z$Ly-i8eU9f#W>G_4!9WsqZmDvKbw$YJ=~9iB2G zh*-p{W`Z@tFWpx%$TMkh^qgI+r9_;IrqVz;Vz8nth(qIc#qitX2>1phvWmb=tjb3P z!0{ql2KFr;Cne-ifxC-dhE2Wu>~&i#-70!>R!i|_95ofJ=lXSM#2iD8Gf3D`J@Mw| z{;Mn%Hnl=&bq@HPrh0ycWL`nae~)stB^O+a<+PyfYVIne;!o;~< z!9}>uA%`GLl>5g-aXPu%tL%QSBSU99y?S?hTkIIK`lp}9$TO_Iv!t6^3m?u#a-@!G zF1qv(1QrxzFFKkUB5uoY%{N3>)9^7CdI$@B_#dA2uk#__|gX zi?H)p^4UF`)FK1+V7b&(dq!DVio#qT#uBH+m6bmlCZFr$R}~R0!;pd+epOUVI2BMOx%v5O#}os;ntl#TKMqy?-~(5 z25GABAXKHm+G8N&o3-`0-s~MX>+KAfx>l|Ia0uMD1khZU_|u2HxS&} z*+8((Uv=F9f%j{snCAy0i=;M4zT|G8z5&|Ouo&^?E9PJobDZD|)gu!)D^bPN6TmzA3zMYoD=SDoD z(WFXm?q#i?Ai_AF1WFIjn4TuDl%bOt_))gb8SNO=iA3>}2l~f=!YXuR>o!_!`}*o| z%(dmb`jdIF^Af{k7oo1GxtOw15OTnV66Ud14%BDIys?9S@AM4wB?0`zm+Yt-zziYZ zz@bk@h!=^f2COw0<2)C{t=L9zd9Cu4oqeRgN|sb#gzz)K-JxG}cCuUp}Aq}MdS zqIV3yW^hi|=E7QtQDF)IFF4n*3Hapbq-uQJcB%E*J$m``Q6BGJA`wZ!jXc+kgCUQh zewqi@3Ki?{h^DBN1s=d;Dy)-$(+!8`qL3d^;Ry#Ete6T9*}(z@m*3W!L5Z)L&4+tI z`#5s#e&jeoXWb42B8@Y;2UB9r|4rxF&tGM%a4+Uk?ECw_FB(}aFH%4PvsJ%*eajW> z+;p~V-}dM3uRiy#NkmdhP(uY2=d5l>C56~W!6E_!b5J{|BHYEKtSl3fy>GF@Nk-qg zgm*m80@c*;08a}mSOm3+leBB`H_CCckt(C;t`!^6FQXg=ojdh`@p7yXY>SZ<#(W8r z(ZWqu0U>JI$zTqO;k4Cm_SUC%5A1IgjI0NGHxGvYeEM|0!a&dO@jgpQw~R?!&b}@P zq*uPxW20=$1U;M;t2-u&B38iP{Cc#A25LN7I$@FGjlKh}NG!3cie2bj^IV@E(fT3D zTh1LQ49?McKm8?EPV3v;#;~pjfQaa~KZ076Y&=RYd-GpF6Ah2(3;t@?@HLSB^|{#x zG;S!3>5W#q-EpaLnOgHd5neHpgBI3HLKDZ$!~_fr*EN03pnA@-?W3G6uFj#>uXTR< zC6yRa=PL#W2ZY({jeb5eTK7-dj4|!z6}S=`___Y%$6}))5Cff1x+!g?^;ho*MLI}Q z&bw>yU0GPy6EmUi+uqfuMCKNut;|MG8oe%&j>e8u##gyZx`)bKeFu>5n95WCQwzX1 ziqCx9P&Mi4wYj)bG-Pa(G+HzAFs>0^)ocxGb*TDMkNvu+bhzNxqJ6=gzCc#<5c~Gy zmvOZJ46)3_nwTW!M|{opSA1;_xZOkMukRi25^rvQT?;70uS7=*=>LAw1f^=%-^We* z=|6chmlNKsXErP@B4D|&0#rt;@%!eB#_1!z)8-O2heaa^{YfiE&eiRUy@wTB3=Y2q*2s=Wl=Fed-3k5wti0wx06xwSM>6#?%yB}Ox}9uBcL7c zdN+c9&9jcb2Vk5Le9irz;IJAaupf${1>j#yt(vz(1YB+8jX%vl9w?jq*U72^kZeYm zWHaMAt7NZ_P?f)*L(B-~zfxp?;Ju5=f~5l%7)D#r{ZH_oIr^`km-jzE@6Rdue?NMN z7jtiBP%1`7RKUX-({o~E0CWhpdw4!J5pcXw+b5;}fDLoyaG9NafA1cbf|48v=B^26 z5iTt)VKn0dj#(nEpMN+0`epib>lam1z+q(HQj9}BSQYF(@-rGh)$WsX=f8l#jl-T3 zLM~6%dE=->h(Nl*KQ{|R<1Sd8o3x-0P82{uWs@!qUy1}lS4N!poGWl7_&*}y&q1~5 zfYIlYLG`5#9md`$;N-o3|E9E*IF^E2UQRCTI0InIpjyYkINf=eM?M#0cLBsZd;LSm zKe0_!@vuC6a4H;G3QA?Fh|&lTXC9vdsE*%jO?OwElNcywpVm%oee?l9>qj!S0YU(> zYZ|P{{W)>}0okjuAav)fKpb=%vw~-~y6wz=vD@spI6nov5tX2wC3>;v!!9=PV39if zH5|zEQY9z?{>|y#=l{C*iav}MZ*P6HWI9w-C!_m09+@R44^P5<@$Q&*pqHO7u9-ej z>AjKTP#ATgTT>s054{k;K1u0;sWpfU{b! z3jr2C%m~@`NO%!5j2<}ykeWADBX7XT76Cu|1)78S9KJK}?mT>_%)rFNRABZV)4`*Q zlflFD2U#434Z>Gx*wad=4i;&YI%bu9qN1Wfqoi{n;EG3)tJV)6l9ZR1Yb-J3vk5+a zCG30$V9YqfB)83d8BBQ$bS0E9a*K~deE*4YdjvWPET`(dRJFCc0mj-e@M7ihUIM1)Zj#zS#0+xg8uZ}l#&uJF zqkGDhfo8k!AYr^RI8a~8D0Ix#o&DJ-@&6kARxQxC_{%}w48wKEzP^#nD9Odm9YOxX zXgIT&y?-R37qk}KYpC7+Jz2wx4S^PIyWw=O664NRjhbH*aiqHU_`z!&Lp`>w#{&v3 zq32((wUQgSNO@iaT7HwCMZSA7^V}lj>a;K6k*C-&EZ0?Lw!b2DV`IXiuzARLJ2?08 z&Fyc#^d4vcU?CZf6xW1C#oGpx~+>YP3>I^9#O4rx_>qpBv0mh)K z%g6^4;2)&Qw!`5dQuqSQ{NaNKp-c&)Sb#M7?5o8oYFZA%lRn)LJUR~+)H^P!7?i(% zKgQc+deFyuf9w3(Qt{w)tun#k&tU6 zE)#X@zyBcr!;XkSwo7-Os}B}9p$`2VDB5pny%H^ZdpJ?!npo{T$tWcBQIkS9uKF9EuDT-p}TPj_XE8$0LCl$^gYhjSM-29bjoXr&?I2# zM@s0r%XR;Q0yAF1ak}jfS8~pz?(tpvSfZ}BhU8pT&PE^Z2WJxoZbKi`-mp9fTyv0J zU=3-xY&$iv$k`Pv^(ApTCU0$zFd3rqzst9XD9*9n7MmlRZI7+imqgds)tQ73r4<*r zgm}%(^^&(9K|)#7Lx0iC){=#OHgmLpm{pyc?pjPFc|w`%AZWSK*NWP`T4L`gbhnVX zIGp^oYs-xyW4y(ss~w3~{WqJPC!1em^}njybWD%CN|WGhVe@4*Kj(_zhpQ$rhO`8) z+(;kz8GTPCojvynn+cvenU+3v*$hY8{F-cqFN7t^T)*&KpFt5wkpBMh>A+k3530g) z6tk%JgK{Y_BW-{gX?RB%AV{ddMWW+YEDSO}NCtQ=kSKzl8S+i0Zvd#I;jw6@0h(!n zb$Jh!HNyz_Owi4uBTq-lpJfXp>|K&B^;c_;^>ft?axX()9**TUg|cdf9m@PVcqMB& zxqmS2cT@CKW42N-w0bjih|T3StCaJ|$aY+JboW)qQ7l?>@2^O?v5=~XODgo+@2P-^t{UFyj&fY_p^W&@aEYP%c{9ES1gfjt-r)fuJx6< zVyVy=dEN{z7j||WC9U1SpB+vNOXUnRZwh^DJzK^WdO%w}o&ILlUFBN9CLxX6?1*Km zbHMVkbNG18^w=GIv|%$rhS)X37OHLkOBb2&4ngf3tU)*8#Hm$>u9ydtJRT=K+S_fp z))`M7c4?22%!RS{VxJ@lCej#PtQX{>kbke;oE z!|W)VV4AYYEs_+CJ3IZuK?1IY&WzHv{m-fF6r{>kXsO!XFz1Yw^QIsOssQY~O=dAE zgOwPFoC}f(*!hCHI9}6C9p>~l(7zCOaPIiDDagq0bd$_|c!u#qCaZN>1S3y_fb}ss zBTs#)_Pu03-=n0UoS?I^C?$%hqm!#7r&}^}=kR1WCodiUDGiDJxhtMX&c*!7$(HBP zISHAz>Dl|AYLg@8O!HwljALu)bT&l|>Eq{zM&3Qr<1f?F^Q)7{j}mcAP!6j4t6L3P zcOfJ}Caxsz$9kyVCLFq`qp#md;It%V3xmLN+6RRTL(Oaj`pn!<%MW?d7j=^-!O&sJ zXVPyEa?1R+FD*8aqy#wC{;zyOk2P1a$m6L~)^+Bu>zKjCdq5gRllDwBaI0?RSrc(S z=;F$7@1m;6NpV05EPX?YYJ`7KLvI5XEpb(~r7snbaQp{TJ~MdPZ`uwdVLco7>0)Y^ z5}Fg;#8FkFiZp>^+t7{_?Ksh`u_%*^3AWY|(?Zvt9k@YOX>+>yT1sk33rX2G|Df@3 zwY!Xv9uJAlLz4VU9_#!~rtA>0X9{9=S?u#0yC-QpY;r!UIZXPdt5X3*J9ANWE73;- zYGl(se11sjsNEsjokB83;nU8BoQ8{uD8iBW+IC6V=BmOrPt-=eJIo z>|Q#wPxKHgy-c>P-4{k(oDHQbIn{qVBIUbWZChl($ujj)>WmMezBH$s616@UKc#$- zW_Zu~=TF9jW4}`SncP=P>VHPlu7+?>+)k`zD{Ixz~q#J?**(_mU>4d+?0a%tC70;v8*_3c^p+ z(2BSF=g8d)@%!jf)k*1{vZ%Omz2fzj)vl;2{a8^{dz6sJoNeYdexLH$R{uy}0Zs}W zMw=WoR#1eVi;}tcgkmdYrM}maIA?kN1^i2Qq{07|PlSmRKY)%f+^>F!MfzJ0ONt4y zdsUwCgTO>P-%J8)j{ex@=mXH;k(NnHkZzP+hf)U4den~<2{J<)7@+l

3)rogP|^`-7^4PRMoMpXPL6Hi?u@69Bg%%LWF>w(0* zDfn=F61)K=7U<`@MnyvHigs!El$a8ncr^Dsh)M&>D8BMi$a-iy{eJ6Lg5m4rH81gfmsoSe>P0hdkBol$%NLogW|UPR#j3{`(Pnb;)Yq z+8X#0ge`;FPorF~@98kG2olO(R-L>|JwKe0p#UJ)kgH4D$(PYNc4q+}6vP zOu+&2o#0k%6aPL^(_WjzgPw=I(-v{Q=$dB#v)2J}V6E;X)WDves+wrU2)4Zu`mob)p!fX$7e4nf@6R<*} zI|S5~ok|~eCI+9h=oIlrkJ%MApA(AAye(;#c|~3}mCu-Pq1Gupd9bO_lf1h-6o0ht z9Mm_cGxq{$9)9;_FVd&p&PGWPz-_lF{soYPosfV{#cNj$1XI6hLFgg1F%t1ZT4Hcm zY!(lor|SgDKxu31;zb7aC=qj+`L*?v0+p9i2Zo)&7F5%lQ2$cYQ**5a7L#~^g}5N9 z2v|SMj`y}43Ai%LRr?E-eT?WqEeJ3Pv$yQZNs??{_bOZ;^JymES>q&utp+W$M)9tc zdLZxj($kDd5ShlZeyWUx)r%fW$jHLEn78IKXfGVQ$20ji@;^3 z1-CUV8?K$F*mMs;`)fQv)E1)oivA+SWcWEghZP!tqTYEQ)P-7cmx&eqEkVND_?68v zDQwRng1ozhNIxrtYkrOM^dkFQpk}5_ThjQCdU#C*?6;PTaci*Od~okV)Z=WY7OkT1 zb`|=U_IC(u0VIF~82$41Fq3!={uDO>efROc2bs<9t4&qpq>~h*D>;pma~oDJqQ>nK zeHUed@&I96Rp~6O?=|pTKVTQGFHeto`+C&Uq#8?(TT{^pfN@ zqjkhBW{PlI{pNjry2;fKD6)11a^?kfUgbvnG-(EhKk%rJY+!>(E!ctlCTyBMSCWfA zp|@kiO+^Q6m1(?!!JGAU(-JRzTtZ699#hW?<4NduggkxMd^dlB{YV^YgP!5PXjXABJ6b0HXhga!r?l35yC52s8cn&obZRk6f@N(-5m;T^XV1 z(#|V)A*pZ{BHqG3J04_h!1Pg*J&^zwGr9=O$8!JYV}BcvA9~PfplWsRAQb5YvI1)G zPe2jqqujYTY-w@K16=lKRejOFtA2k6fk-i(SSAG$zXElzTdbYd?n1Oh=bnr1|Io21 zt{RCETh3sjqz8gJAB+mAtdmszX+#>jl#{Yp@lV(_o*`G#N#o<@M^J&wVZu-NBN4x& z_M5z&pmP^0u~lp11T-yFnKje?oZjQM=^D(zsDPPueC{PH13u&E|4cjo!i*JU{l+pL zOg;qL_8C|nEZFZ|(Az%^EaCw*!?q0SwhWj0)svpU-K-gc6OY9t74QG{FB-%D(gBg7 z0fp$dv2MF@ zJMJ1plJ5gZpg$))f_f9aC;zjbB$ouUBXBETgDK&-kC_t7H4aEg!&bfM@7!>Z!wB~f zsb|8H)#~r7`Hktl(*F~o56foDmE1Tco|FS)*Z$Yo>oM%pMUQ7-yFBXt{1v?Sjd!Vk66d-6nD@r3 zq6MrVhbrb5JOIByU6J4XXK%+h#?7EV0z30pYVhGE5|sduTmh5=yiYAV#H2$HnkM?Y z$oS87DFq%i7A{w%4&W?j%o#wCihkf{IKN%~sW3I&f>~PELiU(b)ov!^b@#${;(gfzzy1zWs+;1s$2kh9c)9J(Jqdtp^U^% zJ5_#Db_c8I3$Qn#jpc1V`glXh@1rD5Roim>zfDgEm>ww_(+03Mb+cu)ksV;|NN9<# z=J|r^5xjAA6j(xnChcb!qz&wB+MKgRwuPaP3(tPhg}5@%0bnmf9sd>#NJ5wB?!Wno z|Mmha)jYBEJOzX-4NP67o)mJ}F!KcfciFbI3DhDyWY5o}GU1qz)h|5hR0b5D-9T$t zAW5@8q87;Y=duSWY796oDOi@gFn?UHoqK>LW=_!%=o*}LmPWm60uNeK%gtY6c)JaR;PIf4VU^yA*6uX* z9C$BT)GDe6)u+c5##|QjzpHH_Mo?`(EOjaX)wbt#|3^@8XU*bHV#pbjghOT!aZ;p- zOPy^a@V9tZ4a-cjUbb3aQSv+DNe5=*;^w|{5l71+E#scN>22aqK{&KCxrqsGw1<8G z0!;)AhxF+$`J3FgfK1q@+e>%p8i=Fz-dK_W@wthRe_*`XcqK)5LS)err)kA3F7t!W*`}^&ByqrQhO{-eACzmZf~PmV{*Ie|o8 zm&OCh;11k;zJP)Gfi8EEzRBV>`2?hRJfH^hzWP=V696e$!?IK0ZuGluVK*qEfYenI zY`sIZ_lx5dgL}!FSyjNQ$rhE&8*<#Y z$$Jo!fQwKYx@ZP|Jhp+q73kJ}R}}MXMeGQdS}62%kX);HMnX30a}E^T6Z+8VhKDsd z5#EQpEB`AyOaKKH7s&f^R~F|4`nXcKAI=k#!>p1c-*FRB8GEI`wWaoTtDh%F1H|gq z#lvPGrtSo@dT}&T)BH1)%`Oj($jAn&ZubG9(N55_wC=NyDAN}>F;z3(5j%4dO%aghN=bpZ%Rk!kCU)5hGMN@$Fr z*NC+nd^Lr8ILC8P?6mM~wB>>v80_e$g$Zs}4j)`fQPI*}Y{LbQx5sP}L22|V$#xI~ zFqs}AstH(%<~&^H%<8M1fc$O__jh}1uL%bcJEgV%)B@z+;Js6Bh;b2;JtORwnSc34BA-xa)ZHinqJL&;!MKO> zy`ox6!1^cwEO9BYtx&d-pmg8gPzjIUPms9RiGz_VV_Y5t>m)%>mEFz~Rc|`uLVVGX zeNK>YKv&3qp~V+a;^zdhe>rtq`;-qYkv{s+?=Z~(dqYU$8kkF4qszY8vQ@ucKEnX+ zb7c#VCeITXl4wW8TAW!U!jv6^vL~8mViIZ?QN$Bpdm3s~e>uzmn}>8f){9G0b*`j% zk!I%p+XBg$d!}$~T$7Y2db;>fr-92>H8V}=X5K~z0Sx5x(@&1MH<#6~2%O9*&{dCF z$KrL73`wA7foiDYk~TT`whx-pBOq~yXK|{lCE9n(uLQE#brihahO=;u?npLp zSum$(nmkT|D098ClG^q7WTHo5qOC>!k;DGQ`l8YAN?vooJnJTcW80sT z)Ss!i$hMDrO_5IEIUZrk8=ygFZ-CCpSv}M8zLmnvOh12>9ZARf?AFC?lD6;8td|;R zqR-()IUp2@W`m9~OrDJY&MG-JG?)H7`jp1WnEJP1qkn+~qK}}0MCJ{YN!6z#M zNAGS~2a!Z4jc0#SbUpCqku(e*WPaJ+NltdYRL1+WC zr-Pj|DFO3pA-*zs?TaUc7Uxe!62MuvFrN2P^m}z%8YyH%JDawPSp6wUq$>Va_t>2D zr(fW^nQ`x1pB>OY*}VZpx*gnjw|MAy`h_?6+c(37UEq4=IwE|12Y{!k@j{)@XEBC4 zWAJ23vP001BAW6H=Df=z`&4i+g<0k97ATF3sFOCLXglvLaC7G@LE|_(B_shEJGUYI zLyf}ID59EiSo-8!qTS(hhM{}OY|)6f3!67Bj^qz+-1wegpM6MyBI?2`Q;+C(%BIfd zJ;9ggl9Z2he|ew8MU}Od5!>&;@NLi75^dWlH}^Pm@Q=h+79L_cJU&vy~+c%hEJ#&N>+^alwqD9kx9wc_~KF+LFZuVUDNV;rH&D=TzO zFhTxkmSGr|03l97I)M1XHdQM5kFB5WO`(EC(#*WaKTDE=b*{mfi4Y9CFL0$!S(&(< ztwqu!RZkzU+%^Njkd9+l@Rdryi`XUVg)Smld z*2qBMbg<`~{#q$lv*q-Q+L)7uDSqIR|EzMK|C`47+_dVO#%)GVLTNQg^30=QY-YUq z@E)EN?M3Po!SWg8=U(*`?{iyp0@pJtDyCZ};g)i7%zk5P8pBe6k-_C=rodvQ(_uZ> zW3Y8I^Iv_R>1(yY*VTidb_wfKrgnZ|8^f|Qm`Cg94Un}x^@PB4H~N&Pxsn>Ac|lkz z^-fe*+m7txQi2rc#w|$)DQ?`F2n}8KlPjhFOyUk)|5Un2k55xe0$C<=Qn(gTfh!W{ z0sJ2}W`Oclps%t2b~cGXnu^W1z%#l}&-Z2_H~1s(T5;v?Jb2pp%`TfMj~Jc(4A+jU zgTa=!BZ5~Dk^gC%N;LUgnY}lDD2XMuQEh?5sy&_7;__s)qG(mumyMzSNZtn6yDCk) zDs`JA`KT5Yf`x~yh?EVNqIwFWe)Qe5FP(PPjdbyjb%K4u3I|;wAZ<3f8btQ5I`sHH zW`X#zZ7Y$rsHcRk^kHW+bdjP|@mmahgOOTV0vY^$zO#Mw8AM#+O$tX-1GgE@23aTF zF?@!|v@cVD^lYZUj2})%8n5B^YG%ojnTvy(3SKc_iB-aAwbt?>Wv2@c4nSRgtk)U? z`e=k>jO0yPug+MIC-s8lTwnN}um-s1^a`eQf;DeLEYd#mKcwFcwGFp1TjPTC$j?%T zuucV@4l!4m*fOJuqm}Ha-KTE?GfIB9I77H7#(9z@CYX!kFT{&Q)^j?N< z;|%4Y0z2}Re05AF1Xl8qxNI`Z73Jc#KU}cX8+v%|M_eRDdw|BKLwoY%sV?R?Jcd36 z6SeP*WS7j4;k;K%J{nw^s^zfExYR~^hf#yH-ZCee)!sZIa)I^?7%OHi>ClGvC|JjT zWl<39!IthI)jgQDVQgy0=Y;*FHzO`W(xrtYgz79J$)KlY&&UbGWqq#R7QShLCtX=Bo&hx*D0^5 zAuH!Co;ET-R>{=Ib>!CE<-N^Kld5_gR{0e7D*ao?m%8v413@lvK2kup`CRSWp-Dl* z>mnXB5&Ov&?O=tnFzrH$ZEc+TbT_-iE3Sv-$H-UO5xlpKzuVTLOOXvCQ;v82kRxJ-duzBh{?X%-FB<7i|;%5LdG zy~U?%bI_%a^P04Ds7ZinwtBSa2yU)%9qcDJm|djK?bt4wFGlDFc6( zxc7ay&s|<5Ar-9E^_7gjXHJCA+R!jlwa*AreSpBQt2r>q6awDL>?c13OG#>q*p@G1 zBs%UOz4sj2*B+?@PH0v*m%0`UUP+)GY5Dcl*6$h<9i1umr%qp0-?MF?cn<_e@sI4-v z=JAZNnMx!JRXwbm-kc<#>$DG5l6m>-agV~qn}MTQG37L}o7b-b#ww$#{vJ zWug|b{n1YLsci^YLH?GjNJ4&B(nwx<(fhc!102F!DK)C!-!w~dh)*Nn8^!m9132PB z(zsVD&THw6vS8PD-(y)+Zr`{z{_+#8Qr*s%E6?J1`6g1m(WSpnxu-z0TIp0njoA!Z zX63p~b8G0$zBeSUoy<8Ty{DmvGA$*KD!b|IWTa~{eug!gSFe3Z3P9Dj~_*OFWqcG`A$ppNNzlBbeCDOV$*&$ z3aC9$(1;UZFn~B(%s$m%HDv6Pwh6S6reNc&!MA$7G}qcgZA7av^1Zw}iC`Q|=D`OW zF{j{URTHGF+{B`iRYMQovlm>VtcI%-fi1*z8kJp-pyk)o58fvW#%P3-ZaE$mHT$&}8%~B^93WY- zfryt=jL*1RQXTmKxq!|jc0x^uOmBy-jQT^84M|7bkONuf1;nEl)atH19D{W2 z{9~d{BEhlEGmp+Ur_+_D8I;yJPMpeA=u8CY%cF2wLMQ{c-VgODRCCCMF4et%-_Vf? zf87``+0*gE;($(Rp6Mltec)kZD)+m)&A2=d^k`bYv}{iA^;gb?YL%{~@d6>NY-WIqbGas1g-`I7d2}TiBR0 z9k?P?bpJX{b>cuF9~jmeY_%bXOm5Ugh;bRPRPb!ljcYYO6&Q>rW7}QMp%xJBkyRvK zgh;9FgRBF|cHK1?)ulD@;CC;ZPo8C8DEd0>^3e#xayWfELr%2DOwS4QXbJ24 z3&Ya=wg)%Z2h*{*Hff&p>^$(=zF<@!o$I{(&@R|<%D8#k@M$A?DqK}zKIe94lxHWw zB<*&?r@JBo8@^CK?_IVm!L%d|SjC6rwBB8%`-RRdF<|?J^l`Bk3i?Ts*(Cj3&cR~BJ}Jof`1R;&`I1&QbKQ%hmXV--PLSNlhNJ= zh0XKtpsFPm3HZLf<#PuVU4L48XS%KPi>H?O@-H;_SwG@ZFPbDji{pn;?ti_VmLM<( z3y~3C(Po=0*QVr$B@e(}7^aX%&8p)VKb6?!t0GM5c*7aR!c5v|B>r;V^xg;9(ECl? z?{COqMvsWC)P6BIN3l^!YY-a^s!}k*+w#_rHAI#etP`9VSuePHl(9;GB{z+YNxZ0L zAV3GilBlP(l0xv&?3YgT6i7>$(*w3kOXUntOEtELl}vv55f+bB{?-heS76L*Z<$qV zv=HlY{bXrK<^Lk_Oo0;Vrubv=CfkdObn4Rr5+=h^Q~z0sP=CsqxMBU%6pB?|oA9Q4 ze%fxWSVn1$+P)A3cjmMO$dDfTsnV=MChwFwU&%C~xz{mA+n91!sqR}yCy&Rg4r59( z3_ezIxYO!n4C7?W&)0GH%ilh3ROLbkt2<4`gE|$VYmnsQnw0S&{DE)UoQ7o2i{+M{ zqGdBpHLCG59!nW*nDDctbwtc+y-RaIQrB5?uA2-I0i!U}RLuZYJ7r-*b?&`)PqJqK^|R`{ zEZ<4DHx1yFbIrlwydRTZ44`=bSPZ)EJE94F_6(1A9IjEyezx$ci2cCv&Q@M9{rsCn z1|yc@`{J5eIs6QY#5+Dn0Rh&GZ8t-?=3AMq$#~t;I=I|<*E}LFk{zOta-W(&8HF;U zYB*FM4gsflKb6v}1wGqPc`x^C@VU4}^G0E-`i}JOs>|y;j z)&tKQCea9KJ~8Dz0TSg$40kC_RQZC_?k8n@uep~=gG?akeoA^T#eb2|COWwM{Z)^f z(BraEO+VEJL>X+;4FYQYn+pQ8Ypqs9s^x9?IMi;favWS8%+v(OYH}Lyue}lXbLN*e zB+5EqQmka+A?}Bb3WTkMW-In>zVYe4^PH?vNu3#_H6(79ZS;7n4_PF&IyANDlACaple=2RKXt z_+XOc$Jyg^QOd+Q%qJihrm!WZabAFBl=A#e5gpB9n&|co8XJW74pak9@m{A*hc-&< zq=P{U=?1Q(VT!JLi$c6bBTmsQS6Xf#$wvc~1leF^Ca;V*yHXc5s`iaQlFkS5A$|)a zfxd6aN`>d7)Xh&&aL|+N8~+X0z)ZHPB8%g08zv9kzSVN_v*bEU*nQ&1y$!dMdLBKg_E9wH#J_7%8mUOsZoHD z7rlQxhS|XmU4h4-f1rVwg6>x@7vA z=fit?zx?&}aRhA2GYU^Vb{xM0Lt*7U0gus(joJh(-%HHXtt&AMR}w)91|aJD4x{7v zkGp5$h{8TJ1&p&DR!_S0Rd-tEd^!8H^G@Mc0|wx}s|>ywmtufnIq!ypwa+NNvfT&J56BY6IB3 z-*+&EZJG~8ZPU#tfX)9yVL20?I*Db{ ztRHx-Us#+@j9LS2Qvx9BTov`EpAKvOMJfF!p>lRS6awXKW-4g>K!@qjw*fVIB4GQ1 zbpyT@XCyp%=lHY&!+&Z??f*FXts--$VnEoW5palQz&!p7z~blb?7t1t(FXJ*pna$~ zjxW~rCo!$DqH7=D2~eJ)(g8by;Uk2u(#*JScE=iER_$+Apq&wMFir;xG;9#;SBZt6 z-+p3Vy_1+`w_i~EY|Wr$?ITLT?ALuL^yyc*odMTiK@8zqi|*yDNR$CKHT=L3{R@zH zl3*C$e$aSe<`_;+s5J|kW@3Q0T{^Y{F1`2Wb8bDjwZrD4`C`AM8@RebG3Dn+WCs{0?u_R< z_JANt#1I>qjg1Ql5?v{9USQTjFAU7gs=27$0Sy`-FFf(MQI)ZItL5^7YnP4uIk8V5wIH~V^8n6Oo#4`PQqb9|!YZi4Ac%GiIW@TqNeLQza=Z!fb}~S| z1Ydst!jfjl*f+r(;3>KUNFkry_$Lc=m!j)rWd2=U;OhER zvkKrB)6G@U|2@Q6!iDcOpiV0?F2HA^f)1xdw!mnLg2iBiAvM9w`HTh8u7$UpPNC)@ zAx8=$qo^QMfIHqpZM}(C>vu}V%`t>F?xWAPZ?!)xV3ZQ{Iydn$@Sn|s zJw+rChq$LPEdv;T4L*Maj)AGW5^FP3(b~G-K7&ge@cOjz!U8{#d2(0`6;U@lVr7th zx*0DnPDWb>)2Ors2kse3WPWARCwX_PlVN@b*ia74_YN8QYg#19snIjyLRU8AQPlvJh=V(wJPSS%E~^pmf+MDOA;{ zqr_HqO(Wt3a_CHrr8>C_w#43{)0CWD)P1vaCqnr z2pi*r-i#*QhN^2ssV;6w}RTJdthWI6p*8&YU!yvKaZ09Uf&@G4G)YaBLXQI}#QF|4!MDnKEe?-8#l7|cA{`iD*|9!AyuGzZ z_7;a7!Tj_8WADwwscgT$;W8AGZOjnctjIi6MCK_&LJFC(%|j?6nJPAArfr_eJe0XI z7nwGZROTUsB0?zSU6;G=TfgV~9>3oo&wD(_bG-LIj@Uv1=+wz zD|Hs1mDdR;wWi=Q4xfTfN78Kr>ea?3r(&hK4%ikHRkn+A#EfP5Vba;oIML zDir-WMRy#joP*7NkP>E6ya>_c620B3c8BIxcIeV=)=f5J0?EEoE78(cp3H?{-81dY zlMBnbNhRCMY1`6=2{EA@^~U!(M3imWujC$)9bxz!Dwaw^Mv(Yb>n5cfXaAdsJ~WUI z6CzdF^eDNdg~0bvs`oqwwk~`VNnBz4jt1*b(!24GK6Y-o?_=2JHrcPbNzT7A1^P37 ztAb-PF%i5U;vCEL2VT;i3$mR$K*%NHqqxcu;^jwOz-4;R#gduB5AwwQ{FXN$Z_!zK z*PmNN{^QhvE|Q7sNZw?Uec>~bBkeEKJS1*L;KIs=|^T?@YbeyPh z(m5F4k~vAbQsVxNSn^Yo7hcD^J*DZ#5Izgb^ih@_)JF5jYiD0RZAl=nx&3_u)>6E! zu?ah!%-wQx_Qgdu;a|Lfu+b0p?+}^O`L5sOEmb2EAeB| z?v179JU%Yg1ntz;Ka+GZ1W9S+F~oXGcOW627eOlQ9`*8tr~>9a5cX08mOp1kTC|nU zKR=Ub%UO4^u2VL9X`?D?>&~XuQe6H?pI_AnWLfPeG`j*bYvdBa#St%EW)$@uUyydV zRvMT_>(Rdmw(<8s8NfAPcve&(D)4))KuoRzTUORm-Xo6}r6dI$U3RbIqea3z*^^Gz zN7zJpgsvodEJer&Dkq;K#NBjp==(8y*C1&9`!46e5HVUySDxD>=)kMY#6n zavqPU2&p1&>N#B<;el_HCzh@pNxZwt?l%mutm{i%lhwcudJJ96OwCbE{(WR&E6*Mb z<@2LrY(H#8jV?rG%?4j3vN2K^(pKUToWGo?MAJpLfzH15)N1G>Bt@#E7+IB-^kDj* zx0n{SW*98QYY)7gt(c#*us@8Sd_&Lt-FtHTk%{KL_QnT8DvD@|n``0srIUfUBt|-N zMsvwZ;irE#ZJOvLJAT$H=sU{^m+vPS=QhJHSCiFoJ=B_$HEKo|ri5R83=DiO;dc=5 zTe9q3fD=hP0Rbjv-fN+wJA>}D1G}b`++w??;+;{!gwKZ2xYH5TavGFnwFOy}CdHXE z?|CuK>gCm{-nPloBSNT__Ykyzj+ILKmXCsJK3 zdB1?tz~JZ|$afumQWA@u`>KkgS-=_uPEAQW@Si)2J@3NOZ-t3{E_&bN0k6q>!EEMN zat4Rye+;~@duJxg*bwX`+C(W7`x=K;wrqFv5Pdh+vYma)-@-BKe!LKgZzd>jUgKCb zep#3zt>jOmv3d`q?#x$H)@RS2W-%a`tvqFM&Kb&IxDHKl&9_KKsshk!xKwO1=$W=S zba0b8>#eu&HwPfLHQosJ@^v6>Ml(KyVJ$_D(uHC-H{$1XMJc~8g$OM!5mR+8*i^Qd zOI9i)22BG|W)h{<1~d-UM`E|8R-jK;Du^7y1*~DH=CyYSalsCCpllY;{BKU*1}1TFy6&blujNbecpubZ=4iwQxx4; zzoNaBIj>pT7K$-s&N+6~$bs(?elIgfK154$H9^GETcW0PCX@TtoK0|d0O65Y-PX{_ z1{$8{%)W{@TOV=KM0c?LkS|=qKN)OO{3P(giGPZH<6^0FEWd2?K73^VvJlH2B?D@W zZ~bqg`o!ueDOXrZn%)uQmBUHb6ze1MjCF#5{du%&^GT=i?pS>lWAvdg-l0CuC~o}R z?e+jx=@^%ZTKQ(Ty3BbhDVhE!Znx{ z^)63ZsWLi1yZOX|Or6W+`i_+>rQgeVGWed*i`FkwE{B>s&Z)B8_bF*?dp{@AZkns9 zt!HSRU{yMOe~m2Acj+hp58sJl^_r+9es!LhG(wB@;aFMEAffB6`qOLsz2!u$*9k&t z+AO3OHPB6`E#rlPg04Q*d_AgYdISO2&LH60-5@6fTtgtT%T4#OMdRUI%aj@NDlFUg zFbV`wZOW@GZU^lep;{ zB@vZiTP=meRx>qn>ODk<*7=tx0)i>oPle9W;N(QrwF9%JE~#1{*y4&o!cEf&HlWBN)T3NK+{-R($!=SIul0;y3;Zf=k3i^+c+` zDNy{RI>YHr`Fzoe8QhSc%snw@s^dL4Q1@Iu>!VB06D&kstCAr%#3h%G!ZnYN#?BAy zv(#SJPN;8HY&ueZxF=5D?k4IuPjunu$*ty7jFPPkT&p(&8kbw+lc%|VfaQkK1K9&k7zf-~&B%Tqchn-h;X2O~xB z79_z#27&zCTnDB1RcFUk(uVMMX)s+mKWI~AtJ&tMHDn~?r@k6RS`DH6wOcMt?|Y8_ zT-0VNx@~gT?bv{1o&Fe$>PL$Ly{O;rn3304+A&alK$1$03_9JaK&kq;@t0;yYNJqJ(~!(9gq*)qUD6v1NH#S#?$2_x|FsC^zyDY| zI8|A3rtR8~Q-EH}7kqV-hZkzt?z3hd*ZG6w4|RQo@{x`YU;@gB?72}#5^W!>LxjS* zQ>s<7)P5heQ+4uP-kxxm&H6#=Z#<--??6$hhhGt( zmd;2g;C}ToD1$ML%sTlF;AtrsYzZ3js9*nz;fhK)N%7PpVg4FH$Tvn^qe^sR-RAg^An0u z?$&S3U)gd;O6mY5{5(-~emVjw?cza>cmgoJYb}My2UG_ZE+d$%%xd4m38|_rc>O0K zMrnVgOw1?YjW}&=4I0e zQ=NqD1nM%PH~*#%k#GMB^%yeHWpov(#^_z83^QfDQgo|iHap4sa6D?297Wf#Q`G{T z%Q-xY=nG@3=!n%lI_U7@t_#Su31(`07R(|wY6qr2dQZ-2Y8)w|LM9CRGSG(_fbgzn zm}9BJF8VDUmZ@>TLKs_X;bpyRoF5gxAS;=S)&O@f@_j`#7MeKwAZ1O4xc&z2DLpNT z^P5OD%wz4z1ty0=DuiEJ)st@HXN2~Bm=%+cCU!+c~R5xmf;tnQU)u4BJBgUCg$bN6J~iDaS-i8Vbn&S zeL>M>fH;MmE}^(l$enxp~NocK`8(4ywzGkqzRE6Q@wC0mdeVrNKd^7s5wiWj88pxuVyykl5dgZu*U z%Pw*pzJg=~@Pp+sSmg98oBH0AI-PKRy`c|EAKuERJ%RcGbLr^L*1ivT)EATTc(04G zvG0FXa;iX5*Jb6R_YuTi2}#8b(4w=K9EvJpvCpW!zB9h^GUxQSJk9VTsJF_J5dcCo zQmj@y&8&b5NM2pF(~KiASca(yT+YZxk(OfErE!4-*Ox9ip9pRyfb^bV$1>T8kx z`IUc=+N+s*7$NZ+o>v~g)lUQ7bFLCj4=eoI6Hvj^6i)%s)m zmbBuF=-1e%Q+`o*_^DnA8LL?LR3bHH{p%Qhw&?!4J*g=;4k!G3$yjON*O>=!DKZI` zwsIsWB}2MS^n1(62W%c~o61KyKkCW{vtR9>zJJTnnxBeO)Ri#?W68<>Ms!;ncox1G zGvwgg5~-al#g_`Oc?$NFTK)7Mbb1noI4XzVH2pkL|6S|&E2_KDboU$4lf!4wOLL;f zBj*9tG~!ueRFvJCJ=&x{r58;nbQ%fj5uUw*=%~>iY;eLz&cnHN&aPQRk z%+jhea`G+_F&#rC=y2$@53LnDCtyh^c@~37R!O*S?+;Nr#KCAe%%=$DZ`}=BKPZiN zDhr>e$|1G1fjEJyEK3>prKQLG2}?y>kn)OejeB1E-y9#KBI}Pw@;5vbevnaXx&V7! z^DY#Ti6d1(FQG;(nWaH5ldWcE6seog?B$S+Vu$_$kIM=b<73oSczY^0cWCT~F=S4F zYFd>=Kr07D!;c@4VmKu28?(j2L87jRyUnzn& zAX|ziFGiS7Tllf4Ow2J3M=Bj!E=pHCUa@(f_X;$GuuNAl z`>28wh6dOCdQ-!7R_`18J;#5xy%Aw-l(n zT1z$Vpzu6xb01iR0Icjts6SS9O|mVSs|yD`5;PzAOdT@|x#IKLxS#qg?$9(|#|dwC z0)TU4a>VN5oSjl-_4!}`v3mo~x!EJFsqlq=J?v2ft z6f(;w!W%{`@xZ?vOfIDm6J;5f91_(ZTyhWBN4v2$vG*r_*9&1BY#r8~0wjpBaZyew zI!tw+AW&KR#zUWEoJ@t{?F8G8wGCqNWCXN%@c>~TAUdTnxg2Qq@uq8I=~{r5uvhRk zrJkz~u10s?T!ju_9jPp(Ct@h4O_V)80nhyHx$N;ba1pI0wT+rEx~lQL6Ijr8Sb{s~9eayFTxM z1}~vRB3h)TE;@}ATdodqiQUzd#k5?nTTapZ!mfDq*9jI$E=P2}Kw*_VAuun}B&1wX zjlH_hIGn%ZCi&fVMVyM5FD14qY8q5r3{8_(zbG=XS6|FdCQ}G~{4cF|Pfo<}TZ~8sUtm}s1+Esy zCN&|Ki|?#R2}Wpu3uWl6W!!gF*vu2>S!dKX0{TJ((LT)kzhD!8;HE=*C-0#|^|58K zG8G`CjuH3#CBV3o7E+CSavhSET#-j~jJ@JlCl7~6W1jK(QHEH>R<$)gXNaT=5|<;V z9Ui=LG?lY|S@`YXL9gKM4@7p&)EoG$+hYH5}ou@ zJKzqLKq4eJR-Y(pv)|O+G=_6&6fy0eGAPNKTm0HMGtNuTP#=P=3IWJVjhS0(iT(u9)=H^_&)T~4~r1W8ZIk>WmZoEfWo(?h)23od=+`+amMW%xH<;T0cQL?{lVXkVK@}gd_f0#Ci@2)bAtj%@%5j`(sY!fWP=1De^W=)HIVe882y49CcU6q# zR+G(m!*bU+FGfaJ>OS_Sh{DFQXxxoh?EFan&r5#=sKP&BTR-d?I)!+!YD6GmL`9{! zTE)F_GW2$c&67`fR8du%Vrf-;I_F)=V15lu8yoeWw&sAt!$;v@&QvT2%>eJov!+m0 z^yx{t07a_SW`!RmHzh(unn}R{AW~{(C*^HQ<}ROI+>d(^y`^lx{D3Ot%wgR_Z!hv2 z3l1C?U1`+?wcRUKv)KugfvCW&W)jIymLcMZKd_9HTRI%U2fh(&ENf!tyD6fW9N7YHWm2IW*U>=N zgppcl?4SA{TulqQ0a&J_%zgs7q!f#2MA2I2&fz@;Ld#-fHiDU`l?64EHzgwAA zK{;NZN$NX93M8F|0Kyv0cgucKvoj42Z|>aR*78%)H7n=>4sXwX903Pg4E2E@xibwJD<68fm5G(k?Ey_>JQ7BtPM0tOGBJ`0Alazwv;R)}xxDdnA(sry2V1 z&KxUkv3@=MW3H_0Rr5jeC@lZEY}ru4CU?G8v&(lbD*Ko2=LEkvnGD~>c(v$^QFKR_ zDfrZmg^SWJ4hmwjIqH@Z%HiBNx3ZHW1hi!f5UJ1fV#ZJuzd{jU)Yf>%=jjG>C7CfJ zBi4&bF=$YYOo1p*Vjz%IhUQu(b97!()_rMa?Jdlqr3jLyUbRn|k1^HkM!Ks^J>=|f z=IgExbcqhA1o2L!{-jvtk8)By#GvauW+9P>>XkQ9d$=h&9pHnp6W4H+jO3vcrHzvN zzEMVx{;G8J;LvRm9}0_?GG32@PX*Rboc*~c;z9Dg$|74IX=>f^7*2Q0=PTw}q(!v;puMBtk zFmeu+b^J{5I+=WK+-8T?AV)9-^?Eq``vC;KB3DiaoghK>BFm5Cw#6(VGl#=gy-=i~ zJcx{&ZRKCl&k^eJ=gOMg1RqzP<6)UZe!4WAhH=)ovi?Ys$vl8qs@^M5R>XPeDcO@(*}uN+*Por|T=atwQ3Qbd^F@Z0h-$tZCkYbPhXHT1 z(!s}PJdnP$N)RBw_!)#Oddj5WSr8ov>+IL^y4d*KF=jU?DI5f^WJxk=48UO+42a(q z4F6x{u75SkepwqB*T14|{~J{7F8wH>o~x z>);<+dx-wkF$UTsM7t*l5pO~uVWhwj+PY%gF$w+BdPc z(i_Ywi?r7W%`uHgBzXdy*?hYO2<@>bm*02)NtFxw<`|w?Hmez(9K= z0NIbS815`-pPHxT2l%w@$V9B3wjHT2fP?pd|6kL)qmGzGA$$xWb^O&80tTcAC-h-z z+iG6m7evbmOtEX=SV2?gB#gmWfx94bPT`RxEU%I2azfWlp6culM1Tt?Syu>Bk~;>r zV{2N7(%+fP`5d@>lnE;CWBJuj&t}FLi2@DW$r9R;ha;&IgrSOi4?vt?f6qtJH5q+) zvx4>RL7v^S)f)!0KiVO>31vW z@(_CpmTz&QCB}XC<(8fYmyuRj%@!DPz8v@+lr9Jb8KFPBf*O!kgDaq+^Ig(4fc*2U zf7jIzpab?}_L57e${1{k=9yO`zpnmYlam(2%FlC2G{N&dr8k-#6G}wVO z$%!@at}neumQ&Y(6e#w*E|@v`MX5D~{@3!U62@l8e~o`J*?n2+TmXlnO68RYl1Y|> z3|^$7UhC-^AWu)g3>_9agrVceO$EI5DX1c}Z1f{Jf&(Cz%0q!4T8K=la(woU^MUkS z;03JDKMMgBzcWCA3P(FEAfj&OY+xITQUHGVAqi7ZX*m|u!G%FJA;M9I5N(sH(lUzs z*xRy>?TThfyH*rt{|L-qO7{{Z%H#-!xpf@8;^~8tjw6>qH1I2;%O)+N=JDay0YL^x zJ-Fe*P8xmCfvrFH<)OXP?kCv-G-`3x@=6!XTged}Z{#`rR=$w$AdFf^su*bXG^1FO zZ^>!mV^ujPgahAN;fwY^O~6`ij|~$1VH+V}8``f+i(qt*sb)yM)O0AZ-(`7q<{aX; z#S-@-2Bmtn#!G1TAFc4g*FRQy=L^Q+&ekoqB#b&75+8@PqytIQC6~hH)U{tp*@f)5t+S-$r8`&dPSs#h>S?%}CUu%C9aJC})mJDf<~^!J+l2MxpjK7EWN z)^+~<*niP}{C7hBosfTb)?YfP|NUNo8*dTPEFplwSu~x@fzICXwhuy7E_IpHAwgNz zLBV5xxOle_Pk`338j({D2Tx$!>B;aRC?RDHGgQT zQrn8dG5fIb$~2tvB0M^$ywtMCkkURRnXWpsBRUF7iltpTEzqrt6{r<{JK~uwAf8`!cAQTDr^1JzA_j{%g^1=C3%(Ih(^J;TuFXG#hagRg zB=7l9E#{%{V^7tSKb{f>o~r}1bP~8vy{U5ZP?~-lsk|G4ib9t83w?amEdCnxTnwU`!fHxe}qKSSK*#c+~55XPW1{N9StuvxJ{)b=P>Egll9-1fmwVErRqfj zKNz1rK~Va?eXCC7tI={vK%DJOL}nDonJkc^oeh5e7;>j2K%;^CO0%?#3@+NQOMi;b zrodG<%h~V~zSUA4*3zYzP>%;(jXv9lVWO$GS#Cv_(mjR?9i+MghnHQ*RnnGR$kV+w zc3*wH2oTWxylfU`bDp$U8%^PE-VS1fhYB85*=MA8yOvVOI6b3$^vE<*dX7)~*dL?s z0*Ttyo5AzxFa;LK^kXPauaDi{Dfwgg4D^IUP~;YY$Nf)VK-kax%+K!FYb0cHg965@ z4Y4JMJ-{onTuAxDEBb?9huARCkAji1lqSa8{I03Ma8d;mzC8|L#FY+Em*iwRMq~>r znGEMx&TkYi728vl$ozfz!fBCv9PF}U!tyhqJtN5So$L$XB~%Q|G(uRL_1X!+yn0`u zq{X$XQG{u*y-|cA3ny0eC)3{>EDn2 zJ0XAVf`2XK-@Wkv!CnYRjozt%M})V(!rhO$3!(uz;cY-X(^tqq#L3&`mU(s`#51mN z-l0*&!*ILuX{FmhHzjCggfK9T`(n2#|<0)3UW|cLXU%K-I3O ziU3ssC7j(fON$5{4XBK~h>E@f*NFk!hdUzGCa0qBA#Pz*D61@pMD2=IR{#=_qDCAO zP+}XvH-_*e9)$|))TiJ#iQWZCUkq}S_HX+Eh*i2h#e@^f>1YBtLjWYX@BU1S3p7L0 z91f0#kN@#*{!;(w%d{Q50I{(Bj!?Y&+w-nKMznT30jmDyc5c*Ib@XXy8sQ28ugxHJ zPG{^`qKwFcmw>J>jtPZ?)xCSIr*==5EeV|FiUdw4;NChz4V2)UvsrN;0LuyiM6ZZ) z?ED22iI2dYM6`u1p%|NAVgo@P_{ERb{@KTZAsUFrdlAVJ^Enbg2TPd|Es1c1_QeS# z!o$s=UY$t#d^6h0*8_0Nrh>=79cU1cO@iUMY7EkL0gzfgZD`1`Bhn6* zkcY<|c=LHAu)Xn1N%lFMBb|MVVOWTEClvPJ81m!dCp>4lUx_286<_1|SX!GOIh!Lj>(%1|Cq# z;KUZ73=32NY?=rT@JCv);hv4Mhava(frHvY&_-g{qk_27rLXxTM#^vsK@2e{Kv$my zwz)>OBYM3o$)$+&Fi6%L+rNWNvDgh{O3%IJ2L;6VTnY94e`{uSBd@^49`DOl{Z;gBz=>amb zIUpcbeqWwGGQ>DPP*Da2T;-Q=`~|wq@w#sBDbYMYIilK2L@BrD*N?vCND==%1SFaI zY)*}e#KBe929^dY95j?W@c64@6cPtYq;dQ-Xy;lD62Pw?4I!Up`~Aa}phFrISK-$@ z8a4c)&LuKbZGDaGm9TRG8G>8G8wJv>30@aVMaM0?LQkg#{PU-BA4w?D*4k!0)I^kO zvH|4>Q8M;d_Fd*!F%6Dyt@RyJ^i=bl0d^?)u8}?vl=EcxMkTjFCC7H3z>XE2P5rps zh6YWI#vNB#m)SKel34iY#VV@n$jIbLDbf45@d3QX_pSQf{BMUpp!)meDO=_CzGx($ z(@(s!hro^#o^O6ZWVsk~=|$t7{Vd9yzu%LDEi!=M4wkVmPn>iwQICrMqHx0_4rwlF zau?5Y;=8^%ii%A-RP(|c9U@ASj6LHP{wWIZCJbYX4{Ue62?z2`36HWfNZ2S9U;ukg z1ujOyBgd6r|1-BFO32rUnrJD)``&?X-|Im(&JK@kytn%efE3lQ^inCxDU+CZvz|4i+9sA#_*ewEq*}jAF-wiaVzavOc{nFy8v{ z4ZkAou9I}!sa;>C&-7B6b!YMUkRN}acd$F4oT`C+)E^C%GSLoEGsM9GtMrC z((v7eGi`I4?4Z&=TdLv0-WQ5ylDy=wGt|z&HsF0U>C6KgLDRX(<;1R&gCv$q&a?F? zay024flZYz^Y3Q=_jLUCI{9^1|6g*QaL}L+9Xgcwv%RykLc-zQ#ru5c3l##%0z62O z-JDJs`eK*!5gZIxw~|z%HC)|Ci8-jyhiGa04hYqZ5i}A~oNO5JSu-gxC`yDl)3p*Z z*$q-bh?h|OT>1HKFF_3s6@?TnJ@68)5k!%o%1TS;pk}o+@Bn?YRJuvEhX*KfTy%AH zHUG;O=^J}s{`&}q!-fNn9fpio*?HiLNCkwFpei;mmXXE@7+VV%l@}vogU280$R?fk zsoH`D(C@0;9X`J+N&@HCrqcc`pPqkTiKS|RQH4Dl3*xgev^G2d-{)@!i-QNAUP6)c z44%#xP)>n@q=U^tCh=l}BBOqwb1zs^y(=<)58ZKS=?@tcUVJ@&^`w38QS52kZno>& z<#uo8U<6lXPeH$`BCq9-0oQh1AU48#3cKeq9_F!0D)}SKV=ht8acQ7>2swRd3ZW>w z@$Hi{Psa6^+t03y);U{`$BS4NYNtrO%hNlu0Xb_ejReSoU!Z6HI5|nwv*Qv4kn@u% z|8st`T?Utk>a$DYy*&gO)QFD@+3g6l6Ah2%QMxj-df#^$iu=7G)^M8b$tu|}u5`3h zWp=%jRK(C*2M*R9Y!-!%^WW0}6BD2d_lE}ehkYrSDf25(fy=8ZmhqbYI&f!IX%+$}PC0V7)Dd}+@`^8&-N>;rqh zZ9t)7Cy%QNIVSKTvn_JY zSrJjTG6a+#K+*je233_3idHw5|n zkX3s3Z>QQlow7xI@zBj9UP4@SDqCg(Xr$f1nf-h;f6xbX}E`FYEAu;S`H=kU>} z)9dDM_?zgC89cS>)WGqV*uTwxW?oWU+zg zCYo~MuITO!lL#B8_XgA!_{+r;^@vLAU(Bsn31^nu*W0*B$6c#t&7(96$ButpY~!G>rv{oSplx{!hL{O1d{xUPz5u6ca39TGKaB z>EuATpCYtVDfz^eRG*FcC&#aT)cpLmAkKYZWH>P7M;T6R?aT0>eQz$6TG~#0AzFMC zB97l@OF%G8yGmiBogl;)XV?T96-oKTSAKpW4jx&u60lgsiFkW+eOj4l1Mj-jO47P3hJw)M#g))=xTz z1^=E6WM0_LL5!!A^%MoaESj-Vk7sN9}M3`PQzk(HY}5yNi*m;}%TEllXQajQ?PbIuBqcFdrCaUjTG;x9|At_WKF= zfSPCP#@=7Q|M8gsYVa>fQC<$aL5sf+et<;>7|i?K>=ZW9|KYFM&H$hr`q}A43_#UIG~0MVSMd>c{02|6&)Mm z$IW!-^#7;-odq}ke*k-by{Meh&Wm$Ot=Jv^U&rk)X9tcvxZ`0|f8MjdzK9YoPw>Km zDSQ%lL7jh3!2iD2j=kr9I`m^#+7x99Oo`1f0ErEvxitz6%d8D*Z@A-Mz0$5E`J(#IQ`k6(KXxYBXeElb zwN}193jTmj74HTtBeWE#?QGtQ9%_^#q!oC(sOoAhtwh;Gt#&o!#Y@EAUE9=>@j4vek)$#W%n632)J&?K=OuD(8+ z8n?u>Yu|{PLV!F`9lwubtlEEcvw-8tIO?4NP8dV(((x^S5(*na^=*@Ym6D?X9BYy@p2 z>suMPj!zoucyaYz$i0XS zbccxV4RAa3`%5HI7HDk4M*`oQxjqouWN+twdjB{LiDG3CgM)%fs{+&7Di&yHU}fzG zdP`1C!BndtTfUuF2(k(-||-?ZNcQ zw&1Oh40NAs3(K@lGvFK$HakoDQ8qG87H(CHapK)6YW;Q8_d;q-0t;ytWDY zOCBJyeX%8+r3f~tpjwKoUtMRa%wRZVolpH-pD^hsBQW!tqJ!Y*z4hKS-}ivQoca*V zdAy)emDLABMsmWj&m2Ly8E&7Ox)*#pVlE0`=K zkkLUUHqY9Pt$Q;d%Te**0S7d#Y`K&YQ#9yd`BmZf#$lU;)n;E{%f~`iX>&c5Wt9I# z0Vm&Bh%V} zEu=?v72DjS>Mw3${j|w1u~@*5u4-WEGVMO5S=Y~lh>#!0`8_#RRyH=q3nR5A49})I z6g$H=zP&fId_4d9A@;zriN~ZgJWmayEL+0e1B^C9YvFJ+e*eg1er?q638w_-$cybRRiGalZyFn$M+o)IDz)%59R)7Z`Mcum#1MSm3RPsu7iN>Q?!l>stpw z-~QZl50e{L-xZZtEqnhxWhQU|y{VYaJptL!#R+eZoAaco32{*YY5kK+4TPw^I5S_n z&+i{!7dXFO3^F{=rtT-+r(M<9e!vW9PQgdu_I|=CeCiQBPb>=x#uxgMPf&9xrey91F-}57Nbnyn}996|l-Wc}#I@txk>GF@Ytj(?SP@E64t=+>DmO8{Y0rquPzuc87Gfe&nRE+S) zorh*9N_D!$yp}MB!NWa3;%=_+CR=OxY6bcEwNE{#of1njHxPd7np7vh9?5uxkgtnF zgjB_awcONvMF6Tyz7G^=iM?70>d|#3KKvE0{PvJQXYXtk6a7HiJksBuIQ~ZXEyK=h zdfx7B@)_CmXSi=fFt6|vS0^T9zqwJNBvE&oOs8T3X z;;Ha}DXkV=Nk|_(c63-&n!m`o?Wv2<-vB~YX7 zSKqQ@nLik1_v;%A-qz3A23*rQA^pjA#*34~1(9;&aSHS%ApKN*K#=y6ok1*xakuO- zuI`_9BUy&wWU}RnhpkH)^qN|%#QQc&G8d7dOVADGP@YgCzQXi`PHn0GpV5QoPh zWpSOU1shN_?pMv7YiueS`4YrloRLNobMFTTwKbI8ab*XSxb4^wj^FTubwOUZ)FOM7xAprD_246y#ZGZgX z6SK?e;~67|?Qb{dj%=HH=0@r-90_w^Nq!(=qU(9lXgJz+-1P6ufCae>O5W#+5#-VB zTm}aK!V?$eevcj6{>=rDW)`y!J-~X+&Ld@2WAL4X%`4`$EYq?`QcwmKAm~Tc$E?+~e zbj2vpW28_pP?PKc+=|L;V#5y;%=pYSjzPa8nkQzd)`s>Tu|HuEBM&gS+XYQGh0r)H zjy)H=rZtHU^h-RLa~!XFi0|q^xt(B*ZoRERwt|3(sZM_Fc+J$~5ucFWQx&Xc+_J+F zCed}sVeN{76I>oD({dBFe*=X~0hA9Mg>n8uDlCa&nO}UO}Q>#}k3NBU!bb;v1dDBh0LmylSs4P>IiTBhS5uvdIstp>M>X zw~4|D2leOvg2eP>Egx*wd0V?l%gMYDANP9NtrLMfWU_Se_ph1X#Tgybd97LEH19PN zh$Xv4+iHhPBTyBvTDAUc=Mjgqc9<=;K4Nbs2}j>UUanqh8B2^XM)J`_6s; znsJB~-TcHAzqkm^TB;A+rX%o&@xsL`LysF{otmFGHbS3f;miy9#u8Ht3OkExmr&FZsq z?!;%2)6$_==*KNeYdf}nU09TK5YObUh|eoE$nKS`vuSxBv?#32srN$B=iGZ=r>dI% zYlBR;jE)yty^snt+?#Nnm%P_5->5E^`|elyRP9smdM*i^e>Zp1#E2=6Q8!T{XDTD{ z;0&}Bf1xN~qCb}Y`BTAT4>8&an+0C}HzRij%(V9FtW%-+;`Qb7G|Cv=%|maUBTlF) zf1F~S&r7aPlDkDDv0R#|u`zX!QM75ECC6Xi>6;+2sC^oNPK8XAH?6*%LENfquP^p% z+%1j3h99-Kj#WrU1lEjjv(B?j2Vz5d2kRp^w$Ch0Ci64;-}7A@ znnM}CT(jy-f19;L%lBy^@mWEC4Ou;{^o{Wh1>3O0CO_u7H7}*~70PVF<}bRC`t#C2 z0B`Ede%6~~t2A#5&E8f(jH_-LM~lu6HwrI`9Nb7d04I(IPTczfwmbLqk2GTY`qi_c z^()UZYLz97b?{&4(Dv33t*_fV5Ons&J{##8xUGAkbbP$>6Hc65=x-FM2ccpeJQc>r z8F_hUAx;GRwGfR+B1~u@F(q41)BULWX4a^~V-XhL^x}>KIkY#Ly7HH-xo+SiG{}}d zG%9wA_Bu8?f$h@Mmd?N$bPBKF4EIx^^L<91L!p`{{7DwU54aK)}p^AYX?D-0- zJz40t(|nIL#_I?qiD$oN7<)_n z9O)F+Cwb6#qCDAPZ-%v&-SPX{vu{N$15K(P`)&VpK9q93A!JoXzncM7=q==xWl83rdx zAZ}BOcKpaY87V7|neGh1$lg>pGIu&=`~GqY$JdTRoj2Z)J~wL4U)05V+VbY6<|UZ@ zdTI7)cxi^gc-xd~q9wO%Qq~Ja(DhjB2Uaeuzuhi>IcvZgtquHon26dH8x|J&0s3G< z=NppY$|ui@9jLACFMph1jkoK6puoFeRO4BaB#|T2PHR4+TbxT{;~pIRs2G+%?u867 ze^oiA0(b&`H@2PN&=y&Hb-W%9|ZvQ*m?`x1ko;Ni!s>M$z z^7Y#w*wEZ^qg%bgjrqg*-9}e5ef1^d|o8Xz?N0X0mM1J`TS_(Z(l~C>| z>6`BGJ&WMP{DQ$_Q<*3FR~_Og=DTaj@RgOxV&qpiD%3Y#+pT6$WRraAA=eJPEhV0v zsaH@Tn_^95?_mQ@u0}F1m>}5|39(+W3;vl?1wYEJM+RDleu`vTSbA|Tux?;N^e11@ zh`g86*=K;fIh|#BvB*T+O7^|teTFvo$6ZNvIq-Tz34t+Z@Ymc^k)UE&Fhi_@djo@w zD(B`eTjt z$r2L`OrOh{bnYu=U%l2@)vNmv?p9f1iKT@o7}fU+VrO=ZgzXy)C2xVy-e0bYbbaeD zF2wK%VN}s$oWN%t+FCpJA6KvxESHa1=7`+|ux-{+et1`^y-ybaaS>oXw~_t+>wb~e zEs}LUfD;oR-+w6l+hYXuR+k@g{vRmDzLI2S{6+}hEIP^E7gI;@M9tC+fq&i(=(VEz z{_D%J?lmI@FmbuUjW+0S`M=#HuGV6Gbvyi*2F{dhU?-}bQw zfbeGcTdrecYikHP+lXmlTjLxnK%m4rgYXx-(hX`Q;6dFz<=?^?8T1>b)NFjR_y1|{ zJENM~x^@+8fPjdAfM7WyDgqu6P^pTDN>_T77Fq~M2_;k&P*kwdK~S1NLQevOPz98( z)Fc!U=?O(7lo0q<6w7|HsP4Pz=W!Phc4&FcP20Gcy0HTfjX|v}-cl)D)^BLvc6_fL%nlInAsv6 z1$NLs2ZViShu-<;j3R9FQ9 z=|*5ttQV>t;kv5w)7vtKNx>)WpE2wfZ>wVZhusdz+wKOP_o81mgYR}%VyXmB^lHp` z^f&`7x*4%U_JPuFW+}6eJd@+`p96B%Ur=XMV=u6q_;aWO+aGoV(*}I^=d`&O{yy^J zj2gh8g2C`d9SA-Av#<%QWeuX%KJP72YKPc=4M> z{I3)LnoR#X@z0gw-<9~MQ~VEEiI2Jg-X#$nX5qBio6|@GL9g}l_n`OTzRd4+_Oc;} z3*`aY&5WKP8^@x+_kPyZ_UbKvZC51nc|lXB?R;aRT`N8SoKZ$z+Ch^6kLtjhS|*laG=7HfZM}-Q=Um=mqyaL z4~#|!fk0UPBNhi&^MXjYn`PUczJ%(Snpf*!EzxEtyiiK6y6hhBOJ_D`Q+o~6L z9X&M%&g=f(lY>);ELCBGf8;m6OZHEal&{si;!ronK;!9vB-v9LK>Nbl-!SmKbIpE? z_0lcGw%;A*VovPNC%wO)=y!+s7H%7c_W*!V6JMOTi3IyPfPZ~VIf+Z><6`uxW#W$S z3Zd}C$$96A8yCGzkamWEexvB+ev7LX;lIrIV5 zMWA^^TiwlQJ6rDD7kan=&$N2_W6*w-Ij#rv2(j4xf86Fryi`u#2KwAxJvT$-A6z_lV>w$hp-aRM2Lk+I7`w0B*uKvFKr1U$& z;&WQ4+#h!SwShk(!hlfh&)%wS^G}!e0#^X!68{o6(LWsIXQBdLgz;p5Nq=(u-Nyd? zh{~UV(E!3Vig)G@3d_&Az32Xm?@yM#L;jCW^{)rpbJgrS_GA7-ZSv2*_xsiW(F?%H z0Nl|PoK^Twmmh#U2TTh^lTz;Ami+bU(2eg;_Ecc*Ebp&h{(3OwL$|-1^sO43_pjdV zAAjUBAl`s^bc6Y2!#`a<3fO{Ied3lKhPD1_G_QV#om_FM?)?97umdQ%*bn>##gojTlq*Y+(LinAZx#xcv`l`VpNl8gUEOasO7h>bL)BgID&OlqF zDgvMrW5J5e_Jjz>Jc#1^M=+3X@La*8U{l2TVJqc=eg8BUbYNiEx9V~W@7SjPk6ts% z;1}$X{`Us|+Tee~51=Zyd@mNZiXX?Uy?$(9%TvJE@EJAw!4s1?)Q^gbee z>*GysY{)k*BfKA)5pDom#lF72e)8u0zOJ(XPU7z2fr1T`1KkH8)N% znQ|=$m_KcmJdPn66AaFaHJ>y9LAn6M_p{q0WMCzW_4OEJX@|hLt?@#C#D{yS-J1*6 z9={Mk-61wbi=lqwyEp=pZyMLs)?PA2J4G|VApjR|1$Z>aW2XR__pJta`BU{rbnXO0 z4rrMg+CDB4;}SS?2~6aW4c6nA&2&m@h@%F!JC39=ZBFV-qN)7hY`mumB8BAk3LGQI zv2tZ;#9KcWkUkm952D*OxXx=VxA3u(^#QwHn15n*ZthOV!z^t@JmSUr6WywKl2X0v?wEr1i3WI{G;Q>p5B<8jKpBb!FAoz8bAH^YuKEd zmYXa3JGT(W&P?O+w&ZxP(quZ45Dq|2MIfJXv1fTu^=R(&?cDSk5I7?qCUPBrULB_& z+H)%FnV5#k>6XN1-W`QHkaSHSpZFmO71Dd*YAe z1C)t0k}q_Zd(Xavb#v$kRIQ8&PItUg`Q&v(e)s*jxzmS?B2-hig)Gm_z0gi6nSTi3 zI&kL3#~aF9t=m_{$twXnv+U^Ep65UcQAd#MV*Nf|A#Xr*j0xBVehi$>5CIi|7b)Rt z8iy3+$@4uZOwKJKK!9pc&OB>4Y_*tVmgx2c9slttk&6lJ@%MN#>HjPyD1lHG1J1Gd zZ?}PN5ZSq$6tROc6_sy_Qi2bZcS z_rk%U+ebFP@&Z8X3dmtC|Bs(7I%00Fj4KW0(JX{?P8@rcZW&+IV<99x$U*5QB=qD9 zHC+fp-vIbR3jfp(GKO-=_B9Sp27rsfKuStFkb5&L($3BES7(Y;N zg?Qi60ncF{0KPr98e(!;1;kka`hg6CW8A_LCWXY9{5C8`Q!wVi1QM50sDkjuq|xA# zH_uF>G%P+AmlB6VTV25kti z>ar+-=Z1&jouMP4_rixKb~%{6Qlzl>S= zY^W$??;5az8n{jUyXUno{*!P?^fTZ`$w@mmvo&QVroemQQjnH{X34640cj^&fR!ru zBKLh@EXSbPl&k>cX(TTDe|f6LfVHr6y;*}DmOsltqF&yCX;+;_ z`e353&%lZBvO<~p*df#%my!WFbfJtUMseD`w!~N_Xp(ih>-7Wuycaep8c9xqvapf> z9K1kisu#oW!AInKo@rVi!9)HeoQ%9k5hz@BxEdrC5QDQfzxYZTW!St5AAEmu+_rJ% z#3>2Pyb|5XX(WMtd(RsKc9P3@j{)|IwAiVW7^{(Egt^<#HHtZDi!)Gh!ES6Nj{L=< z3PRsO^PAF0EOyA&f1^`Vj)B3FO=KQN3t298Pxp{YQv%T;IB)c-bgrm$Cg>4-{tVe% z?~jXaRjRE6WZDjKeFL4i*jTJ_tMp&A^mS!k{SUAOm22h)t!{&geYt~oV zD2#Y(u>^c9ZmK)qQi(Q^7Ns$43qm{ji3&%d-{Sg`QV2t01?WBfJzxn~nIv$q8Op91 zfa&rf$_%`nOu(vVCmtYLix(-RUb<|G1S46N-2*x4=|7hTBBlMVe@d(5B;-%%aPChiYPw%~<2y7?d{x-pMz=%LW<)TT$XWLKLZtjKgvX$m`Rs9AW3w!hhzyn%GExown? z%)5B?to)kW+EE0p`GJ8nw#W;HzRTW^f2a?L%86kWHq8e4g#kE>H$`ZLqUUUs6*h3% z;gbRL<qdH@-eB9WK0uuex(`irtPTGM)YkUmetg+^LR;qTfdn||lMV9v=m9>C^^r1f7b1DP0qQysuQq$nD``1u z5!Cvgjxwf~!yC-CVFvjIkEcm4_ChXfvH9*4{WpE3FmY2nJQ-zD+!ooFmY7^Hl(|ug zpKayJ3|hFSlk&7JY+QJtPSw;rT1%=oJ+pSdm2 z#u1uxoKd0o)ULkzrd5E&Ike18y;=^T< z0;w~|6L9kVaers$C)*#(lg$v+aaZWO5*E_{jo5Nc(0pw7-a6tnqF7QGvam z2{@m4^Z7Y3_+WK_ONs>LIx@btE-8YC@{%nQThSD4J=~pcIZpg5HU+{{e6nw4gK#!x zR-P8uHyFU$X0iUo8TaWv-CFANSrY8sTt4)jzP<72bpi}CWHTE8$r3KXEl%SfirK98 zE0I^T2G6t}?SkUCxQ~&ZL|q}#`BH4rxvnM#Uzceqq!PjcWo98V3h<{NFUQ(&x>p(c zc(+xB^@R+`5g%-@_hX>_DzpC9DI0Uexs5!H!q)m?hDC`fh~6H)edX2KO3h6cj{%9J1Qj}C4D8y<5mdX11*h-?eeun zC-n+$E47wjs}daWBrK+GX~Id6HG=$2F2&92i}>BB5+T7JkG2i}MHL!^cuMY#nyB1D zhl2UUDz?$0SVYW#pfH|tOLMBHD131Jtzycz;=}<$l{X*X9$9Cd#vH@?*^?cnGB0{&S_r@exXIm0v z21;@+OYH|*UGfYZasR2S-Z+ju@w>o1aBkzLJOV?O34amESP9Y-NBEpuu(+uyx(>`M#U%cKi~e$oz*owCkA9H1v( ziMXsn@%LYf~)iz_A)v)-~n=+6dP3bO;?rujpDT!NtdC4=xyEy&8 zrQGDQLT=*)DY{>^@tpV8k zSIs+&lQ(wUP1t&FIYpbKsz!E2z+ukbRTuhuke0I$wHQwT#Kya| zO3Zs%`1GMDk??Mo@NxtUF|0td8apsO@Ct1n*b*{hFDt)*q01vel1qaQ%K0zlB}Sv& zTQ7hlq9iLkz-}aq?i5ZPtk;rr@TSf8mcg4BRLoDGcf;mkKvLen`)cUj`QB?-`KekJ z*LIcGB6)h7sJW4^!3Ms+$laXCr`sIYe$G}~uGC(1VXCr|gPk%a71=*?_^J;`zAN@@ zZl0O;9e4Iw28W6C0d<30jC0ygy;V;yC)PqhDgS`gffz*~jbhKpo6W~OmIl0ImrH@x;2;I(1LP2)R0QSyn~dfQ#~I3C z9qb%{**#d)e>Yf(DLcW}r=|@@VnzsCC0pPdGf&adx*C!?GIJHMLo5>C5(*q57adE} z*c}FIBG)I31y@P?mR9+wO78_m^|AdC1nSCKe5OckIJS?FCqN4k>hn`a+inZo||>C(hR zmh%(OWBZFO0oIdZ*V0umk&g1+KdG!x>BZOF+EyqdImpGf(^B!1EuWvFv`dodIxNEeFL)z=p1v4{B7~EKN>oCBZ2I>(K!# zBc7(%SGS6b@Ps?8+Yb6J-IOi_jNK)Ih=S;=~$8_Ws=4KlvUgfM^6$IiMkR0ZyU5lRi4hNNUI81@UWu z`%`XeUEwxd+ecP)9RqP7a3V$)w*doPmK_`iCLpJT0pu4xU(bi5bMhRC@pN?j)~*yQ zzoI;xcIihXfCHVBfFXBgrb?Fdlk)!7vo@%WND6Acc;h%){Jb%b%V6sCKxHuNP{nix zvleEMJ;5}W&(&MW4_3uZxhG?eq&IJr@QcNkrqBbM&<1~H6`_5G;ii>VD7LpTNrBJJ z>5Dtzv+0uNsWSApxzKm*+~h~vmR|Yib5$e}(0m*6!6AQWP|Dm>T0He!MajZT1KOlu ze+mGd3k4QYktFgX-F%oAFb&>*Nv`HX#n<*$h&l{4KiE>IUgg&~voSB`ok$Hm;N2wx zpQCA)rrxj`7u=aVRr?NWuL)oB%u zDc_=ezd*Fah%$&|)vsR}v_~?8hgy7pNtzF^h z<)nwM683g`(5>h5X0)ntmLx_+2wis{S3lTC0g0}-V6XS^s~CmGp@o)k%d!l#VM_=Np<=#(fC>cF=l7h=+O8Q&f=>`@bhibYV9 z)l7_dU7fyjFM;6gnt<}Jsiq@+>ol9qD{@UN^15?%#d(DrdIJy*`-g|AZ{~keKX;j= zB8P{`gknmIRJ&)^DF%;0#K15-)8UGhfk6yI<0LbqjY0hJn&_w**Z_qL5;(*uR?lY{ zTSaemcXuZPtfBaP`~`a1jg0G={P#^QSjExu35@mlF?(%YsuJY*!H|vbzPVU^6X}uM zAfX{f`RGn6RI`B6I0L#AlV$&c;~;-kmTp{=knd8w!^(;4akfsj#EZh)`NA!4<+AqR zM%xD$r{5dms;7y!4>r_FQ&7tdE!SpvB{ilOdgwB+;mizt7JAxBd)6b#k-re~O+--G zPfDC8X1x%u@2D9mZVLNGZiVrq^Ae)nT?qWLr1yVWKHBbMaWO&MD9fFvxjFC4rAiN_ zpt=e|80)f@z{+d<+E9mfe!NeMU7kz%Y?B17RK+<*$;+G^oDjiN1YL=jB}sK2E1jGB zYQ9RO;AzH>Me~bamp*@WkVJF9CRHpYE+xi1uJU*{2_Lx^MV`+d>Hqju&&-a6^Ptd$ zroc6?$bq2uCkk_%U6n)icP{mxhwpEUq1^E4%QOB9_jOsty2>wz%t`IP|AG1?+P;)O z6rjgh#heY>i^V=)de5g8iS||tVhqHW0!fW5HYLx=L$uk$o-pINC8-NTK9xRZV3pgumG#j|}~Lt{AZXW9x5oSoTCew7@T=WFXSat%nXY%xZF zE@YE+7C}>o7$P0oEj=)~S$x8S7mRk|peC>VYl2>S>@1kj;Sa@>Lt0EHsJEdv@?%K7 z9f{J{eBvU!54UeNMMF}zHvuqcAnO#QEoqV}fV2!+VEzW8xvY0wQ|iULjG~=~)DHB% z6>!+oBWcb2&LVr)p|_VI!h?VkD&zOffk8vG&JxuIz4?ZygRb_;UNHkf8*~{s*$4qn zYBY10GzVNmZI;o*jr}}X7s_R zB-%qnGNd`cug|xKnjvQ+wO<=XY7Kp^|FX1!!p|`2jYJrAZC%tPws+m`d5pwyuU#>o z#G;s8`2zkAotxP@Ma$2Wn5{NRAaEjG4}0=3?DeX!GU|$Dg=3T!zo|9tTlu`2`RABZ zDRja#wOx_9zi39tvec#6kM3C;Eo0s02?n4$tBQ_Re^2}D$k`zD5?7C>eg>%n8aLz0 zo}=f{`~fXFT2;BxzrA$SON3i^DmCi!XKNhwOPxk|z_c=_(B;?FnzT7bM@n zUq%%Qanf4(01|gz5c~C)iu`|muk@~5Oj-Cv_*B<}xsF|&1BsDyr$tf}r1tUV__gkK~*6~P$3 zO5q45I0&lCyZ8cL%6(orQsT~(F(zdpx7WRnCvLBQGJVd<$+Me-=-8_yez^D9tT#jx zK0Ms2z=^3M7sW~k%(OSR$R?C=zs9TY#D0So+-2`8OiS)9jG|Zil`Z;@RQBB%OC550 ze=j`6f9bix`rz?S+v~}fke&CHHrDMCfnWA}yIsFMe2V+HYJG%!Su2k3;_M11UHhw*?;PS&{$`Nmxr8pwFMlkJ;c|e zxn$%z!t|omD>)ZmQ-tu;R@Uj42mdB|#zhc|LDj3D<%7u?v%%q4kPCy0O{YO!Gv1j7 z6EY>G-h~%eDJ?`g$3m1W0^EZTE?qu?idID^W9$jDp6o7A6rQ9SBK5`F>Ez@OLj?7| z8q0%XMuQ~e-=k+AOCBrT^MQ0zw`L|joa&XOJ#9T^)iHavX;Tp*M2{74VRF_%yU$IE zv+)tX4JeGeY3Asrg|Y7ky1W-AkMbRuy3xTna*_DC{^7u*nwJU)qUHKmJ{&k|&Wt~y zzBG{T=k5L#LzUMvt_$b%Mu<gkm2Bi7#02@lU%7!OZz#dSGC<*NLmT3am(jS=Xq zRH{^kW9=>+jn=-GmD6=L;7xMptEldPv7khD#6{;bQk>}Y)pZ3<>=hLlMs@nDIbJX2 zeIs2OGd_G9g^S~`cU<~vE)!7y*=S%|ugydB%ydr7O@dJB-l|h1HXqXpw?sCs=8@~i z2%5CYr_>|*8wmvFnntS%6b8McGi^&*L;l$n2zJ=4f^qYQ$qaxO29$~-5j$u(C z=iotO_iMh3MW)?R3=Q}7^)*0GZLE{j`L)(kxE&KA=W7G}Q z<36GE6akLuOau$lgZ?V~(!1t-=g}rjQx$eWnU<4Z#>btHsM$&a1!=efyLO0jPOXZx ze%4Os6SKW+L0HpD{z(XD&-+#>ik**sZ$SUW!$JHCUD*}h6Y(&XnVMOpnM=o8Khhkk z2{WIb)TCK>ETub*y@C)?N;Eiad?}4Q=BkKcS5*~hE4rDC-Z_#`%MP!*7X|IA;LohP zMRoZ|giU(g*R(8r$FYAkPVUG|d&JDw`2Z{rl&WtGLSj5|y6AU$uISt#apouNhiJU-DkE;iXlDa9vR)1tguYi(JT zZ~x2duBdk)FBJPJ(b`LRCRCIk-+TV<{s{U{7}?Jq9*a}HbGmkZCaOHw{rr(!h& zYBB>Kr*Dz)RuB6$j*1W97jW9LiFQVk*c^r8*?G8IaWb?%%xfln*wB9M)_A~r*eD+? z!6GGRPNzN4Z)k*ElI&O7p+h?-VOoWGTlm_p+xy$hI0xT{y*B0#dq;6}7Qkhyd6jp$ zwvMse53H)eXg@c=WENC|_i$>A@);DDR7?xtWE8V#?VOgS3c^?(;VIvQN#AxDvqsy6 zY?CbcAwpJFz?mh!rS|fDyeIX@2Kf(A#Dc+-`YrJABD23CZ`gKtr9KSI$DqVdp6=H6 zDxYh{nw=l@0+roZ&$BN9Z~t*%X7mq(q$h&rEdlX}(V{&e4sw}{HF&jbyX09h2|o zn?pylw`e!JJ}*0I*aF{KJ7MC#`WVKtD8#KafZU~^O;63}9mLPeI>fx@(9nH{L+_D} zzaWB;1hho!{wi?>gmUL*_xK(Ih(yL;@-c$fy@&zL=No~-!heSV1`n4Fr@jZzHm!40 zdl3#__tV7VWqrR)K)fgSHh`+)1Xza7*4 znQs(;@vGG{#e+Wme~chQ8Fg;g+1R<$Ovz@Enn&eNsX>K*stmHQX(Y5k z9U~)$P1wcuwr8=i<0Ps7(8ki9@zEH{;flNiun!+NyN(C|_`rvW@#E-cbEmK4h5Suf zIPc1iF+>X)?UN@J)j$>k2_PT_K(*qFWs4Y;P-G_)wC?Zx;kD`~0RY6|+C+}MV8HeZ z-kk-bqcQ!V3llzf8oe$rv{}x(&iftRV^mOm0Zx8Lt~ppU+L{M{pR;**T@Qt{K4kp zGXN8Lx=t=`>_^q)NdprbpTt>l8y6t5s-JI>yr=L*rJh46P|{6QKw!Gx=+*&#wT=W{ z8{l80e&Ju{hlfw3C_0YtwH}eTO;67VuC05yXxg_x7{4+gH?e^6Pbk>Xw9SaNVarmz#JLsu3^bnqJQF6L-qhT%8oAn&6|kq z^2g^?3)mYLAxi@|q?zYKPNWdKM%hkPxhcSQ-7`pag4<2&aXMrUN0e(}x0U>w<5c;0@WkEwDwhq{-kzjvn$pC&Nt2N!7&H zM@(H+d$OHmBsM*Y;a1StEdan!7`=X^w(jHOQs%8y+hX|kkxIN&gAxKJ3|C&<1^+2M zEm(HCz#OKU8~r>wQZu#f_YDq%V6giQH;~l4lVP+Cb7YQIek9RS2kKQ+gmO3NfvCq_ zWblz*A5HCW3%FeaLH}xw}mtmUZD>+aOGztuBiTUnu~* z$wSJ)TedQ7+x7Fq|Lkk3@@op~w}+NIsFEE1Pkeknso&oFr**!YsalQc^RSxP?1quN z|4@_Uf45=VzCE02OGo}S@c%XEq92?;4J2#++fZ!@DXaD}4{G=CU!o^jx^*zu*WI-U zyZOu8e|@NwI3!$I!8AWNJ(R}$>$kr?aO~Z~3BIbRmi2R<{JOL&>F6Qhh;Y$>DA?iu zWiIX7bMC6L{60?3)dR_w{&Sjvue&`9_Bk&6@|!|==zq*W#+^SM3hDJ(X5OP8a^lIg SJd-Wp-!)aO%Xyb>-T5!0{2BlN literal 0 HcmV?d00001 diff --git a/doc/workflow/web_editor/empty_project.png b/doc/workflow/web_editor/empty_project.png new file mode 100644 index 0000000000000000000000000000000000000000..6a049f6beafbb1f449e43baa5925b10d31410cad GIT binary patch literal 122296 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

UHk?R^)7o2We1MU-X^p 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

`sI*i?;UCXKrhZ}E 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 literal 0 HcmV?d00001 diff --git a/doc/workflow/web_editor/new_file.png b/doc/workflow/web_editor/new_file.png new file mode 100644 index 0000000000000000000000000000000000000000..80941f37cea0c50d4e16f9df0460cd0fd705b36d GIT binary patch literal 100516 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 UybEaf3;dipeeP8DN!#213x@N$$^ZZW literal 0 HcmV?d00001 diff --git a/doc/workflow/web_editor/show_file.png b/doc/workflow/web_editor/show_file.png new file mode 100644 index 0000000000000000000000000000000000000000..9cafcb551091a8959671dbedc113062ddbd7da7e GIT binary patch literal 111479 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 +iz*ER zWX=2Y6;=30C@2QT-GPkEB%56ni0H^LS5gbvZaaL$h*5DpiHZp4hctpWKW~DWIpOWv zh-lJan(M@?$kvezj+9&whkB_`OeWYVkX1J)S-meXzl?{Dornp28yIi}a;yhVOd#^2 z{0c_}1Wjfan&wVp1wMlz+AaqYrWQEA5@OhF4>g}`EugIX^BoQqCl+n#s=SRj!DZ2W zdVc6GUNBU~I$YY5veEgyWRU_-JjFWuny#4C3g^em42!lu?$A;#SndJWqdc)cVX$ew zR#Yd^2nJ(PvWT3nwYAZYEZIlz+JlE9O38eq1^Q!xi>BHy$6Dfl^8d^1UAzEb{ie1Fm=@G zcD-ZfkXpG{8wVCbHmt8G7po z8{2u93JzS>Sxwg|xY2E}fa;NLo_$n{cX?*kL$*%RY@{gdR`ZjEPWbroqlT^rm;NW$ zp1y01_|Eg5&lZ^kAp!_oQrcaj3r0ce_CfuJB2rd_`snyZbwJ<`HumoccNdi>+DVp@ zQrZYbhgg_|xTwpM%me!O94`ItJqf zr6i=ec*LFE1>*)-@e+>i5Ag`u94Iv9aEpD2OdlGMnUk<5>l{tKt$5+6`{~BTw`+CJ zSdmZFIALPigiRX>5O2OxjV&$>paiU$^TOs%5EosIbtiq>bB>G8QPdqvRqgc%T3_P@}BB>lD ze(5;d{>Rp$OQVcA@W4L#l%SVdsA8N|jOBy0r-KG1|- z(EBfyv+;nEEBRQNz8Rf$W24I7bOYny9;`s+y~@su9;rGKUqHbTmzttp%pTnWiPwP< zc#@neZ}rS0T8=>Op{BnuSn1uIiWME66#3D6ObMR$roy({u{%l92V~Kb!Z&e(7jODv z+wcV3fA=OS3*{4La@w!8%3$MS#$M<_%j%_4VECXgS)-{JVV?-zt^`B$lZ+?wMDHAi zz#b2u_l-Gqo`C4POUdBbr=+1>xaa`RPYLm^hYG&UVKcPJ%>h#jMMeCdUm$o|d2~dq z*e6ZR(t6ZqPsK4wXetqC*O)iE#s)3hEA|GIBA(jwzj<%vp{ZCAmmSA+o{dHXprb?) zGFcG$vyt|K6gn*=lr*qguZM-TGjM~pCz<2Pl0!DC2zrlJ2G;5^!7uu6<~L&k1Q7Ux zvEkzoHkEiP2qxff4V{Hz$@oIhT4Fz*wg>ZiZx|5^*WpK;8?*Mn!Cc9Vk7%eu{eqe%8?TCyJYMp@lMAdNY(w8!^7S73)atujUr^kzHksLnc!^D2dJh! z+eaD0tSAj$aFt3qqFa8TL5mZt=+1nul*n@QMtB_-Hw>i99;zU9ew*WUME`58jVMm| zg&@acOP14WMy8lTo<#in@aLY*5T$+9sJZU^`lWEJ@4S9b9{LVlaJvB)8g;&0bo+?!pBTzIUntFUwc>)Yqu-;nLAM0KX{4rPQ! za0Khez8eLta$Hrs1MGfrw;Ahp2`b9k-6i=A^^J(bv0s(hCrame8iKgfAd_1!UVu#y z>HXQk>KVcHgn$8}J51WGb&MlEKt$Az#s;2|`;<3)Mgc*Mkh;)Pj9_B`JeJqr4ue2` zE%#lMv8HAUlN3AnTJP5AvBK8^13w~pCrrj_264QV4JNl@4H;p?LU2RPh13a2jbw6w zt4~%|sxyVY0-Gfb-7A}vCL8JonkYztrv6>_GSqC8&P6KJNK>te(N2D)hzmbSlS40` zhusv_H@!wuGQT@08f8BnSB=yIpk?XH+T*Fo;%P^@&(Y;LS?qB|i;}FUr{NKCB$I+= zY7k?;e#GNx2idxh@H*pLuKR;Hgv^TxG8{exr1&@gbG=Ch`yk8Yxj~Nlx7FLU7D^~A z-h|G_=kEhGyFFj#dyMMkj71K9v4qGoIA{~o_|)L&xu7LrssW@gS1oXCC0ia;S&u+> zC;OfYwIZ(wG-PKv9xT}JnLngri<>>G+ec*cocS=cE4F(u3vCT+h%!+h0%gSaJf_abPq1(aO7Ev_yrNSjoA@L(IRt zL{89{=ZWvzA=baS?gkyKd|{g-llfU#*&50$pxIpjL(Gsjj+p%ckhUDlkwLQ=D!?MG zvgRm3crxJZ6>lHWmCC%FH#{bx-~%ckEHXMI^CzcZfE`3THhJCbkx`bH4tXDkKB|sk zGetT6JB+@R`oo%j8Wep*q=tA~C(>4;r6g5e6LktZE*T}CLDBmwT*NP4o?;5Ki7(eD+qv!n9L zZln10!2pGJT(gmGm7(hc1D<@$Yg-(528@{=pW~LQsQ(^M3`rQNtz#Tq(cqGs zv&!{gBCL>-h;@HFf0?nz$e4lih5rz_N6(CbX&Ny3IqWRNp_S8&hScxUV8OtXwLs*d zsFMy&<%)k{6`cw$({bM{*zv>u9^%jfN+Fa(h(y=nobmn_MTcXBftz$k5Hogc5HY7! zJR-RE4I5^HMHUW9IeJ-I_^2857U6d2_^0hl>f?=gazSTA5IQ;C7ojDWUue!Q>_EbL zDIX{2BC}n3RV4NJqh2OOjS(7{D?5Bt(#AyaRFr2QiQn%AeL~v^ERE6uC4n5T3)PS? zc$3!`n5OeDnHntht?&Gc@Cw3vJe~b}D+F6GO_925$J-F&D$aQ318o4xp4wl=Q2@Yy z*hTU{c1(;w0;1f!7sI$)o{L=`G=OZyN<8_Sd$6@ zn7ID$c=THigYTl){JVUL%uS8gf($iQd&&rs!S6*s&;Qej{M$`nhNRIgfMc@3)+CyE z0cDi1mwYB3A$Ty_KGpW;UYkzSWnar=fgdvQTOCBU%!Ep3augQO(@=T(&9HvDVwVH& z#Z09}%+#Q^eOM2*A)kuyOiBAe zp4hG$eTK42EbriMc5S64MNhzgK$)zNq@->+nPOAIFfBj@9iST!4S>s=wWQ zMTW+wk>0-NSr^s!p{gKd!&%J;p#*XgU>iPTz5R^{y4l#aSTA~e_4zYvi@t+)aQv6~ zO$c|R?~3{o!*rr+d#v$Mo&D!lBdfSIS^BdfS5bP<6^T0zcYD)pmHQVn7+eCvOx*qKu}Ke$S7cW zS4>TtiYDff%Py2iiV?R5MEo^rvPzV_?}GrI z9oV&&Urr+iy!h{wGlRHC3Ag+k4MN4G(Kim~OS)n)qFb(6vX(o93khV*j44d?^N&60El;ekCM#cStC8kJVyx5t`waZgAqs4k-YCq66cuQ& z41EMpIw}l9!)(>hZY#duIiE;{=mk%f+DfnZ9-kaw%wz09^IVL2+3>o(8E+MOd#UwW zniz8jr5%YTiNUcZNSp0f>GGYwhZhSn#Y zErOfq`Nq@zyP?ou&bsyC&RM2(9#JWcl<{RP8m@faL^zt47zf@&jh$&SV!#<@eMJRs zHPw1*Tf$R2={MfI+@IL}zpwY=MtzHErYo+O zC%i2t%G${Kh>DRt$%`E4zXX!rUnX%6#<1mCzsqvp!=Qqd6irKk3vPS!LlmA#pa#WV z(F@wM0n|$n*b;`;dltCr0I~<5lF}vynQRWYzTvm5*$P>H(}ZT%WR$iQ!P*>b#4crg z-Af0dB9sOpc}!(o20co zuW%0#OB0$>lPgO~7}EuY9mzc%>D&O`uVtWR5xC{cyvH--s){$d~<%fD1o9$d1Rw3p!zdoduPH9R-sr1V zA5*@Is=ZTJi`0oXt4po{;+4|cVyJi{*$B030kx1m5;rgSXeAOO=WZ+Ru3~oz0bz)^ zS^}@tct66rPau9tdz2ko;rWDtNwv=!vCHWSDcj^^6|9aCodb-W0ID5P^pxjYyMq|f z0e7PK(@B%Vsa=cZHozC=55b2W6(Oo62p~HT7yc#?DQ83(ID%&-bQ1<)qtdLycyyg{ z@{6+or{xsl^>)&RV^h8}v{x_^%K-*47V4FSsHcplcAC)93giEGiTf#~O!jX`21WPfHo$k;a8r(^!ocdqPf)#`HXjk$=RTQewsbb-zre&Ji#qLiMi-^w7$arJ`2lf$ zUZ||12u)e>HXjQYku&>)p@R_~Yt$S^nN1vL62OjH0Lk0rFy15l-v*q#9GCAcC72M{O>I5b!9FR)4IGFc=}Ay@j> z!rH$!5!;Dyxg==I${L{0>N$=d9J9SN>urEik*#GgVt0#;SLe`Jb-o=eR-?GwvuL|W z@t&{{#C%#9x03z8*SXwxtP3Jqon<{owgjxLLxxH z&WXyB1jRQ7&7}7t@UgIPvfSAnXJ=2ma=z!#p>yNrD`6O%1Lgcz@%YJT@;K7R+PJOm zmi{f7Pk6rx1aW*@+(aHW1!V->APE@}`OL?#_opgYlLu2hwyeOOlfJ;2Z5c!)DSb$~ z+qeN}ecV1BsF$~@oe^MKsT_k@aotSuuzaE%Sag1a7lq_jiw>TO`*`ENz7dhwB5R zv{k6M!GO9I;-`8mIKr9AIMNgTp487U^x_8&0+3}k=1w=_c%uW~`Rj(f_q%k%a@Zmx z-ge-Aj;LHR)VN|RSv5a?gRMTmLJ3Q^Z0#L|}Ic zrC|gV0uS!8Z0zA{BH5*YfM^e2oh$#_CI9(F#SeOVyczZpKq{f4!MnA+y;+Cb`P->G zksxN<^Rsq?DLud2uW)X~%zW~WH+@EoHza}~wk_`Y5Cs>DL=CbBXna&Jm=#i5s*;7T zJmiL_qB)`nwbBT+qj1@h;OF1^`s{9;>`u;(tHr?%s`F!2O(eYWemI_Epk9d($^k32 zYivO;!G_aygxcB2FA>!PWA&T6i}GiqWvdQ{u4hex6R*pzKYXXZcxLYQryosjl*a# zE_4ojn5%VA?JwuvGx9PL$Df!roN+AGKO&)YtuHrjoZ9M5G?*Yz0}Os}!x9z8M9625 z!(j1!o$rClmNVfN$U=;X?G5~f>cfA_*m^gqCxZz0q2*YUDoi^8fS^`8ZS1`C9=6EE zacp!{(o2dzF%c^P12?uqv$AW4kMT@d7Yf-q6{>9z0`5k1t$J-__veZ_1fpnyNkxtG z@2qYVm_9r(W)u~59-fo)@)ArsR)@#NNskM)VJ@|7`(IRw3aGM@FX}4hc6f!cYvJgvvf~<9%nlZwF7b8>{njIBh!cVGxqQl?+GtWTJV(asOIu#P>!g>kPBibA(9JQ#guL zzU~;?+1X{MfySCX8I3zv_N&jKRC@O=rN2ipT$M@J_aOb98o zbP7APLjRS26Pd-raBMOkCv}}nPbWa`E&FM>T`A>x;EX~KuztE6LHp17{o5?xVVvQD zmxgh|eI$m&1O9A5&^SsQ^*;ymziz%#z{+8Pal*NF_TCqosgbIYY8Lh<$p0zv{nvGd z5IEIK0aqZ5IG@c&2cQQWk4=wdC;kJS{MS%KNXS+29AyHv5lCT$Z4)2^m{5+xD*1~) z4a|@y7Z4zVFv%gDQBr*tt3@~}Zqn_o#_6B853{du4M_SO@^%25Yf;iqwttz1_2OEn;!6d zM&OA2Uyp*|i=Sa3jD&tdFxTZ=O0!jI;6k-Yziv})**exAgE%Yf+6w%OmDj+AF4wB8 zpkdr(e^ShoPh)w>sZkn}{^KNR$$acG{vyT?ffOlDe9`Fu&(8Mre@1jk<%suJBMSTj z!fz-tZYR7J79|%PS^HOuqDY}a>Pdiy z7q&N=NhvH$Mj9t=s~S?UXd`81Rfgrebd0;`pUG{T93bFx$9i#bfk8x6-kZN_r!}8) z3kfB(5=t3;m0VmnSL}G$+1Y3Ge|E%%hX+g_hBT!dvHzJ#+P|&s|9>VKfPmNgeKP8+ zI*Q3~;O))ndK^T-95+92{y4?uk_0|jv`tf=)9qja3IRacd%oSTOzz3yf)YA8Dhbl+^K&rVUL5%wb{Y5I}2o=r|J4vRlyu~K z!q8^#Yw$fgM1$cWa{X%k!=6~KIynPUL*lPK?W02 z56HkE=Nrx^(@6%qllcv?V+fTwOHfddgowvZqXRDS^}yjjx4DP`l?tY36U6q|FV)D1 zBk1;asxNx?R zkqLLAfgGI+DWKIg6_*YJ6BS%5JDT=UBv4lFw@s#Nl+z(vDXds zbiBSSx0pxFB!!Dd^iE4bJb-S!)ozM~Sqhjv4G|~{Hy0*xD!Y@TUt2UbJ~%j71{Edo zILJ?(Cm~P4GVHUP0tTuVa~E-kMBM0_nie5P>$JFi*J2s+<9Gl4E2b{FUT&%8m*h@L z)n$sdnP>V@0SJfX1ur}q?3W5=)cmHx_lT7+_#> zQRM_lLxL2~K3&Zx2{YeFT5#fYye1D+%-H| zDE%J!qI8e362#Q*Z|F(a#hA$5_Gy&RKH1dKlkPF`tCCLnQ^Jf@f_8gCW{Fo59Y9&~ ztIer8>4Od_%ZFA1-^UxX8RNwqVbb?X(1Gz_EU|XeK`c~a-m0wf&CUNB;3bkq3Me@v z1Pha(wrmfnkiWf^V6^;pn9s+}X z_`swnZ#r;cqk0(ni3`9@5<@_t57@m|gntu-m zc)!Dz$&n7xP%kMDWyw0@$PVJ3)2@a|k`K|9gOW|^WBU>nY1oyH$bPT2EfWpyqrBfK zm;vDg($6PuO9F@L>zlzP8Onrt;Q`6VvULTg=ekz~BgL+nEQ+KBE#38m2B%4(%hp0lTiS+41$iG{?JakOD zIM5XW9;PQ21s$~Ni^eAl=Ln-|SX0Z(2u>Uw_ZsV5DDZbt0eu@F;X5b(kLT^l8Jg~m9~*NLI81)FWfYu0%-NW)Z>f4z z;b$S4Ar-}&KKw8yTlp?~o~k(CY&f+{6Bz*sF_7BY?c?|+D%^HWEq|vKHx}x@VwfzE zys}*idr=CgL-y>nv=Sh$q|98UA=#9S~a{(m?&HEKviQV#1}{LbmHcO1i% zdn-v=`n^}hv|!gX+3Pph5q#wsQ5TPizm25BX;*Hx^d!T&B5={BVuIiQ)f>>RU)SF2 zeCV_LZPw%9%B*(VZouvJahSU} z_>(Lx@$KRhmv(h&RccJM_4sjE>?lgyW&a1|pM!>{!fd;=PYrgB8Fq8ETB!rQhVxsX zf1XdSv^Tq(hdkLnfR1*On_hck{Js_nE}vTF-?YM-Vy znY(lVoqq_DM*EraPx;SMEa9offqLDwA?2`x>Q!D+2{Ba z#eNEy`7|HTmyB1Hn&HcThNC>@rjN0BlX0DMG_8>KN{4P(cvZ+%XWx&c&=xH{4D~!X zZt|9x%e%JeXOd*z689|GBD`Y93uc%+rN6=!(EzUbNhGkO!gSAnPMeS$TATD#P&PfL zoX%J~MMo#@7)##jZW3t(V$%Z{-^7&sk2e<~p{lZ5ZI+uS{T94X_M9py=LX@DFICpk zFvb7L&mhErs{_@dFJH=14~S>uL=+Rj$Mco_Cync|ki4(;@psEER`~L5$yQ0qvI7;D z^k7u)0W0cJYEbH+BxSJk#mU|I?I^|~#g>E`_i_o<*2>!VNC`dWCu<_pF+J&NBoaKG1gXl zYoA6J$~jwMSnzacGCW(;-H2O!IJ<3@0_jWJHY?uumDu3^S|e`4iB{up8On18sps1l z%nQzRBs_*Q*ohw>k24GghUzKUXi)cWZG)2^Cf6)q7Cm7*Dpn&<9_rtF8=lQ;URh;E zUq0gbHIT6I_&rz?Y1%HvMH3T=efv~rnHX?6W>GxlTuh|s2;Gp3YV^yUNMI^uXV4l;bTm|@qsk?Y>b8=iysRMC4u(S+ zWE2?t6uD=cZ31&qA|6t|_6&tv8G3p=pFyC%o!-~U_yGw%rM}sHx32g5E~>9{1?N;- zr~QNTDQ1h3v7axG;al%#ovxP(=d(j;OPJJN{Wi*=c+2%_f&GwuWA~lVXzKeuj;Emz z0MH>|C^*cX(|%}kWwTs$w*LAhKgtD^lMn?BMoH>N)5;~XZM_{ejBn0XJeD-s@8Z06 zlD()Z@Sd%pOo+*S$D}a*d$j^nmoxhPJT4R=rq%nzde?1_`aYeg*FIqZK>7G+)!O&g z$H~3KQ|!xBd)0(Y^b);dJ3~+&3C+0nP~EPRa17{gOioA$eMB1gU9Yh_x3tDJ&ggoj zdPdBCvOw}$Umr~mcQ=0=&18py)pm)KnBN6)yFaedIL>KR+YYh?ouua~459>1TWj^9 z&yT5z&gOpYe#Iw>)r{HFU?`K}DZO+X|JqLACdKGlTYHJ@u)kyPaNxn+Tvry?G=T9- zFe_i8K&CJ4REP}7V+!Iq!KXf{5bh9Yf3(G3;!^C)={a0*Bu5im;*=QYMmt{&;wrnz zEIO16(Mj@}^l*QYv4GM^16`Gt-KSxYg!xKyBvZ+cj;LEFS$DXuhkgjuP6R!({D<~Tk&9O9PB$(uDXp`!xiu@$dJRu) zd!LHpT{`?;lXUH6ir8k=TVIl0PGXx&*|(I+S=Q-H<3eTbays(lu0z>h)jDbaWKj

!PF#8fSS4{$Gb0Ic1Hg>g{4_su~ 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

J_U|-M?5Sl6Bu3kh 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

W@DE_jYEp3A(NFa{&3R2iaH+L5~za7Wl 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 literal 0 HcmV?d00001 From 76027e5efd739f9699f92c8e8cc0199ab17d7c47 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 18:54:27 -0800 Subject: [PATCH 53/96] Add rubocop and remove rails_best_practices gem --- .rubocop.yml | 26 ++++++++++++++++++++++++++ Gemfile | 3 +-- Gemfile.lock | 32 ++++++++++++++++---------------- 3 files changed, 43 insertions(+), 18 deletions(-) create mode 100644 .rubocop.yml diff --git a/.rubocop.yml b/.rubocop.yml new file mode 100644 index 0000000000..4579fbcd2e --- /dev/null +++ b/.rubocop.yml @@ -0,0 +1,26 @@ +StringLiterals: + Enabled: false +LineLength: + Enabled: false +Documentation: + Enabled: false +UnusedMethodArgument: + Enabled: false +UnusedBlockArgument: + Enabled: false +TrailingWhitespace: + Enabled: false +MethodLength: + Enabled: false +ClassLength: + Enabled: false +AllCops: + Exclude: + - 'spec/**/*' + - 'features/**/*' + - 'vendor/**/*' + - 'db/**/*' + - 'tmp/**/*' + - 'bin/**/*' + - 'lib/backup/**/*' + - 'lib/tasks/**/*' diff --git a/Gemfile b/Gemfile index be78831e1f..8eede269e2 100644 --- a/Gemfile +++ b/Gemfile @@ -206,8 +206,6 @@ group :development do gem 'better_errors' gem 'binding_of_caller' - gem 'rails_best_practices' - # Docs generator gem "sdoc" @@ -217,6 +215,7 @@ end group :development, :test do gem 'coveralls', require: false + gem 'rubocop', '0.28.0', require: false # gem 'rails-dev-tweaks' gem 'spinach-rails' gem "rspec-rails" diff --git a/Gemfile.lock b/Gemfile.lock index 551f16722f..cde7bfa66f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -37,6 +37,9 @@ GEM rake (>= 0.8.7) arel (5.0.1.20140414130214) asciidoctor (0.1.4) + ast (2.0.0) + astrolabe (1.3.0) + parser (>= 2.2.0.pre.3, < 3.0) attr_required (1.0.0) awesome_print (1.2.0) axiom-types (0.0.5) @@ -67,8 +70,6 @@ GEM timers (~> 4.0.0) charlock_holmes (0.6.9.4) cliver (0.3.2) - code_analyzer (0.4.3) - sexp_processor coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) @@ -353,6 +354,8 @@ GEM org-ruby (0.9.12) rubypants (~> 0.2) orm_adapter (0.5.0) + parser (2.2.0.2) + ast (>= 1.1, < 3.0) pg (0.15.1) phantomjs (1.9.2.0) poltergeist (1.5.1) @@ -362,6 +365,7 @@ GEM websocket-driver (>= 0.2.0) polyglot (0.3.4) posix-spawn (0.3.9) + powerpack (0.0.9) pry (0.9.12.4) coderay (~> 1.0) method_source (~> 0.8) @@ -404,20 +408,12 @@ GEM sprockets-rails (~> 2.0) rails_autolink (1.1.6) rails (> 3.1) - rails_best_practices (1.14.4) - activesupport - awesome_print - code_analyzer (>= 0.4.3) - colored - erubis - i18n - require_all - ruby-progressbar railties (4.1.1) actionpack (= 4.1.1) activesupport (= 4.1.1) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) + rainbow (2.0.0) raindrops (0.13.0) rake (10.3.2) raphael-rails (2.1.2) @@ -448,7 +444,6 @@ GEM redis (>= 2.2) ref (1.0.5) request_store (1.0.5) - require_all (1.3.2) rest-client (1.6.7) mime-types (>= 1.16) rinku (1.7.3) @@ -468,7 +463,13 @@ GEM rspec-core (~> 2.14.0) rspec-expectations (~> 2.14.0) rspec-mocks (~> 2.14.0) - ruby-progressbar (1.2.0) + rubocop (0.28.0) + astrolabe (~> 1.3) + parser (>= 2.2.0.pre.7, < 3.0) + powerpack (~> 0.0.6) + rainbow (>= 1.99.1, < 3.0) + ruby-progressbar (~> 1.4) + ruby-progressbar (1.7.1) rubyntlm (0.4.0) rubypants (0.2.0) rugged (0.21.2) @@ -496,7 +497,6 @@ GEM semantic-ui-sass (1.8.0.0) sass (~> 3.2) settingslogic (2.0.9) - sexp_processor (4.4.0) shoulda-matchers (2.7.0) activesupport (>= 3.0.0) sidekiq (3.3.0) @@ -520,7 +520,7 @@ GEM slim (2.0.2) temple (~> 0.6.6) tilt (>= 1.3.3, < 2.1) - slop (3.4.7) + slop (3.6.0) spinach (0.8.7) colorize (= 0.5.8) gherkin-ruby (>= 0.3.1) @@ -704,7 +704,6 @@ DEPENDENCIES rack-oauth2 (~> 1.0.5) rails (~> 4.1.0) rails_autolink (~> 1.1) - rails_best_practices raphael-rails (~> 2.1.2) rb-fsevent rb-inotify @@ -713,6 +712,7 @@ DEPENDENCIES redis-rails request_store rspec-rails + rubocop (= 0.28.0) rugments sanitize (~> 2.0) sass-rails (~> 4.0.2) From 46b6ceeac7a6c24456a5669a49599e4d7fcd4755 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 19:11:45 -0800 Subject: [PATCH 54/96] At first disable all checks. We will enable it one by one later --- .rubocop.yml | 996 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 988 insertions(+), 8 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 4579fbcd2e..8f54d5d376 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,19 +1,999 @@ -StringLiterals: +Style/AccessModifierIndentation: + Description: Check indentation of private/protected visibility modifiers. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-public-private-protected' Enabled: false -LineLength: + +Style/AccessorMethodName: + Description: Check the naming of accessor methods for get_/set_. Enabled: false -Documentation: + +Style/Alias: + Description: 'Use alias_method instead of alias.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method' Enabled: false -UnusedMethodArgument: + +Style/AlignArray: + Description: >- + Align the elements of an array literal if they span more than + one line. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#align-multiline-arrays' Enabled: false -UnusedBlockArgument: + +Style/AlignHash: + Description: >- + Align the elements of a hash literal if they span more than + one line. Enabled: false -TrailingWhitespace: + +Style/AlignParameters: + Description: >- + Align the parameters of a method call if they span more + than one line. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-double-indent' Enabled: false -MethodLength: + +Style/AndOr: + Description: 'Use &&/|| instead of and/or.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-and-or-or' Enabled: false -ClassLength: + +Style/ArrayJoin: + Description: 'Use Array#join instead of Array#*.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#array-join' Enabled: false + +Style/AsciiComments: + Description: 'Use only ascii symbols in comments.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments' + Enabled: false + +Style/AsciiIdentifiers: + Description: 'Use only ascii symbols in identifiers.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers' + Enabled: false + +Style/Attr: + Description: 'Checks for uses of Module#attr.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr' + Enabled: false + +Style/BeginBlock: + Description: 'Avoid the use of BEGIN blocks.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-BEGIN-blocks' + Enabled: false + +Style/BarePercentLiterals: + Description: 'Checks if usage of %() or %Q() matches configuration.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q-shorthand' + Enabled: false + +Style/BlockComments: + Description: 'Do not use block comments.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-block-comments' + Enabled: false + +Style/BlockEndNewline: + Description: 'Put end statement of multiline block on its own line.' + Enabled: false + +Style/Blocks: + Description: >- + Avoid using {...} for multi-line blocks (multiline chaining is + always ugly). + Prefer {...} over do...end for single-line blocks. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' + Enabled: false + +Style/BracesAroundHashParameters: + Description: 'Enforce braces style around hash parameters.' + Enabled: false + +Style/CaseEquality: + Description: 'Avoid explicit use of the case equality operator(===).' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-case-equality' + Enabled: false + +Style/CaseIndentation: + Description: 'Indentation of when in a case/when/[else/]end.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-when-to-case' + Enabled: false + +Style/CharacterLiteral: + Description: 'Checks for uses of character literals.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals' + Enabled: false + +Style/ClassAndModuleCamelCase: + Description: 'Use CamelCase for classes and modules.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#camelcase-classes' + Enabled: false + +Style/ClassAndModuleChildren: + Description: 'Checks style of children classes and modules.' + Enabled: false + +Style/ClassCheck: + Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.' + Enabled: false + +Style/ClassMethods: + Description: 'Use self when defining module/class methods.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#def-self-singletons' + Enabled: false + +Style/ClassVars: + Description: 'Avoid the use of class variables.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars' + Enabled: false + +Style/ColonMethodCall: + Description: 'Do not use :: for method call.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#double-colons' + Enabled: false + +Style/CommentAnnotation: + Description: >- + Checks formatting of special comments + (TODO, FIXME, OPTIMIZE, HACK, REVIEW). + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#annotate-keywords' + Enabled: false + +Style/CommentIndentation: + Description: 'Indentation of comments.' + Enabled: false + +Style/ConstantName: + Description: 'Constants should use SCREAMING_SNAKE_CASE.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#screaming-snake-case' + Enabled: false + +Style/DefWithParentheses: + Description: 'Use def with parentheses when there are arguments.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#method-parens' + Enabled: false + +Style/DeprecatedHashMethods: + Description: 'Checks for use of deprecated Hash methods.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-key' + Enabled: false + +Style/Documentation: + Description: 'Document classes and non-namespace modules.' + Enabled: false + +Style/DotPosition: + Description: 'Checks the position of the dot in multi-line method calls.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains' + Enabled: false + +Style/DoubleNegation: + Description: 'Checks for uses of double negation (!!).' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-bang-bang' + Enabled: false + +Style/EachWithObject: + Description: 'Prefer `each_with_object` over `inject` or `reduce`.' + Enabled: false + +Style/ElseAlignment: + Description: 'Align elses and elsifs correctly.' + Enabled: false + +Style/EmptyElse: + Description: 'Avoid empty else-clauses.' + Enabled: false + +Style/EmptyLineBetweenDefs: + Description: 'Use empty lines between defs.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#empty-lines-between-methods' + Enabled: false + +Style/EmptyLines: + Description: "Don't use several empty lines in a row." + Enabled: false + +Style/EmptyLinesAroundAccessModifier: + Description: "Keep blank lines around access modifiers." + Enabled: false + +Style/EmptyLinesAroundBlockBody: + Description: "Keeps track of empty lines around block bodies." + Enabled: false + +Style/EmptyLinesAroundClassBody: + Description: "Keeps track of empty lines around class bodies." + Enabled: false + +Style/EmptyLinesAroundModuleBody: + Description: "Keeps track of empty lines around module bodies." + Enabled: false + +Style/EmptyLinesAroundMethodBody: + Description: "Keeps track of empty lines around method bodies." + Enabled: false + +Style/EmptyLiteral: + Description: 'Prefer literals to Array.new/Hash.new/String.new.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#literal-array-hash' + Enabled: false + +Style/EndBlock: + Description: 'Avoid the use of END blocks.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-END-blocks' + Enabled: false + +Style/EndOfLine: + Description: 'Use Unix-style line endings.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#crlf' + Enabled: false + +Style/EvenOdd: + Description: 'Favor the use of Fixnum#even? && Fixnum#odd?' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods' + Enabled: false + +Style/FileName: + Description: 'Use snake_case for source file names.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files' + Enabled: false + +Style/FlipFlop: + Description: 'Checks for flip flops' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-flip-flops' + Enabled: false + +Style/For: + Description: 'Checks use of for or each in multiline loops.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-for-loops' + Enabled: false + +Style/FormatString: + Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf' + Enabled: false + +Style/GlobalVars: + Description: 'Do not introduce global variables.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars' + Enabled: false + +Style/GuardClause: + Description: 'Check for conditionals that can be replaced with guard clauses' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals' + Enabled: false + +Style/HashSyntax: + Description: >- + Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax + { :a => 1, :b => 2 }. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-literals' + Enabled: false + +Style/IfUnlessModifier: + Description: >- + Favor modifier if/unless usage when you have a + single-line body. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier' + Enabled: false + +Style/IfWithSemicolon: + Description: 'Do not use if x; .... Use the ternary operator instead.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs' + Enabled: false + +Style/IndentationConsistency: + Description: 'Keep indentation straight.' + Enabled: false + +Style/IndentationWidth: + Description: 'Use 2 spaces for indentation.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' + Enabled: false + +Style/IndentArray: + Description: >- + Checks the indentation of the first element in an array + literal. + Enabled: false + +Style/IndentHash: + Description: 'Checks the indentation of the first key in a hash literal.' + Enabled: false + +Style/InfiniteLoop: + Description: 'Use Kernel#loop for infinite loops.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#infinite-loop' + Enabled: false + +Style/Lambda: + Description: 'Use the new lambda literal syntax for single-line blocks.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#lambda-multi-line' + Enabled: false + +Style/LambdaCall: + Description: 'Use lambda.call(...) instead of lambda.(...).' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc-call' + Enabled: false + +Style/LeadingCommentSpace: + Description: 'Comments should start with a space.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-space' + Enabled: false + +Style/LineEndConcatenation: + Description: >- + Use \ instead of + or << to concatenate two string literals at + line end. + Enabled: false + +Style/MethodCallParentheses: + Description: 'Do not use parentheses for method calls with no arguments.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-args-no-parens' + Enabled: false + +Style/MethodDefParentheses: + Description: >- + Checks if the method definitions have or don't have + parentheses. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#method-parens' + Enabled: false + +Style/MethodName: + Description: 'Use the configured style when naming methods.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-symbols-methods-vars' + Enabled: false + +Style/ModuleFunction: + Description: 'Checks for usage of `extend self` in modules.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#module-function' + Enabled: false + +Style/MultilineBlockChain: + Description: 'Avoid multi-line chains of blocks.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' + Enabled: false + +Style/MultilineBlockLayout: + Description: 'Ensures newlines after multiline block do statements.' + Enabled: false + +Style/MultilineIfThen: + Description: 'Do not use then for multi-line if/unless.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-then' + Enabled: false + +Style/MultilineOperationIndentation: + Description: >- + Checks indentation of binary operations that span more than + one line. + Enabled: false + +Style/MultilineTernaryOperator: + Description: >- + Avoid multi-line ?: (the ternary operator); + use if/unless instead. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-multiline-ternary' + Enabled: false + +Style/NegatedIf: + Description: >- + Favor unless over if for negative conditions + (or control flow or). + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#unless-for-negatives' + Enabled: false + +Style/NegatedWhile: + Description: 'Favor until over while for negative conditions.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#until-for-negatives' + Enabled: false + +Style/NestedTernaryOperator: + Description: 'Use one expression per branch in a ternary operator.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-ternary' + Enabled: false + +Style/Next: + Description: 'Use `next` to skip iteration instead of a condition at the end.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals' + Enabled: false + +Style/NilComparison: + Description: 'Prefer x.nil? to x == nil.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods' + Enabled: false + +Style/NonNilCheck: + Description: 'Checks for redundant nil checks.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-non-nil-checks' + Enabled: false + +Style/Not: + Description: 'Use ! instead of not.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bang-not-not' + Enabled: false + +Style/NumericLiterals: + Description: >- + Add underscores to large numeric literals to improve their + readability. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics' + Enabled: false + +Style/OneLineConditional: + Description: >- + Favor the ternary operator(?:) over + if/then/else/end constructs. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#ternary-operator' + Enabled: false + +Style/OpMethod: + Description: 'When defining binary operators, name the argument other.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg' + Enabled: false + +Style/ParenthesesAroundCondition: + Description: >- + Don't use parentheses around the condition of an + if/unless/while. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-parens-if' + Enabled: false + +Style/PercentLiteralDelimiters: + Description: 'Use `%`-literal delimiters consistently' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-literal-braces' + Enabled: false + +Style/PercentQLiterals: + Description: 'Checks if uses of %Q/%q match the configured preference.' + Enabled: false + +Style/PerlBackrefs: + Description: 'Avoid Perl-style regex back references.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers' + Enabled: false + +Style/PredicateName: + Description: 'Check the names of predicate methods.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark' + Enabled: false + +Style/Proc: + Description: 'Use proc instead of Proc.new.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc' + Enabled: false + +Style/RaiseArgs: + Description: 'Checks the arguments passed to raise/fail.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#exception-class-messages' + Enabled: false + +Style/RedundantBegin: + Description: "Don't use begin blocks when they are not needed." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#begin-implicit' + Enabled: false + +Style/RedundantException: + Description: "Checks for an obsolete RuntimeException argument in raise/fail." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-runtimeerror' + Enabled: false + +Style/RedundantReturn: + Description: "Don't use return where it's not required." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-return' + Enabled: false + +Style/RedundantSelf: + Description: "Don't use self where it's not needed." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-self-unless-required' + Enabled: false + +Style/RegexpLiteral: + Description: >- + Use %r for regular expressions matching more than + `MaxSlashes` '/' characters. + Use %r only for regular expressions matching more than + `MaxSlashes` '/' character. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-r' + Enabled: false + +Style/RescueModifier: + Description: 'Avoid using rescue in its modifier form.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-rescue-modifiers' + Enabled: false + +Style/SelfAssignment: + Description: >- + Checks for places where self-assignment shorthand should have + been used. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#self-assignment' + Enabled: false + +Style/Semicolon: + Description: "Don't use semicolons to terminate expressions." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon' + Enabled: false + +Style/SignalException: + Description: 'Checks for proper usage of fail and raise.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#fail-method' + Enabled: false + +Style/SingleLineBlockParams: + Description: 'Enforces the names of some block params.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#reduce-blocks' + Enabled: false + +Style/SingleLineMethods: + Description: 'Avoid single-line methods.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-single-line-methods' + Enabled: false + +Style/SingleSpaceBeforeFirstArg: + Description: >- + Checks that exactly one space is used between a method name + and the first argument for method calls without parentheses. + Enabled: false + +Style/SpaceAfterColon: + Description: 'Use spaces after colons.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' + Enabled: false + +Style/SpaceAfterComma: + Description: 'Use spaces after commas.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' + Enabled: false + +Style/SpaceAfterControlKeyword: + Description: 'Use spaces after if/elsif/unless/while/until/case/when.' + Enabled: false + +Style/SpaceAfterMethodName: + Description: >- + Do not put a space between a method name and the opening + parenthesis in a method definition. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces' + Enabled: false + +Style/SpaceAfterNot: + Description: Tracks redundant space after the ! operator. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-space-bang' + Enabled: false + +Style/SpaceAfterSemicolon: + Description: 'Use spaces after semicolons.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' + Enabled: false + +Style/SpaceBeforeBlockBraces: + Description: >- + Checks that the left block brace has or doesn't have space + before it. + Enabled: false + +Style/SpaceBeforeComma: + Description: 'No spaces before commas.' + Enabled: false + +Style/SpaceBeforeComment: + Description: >- + Checks for missing space between code and a comment on the + same line. + Enabled: false + +Style/SpaceBeforeSemicolon: + Description: 'No spaces before semicolons.' + Enabled: false + +Style/SpaceInsideBlockBraces: + Description: >- + Checks that block braces have or don't have surrounding space. + For blocks taking parameters, checks that the left brace has + or doesn't have trailing space. + Enabled: false + +Style/SpaceAroundEqualsInParameterDefault: + Description: >- + Checks that the equals signs in parameter default assignments + have or don't have surrounding space depending on + configuration. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-around-equals' + Enabled: false + +Style/SpaceAroundOperators: + Description: 'Use spaces around operators.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' + Enabled: false + +Style/SpaceBeforeModifierKeyword: + Description: 'Put a space before the modifier keyword.' + Enabled: false + +Style/SpaceInsideBrackets: + Description: 'No spaces after [ or before ].' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-spaces-braces' + Enabled: false + +Style/SpaceInsideHashLiteralBraces: + Description: "Use spaces inside hash literal braces - or don't." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' + Enabled: false + +Style/SpaceInsideParens: + Description: 'No spaces after ( or before ).' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-spaces-braces' + Enabled: false + +Style/SpaceInsideRangeLiteral: + Description: 'No spaces inside range literals.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-space-inside-range-literals' + Enabled: false + +Style/SpecialGlobalVars: + Description: 'Avoid Perl-style global variables.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms' + Enabled: false + +Style/StringLiterals: + Description: 'Checks if uses of quotes match the configured preference.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-string-literals' + Enabled: false + +Style/StringLiteralsInInterpolation: + Description: >- + Checks if uses of quotes inside expressions in interpolated + strings match the configured preference. + Enabled: false + +Style/SymbolProc: + Description: 'Use symbols as procs instead of blocks when possible.' + Enabled: false + +Style/Tab: + Description: 'No hard tabs.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' + Enabled: false + +Style/TrailingBlankLines: + Description: 'Checks trailing blank lines and final newline.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#newline-eof' + Enabled: false + +Style/TrailingComma: + Description: 'Checks for trailing comma in parameter lists and literals.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas' + Enabled: false + +Style/TrailingWhitespace: + Description: 'Avoid trailing whitespace.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-whitespace' + Enabled: false + +Style/TrivialAccessors: + Description: 'Prefer attr_* methods to trivial readers/writers.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family' + Enabled: false + +Style/UnlessElse: + Description: >- + Do not use unless with else. Rewrite these with the positive + case first. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-else-with-unless' + Enabled: false + +Style/UnneededCapitalW: + Description: 'Checks for %W when interpolation is not needed.' + Enabled: false + +Style/UnneededPercentQ: + Description: 'Checks for %q/%Q when single quotes or double quotes would do.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q' + Enabled: false + +Style/UnneededPercentX: + Description: 'Checks for %x when `` would do.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-x' + Enabled: false + +Style/VariableInterpolation: + Description: >- + Don't interpolate global, instance and class variables + directly in strings. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#curlies-interpolate' + Enabled: false + +Style/VariableName: + Description: 'Use the configured style when naming variables.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-symbols-methods-vars' + Enabled: false + +Style/WhenThen: + Description: 'Use when x then ... for one-line cases.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#one-line-cases' + Enabled: false + +Style/WhileUntilDo: + Description: 'Checks for redundant do after while or until.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-multiline-while-do' + Enabled: false + +Style/WhileUntilModifier: + Description: >- + Favor modifier while/until usage when you have a + single-line body. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#while-as-a-modifier' + Enabled: false + +Style/WordArray: + Description: 'Use %w or %W for arrays of words.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-w' + Enabled: false + +#################### Metrics ################################ + +Metrics/AbcSize: + Description: >- + A calculated magnitude based on number of assignments, + branches, and conditions. + Enabled: false + +Metrics/BlockNesting: + Description: 'Avoid excessive block nesting' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count' + Enabled: false + +Metrics/ClassLength: + Description: 'Avoid classes longer than 100 lines of code.' + Enabled: false + +Metrics/CyclomaticComplexity: + Description: >- + A complexity metric that is strongly correlated to the number + of test cases needed to validate a method. + Enabled: false + +Metrics/LineLength: + Description: 'Limit lines to 80 characters.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits' + Enabled: false + +Metrics/MethodLength: + Description: 'Avoid methods longer than 10 lines of code.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods' + Enabled: false + +Metrics/ParameterLists: + Description: 'Avoid parameter lists longer than three or four parameters.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params' + Enabled: false + +Metrics/PerceivedComplexity: + Description: >- + A complexity metric geared towards measuring complexity for a + human reader. + Enabled: false + +#################### Lint ################################ +### Warnings + +Lint/AmbiguousOperator: + Description: >- + Checks for ambiguous operators in the first argument of a + method invocation without parentheses. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-as-args' + Enabled: false + +Lint/AmbiguousRegexpLiteral: + Description: >- + Checks for ambiguous regexp literals in the first argument of + a method invocation without parenthesis. + Enabled: false + +Lint/AssignmentInCondition: + Description: "Don't use assignment in conditions." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition' + Enabled: false + +Lint/BlockAlignment: + Description: 'Align block ends correctly.' + Enabled: false + +Lint/ConditionPosition: + Description: >- + Checks for condition placed in a confusing position relative to + the keyword. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#same-line-condition' + Enabled: false + +Lint/Debugger: + Description: 'Check for debugger calls.' + Enabled: false + +Lint/DefEndAlignment: + Description: 'Align ends corresponding to defs correctly.' + Enabled: false + +Lint/DeprecatedClassMethods: + Description: 'Check for deprecated class method calls.' + Enabled: false + +Lint/DuplicateMethods: + Description: 'Check for duplicate methods calls.' + Enabled: false + +Lint/ElseLayout: + Description: 'Check for odd code arrangement in an else block.' + Enabled: false + +Lint/EmptyEnsure: + Description: 'Checks for empty ensure block.' + Enabled: false + +Lint/EmptyInterpolation: + Description: 'Checks for empty string interpolation.' + Enabled: false + +Lint/EndAlignment: + Description: 'Align ends correctly.' + Enabled: false + +Lint/EndInMethod: + Description: 'END blocks should not be placed inside method definitions.' + Enabled: false + +Lint/EnsureReturn: + Description: 'Do not use return in an ensure block.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-return-ensure' + Enabled: false + +Lint/Eval: + Description: 'The use of eval represents a serious security risk.' + Enabled: false + +Lint/HandleExceptions: + Description: "Don't suppress exception." + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions' + Enabled: false + +Lint/InvalidCharacterLiteral: + Description: >- + Checks for invalid character literals with a non-escaped + whitespace character. + Enabled: false + +Lint/LiteralInCondition: + Description: 'Checks of literals used in conditions.' + Enabled: false + +Lint/LiteralInInterpolation: + Description: 'Checks for literals used in interpolation.' + Enabled: false + +Lint/Loop: + Description: >- + Use Kernel#loop with break rather than begin/end/until or + begin/end/while for post-loop tests. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#loop-with-break' + Enabled: false + +Lint/ParenthesesAsGroupedExpression: + Description: >- + Checks for method calls with a space before the opening + parenthesis. + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces' + Enabled: false + +Lint/RequireParentheses: + Description: >- + Use parentheses in the method call to avoid confusion + about precedence. + Enabled: false + +Lint/RescueException: + Description: 'Avoid rescuing the Exception class.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-blind-rescues' + Enabled: false + +Lint/ShadowingOuterLocalVariable: + Description: >- + Do not use the same name as outer local variable + for block arguments or block local variables. + Enabled: false + +Lint/SpaceBeforeFirstArg: + Description: >- + Put a space between a method name and the first argument + in a method call without parentheses. + Enabled: false + +Lint/StringConversionInInterpolation: + Description: 'Checks for Object#to_s usage in string interpolation.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-to-s' + Enabled: false + +Lint/UnderscorePrefixedVariableName: + Description: 'Do not use prefix `_` for a variable that is used.' + Enabled: false + +Lint/UnusedBlockArgument: + Description: 'Checks for unused block arguments.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' + Enabled: false + +Lint/UnusedMethodArgument: + Description: 'Checks for unused method arguments.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' + Enabled: false + +Lint/UnreachableCode: + Description: 'Unreachable code.' + Enabled: false + +Lint/UselessAccessModifier: + Description: 'Checks for useless access modifiers.' + Enabled: false + +Lint/UselessAssignment: + Description: 'Checks for useless assignment to a local variable.' + StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' + Enabled: false + +Lint/UselessComparison: + Description: 'Checks for comparison of something with itself.' + Enabled: false + +Lint/UselessElseWithoutRescue: + Description: 'Checks for useless `else` in `begin..end` without `rescue`.' + Enabled: false + +Lint/UselessSetterCall: + Description: 'Checks for useless setter call to a local variable.' + Enabled: false + +Lint/Void: + Description: 'Possible use of operator/literal/variable in void context.' + Enabled: false + +##################### Rails ################################## + +Rails/ActionFilter: + Description: 'Enforces consistent use of action filter methods.' + Enabled: false + +Rails/DefaultScope: + Description: 'Checks if the argument passed to default_scope is a block.' + Enabled: false + +Rails/Delegate: + Description: 'Prefer delegate method for delegations.' + Enabled: false + +Rails/HasAndBelongsToMany: + Description: 'Prefer has_many :through to has_and_belongs_to_many.' + Enabled: false + +Rails/Output: + Description: 'Checks for calls to puts, print, etc.' + Enabled: false + +Rails/ReadWriteAttribute: + Description: >- + Checks for read_attribute(:attr) and + write_attribute(:attr, val). + Enabled: false + +Rails/ScopeArgs: + Description: 'Checks the arguments of ActiveRecord scopes.' + Enabled: false + +Rails/Validation: + Description: 'Use validates :attribute, hash of validations.' + Enabled: false + + +# Exclude some of GitLab files +# +# AllCops: Exclude: - 'spec/**/*' From 4f1d1fc51baf396d49f6b159c84e15194706847c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 19:30:09 -0800 Subject: [PATCH 55/96] Convert hashes to ruby 1.9 style --- .rubocop.yml | 6 +----- app/controllers/github_imports_controller.rb | 4 ++-- app/helpers/emails_helper.rb | 2 +- app/helpers/merge_requests_helper.rb | 2 +- app/models/merge_request.rb | 2 +- app/models/project.rb | 8 ++++---- config/initializers/carrierwave.rb | 10 +++++----- config/initializers/doorkeeper.rb | 4 ++-- config/routes.rb | 6 +++--- lib/api/api_guard.rb | 4 ++-- lib/api/entities.rb | 2 +- lib/gitlab/github/importer.rb | 8 ++++---- 12 files changed, 27 insertions(+), 31 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 8f54d5d376..807527e8d4 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -267,7 +267,7 @@ Style/HashSyntax: Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax { :a => 1, :b => 2 }. StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-literals' - Enabled: false + Enabled: true Style/IfUnlessModifier: Description: >- @@ -817,10 +817,6 @@ Lint/DeprecatedClassMethods: Description: 'Check for deprecated class method calls.' Enabled: false -Lint/DuplicateMethods: - Description: 'Check for duplicate methods calls.' - Enabled: false - Lint/ElseLayout: Description: 'Check for odd code arrangement in an else block.' Enabled: false diff --git a/app/controllers/github_imports_controller.rb b/app/controllers/github_imports_controller.rb index 3c5448bc70..b73e3f7ffa 100644 --- a/app/controllers/github_imports_controller.rb +++ b/app/controllers/github_imports_controller.rb @@ -23,7 +23,7 @@ class GithubImportsController < ApplicationController end def jobs - jobs = current_user.created_projects.where(import_type: "github").to_json(:only => [:id, :import_status]) + jobs = current_user.created_projects.where(import_type: "github").to_json(only: [:id, :import_status]) render json: jobs end @@ -58,7 +58,7 @@ class GithubImportsController < ApplicationController def octo_client Octokit.auto_paginate = true - @octo_client ||= Octokit::Client.new(:access_token => current_user.github_access_token) + @octo_client ||= Octokit::Client.new(access_token: current_user.github_access_token) end def github_auth diff --git a/app/helpers/emails_helper.rb b/app/helpers/emails_helper.rb index b336263049..92cc9c426b 100644 --- a/app/helpers/emails_helper.rb +++ b/app/helpers/emails_helper.rb @@ -31,7 +31,7 @@ module EmailsHelper end def add_email_highlight_css - Rugments::Themes::Github.render(:scope => '.highlight') + Rugments::Themes::Github.render(scope: '.highlight') end def color_email_diff(diffcontent) diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index fe6fd5832f..2c9aeba570 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -15,7 +15,7 @@ module MergeRequestsHelper end def new_mr_from_push_event(event, target_project) - return :merge_request => { + return merge_request: { source_project_id: event.project.id, target_project_id: target_project.id, source_branch: event.branch_name, diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 715257f905..ad2e8d7879 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -76,7 +76,7 @@ class MergeRequest < ActiveRecord::Base merge_request.save end - after_transition :locked => (any - :locked) do |merge_request, transition| + after_transition locked: (any - :locked) do |merge_request, transition| merge_request.locked_at = nil merge_request.save end diff --git a/app/models/project.rb b/app/models/project.rb index f3dddc28ad..f314ed9bd2 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -156,22 +156,22 @@ class Project < ActiveRecord::Base end event :import_finish do - transition :started => :finished + transition started: :finished end event :import_fail do - transition :started => :failed + transition started: :failed end event :import_retry do - transition :failed => :started + transition failed: :started end state :started state :finished state :failed - after_transition any => :started, :do => :add_import_job + after_transition any => :started, do: :add_import_job end class << self diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index d0065b63e5..10dfc30a0c 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -23,11 +23,11 @@ if File.exists?(aws_file) if Rails.env.test? Fog.mock! connection = ::Fog::Storage.new( - :aws_access_key_id => AWS_CONFIG['access_key_id'], - :aws_secret_access_key => AWS_CONFIG['secret_access_key'], - :provider => 'AWS', - :region => AWS_CONFIG['region'] + aws_access_key_id: AWS_CONFIG['access_key_id'], + aws_secret_access_key: AWS_CONFIG['secret_access_key'], + provider: 'AWS', + region: AWS_CONFIG['region'] ) - connection.directories.create(:key => AWS_CONFIG['bucket']) + connection.directories.create(key: AWS_CONFIG['bucket']) end end diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb index 4819ab273d..e9b843e29b 100644 --- a/config/initializers/doorkeeper.rb +++ b/config/initializers/doorkeeper.rb @@ -43,10 +43,10 @@ Doorkeeper.configure do force_ssl_in_redirect_uri false # Provide support for an owner to be assigned to each registered application (disabled by default) - # Optional parameter :confirmation => true (default false) if you want to enforce ownership of + # Optional parameter confirmation: true (default false) if you want to enforce ownership of # a registered application # Note: you must also run the rails g doorkeeper:application_owner generator to provide the necessary support - enable_application_owner :confirmation => false + enable_application_owner confirmation: false # Define access token scopes for your provider # For more information go to diff --git a/config/routes.rb b/config/routes.rb index e122777314..30df1ba0df 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,9 +3,9 @@ require 'api/api' Gitlab::Application.routes.draw do use_doorkeeper do - controllers :applications => 'oauth/applications', - :authorized_applications => 'oauth/authorized_applications', - :authorizations => 'oauth/authorizations' + controllers applications: 'oauth/applications', + authorized_applications: 'oauth/authorized_applications', + authorizations: 'oauth/authorizations' end # # Search diff --git a/lib/api/api_guard.rb b/lib/api/api_guard.rb index 2397551818..28765b142f 100644 --- a/lib/api/api_guard.rb +++ b/lib/api/api_guard.rb @@ -146,7 +146,7 @@ module APIGuard Rack::OAuth2::Server::Resource::Bearer::Forbidden.new( :insufficient_scope, Rack::OAuth2::Server::Resource::ErrorMethods::DEFAULT_DESCRIPTION[:insufficient_scope], - { :scope => e.scopes}) + { scope: e.scopes}) end response.finish @@ -172,4 +172,4 @@ module APIGuard @scopes = scopes end end -end \ No newline at end of file +end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index ac166ed4fb..58339908fd 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -55,7 +55,7 @@ module API expose :path, :path_with_namespace expose :issues_enabled, :merge_requests_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at expose :namespace - expose :forked_from_project, using: Entities::ForkedFromProject, :if => lambda{ | project, options | project.forked? } + expose :forked_from_project, using: Entities::ForkedFromProject, if: lambda{ | project, options | project.forked? } end class ProjectMember < UserBasic diff --git a/lib/gitlab/github/importer.rb b/lib/gitlab/github/importer.rb index c72a1c25e9..9f0fc6c447 100644 --- a/lib/gitlab/github/importer.rb +++ b/lib/gitlab/github/importer.rb @@ -9,12 +9,12 @@ module Gitlab def execute client = octo_client(project.creator.github_access_token) - + #Issues && Comments client.list_issues(project.import_source, state: :all).each do |issue| if issue.pull_request.nil? body = "*Created by: #{issue.user.login}*\n\n#{issue.body}" - + if issue.comments > 0 body += "\n\n\n**Imported comments:**\n" client.issue_comments(project.import_source, issue.number).each do |c| @@ -23,7 +23,7 @@ module Gitlab end project.issues.create!( - description: body, + description: body, title: issue.title, state: issue.state == 'closed' ? 'closed' : 'opened', author_id: gl_user_id(project, issue.user.id) @@ -36,7 +36,7 @@ module Gitlab def octo_client(access_token) ::Octokit.auto_paginate = true - ::Octokit::Client.new(:access_token => access_token) + ::Octokit::Client.new(access_token: access_token) end def gl_user_id(project, github_id) From c8e7928e348117447380455684a3689d43fa492b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 19:33:57 -0800 Subject: [PATCH 56/96] Update CHANGELOG with rubocop --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 2db5beb002..aa7daa1194 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -25,7 +25,7 @@ v 7.8.0 - Upgrade Sidekiq gem to version 3.3.0 - Stop git zombie creation during force push check - Show success/error messages for test setting button in services - - + - Added Rubocop for code style checks - Fix commits pagination - - From afb8ecc3d1569520379a2d0613137c46d44a12ce Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:02:46 -0800 Subject: [PATCH 57/96] Fix syntax error --- app/helpers/merge_requests_helper.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index 2c9aeba570..4c640d4fc5 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -15,11 +15,13 @@ module MergeRequestsHelper end def new_mr_from_push_event(event, target_project) - return merge_request: { - source_project_id: event.project.id, - target_project_id: target_project.id, - source_branch: event.branch_name, - target_branch: target_project.repository.root_ref + return { + merge_request: { + source_project_id: event.project.id, + target_project_id: target_project.id, + source_branch: event.branch_name, + target_branch: target_project.repository.root_ref + } } end From 84a5a548a5e1377f34b7989fc546eaedf86c3510 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:08:23 -0800 Subject: [PATCH 58/96] Add rubocop to rake test and rake test_ci --- lib/tasks/gitlab/test.rake | 1 + lib/tasks/rubocop.rake | 2 ++ lib/tasks/test.rake | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 lib/tasks/rubocop.rake diff --git a/lib/tasks/gitlab/test.rake b/lib/tasks/gitlab/test.rake index c01b00bd1c..b4076f8238 100644 --- a/lib/tasks/gitlab/test.rake +++ b/lib/tasks/gitlab/test.rake @@ -2,6 +2,7 @@ namespace :gitlab do desc "GITLAB | Run all tests" task :test do cmds = [ + %W(rake rubocop), %W(rake spinach), %W(rake spec), %W(rake jasmine:ci) diff --git a/lib/tasks/rubocop.rake b/lib/tasks/rubocop.rake new file mode 100644 index 0000000000..c28e529f86 --- /dev/null +++ b/lib/tasks/rubocop.rake @@ -0,0 +1,2 @@ +require 'rubocop/rake_task' +RuboCop::RakeTask.new diff --git a/lib/tasks/test.rake b/lib/tasks/test.rake index 583f4a876d..3ea9290a81 100644 --- a/lib/tasks/test.rake +++ b/lib/tasks/test.rake @@ -9,5 +9,5 @@ unless Rails.env.production? require 'coveralls/rake/task' Coveralls::RakeTask.new desc "GITLAB | Run all tests on CI with simplecov" - task :test_ci => [:spinach, :spec, 'coveralls:push'] + task :test_ci => [:rubocop, :spinach, :spec, 'coveralls:push'] end From e89058268118e3b2be4ebaf5d7bf2c684b590437 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:36:54 -0800 Subject: [PATCH 59/96] Rubocop enabled for: Use spaces inside hash literal braces --- .rubocop.yml | 2 +- app/controllers/snippets_controller.rb | 2 +- app/helpers/compare_helper.rb | 4 +- app/helpers/projects_helper.rb | 2 +- app/models/hooks/web_hook.rb | 2 +- app/models/identity.rb | 2 +- .../custom_issue_tracker_service.rb | 4 +- .../project_services/gitlab_ci_service.rb | 2 +- .../project_services/issue_tracker_service.rb | 4 +- app/models/project_wiki.rb | 2 +- app/models/user.rb | 4 +- config/initializers/1_settings.rb | 2 +- config/initializers/carrierwave.rb | 2 +- config/routes.rb | 48 +++++++++---------- lib/api/api.rb | 4 +- lib/api/api_guard.rb | 2 +- lib/api/helpers.rb | 2 +- lib/api/project_members.rb | 2 +- lib/gitlab/backend/grack_auth.rb | 8 ++-- lib/gitlab/git_access_status.rb | 4 +- lib/gitlab/satellite/action.rb | 2 +- .../satellite/files/delete_file_action.rb | 4 +- .../satellite/files/edit_file_action.rb | 4 +- lib/gitlab/satellite/files/new_file_action.rb | 4 +- lib/gitlab/satellite/merge_action.rb | 6 +-- lib/gitlab/satellite/satellite.rb | 6 +-- lib/gitlab/upgrader.rb | 2 +- 27 files changed, 66 insertions(+), 66 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 807527e8d4..17494974d1 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -617,7 +617,7 @@ Style/SpaceInsideBrackets: Style/SpaceInsideHashLiteralBraces: Description: "Use spaces inside hash literal braces - or don't." StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false + Enabled: true Style/SpaceInsideParens: Description: 'No spaces after ( or before ).' diff --git a/app/controllers/snippets_controller.rb b/app/controllers/snippets_controller.rb index 312e561b52..1ed3bc388f 100644 --- a/app/controllers/snippets_controller.rb +++ b/app/controllers/snippets_controller.rb @@ -27,7 +27,7 @@ class SnippetsController < ApplicationController @snippets = SnippetsFinder.new.execute(current_user, { filter: :by_user, user: @user, - scope: params[:scope]}). + scope: params[:scope] }). page(params[:page]).per(20) if @user == current_user diff --git a/app/helpers/compare_helper.rb b/app/helpers/compare_helper.rb index 5ff19b8829..dd2e713a54 100644 --- a/app/helpers/compare_helper.rb +++ b/app/helpers/compare_helper.rb @@ -1,7 +1,7 @@ module CompareHelper def compare_to_mr_button? @project.merge_requests_enabled && - params[:from].present? && + params[:from].present? && params[:to].present? && @repository.branch_names.include?(params[:from]) && @repository.branch_names.include?(params[:to]) && @@ -10,6 +10,6 @@ module CompareHelper end def compare_mr_path - new_project_merge_request_path(@project, merge_request: {source_branch: params[:to], target_branch: params[:from]}) + new_project_merge_request_path(@project, merge_request: { source_branch: params[:to], target_branch: params[:from] }) end end diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 0b01be7962..687b087e68 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -95,7 +95,7 @@ module ProjectsHelper class: cls, method: :post, remote: true, - data: {type: 'json'} + data: { type: 'json' } } diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index d1d522be19..327cb585ff 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -44,7 +44,7 @@ class WebHook < ActiveRecord::Base } WebHook.post(post_url, body: data.to_json, - headers: {"Content-Type" => "application/json"}, + headers: { "Content-Type" => "application/json" }, verify: false, basic_auth: auth) end diff --git a/app/models/identity.rb b/app/models/identity.rb index c7cdb63e3d..80e0e3a8a2 100644 --- a/app/models/identity.rb +++ b/app/models/identity.rb @@ -11,5 +11,5 @@ class Identity < ActiveRecord::Base belongs_to :user - validates :extern_uid, allow_blank: true, uniqueness: {scope: :provider} + validates :extern_uid, allow_blank: true, uniqueness: { scope: :provider } end diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb index b6b79589f1..5845e2d352 100644 --- a/app/models/project_services/custom_issue_tracker_service.rb +++ b/app/models/project_services/custom_issue_tracker_service.rb @@ -41,8 +41,8 @@ class CustomIssueTrackerService < IssueTrackerService { type: 'text', name: 'title', placeholder: title }, { type: 'text', name: 'description', placeholder: description }, { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + { type: 'text', name: 'issues_url', placeholder: 'Issue url' }, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' } ] end diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index fadebf968b..248f749b31 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -81,7 +81,7 @@ 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' } ] end end diff --git a/app/models/project_services/issue_tracker_service.rb b/app/models/project_services/issue_tracker_service.rb index acc8b33178..b19c02bab4 100644 --- a/app/models/project_services/issue_tracker_service.rb +++ b/app/models/project_services/issue_tracker_service.rb @@ -44,8 +44,8 @@ class IssueTrackerService < Service [ { type: 'text', name: 'description', placeholder: description }, { type: 'text', name: 'project_url', placeholder: 'Project url' }, - { type: 'text', name: 'issues_url', placeholder: 'Issue url'}, - { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url'} + { type: 'text', name: 'issues_url', placeholder: 'Issue url' }, + { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' } ] end diff --git a/app/models/project_wiki.rb b/app/models/project_wiki.rb index f8a28ca986..55438bee24 100644 --- a/app/models/project_wiki.rb +++ b/app/models/project_wiki.rb @@ -136,7 +136,7 @@ class ProjectWiki def commit_details(action, message = nil, title = nil) commit_message = message || default_message(action, title) - {email: @user.email, name: @user.name, message: commit_message} + { email: @user.email, name: @user.name, message: commit_message } end def default_message(action, title) diff --git a/app/models/user.rb b/app/models/user.rb index 69fe674df8..27724b3ccb 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -113,9 +113,9 @@ class User < ActiveRecord::Base # Validations # validates :name, presence: true - validates :email, presence: true, email: {strict_mode: true}, uniqueness: true + validates :email, presence: true, email: { strict_mode: true }, uniqueness: true validates :bio, length: { maximum: 255 }, allow_blank: true - validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0} + validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 } validates :username, presence: true, uniqueness: { case_sensitive: false }, exclusion: { in: Gitlab::Blacklist.path }, format: { with: Gitlab::Regex.username_regex, diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 1ec842761f..4296e75537 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -148,7 +148,7 @@ Settings.gitlab_shell['ssh_path_prefix'] ||= Settings.send(:build_gitlab_shell_s Settings['backup'] ||= Settingslogic.new({}) Settings.backup['keep_time'] ||= 0 Settings.backup['path'] = File.expand_path(Settings.backup['path'] || "tmp/backups/", Rails.root) -Settings.backup['upload'] ||= Settingslogic.new({'remote_directory' => nil, 'connection' => nil}) +Settings.backup['upload'] ||= Settingslogic.new({ 'remote_directory' => nil, 'connection' => nil }) # Convert upload connection settings to use symbol keys, to make Fog happy if Settings.backup['upload']['connection'] Settings.backup['upload']['connection'] = Hash[Settings.backup['upload']['connection'].map { |k, v| [k.to_sym, v] }] diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 10dfc30a0c..667f198667 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -14,7 +14,7 @@ if File.exists?(aws_file) } config.fog_directory = AWS_CONFIG['bucket'] # required config.fog_public = false # optional, defaults to true - config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {} + config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' } # optional, defaults to {} config.fog_authenticated_url_expiration = 1 << 29 # optional time (in seconds) that authenticated urls will be valid. # when fog_public is false and provider is AWS or Google, defaults to 600 end diff --git a/config/routes.rb b/config/routes.rb index 30df1ba0df..a83c112a88 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -177,7 +177,7 @@ Gitlab::Application.routes.draw do # # Groups Area # - resources :groups, constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} do + resources :groups, constraints: { id: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } do member do get :issues get :merge_requests @@ -215,40 +215,40 @@ Gitlab::Application.routes.draw do scope module: :projects do # Blob routes: - get '/new/:id', to: 'blob#new', constraints: {id: /.+/}, as: 'new_blob' - post '/create/:id', to: 'blob#create', constraints: {id: /.+/}, as: 'create_blob' - get '/edit/:id', to: 'blob#edit', constraints: {id: /.+/}, as: 'edit_blob' - put '/update/:id', to: 'blob#update', constraints: {id: /.+/}, as: 'update_blob' - post '/preview/:id', to: 'blob#preview', constraints: {id: /.+/}, as: 'preview_blob' + get '/new/:id', to: 'blob#new', constraints: { id: /.+/ }, as: 'new_blob' + post '/create/:id', to: 'blob#create', constraints: { id: /.+/ }, as: 'create_blob' + get '/edit/:id', to: 'blob#edit', constraints: { id: /.+/ }, as: 'edit_blob' + put '/update/:id', to: 'blob#update', constraints: { id: /.+/ }, as: 'update_blob' + post '/preview/:id', to: 'blob#preview', constraints: { id: /.+/ }, as: 'preview_blob' resources :blob, only: [:show, :destroy], constraints: { id: /.+/, format: false } do get :diff, on: :member end - resources :raw, only: [:show], constraints: {id: /.+/} - resources :tree, only: [:show], constraints: {id: /.+/, format: /(html|js)/ } + resources :raw, only: [:show], constraints: { id: /.+/ } + resources :tree, only: [:show], constraints: { id: /.+/, format: /(html|js)/ } resource :avatar, only: [:show, :destroy] - resources :commit, only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} - resources :commits, only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} + resources :commit, only: [:show], constraints: { id: /[[:alnum:]]{6,40}/ } + resources :commits, only: [:show], constraints: { id: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } resources :compare, only: [:index, :create] - resources :blame, only: [:show], constraints: {id: /.+/} - resources :network, only: [:show], constraints: {id: /(?:[^.]|\.(?!json$))+/, format: /json/} - resources :graphs, only: [:show], constraints: {id: /(?:[^.]|\.(?!json$))+/, format: /json/} do + resources :blame, only: [:show], constraints: { id: /.+/ } + resources :network, only: [:show], constraints: { id: /(?:[^.]|\.(?!json$))+/, format: /json/ } + resources :graphs, only: [:show], constraints: { id: /(?:[^.]|\.(?!json$))+/, format: /json/ } do member do get :commits end end get '/compare/:from...:to' => 'compare#show', :as => 'compare', - :constraints => {from: /.+/, to: /.+/} + :constraints => { from: /.+/, to: /.+/ } - resources :snippets, constraints: {id: /\d+/} do + resources :snippets, constraints: { id: /\d+/ } do member do get 'raw' end end - resources :wikis, only: [:show, :edit, :destroy, :create], constraints: {id: /[a-zA-Z.0-9_\-\/]+/} do + resources :wikis, only: [:show, :edit, :destroy, :create], constraints: { id: /[a-zA-Z.0-9_\-\/]+/ } do collection do get :pages put ':id' => 'wikis#update' @@ -275,7 +275,7 @@ Gitlab::Application.routes.draw do end end - resources :deploy_keys, constraints: {id: /\d+/} do + resources :deploy_keys, constraints: { id: /\d+/ } do member do put :enable put :disable @@ -303,7 +303,7 @@ Gitlab::Application.routes.draw do end end - resources :merge_requests, constraints: {id: /\d+/}, except: [:destroy] do + resources :merge_requests, constraints: { id: /\d+/ }, except: [:destroy] do member do get :diffs post :automerge @@ -318,27 +318,27 @@ Gitlab::Application.routes.draw do end end - resources :hooks, only: [:index, :create, :destroy], constraints: {id: /\d+/} do + resources :hooks, only: [:index, :create, :destroy], constraints: { id: /\d+/ } do member do get :test end end resources :team, controller: 'team_members', only: [:index] - resources :milestones, except: [:destroy], constraints: {id: /\d+/} do + resources :milestones, except: [:destroy], constraints: { id: /\d+/ } do member do put :sort_issues put :sort_merge_requests end end - resources :labels, constraints: {id: /\d+/} do + resources :labels, constraints: { id: /\d+/ } do collection do post :generate end end - resources :issues, constraints: {id: /\d+/}, except: [:destroy] do + resources :issues, constraints: { id: /\d+/ }, except: [:destroy] do collection do post :bulk_update end @@ -355,7 +355,7 @@ Gitlab::Application.routes.draw do end end - resources :notes, only: [:index, :create, :destroy, :update], constraints: {id: /\d+/} do + resources :notes, only: [:index, :create, :destroy, :update], constraints: { id: /\d+/ } do member do delete :delete_attachment end @@ -364,7 +364,7 @@ Gitlab::Application.routes.draw do end end - get ':id' => 'namespaces#show', constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} + get ':id' => 'namespaces#show', constraints: { id: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } root to: 'dashboard#show' end diff --git a/lib/api/api.rb b/lib/api/api.rb index cb46f477ff..60858a3940 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -6,7 +6,7 @@ module API version 'v3', using: :path rescue_from ActiveRecord::RecordNotFound do - rack_response({'message' => '404 Not found'}.to_json, 404) + rack_response({ 'message' => '404 Not found' }.to_json, 404) end rescue_from :all do |exception| @@ -19,7 +19,7 @@ module API message << " " << trace.join("\n ") API.logger.add Logger::FATAL, message - rack_response({'message' => '500 Internal Server Error'}, 500) + rack_response({ 'message' => '500 Internal Server Error' }, 500) end format :json diff --git a/lib/api/api_guard.rb b/lib/api/api_guard.rb index 28765b142f..be3d053efc 100644 --- a/lib/api/api_guard.rb +++ b/lib/api/api_guard.rb @@ -146,7 +146,7 @@ module APIGuard Rack::OAuth2::Server::Resource::Bearer::Forbidden.new( :insufficient_scope, Rack::OAuth2::Server::Resource::ErrorMethods::DEFAULT_DESCRIPTION[:insufficient_scope], - { scope: e.scopes}) + { scope: e.scopes }) end response.finish diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 62c26ef76c..1ded63d136 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -173,7 +173,7 @@ module API end def render_api_error!(message, status) - error!({'message' => message}, status) + error!({ 'message' => message }, status) end private diff --git a/lib/api/project_members.rb b/lib/api/project_members.rb index 8e32f124ea..1e890f9e19 100644 --- a/lib/api/project_members.rb +++ b/lib/api/project_members.rb @@ -106,7 +106,7 @@ module API unless team_member.nil? team_member.destroy else - {message: "Access revoked", id: params[:user_id].to_i} + { message: "Access revoked", id: params[:user_id].to_i } end end end diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb index 2e393f753e..3f207c5663 100644 --- a/lib/gitlab/backend/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -34,7 +34,7 @@ module Grack def auth! if @auth.provided? return bad_request unless @auth.basic? - + # Authentication with username and password login, password = @auth.credentials @@ -80,11 +80,11 @@ module Grack def authenticate_user(login, password) user = Gitlab::Auth.new.find(login, password) - + unless user user = oauth_access_token_check(login, password) end - + return user if user.present? # At this point, we know the credentials were wrong. We let Rack::Attack @@ -154,7 +154,7 @@ module Grack end def render_not_found - [404, {"Content-Type" => "text/plain"}, ["Not Found"]] + [404, { "Content-Type" => "text/plain" }, ["Not Found"]] end end end diff --git a/lib/gitlab/git_access_status.rb b/lib/gitlab/git_access_status.rb index 3d451ecebe..5a806ff6e0 100644 --- a/lib/gitlab/git_access_status.rb +++ b/lib/gitlab/git_access_status.rb @@ -9,7 +9,7 @@ module Gitlab end def to_json - {status: @status, message: @message}.to_json + { status: @status, message: @message }.to_json end end -end \ No newline at end of file +end diff --git a/lib/gitlab/satellite/action.rb b/lib/gitlab/satellite/action.rb index be45cb5c98..4890ccf21e 100644 --- a/lib/gitlab/satellite/action.rb +++ b/lib/gitlab/satellite/action.rb @@ -44,7 +44,7 @@ module Gitlab end def default_options(options = {}) - {raise: true, timeout: true}.merge(options) + { raise: true, timeout: true }.merge(options) end def handle_exception(exception) diff --git a/lib/gitlab/satellite/files/delete_file_action.rb b/lib/gitlab/satellite/files/delete_file_action.rb index 30462999aa..0d37b9dea8 100644 --- a/lib/gitlab/satellite/files/delete_file_action.rb +++ b/lib/gitlab/satellite/files/delete_file_action.rb @@ -13,7 +13,7 @@ module Gitlab prepare_satellite!(repo) # create target branch in satellite at the corresponding commit from bare repo - repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}") + repo.git.checkout({ raise: true, timeout: true, b: true }, ref, "origin/#{ref}") # update the file in the satellite's working dir file_path_in_satellite = File.join(repo.working_dir, file_path) @@ -36,7 +36,7 @@ module Gitlab # push commit back to bare repo # will raise CommandFailed when push fails - repo.git.push({raise: true, timeout: true}, :origin, ref) + repo.git.push({ raise: true, timeout: true }, :origin, ref) # everything worked true diff --git a/lib/gitlab/satellite/files/edit_file_action.rb b/lib/gitlab/satellite/files/edit_file_action.rb index cbdf70f7d1..2834b722b2 100644 --- a/lib/gitlab/satellite/files/edit_file_action.rb +++ b/lib/gitlab/satellite/files/edit_file_action.rb @@ -15,7 +15,7 @@ module Gitlab prepare_satellite!(repo) # create target branch in satellite at the corresponding commit from bare repo - repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}") + repo.git.checkout({ raise: true, timeout: true, b: true }, ref, "origin/#{ref}") # update the file in the satellite's working dir file_path_in_satellite = File.join(repo.working_dir, file_path) @@ -36,7 +36,7 @@ module Gitlab # push commit back to bare repo # will raise CommandFailed when push fails - repo.git.push({raise: true, timeout: true}, :origin, ref) + repo.git.push({ raise: true, timeout: true }, :origin, ref) # everything worked true diff --git a/lib/gitlab/satellite/files/new_file_action.rb b/lib/gitlab/satellite/files/new_file_action.rb index 5b657c7aba..69f7ffa94e 100644 --- a/lib/gitlab/satellite/files/new_file_action.rb +++ b/lib/gitlab/satellite/files/new_file_action.rb @@ -19,7 +19,7 @@ module Gitlab # skip this step if we want to add first file to empty repo Satellite::PARKING_BRANCH else - repo.git.checkout({raise: true, timeout: true, b: true}, ref, "origin/#{ref}") + repo.git.checkout({ raise: true, timeout: true, b: true }, ref, "origin/#{ref}") ref end @@ -47,7 +47,7 @@ module Gitlab # push commit back to bare repo # will raise CommandFailed when push fails - repo.git.push({raise: true, timeout: true}, :origin, "#{current_ref}:#{ref}") + repo.git.push({ raise: true, timeout: true }, :origin, "#{current_ref}:#{ref}") # everything worked true diff --git a/lib/gitlab/satellite/merge_action.rb b/lib/gitlab/satellite/merge_action.rb index e9141f735a..25122666f5 100644 --- a/lib/gitlab/satellite/merge_action.rb +++ b/lib/gitlab/satellite/merge_action.rb @@ -86,7 +86,7 @@ module Gitlab in_locked_and_timed_satellite do |merge_repo| prepare_satellite!(merge_repo) update_satellite_source_and_target!(merge_repo) - patch = merge_repo.git.format_patch(default_options({stdout: true}), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}") + patch = merge_repo.git.format_patch(default_options({ stdout: true }), "origin/#{merge_request.target_branch}..source/#{merge_request.source_branch}") end rescue Grit::Git::CommandFailed => ex handle_exception(ex) @@ -128,7 +128,7 @@ module Gitlab # merge the source branch into the satellite # will raise CommandFailed when merge fails - repo.git.merge(default_options({no_ff: true}), "-m#{message}", "source/#{merge_request.source_branch}") + repo.git.merge(default_options({ no_ff: true }), "-m#{message}", "source/#{merge_request.source_branch}") rescue Grit::Git::CommandFailed => ex handle_exception(ex) end @@ -137,7 +137,7 @@ module Gitlab def update_satellite_source_and_target!(repo) repo.remote_add('source', merge_request.source_project.repository.path_to_repo) repo.remote_fetch('source') - repo.git.checkout(default_options({b: true}), merge_request.target_branch, "origin/#{merge_request.target_branch}") + repo.git.checkout(default_options({ b: true }), merge_request.target_branch, "origin/#{merge_request.target_branch}") rescue Grit::Git::CommandFailed => ex handle_exception(ex) end diff --git a/lib/gitlab/satellite/satellite.rb b/lib/gitlab/satellite/satellite.rb index 1de84309d1..62d1bb364d 100644 --- a/lib/gitlab/satellite/satellite.rb +++ b/lib/gitlab/satellite/satellite.rb @@ -98,13 +98,13 @@ module Gitlab if heads.include? PARKING_BRANCH repo.git.checkout({}, PARKING_BRANCH) else - repo.git.checkout(default_options({b: true}), PARKING_BRANCH) + repo.git.checkout(default_options({ b: true }), PARKING_BRANCH) end # remove the parking branch from the list of heads ... heads.delete(PARKING_BRANCH) # ... and delete all others - heads.each { |head| repo.git.branch(default_options({D: true}), head) } + heads.each { |head| repo.git.branch(default_options({ D: true }), head) } end # Deletes all remotes except origin @@ -126,7 +126,7 @@ module Gitlab end def default_options(options = {}) - {raise: true, timeout: true}.merge(options) + { raise: true, timeout: true }.merge(options) end # Create directory for storing diff --git a/lib/gitlab/upgrader.rb b/lib/gitlab/upgrader.rb index 74b049b514..0570c2fbeb 100644 --- a/lib/gitlab/upgrader.rb +++ b/lib/gitlab/upgrader.rb @@ -62,7 +62,7 @@ module Gitlab end def env - {'RAILS_ENV' => 'production'} + { 'RAILS_ENV' => 'production' } end def upgrade From aaae5e6f5ebc61f724e901f26e928f5e3bd9eb88 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:55:05 -0800 Subject: [PATCH 60/96] Rubocop: Style/AccessorMethodName enabled --- .rubocop.yml | 2 +- app/services/projects/image_service.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 17494974d1..ffc20fec4b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,7 +1,7 @@ Style/AccessModifierIndentation: Description: Check indentation of private/protected visibility modifiers. StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-public-private-protected' - Enabled: false + Enabled: true Style/AccessorMethodName: Description: Check the naming of accessor methods for get_/set_. diff --git a/app/services/projects/image_service.rb b/app/services/projects/image_service.rb index c79ddddd97..7ca7e82c4a 100644 --- a/app/services/projects/image_service.rb +++ b/app/services/projects/image_service.rb @@ -14,14 +14,14 @@ module Projects uploader.store!(image) link = { 'alt' => File.basename(alt, '.*'), - 'url' => File.join(@root_url, uploader.url) + 'url' => File.join(@root_url, uploader.url) } else link = nil end end - protected + protected def upload_path base_dir = FileUploader.generate_dir From 9fbdbf8b3fff72ae37a320e7e9fac3b9224e3c53 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:57:10 -0800 Subject: [PATCH 61/96] Rubocop: Style/Alias enabled --- .rubocop.yml | 2 +- app/models/wiki_page.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index ffc20fec4b..c80c9bf907 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -10,7 +10,7 @@ Style/AccessorMethodName: Style/Alias: Description: 'Use alias_method instead of alias.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method' - Enabled: false + Enabled: true Style/AlignArray: Description: >- diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index b9ab6702c5..32981a0e66 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -43,7 +43,7 @@ class WikiPage @attributes[:slug] end - alias :to_param :slug + alias_method :to_param, :slug # The formatted title of this page. def title From c427bf08e41342957632289e084604f53e65e353 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 20:58:28 -0800 Subject: [PATCH 62/96] Rubocop: Style/AlignArray enabled --- .rubocop.yml | 2 +- lib/gitlab/diff/parser.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index c80c9bf907..46634eb233 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -17,7 +17,7 @@ Style/AlignArray: Align the elements of an array literal if they span more than one line. StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#align-multiline-arrays' - Enabled: false + Enabled: true Style/AlignHash: Description: >- diff --git a/lib/gitlab/diff/parser.rb b/lib/gitlab/diff/parser.rb index f7c1f20d76..0242e09a51 100644 --- a/lib/gitlab/diff/parser.rb +++ b/lib/gitlab/diff/parser.rb @@ -4,7 +4,7 @@ module Gitlab include Enumerable def parse(lines) - @lines = lines, + @lines = lines lines_obj = [] line_obj_index = 0 line_old = 1 From cc39bca3fa71930421f1c46844b4d02d5ff93e8b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:15:44 -0800 Subject: [PATCH 63/96] Rubocop: Style/AlignHash enabled --- .rubocop.yml | 2 +- app/controllers/projects/blob_controller.rb | 3 +-- app/helpers/application_helper.rb | 4 ++-- app/models/application_setting.rb | 3 ++- app/models/namespace.rb | 21 ++++++++++++------- app/models/project.rb | 18 +++++++++------- app/models/project_services/bamboo_service.rb | 18 ++++++++++------ .../project_services/teamcity_service.rb | 15 +++++++------ app/models/snippet.rb | 8 ++++--- app/models/user.rb | 10 +++++---- config/routes.rb | 10 ++++----- lib/gitlab/ldap/adapter.rb | 6 ++++-- 12 files changed, 70 insertions(+), 48 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 46634eb233..3c64374772 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -23,7 +23,7 @@ Style/AlignHash: Description: >- Align the elements of a hash literal if they span more than one line. - Enabled: false + Enabled: true Style/AlignParameters: Description: >- diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index b471d57f69..dccb96ba1d 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -59,8 +59,7 @@ class Projects::BlobController < Projects::ApplicationController def preview @content = params[:content] - diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', - include_diff_info: true) + diffy = Diffy::Diff.new(@blob.data, @content, diff: '-U 3', include_diff_info: true) @diff_lines = Gitlab::Diff::Parser.new.parse(diffy.diff.scan(/.*\n/)) render layout: false diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index d00f1aac2d..7417261a84 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -75,9 +75,9 @@ module ApplicationHelper options[:class] ||= '' options[:class] << ' identicon' bg_key = project.id % 7 + style = "background-color: ##{ allowed_colors.values[bg_key] }; color: #555" - content_tag(:div, class: options[:class], - style: "background-color: ##{ allowed_colors.values[bg_key] }; color: #555") do + content_tag(:div, class: options[:class], style: style) do project.name[0, 1].upcase end end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 45ae79a75c..0b3d430add 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -14,7 +14,8 @@ # class ApplicationSetting < ActiveRecord::Base - validates :home_page_url, allow_blank: true, + validates :home_page_url, + allow_blank: true, format: { with: URI::regexp(%w(http https)), message: "should be a valid url" }, if: :home_page_url_column_exist diff --git a/app/models/namespace.rb b/app/models/namespace.rb index ea4b48fdd7..e7fd302475 100644 --- a/app/models/namespace.rb +++ b/app/models/namespace.rb @@ -20,15 +20,20 @@ class Namespace < ActiveRecord::Base belongs_to :owner, class_name: "User" validates :owner, presence: true, unless: ->(n) { n.type == "Group" } - validates :name, presence: true, uniqueness: true, - length: { within: 0..255 }, - format: { with: Gitlab::Regex.name_regex, - message: Gitlab::Regex.name_regex_message } + validates :name, + presence: true, uniqueness: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.name_regex, + message: Gitlab::Regex.name_regex_message } + validates :description, length: { within: 0..255 } - validates :path, uniqueness: { case_sensitive: false }, presence: true, length: { within: 1..255 }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.path_regex, - message: Gitlab::Regex.path_regex_message } + validates :path, + uniqueness: { case_sensitive: false }, + presence: true, + length: { within: 1..255 }, + exclusion: { in: Gitlab::Blacklist.path }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } delegate :name, to: :owner, allow_nil: true, prefix: true diff --git a/app/models/project.rb b/app/models/project.rb index f314ed9bd2..cfe40553ab 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -108,13 +108,17 @@ class Project < ActiveRecord::Base # Validations validates :creator, presence: true, on: :create validates :description, length: { maximum: 2000 }, allow_blank: true - validates :name, presence: true, length: { within: 0..255 }, - format: { with: Gitlab::Regex.project_name_regex, - message: Gitlab::Regex.project_regex_message } - validates :path, presence: true, length: { within: 0..255 }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.path_regex, - message: Gitlab::Regex.path_regex_message } + validates :name, + presence: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.project_name_regex, + message: Gitlab::Regex.project_regex_message } + validates :path, + presence: true, + length: { within: 0..255 }, + exclusion: { in: Gitlab::Blacklist.path }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } validates :issues_enabled, :merge_requests_enabled, :wiki_enabled, inclusion: { in: [true, false] } validates :visibility_level, diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb index 16e1b83da4..745609e591 100644 --- a/app/models/project_services/bamboo_service.rb +++ b/app/models/project_services/bamboo_service.rb @@ -17,13 +17,19 @@ class BambooService < CiService prop_accessor :bamboo_url, :build_key, :username, :password - validates :bamboo_url, presence: true, - format: { with: URI::regexp }, if: :activated? + validates :bamboo_url, + presence: true, + format: { with: URI::regexp }, + if: :activated? validates :build_key, presence: true, if: :activated? - validates :username, presence: true, - if: ->(service) { service.password? }, if: :activated? - validates :password, presence: true, - if: ->(service) { service.username? }, if: :activated? + validates :username, + presence: true, + if: ->(service) { service.password? }, + if: :activated? + validates :password, + presence: true, + if: ->(service) { service.username? }, + if: :activated? attr_accessor :response diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb index dca718b5e8..287f5c0e84 100644 --- a/app/models/project_services/teamcity_service.rb +++ b/app/models/project_services/teamcity_service.rb @@ -17,13 +17,16 @@ class TeamcityService < CiService prop_accessor :teamcity_url, :build_type, :username, :password - validates :teamcity_url, presence: true, - format: { with: URI::regexp }, if: :activated? + validates :teamcity_url, + presence: true, + format: { with: URI::regexp }, if: :activated? validates :build_type, presence: true, if: :activated? - validates :username, presence: true, - if: ->(service) { service.password? }, if: :activated? - validates :password, presence: true, - if: ->(service) { service.username? }, if: :activated? + validates :username, + presence: true, + if: ->(service) { service.password? }, if: :activated? + validates :password, + presence: true, + if: ->(service) { service.username? }, if: :activated? attr_accessor :response diff --git a/app/models/snippet.rb b/app/models/snippet.rb index 9aba42a062..a3222d2989 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -29,9 +29,11 @@ class Snippet < ActiveRecord::Base validates :author, presence: true validates :title, presence: true, length: { within: 0..255 } - validates :file_name, presence: true, length: { within: 0..255 }, - format: { with: Gitlab::Regex.path_regex, - message: Gitlab::Regex.path_regex_message } + validates :file_name, + presence: true, + length: { within: 0..255 }, + format: { with: Gitlab::Regex.path_regex, + message: Gitlab::Regex.path_regex_message } validates :content, presence: true validates :visibility_level, inclusion: { in: Gitlab::VisibilityLevel.values } diff --git a/app/models/user.rb b/app/models/user.rb index 27724b3ccb..552a37c953 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -116,10 +116,12 @@ class User < ActiveRecord::Base validates :email, presence: true, email: { strict_mode: true }, uniqueness: true validates :bio, length: { maximum: 255 }, allow_blank: true validates :projects_limit, presence: true, numericality: { greater_than_or_equal_to: 0 } - validates :username, presence: true, uniqueness: { case_sensitive: false }, - exclusion: { in: Gitlab::Blacklist.path }, - format: { with: Gitlab::Regex.username_regex, - message: Gitlab::Regex.username_regex_message } + validates :username, + presence: true, + uniqueness: { case_sensitive: false }, + exclusion: { in: Gitlab::Blacklist.path }, + format: { with: Gitlab::Regex.username_regex, + message: Gitlab::Regex.username_regex_message } validates :notification_level, inclusion: { in: Notification.notification_levels }, presence: true validate :namespace_uniq, if: ->(user) { user.username_changed? } diff --git a/config/routes.rb b/config/routes.rb index a83c112a88..a2d782cf63 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -294,12 +294,10 @@ Gitlab::Application.routes.draw do member do # tree viewer logs get 'logs_tree', constraints: { id: Gitlab::Regex.git_reference_regex } - get 'logs_tree/:path' => 'refs#logs_tree', - as: :logs_file, - constraints: { - id: Gitlab::Regex.git_reference_regex, - path: /.*/ - } + get 'logs_tree/:path' => 'refs#logs_tree', as: :logs_file, constraints: { + id: Gitlab::Regex.git_reference_regex, + path: /.*/ + } end end diff --git a/lib/gitlab/ldap/adapter.rb b/lib/gitlab/ldap/adapter.rb index 256cdb4c2f..577a890a7d 100644 --- a/lib/gitlab/ldap/adapter.rb +++ b/lib/gitlab/ldap/adapter.rb @@ -63,8 +63,10 @@ module Gitlab end def dn_matches_filter?(dn, filter) - ldap_search(base: dn, filter: filter, - scope: Net::LDAP::SearchScope_BaseObject, attributes: %w{dn}).any? + ldap_search(base: dn, + filter: filter, + scope: Net::LDAP::SearchScope_BaseObject, + attributes: %w{dn}).any? end def ldap_search(*args) From 6579c336f96b00bb7897f7cbf2056286c1781281 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:20:34 -0800 Subject: [PATCH 64/96] Rubocop: Ascii restrictions --- .rubocop.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 3c64374772..c3f3d7bca6 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -45,12 +45,12 @@ Style/ArrayJoin: Style/AsciiComments: Description: 'Use only ascii symbols in comments.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments' - Enabled: false + Enabled: true Style/AsciiIdentifiers: Description: 'Use only ascii symbols in identifiers.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers' - Enabled: false + Enabled: true Style/Attr: Description: 'Checks for uses of Module#attr.' From da884aabc7674c68eee23699efb357bc94aef8d3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:22:57 -0800 Subject: [PATCH 65/96] Avoid using {...} for multi-line blocks --- .rubocop.yml | 4 ++-- lib/api/api_guard.rb | 4 ++-- lib/api/internal.rb | 4 +--- lib/api/namespaces.rb | 4 ++-- lib/api/system_hooks.rb | 4 ++-- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index c3f3d7bca6..319efe7e0d 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -74,7 +74,7 @@ Style/BlockComments: Style/BlockEndNewline: Description: 'Put end statement of multiline block on its own line.' - Enabled: false + Enabled: true Style/Blocks: Description: >- @@ -82,7 +82,7 @@ Style/Blocks: always ugly). Prefer {...} over do...end for single-line blocks. StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' - Enabled: false + Enabled: true Style/BracesAroundHashParameters: Description: 'Enforce braces style around hash parameters.' diff --git a/lib/api/api_guard.rb b/lib/api/api_guard.rb index be3d053efc..cb20bf0720 100644 --- a/lib/api/api_guard.rb +++ b/lib/api/api_guard.rb @@ -120,7 +120,7 @@ module APIGuard end def oauth2_bearer_token_error_handler - Proc.new {|e| + Proc.new do |e| response = case e when MissingTokenError Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new @@ -150,7 +150,7 @@ module APIGuard end response.finish - } + end end end diff --git a/lib/api/internal.rb b/lib/api/internal.rb index a999cff09c..7a89a26fac 100644 --- a/lib/api/internal.rb +++ b/lib/api/internal.rb @@ -1,9 +1,7 @@ module API # Internal access API class Internal < Grape::API - before { - authenticate_by_gitlab_shell_token! - } + before { authenticate_by_gitlab_shell_token! } namespace 'internal' do # Check if git command is allowed to project diff --git a/lib/api/namespaces.rb b/lib/api/namespaces.rb index f9f2ed90cc..b90ed6af5f 100644 --- a/lib/api/namespaces.rb +++ b/lib/api/namespaces.rb @@ -1,10 +1,10 @@ module API # namespaces API class Namespaces < Grape::API - before { + before do authenticate! authenticated_as_admin! - } + end resource :namespaces do # Get a namespaces list diff --git a/lib/api/system_hooks.rb b/lib/api/system_hooks.rb index 3e239c5afe..518964db50 100644 --- a/lib/api/system_hooks.rb +++ b/lib/api/system_hooks.rb @@ -1,10 +1,10 @@ module API # Hooks API class SystemHooks < Grape::API - before { + before do authenticate! authenticated_as_admin! - } + end resource :hooks do # Get the list of system hooks From 368e9a0862dd7d58b009956e8f1ac51d2a549cda Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:26:40 -0800 Subject: [PATCH 66/96] Rubocop: Style/CaseIndentation enabled --- .rubocop.yml | 2 +- app/finders/notes_finder.rb | 25 +++++++++++++------------ lib/api/api_guard.rb | 7 ++----- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 319efe7e0d..923ea00a10 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -96,7 +96,7 @@ Style/CaseEquality: Style/CaseIndentation: Description: 'Indentation of when in a case/when/[else/]end.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-when-to-case' - Enabled: false + Enabled: true Style/CharacterLiteral: Description: 'Checks for uses of character literals.' diff --git a/app/finders/notes_finder.rb b/app/finders/notes_finder.rb index bef82d7f0f..6fe15b4106 100644 --- a/app/finders/notes_finder.rb +++ b/app/finders/notes_finder.rb @@ -7,18 +7,19 @@ class NotesFinder # Default to 0 to remain compatible with old clients last_fetched_at = Time.at(params.fetch(:last_fetched_at, 0).to_i) - notes = case target_type - when "commit" - project.notes.for_commit_id(target_id).not_inline.fresh - when "issue" - project.issues.find(target_id).notes.inc_author.fresh - when "merge_request" - project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh - when "snippet", "project_snippet" - project.snippets.find(target_id).notes.fresh - else - raise 'invalid target_type' - end + notes = + case target_type + when "commit" + project.notes.for_commit_id(target_id).not_inline.fresh + when "issue" + project.issues.find(target_id).notes.inc_author.fresh + when "merge_request" + project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh + when "snippet", "project_snippet" + project.snippets.find(target_id).notes.fresh + else + raise 'invalid target_type' + end # Use overlapping intervals to avoid worrying about race conditions notes.where('updated_at > ?', last_fetched_at - FETCH_OVERLAP) diff --git a/lib/api/api_guard.rb b/lib/api/api_guard.rb index cb20bf0720..b9994fcefd 100644 --- a/lib/api/api_guard.rb +++ b/lib/api/api_guard.rb @@ -47,16 +47,12 @@ module APIGuard case validate_access_token(access_token, scopes) when Oauth2::AccessTokenValidationService::INSUFFICIENT_SCOPE raise InsufficientScopeError.new(scopes) - when Oauth2::AccessTokenValidationService::EXPIRED raise ExpiredError - when Oauth2::AccessTokenValidationService::REVOKED raise RevokedError - when Oauth2::AccessTokenValidationService::VALID @current_user = User.find(access_token.resource_owner_id) - end end end @@ -121,7 +117,8 @@ module APIGuard def oauth2_bearer_token_error_handler Proc.new do |e| - response = case e + response = + case e when MissingTokenError Rack::OAuth2::Server::Resource::Bearer::Unauthorized.new From 7558fe98759ec28c2fd97ae10cb1610a1a6c38cd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:31:03 -0800 Subject: [PATCH 67/96] More rubocop rules enable --- .rubocop.yml | 9 +++++---- lib/email_validator.rb | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 923ea00a10..c1a5d06770 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -60,7 +60,7 @@ Style/Attr: Style/BeginBlock: Description: 'Avoid the use of BEGIN blocks.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-BEGIN-blocks' - Enabled: false + Enabled: true Style/BarePercentLiterals: Description: 'Checks if usage of %() or %Q() matches configuration.' @@ -101,12 +101,12 @@ Style/CaseIndentation: Style/CharacterLiteral: Description: 'Checks for uses of character literals.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals' - Enabled: false + Enabled: true Style/ClassAndModuleCamelCase: Description: 'Use CamelCase for classes and modules.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#camelcase-classes' - Enabled: false + Enabled: true Style/ClassAndModuleChildren: Description: 'Checks style of children classes and modules.' @@ -124,7 +124,7 @@ Style/ClassMethods: Style/ClassVars: Description: 'Avoid the use of class variables.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars' - Enabled: false + Enabled: true Style/ColonMethodCall: Description: 'Do not use :: for method call.' @@ -1000,3 +1000,4 @@ AllCops: - 'bin/**/*' - 'lib/backup/**/*' - 'lib/tasks/**/*' + - 'lib/email_validator.rb' diff --git a/lib/email_validator.rb b/lib/email_validator.rb index 0a67ebcd79..f509f0a584 100644 --- a/lib/email_validator.rb +++ b/lib/email_validator.rb @@ -1,5 +1,5 @@ # Based on https://github.com/balexand/email_validator -# +# # Extended to use only strict mode with following allowed characters: # ' - apostrophe # From 7d48205c1a472c07969e4dc43965fa3090b84376 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:34:16 -0800 Subject: [PATCH 68/96] Rubocop: comment indentation --- .rubocop.yml | 2 +- app/helpers/notes_helper.rb | 2 +- config/initializers/carrierwave.rb | 18 +++++++++++++----- lib/gitlab/git_access.rb | 2 +- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index c1a5d06770..369e55abcd 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -140,7 +140,7 @@ Style/CommentAnnotation: Style/CommentIndentation: Description: 'Indentation of comments.' - Enabled: false + Enabled: true Style/ConstantName: Description: 'Constants should use SCREAMING_SNAKE_CASE.' diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index d41d561739..8edcb8e6a8 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -1,5 +1,5 @@ module NotesHelper - # Helps to distinguish e.g. commit notes in mr notes list + # Helps to distinguish e.g. commit notes in mr notes list def note_for_main_target?(note) (@noteable.class.name == note.noteable_type && !note.for_diff_line?) end diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb index 667f198667..bfb8656df5 100644 --- a/config/initializers/carrierwave.rb +++ b/config/initializers/carrierwave.rb @@ -12,11 +12,19 @@ if File.exists?(aws_file) aws_secret_access_key: AWS_CONFIG['secret_access_key'], # required region: AWS_CONFIG['region'], # optional, defaults to 'us-east-1' } - config.fog_directory = AWS_CONFIG['bucket'] # required - config.fog_public = false # optional, defaults to true - config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' } # optional, defaults to {} - config.fog_authenticated_url_expiration = 1 << 29 # optional time (in seconds) that authenticated urls will be valid. - # when fog_public is false and provider is AWS or Google, defaults to 600 + + # required + config.fog_directory = AWS_CONFIG['bucket'] + + # optional, defaults to true + config.fog_public = false + + # optional, defaults to {} + config.fog_attributes = { 'Cache-Control'=>'max-age=315576000' } + + # optional time (in seconds) that authenticated urls will be valid. + # when fog_public is false and provider is AWS or Google, defaults to 600 + config.fog_authenticated_url_expiration = 1 << 29 end # Mocking Fog requests, based on: https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Test-Fog-based-uploaders diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index ea96d04c5a..0530923b20 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -113,8 +113,8 @@ module Gitlab # we dont allow force push to protected branch if forced_push?(project, oldrev, newrev) :force_push_code_to_protected_branches - # and we dont allow remove of protected branch elsif newrev == Gitlab::Git::BLANK_SHA + # and we dont allow remove of protected branch :remove_protected_branches elsif project.developers_can_push_to_protected_branch?(branch_name) :push_code From 647ff6240ef5e8256a44b126aa7573812d5e70b7 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:38:50 -0800 Subject: [PATCH 69/96] Rubocop: Style/ElseAlignment enabled --- .rubocop.yml | 4 ++-- app/controllers/projects/refs_controller.rb | 8 ++++---- app/helpers/commits_helper.rb | 13 +++++++------ app/models/commit.rb | 11 ++++++----- app/services/projects/participants_service.rb | 11 ++++++----- config/initializers/acts_as_taggable_on_patch.rb | 11 ++++++----- 6 files changed, 31 insertions(+), 27 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 369e55abcd..c14303ab1f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -145,7 +145,7 @@ Style/CommentIndentation: Style/ConstantName: Description: 'Constants should use SCREAMING_SNAKE_CASE.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#screaming-snake-case' - Enabled: false + Enabled: true Style/DefWithParentheses: Description: 'Use def with parentheses when there are arguments.' @@ -177,7 +177,7 @@ Style/EachWithObject: Style/ElseAlignment: Description: 'Align elses and elsifs correctly.' - Enabled: false + Enabled: true Style/EmptyElse: Description: 'Avoid empty else-clauses.' diff --git a/app/controllers/projects/refs_controller.rb b/app/controllers/projects/refs_controller.rb index cede0ebe0a..b80472f8eb 100644 --- a/app/controllers/projects/refs_controller.rb +++ b/app/controllers/projects/refs_controller.rb @@ -31,10 +31,10 @@ class Projects::RefsController < Projects::ApplicationController def logs_tree @offset = if params[:offset].present? - params[:offset].to_i - else - 0 - end + params[:offset].to_i + else + 0 + end @limit = 25 diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 1a322ac048..b4ba14160e 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -112,12 +112,13 @@ module CommitsHelper person_name = user.nil? ? source_name : user.name person_email = user.nil? ? source_email : user.email - text = if options[:avatar] - avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "") - %Q{#{avatar} #{person_name}} - else - person_name - end + text = + if options[:avatar] + avatar = image_tag(avatar_icon(person_email, options[:size]), class: "avatar #{"s#{options[:size]}" if options[:size]}", width: options[:size], alt: "") + %Q{#{avatar} #{person_name}} + else + person_name + end options = { class: "commit-#{options[:source]}-link has_tooltip", diff --git a/app/models/commit.rb b/app/models/commit.rb index baccf28674..e0461809e1 100644 --- a/app/models/commit.rb +++ b/app/models/commit.rb @@ -88,11 +88,12 @@ class Commit # cut off, ellipses (`&hellp;`) are prepended to the commit message. def description title_end = safe_message.index("\n") - @description ||= if (!title_end && safe_message.length > 100) || (title_end && title_end > 100) - "…".html_safe << safe_message[80..-1] - else - safe_message.split("\n", 2)[1].try(:chomp) - end + @description ||= + if (!title_end && safe_message.length > 100) || (title_end && title_end > 100) + "…".html_safe << safe_message[80..-1] + else + safe_message.split("\n", 2)[1].try(:chomp) + end end def description? diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb index c4d2c0963b..e3b33de8d0 100644 --- a/app/services/projects/participants_service.rb +++ b/app/services/projects/participants_service.rb @@ -5,11 +5,12 @@ module Projects end def execute(note_type, note_id) - participating = if note_type && note_id - participants_in(note_type, note_id) - else - [] - end + participating = + if note_type && note_id + participants_in(note_type, note_id) + else + [] + end team_members = sorted(@project.team.members) participants = all_members + team_members + participating participants.uniq diff --git a/config/initializers/acts_as_taggable_on_patch.rb b/config/initializers/acts_as_taggable_on_patch.rb index baa77fde39..e7a7728636 100644 --- a/config/initializers/acts_as_taggable_on_patch.rb +++ b/config/initializers/acts_as_taggable_on_patch.rb @@ -42,11 +42,12 @@ module ActsAsTaggableOn::Taggable elsif options.delete(:any) # get tags, drop out if nothing returned (we need at least one) - tags = if options.delete(:wild) - ActsAsTaggableOn::Tag.named_like_any(tag_list) - else - ActsAsTaggableOn::Tag.named_any(tag_list) - end + tags = + if options.delete(:wild) + ActsAsTaggableOn::Tag.named_like_any(tag_list) + else + ActsAsTaggableOn::Tag.named_any(tag_list) + end return empty_result unless tags.length > 0 From 615bb941358389a1fdfec34abc6af8b61db75580 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:41:38 -0800 Subject: [PATCH 70/96] Rubocop: Dont allow puts or print to stdout --- .rubocop.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index c14303ab1f..1b62416f74 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -970,7 +970,7 @@ Rails/HasAndBelongsToMany: Rails/Output: Description: 'Checks for calls to puts, print, etc.' - Enabled: false + Enabled: true Rails/ReadWriteAttribute: Description: >- @@ -991,6 +991,7 @@ Rails/Validation: # # AllCops: + RunRailsCops: true Exclude: - 'spec/**/*' - 'features/**/*' @@ -1001,3 +1002,5 @@ AllCops: - 'lib/backup/**/*' - 'lib/tasks/**/*' - 'lib/email_validator.rb' + - 'lib/gitlab/upgrader.rb' + - 'lib/gitlab/seeder.rb' From d04344373b899c1e54948ca46478f7b907a576d2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:53:27 -0800 Subject: [PATCH 71/96] Rubocop: no trailing newlines --- .rubocop.yml | 6 +++--- app/controllers/namespaces_controller.rb | 1 - app/controllers/projects/raw_controller.rb | 1 - app/helpers/projects_helper.rb | 1 - app/services/oauth2/access_token_validation_service.rb | 2 +- config/initializers/7_omniauth.rb | 2 +- config/initializers/gitlab_shell_secret_token.rb | 2 +- lib/gitlab/backend/shell_adapter.rb | 1 - lib/gitlab/force_push_check.rb | 1 - 9 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 1b62416f74..965a52c755 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -657,7 +657,7 @@ Style/Tab: Style/TrailingBlankLines: Description: 'Checks trailing blank lines and final newline.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#newline-eof' - Enabled: false + Enabled: true Style/TrailingComma: Description: 'Checks for trailing comma in parameter lists and literals.' @@ -909,7 +909,7 @@ Lint/StringConversionInInterpolation: Lint/UnderscorePrefixedVariableName: Description: 'Do not use prefix `_` for a variable that is used.' - Enabled: false + Enabled: true Lint/UnusedBlockArgument: Description: 'Checks for unused block arguments.' @@ -966,7 +966,7 @@ Rails/Delegate: Rails/HasAndBelongsToMany: Description: 'Prefer has_many :through to has_and_belongs_to_many.' - Enabled: false + Enabled: true Rails/Output: Description: 'Checks for calls to puts, print, etc.' diff --git a/app/controllers/namespaces_controller.rb b/app/controllers/namespaces_controller.rb index c59a2401ce..b7a9d8c129 100644 --- a/app/controllers/namespaces_controller.rb +++ b/app/controllers/namespaces_controller.rb @@ -15,4 +15,3 @@ class NamespacesController < ApplicationController end end end - diff --git a/app/controllers/projects/raw_controller.rb b/app/controllers/projects/raw_controller.rb index 84888265dc..c4ddc32e8c 100644 --- a/app/controllers/projects/raw_controller.rb +++ b/app/controllers/projects/raw_controller.rb @@ -35,4 +35,3 @@ class Projects::RawController < Projects::ApplicationController end end end - diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index 687b087e68..5cec6ae99d 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -254,4 +254,3 @@ module ProjectsHelper enabled_oauth_providers.include?(:github) end end - diff --git a/app/services/oauth2/access_token_validation_service.rb b/app/services/oauth2/access_token_validation_service.rb index 5a3b94129f..6194f6ce91 100644 --- a/app/services/oauth2/access_token_validation_service.rb +++ b/app/services/oauth2/access_token_validation_service.rb @@ -38,4 +38,4 @@ module Oauth2::AccessTokenValidationService end end end -end \ No newline at end of file +end diff --git a/config/initializers/7_omniauth.rb b/config/initializers/7_omniauth.rb index 18759f0cfb..8f6c567310 100644 --- a/config/initializers/7_omniauth.rb +++ b/config/initializers/7_omniauth.rb @@ -9,4 +9,4 @@ if Gitlab::LDAP::Config.enabled? server = Gitlab.config.ldap.servers.values.first alias_method server['provider_name'], :ldap end -end \ No newline at end of file +end diff --git a/config/initializers/gitlab_shell_secret_token.rb b/config/initializers/gitlab_shell_secret_token.rb index 8d2b771e53..e7c9f0ba7c 100644 --- a/config/initializers/gitlab_shell_secret_token.rb +++ b/config/initializers/gitlab_shell_secret_token.rb @@ -16,4 +16,4 @@ end if File.exist?(Gitlab.config.gitlab_shell.path) && !File.exist?(gitlab_shell_symlink) FileUtils.symlink(secret_file, gitlab_shell_symlink) -end \ No newline at end of file +end diff --git a/lib/gitlab/backend/shell_adapter.rb b/lib/gitlab/backend/shell_adapter.rb index f247f4593d..fbe2a7a0d7 100644 --- a/lib/gitlab/backend/shell_adapter.rb +++ b/lib/gitlab/backend/shell_adapter.rb @@ -9,4 +9,3 @@ module Gitlab end end end - diff --git a/lib/gitlab/force_push_check.rb b/lib/gitlab/force_push_check.rb index 6ba2c3ad00..eae9773a06 100644 --- a/lib/gitlab/force_push_check.rb +++ b/lib/gitlab/force_push_check.rb @@ -12,4 +12,3 @@ module Gitlab end end end - From 61cc6a9244f316f684cd887febd9dae1030a04b0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 2 Feb 2015 21:59:28 -0800 Subject: [PATCH 72/96] Rubocop: indentation fixes Yay!!! --- .rubocop.yml | 4 ++-- app/controllers/projects/wikis_controller.rb | 20 ++++++++-------- app/finders/snippets_finder.rb | 2 +- app/helpers/application_helper.rb | 2 +- app/helpers/tab_helper.rb | 2 +- .../initializers/acts_as_taggable_on_patch.rb | 24 +++++++++---------- lib/gitlab/diff/parser.rb | 2 +- lib/gitlab/git_access.rb | 10 ++++---- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 965a52c755..a4b5100819 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -283,12 +283,12 @@ Style/IfWithSemicolon: Style/IndentationConsistency: Description: 'Keep indentation straight.' - Enabled: false + Enabled: true Style/IndentationWidth: Description: 'Use 2 spaces for indentation.' StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' - Enabled: false + Enabled: true Style/IndentArray: Description: >- diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 0e03956e73..0145207bf6 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -16,16 +16,16 @@ class Projects::WikisController < Projects::ApplicationController if @page render 'show' elsif file = @project_wiki.find_file(params[:id], params[:version_id]) - if file.on_disk? - send_file file.on_disk_path, disposition: 'inline' - else - send_data( - file.raw_data, - type: file.mime_type, - disposition: 'inline', - filename: file.name - ) - end + if file.on_disk? + send_file file.on_disk_path, disposition: 'inline' + else + send_data( + file.raw_data, + type: file.mime_type, + disposition: 'inline', + filename: file.name + ) + end else return render('empty') unless can?(current_user, :write_wiki, @project) @page = WikiPage.new(@project_wiki) diff --git a/app/finders/snippets_finder.rb b/app/finders/snippets_finder.rb index 4b0c69f2d2..07b5759443 100644 --- a/app/finders/snippets_finder.rb +++ b/app/finders/snippets_finder.rb @@ -40,7 +40,7 @@ class SnippetsFinder when 'are_public' then snippets.are_public else - snippets + snippets end else snippets.public_and_internal diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 7417261a84..1fbb44ee44 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -78,7 +78,7 @@ module ApplicationHelper style = "background-color: ##{ allowed_colors.values[bg_key] }; color: #555" content_tag(:div, class: options[:class], style: style) do - project.name[0, 1].upcase + project.name[0, 1].upcase end end diff --git a/app/helpers/tab_helper.rb b/app/helpers/tab_helper.rb index 639fc98c22..2142db2992 100644 --- a/app/helpers/tab_helper.rb +++ b/app/helpers/tab_helper.rb @@ -90,7 +90,7 @@ module TabHelper return "active" if current_page?(controller: "/projects", action: :edit, id: @project) if ['services', 'hooks', 'deploy_keys', 'team_members', 'protected_branches'].include? controller.controller_name - "active" + "active" end end diff --git a/config/initializers/acts_as_taggable_on_patch.rb b/config/initializers/acts_as_taggable_on_patch.rb index e7a7728636..0d535cb5ca 100644 --- a/config/initializers/acts_as_taggable_on_patch.rb +++ b/config/initializers/acts_as_taggable_on_patch.rb @@ -69,12 +69,12 @@ module ActsAsTaggableOn::Taggable select_clause = "DISTINCT #{table_name}.*" unless context and tag_types.one? if owned_by - tagging_join << " AND " + - sanitize_sql([ - "#{taggings_alias}.tagger_id = ? AND #{taggings_alias}.tagger_type = ?", - owned_by.id, - owned_by.class.base_class.to_s - ]) + tagging_join << " AND " + + sanitize_sql([ + "#{taggings_alias}.tagger_id = ? AND #{taggings_alias}.tagger_type = ?", + owned_by.id, + owned_by.class.base_class.to_s + ]) end joins << tagging_join @@ -93,12 +93,12 @@ module ActsAsTaggableOn::Taggable tagging_join << " AND " + sanitize_sql(["#{taggings_alias}.context = ?", context.to_s]) if context if owned_by - tagging_join << " AND " + - sanitize_sql([ - "#{taggings_alias}.tagger_id = ? AND #{taggings_alias}.tagger_type = ?", - owned_by.id, - owned_by.class.base_class.to_s - ]) + tagging_join << " AND " + + sanitize_sql([ + "#{taggings_alias}.tagger_id = ? AND #{taggings_alias}.tagger_type = ?", + owned_by.id, + owned_by.class.base_class.to_s + ]) end joins << tagging_join diff --git a/lib/gitlab/diff/parser.rb b/lib/gitlab/diff/parser.rb index 0242e09a51..887ed76b36 100644 --- a/lib/gitlab/diff/parser.rb +++ b/lib/gitlab/diff/parser.rb @@ -74,7 +74,7 @@ module Gitlab def html_escape(str) replacements = { '&' => '&', '>' => '>', '<' => '<', '"' => '"', "'" => ''' } - str.gsub(/[&"'><]/, replacements) + str.gsub(/[&"'><]/, replacements) end end end diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index 0530923b20..6444cec7eb 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -112,14 +112,14 @@ module Gitlab def protected_branch_action(project, oldrev, newrev, branch_name) # we dont allow force push to protected branch if forced_push?(project, oldrev, newrev) - :force_push_code_to_protected_branches + :force_push_code_to_protected_branches elsif newrev == Gitlab::Git::BLANK_SHA - # and we dont allow remove of protected branch - :remove_protected_branches + # and we dont allow remove of protected branch + :remove_protected_branches elsif project.developers_can_push_to_protected_branch?(branch_name) - :push_code + :push_code else - :push_code_to_protected_branches + :push_code_to_protected_branches end end From ae5743e9c1d32f905aa1c64bce34e20379c85322 Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Tue, 3 Feb 2015 10:44:41 +0100 Subject: [PATCH 73/96] Made diff colors a little less In Your Face Signed-off-by: Jeroen van Baarsen --- app/assets/stylesheets/sections/diff.scss | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/app/assets/stylesheets/sections/diff.scss b/app/assets/stylesheets/sections/diff.scss index da50dbe471..f47ea32982 100644 --- a/app/assets/stylesheets/sections/diff.scss +++ b/app/assets/stylesheets/sections/diff.scss @@ -40,12 +40,12 @@ font-size: $code_font_size; .old { span.idiff { - background-color: #F99; + background-color: #f8cbcb; } } .new { span.idiff { - background-color: #8F8; + background-color: #a6f3a6; } } .unfold { @@ -84,7 +84,7 @@ padding: 0px; border: none; background: #F5F5F5; - color: #666; + color: rgba(0,0,0,0.3); padding: 0px 5px; border-right: 1px solid #ccc; text-align: right; @@ -96,7 +96,7 @@ float: left; width: 35px; font-weight: normal; - color: #666; + color: rgba(0,0,0,0.3); &:hover { text-decoration: underline; } @@ -114,13 +114,13 @@ .line_holder { &.old .old_line, &.old .new_line { - background: #FCC; - border-color: #E7BABA; + background: #ffdddd; + border-color: #f1c0c0; } &.new .old_line, &.new .new_line { - background: #CFC; - border-color: #B9ECB9; + background: #dbffdb; + border-color: #c1e9c1; } } .line_content { @@ -129,10 +129,10 @@ padding: 0px 0.5em; border: none; &.new { - background: #CFD; + background: #eaffea; } &.old { - background: #FDD; + background: #ffecec; } &.matched { color: #ccc; From 0e896aa9e90be3cb7765239860a9970996685998 Mon Sep 17 00:00:00 2001 From: Robert Schilling Date: Tue, 3 Feb 2015 11:44:55 +0100 Subject: [PATCH 74/96] Update gitlab-shell to 2.4.2 for 7.7 install/update guide closes #8718, closes #8721 --- doc/install/installation.md | 2 +- doc/update/7.6-to-7.7.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/install/installation.md b/doc/install/installation.md index b080e8f062..bfdebaf846 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -278,7 +278,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.4.1] REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production + sudo -u git -H bundle exec rake gitlab:shell:install[v2.4.2] 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/7.6-to-7.7.md b/doc/update/7.6-to-7.7.md index 51084576f3..831958d0b8 100644 --- a/doc/update/7.6-to-7.7.md +++ b/doc/update/7.6-to-7.7.md @@ -37,7 +37,7 @@ sudo -u git -H git checkout 7-7-stable-ee ```bash cd /home/git/gitlab-shell sudo -u git -H git fetch -sudo -u git -H git checkout v2.4.1 +sudo -u git -H git checkout v2.4.2 ``` ### 4. Install libs, migrations, etc. From 4e97f26649a7756bef843fca74e3c58eadd117e1 Mon Sep 17 00:00:00 2001 From: jubianchi Date: Fri, 30 Jan 2015 10:46:08 +0100 Subject: [PATCH 75/96] Acces groups with their path in API --- CHANGELOG | 2 +- doc/api/groups.md | 10 +++++----- lib/api/group_members.rb | 16 ---------------- lib/api/groups.rb | 16 ---------------- lib/api/helpers.rb | 25 +++++++++++++++++++++++-- spec/requests/api/groups_spec.rb | 18 ++++++++++++++++++ 6 files changed, 47 insertions(+), 40 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index aa7daa1194..2f9b995f9e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -53,7 +53,7 @@ v 7.8.0 - Add a new API function that retrieves all issues assigned to a single milestone (Justin Whear and Hannes Rosenögger) - - - - + - API: Access groups with their path (Julien Bianchi) - - - diff --git a/doc/api/groups.md b/doc/api/groups.md index 9217c7a7f2..9f01b55064 100644 --- a/doc/api/groups.md +++ b/doc/api/groups.md @@ -32,7 +32,7 @@ GET /groups/:id Parameters: -- `id` (required) - The ID of a group +- `id` (required) - The ID or path of a group ## New group @@ -58,7 +58,7 @@ POST /groups/:id/projects/:project_id Parameters: -- `id` (required) - The ID of a group +- `id` (required) - The ID or path of a group - `project_id` (required) - The ID of a project ## Remove group @@ -71,7 +71,7 @@ DELETE /groups/:id Parameters: -- `id` (required) - The ID of a user group +- `id` (required) - The ID or path of a user group ## Search for group @@ -148,7 +148,7 @@ POST /groups/:id/members Parameters: -- `id` (required) - The ID of a group +- `id` (required) - The ID or path of a group - `user_id` (required) - The ID of a user to add - `access_level` (required) - Project access level @@ -162,5 +162,5 @@ DELETE /groups/:id/members/:user_id Parameters: -- `id` (required) - The ID of a user group +- `id` (required) - The ID or path of a user group - `user_id` (required) - The ID of a group member diff --git a/lib/api/group_members.rb b/lib/api/group_members.rb index d596517c81..4373070083 100644 --- a/lib/api/group_members.rb +++ b/lib/api/group_members.rb @@ -3,22 +3,6 @@ module API before { authenticate! } resource :groups do - helpers do - def find_group(id) - group = Group.find(id) - - if can?(current_user, :read_group, group) - group - else - render_api_error!("403 Forbidden - #{current_user.username} lacks sufficient access to #{group.name}", 403) - end - end - - def validate_access_level?(level) - Gitlab::Access.options_with_owner.values.include? level.to_i - end - end - # Get a list of group members viewable by the authenticated user. # # Example Request: diff --git a/lib/api/groups.rb b/lib/api/groups.rb index 730dfad52c..384a28e41f 100644 --- a/lib/api/groups.rb +++ b/lib/api/groups.rb @@ -4,22 +4,6 @@ module API before { authenticate! } resource :groups do - helpers do - def find_group(id) - group = Group.find(id) - - if can?(current_user, :read_group, group) - group - else - render_api_error!("403 Forbidden - #{current_user.username} lacks sufficient access to #{group.name}", 403) - end - end - - def validate_access_level?(level) - Gitlab::Access.options_with_owner.values.include? level.to_i - end - end - # Get a groups list # # Example Request: diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 62c26ef76c..96249ea8cf 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -55,6 +55,21 @@ module API end end + def find_group(id) + begin + group = Group.find(id) + rescue ActiveRecord::RecordNotFound + group = Group.find_by!(path: id) + end + + if can?(current_user, :read_group, group) + group + else + forbidden!("#{current_user.username} lacks sufficient "\ + "access to #{group.name}") + end + end + def paginate(relation) per_page = params[:per_page].to_i paginated = relation.page(params[:page]).per(per_page) @@ -135,10 +150,16 @@ module API errors end + def validate_access_level?(level) + Gitlab::Access.options_with_owner.values.include? level.to_i + end + # error helpers - def forbidden! - render_api_error!('403 Forbidden', 403) + def forbidden!(reason = nil) + message = ['403 Forbidden'] + message << " - #{reason}" if reason + render_api_error!(message.join(' '), 403) end def bad_request!(attribute) diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index 95f8246336..8465d76529 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -73,6 +73,24 @@ describe API::API, api: true do response.status.should == 404 end end + + context 'when using group path in URL' do + it 'should return any existing group' do + get api("/groups/#{group1.path}", admin) + response.status.should == 200 + json_response['name'] == group2.name + end + + it 'should not return a non existing group' do + get api('/groups/unknown', admin) + response.status.should == 404 + end + + it 'should not return a group not attached to user1' do + get api("/groups/#{group2.path}", user1) + response.status.should == 403 + end + end end describe "POST /groups" do From 97d4ac40477788c1c43d2f32baefd1df1ceeb9f4 Mon Sep 17 00:00:00 2001 From: Jason Blanchard Date: Fri, 30 Jan 2015 23:21:31 -0500 Subject: [PATCH 76/96] Adds link to milestone and keeping resource context on smaller viewports for issues and merge requests --- CHANGELOG | 2 +- .../projects/issues/_discussion.html.haml | 2 +- .../projects/issues/_issue_context.html.haml | 18 ++++++++---------- app/views/projects/issues/update.js.haml | 7 +++++++ .../merge_requests/_discussion.html.haml | 4 ++-- .../merge_requests/show/_context.html.haml | 18 +++++++++--------- .../projects/merge_requests/update.js.haml | 6 ++++++ spec/features/issues_spec.rb | 5 +++-- 8 files changed, 37 insertions(+), 25 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2db5beb002..906315502c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -54,7 +54,7 @@ v 7.8.0 - - - - - + - Added link to milestone and keeping resource context on smaller viewports for issues and merge requests (Jason Blanchard) - - - API: Add support for editing an existing project (Mika Mäenpää and Hannes Rosenögger) diff --git a/app/views/projects/issues/_discussion.html.haml b/app/views/projects/issues/_discussion.html.haml index b5d6a16a1e..e04e1985f1 100644 --- a/app/views/projects/issues/_discussion.html.haml +++ b/app/views/projects/issues/_discussion.html.haml @@ -13,7 +13,7 @@ = link_to_member(@project, participant, name: false, size: 24) .voting_notes#notes= render "projects/notes/notes_with_form" - .col-md-3.hidden-sm.hidden-xs + .col-md-3 %div .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} diff --git a/app/views/projects/issues/_issue_context.html.haml b/app/views/projects/issues/_issue_context.html.haml index 98777a58f9..3daa18ba34 100644 --- a/app/views/projects/issues/_issue_context.html.haml +++ b/app/views/projects/issues/_issue_context.html.haml @@ -2,23 +2,21 @@ %div.prepend-top-20 %p Assignee: - + - if issue.assignee + = link_to_member(@project, @issue.assignee) + - else + none - if can?(current_user, :modify_issue, @issue) = project_users_select_tag('issue[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @issue.assignee_id) - - elsif issue.assignee - = link_to_member(@project, @issue.assignee) - - else - None %div.prepend-top-20 %p Milestone: + - if issue.milestone + #{link_to @issue.milestone.title, project_milestone_path(@project, @issue.milestone)} + - else + none - if can?(current_user, :modify_issue, @issue) = f.select(:milestone_id, milestone_options(@issue), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) = hidden_field_tag :issue_context = f.submit class: 'btn' - - elsif issue.milestone - = link_to project_milestone_path(@project, @issue.milestone) do - = @issue.milestone.title - - else - None diff --git a/app/views/projects/issues/update.js.haml b/app/views/projects/issues/update.js.haml index 6e50667b08..7a5e051755 100644 --- a/app/views/projects/issues/update.js.haml +++ b/app/views/projects/issues/update.js.haml @@ -3,8 +3,15 @@ :plain $("##{dom_id(@issue)}").fadeOut(); - elsif params[:issue_context] + $('.context').html("#{escape_javascript(render partial: 'issue_context', locals: { issue: @issue })}"); $('.context').effect('highlight'); - if @issue.milestone $('.milestone-nav-link').replaceWith("| Milestone #{escape_javascript(link_to @issue.milestone.title, project_milestone_path(@issue.project, @issue.milestone))}") - else $('.milestone-nav-link').html('') + + +$('select.select2').select2({width: 'resolve', dropdownAutoWidth: true}) +$('.edit-issue.inline-update input[type="submit"]').hide(); +new ProjectUsersSelect(); +new Issue(); diff --git a/app/views/projects/merge_requests/_discussion.html.haml b/app/views/projects/merge_requests/_discussion.html.haml index 64bae80078..f1f66569a9 100644 --- a/app/views/projects/merge_requests/_discussion.html.haml +++ b/app/views/projects/merge_requests/_discussion.html.haml @@ -9,7 +9,7 @@ .col-md-9 = render "projects/merge_requests/show/participants" = render "projects/notes/notes_with_form" - .col-md-3.hidden-sm.hidden-xs + .col-md-3 .clearfix %span.slead.has_tooltip{:"data-original-title" => 'Cross-project reference'} = cross_project_reference(@project, @merge_request) @@ -18,7 +18,7 @@ %cite.cgray = render partial: 'projects/merge_requests/show/context', locals: { merge_request: @merge_request } %hr - .votes-holder.hidden-sm.hidden-xs + .votes-holder %h6 Votes #votes= render 'votes/votes_block', votable: @merge_request diff --git a/app/views/projects/merge_requests/show/_context.html.haml b/app/views/projects/merge_requests/show/_context.html.haml index 5b6e64f065..21718ca2ac 100644 --- a/app/views/projects/merge_requests/show/_context.html.haml +++ b/app/views/projects/merge_requests/show/_context.html.haml @@ -2,22 +2,22 @@ %div.prepend-top-20 %p Assignee: - + - if @merge_request.assignee + = link_to_member(@project, @merge_request.assignee) + - else + none - if can?(current_user, :modify_merge_request, @merge_request) = project_users_select_tag('merge_request[assignee_id]', placeholder: 'Select assignee', class: 'custom-form-control js-select2 js-assignee', selected: @merge_request.assignee_id) - - elsif merge_request.assignee - = link_to_member(@project, @merge_request.assignee) - - else - None %div.prepend-top-20 %p Milestone: + - if @merge_request.milestone + %span.back-to-milestone + #{link_to @merge_request.milestone.title, project_milestone_path(@project, @merge_request.milestone)} + - else + none - if can?(current_user, :modify_merge_request, @merge_request) = f.select(:milestone_id, milestone_options(@merge_request), { include_blank: "Select milestone" }, {class: 'select2 select2-compact js-select2 js-milestone'}) = hidden_field_tag :merge_request_context = f.submit class: 'btn' - - elsif merge_request.milestone - = link_to merge_request.milestone.title, project_milestone_path - - else - None diff --git a/app/views/projects/merge_requests/update.js.haml b/app/views/projects/merge_requests/update.js.haml index 6f4c5dd7a3..f5cc98c7fa 100644 --- a/app/views/projects/merge_requests/update.js.haml +++ b/app/views/projects/merge_requests/update.js.haml @@ -1,2 +1,8 @@ - if params[:merge_request_context] + $('.context').html("#{escape_javascript(render partial: 'projects/merge_requests/show/context', locals: { issue: @issue })}"); $('.context').effect('highlight'); + + new ProjectUsersSelect(); + + $('select.select2').select2({width: 'resolve', dropdownAutoWidth: true}); + merge_request = new MergeRequest(); diff --git a/spec/features/issues_spec.rb b/spec/features/issues_spec.rb index 26607b0090..e6fa376f3e 100644 --- a/spec/features/issues_spec.rb +++ b/spec/features/issues_spec.rb @@ -65,7 +65,7 @@ describe "Issues", feature: true do click_button "Save changes" - page.should have_content "Assignee: Select assignee" + page.should have_content 'Assignee: none' issue.reload.assignee.should be_nil end end @@ -249,6 +249,7 @@ describe "Issues", feature: true do click_button 'Update Issue' page.should have_content "Milestone changed to #{milestone.title}" + page.should have_content "Milestone: #{milestone.title}" has_select?('issue_assignee_id', :selected => milestone.title) end end @@ -287,7 +288,7 @@ describe "Issues", feature: true do sleep 2 # wait for ajax stuff to complete first('.user-result').click - page.should have_content "Assignee: Unassigned" + page.should have_content 'Assignee: none' sleep 2 # wait for ajax stuff to complete issue.reload.assignee.should be_nil end From ee955d7a125f9d18ac7ae334542ae68dd8d5114c Mon Sep 17 00:00:00 2001 From: Jason Blanchard Date: Fri, 30 Jan 2015 14:23:35 -0500 Subject: [PATCH 77/96] Adds persistent collapse button for left side bar --- CHANGELOG | 1 + app/assets/javascripts/sidebar.js.coffee | 10 +++++ .../stylesheets/sections/nav_sidebar.scss | 39 ++++++++++++++++++- app/helpers/nav_helper.rb | 5 +++ app/views/layouts/_collapse_button.html.haml | 4 ++ app/views/layouts/_page.html.haml | 4 +- spec/helpers/nav_helper_spec.rb | 25 ++++++++++++ 7 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 app/helpers/nav_helper.rb create mode 100644 app/views/layouts/_collapse_button.html.haml create mode 100644 spec/helpers/nav_helper_spec.rb diff --git a/CHANGELOG b/CHANGELOG index 2db5beb002..427a2ee90e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -62,6 +62,7 @@ v 7.8.0 - - - Added support for firing system hooks on group create/destroy and adding/removing users to group (Boyan Tabakov) + - Added persistent collapse button for left side nav bar (Jason Blanchard) v 7.7.2 - Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee index c084d730d6..d1b165a231 100644 --- a/app/assets/javascripts/sidebar.js.coffee +++ b/app/assets/javascripts/sidebar.js.coffee @@ -24,3 +24,13 @@ $ -> $(window).resize -> responsive_resize() return + +$(document).on("click", '.toggle-nav-collapse', (e) -> + e.preventDefault() + if $('.page-with-sidebar').hasClass('collapsed') + $('.page-with-sidebar').removeClass('collapsed') + $.cookie("collapsed_nav", "false", { path: '/' }) + else + $('.page-with-sidebar').addClass('collapsed') + $.cookie("collapsed_nav", "true", { path: '/' }) +) diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index a61c053b8a..0c278aec3f 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -110,7 +110,7 @@ .nav-sidebar { margin-top: 20px; - position: fixed; + position: relative; top: 45px; width: $sidebar_width; } @@ -150,6 +150,37 @@ } } +.collapse-nav { + position: relative; + top: 50px; + width: 230px; + text-align: right; + padding-right: 21px; +} + +.page-with-sidebar.collapsed { + + .collapse-nav { + width: 53px; + } + + padding-left: 50px; + + .sidebar-wrapper { + width: 52px; + overflow-x: hidden; + + .nav-sidebar { + width: 52px; + } + + .nav-sidebar li a > span { + display: none; + } + } +} + + @media (max-width: $screen-md-max) { @include folded-sidebar; } @@ -157,3 +188,9 @@ @media(min-width: $screen-md-max) { @include expanded-sidebar; } + +@media (max-width: $screen-md-max) { + .collapse-nav { + display: none; + } +} diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb new file mode 100644 index 0000000000..2b03269800 --- /dev/null +++ b/app/helpers/nav_helper.rb @@ -0,0 +1,5 @@ +module NavHelper + def nav_menu_collapsed? + cookies[:collapsed_nav] == 'true' + end +end diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml new file mode 100644 index 0000000000..52c19f1d99 --- /dev/null +++ b/app/views/layouts/_collapse_button.html.haml @@ -0,0 +1,4 @@ +- if nav_menu_collapsed? + = link_to icon('plus-square'), '#', class: 'toggle-nav-collapse' +- else + = link_to icon('minus-square'), '#', class: 'toggle-nav-collapse' diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 1263f44eca..e20aec8911 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,8 +1,10 @@ - if defined?(sidebar) - .page-with-sidebar + .page-with-sidebar{:class => ("collapsed" if nav_menu_collapsed?)} = render "layouts/broadcast" .sidebar-wrapper = render(sidebar) + .collapse-nav + = render :partial => 'layouts/collapse_button' .content-wrapper .container-fluid .content diff --git a/spec/helpers/nav_helper_spec.rb b/spec/helpers/nav_helper_spec.rb new file mode 100644 index 0000000000..e4d18d8bfc --- /dev/null +++ b/spec/helpers/nav_helper_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the NavHelper. For example: +# +# describe NavHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +describe NavHelper do + describe '#nav_menu_collapsed?' do + it 'returns true when the nav is collapsed in the cookie' do + helper.request.cookies[:collapsed_nav] = 'true' + expect(helper.nav_menu_collapsed?).to eq true + end + + it 'returns false when the nav is not collapsed in the cookie' do + helper.request.cookies[:collapsed_nav] = 'false' + expect(helper.nav_menu_collapsed?).to eq false + end + end +end From b9d9ac82a9d650b659866ea26dcb4e7987f10381 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Mon, 2 Feb 2015 21:30:11 -0800 Subject: [PATCH 78/96] Commit page: async load branches info Conflicts: config/routes.rb --- app/controllers/projects/commit_controller.rb | 8 +++++-- .../projects/commit/_commit_box.html.haml | 23 +++++-------------- app/views/projects/commit/branches.html.haml | 16 +++++++++++++ config/routes.rb | 8 +++++-- spec/controllers/commit_controller_spec.rb | 9 ++++++++ 5 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 app/views/projects/commit/branches.html.haml diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index 470efbd211..96a782bdf7 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -11,8 +11,6 @@ class Projects::CommitController < Projects::ApplicationController return git_not_found! unless @commit @line_notes = @project.notes.for_commit_id(commit.id).inline - @branches = @project.repository.branch_names_contains(commit.id) - @tags = @project.repository.tag_names_contains(commit.id) @diffs = @commit.diffs @note = @project.build_commit_note(commit) @notes_count = @project.notes.for_commit_id(commit.id).count @@ -31,6 +29,12 @@ class Projects::CommitController < Projects::ApplicationController end end + def branches + @branches = @project.repository.branch_names_contains(commit.id) + @tags = @project.repository.tag_names_contains(commit.id) + render layout: false + end + def commit @commit ||= @project.repository.commit(params[:id]) end diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml index b41fb1437f..dd28a35d41 100644 --- a/app/views/projects/commit/_commit_box.html.haml +++ b/app/views/projects/commit/_commit_box.html.haml @@ -37,23 +37,8 @@ - @commit.parents.each do |parent| = link_to parent.short_id, project_commit_path(@project, parent) -.commit-info-row - - if @branches.any? - %span - - branch = commit_default_branch(@project, @branches) - = link_to(project_tree_path(@project, branch)) do - %span.label.label-gray - %i.fa.fa-code-fork - = branch - - if @branches.any? || @tags.any? - = link_to("#", class: "js-details-expand") do - %span.label.label-gray - \... - %span.js-details-content.hide - - if @branches.any? - = commit_branches_links(@project, @branches) - - if @tags.any? - = commit_tags_links(@project, @tags) +.commit-info-row.branches + %i.fa.fa-spinner.fa-spin .commit-box %h3.commit-title @@ -61,3 +46,7 @@ - if @commit.description.present? %pre.commit-description = preserve(gfm(escape_once(@commit.description))) + +:coffeescript + $ -> + $(".commit-info-row.branches").load("#{branches_project_commit_path(@project, @commit.id)}") \ No newline at end of file diff --git a/app/views/projects/commit/branches.html.haml b/app/views/projects/commit/branches.html.haml new file mode 100644 index 0000000000..b01e806210 --- /dev/null +++ b/app/views/projects/commit/branches.html.haml @@ -0,0 +1,16 @@ +- if @branches.any? + %span + - branch = commit_default_branch(@project, @branches) + = link_to(project_tree_path(@project, branch)) do + %span.label.label-gray + %i.fa.fa-code-fork + = branch + - if @branches.any? || @tags.any? + = link_to("#", class: "js-details-expand") do + %span.label.label-gray + \... + %span.js-details-content.hide + - if @branches.any? + = commit_branches_links(@project, @branches) + - if @tags.any? + = commit_tags_links(@project, @tags) \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index a2d782cf63..512066e5d4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -228,8 +228,12 @@ Gitlab::Application.routes.draw do resources :raw, only: [:show], constraints: { id: /.+/ } resources :tree, only: [:show], constraints: { id: /.+/, format: /(html|js)/ } resource :avatar, only: [:show, :destroy] - resources :commit, only: [:show], constraints: { id: /[[:alnum:]]{6,40}/ } - resources :commits, only: [:show], constraints: { id: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } + + resources :commit, only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} do + get :branches, on: :member + end + + resources :commits, only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} resources :compare, only: [:index, :create] resources :blame, only: [:show], constraints: { id: /.+/ } resources :network, only: [:show], constraints: { id: /(?:[^.]|\.(?!json$))+/, format: /json/ } diff --git a/spec/controllers/commit_controller_spec.rb b/spec/controllers/commit_controller_spec.rb index f5822157ea..cd8b46d767 100644 --- a/spec/controllers/commit_controller_spec.rb +++ b/spec/controllers/commit_controller_spec.rb @@ -70,4 +70,13 @@ describe Projects::CommitController do end end end + + describe "#branches" do + it "contains branch and tags information" do + get :branches, project_id: project.to_param, id: commit.id + + expect(assigns(:branches)).to include("master", "feature_conflict") + expect(assigns(:tags)).to include("v1.1.0") + end + end end From c8782e1a402f187573562ce8af9068898fd01673 Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Tue, 3 Feb 2015 09:22:56 -0800 Subject: [PATCH 79/96] code folding --- config/routes.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/routes.rb b/config/routes.rb index 512066e5d4..f0abd876ec 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -229,11 +229,11 @@ Gitlab::Application.routes.draw do resources :tree, only: [:show], constraints: { id: /.+/, format: /(html|js)/ } resource :avatar, only: [:show, :destroy] - resources :commit, only: [:show], constraints: {id: /[[:alnum:]]{6,40}/} do + resources :commit, only: [:show], constraints: { id: /[[:alnum:]]{6,40}/ } do get :branches, on: :member end - resources :commits, only: [:show], constraints: {id: /(?:[^.]|\.(?!atom$))+/, format: /atom/} + resources :commits, only: [:show], constraints: { id: /(?:[^.]|\.(?!atom$))+/, format: /atom/ } resources :compare, only: [:index, :create] resources :blame, only: [:show], constraints: { id: /.+/ } resources :network, only: [:show], constraints: { id: /(?:[^.]|\.(?!json$))+/, format: /json/ } From 19f39b4292a80942ff42d345afca957c04545b9b Mon Sep 17 00:00:00 2001 From: Valery Sizov Date: Tue, 3 Feb 2015 09:23:55 -0800 Subject: [PATCH 80/96] update changelog --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index aa7daa1194..b93c156790 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -28,7 +28,7 @@ v 7.8.0 - Added Rubocop for code style checks - Fix commits pagination - - - + - Async load a branch information at the commit page - - - Add a commit calendar to the user profile (Hannes Rosenögger) From 39bfe0aa1d3a17858accce3b8118fd9fe2926cc7 Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Tue, 3 Feb 2015 18:45:39 +0100 Subject: [PATCH 81/96] Also show colors in the sidebar of comment Signed-off-by: Jeroen van Baarsen --- app/views/projects/notes/discussions/_diff.html.haml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/projects/notes/discussions/_diff.html.haml b/app/views/projects/notes/discussions/_diff.html.haml index b4d1cce798..f717c77a89 100644 --- a/app/views/projects/notes/discussions/_diff.html.haml +++ b/app/views/projects/notes/discussions/_diff.html.haml @@ -19,8 +19,10 @@ %td.new_line= "..." %td.line_content.matched= line.text - else - %td.old_line= raw(line.type == "new" ? " " : line.old_pos) - %td.new_line= raw(line.type == "old" ? " " : line.new_pos) + %td.old_line{class: line.type == "new" ? "new" : "old"} + = raw(line.type == "new" ? " " : line.old_pos) + %td.new_line{class: line.type == "new" ? "new" : "old"} + = raw(line.type == "old" ? " " : line.new_pos) %td.line_content{class: "noteable_line #{line.type} #{line_code}", "line_code" => line_code}= raw diff_line_content(line.text) - if line_code == note.line_code From 68fbf1423fddcb7d49e408d05105ca6911e91122 Mon Sep 17 00:00:00 2001 From: Job van der Voort Date: Tue, 3 Feb 2015 11:05:20 -0800 Subject: [PATCH 82/96] improve english documentation --- doc/workflow/web_editor.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/doc/workflow/web_editor.md b/doc/workflow/web_editor.md index c83715deff..bcadf5e8c0 100644 --- a/doc/workflow/web_editor.md +++ b/doc/workflow/web_editor.md @@ -1,23 +1,26 @@ # GitLab Web Editor -In GitLab you can create new files and edit existing one using our web editor. -Its really useful if you dont have access to command line or you want to make a quick small fix. -You can access to web editor in several ways depends on context. -Lets start from newly created project. -Click on `Add a file` button to start web editor for creating first file. +In GitLab you can create new files and edit existing files using our web editor. +This is especially useful if you don't have access to a command line or you just want to do a quick fix. +You can easily access the web editor, depending on the context. +Let's start from newly created project. + +Click on `Add a file` +to create the first file and open it in the web editor. ![web editor 1](web_editor/empty_project.png) -Fill in file name, content, commit message and press commit button. -After this file will be saved to repository. +Fill in a file name, some content, a commit message and press the commit button. +The file will be saved to the repository. ![web editor 2](web_editor/new_file.png) -You can edit any text file in repository by pressing edit button when browsing file. +You can edit any text file in a repository by pressing the edit button, when +viewing the file. ![web editor 3](web_editor/show_file.png) -Edit of file is pretty same as creating new file. -Except you can see preview of your changes to file in separate tab +Editing a file is almost the same as creating a new file, +with as addition the ability to preview your changes in a separate tab. ![web editor 3](web_editor/edit_file.png) From e0d85078ba8b128ba6e0378ebd00a4e12d1e86ed Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Tue, 3 Feb 2015 11:23:59 -0800 Subject: [PATCH 83/96] Push can be multiple files. --- 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 36628195b4..d7dee2208d 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -10,7 +10,7 @@ You can = link_to project_new_blob_path(@project, 'master'), class: 'btn btn-new btn-lg' do add a file -  or push it via command line. +  or do a push via the command line. %h4 %strong Command line instructions From 4adf6389b0f0889f4bee328c68439c22ee106751 Mon Sep 17 00:00:00 2001 From: Mike Limansky Date: Tue, 3 Feb 2015 23:40:56 +0300 Subject: [PATCH 84/96] Fixes #8478. Update timfel-krb5-auth to 0.8.3. --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index cde7bfa66f..7f115d79de 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -561,7 +561,7 @@ GEM tilt (1.4.1) timers (4.0.1) hitimes - timfel-krb5-auth (0.8) + timfel-krb5-auth (0.8.3) tinder (1.9.3) eventmachine (~> 1.0) faraday (~> 0.8) From 254a63dcf7dcfe824eb0b7227e2cd63fac027f85 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 13:11:33 -0800 Subject: [PATCH 85/96] Improve collapsing sidebar --- app/assets/javascripts/sidebar.js.coffee | 11 ++- .../stylesheets/sections/nav_sidebar.scss | 72 +++++++------------ app/helpers/application_helper.rb | 8 +++ app/views/layouts/_collapse_button.html.haml | 4 +- app/views/layouts/_page.html.haml | 4 +- 5 files changed, 46 insertions(+), 53 deletions(-) diff --git a/app/assets/javascripts/sidebar.js.coffee b/app/assets/javascripts/sidebar.js.coffee index d1b165a231..5013bcdacd 100644 --- a/app/assets/javascripts/sidebar.js.coffee +++ b/app/assets/javascripts/sidebar.js.coffee @@ -27,10 +27,15 @@ $(window).resize -> $(document).on("click", '.toggle-nav-collapse', (e) -> e.preventDefault() - if $('.page-with-sidebar').hasClass('collapsed') - $('.page-with-sidebar').removeClass('collapsed') + collapsed = 'page-sidebar-collapsed' + expanded = 'page-sidebar-expanded' + + if $('.page-with-sidebar').hasClass(collapsed) + $('.page-with-sidebar').removeClass(collapsed).addClass(expanded) + $('.toggle-nav-collapse i').removeClass('fa-angle-right').addClass('fa-angle-left') $.cookie("collapsed_nav", "false", { path: '/' }) else - $('.page-with-sidebar').addClass('collapsed') + $('.page-with-sidebar').removeClass(expanded).addClass(collapsed) + $('.toggle-nav-collapse i').removeClass('fa-angle-left').addClass('fa-angle-right') $.cookie("collapsed_nav", "true", { path: '/' }) ) diff --git a/app/assets/stylesheets/sections/nav_sidebar.scss b/app/assets/stylesheets/sections/nav_sidebar.scss index 0c278aec3f..b35043821d 100644 --- a/app/assets/stylesheets/sections/nav_sidebar.scss +++ b/app/assets/stylesheets/sections/nav_sidebar.scss @@ -1,5 +1,3 @@ - - .page-with-sidebar { background: #F5F5F5; @@ -101,16 +99,14 @@ } @mixin expanded-sidebar { - .page-with-sidebar { - padding-left: $sidebar_width; - } + padding-left: $sidebar_width; .sidebar-wrapper { width: $sidebar_width; .nav-sidebar { margin-top: 20px; - position: relative; + position: fixed; top: 45px; width: $sidebar_width; } @@ -122,9 +118,7 @@ } @mixin folded-sidebar { - .page-with-sidebar { - padding-left: 50px; - } + padding-left: 50px; .sidebar-wrapper { width: 52px; @@ -150,47 +144,33 @@ } } -.collapse-nav { - position: relative; - top: 50px; - width: 230px; - text-align: right; - padding-right: 21px; -} - -.page-with-sidebar.collapsed { - - .collapse-nav { - width: 53px; - } - - padding-left: 50px; - - .sidebar-wrapper { - width: 52px; - overflow-x: hidden; - - .nav-sidebar { - width: 52px; - } - - .nav-sidebar li a > span { - display: none; - } - } -} - - -@media (max-width: $screen-md-max) { - @include folded-sidebar; -} - -@media(min-width: $screen-md-max) { - @include expanded-sidebar; +.collapse-nav a { + position: fixed; + bottom: 15px; + padding: 10px; + background: #DDD; } @media (max-width: $screen-md-max) { + .page-sidebar-collapsed { + @include folded-sidebar; + } + + .page-sidebar-expanded { + @include folded-sidebar; + } + .collapse-nav { display: none; } } + +@media(min-width: $screen-md-max) { + .page-sidebar-collapsed { + @include folded-sidebar; + } + + .page-sidebar-expanded { + @include expanded-sidebar; + } +} diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 1fbb44ee44..e45f465030 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -315,4 +315,12 @@ module ApplicationHelper profile_key_path(key) end end + + def nav_sidebar_class + if nav_menu_collapsed? + "page-sidebar-collapsed" + else + "page-sidebar-expanded" + end + end end diff --git a/app/views/layouts/_collapse_button.html.haml b/app/views/layouts/_collapse_button.html.haml index 52c19f1d99..b3b338b55b 100644 --- a/app/views/layouts/_collapse_button.html.haml +++ b/app/views/layouts/_collapse_button.html.haml @@ -1,4 +1,4 @@ - if nav_menu_collapsed? - = link_to icon('plus-square'), '#', class: 'toggle-nav-collapse' + = link_to icon('angle-right'), '#', class: 'toggle-nav-collapse' - else - = link_to icon('minus-square'), '#', class: 'toggle-nav-collapse' + = link_to icon('angle-left'), '#', class: 'toggle-nav-collapse' diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index e20aec8911..98a3d2278a 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,10 +1,10 @@ - if defined?(sidebar) - .page-with-sidebar{:class => ("collapsed" if nav_menu_collapsed?)} + .page-with-sidebar{ class: nav_sidebar_class } = render "layouts/broadcast" .sidebar-wrapper = render(sidebar) .collapse-nav - = render :partial => 'layouts/collapse_button' + = render partial: 'layouts/collapse_button' .content-wrapper .container-fluid .content From a89d7adfa44767e71cfb9005e5a3eed6a91b4d84 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 13:57:28 -0800 Subject: [PATCH 86/96] Rescue connection reset for web hooks --- app/models/hooks/web_hook.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/hooks/web_hook.rb b/app/models/hooks/web_hook.rb index 327cb585ff..c8fa9c5091 100644 --- a/app/models/hooks/web_hook.rb +++ b/app/models/hooks/web_hook.rb @@ -48,7 +48,7 @@ class WebHook < ActiveRecord::Base verify: false, basic_auth: auth) end - rescue SocketError, Errno::ECONNREFUSED, Net::OpenTimeout => e + rescue SocketError, Errno::ECONNRESET, Errno::ECONNREFUSED, Net::OpenTimeout => e logger.error("WebHook Error => #{e}") false end From 704922c855a9741b5495db56ac266788a9c25c33 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 15:07:01 -0800 Subject: [PATCH 87/96] Mention web hook imporvements --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 93abec424d..9ce9caa503 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -60,7 +60,7 @@ v 7.8.0 - API: Add support for editing an existing project (Mika Mäenpää and Hannes Rosenögger) - - - - + - When test web hook - show error message instead of 500 error page if connection to hook url was reset - Added support for firing system hooks on group create/destroy and adding/removing users to group (Boyan Tabakov) - Added persistent collapse button for left side nav bar (Jason Blanchard) From ad6c372eeee5d112ad199dd4e487df584976445d Mon Sep 17 00:00:00 2001 From: Ewan Edwards Date: Tue, 3 Feb 2015 15:18:40 -0800 Subject: [PATCH 88/96] Fix a number of discovered typos, capitalization of developer and product names, plus a couple of instances of bad Markdown markup. --- doc/api/issues.md | 2 +- doc/api/oauth2.md | 6 +++--- doc/api/projects.md | 2 +- doc/api/services.md | 14 +++++++------- doc/development/architecture.md | 10 +++++----- doc/development/ci_setup.md | 2 +- doc/install/requirements.md | 2 +- doc/integration/README.md | 2 +- doc/integration/external-issue-tracker.md | 2 +- doc/integration/gitlab_buttons_in_gmail.md | 4 ++-- doc/integration/shibboleth.md | 8 ++++---- doc/markdown/markdown.md | 6 +++--- doc/project_services/project_services.md | 10 +++++----- doc/raketasks/backup_restore.md | 8 ++++---- doc/release/howto_rc1.md | 2 +- doc/release/monthly.md | 2 +- doc/security/information_exclusivity.md | 2 +- doc/system_hooks/system_hooks.md | 8 ++++---- doc/update/2.6-to-3.0.md | 14 +++++++------- doc/update/4.2-to-5.0.md | 6 +++--- doc/update/5.1-to-6.0.md | 2 +- doc/update/6.1-to-6.2.md | 2 +- doc/update/6.x-or-7.x-to-7.7.md | 6 +++--- doc/update/7.3-to-7.4.md | 4 ++-- doc/update/README.md | 2 +- doc/workflow/gitlab_flow.md | 8 ++++---- doc/workflow/migrating_from_svn.md | 2 +- doc/workflow/notifications.md | 6 +++--- 28 files changed, 72 insertions(+), 72 deletions(-) diff --git a/doc/api/issues.md b/doc/api/issues.md index ceeb683a6b..8d073c46d3 100644 --- a/doc/api/issues.md +++ b/doc/api/issues.md @@ -56,7 +56,7 @@ Parameters: "title": "v1.0", "description": "", "due_date": "2012-07-20", - "state": "reopenend", + "state": "reopened", "updated_at": "2012-07-04T13:42:48Z", "created_at": "2012-07-04T13:42:48Z" }, diff --git a/doc/api/oauth2.md b/doc/api/oauth2.md index b2dbba9bde..7bb391054c 100644 --- a/doc/api/oauth2.md +++ b/doc/api/oauth2.md @@ -4,7 +4,7 @@ OAuth2 is a protocol that enables us to get access to private details of user's Before using the OAuth2 you should create an application in user's account. Each application getting unique App ID and App Secret parameters. You should not share them. -This functianolity is based on [doorkeeper gem](https://github.com/doorkeeper-gem/doorkeeper) +This functionality is based on [doorkeeper gem](https://github.com/doorkeeper-gem/doorkeeper) ## Web Application Flow @@ -15,7 +15,7 @@ This flow consists from 3 steps. ### 1. Registering the client -Creat an application in user's account profile. +Create an application in user's account profile. ### 2. Requesting authorization @@ -96,4 +96,4 @@ For testing you can use the oauth2 ruby gem: client = OAuth2::Client.new('the_client_id', 'the_client_secret', :site => "http://example.com") access_token = client.password.get_token('user@example.com', 'sekret') puts access_token.token -``` \ No newline at end of file +``` diff --git a/doc/api/projects.md b/doc/api/projects.md index d7804689c2..559d35d316 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -541,7 +541,7 @@ Parameters: } ], "tree": "c68537c6534a02cc2b176ca1549f4ffa190b58ee", - "message": "give caolan credit where it's due (up top)", + "message": "give Caolan credit where it's due (up top)", "author": { "name": "Jeremy Ashkenas", "email": "jashkenas@example.com" diff --git a/doc/api/services.md b/doc/api/services.md index 93534d5502..cbf767d1b2 100644 --- a/doc/api/services.md +++ b/doc/api/services.md @@ -23,23 +23,23 @@ Delete GitLab CI service settings for a project. DELETE /projects/:id/services/gitlab-ci ``` -## Hipchat +## HipChat -### Edit Hipchat service +### Edit HipChat service -Set Hipchat service for project. +Set HipChat service for project. ``` PUT /projects/:id/services/hipchat ``` Parameters: -- `token` (required) - Hipchat token -- `room` (required) - Hipchat room name +- `token` (required) - HipChat token +- `room` (required) - HipChat room name -### Delete Hipchat service +### Delete HipChat service -Delete Hipchat service for a project. +Delete HipChat service for a project. ``` DELETE /projects/:id/services/hipchat diff --git a/doc/development/architecture.md b/doc/development/architecture.md index 209182e774..714cc01600 100644 --- a/doc/development/architecture.md +++ b/doc/development/architecture.md @@ -16,8 +16,8 @@ You can imagine GitLab as a physical office. They can be stored in a warehouse. This can be either a hard disk, or something more complex, such as a NFS filesystem; -**NginX** acts like the front-desk. -Users come to NginX and request actions to be done by workers in the office; +**Nginx** acts like the front-desk. +Users come to Nginx and request actions to be done by workers in the office; **The database** is a series of metal file cabinets with information on: - The goods in the warehouse (metadata, issues, merge requests etc); @@ -70,7 +70,7 @@ To summarize here's the [directory structure of the `git` user home directory](. ps aux | grep '^git' -GitLab has several components to operate. As a system user (i.e. any user that is not the `git` user) it requires a persistent database (MySQL/PostreSQL) and redis database. It also uses Apache httpd or nginx to proxypass Unicorn. As the `git` user it starts Sidekiq and Unicorn (a simple ruby HTTP server running on port `8080` by default). Under the GitLab user there are normally 4 processes: `unicorn_rails master` (1 process), `unicorn_rails worker` (2 processes), `sidekiq` (1 process). +GitLab has several components to operate. As a system user (i.e. any user that is not the `git` user) it requires a persistent database (MySQL/PostreSQL) and redis database. It also uses Apache httpd or Nginx to proxypass Unicorn. As the `git` user it starts Sidekiq and Unicorn (a simple ruby HTTP server running on port `8080` by default). Under the GitLab user there are normally 4 processes: `unicorn_rails master` (1 process), `unicorn_rails worker` (2 processes), `sidekiq` (1 process). ### Repository access @@ -146,13 +146,13 @@ nginx Apache httpd -- [Explanation of apache logs](http://httpd.apache.org/docs/2.2/logs.html). +- [Explanation of Apache logs](http://httpd.apache.org/docs/2.2/logs.html). - `/var/log/apache2/` contains error and output logs (on Ubuntu). - `/var/log/httpd/` contains error and output logs (on RHEL). redis -- `/var/log/redis/redis.log` there are also logrotated logs there. +- `/var/log/redis/redis.log` there are also log-rotated logs there. PostgreSQL diff --git a/doc/development/ci_setup.md b/doc/development/ci_setup.md index ee16aedafe..f417667754 100644 --- a/doc/development/ci_setup.md +++ b/doc/development/ci_setup.md @@ -26,7 +26,7 @@ We use [these build scripts](https://gitlab.com/gitlab-org/gitlab-ci/blob/master # Build configuration on [Semaphore](https://semaphoreapp.com/gitlabhq/gitlabhq/) for testing the [GitHub.com repo](https://github.com/gitlabhq/gitlabhq) - Language: Ruby -- Ruby verion: 2.1.2 +- Ruby version: 2.1.2 - database.yml: pg Build commands diff --git a/doc/install/requirements.md b/doc/install/requirements.md index 8eabb219b1..2cf9e82fd2 100644 --- a/doc/install/requirements.md +++ b/doc/install/requirements.md @@ -7,7 +7,7 @@ - Ubuntu - Debian - CentOS -- RedHat Enterprise Linux (please use the CentOS packages and instructions) +- Red Hat Enterprise Linux (please use the CentOS packages and instructions) - Scientific Linux (please use the CentOS packages and instructions) - Oracle Linux (please use the CentOS packages and instructions) diff --git a/doc/integration/README.md b/doc/integration/README.md index 357ed03831..0087167bb8 100644 --- a/doc/integration/README.md +++ b/doc/integration/README.md @@ -13,7 +13,7 @@ Jenkins support is [available in GitLab EE](http://doc.gitlab.com/ee/integration ## Project services -Integration with services such as Campfire, Flowdock, Gemnasium, HipChat, PivotalTracker and Slack are available in the from of a Project Service. +Integration with services such as Campfire, Flowdock, Gemnasium, HipChat, Pivotal Tracker, and Slack are available in the form of a Project Service. You can find these within GitLab in the Services page under Project Settings if you are at least a master on the project. Project Services are a bit like plugins in that they allow a lot of freedom in adding functionality to GitLab, for example there is also a service that can send an email every time someone pushes new commits. Because GitLab is open source we can ship with the code and tests for all plugins. diff --git a/doc/integration/external-issue-tracker.md b/doc/integration/external-issue-tracker.md index 87af94512e..ba4df9f8fe 100644 --- a/doc/integration/external-issue-tracker.md +++ b/doc/integration/external-issue-tracker.md @@ -6,7 +6,7 @@ GitLab has a great issue tracker but you can also use an external issue tracker - clicking 'New issue' on the project dashboard creates a new JIRA issue; - To reference JIRA issue PROJECT-1234 in comments, use syntax PROJECT-1234. Commit messages get turned into HTML links to the corresponding JIRA issue. -![jira screenshot](jira-integration-points.png) +![Jira screenshot](jira-integration-points.png) You can configure the integration in the gitlab.yml configuration file. diff --git a/doc/integration/gitlab_buttons_in_gmail.md b/doc/integration/gitlab_buttons_in_gmail.md index 0816509c55..a9885cef10 100644 --- a/doc/integration/gitlab_buttons_in_gmail.md +++ b/doc/integration/gitlab_buttons_in_gmail.md @@ -1,4 +1,4 @@ -# GitLab buttons in gmail +# GitLab buttons in Gmail GitLab supports [Google actions in email](https://developers.google.com/gmail/markup/actions/actions-overview). @@ -25,4 +25,4 @@ If you receive "No errors detected" message from the tester you can send the ema ```bash bundle exec rake gitlab:mail_google_schema_whitelisting RAILS_ENV=production SEND=true -`` +``` diff --git a/doc/integration/shibboleth.md b/doc/integration/shibboleth.md index 1b03197b6c..ea11f1afea 100644 --- a/doc/integration/shibboleth.md +++ b/doc/integration/shibboleth.md @@ -2,7 +2,7 @@ This documentation is for enabling shibboleth with gitlab-omnibus package. -In order to enable Shibboleth support in gitlab we need to use Apache instead of Nginx (It may be possible to use Nginx, however I did not found way to easily configure nginx that is bundled in gitlab-omnibus package). Apache uses mod_shib2 module for shibboleth authentication and can pass attributes as headers to omniauth-shibboleth provider. +In order to enable Shibboleth support in gitlab we need to use Apache instead of Nginx (It may be possible to use Nginx, however I did not found way to easily configure Nginx that is bundled in gitlab-omnibus package). Apache uses mod_shib2 module for shibboleth authentication and can pass attributes as headers to omniauth-shibboleth provider. To enable the Shibboleth OmniAuth provider you must: @@ -10,7 +10,7 @@ To enable the Shibboleth OmniAuth provider you must: 1. Configure Apache shibboleth module. Installation and configuration of module it self is out of scope of this document. Check https://wiki.shibboleth.net/ for more info. -1. You can find Apache config in gitlab-reciepes (https://github.com/gitlabhq/gitlab-recipes/blob/master/web-server/apache/gitlab-ssl.conf) +1. You can find Apache config in gitlab-recipes (https://github.com/gitlabhq/gitlab-recipes/blob/master/web-server/apache/gitlab-ssl.conf) Following changes are needed to enable shibboleth: @@ -34,7 +34,7 @@ protect omniauth-shibboleth callback URL: ``` exclude shibboleth URLs from rewriting, add "RewriteCond %{REQUEST_URI} !/Shibboleth.sso" and "RewriteCond %{REQUEST_URI} !/shibboleth-sp", config should look like this: ``` - #apache equivalent of nginx try files + # Apache equivalent of Nginx try files RewriteEngine on RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} !/Shibboleth.sso @@ -50,7 +50,7 @@ File it should look like this: external_url 'https://gitlab.example.com' gitlab_rails['internal_api_url'] = 'https://gitlab.example.com' -# disable nginx +# disable Nginx nginx['enable'] = false gitlab_rails['omniauth_allow_single_sign_on'] = true diff --git a/doc/markdown/markdown.md b/doc/markdown/markdown.md index 7b79cd5d98..2568245e9c 100644 --- a/doc/markdown/markdown.md +++ b/doc/markdown/markdown.md @@ -6,7 +6,7 @@ * [Newlines](#newlines) * [Multiple underscores in words](#multiple-underscores-in-words) -* [URL autolinking](#url-autolinking) +* [URL auto-linking](#url-autolinking) * [Code and Syntax Highlighting](#code-and-syntax-highlighting) * [Emoji](#emoji) * [Special GitLab references](#special-gitlab-references) @@ -40,7 +40,7 @@ You can use GFM in - milestones - wiki pages -You can also use other rich text files in GitLab. You might have to install a depency to do so. Please see the [github-markup gem readme](https://github.com/gitlabhq/markup#markups) for more information. +You can also use other rich text files in GitLab. You might have to install a dependency to do so. Please see the [github-markup gem readme](https://github.com/gitlabhq/markup#markups) for more information. ## Newlines @@ -68,7 +68,7 @@ It is not reasonable to italicize just _part_ of a word, especially when you're perform_complicated_task do_this_and_do_that_and_another_thing -## URL autolinking +## URL auto-linking GFM will autolink standard URLs you copy and paste into your text. So if you want to link to a URL (instead of a textural link), you can simply put the URL in verbatim and it will be turned into a link to that URL. diff --git a/doc/project_services/project_services.md b/doc/project_services/project_services.md index ec46af5fe3..93a57485cf 100644 --- a/doc/project_services/project_services.md +++ b/doc/project_services/project_services.md @@ -4,16 +4,16 @@ __Project integrations with external services for continuous integration and mor ## Services -- Assemblia -- [Atlassian Bamboo CI](bamboo.md) An Atlassian product for continous integration. +- Assembla +- [Atlassian Bamboo CI](bamboo.md) An Atlassian product for continuous integration. - Build box - Campfire - Emails on push - Flowdock - Gemnasium - GitLab CI -- Hipchat -- PivotalTracker +- HipChat +- Pivotal Tracker - Pushover - Slack -- TeamCity \ No newline at end of file +- TeamCity diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md index f9d2f5dc4e..d40d74b1e3 100644 --- a/doc/raketasks/backup_restore.md +++ b/doc/raketasks/backup_restore.md @@ -214,19 +214,19 @@ This is recommended to reduce cron spam. If your GitLab server contains a lot of Git repository data you may find the GitLab backup script to be too slow. In this case you can consider using filesystem snapshots as part of your backup strategy. -Example: Amazone EBS +Example: Amazon EBS > A GitLab server using omnibus-gitlab hosted on Amazon AWS. > An EBS drive containing an ext4 filesystem is mounted at `/var/opt/gitlab`. > In this case you could make an application backup by taking an EBS snapshot. > The backup includes all repositories, uploads and Postgres data. -Example: LVM snapshots + Rsync +Example: LVM snapshots + rsync > A GitLab server using omnibus-gitlab, with an LVM logical volume mounted at `/var/opt/gitlab`. -> Replicating the `/var/opt/gitlab` directory usign Rsync would not be reliable because too many files would change while Rsync is running. +> Replicating the `/var/opt/gitlab` directory using rsync would not be reliable because too many files would change while rsync is running. > Instead of rsync-ing `/var/opt/gitlab`, we create a temporary LVM snapshot, which we mount as a read-only filesystem at `/mnt/gitlab_backup`. -> Now we can have a longer running Rsync job which will create a consistent replica on the remote server. +> Now we can have a longer running rsync job which will create a consistent replica on the remote server. > The replica includes all repositories, uploads and Postgres data. If you are running GitLab on a virtualized server you can possibly also create VM snapshots of the entire GitLab server. diff --git a/doc/release/howto_rc1.md b/doc/release/howto_rc1.md index 25923d16f3..e8e8c8a821 100644 --- a/doc/release/howto_rc1.md +++ b/doc/release/howto_rc1.md @@ -104,7 +104,7 @@ bundle exec rake release["x.x.0.rc1"] ``` Now developers can use master for merging new features. -So you should use stable branch for future code chages related to release. +So you should use stable branch for future code changes related to release. ### 5. Release GitLab CI RC1 diff --git a/doc/release/monthly.md b/doc/release/monthly.md index 175112b90c..4297bc7e2b 100644 --- a/doc/release/monthly.md +++ b/doc/release/monthly.md @@ -207,7 +207,7 @@ __3. Tweet to blog__ Send out a tweet to share the good news with the world. List the most important features and link to the blog post. -Proposed tweet "Release of GitLab X.X & CI Y.Y! FEATURE, FEATURE and FEATURE #gitlab" +Proposed tweet "Release of GitLab X.X & CI Y.Y! FEATURE, FEATURE and FEATURE <link-to-blog-post> #gitlab" Consider creating a post on Hacker News. diff --git a/doc/security/information_exclusivity.md b/doc/security/information_exclusivity.md index 127166ae2e..f8e7fc3fd0 100644 --- a/doc/security/information_exclusivity.md +++ b/doc/security/information_exclusivity.md @@ -4,6 +4,6 @@ Git is a distributed version control system (DVCS). This means that everyone that works with the source code has a local copy of the complete repository. In GitLab every project member that is not a guest (so reporters, developers and masters) can clone the repository to get a local copy. After obtaining this local copy the user can upload the full repository anywhere, including another project under their control or another server. -The consequense is that you can't build access controls that prevent the intentional sharing of source code by users that have access to the source code. +The consequence is that you can't build access controls that prevent the intentional sharing of source code by users that have access to the source code. This is an inherent feature of a DVCS and all git management systems have this limitation. Obviously you can take steps to prevent unintentional sharing and information destruction, this is why only some people are allowed to invite others and nobody can force push a protected branch. diff --git a/doc/system_hooks/system_hooks.md b/doc/system_hooks/system_hooks.md index 41c2732ef7..f9b6d37d84 100644 --- a/doc/system_hooks/system_hooks.md +++ b/doc/system_hooks/system_hooks.md @@ -15,8 +15,8 @@ System hooks can be used, e.g. for logging or changing information in a LDAP ser "name": "StoreCloud", "owner_email": "johnsmith@gmail.com", "owner_name": "John Smith", - "path": "stormcloud", - "path_with_namespace": "jsmith/stormcloud", + "path": "storecloud", + "path_with_namespace": "jsmith/storecloud", "project_id": 74, "project_visibility": "private", } @@ -126,10 +126,10 @@ System hooks can be used, e.g. for logging or changing information in a LDAP ser { "created_at": "2012-07-21T07:30:54Z", "event_name": "group_create", - "name": "StormCloud", + "name": "StoreCloud", "owner_email": "johnsmith@gmail.com", "owner_name": "John Smith", - "path": "stormcloud", + "path": "storecloud", "group_id": 78 } ``` diff --git a/doc/update/2.6-to-3.0.md b/doc/update/2.6-to-3.0.md index 6aabbe095d..2044b65946 100644 --- a/doc/update/2.6-to-3.0.md +++ b/doc/update/2.6-to-3.0.md @@ -22,29 +22,29 @@ sudo -u gitlab bundle exec rake db:migrate RAILS_ENV=production # !!! Config should be replaced with a new one. Check it after replace cp config/gitlab.yml.example config/gitlab.yml -# update gitolite hooks +# update Gitolite hooks -# GITOLITE v2: +# Gitolite v2: sudo cp ./lib/hooks/post-receive /home/git/share/gitolite/hooks/common/post-receive sudo chown git:git /home/git/share/gitolite/hooks/common/post-receive -# GITOLITE v3: +# Gitolite v3: sudo cp ./lib/hooks/post-receive /home/git/.gitolite/hooks/common/post-receive sudo chown git:git /home/git/.gitolite/hooks/common/post-receive # set valid path to hooks in gitlab.yml in git_host section # like this git_host: - # gitolite 2 + # Gitolite 2 hooks_path: /home/git/share/gitolite/hooks - # gitolite 3 + # Gitolite 3 hooks_path: /home/git/.gitolite/hooks/ -# Make some changes to gitolite config +# Make some changes to Gitolite config # For more information visit https://github.com/gitlabhq/gitlabhq/pull/1719 -# gitolite v2 +# Gitolite v2 sudo -u git -H sed -i 's/\(GL_GITCONFIG_KEYS\s*=>*\s*\).\{2\}/\\1"\.\*"/g' /home/git/.gitolite.rc # gitlite v3 diff --git a/doc/update/4.2-to-5.0.md b/doc/update/4.2-to-5.0.md index 7974ae47ff..0a929591de 100644 --- a/doc/update/4.2-to-5.0.md +++ b/doc/update/4.2-to-5.0.md @@ -111,7 +111,7 @@ sudo chmod -R u+rwX /home/git/gitlab/tmp/pids ``` -## 6. Update init.d script and nginx config +## 6. Update init.d script and Nginx config ```bash # init.d @@ -123,7 +123,7 @@ sudo chmod +x /etc/init.d/gitlab sudo -u git -H cp /home/git/gitlab/config/unicorn.rb /home/git/gitlab/config/unicorn.rb.old sudo -u git -H cp /home/git/gitlab/config/unicorn.rb.example /home/git/gitlab/config/unicorn.rb -#nginx +# Nginx # Replace path from '/home/gitlab/' to '/home/git/' sudo vim /etc/nginx/sites-enabled/gitlab sudo service nginx restart @@ -137,7 +137,7 @@ sudo service gitlab start # check if unicorn and sidekiq started # If not try to logout, also check replaced path from '/home/gitlab/' to '/home/git/' -# in nginx, unicorn, init.d etc +# in Nginx, unicorn, init.d etc ps aux | grep unicorn ps aux | grep sidekiq diff --git a/doc/update/5.1-to-6.0.md b/doc/update/5.1-to-6.0.md index a76b371e6d..ef412b4569 100644 --- a/doc/update/5.1-to-6.0.md +++ b/doc/update/5.1-to-6.0.md @@ -40,7 +40,7 @@ sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production The migrations in this update are very sensitive to incomplete or inconsistent data. If you have a long-running GitLab installation and some of the previous upgrades did not work out 100% correct this may bite you now. The following can help you have a more smooth upgrade. -### Find projets with invalid project names +### Find projects with invalid project names #### MySQL Login to MySQL: diff --git a/doc/update/6.1-to-6.2.md b/doc/update/6.1-to-6.2.md index efa6e43124..11b124cf26 100644 --- a/doc/update/6.1-to-6.2.md +++ b/doc/update/6.1-to-6.2.md @@ -35,7 +35,7 @@ sudo -u git -H git checkout v1.7.9 # Addresses multiple critical security vulner ## 4. Install additional packages ```bash -# Add support for lograte for better log file handling +# Add support for logrotate for better log file handling sudo apt-get install logrotate ``` diff --git a/doc/update/6.x-or-7.x-to-7.7.md b/doc/update/6.x-or-7.x-to-7.7.md index 6501a8d214..30395c68d9 100644 --- a/doc/update/6.x-or-7.x-to-7.7.md +++ b/doc/update/6.x-or-7.x-to-7.7.md @@ -84,7 +84,7 @@ sudo -u git -H git checkout 7-7-stable-ee ## 4. Install additional packages ```bash -# Add support for lograte for better log file handling +# Add support for logrotate for better log file handling sudo apt-get install logrotate # Install pkg-config and cmake, which is needed for the latest versions of rugged @@ -217,13 +217,13 @@ mysql -u root -p # Convert all tables to use the InnoDB storage engine (added in GitLab 6.8) SELECT CONCAT('ALTER TABLE gitlabhq_production.', table_name, ' ENGINE=InnoDB;') AS 'Copy & run these SQL statements:' FROM information_schema.tables WHERE table_schema = 'gitlabhq_production' AND `ENGINE` <> 'InnoDB' AND `TABLE_TYPE` = 'BASE TABLE'; -# If previous query returned results, copy & run all outputed SQL statements +# If previous query returned results, copy & run all shown SQL statements # Convert all tables to correct character set SET foreign_key_checks = 0; SELECT CONCAT('ALTER TABLE gitlabhq_production.', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS 'Copy & run these SQL statements:' FROM information_schema.tables WHERE table_schema = 'gitlabhq_production' AND `TABLE_COLLATION` <> 'utf8_unicode_ci' AND `TABLE_TYPE` = 'BASE TABLE'; -# If previous query returned results, copy & run all outputed SQL statements +# If previous query returned results, copy & run all shown SQL statements # turn foreign key checks back on SET foreign_key_checks = 1; diff --git a/doc/update/7.3-to-7.4.md b/doc/update/7.3-to-7.4.md index 2466050ea4..62bd98832c 100644 --- a/doc/update/7.3-to-7.4.md +++ b/doc/update/7.3-to-7.4.md @@ -114,13 +114,13 @@ mysql -u root -p # Convert all tables to use the InnoDB storage engine (added in GitLab 6.8) SELECT CONCAT('ALTER TABLE gitlabhq_production.', table_name, ' ENGINE=InnoDB;') AS 'Copy & run these SQL statements:' FROM information_schema.tables WHERE table_schema = 'gitlabhq_production' AND `ENGINE` <> 'InnoDB' AND `TABLE_TYPE` = 'BASE TABLE'; -# If previous query returned results, copy & run all outputed SQL statements +# If previous query returned results, copy & run all shown SQL statements # Convert all tables to correct character set SET foreign_key_checks = 0; SELECT CONCAT('ALTER TABLE gitlabhq_production.', table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') AS 'Copy & run these SQL statements:' FROM information_schema.tables WHERE table_schema = 'gitlabhq_production' AND `TABLE_COLLATION` <> 'utf8_unicode_ci' AND `TABLE_TYPE` = 'BASE TABLE'; -# If previous query returned results, copy & run all outputed SQL statements +# If previous query returned results, copy & run all shown SQL statements # turn foreign key checks back on SET foreign_key_checks = 1; diff --git a/doc/update/README.md b/doc/update/README.md index 30e9137d7b..5380ddbd03 100644 --- a/doc/update/README.md +++ b/doc/update/README.md @@ -13,4 +13,4 @@ Depending on the installation method and your GitLab version, there are multiple ## Miscellaneous -- [MySQL to PostgreSQL](mysql_to_postgresql.md) guides you through migrating your database from MySQL to PostrgreSQL. +- [MySQL to PostgreSQL](mysql_to_postgresql.md) guides you through migrating your database from MySQL to PostgreSQL. diff --git a/doc/workflow/gitlab_flow.md b/doc/workflow/gitlab_flow.md index 1dbff60cbf..0e87dc7421 100644 --- a/doc/workflow/gitlab_flow.md +++ b/doc/workflow/gitlab_flow.md @@ -43,7 +43,7 @@ Since most tools automatically make the master branch the default one and displa The second problem of git flow is the complexity introduced by the hotfix and release branches. These branches can be a good idea for some organizations but are overkill for the vast majority of them. Nowadays most organizations practice continuous delivery which means that your default branch can be deployed. -This means that hotfixed and release branches can be prevented including all the ceremony they introduce. +This means that hotfix and release branches can be prevented including all the ceremony they introduce. An example of this ceremony is the merging back of release branches. Though specialized tools do exist to solve this, they require documentation and add complexity. Frequently developers make a mistake and for example changes are only merged into master and not into the develop branch. @@ -95,12 +95,12 @@ An 'extreme' version of environment branches are setting up an environment for e ## Release branches with GitLab flow -![Master and multiple release branches that vary in length with cherrypicks from master](release_branches.png) +![Master and multiple release branches that vary in length with cherry-picks from master](release_branches.png) Only in case you need to release software to the outside world you need to work with release branches. In this case, each branch contains a minor version (2-3-stable, 2-4-stable, etc.). The stable branch uses master as a starting point and is created as late as possible. -By branching as late as possible you minimize the time you have to apply bugfixes to multiple branches. +By branching as late as possible you minimize the time you have to apply bug fixes to multiple branches. After a release branch is announced, only serious bug fixes are included in the release branch. If possible these bug fixes are first merged into master and then cherry-picked into the release branch. This way you can't forget to cherry-pick them into master and encounter the same bug on subsequent releases. @@ -177,7 +177,7 @@ In GitLab this creates a comment in the issue that the merge requests mentions t And the merge request shows the linked issues. These issues are closed once code is merged into the default branch. -If you only want to make the reference without closing the issue you can also just mention it: "Ducktyping is preferred. #12". +If you only want to make the reference without closing the issue you can also just mention it: "Duck typing is preferred. #12". If you have an issue that spans across multiple repositories, the best thing is to create an issue for each repository and link all issues to a parent issue. diff --git a/doc/workflow/migrating_from_svn.md b/doc/workflow/migrating_from_svn.md index 207e364180..485db4834e 100644 --- a/doc/workflow/migrating_from_svn.md +++ b/doc/workflow/migrating_from_svn.md @@ -3,7 +3,7 @@ SVN stands for Subversion and is a version control system (VCS). Git is a distributed version control system. -There are some major differences between the two, for more information consult your favourite search engine. +There are some major differences between the two, for more information consult your favorite search engine. Git has tools for migrating SVN repositories to git, namely `git svn`. You can read more about this at [git documentation pages](http://git-scm.com/book/en/Git-and-Other-Systems-Git-and-Subversion). diff --git a/doc/workflow/notifications.md b/doc/workflow/notifications.md index 3c3ce162df..17215de677 100644 --- a/doc/workflow/notifications.md +++ b/doc/workflow/notifications.md @@ -24,14 +24,14 @@ Each of these settings have levels of notification: #### Global Settings Global Settings are at the bottom of the hierarchy. -Any setting set here will be overriden by a setting at the group or a project level. +Any setting set here will be overridden by a setting at the group or a project level. Group or Project settings can use `global` notification setting which will then use anything that is set at Global Settings. #### Group Settings -Group Settings are taking presedence over Global Settings but are on a level below Project Settings. +Group Settings are taking precedence over Global Settings but are on a level below Project Settings. This means that you can set a different level of notifications per group while still being able to have a finer level setting per project. Organization like this is suitable for users that belong to different groups but don't have the @@ -39,7 +39,7 @@ same need for being notified for every group they are member of. #### Project Settings -Project Settings are at the top level and any setting placed at this level will take presedence of any +Project Settings are at the top level and any setting placed at this level will take precedence of any other setting. This is suitable for users that have different needs for notifications per project basis. From 7b233ea853df7c13be688c0e47636d2750453f31 Mon Sep 17 00:00:00 2001 From: Sytse Sijbrandij Date: Tue, 3 Feb 2015 16:55:31 -0800 Subject: [PATCH 89/96] Spelling improvement, add in a group, not into group. --- app/views/admin/groups/show.html.haml | 2 +- app/views/groups/_new_group_member.html.haml | 2 +- features/steps/admin/groups.rb | 2 +- features/steps/groups.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index 8057de3880..d356aff636 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -64,7 +64,7 @@ %div.prepend-top-10 = select_tag :access_level, options_for_select(GroupMember.access_level_roles), class: "project-access-select select2" %hr - = button_tag 'Add users into group', class: "btn btn-create" + = button_tag 'Add users to group', class: "btn btn-create" .panel.panel-default .panel-heading %h3.panel-title diff --git a/app/views/groups/_new_group_member.html.haml b/app/views/groups/_new_group_member.html.haml index ed00153de7..345c0555a3 100644 --- a/app/views/groups/_new_group_member.html.haml +++ b/app/views/groups/_new_group_member.html.haml @@ -12,4 +12,4 @@ %strong= link_to "here", help_page_path("permissions", "permissions"), class: "vlink" .form-actions - = f.submit 'Add users into group', class: "btn btn-create" + = f.submit 'Add users to group', class: "btn btn-create" diff --git a/features/steps/admin/groups.rb b/features/steps/admin/groups.rb index 4171398e56..5e45063b4b 100644 --- a/features/steps/admin/groups.rb +++ b/features/steps/admin/groups.rb @@ -41,7 +41,7 @@ class Spinach::Features::AdminGroups < Spinach::FeatureSteps within "#new_team_member" do select "Reporter", from: "access_level" end - click_button "Add users into group" + click_button "Add users to group" end step 'I should see "John Doe" in team list in every project as "Reporter"' do diff --git a/features/steps/groups.rb b/features/steps/groups.rb index f09d751dba..895ee7ba08 100644 --- a/features/steps/groups.rb +++ b/features/steps/groups.rb @@ -34,7 +34,7 @@ class Spinach::Features::Groups < Spinach::FeatureSteps select2(user.id, from: "#user_ids", multiple: true) select "Reporter", from: "access_level" end - click_button "Add users into group" + click_button "Add users to group" end step 'I should see user "John Doe" in team list' do From 490cf7bfcefdb2e275c537699717c12e440f57ec Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 18:12:20 -0800 Subject: [PATCH 90/96] Improve protected branches selectbox options --- lib/gitlab/access.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb index ad05bfadaf..424541b4a0 100644 --- a/lib/gitlab/access.rb +++ b/lib/gitlab/access.rb @@ -50,12 +50,13 @@ module Gitlab end def protection_options - { - "None" => PROTECTION_NONE, - "Protect, developers can push" => PROTECTION_DEV_CAN_PUSH, - "Full protection" => PROTECTION_FULL, - } + { + "Not protected, developers and masters can (force) push and delete the branch" => PROTECTION_NONE, + "Partially protected, developers can also push but prevent all force pushes and deletion" => PROTECTION_DEV_CAN_PUSH, + "Fully protected, only masters can push and prevent all force pushes and deletion" => PROTECTION_FULL, + } end + def protection_values protection_options.values end From 655fbc6bddb1d5f8df3e50f2896e5c6c276628b8 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 3 Feb 2015 19:25:57 -0800 Subject: [PATCH 91/96] Dont load rubocop in prod env --- lib/tasks/rubocop.rake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/tasks/rubocop.rake b/lib/tasks/rubocop.rake index c28e529f86..ddfaf5d51f 100644 --- a/lib/tasks/rubocop.rake +++ b/lib/tasks/rubocop.rake @@ -1,2 +1,4 @@ -require 'rubocop/rake_task' -RuboCop::RakeTask.new +unless Rails.env.production? + require 'rubocop/rake_task' + RuboCop::RakeTask.new +end From b60d06eb2c91a61b91a214dac0f0f526b146f8d7 Mon Sep 17 00:00:00 2001 From: Jeroen van Baarsen Date: Mon, 2 Feb 2015 22:08:10 +0100 Subject: [PATCH 92/96] Added a way to retrieve MR files Signed-off-by: Jeroen van Baarsen --- CHANGELOG | 2 +- doc/api/merge_requests.md | 70 ++++++++++++++++++++++++ lib/api/entities.rb | 16 ++++-- lib/api/merge_requests.rb | 16 ++++++ spec/requests/api/merge_requests_spec.rb | 13 +++++ 5 files changed, 111 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2db5beb002..e011a6183f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -8,7 +8,7 @@ v 7.8.0 - Better UI for project services page - Cleaner UI for web editor - Add diff syntax highlighting in email-on-push service notifications (Hannes Rosenögger) - - + - Add API endpoint to fetch all changes on a MergeRequest (Jeroen van Baarsen) - - - Allow more variations for commit messages closing issues (Julien Bianchi and Hannes Rosenögger) diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md index 053fc9346b..acae55d07e 100644 --- a/doc/api/merge_requests.md +++ b/doc/api/merge_requests.md @@ -94,6 +94,76 @@ Parameters: } ``` +## Get single MR changes + +Shows information about the merge request including its files and changes + +``` +GET /projects/:id/merge_request/:merge_request_id/changes +``` + +Parameters: + +- `id` (required) - The ID of a project +- `merge_request_id` (required) - The ID of MR + +```json +{ + "id": 21, + "iid": 1, + "project_id": 4, + "title": "Blanditiis beatae suscipit hic assumenda et molestias nisi asperiores repellat et.", + "description": "Qui voluptatibus placeat ipsa alias quasi. Deleniti rem ut sint. Optio velit qui distinctio.", + "state": "reopened", + "created_at": "2015-02-02T19:49:39.159Z", + "updated_at": "2015-02-02T20:08:49.959Z", + "target_branch": "secret_token", + "source_branch": "version-1-9", + "upvotes": 0, + "downvotes": 0, + "author": { + "name": "Chad Hamill", + "username": "jarrett", + "id": 5, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/b95567800f828948baf5f4160ebb2473?s=40&d=identicon" + }, + "assignee": { + "name": "Administrator", + "username": "root", + "id": 1, + "state": "active", + "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon" + }, + "source_project_id": 4, + "target_project_id": 4, + "labels": [ ], + "milestone": { + "id": 5, + "iid": 1, + "project_id": 4, + "title": "v2.0", + "description": "Assumenda aut placeat expedita exercitationem labore sunt enim earum.", + "state": "closed", + "created_at": "2015-02-02T19:49:26.013Z", + "updated_at": "2015-02-02T19:49:26.013Z", + "due_date": null + }, + "files": [ + { + "old_path": "VERSION", + "new_path": "VERSION", + "a_mode": "100644", + "b_mode": "100644", + "diff": "--- a/VERSION\ +++ b/VERSION\ @@ -1 +1 @@\ -1.9.7\ +1.9.8", + "new_file": false, + "renamed_file": false, + "deleted_file": false + } + ] +} +``` + ## Create MR Creates a new merge request. diff --git a/lib/api/entities.rb b/lib/api/entities.rb index ac166ed4fb..96920718ab 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -147,6 +147,11 @@ module API expose :state, :created_at, :updated_at end + class RepoDiff < Grape::Entity + expose :old_path, :new_path, :a_mode, :b_mode, :diff + expose :new_file, :renamed_file, :deleted_file + end + class Milestone < ProjectEntity expose :due_date end @@ -166,6 +171,12 @@ module API expose :milestone, using: Entities::Milestone end + class MergeRequestChanges < MergeRequest + expose :diffs, as: :changes, using: Entities::RepoDiff do |compare, _| + compare.diffs + end + end + class SSHKey < Grape::Entity expose :id, :title, :key, :created_at end @@ -236,11 +247,6 @@ module API expose :name, :color end - class RepoDiff < Grape::Entity - expose :old_path, :new_path, :a_mode, :b_mode, :diff - expose :new_file, :renamed_file, :deleted_file - end - class Compare < Grape::Entity expose :commit, using: Entities::RepoCommit do |compare, options| Commit.decorate(compare.commits).last diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 2a5b10c6f5..a0ebd8d0c1 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -75,6 +75,22 @@ module API present merge_request, with: Entities::MergeRequest end + # Show MR changes + # + # Parameters: + # id (required) - The ID of a project + # merge_request_id (required) - The ID of MR + # + # Example: + # GET /projects/:id/merge_request/:merge_request_id/changes + # + get ':id/merge_request/:merge_request_id/changes' do + merge_request = user_project.merge_requests. + find(params[:merge_request_id]) + authorize! :read_merge_request, merge_request + present merge_request, with: Entities::MergeRequestChanges + end + # Create MR # # Parameters: diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 5ba3a33099..5795082f5c 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -114,6 +114,19 @@ describe API::API, api: true do end end + describe 'GET /projects/:id/merge_request/:merge_request_id/changes' do + it 'should return the change information of the merge_request' do + get api("/projects/#{project.id}/merge_request/#{merge_request.id}/changes", user) + expect(response.status).to eq 200 + expect(json_response['changes'].size).to eq(merge_request.diffs.size) + end + + it 'returns a 404 when merge_request_id not found' do + get api("/projects/#{project.id}/merge_request/999/changes", user) + expect(response.status).to eq(404) + end + end + describe "POST /projects/:id/merge_requests" do context 'between branches projects' do it "should return merge_request" do From 7aa3f6053efd9c1e2db962f7146a13bdf3d147c9 Mon Sep 17 00:00:00 2001 From: Ewan Edwards Date: Wed, 4 Feb 2015 08:23:24 -0800 Subject: [PATCH 93/96] Consolidate the SSH topics into a single file, since the two available topics are quite short. Also correct some missing words, punctuation. --- doc/ssh/README.md | 73 ++++++++++++++++++++++++++++++++++++++++-- doc/ssh/deploy_keys.md | 9 ------ doc/ssh/ssh.md | 38 ---------------------- 3 files changed, 71 insertions(+), 49 deletions(-) delete mode 100644 doc/ssh/deploy_keys.md delete mode 100644 doc/ssh/ssh.md diff --git a/doc/ssh/README.md b/doc/ssh/README.md index c87fffd7d2..6fe23dfa2a 100644 --- a/doc/ssh/README.md +++ b/doc/ssh/README.md @@ -1,4 +1,73 @@ # SSH -- [Deploy keys](deploy_keys.md) -- [SSH](ssh.md) +## SSH keys + +An SSH key allows you to establish a secure connection between your +computer and GitLab. + +Before generating an SSH key, check if your system already has one by +running `cat ~/.ssh/id_rsa.pub`. If you see a long string starting with +`ssh-rsa` or `ssh-dsa`, you can skip the ssh-keygen step. + +To generate a new SSH key, just open your terminal and use code below. The +ssh-keygen command prompts you for a location and filename to store the key +pair and for a password. When prompted for the location and filename, you +can press enter to use the default. + +It is a best practice to use a password for an SSH key, but it is not +required and you can skip creating a password by pressing enter. Note that +the password you choose here can't be altered or retrieved. + +```bash +ssh-keygen -t rsa -C "$your_email" +``` + +Use the code below to show your public key. + +```bash +cat ~/.ssh/id_rsa.pub +``` + +Copy-paste the key to the 'My SSH Keys' section under the 'SSH' tab in your +user profile. Please copy the complete key starting with `ssh-` and ending +with your username and host. + +Use code below to copy your public key to the clipboard. Depending on your +OS you'll need to use a different command: + +**Windows:** +```bash +clip < ~/.ssh/id_rsa.pub +``` + +**Mac:** +```bash +pbcopy < ~/.ssh/id_rsa.pub +``` + +**Linux (requires xclip):** +```bash +xclip -sel clip < ~/.ssh/id_rsa.pub +``` + +## Deploy keys + +Deploy keys allow read-only access to multiple projects with a single SSH +key. + +This is really useful for cloning repositories to your Continuous +Integration (CI) server. By using deploy keys, you don't have to setup a +dummy user account. + +If you are a project master or owner, you can add a deploy key in the +project settings under the section 'Deploy Keys'. Press the 'New Deploy +Key' button and upload a public SSH key. After this, the machine that uses +the corresponding private key has read-only access to the project. + +You can't add the same deploy key twice with the 'New Deploy Key' option. +If you want to add the same key to another project, please enable it in the +list that says 'Deploy keys from projects available to you'. All the deploy +keys of all the projects you have access to are available. This project +access can happen through being a direct member of the projecti, or through +a group. See `def accessible_deploy_keys` in `app/models/user.rb` for more +information. diff --git a/doc/ssh/deploy_keys.md b/doc/ssh/deploy_keys.md deleted file mode 100644 index dcca8bdc61..0000000000 --- a/doc/ssh/deploy_keys.md +++ /dev/null @@ -1,9 +0,0 @@ -# Deploy keys - -Deploy keys allow read-only access one or multiple projects with a single SSH key. - -This is really useful for cloning repositories to your Continuous Integration (CI) server. By using a deploy keys you don't have to setup a dummy user account. - -If you are a project master or owner you can add a deploy key in the project settings under the section Deploy Keys. Press the 'New Deploy Key' button and upload a public ssh key. After this the machine that uses the corresponding private key has read-only access to the project. - -You can't add the same deploy key twice with the 'New Deploy Key' option. If you want to add the same key to another project please enable it in the list that says 'Deploy keys from projects available to you'. All the deploy keys of all the projects you have access to are available. This project access can happen through being a direct member of the project or through a group. See `def accessible_deploy_keys` in `app/models/user.rb` for more information. diff --git a/doc/ssh/ssh.md b/doc/ssh/ssh.md deleted file mode 100644 index f9ee627f1f..0000000000 --- a/doc/ssh/ssh.md +++ /dev/null @@ -1,38 +0,0 @@ -# SSH keys - -SSH key allows you to establish a secure connection between your computer and GitLab - -Before generating an SSH key, check if your system already has one by running `cat ~/.ssh/id_rsa.pub` If your see a long string starting with `ssh-rsa` or `ssh-dsa`, you can skip the ssh-keygen step. - -To generate a new SSH key just open your terminal and use code below. The ssh-keygen command prompts you for a location and filename to store the key pair and for a password. When prompted for the location and filename you can press enter to use the default. -It is a best practice to use a password for an SSH key but it is not required and you can skip creating a password by pressing enter. -Note that the password you choose here can't be altered or retrieved. - -```bash -ssh-keygen -t rsa -C "$your_email" -``` - -Use the code below to show your public key. - -```bash -cat ~/.ssh/id_rsa.pub -``` - -Copy-paste the key to the 'My SSH Keys' section under the 'SSH' tab in your user profile. Please copy the complete key starting with `ssh-` and ending with your username and host. - -Use code below to copy your public key to the clipboard. Depending on your OS you'll need to use a different command: - -**Windows:** -```bash -clip < ~/.ssh/id_rsa.pub -``` - -**Mac:** -```bash -pbcopy < ~/.ssh/id_rsa.pub -``` - -**Linux (requires xclip):** -```bash -xclip -sel clip < ~/.ssh/id_rsa.pub -``` From 61d07eabfc7b9ad44b0d50f73003cabe28a04b42 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 4 Feb 2015 13:54:19 -0800 Subject: [PATCH 94/96] Fix tests --- spec/features/help_pages_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/features/help_pages_spec.rb b/spec/features/help_pages_spec.rb index 5850a24a42..89129cfc7c 100644 --- a/spec/features/help_pages_spec.rb +++ b/spec/features/help_pages_spec.rb @@ -6,7 +6,7 @@ describe 'Help Pages', feature: true do login_as :user end it 'replace the variable $your_email with the email of the user' do - visit help_page_path(category: 'ssh', file: 'ssh.md') + visit help_page_path(category: 'ssh', file: 'README.md') page.should have_content("ssh-keygen -t rsa -C \"#{@user.email}\"") end end From 0e2fcb68d7d169574391b845df0973575fa41c08 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 4 Feb 2015 15:23:38 -0800 Subject: [PATCH 95/96] Disable project path blacklist Because since project always belongs to namespace it dont need such strict restrictions any more --- app/models/project.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/models/project.rb b/app/models/project.rb index cfe40553ab..390e1457ca 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -116,7 +116,6 @@ class Project < ActiveRecord::Base validates :path, presence: true, length: { within: 0..255 }, - exclusion: { in: Gitlab::Blacklist.path }, format: { with: Gitlab::Regex.path_regex, message: Gitlab::Regex.path_regex_message } validates :issues_enabled, :merge_requests_enabled, From d8cb235195cc70542d580842383d2697d5a5c5fd Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Wed, 4 Feb 2015 16:57:55 -0800 Subject: [PATCH 96/96] CHANGELOG updated with project na,es blacklist --- CHANGELOG | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 4698bb7bd8..12d6f5830b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -29,7 +29,7 @@ v 7.8.0 - Fix commits pagination - - Async load a branch information at the commit page - - + - Disable blacklist validation for project names - Allow configuring protection of the default branch upon first push (Marco Wessel) - -