From 8bf52a4ae3aebc8c58f51cff696e99ecafe9c7c8 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Fri, 16 Dec 2016 02:12:21 -0200 Subject: [PATCH 001/313] Show directory hierarchy when listing wiki pages --- app/controllers/projects/wikis_controller.rb | 3 ++- app/models/wiki_page.rb | 25 +++++++++++++++++++ app/views/projects/wikis/_sidebar.html.haml | 12 ++++++--- app/views/projects/wikis/pages.html.haml | 14 +++++++---- .../23535-folders-in-wiki-repository.yml | 4 +++ spec/models/wiki_page_spec.rb | 17 +++++++++++++ 6 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 changelogs/unreleased/23535-folders-in-wiki-repository.yml diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index c3353446fd1..45a42400b2a 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -8,6 +8,7 @@ class Projects::WikisController < Projects::ApplicationController def pages @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]) + @wiki_directories = WikiPage.group_by_directory(@wiki_pages) end def show @@ -116,7 +117,7 @@ class Projects::WikisController < Projects::ApplicationController # Call #wiki to make sure the Wiki Repo is initialized @project_wiki.wiki - @sidebar_wiki_pages = @project_wiki.pages.first(15) + @sidebar_wiki_directories = WikiPage.group_by_directory(@project_wiki.pages.first(15)) rescue ProjectWiki::CouldNotCreateWikiError flash[:notice] = "Could not create Wiki Repository at this time. Please try again later." redirect_to project_path(@project) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index c3de278f5b7..30db2b13dc0 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -12,6 +12,23 @@ class WikiPage ActiveModel::Name.new(self, nil, 'wiki') end + def self.group_by_directory(pages) + directories = {} + + pages.each do |page| + if page.slug.include?('/') + # Directory hierarchy is given by matching from the beginning up to + # the last forward slash. + directory = page.slug.match(/\A(.+)\//)[1] + directories[directory] = add_to_directory(directories[directory], page) + else + directories['root'] = add_to_directory(directories['root'], page) + end + end + + directories + end + def to_key [:slug] end @@ -176,6 +193,14 @@ class WikiPage private + def self.add_to_directory(directory, page) + if directory.present? + directory << page + else + [page] + end + end + def set_attributes attributes[:slug] = @page.url_path attributes[:title] = @page.title diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index cad9c15a49e..5aee1a136f5 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -12,10 +12,14 @@ .blocks-container .block.block-first %ul.wiki-pages - - @sidebar_wiki_pages.each do |wiki_page| - %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } - = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do - = wiki_page.title.capitalize + - @sidebar_wiki_directories.each do |wiki_directory, wiki_pages| + %li + = wiki_directory + %ul + - wiki_pages.each do |wiki_page| + %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } + = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do + = wiki_page.title.capitalize .block = link_to namespace_project_wikis_pages_path(@project.namespace, @project), class: 'btn btn-block' do More Pages diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index e1eaffc6884..274afb1bdea 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -14,10 +14,14 @@ Clone repository %ul.content-list - - @wiki_pages.each do |wiki_page| + - @wiki_directories.each do |wiki_directory, wiki_pages| %li - = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) - %small (#{wiki_page.format}) - .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} + = wiki_directory + %ul + - wiki_pages.each do |wiki_page| + %li + = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) + %small (#{wiki_page.format}) + .pull-right + %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} = paginate @wiki_pages, theme: 'gitlab' diff --git a/changelogs/unreleased/23535-folders-in-wiki-repository.yml b/changelogs/unreleased/23535-folders-in-wiki-repository.yml new file mode 100644 index 00000000000..7361b182a94 --- /dev/null +++ b/changelogs/unreleased/23535-folders-in-wiki-repository.yml @@ -0,0 +1,4 @@ +--- +title: Show directory hierarchy when listing wiki pages +merge_request: +author: Alex Braha Stoll diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 5c34b1b0a30..25e7b517fe6 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -7,6 +7,23 @@ describe WikiPage, models: true do subject { WikiPage.new(wiki) } + describe '::group_by_directory' do + context 'when there are no pages' do + it 'returns an empty hash' do + end + end + + context 'when there are pages' do + let!(:page_1) { create_page('page_1', 'content') } + let!(:page_2) { create_page('directory/page_2', 'content') } + let(:pages) { [page_1, page_2] } + + xit 'returns a hash in which keys are directories and values are their pages' do + expected_grouped_pages = { 'root' => [page_1], 'directory' => [page_2] } + end + end + end + describe "#initialize" do context "when initialized with an existing gollum page" do before do From 083442bc716d7e69cbb9e7852159b0f3ba9a4610 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 17 Dec 2016 16:38:26 -0200 Subject: [PATCH 002/313] Add specs for WikiPage.group_by_directory --- spec/models/wiki_page_spec.rb | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 25e7b517fe6..595d4a621c1 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -7,19 +7,37 @@ describe WikiPage, models: true do subject { WikiPage.new(wiki) } - describe '::group_by_directory' do + describe '.group_by_directory' do context 'when there are no pages' do it 'returns an empty hash' do + expect(WikiPage.group_by_directory(nil)).to eq({}) + expect(WikiPage.group_by_directory([])).to eq({}) end end context 'when there are pages' do - let!(:page_1) { create_page('page_1', 'content') } - let!(:page_2) { create_page('directory/page_2', 'content') } - let(:pages) { [page_1, page_2] } + before do + create_page('page_1', 'content') + create_page('dir_1/page_2', 'content') + create_page('dir_1/dir_2/page_3', 'content') + end - xit 'returns a hash in which keys are directories and values are their pages' do - expected_grouped_pages = { 'root' => [page_1], 'directory' => [page_2] } + it 'returns a hash in which keys are directories and values are their pages' do + page_1 = wiki.find_page('page_1') + page_2 = wiki.find_page('dir_1/page_2') + page_3 = wiki.find_page('dir_1/dir_2/page_3') + expected_grouped_pages = { + '/' => [page_1], 'dir_1' => [page_2], 'dir_1/dir_2' => [page_3] + } + + grouped_pages = WikiPage.group_by_directory(wiki.pages) + + grouped_pages.each do |dir, pages| + expected_slugs = expected_grouped_pages.fetch(dir).map(&:slug) + slugs = pages.map(&:slug) + + expect(slugs).to match_array(expected_slugs) + end end end end From bebfba3e6de520f98d263ced2d2a17f6ddfc4a6f Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 17 Dec 2016 16:38:55 -0200 Subject: [PATCH 003/313] Refactor WikiPage.group_by_directory --- app/models/wiki_page.rb | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 30db2b13dc0..425384d3df4 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -13,17 +13,14 @@ class WikiPage end def self.group_by_directory(pages) - directories = {} + return {} if pages.blank? + directories = { '/' => [] } pages.each do |page| - if page.slug.include?('/') - # Directory hierarchy is given by matching from the beginning up to - # the last forward slash. - directory = page.slug.match(/\A(.+)\//)[1] - directories[directory] = add_to_directory(directories[directory], page) - else - directories['root'] = add_to_directory(directories['root'], page) - end + directory = page.wiki.page_title_and_dir(page.slug).last + directory = '/' if directory.blank? + directories[directory] ||= [] + directories[directory] << page end directories From c7294dded2fc869d6431ac192649f11ca7e96375 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 17 Dec 2016 16:39:55 -0200 Subject: [PATCH 004/313] Remove WikiPage.add_to_directory --- app/models/wiki_page.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 425384d3df4..aeacb6f8995 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -190,14 +190,6 @@ class WikiPage private - def self.add_to_directory(directory, page) - if directory.present? - directory << page - else - [page] - end - end - def set_attributes attributes[:slug] = @page.url_path attributes[:title] = @page.title From 91e1701b6abfb9a4b9ad50996bf4383d63b97e74 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 17 Dec 2016 17:38:45 -0200 Subject: [PATCH 005/313] Remove root directory name from the sidebar of wikis --- app/views/projects/wikis/_sidebar.html.haml | 16 +++++++++------- .../projects/wikis/_sidebar_wiki_pages.html.haml | 4 ++++ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 app/views/projects/wikis/_sidebar_wiki_pages.html.haml diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index 5aee1a136f5..b7464180a0c 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -13,13 +13,15 @@ .block.block-first %ul.wiki-pages - @sidebar_wiki_directories.each do |wiki_directory, wiki_pages| - %li - = wiki_directory - %ul - - wiki_pages.each do |wiki_page| - %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } - = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do - = wiki_page.title.capitalize + - if wiki_directory == '/' + = render 'sidebar_wiki_pages', wiki_pages: wiki_pages + - else + %li + = wiki_directory + %ul + = render 'sidebar_wiki_pages', wiki_pages: wiki_pages + + .block = link_to namespace_project_wikis_pages_path(@project.namespace, @project), class: 'btn btn-block' do More Pages diff --git a/app/views/projects/wikis/_sidebar_wiki_pages.html.haml b/app/views/projects/wikis/_sidebar_wiki_pages.html.haml new file mode 100644 index 00000000000..65453a384d2 --- /dev/null +++ b/app/views/projects/wikis/_sidebar_wiki_pages.html.haml @@ -0,0 +1,4 @@ +- wiki_pages.each do |wiki_page| + %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } + = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do + = wiki_page.title.capitalize From 294acf1c5cd2aea353081059c60b3951a2cf7c77 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 17 Dec 2016 18:00:29 -0200 Subject: [PATCH 006/313] Remove root directory name from index of wikis --- app/views/projects/wikis/_wiki_pages.html.haml | 6 ++++++ app/views/projects/wikis/pages.html.haml | 17 ++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 app/views/projects/wikis/_wiki_pages.html.haml diff --git a/app/views/projects/wikis/_wiki_pages.html.haml b/app/views/projects/wikis/_wiki_pages.html.haml new file mode 100644 index 00000000000..ac98599d96b --- /dev/null +++ b/app/views/projects/wikis/_wiki_pages.html.haml @@ -0,0 +1,6 @@ +- wiki_pages.each do |wiki_page| + %li + = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) + %small (#{wiki_page.format}) + .pull-right + %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 274afb1bdea..2813b3a1c81 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -15,13 +15,12 @@ %ul.content-list - @wiki_directories.each do |wiki_directory, wiki_pages| - %li - = wiki_directory - %ul - - wiki_pages.each do |wiki_page| - %li - = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) - %small (#{wiki_page.format}) - .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} + - if wiki_directory == '/' + = render 'wiki_pages', wiki_pages: wiki_pages + - else + %li + = wiki_directory + %ul + = render 'wiki_pages', wiki_pages: wiki_pages + = paginate @wiki_pages, theme: 'gitlab' From 5bbe6559917e1e64cdb047b6235715e2a7f002f2 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 18 Dec 2016 21:22:20 -0200 Subject: [PATCH 007/313] Add component to show the full path of a wiki page when viewing its content --- app/assets/stylesheets/pages/wiki.scss | 3 +- app/models/wiki_page.rb | 11 +++++++ app/views/projects/wikis/show.html.haml | 2 +- spec/models/wiki_page_spec.rb | 40 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index b9f81533150..7afadb7364d 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -14,7 +14,8 @@ font-size: 22px; } - .wiki-last-edit-by { + .wiki-last-edit-by, .wiki-page-full-path { + display: block; color: $gl-gray-light; strong { diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index aeacb6f8995..e970cfbfff8 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -88,6 +88,12 @@ class WikiPage end end + # The hierarchy of the directory this page is contained in. + def directory + dir = wiki.page_title_and_dir(slug).last + dir.present? ? dir : '/' + end + # The processed/formatted content of this page. def formatted_content @attributes[:formatted_content] ||= if @page @@ -100,6 +106,11 @@ class WikiPage @attributes[:format] || :markdown end + # The full path for this page, including its filename and extension. + def full_path + "/#{directory}/#{page.filename}".gsub(/\/+/, '/') + end + # The commit message for this page version. def message version.try(:message) diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 1b6dceee241..25ae5c587ec 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -8,7 +8,7 @@ .nav-text %h2.wiki-page-title= @page.title.capitalize - + %span.wiki-page-full-path= "(#{@page.full_path})" %span.wiki-last-edit-by Last edited by %strong diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 595d4a621c1..c40a89b9dfb 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -224,6 +224,46 @@ describe WikiPage, models: true do end end + describe '#directory' do + context 'when the page is at the root directory' do + it 'returns /' do + create_page('file', 'content') + page = wiki.find_page('file') + + expect(page.directory).to eq('/') + end + end + + context 'when the page is inside an actual directory' do + it 'returns the full directory hierarchy' do + create_page('dir_1/dir_1_1/file', 'content') + page = wiki.find_page('dir_1/dir_1_1/file') + + expect(page.directory).to eq('dir_1/dir_1_1') + end + end + end + + describe '#full_path' do + context 'when the page is at the root directory' do + it 'returns /filename.fileextension' do + create_page('file', 'content') + page = wiki.find_page('file') + + expect(page.full_path).to eq('/file.md') + end + end + + context 'when the page is inside an actual directory' do + it 'returns /directory/filename.fileextension' do + create_page('dir/file', 'content') + page = wiki.find_page('dir/file') + + expect(page.full_path).to eq('/dir/file.md') + end + end + end + describe '#historical?' do before do create_page('Update', 'content') From 904aa039e5ccb4d9f653d254ea5818be130fb218 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 18 Dec 2016 21:27:30 -0200 Subject: [PATCH 008/313] Change WikiPage.group_by_directory to use WikiPage#directory --- app/models/wiki_page.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index e970cfbfff8..1dbb3407623 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -17,10 +17,8 @@ class WikiPage directories = { '/' => [] } pages.each do |page| - directory = page.wiki.page_title_and_dir(page.slug).last - directory = '/' if directory.blank? - directories[directory] ||= [] - directories[directory] << page + directories[page.directory] ||= [] + directories[page.directory] << page end directories From 5607bb8f0921cbfa4586bb7b92acb6666a65b4e2 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 18 Dec 2016 21:37:10 -0200 Subject: [PATCH 009/313] Change WikiPage#directory to always start a directory hierarchy with '/' --- app/models/wiki_page.rb | 4 ++-- spec/models/wiki_page_spec.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 1dbb3407623..a563b0b7a72 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -89,7 +89,7 @@ class WikiPage # The hierarchy of the directory this page is contained in. def directory dir = wiki.page_title_and_dir(slug).last - dir.present? ? dir : '/' + "/#{dir}" end # The processed/formatted content of this page. @@ -106,7 +106,7 @@ class WikiPage # The full path for this page, including its filename and extension. def full_path - "/#{directory}/#{page.filename}".gsub(/\/+/, '/') + "#{directory}/#{page.filename}".gsub(/\/+/, '/') end # The commit message for this page version. diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index c40a89b9dfb..91d5fccce60 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -27,7 +27,7 @@ describe WikiPage, models: true do page_2 = wiki.find_page('dir_1/page_2') page_3 = wiki.find_page('dir_1/dir_2/page_3') expected_grouped_pages = { - '/' => [page_1], 'dir_1' => [page_2], 'dir_1/dir_2' => [page_3] + '/' => [page_1], '/dir_1' => [page_2], '/dir_1/dir_2' => [page_3] } grouped_pages = WikiPage.group_by_directory(wiki.pages) @@ -239,7 +239,7 @@ describe WikiPage, models: true do create_page('dir_1/dir_1_1/file', 'content') page = wiki.find_page('dir_1/dir_1_1/file') - expect(page.directory).to eq('dir_1/dir_1_1') + expect(page.directory).to eq('/dir_1/dir_1_1') end end end From 7f914ec73f9bdb3d2d4e51d48906a36186f496e3 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 18 Dec 2016 22:30:07 -0200 Subject: [PATCH 010/313] Add tip about specifying the full path when creating new wiki pages --- app/assets/stylesheets/pages/wiki.scss | 8 ++++++++ app/views/projects/wikis/_new.html.haml | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index 7afadb7364d..6423c7d6302 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -1,3 +1,11 @@ +.new-wiki-page { + .new-wiki-page-slug-tip { + display: inline-block; + max-width: 100%; + margin-top: 5px; + } +} + .title .edit-wiki-header { width: 780px; margin-left: auto; diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index c74f53b4c39..f9f8fc63288 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -13,5 +13,9 @@ = label_tag :new_wiki_path do %span Page slug = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project), autofocus: true + %span.new-wiki-page-slug-tip + %i.fa.fa-lightbulb-o +  Tip: You can specify the full path for the new file. + We will automatically create any missing directories. .form-actions = button_tag 'Create Page', class: 'build-new-wiki btn btn-create' From f25344e36e9c1b0d0df2211b82b26c6515e96c31 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 19 Dec 2016 02:34:35 -0200 Subject: [PATCH 011/313] Change WikiPage.group_by_directory to order by directory and file alphabetical order --- app/models/wiki_page.rb | 29 ++++++++++++++++++++++++++++- spec/models/wiki_page_spec.rb | 30 ++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index a563b0b7a72..a84f84c67cd 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -12,10 +12,17 @@ class WikiPage ActiveModel::Name.new(self, nil, 'wiki') end + # Sorts and groups pages by directory. + # + # pages - an array of WikiPage objects. + # + # Returns a hash whose keys are directories and whose values are WikiPage + # arrays. See WikiPage.sort_by_directory for more info about the ordering. def self.group_by_directory(pages) return {} if pages.blank? - directories = { '/' => [] } + pages = sort_by_directory(pages) + directories = {} pages.each do |page| directories[page.directory] ||= [] directories[page.directory] << page @@ -199,6 +206,26 @@ class WikiPage private + # Sorts an array of pages by directory and file alphabetical order. + # Pages at the root directory will come first. The next pages will be + # sorted by their directories. Within directories, pages are sorted by + # filename alphabetical order. Pages are sorted in such a fashion that + # nested directories will always follow their parents (e.g. pages in + # dir_1/nested_dir_1 will follow pages inside dir_1). + # + # pages - an array of WikiPage objects. + # + # Returns a sorted array of WikiPage objects. + def self.sort_by_directory(pages) + pages.sort do |page, next_page| + if page.directory == next_page.directory + page.slug <=> next_page.slug + else + page.directory <=> next_page.directory + end + end + end + def set_attributes attributes[:slug] = @page.url_path attributes[:title] = @page.title diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 91d5fccce60..374849e1932 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -17,17 +17,22 @@ describe WikiPage, models: true do context 'when there are pages' do before do - create_page('page_1', 'content') + create_page('dir_1/dir_1_1/page_3', 'content') create_page('dir_1/page_2', 'content') - create_page('dir_1/dir_2/page_3', 'content') + create_page('dir_2/page_5', 'content') + create_page('dir_2/page_4', 'content') + create_page('page_1', 'content') end it 'returns a hash in which keys are directories and values are their pages' do page_1 = wiki.find_page('page_1') page_2 = wiki.find_page('dir_1/page_2') - page_3 = wiki.find_page('dir_1/dir_2/page_3') + page_3 = wiki.find_page('dir_1/dir_1_1/page_3') + page_4 = wiki.find_page('dir_2/page_4') + page_5 = wiki.find_page('dir_2/page_5') expected_grouped_pages = { - '/' => [page_1], '/dir_1' => [page_2], '/dir_1/dir_2' => [page_3] + '/' => [page_1], '/dir_1' => [page_2], '/dir_1/dir_1_1' => [page_3], + '/dir_2' => [page_4, page_5] } grouped_pages = WikiPage.group_by_directory(wiki.pages) @@ -39,6 +44,23 @@ describe WikiPage, models: true do expect(slugs).to match_array(expected_slugs) end end + + it 'returns a hash in which keys (directories) are sorted by alphabetical position' do + expected_ordered_directories = ['/', '/dir_1', '/dir_1/dir_1_1', '/dir_2'] + + grouped_pages = WikiPage.group_by_directory(wiki.pages) + + expect(grouped_pages.keys).to eq(expected_ordered_directories) + end + + it 'returns a hash in which values (pages) are sorted by alphabetical position' do + expected_ordered_page_slugs = ['dir_2/page_4', 'dir_2/page_5'] + + grouped_pages = WikiPage.group_by_directory(wiki.pages) + + dir_2_page_slugs = grouped_pages.fetch('/dir_2').map(&:slug) + expect(dir_2_page_slugs).to eq(expected_ordered_page_slugs) + end end end From e66fa4105b4ae275dc76a6594346367bd32b5ce9 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 19 Dec 2016 03:13:26 -0200 Subject: [PATCH 012/313] Improve style of wiki page lists --- app/assets/stylesheets/pages/wiki.scss | 16 ++++++++++++++++ app/views/projects/wikis/pages.html.haml | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index 6423c7d6302..819e4c3e3d8 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -130,6 +130,10 @@ margin: 5px 0 10px; } + ul.wiki-pages ul { + padding-left: 15px; + } + .wiki-sidebar-header { padding: 0 $gl-padding $gl-padding; @@ -138,3 +142,15 @@ } } } + +ul.wiki-pages-list.content-list { + & ul { + list-style: none; + margin-left: 0; + padding-left: 15px; + } + + & ul li { + padding: 5px 0; + } +} diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 2813b3a1c81..28dd81e5c3f 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -13,7 +13,7 @@ = icon('cloud-download') Clone repository - %ul.content-list + %ul.wiki-pages-list.content-list - @wiki_directories.each do |wiki_directory, wiki_pages| - if wiki_directory == '/' = render 'wiki_pages', wiki_pages: wiki_pages From 50e3e796ea5ca12addbfb438feae606ca7067a22 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Tue, 20 Dec 2016 12:15:56 -0200 Subject: [PATCH 013/313] Fix scss style violation --- app/assets/stylesheets/pages/wiki.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index 819e4c3e3d8..1a22cd7d33f 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -22,7 +22,8 @@ font-size: 22px; } - .wiki-last-edit-by, .wiki-page-full-path { + .wiki-page-full-path, + .wiki-last-edit-by { display: block; color: $gl-gray-light; From 645aaf6e3d18007b56e5bbb33c6fda1526bdc716 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 25 Dec 2016 22:13:20 -0200 Subject: [PATCH 014/313] Use the icon helper at wikis/_new.html.haml --- app/views/projects/wikis/_new.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index f9f8fc63288..d91a7096701 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -14,8 +14,8 @@ %span Page slug = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project), autofocus: true %span.new-wiki-page-slug-tip - %i.fa.fa-lightbulb-o -  Tip: You can specify the full path for the new file. + =icon('lightbulb-o') + Tip: You can specify the full path for the new file. We will automatically create any missing directories. .form-actions = button_tag 'Create Page', class: 'build-new-wiki btn btn-create' From 77fe503a1fd01eaa8b790d1aacc0cdab159f015e Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 25 Dec 2016 22:50:36 -0200 Subject: [PATCH 015/313] Remove WikiPage.sort_by_directory --- app/models/wiki_page.rb | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index a84f84c67cd..efb6ff9bf2b 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -17,10 +17,10 @@ class WikiPage # pages - an array of WikiPage objects. # # Returns a hash whose keys are directories and whose values are WikiPage - # arrays. See WikiPage.sort_by_directory for more info about the ordering. + # arrays. def self.group_by_directory(pages) return {} if pages.blank? - pages = sort_by_directory(pages) + pages = pages.sort_by { |page| [page.directory, page.slug] } directories = {} pages.each do |page| @@ -206,26 +206,6 @@ class WikiPage private - # Sorts an array of pages by directory and file alphabetical order. - # Pages at the root directory will come first. The next pages will be - # sorted by their directories. Within directories, pages are sorted by - # filename alphabetical order. Pages are sorted in such a fashion that - # nested directories will always follow their parents (e.g. pages in - # dir_1/nested_dir_1 will follow pages inside dir_1). - # - # pages - an array of WikiPage objects. - # - # Returns a sorted array of WikiPage objects. - def self.sort_by_directory(pages) - pages.sort do |page, next_page| - if page.directory == next_page.directory - page.slug <=> next_page.slug - else - page.directory <=> next_page.directory - end - end - end - def set_attributes attributes[:slug] = @page.url_path attributes[:title] = @page.title From 8d8c5d9f61491c63e89d73a3f77244d3cd6406da Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sun, 25 Dec 2016 23:05:04 -0200 Subject: [PATCH 016/313] Simplify WikiPage.group_by_directory by using Enumerable#group_by --- app/models/wiki_page.rb | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index efb6ff9bf2b..0e905cb9a00 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -20,15 +20,8 @@ class WikiPage # arrays. def self.group_by_directory(pages) return {} if pages.blank? - pages = pages.sort_by { |page| [page.directory, page.slug] } - - directories = {} - pages.each do |page| - directories[page.directory] ||= [] - directories[page.directory] << page - end - - directories + pages.sort_by { |page| [page.directory, page.slug] }. + group_by { |page| page.directory } end def to_key From b361a67fb019e5c7f5361bbd3c43545da3ab0288 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 26 Dec 2016 13:07:40 -0200 Subject: [PATCH 017/313] Add model WikiDirectory --- app/models/wiki_directory.rb | 13 +++++++++ spec/factories/wiki_directories.rb | 6 ++++ spec/models/wiki_directory_spec.rb | 45 ++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 app/models/wiki_directory.rb create mode 100644 spec/factories/wiki_directories.rb create mode 100644 spec/models/wiki_directory_spec.rb diff --git a/app/models/wiki_directory.rb b/app/models/wiki_directory.rb new file mode 100644 index 00000000000..c126a4d0421 --- /dev/null +++ b/app/models/wiki_directory.rb @@ -0,0 +1,13 @@ +class WikiDirectory + include ActiveModel::Validations + + attr_accessor :slug, :pages, :directories + + validates :slug, presence: true + + def initialize(slug, pages = [], directories = []) + @slug = slug + @pages = pages + @directories = directories + end +end diff --git a/spec/factories/wiki_directories.rb b/spec/factories/wiki_directories.rb new file mode 100644 index 00000000000..3f3c864ac2b --- /dev/null +++ b/spec/factories/wiki_directories.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do + factory :wiki_directory do + slug '/path_up_to/dir' + initialize_with { new(slug) } + end +end diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb new file mode 100644 index 00000000000..8362a285c54 --- /dev/null +++ b/spec/models/wiki_directory_spec.rb @@ -0,0 +1,45 @@ +require 'spec_helper' + +RSpec.describe WikiDirectory, models: true do + describe 'validations' do + subject { build(:wiki_directory) } + + it { is_expected.to validate_presence_of(:slug) } + end + + describe '#initialize' do + context 'when there are pages and directories' do + let(:pages) { [build(:wiki_page)] } + let(:other_directories) { [build(:wiki_directory)] } + let(:directory) { WikiDirectory.new('/path_up_to/dir', pages, other_directories) } + + it 'sets the slug attribute' do + expect(directory.slug).to eq('/path_up_to/dir') + end + + it 'sets the pages attribute' do + expect(directory.pages).to eq(pages) + end + + it 'sets the directories attribute' do + expect(directory.directories).to eq(other_directories) + end + end + + context 'when there are no pages or directories' do + let(:directory) { WikiDirectory.new('/path_up_to/dir') } + + it 'sets the slug attribute' do + expect(directory.slug).to eq('/path_up_to/dir') + end + + it 'sets the pages attribute to an empty array' do + expect(directory.pages).to eq([]) + end + + it 'sets the directories attribute to an empty array' do + expect(directory.directories).to eq([]) + end + end + end +end From c8a1e9682656b6b3ec714e38459e089df2ee106c Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 26 Dec 2016 20:12:15 -0200 Subject: [PATCH 018/313] Change WikiPage.group_by_directory to use WikiDirectory --- app/models/wiki_page.rb | 18 +++++++-- spec/models/wiki_page_spec.rb | 72 ++++++++++++++++++++--------------- 2 files changed, 56 insertions(+), 34 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 0e905cb9a00..63e5aa0e519 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -16,12 +16,22 @@ class WikiPage # # pages - an array of WikiPage objects. # - # Returns a hash whose keys are directories and whose values are WikiPage - # arrays. + # Returns an array of WikiPage and WikiDirectory objects. The entries are + # sorted by alphabetical order (directories and pages inside each directory). + # Pages at the root level come before everything. def self.group_by_directory(pages) - return {} if pages.blank? + return [] if pages.blank? + pages.sort_by { |page| [page.directory, page.slug] }. - group_by { |page| page.directory } + group_by { |page| page.directory }. + map do |dir, pages| + if dir == '/' + pages + else + WikiDirectory.new(dir, pages) + end + end. + flatten end def to_key diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 374849e1932..9eb94cb028d 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -9,9 +9,9 @@ describe WikiPage, models: true do describe '.group_by_directory' do context 'when there are no pages' do - it 'returns an empty hash' do - expect(WikiPage.group_by_directory(nil)).to eq({}) - expect(WikiPage.group_by_directory([])).to eq({}) + it 'returns an empty array' do + expect(WikiPage.group_by_directory(nil)).to eq([]) + expect(WikiPage.group_by_directory([])).to eq([]) end end @@ -23,43 +23,47 @@ describe WikiPage, models: true do create_page('dir_2/page_4', 'content') create_page('page_1', 'content') end + let(:page_1) { wiki.find_page('page_1') } + let(:dir_1) do + WikiDirectory.new('dir_1', [wiki.find_page('dir_1/page_2')]) + end + let(:dir_1_1) do + WikiDirectory.new('dir_1/dir_1_1', [wiki.find_page('dir_1/dir_1_1/page_3')]) + end + let(:dir_2) do + pages = [wiki.find_page('dir_2/page_5'), + wiki.find_page('dir_2/page_4')] + WikiDirectory.new('dir_2', pages) + end - it 'returns a hash in which keys are directories and values are their pages' do - page_1 = wiki.find_page('page_1') - page_2 = wiki.find_page('dir_1/page_2') - page_3 = wiki.find_page('dir_1/dir_1_1/page_3') - page_4 = wiki.find_page('dir_2/page_4') - page_5 = wiki.find_page('dir_2/page_5') - expected_grouped_pages = { - '/' => [page_1], '/dir_1' => [page_2], '/dir_1/dir_1_1' => [page_3], - '/dir_2' => [page_4, page_5] - } + it 'returns an array with pages and directories' do + expected_grouped_entries = [page_1, dir_1, dir_1_1, dir_2] - grouped_pages = WikiPage.group_by_directory(wiki.pages) + grouped_entries = WikiPage.group_by_directory(wiki.pages) - grouped_pages.each do |dir, pages| - expected_slugs = expected_grouped_pages.fetch(dir).map(&:slug) - slugs = pages.map(&:slug) + grouped_entries.each_with_index do |page_or_dir, i| + expected_page_or_dir = expected_grouped_entries[i] + expected_slugs = get_slugs(expected_page_or_dir) + slugs = get_slugs(page_or_dir) expect(slugs).to match_array(expected_slugs) end end - it 'returns a hash in which keys (directories) are sorted by alphabetical position' do - expected_ordered_directories = ['/', '/dir_1', '/dir_1/dir_1_1', '/dir_2'] + it 'returns an array sorted by alphabetical position' do + # Directories and pages within directories are sorted alphabetically. + # Pages at root come before everything. + expected_order = ['page_1', 'dir_1/page_2', 'dir_1/dir_1_1/page_3', + 'dir_2/page_4', 'dir_2/page_5'] - grouped_pages = WikiPage.group_by_directory(wiki.pages) + grouped_entries = WikiPage.group_by_directory(wiki.pages) - expect(grouped_pages.keys).to eq(expected_ordered_directories) - end - - it 'returns a hash in which values (pages) are sorted by alphabetical position' do - expected_ordered_page_slugs = ['dir_2/page_4', 'dir_2/page_5'] - - grouped_pages = WikiPage.group_by_directory(wiki.pages) - - dir_2_page_slugs = grouped_pages.fetch('/dir_2').map(&:slug) - expect(dir_2_page_slugs).to eq(expected_ordered_page_slugs) + actual_order = + grouped_entries.map do |page_or_dir| + get_slugs(page_or_dir) + end. + flatten + expect(actual_order).to eq(expected_order) end end end @@ -336,4 +340,12 @@ describe WikiPage, models: true do page = wiki.wiki.paged(title) wiki.wiki.delete_page(page, commit_details) end + + def get_slugs(page_or_dir) + if page_or_dir.is_a? WikiPage + [page_or_dir.slug] + else + page_or_dir.pages.present? ? page_or_dir.pages.map(&:slug) : [] + end + end end From 84735186a8ae73a722715f286653ccd71e7e48e8 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 26 Dec 2016 23:51:34 -0200 Subject: [PATCH 019/313] Add WikiPage#to_partial_path --- app/models/wiki_page.rb | 6 ++++++ spec/models/wiki_page_spec.rb | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 63e5aa0e519..96d03d510ff 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -207,6 +207,12 @@ class WikiPage end end + # Relative path to the partial to be used when rendering collections + # of this object. + def to_partial_path + 'projects/wikis/wiki_page' + end + private def set_attributes diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 9eb94cb028d..11efd0415d9 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -322,6 +322,14 @@ describe WikiPage, models: true do end end + describe '#to_partial_path' do + it 'returns the relative path to the partial to be used' do + page = build(:wiki_page) + + expect(page.to_partial_path).to eq('projects/wikis/wiki_page') + end + end + private def remove_temp_repo(path) From 7bd68ae0799a982a4113de3480bef0d51ecb2f1c Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 26 Dec 2016 23:52:26 -0200 Subject: [PATCH 020/313] Add WikiDirectory#to_partial_path --- app/models/wiki_directory.rb | 6 ++++++ spec/models/wiki_directory_spec.rb | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/app/models/wiki_directory.rb b/app/models/wiki_directory.rb index c126a4d0421..561e5a497bc 100644 --- a/app/models/wiki_directory.rb +++ b/app/models/wiki_directory.rb @@ -10,4 +10,10 @@ class WikiDirectory @pages = pages @directories = directories end + + # Relative path to the partial to be used when rendering collections + # of this object. + def to_partial_path + 'projects/wikis/wiki_directory' + end end diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb index 8362a285c54..fac70f8d3c7 100644 --- a/spec/models/wiki_directory_spec.rb +++ b/spec/models/wiki_directory_spec.rb @@ -42,4 +42,12 @@ RSpec.describe WikiDirectory, models: true do end end end + + describe '#to_partial_path' do + it 'returns the relative path to the partial to be used' do + directory = build(:wiki_directory) + + expect(directory.to_partial_path).to eq('projects/wikis/wiki_directory') + end + end end From a5625c749b31760daf104241475a9b3527eb223c Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 26 Dec 2016 23:54:36 -0200 Subject: [PATCH 021/313] Render wiki entries using a collection of WikiPage and WikiDirectory objects --- app/controllers/projects/wikis_controller.rb | 4 ++-- app/views/projects/wikis/_sidebar.html.haml | 10 +--------- app/views/projects/wikis/_sidebar_wiki_pages.html.haml | 4 ---- app/views/projects/wikis/_wiki_directory.html.haml | 4 ++++ .../{_wiki_pages.html.haml => _wiki_page.html.haml} | 6 +++++- app/views/projects/wikis/pages.html.haml | 9 +-------- 6 files changed, 13 insertions(+), 24 deletions(-) delete mode 100644 app/views/projects/wikis/_sidebar_wiki_pages.html.haml create mode 100644 app/views/projects/wikis/_wiki_directory.html.haml rename app/views/projects/wikis/{_wiki_pages.html.haml => _wiki_page.html.haml} (52%) diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 45a42400b2a..116c854b1ae 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -8,7 +8,7 @@ class Projects::WikisController < Projects::ApplicationController def pages @wiki_pages = Kaminari.paginate_array(@project_wiki.pages).page(params[:page]) - @wiki_directories = WikiPage.group_by_directory(@wiki_pages) + @wiki_entries = WikiPage.group_by_directory(@wiki_pages) end def show @@ -117,7 +117,7 @@ class Projects::WikisController < Projects::ApplicationController # Call #wiki to make sure the Wiki Repo is initialized @project_wiki.wiki - @sidebar_wiki_directories = WikiPage.group_by_directory(@project_wiki.pages.first(15)) + @sidebar_wiki_entries = WikiPage.group_by_directory(@project_wiki.pages.first(15)) rescue ProjectWiki::CouldNotCreateWikiError flash[:notice] = "Could not create Wiki Repository at this time. Please try again later." redirect_to project_path(@project) diff --git a/app/views/projects/wikis/_sidebar.html.haml b/app/views/projects/wikis/_sidebar.html.haml index b7464180a0c..e3fddfba689 100644 --- a/app/views/projects/wikis/_sidebar.html.haml +++ b/app/views/projects/wikis/_sidebar.html.haml @@ -12,15 +12,7 @@ .blocks-container .block.block-first %ul.wiki-pages - - @sidebar_wiki_directories.each do |wiki_directory, wiki_pages| - - if wiki_directory == '/' - = render 'sidebar_wiki_pages', wiki_pages: wiki_pages - - else - %li - = wiki_directory - %ul - = render 'sidebar_wiki_pages', wiki_pages: wiki_pages - + = render @sidebar_wiki_entries, context: 'sidebar' .block = link_to namespace_project_wikis_pages_path(@project.namespace, @project), class: 'btn btn-block' do diff --git a/app/views/projects/wikis/_sidebar_wiki_pages.html.haml b/app/views/projects/wikis/_sidebar_wiki_pages.html.haml deleted file mode 100644 index 65453a384d2..00000000000 --- a/app/views/projects/wikis/_sidebar_wiki_pages.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -- wiki_pages.each do |wiki_page| - %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } - = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do - = wiki_page.title.capitalize diff --git a/app/views/projects/wikis/_wiki_directory.html.haml b/app/views/projects/wikis/_wiki_directory.html.haml new file mode 100644 index 00000000000..0e5f32ed859 --- /dev/null +++ b/app/views/projects/wikis/_wiki_directory.html.haml @@ -0,0 +1,4 @@ +%li + = wiki_directory.slug + %ul + = render wiki_directory.pages, context: context diff --git a/app/views/projects/wikis/_wiki_pages.html.haml b/app/views/projects/wikis/_wiki_page.html.haml similarity index 52% rename from app/views/projects/wikis/_wiki_pages.html.haml rename to app/views/projects/wikis/_wiki_page.html.haml index ac98599d96b..cea27388a0d 100644 --- a/app/views/projects/wikis/_wiki_pages.html.haml +++ b/app/views/projects/wikis/_wiki_page.html.haml @@ -1,4 +1,8 @@ -- wiki_pages.each do |wiki_page| +- if context == 'sidebar' + %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } + = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do + = wiki_page.title.capitalize +- else %li = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) %small (#{wiki_page.format}) diff --git a/app/views/projects/wikis/pages.html.haml b/app/views/projects/wikis/pages.html.haml index 28dd81e5c3f..5fba2b1a5ae 100644 --- a/app/views/projects/wikis/pages.html.haml +++ b/app/views/projects/wikis/pages.html.haml @@ -14,13 +14,6 @@ Clone repository %ul.wiki-pages-list.content-list - - @wiki_directories.each do |wiki_directory, wiki_pages| - - if wiki_directory == '/' - = render 'wiki_pages', wiki_pages: wiki_pages - - else - %li - = wiki_directory - %ul - = render 'wiki_pages', wiki_pages: wiki_pages + = render @wiki_entries, context: 'pages' = paginate @wiki_pages, theme: 'gitlab' From 84cc7c3704cc0cc22a325572f35cd21d0e2a6cc7 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Tue, 27 Dec 2016 00:14:30 -0200 Subject: [PATCH 022/313] Stop rendering page full path at projects/wikis/show.html.haml --- app/assets/stylesheets/pages/wiki.scss | 1 - app/views/projects/wikis/show.html.haml | 1 - 2 files changed, 2 deletions(-) diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index 1a22cd7d33f..369fb44d818 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -22,7 +22,6 @@ font-size: 22px; } - .wiki-page-full-path, .wiki-last-edit-by { display: block; color: $gl-gray-light; diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 25ae5c587ec..87b9ff6e415 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -8,7 +8,6 @@ .nav-text %h2.wiki-page-title= @page.title.capitalize - %span.wiki-page-full-path= "(#{@page.full_path})" %span.wiki-last-edit-by Last edited by %strong From 94dcadd62ac66cc5c52579ae9c288314bbca0c20 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Tue, 27 Dec 2016 01:44:03 -0200 Subject: [PATCH 023/313] Add a breadcrumb at projects/wikis/show.html.haml --- app/assets/stylesheets/pages/wiki.scss | 5 +++++ app/helpers/wiki_helper.rb | 13 +++++++++++++ app/views/projects/wikis/show.html.haml | 3 +++ spec/helpers/wiki_helper_spec.rb | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 app/helpers/wiki_helper.rb create mode 100644 spec/helpers/wiki_helper_spec.rb diff --git a/app/assets/stylesheets/pages/wiki.scss b/app/assets/stylesheets/pages/wiki.scss index 369fb44d818..480cb2b9f0d 100644 --- a/app/assets/stylesheets/pages/wiki.scss +++ b/app/assets/stylesheets/pages/wiki.scss @@ -17,6 +17,11 @@ @extend .top-area; position: relative; + .wiki-breadcrumb { + border-bottom: 1px solid $white-normal; + padding: 11px 0; + } + .wiki-page-title { margin: 0; font-size: 22px; diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb new file mode 100644 index 00000000000..76ee632ab6d --- /dev/null +++ b/app/helpers/wiki_helper.rb @@ -0,0 +1,13 @@ +module WikiHelper + # Produces a pure text breadcrumb for a given page. + # + # page_slug - The slug of a WikiPage object. + # + # Returns a String composed of the capitalized name of each directory and the + # capitalized name of the page itself. + def breadcrumb(page_slug) + page_slug.split('/'). + map { |dir_or_page| dir_or_page.gsub(/-+/, ' ').capitalize }. + join(' / ') + end +end diff --git a/app/views/projects/wikis/show.html.haml b/app/views/projects/wikis/show.html.haml index 87b9ff6e415..3609461b721 100644 --- a/app/views/projects/wikis/show.html.haml +++ b/app/views/projects/wikis/show.html.haml @@ -6,6 +6,9 @@ %button.btn.btn-default.sidebar-toggle.js-sidebar-wiki-toggle{ role: "button", type: "button" } = icon('angle-double-left') + .wiki-breadcrumb + %span= breadcrumb(@page.slug) + .nav-text %h2.wiki-page-title= @page.title.capitalize %span.wiki-last-edit-by diff --git a/spec/helpers/wiki_helper_spec.rb b/spec/helpers/wiki_helper_spec.rb new file mode 100644 index 00000000000..92c6f27a867 --- /dev/null +++ b/spec/helpers/wiki_helper_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe WikiHelper do + describe '#breadcrumb' do + context 'when the page is at the root level' do + it 'returns the capitalized page name' do + slug = 'page-name' + + expect(helper.breadcrumb(slug)).to eq('Page name') + end + end + + context 'when the page is inside a directory' do + it 'returns the capitalized name of each directory and of the page itself' do + slug = 'dir_1/page-name' + + expect(helper.breadcrumb(slug)).to eq('Dir_1 / Page name') + end + end + end +end From 104bfa2a3187aefebd4a53be1ad14600dc7781e9 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Tue, 27 Dec 2016 01:52:50 -0200 Subject: [PATCH 024/313] Remove WikiPage#full_path --- app/models/wiki_page.rb | 5 ----- spec/models/wiki_page_spec.rb | 20 -------------------- 2 files changed, 25 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 96d03d510ff..dec58681198 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -114,11 +114,6 @@ class WikiPage @attributes[:format] || :markdown end - # The full path for this page, including its filename and extension. - def full_path - "#{directory}/#{page.filename}".gsub(/\/+/, '/') - end - # The commit message for this page version. def message version.try(:message) diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 11efd0415d9..482f98e22f1 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -270,26 +270,6 @@ describe WikiPage, models: true do end end - describe '#full_path' do - context 'when the page is at the root directory' do - it 'returns /filename.fileextension' do - create_page('file', 'content') - page = wiki.find_page('file') - - expect(page.full_path).to eq('/file.md') - end - end - - context 'when the page is inside an actual directory' do - it 'returns /directory/filename.fileextension' do - create_page('dir/file', 'content') - page = wiki.find_page('dir/file') - - expect(page.full_path).to eq('/dir/file.md') - end - end - end - describe '#historical?' do before do create_page('Update', 'content') From d2b3fe45af8d458b935b3bbfc1558e21c1476d0a Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Tue, 27 Dec 2016 02:05:53 -0200 Subject: [PATCH 025/313] Change WikiPage#directory --- app/models/wiki_page.rb | 9 ++++----- spec/models/wiki_page_spec.rb | 6 +++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index dec58681198..6c237306eff 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -25,10 +25,10 @@ class WikiPage pages.sort_by { |page| [page.directory, page.slug] }. group_by { |page| page.directory }. map do |dir, pages| - if dir == '/' - pages - else + if dir.present? WikiDirectory.new(dir, pages) + else + pages end end. flatten @@ -98,8 +98,7 @@ class WikiPage # The hierarchy of the directory this page is contained in. def directory - dir = wiki.page_title_and_dir(slug).last - "/#{dir}" + wiki.page_title_and_dir(slug).last end # The processed/formatted content of this page. diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 482f98e22f1..109a0499090 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -252,11 +252,11 @@ describe WikiPage, models: true do describe '#directory' do context 'when the page is at the root directory' do - it 'returns /' do + it 'returns an empty string' do create_page('file', 'content') page = wiki.find_page('file') - expect(page.directory).to eq('/') + expect(page.directory).to eq('') end end @@ -265,7 +265,7 @@ describe WikiPage, models: true do create_page('dir_1/dir_1_1/file', 'content') page = wiki.find_page('dir_1/dir_1_1/file') - expect(page.directory).to eq('/dir_1/dir_1_1') + expect(page.directory).to eq('dir_1/dir_1_1') end end end From 389bd6b7356e78668831e4628f9ca8dadb01fcf2 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 31 Dec 2016 17:03:20 -0200 Subject: [PATCH 026/313] Improve WikiPage.group_by_directory --- app/models/wiki_page.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 6c237306eff..20bd9719b2f 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -23,7 +23,7 @@ class WikiPage return [] if pages.blank? pages.sort_by { |page| [page.directory, page.slug] }. - group_by { |page| page.directory }. + group_by(&:directory). map do |dir, pages| if dir.present? WikiDirectory.new(dir, pages) From b0ad4e0e87c642efefa840eeeea5824191e81405 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 31 Dec 2016 17:14:45 -0200 Subject: [PATCH 027/313] Add new wiki related partials --- app/views/projects/wikis/_pages_wiki_page.html.haml | 5 +++++ app/views/projects/wikis/_sidebar_wiki_page.html.haml | 3 +++ app/views/projects/wikis/_wiki_page.html.haml | 11 +---------- 3 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 app/views/projects/wikis/_pages_wiki_page.html.haml create mode 100644 app/views/projects/wikis/_sidebar_wiki_page.html.haml diff --git a/app/views/projects/wikis/_pages_wiki_page.html.haml b/app/views/projects/wikis/_pages_wiki_page.html.haml new file mode 100644 index 00000000000..6298cf6c8da --- /dev/null +++ b/app/views/projects/wikis/_pages_wiki_page.html.haml @@ -0,0 +1,5 @@ +%li + = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) + %small (#{wiki_page.format}) + .pull-right + %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} diff --git a/app/views/projects/wikis/_sidebar_wiki_page.html.haml b/app/views/projects/wikis/_sidebar_wiki_page.html.haml new file mode 100644 index 00000000000..eb9bd14920d --- /dev/null +++ b/app/views/projects/wikis/_sidebar_wiki_page.html.haml @@ -0,0 +1,3 @@ +%li{ class: params[:id] == wiki_page.slug ? 'active' : '' } + = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do + = wiki_page.title.capitalize diff --git a/app/views/projects/wikis/_wiki_page.html.haml b/app/views/projects/wikis/_wiki_page.html.haml index cea27388a0d..c84d06dad02 100644 --- a/app/views/projects/wikis/_wiki_page.html.haml +++ b/app/views/projects/wikis/_wiki_page.html.haml @@ -1,10 +1 @@ -- if context == 'sidebar' - %li{ class: params[:id] == wiki_page.slug ? 'active' : '' } - = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do - = wiki_page.title.capitalize -- else - %li - = link_to wiki_page.title, namespace_project_wiki_path(@project.namespace, @project, wiki_page) - %small (#{wiki_page.format}) - .pull-right - %small Last edited #{time_ago_with_tooltip(wiki_page.commit.authored_date)} += render "#{context}_wiki_page", wiki_page: wiki_page From 48417893d7456dc0d46b0a514a2326cc8ce6076f Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Sat, 31 Dec 2016 17:27:03 -0200 Subject: [PATCH 028/313] Remove directories as one of the attributes of WikiDirectory --- app/models/wiki_directory.rb | 5 ++--- spec/models/wiki_directory_spec.rb | 15 +++------------ 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/app/models/wiki_directory.rb b/app/models/wiki_directory.rb index 561e5a497bc..9340fc2dbbe 100644 --- a/app/models/wiki_directory.rb +++ b/app/models/wiki_directory.rb @@ -1,14 +1,13 @@ class WikiDirectory include ActiveModel::Validations - attr_accessor :slug, :pages, :directories + attr_accessor :slug, :pages validates :slug, presence: true - def initialize(slug, pages = [], directories = []) + def initialize(slug, pages = []) @slug = slug @pages = pages - @directories = directories end # Relative path to the partial to be used when rendering collections diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb index fac70f8d3c7..1caaa557085 100644 --- a/spec/models/wiki_directory_spec.rb +++ b/spec/models/wiki_directory_spec.rb @@ -8,10 +8,9 @@ RSpec.describe WikiDirectory, models: true do end describe '#initialize' do - context 'when there are pages and directories' do + context 'when there are pages' do let(:pages) { [build(:wiki_page)] } - let(:other_directories) { [build(:wiki_directory)] } - let(:directory) { WikiDirectory.new('/path_up_to/dir', pages, other_directories) } + let(:directory) { WikiDirectory.new('/path_up_to/dir', pages) } it 'sets the slug attribute' do expect(directory.slug).to eq('/path_up_to/dir') @@ -20,13 +19,9 @@ RSpec.describe WikiDirectory, models: true do it 'sets the pages attribute' do expect(directory.pages).to eq(pages) end - - it 'sets the directories attribute' do - expect(directory.directories).to eq(other_directories) - end end - context 'when there are no pages or directories' do + context 'when there are no pages' do let(:directory) { WikiDirectory.new('/path_up_to/dir') } it 'sets the slug attribute' do @@ -36,10 +31,6 @@ RSpec.describe WikiDirectory, models: true do it 'sets the pages attribute to an empty array' do expect(directory.pages).to eq([]) end - - it 'sets the directories attribute to an empty array' do - expect(directory.directories).to eq([]) - end end end From 7a109402a866db1c84ef9af1c14e148ec944aa22 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 20 Jan 2017 21:57:01 +0800 Subject: [PATCH 029/313] Prefer service object over after_save hook Closes #26921 --- app/controllers/admin/runners_controller.rb | 6 +++--- .../projects/runners_controller.rb | 6 +++--- app/models/ci/runner.rb | 8 -------- app/services/ci/update_runner_service.rb | 15 ++++++++++++++ lib/ci/api/runners.rb | 20 +++++++++++-------- spec/models/ci/runner_spec.rb | 2 +- .../services/ci/update_runner_service_spec.rb | 18 +++++++++++++++++ 7 files changed, 52 insertions(+), 23 deletions(-) create mode 100644 app/services/ci/update_runner_service.rb create mode 100644 spec/services/ci/update_runner_service_spec.rb diff --git a/app/controllers/admin/runners_controller.rb b/app/controllers/admin/runners_controller.rb index 7345c91f67d..348641e5ecb 100644 --- a/app/controllers/admin/runners_controller.rb +++ b/app/controllers/admin/runners_controller.rb @@ -13,7 +13,7 @@ class Admin::RunnersController < Admin::ApplicationController end def update - if @runner.update_attributes(runner_params) + if Ci::UpdateRunnerService.new(@runner).update(runner_params) respond_to do |format| format.js format.html { redirect_to admin_runner_path(@runner) } @@ -31,7 +31,7 @@ class Admin::RunnersController < Admin::ApplicationController end def resume - if @runner.update_attributes(active: true) + if Ci::UpdateRunnerService.new(@runner).update(active: true) redirect_to admin_runners_path, notice: 'Runner was successfully updated.' else redirect_to admin_runners_path, alert: 'Runner was not updated.' @@ -39,7 +39,7 @@ class Admin::RunnersController < Admin::ApplicationController end def pause - if @runner.update_attributes(active: false) + if Ci::UpdateRunnerService.new(@runner).update(active: false) redirect_to admin_runners_path, notice: 'Runner was successfully updated.' else redirect_to admin_runners_path, alert: 'Runner was not updated.' diff --git a/app/controllers/projects/runners_controller.rb b/app/controllers/projects/runners_controller.rb index 53c36635efe..ff75c408beb 100644 --- a/app/controllers/projects/runners_controller.rb +++ b/app/controllers/projects/runners_controller.rb @@ -16,7 +16,7 @@ class Projects::RunnersController < Projects::ApplicationController end def update - if @runner.update_attributes(runner_params) + if Ci::UpdateRunnerService.new(@runner).update(runner_params) redirect_to runner_path(@runner), notice: 'Runner was successfully updated.' else render 'edit' @@ -32,7 +32,7 @@ class Projects::RunnersController < Projects::ApplicationController end def resume - if @runner.update_attributes(active: true) + if Ci::UpdateRunnerService.new(@runner).update(active: true) redirect_to runner_path(@runner), notice: 'Runner was successfully updated.' else redirect_to runner_path(@runner), alert: 'Runner was not updated.' @@ -40,7 +40,7 @@ class Projects::RunnersController < Projects::ApplicationController end def pause - if @runner.update_attributes(active: false) + if Ci::UpdateRunnerService.new(@runner).update(active: false) redirect_to runner_path(@runner), notice: 'Runner was successfully updated.' else redirect_to runner_path(@runner), alert: 'Runner was not updated.' diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb index 6e58a1878c8..b4760b5baaa 100644 --- a/app/models/ci/runner.rb +++ b/app/models/ci/runner.rb @@ -22,8 +22,6 @@ module Ci scope :online, ->() { where('contacted_at > ?', LAST_CONTACT_TIME) } scope :ordered, ->() { order(id: :desc) } - after_save :tick_runner_queue, if: :form_editable_changed? - scope :owned_or_shared, ->(project_id) do joins('LEFT JOIN ci_runner_projects ON ci_runner_projects.runner_id = ci_runners.id') .where("ci_runner_projects.gl_project_id = :project_id OR ci_runners.is_shared = true", project_id: project_id) @@ -149,12 +147,6 @@ module Ci "runner:build_queue:#{self.token}" end - def form_editable_changed? - FORM_EDITABLE.any? do |editable| - public_send("#{editable}_changed?") - end - end - def tag_constraints unless has_tags? || run_untagged? errors.add(:tags_list, diff --git a/app/services/ci/update_runner_service.rb b/app/services/ci/update_runner_service.rb new file mode 100644 index 00000000000..198b29b3a9d --- /dev/null +++ b/app/services/ci/update_runner_service.rb @@ -0,0 +1,15 @@ +module Ci + class UpdateRunnerService + attr_reader :runner + + def initialize(runner) + @runner = runner + end + + def update(params) + runner.update(params).tap do + runner.tick_runner_queue + end + end + end +end diff --git a/lib/ci/api/runners.rb b/lib/ci/api/runners.rb index bcc82969eb3..c10858f4c5e 100644 --- a/lib/ci/api/runners.rb +++ b/lib/ci/api/runners.rb @@ -28,23 +28,27 @@ module Ci post "register" do required_attributes! [:token] - attributes = attributes_for_keys( - [:description, :tag_list, :run_untagged, :locked] - ) - + project = nil runner = if runner_registration_token_valid? # Create shared runner. Requires admin access - Ci::Runner.create(attributes.merge(is_shared: true)) + Ci::Runner.new(is_shared: true) elsif project = Project.find_by(runners_token: params[:token]) - # Create a specific runner for project. - project.runners.create(attributes) + Ci::Runner.new end return forbidden! unless runner + attributes = attributes_for_keys( + [:description, :tag_list, :run_untagged, :locked] + ).merge(get_runner_version_from_params || {}) + + Ci::UpdateRunnerService.new(runner).update(attributes) + + # Assign the specific runner for the project + project.runners << runner if project + if runner.id - runner.update(get_runner_version_from_params) present runner, with: Entities::Runner else not_found! diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 2b856ca7af7..7b993a454b7 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -291,7 +291,7 @@ describe Ci::Runner, models: true do let!(:last_update) { runner.ensure_runner_queue_value } before do - runner.update(description: 'new runner') + Ci::UpdateRunnerService.new(runner).update(description: 'new runner') end it 'sets a new last_update value' do diff --git a/spec/services/ci/update_runner_service_spec.rb b/spec/services/ci/update_runner_service_spec.rb new file mode 100644 index 00000000000..8429881dd15 --- /dev/null +++ b/spec/services/ci/update_runner_service_spec.rb @@ -0,0 +1,18 @@ +require 'spec_helper' + +describe Ci::UpdateRunnerService, services: true do + let(:runner) { create(:ci_runner) } + + describe '#update' do + before do + allow(runner).to receive(:tick_runner_queue) + + described_class.new(runner).update(description: 'new runner') + end + + it 'updates the runner and ticking the queue' do + expect(runner.description).to eq('new runner') + expect(runner).to have_received(:tick_runner_queue) + end + end +end From 7a4d723e6ba287fe792dca0a8ddc3d8a77b1876c Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Sat, 21 Jan 2017 02:38:58 +0800 Subject: [PATCH 030/313] Remove the key from the queue when runner is deleted --- app/models/ci/runner.rb | 8 ++++++++ spec/models/ci/runner_spec.rb | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb index b4760b5baaa..f30253eefe3 100644 --- a/app/models/ci/runner.rb +++ b/app/models/ci/runner.rb @@ -38,6 +38,8 @@ module Ci acts_as_taggable + after_destroy :cleanup_runner_queue + # Searches for runners matching the given query. # # This method uses ILIKE on PostgreSQL and LIKE on MySQL. @@ -143,6 +145,12 @@ module Ci private + def cleanup_runner_queue + Gitlab::Redis.with do |redis| + redis.del(runner_queue_key) + end + end + def runner_queue_key "runner:build_queue:#{self.token}" end diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb index 7b993a454b7..6283673d7ae 100644 --- a/spec/models/ci/runner_spec.rb +++ b/spec/models/ci/runner_spec.rb @@ -319,6 +319,25 @@ describe Ci::Runner, models: true do end end + describe '#destroy' do + let(:runner) { create(:ci_runner) } + + context 'when there is a tick in the queue' do + let!(:queue_key) { runner.send(:runner_queue_key) } + + before do + runner.tick_runner_queue + runner.destroy + end + + it 'cleans up the queue' do + Gitlab::Redis.with do |redis| + expect(redis.get(queue_key)).to be_nil + end + end + end + end + describe '.assignable_for' do let(:runner) { create(:ci_runner) } let(:project) { create(:project) } From d5fa77d53d73b9d47647443460d2ea95babb52e4 Mon Sep 17 00:00:00 2001 From: Poornima M Date: Wed, 18 Jan 2017 16:08:59 +0530 Subject: [PATCH 031/313] Adding links to user & build in Chat Notifications --- .../chat_message/base_message.rb | 4 +++ .../chat_message/build_message.rb | 28 ++++++++++++++++--- .../chat_message/issue_message.rb | 4 +-- .../chat_message/merge_message.rb | 4 +-- .../chat_message/note_message.rb | 9 +++--- .../26500-informative-slack-notifications.yml | 4 +++ lib/gitlab/data_builder/build.rb | 10 +++++++ spec/factories/ci/builds.rb | 12 ++++++++ spec/factories/commits.rb | 10 +++++++ spec/lib/gitlab/data_builder/build_spec.rb | 26 +++++++++++++++++ .../chat_message/build_message_spec.rb | 28 ++++++++++++++++--- 11 files changed, 122 insertions(+), 17 deletions(-) create mode 100644 changelogs/unreleased/26500-informative-slack-notifications.yml diff --git a/app/models/project_services/chat_message/base_message.rb b/app/models/project_services/chat_message/base_message.rb index a03605d01fb..86d271a3f69 100644 --- a/app/models/project_services/chat_message/base_message.rb +++ b/app/models/project_services/chat_message/base_message.rb @@ -30,5 +30,9 @@ module ChatMessage def attachment_color '#345' end + + def link(text, url) + "[#{text}](#{url})" + end end end diff --git a/app/models/project_services/chat_message/build_message.rb b/app/models/project_services/chat_message/build_message.rb index 53e35cb21bf..c776e0a20c4 100644 --- a/app/models/project_services/chat_message/build_message.rb +++ b/app/models/project_services/chat_message/build_message.rb @@ -7,7 +7,11 @@ module ChatMessage attr_reader :project_name attr_reader :project_url attr_reader :user_name + attr_reader :user_url attr_reader :duration + attr_reader :stage + attr_reader :build_id + attr_reader :build_name def initialize(params) @sha = params[:sha] @@ -17,7 +21,11 @@ module ChatMessage @project_url = params[:project_url] @status = params[:commit][:status] @user_name = params[:commit][:author_name] + @user_url = params[:commit][:author_url] @duration = params[:commit][:duration] + @stage = params[:build_stage] + @build_name = params[:build_name] + @build_id = params[:build_id] end def pretext @@ -35,7 +43,19 @@ module ChatMessage private def message - "#{project_link}: Commit #{commit_link} of #{branch_link} #{ref_type} by #{user_name} #{humanized_status} in #{duration} #{'second'.pluralize(duration)}" + "#{project_link}: Commit #{commit_link} of #{branch_link} #{ref_type} by #{user_link} #{humanized_status} on build #{build_link} of stage #{stage} in #{duration} #{'second'.pluralize(duration)}" + end + + def build_url + "#{project_url}/builds/#{build_id}" + end + + def build_link + link(build_name, build_url) + end + + def user_link + link(user_name, user_url) end def format(string) @@ -64,11 +84,11 @@ module ChatMessage end def branch_link - "[#{ref}](#{branch_url})" + link(ref, branch_url) end def project_link - "[#{project_name}](#{project_url})" + link(project_name, project_url) end def commit_url @@ -76,7 +96,7 @@ module ChatMessage end def commit_link - "[#{Commit.truncate_sha(sha)}](#{commit_url})" + link(Commit.truncate_sha(sha), commit_url) end end end diff --git a/app/models/project_services/chat_message/issue_message.rb b/app/models/project_services/chat_message/issue_message.rb index 14fd64e5332..b96aca47e65 100644 --- a/app/models/project_services/chat_message/issue_message.rb +++ b/app/models/project_services/chat_message/issue_message.rb @@ -55,11 +55,11 @@ module ChatMessage end def project_link - "[#{project_name}](#{project_url})" + link(project_name, project_url) end def issue_link - "[#{issue_title}](#{issue_url})" + link(issue_title, issue_url) end def issue_title diff --git a/app/models/project_services/chat_message/merge_message.rb b/app/models/project_services/chat_message/merge_message.rb index ab5e8b24167..5e5efca7bec 100644 --- a/app/models/project_services/chat_message/merge_message.rb +++ b/app/models/project_services/chat_message/merge_message.rb @@ -42,7 +42,7 @@ module ChatMessage end def project_link - "[#{project_name}](#{project_url})" + link(project_name, project_url) end def merge_request_message @@ -50,7 +50,7 @@ module ChatMessage end def merge_request_link - "[merge request !#{merge_request_id}](#{merge_request_url})" + link("merge request !#{merge_request_id}", merge_request_url) end def merge_request_url diff --git a/app/models/project_services/chat_message/note_message.rb b/app/models/project_services/chat_message/note_message.rb index ca1d7207034..552113bac29 100644 --- a/app/models/project_services/chat_message/note_message.rb +++ b/app/models/project_services/chat_message/note_message.rb @@ -3,10 +3,9 @@ module ChatMessage attr_reader :message attr_reader :user_name attr_reader :project_name - attr_reader :project_link + attr_reader :project_url attr_reader :note attr_reader :note_url - attr_reader :title def initialize(params) params = HashWithIndifferentAccess.new(params) @@ -69,15 +68,15 @@ module ChatMessage end def description_message - [{ text: format(@note), color: attachment_color }] + [{ text: format(note), color: attachment_color }] end def project_link - "[#{@project_name}](#{@project_url})" + link(project_name, project_url) end def commented_on_message(target, title) - @message = "#{@user_name} [commented on #{target}](#{@note_url}) in #{project_link}: *#{title}*" + @message = "#{user_name} #{link('commented on ' + target, note_url)} in #{project_link}: *#{title}*" end end end diff --git a/changelogs/unreleased/26500-informative-slack-notifications.yml b/changelogs/unreleased/26500-informative-slack-notifications.yml new file mode 100644 index 00000000000..342235424f4 --- /dev/null +++ b/changelogs/unreleased/26500-informative-slack-notifications.yml @@ -0,0 +1,4 @@ +--- +title: Add user & build links in Slack Notifications +merge_request: 8641 +author: Poornima M diff --git a/lib/gitlab/data_builder/build.rb b/lib/gitlab/data_builder/build.rb index 6548e6475c6..f78106f5b10 100644 --- a/lib/gitlab/data_builder/build.rb +++ b/lib/gitlab/data_builder/build.rb @@ -8,6 +8,8 @@ module Gitlab commit = build.pipeline user = build.user + author_url = build_author_url(build.commit, commit) + data = { object_kind: 'build', @@ -43,6 +45,7 @@ module Gitlab message: commit.git_commit_message, author_name: commit.git_author_name, author_email: commit.git_author_email, + author_url: author_url, status: commit.status, duration: commit.duration, started_at: commit.started_at, @@ -62,6 +65,13 @@ module Gitlab data end + + private + + def build_author_url(commit, pipeline) + author = commit.try(:author) + author ? Gitlab::Routing.url_helpers.user_url(author) : "mailto:#{pipeline.git_author_email}" + end end end end diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb index 0397d5d4001..e4cac0e1058 100644 --- a/spec/factories/ci/builds.rb +++ b/spec/factories/ci/builds.rb @@ -128,5 +128,17 @@ FactoryGirl.define do build.save! end end + + trait :with_commit do + after(:build) do |build| + allow(build).to receive(:commit).and_return build(:commit, :without_author) + end + end + + trait :with_commit_and_author do + after(:build) do |build| + allow(build).to receive(:commit).and_return build(:commit) + end + end end end diff --git a/spec/factories/commits.rb b/spec/factories/commits.rb index ac6eb0a7897..89e260cf65b 100644 --- a/spec/factories/commits.rb +++ b/spec/factories/commits.rb @@ -8,5 +8,15 @@ FactoryGirl.define do initialize_with do new(git_commit, project) end + + after(:build) do |commit| + allow(commit).to receive(:author).and_return build(:author) + end + + trait :without_author do + after(:build) do |commit| + allow(commit).to receive(:author).and_return nil + end + end end end diff --git a/spec/lib/gitlab/data_builder/build_spec.rb b/spec/lib/gitlab/data_builder/build_spec.rb index 6c71e98066b..91c43f2bdc0 100644 --- a/spec/lib/gitlab/data_builder/build_spec.rb +++ b/spec/lib/gitlab/data_builder/build_spec.rb @@ -17,5 +17,31 @@ describe Gitlab::DataBuilder::Build do it { expect(data[:build_allow_failure]).to eq(false) } it { expect(data[:project_id]).to eq(build.project.id) } it { expect(data[:project_name]).to eq(build.project.name_with_namespace) } + + context 'commit author_url' do + context 'when no commit present' do + let(:build) { create(:ci_build) } + + it 'sets to mailing address of git_author_email' do + expect(data[:commit][:author_url]).to eq("mailto:#{build.pipeline.git_author_email}") + end + end + + context 'when commit present but has no author' do + let(:build) { create(:ci_build, :with_commit) } + + it 'sets to mailing address of git_author_email' do + expect(data[:commit][:author_url]).to eq("mailto:#{build.pipeline.git_author_email}") + end + end + + context 'when commit and author are present' do + let(:build) { create(:ci_build, :with_commit_and_author) } + + it 'sets to GitLab user url' do + expect(data[:commit][:author_url]).to eq(Gitlab::Routing.url_helpers.user_url(username: build.commit.author.username)) + end + end + end end end diff --git a/spec/models/project_services/chat_message/build_message_spec.rb b/spec/models/project_services/chat_message/build_message_spec.rb index 50ad5013df9..3bd7ec18ae0 100644 --- a/spec/models/project_services/chat_message/build_message_spec.rb +++ b/spec/models/project_services/chat_message/build_message_spec.rb @@ -11,21 +11,28 @@ describe ChatMessage::BuildMessage do project_name: 'project_name', project_url: 'http://example.gitlab.com', + build_id: 1, + build_name: build_name, + build_stage: stage, commit: { status: status, author_name: 'hacker', + author_url: 'http://example.gitlab.com/hacker', duration: duration, }, } end let(:message) { build_message } + let(:stage) { 'test' } + let(:status) { 'success' } + let(:build_name) { 'rspec' } + let(:duration) { 10 } context 'build succeeded' do let(:status) { 'success' } let(:color) { 'good' } - let(:duration) { 10 } let(:message) { build_message('passed') } it 'returns a message with information about succeeded build' do @@ -38,7 +45,6 @@ describe ChatMessage::BuildMessage do context 'build failed' do let(:status) { 'failed' } let(:color) { 'danger' } - let(:duration) { 10 } it 'returns a message with information about failed build' do expect(subject.pretext).to be_empty @@ -47,11 +53,25 @@ describe ChatMessage::BuildMessage do end end - def build_message(status_text = status) + it 'returns a message with information on build' do + expect(subject.fallback).to include("on build ") + end + + it 'returns a message with stage name' do + expect(subject.fallback).to include("of stage #{stage}") + end + + it 'returns a message with link to author' do + expect(subject.fallback).to include("by ") + end + + def build_message(status_text = status, stage_text = stage, build_text = build_name) ":" \ " Commit " \ " of branch" \ - " by hacker #{status_text} in #{duration} #{'second'.pluralize(duration)}" + " by #{status_text}" \ + " on build " \ + " of stage #{stage_text} in #{duration} #{'second'.pluralize(duration)}" end end From 683097666aa01ef6a5b490be67a4a0d9733152e3 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 30 Jan 2017 01:07:31 -0200 Subject: [PATCH 032/313] Add WikiPage.unhyphenize --- app/helpers/wiki_helper.rb | 2 +- app/models/wiki_page.rb | 6 +++++- spec/models/wiki_page_spec.rb | 8 ++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb index 76ee632ab6d..3e3f6246fc5 100644 --- a/app/helpers/wiki_helper.rb +++ b/app/helpers/wiki_helper.rb @@ -7,7 +7,7 @@ module WikiHelper # capitalized name of the page itself. def breadcrumb(page_slug) page_slug.split('/'). - map { |dir_or_page| dir_or_page.gsub(/-+/, ' ').capitalize }. + map { |dir_or_page| WikiPage.unhyphenize(dir_or_page).capitalize }. join(' / ') end end diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 20bd9719b2f..2f4f92846b4 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -34,6 +34,10 @@ class WikiPage flatten end + def self.unhyphenize(name) + name.gsub(/-+/, ' ') + end + def to_key [:slug] end @@ -78,7 +82,7 @@ class WikiPage # The formatted title of this page. def title if @attributes[:title] - @attributes[:title].gsub(/-+/, ' ') + self.class.unhyphenize(@attributes[:title]) else "" end diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 109a0499090..579ebac7afb 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -68,6 +68,14 @@ describe WikiPage, models: true do end end + describe '.unhyphenize' do + it 'removes hyphens from a name' do + name = 'a-name--with-hyphens' + + expect(WikiPage.unhyphenize(name)).to eq('a name with hyphens') + end + end + describe "#initialize" do context "when initialized with an existing gollum page" do before do From 89347fb688820667ce55089daa600277796871a5 Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 30 Jan 2017 01:08:36 -0200 Subject: [PATCH 033/313] Add merge request number --- changelogs/unreleased/23535-folders-in-wiki-repository.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelogs/unreleased/23535-folders-in-wiki-repository.yml b/changelogs/unreleased/23535-folders-in-wiki-repository.yml index 7361b182a94..05212b608d4 100644 --- a/changelogs/unreleased/23535-folders-in-wiki-repository.yml +++ b/changelogs/unreleased/23535-folders-in-wiki-repository.yml @@ -1,4 +1,4 @@ --- title: Show directory hierarchy when listing wiki pages -merge_request: +merge_request: 8133 author: Alex Braha Stoll From 67cec150cc5a991846a45dffdd699efbb1b65187 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 27 Jan 2017 01:31:42 -0800 Subject: [PATCH 034/313] Add controller spec for Profiles::NotificationsController --- .../profiles/notifications_controller_spec.rb | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 spec/controllers/profiles/notifications_controller_spec.rb diff --git a/spec/controllers/profiles/notifications_controller_spec.rb b/spec/controllers/profiles/notifications_controller_spec.rb new file mode 100644 index 00000000000..55acc445e43 --- /dev/null +++ b/spec/controllers/profiles/notifications_controller_spec.rb @@ -0,0 +1,46 @@ +require 'spec_helper' + +describe Profiles::NotificationsController do + describe 'GET show' do + it 'renders' do + user = create_user + sign_in(user) + + get :show + expect(response).to render_template :show + end + end + + describe 'POST update' do + it 'updates only permitted attributes' do + user = create_user + sign_in(user) + + put :update, user: { notification_email: 'new@example.com', admin: true } + + user.reload + expect(user.notification_email).to eq('new@example.com') + expect(user.admin).to eq(false) + expect(controller).to set_flash[:notice].to('Notification settings saved') + end + + it 'shows an error message if the params are invalid' do + user = create_user + sign_in(user) + + put :update, user: { notification_email: '' } + + expect(user.reload.notification_email).to eq('original@example.com') + expect(controller).to set_flash[:alert].to('Failed to save new settings') + end + end + + def create_user + create(:user) do |user| + user.emails.create(email: 'original@example.com') + user.emails.create(email: 'new@example.com') + user.update(notification_email: 'original@example.com') + user.save! + end + end +end From bd03ca4a8e5b041f84db85f9043aaefd669afb82 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 27 Jan 2017 01:31:49 -0800 Subject: [PATCH 035/313] Add notified_of_own_activity column to users table --- ...061730_add_notified_of_own_activity_to_users.rb | 14 ++++++++++++++ db/schema.rb | 1 + 2 files changed, 15 insertions(+) create mode 100644 db/migrate/20170123061730_add_notified_of_own_activity_to_users.rb diff --git a/db/migrate/20170123061730_add_notified_of_own_activity_to_users.rb b/db/migrate/20170123061730_add_notified_of_own_activity_to_users.rb new file mode 100644 index 00000000000..f90637e1e35 --- /dev/null +++ b/db/migrate/20170123061730_add_notified_of_own_activity_to_users.rb @@ -0,0 +1,14 @@ +class AddNotifiedOfOwnActivityToUsers < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + disable_ddl_transaction! + + DOWNTIME = false + + def up + add_column_with_default :users, :notified_of_own_activity, :boolean, default: false + end + + def down + remove_column :users, :notified_of_own_activity + end +end diff --git a/db/schema.rb b/db/schema.rb index 5efb4f6595c..4ef8d4bbe10 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1257,6 +1257,7 @@ ActiveRecord::Schema.define(version: 20170130204620) do t.string "organization" t.string "incoming_email_token" t.boolean "authorized_projects_populated" + t.boolean "notified_of_own_activity", default: false, null: false end add_index "users", ["admin"], name: "index_users_on_admin", using: :btree From 0a0207ea91fdbe869ac70c23178b876bcbeb3021 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 27 Jan 2017 01:31:53 -0800 Subject: [PATCH 036/313] Add notified_of_own_activity to permitted attributes in Profiles::NotificationsController#update --- app/controllers/profiles/notifications_controller.rb | 2 +- spec/controllers/profiles/notifications_controller_spec.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/profiles/notifications_controller.rb b/app/controllers/profiles/notifications_controller.rb index b8b71d295f6..a271e2dfc4b 100644 --- a/app/controllers/profiles/notifications_controller.rb +++ b/app/controllers/profiles/notifications_controller.rb @@ -17,6 +17,6 @@ class Profiles::NotificationsController < Profiles::ApplicationController end def user_params - params.require(:user).permit(:notification_email) + params.require(:user).permit(:notification_email, :notified_of_own_activity) end end diff --git a/spec/controllers/profiles/notifications_controller_spec.rb b/spec/controllers/profiles/notifications_controller_spec.rb index 55acc445e43..54324cece6c 100644 --- a/spec/controllers/profiles/notifications_controller_spec.rb +++ b/spec/controllers/profiles/notifications_controller_spec.rb @@ -16,10 +16,11 @@ describe Profiles::NotificationsController do user = create_user sign_in(user) - put :update, user: { notification_email: 'new@example.com', admin: true } + put :update, user: { notification_email: 'new@example.com', notified_of_own_activity: true, admin: true } user.reload expect(user.notification_email).to eq('new@example.com') + expect(user.notified_of_own_activity).to eq(true) expect(user.admin).to eq(false) expect(controller).to set_flash[:notice].to('Notification settings saved') end From 3e81bc7b1daec9dfda602165d7e36cf5b6a39e20 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 27 Jan 2017 01:31:57 -0800 Subject: [PATCH 037/313] Update NotificationService to respect User#notified_of_own_activity --- app/services/notification_service.rb | 6 +-- spec/services/notification_service_spec.rb | 59 ++++++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index b2cc39763f3..5a7d5ef8747 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -217,7 +217,7 @@ class NotificationService recipients = reject_unsubscribed_users(recipients, note.noteable) recipients = reject_users_without_access(recipients, note.noteable) - recipients.delete(note.author) + recipients.delete(note.author) unless note.author.notified_of_own_activity? recipients = recipients.uniq notify_method = "note_#{note.to_ability_name}_email".to_sym @@ -627,7 +627,7 @@ class NotificationService recipients = reject_unsubscribed_users(recipients, target) recipients = reject_users_without_access(recipients, target) - recipients.delete(current_user) if skip_current_user + recipients.delete(current_user) if skip_current_user && !current_user.try(:notified_of_own_activity?) recipients.uniq end @@ -636,7 +636,7 @@ class NotificationService recipients = add_labels_subscribers([], project, target, labels: labels) recipients = reject_unsubscribed_users(recipients, target) recipients = reject_users_without_access(recipients, target) - recipients.delete(current_user) + recipients.delete(current_user) unless current_user.notified_of_own_activity? recipients.uniq end diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb index 7cf2cd9968f..839250b7d84 100644 --- a/spec/services/notification_service_spec.rb +++ b/spec/services/notification_service_spec.rb @@ -146,6 +146,16 @@ describe NotificationService, services: true do should_not_email(@u_lazy_participant) end + it "emails the note author if they've opted into notifications about their activity" do + add_users_with_subscription(note.project, issue) + note.author.notified_of_own_activity = true + reset_delivered_emails! + + notification.new_note(note) + + should_email(note.author) + end + it 'filters out "mentioned in" notes' do mentioned_note = SystemNoteService.cross_reference(mentioned_issue, issue, issue.author) @@ -476,6 +486,20 @@ describe NotificationService, services: true do should_not_email(issue.assignee) end + it "emails the author if they've opted into notifications about their activity" do + issue.author.notified_of_own_activity = true + + notification.new_issue(issue, issue.author) + + should_email(issue.author) + end + + it "doesn't email the author if they haven't opted into notifications about their activity" do + notification.new_issue(issue, issue.author) + + should_not_email(issue.author) + end + it "emails subscribers of the issue's labels" do user_1 = create(:user) user_2 = create(:user) @@ -665,6 +689,19 @@ describe NotificationService, services: true do should_email(subscriber_to_label_2) end + it "emails the current user if they've opted into notifications about their activity" do + subscriber_to_label_2.notified_of_own_activity = true + notification.relabeled_issue(issue, [group_label_2, label_2], subscriber_to_label_2) + + should_email(subscriber_to_label_2) + end + + it "doesn't email the current user if they haven't opted into notifications about their activity" do + notification.relabeled_issue(issue, [group_label_2, label_2], subscriber_to_label_2) + + should_not_email(subscriber_to_label_2) + end + it "doesn't send email to anyone but subscribers of the given labels" do notification.relabeled_issue(issue, [group_label_2, label_2], @u_disabled) @@ -818,6 +855,20 @@ describe NotificationService, services: true do should_not_email(@u_lazy_participant) end + it "emails the author if they've opted into notifications about their activity" do + merge_request.author.notified_of_own_activity = true + + notification.new_merge_request(merge_request, merge_request.author) + + should_email(merge_request.author) + end + + it "doesn't email the author if they haven't opted into notifications about their activity" do + notification.new_merge_request(merge_request, merge_request.author) + + should_not_email(merge_request.author) + end + it "emails subscribers of the merge request's labels" do user_1 = create(:user) user_2 = create(:user) @@ -1013,6 +1064,14 @@ describe NotificationService, services: true do should_not_email(@u_watcher) end + it "notifies the merger when merge_when_build_succeeds is false but they've opted into notifications about their activity" do + merge_request.merge_when_build_succeeds = false + @u_watcher.notified_of_own_activity = true + notification.merge_mr(merge_request, @u_watcher) + + should_email(@u_watcher) + end + it_behaves_like 'participating notifications' do let(:participant) { create(:user, username: 'user-participant') } let(:issuable) { merge_request } From 530d0fda7b97a9a3d8836a36b02e50bc5d408464 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 27 Jan 2017 01:32:00 -0800 Subject: [PATCH 038/313] Add checkbox in UI to opt into receiving notifications about your activity --- app/assets/javascripts/profile/profile.js.es6 | 1 + .../profiles/notifications/show.html.haml | 5 +++ ...r_changes_notified_of_own_activity_spec.rb | 32 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 spec/features/profiles/user_changes_notified_of_own_activity_spec.rb diff --git a/app/assets/javascripts/profile/profile.js.es6 b/app/assets/javascripts/profile/profile.js.es6 index 5aec9c813fe..81374296522 100644 --- a/app/assets/javascripts/profile/profile.js.es6 +++ b/app/assets/javascripts/profile/profile.js.es6 @@ -25,6 +25,7 @@ bindEvents() { $('.js-preferences-form').on('change.preference', 'input[type=radio]', this.submitForm); $('#user_notification_email').on('change', this.submitForm); + $('#user_notified_of_own_activity').on('change', this.submitForm); $('.update-username').on('ajax:before', this.beforeUpdateUsername); $('.update-username').on('ajax:complete', this.afterUpdateUsername); $('.update-notifications').on('ajax:success', this.onUpdateNotifs); diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index 5c5e5940365..51c4e8e5a73 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -34,6 +34,11 @@ .clearfix + = form_for @user, url: profile_notifications_path, method: :put do |f| + %label{ for: 'user_notified_of_own_activity' } + = f.check_box :notified_of_own_activity + %span Receive notifications about your own activity + %hr %h5 Groups (#{@group_notifications.count}) diff --git a/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb b/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb new file mode 100644 index 00000000000..0709f32bf0c --- /dev/null +++ b/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb @@ -0,0 +1,32 @@ +require 'spec_helper' + +feature 'Profile > Notifications > User changes notified_of_own_activity setting', feature: true, js: true do + let(:user) { create(:user) } + + before do + login_as(user) + end + + scenario 'User opts into receiving notifications about their own activity' do + visit profile_notifications_path + + expect(page).not_to have_checked_field('user[notified_of_own_activity]') + + page.find('#user_notified_of_own_activity').set(true) + + expect(page).to have_content('Notification settings saved') + expect(page).to have_checked_field('user[notified_of_own_activity]') + end + + scenario 'User opts out of receiving notifications about their own activity' do + user.update!(notified_of_own_activity: true) + visit profile_notifications_path + + expect(page).to have_checked_field('user[notified_of_own_activity]') + + page.find('#user_notified_of_own_activity').set(false) + + expect(page).to have_content('Notification settings saved') + expect(page).not_to have_checked_field('user[notified_of_own_activity]') + end +end From 2f17a583934a68eafb87cdabcb4ac3d53135c7ec Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 27 Jan 2017 02:02:50 -0800 Subject: [PATCH 039/313] Add changelog entry for option to be notified of your own activity --- .../unreleased/option-to-be-notified-of-own-activity.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/option-to-be-notified-of-own-activity.yml diff --git a/changelogs/unreleased/option-to-be-notified-of-own-activity.yml b/changelogs/unreleased/option-to-be-notified-of-own-activity.yml new file mode 100644 index 00000000000..c2e0410cc33 --- /dev/null +++ b/changelogs/unreleased/option-to-be-notified-of-own-activity.yml @@ -0,0 +1,4 @@ +--- +title: Add option to receive email notifications about your own activity +merge_request: 8836 +author: Richard Macklin From 946efd9fa690de68c6766cba063ff078af8699e1 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Tue, 31 Jan 2017 18:27:02 -0800 Subject: [PATCH 040/313] Add missing newline in Profiles::NotificationsController spec --- spec/controllers/profiles/notifications_controller_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/controllers/profiles/notifications_controller_spec.rb b/spec/controllers/profiles/notifications_controller_spec.rb index 54324cece6c..c056ba852f0 100644 --- a/spec/controllers/profiles/notifications_controller_spec.rb +++ b/spec/controllers/profiles/notifications_controller_spec.rb @@ -7,6 +7,7 @@ describe Profiles::NotificationsController do sign_in(user) get :show + expect(response).to render_template :show end end From 4647d13893d84dea5d0863c48a933dcc8a1ba679 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Tue, 31 Jan 2017 18:27:14 -0800 Subject: [PATCH 041/313] Use check and uncheck methods from Capybara DSL in user_changes_notified_of_own_activity_spec --- .../profiles/user_changes_notified_of_own_activity_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb b/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb index 0709f32bf0c..e05fbb3715c 100644 --- a/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb +++ b/spec/features/profiles/user_changes_notified_of_own_activity_spec.rb @@ -12,7 +12,7 @@ feature 'Profile > Notifications > User changes notified_of_own_activity setting expect(page).not_to have_checked_field('user[notified_of_own_activity]') - page.find('#user_notified_of_own_activity').set(true) + check 'user[notified_of_own_activity]' expect(page).to have_content('Notification settings saved') expect(page).to have_checked_field('user[notified_of_own_activity]') @@ -24,7 +24,7 @@ feature 'Profile > Notifications > User changes notified_of_own_activity setting expect(page).to have_checked_field('user[notified_of_own_activity]') - page.find('#user_notified_of_own_activity').set(false) + uncheck 'user[notified_of_own_activity]' expect(page).to have_content('Notification settings saved') expect(page).not_to have_checked_field('user[notified_of_own_activity]') From 1ee838190e7f7e93dfe50ba26dde549d0fa1aa4e Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Sat, 4 Feb 2017 00:21:29 +0800 Subject: [PATCH 042/313] No need to tick the queue when creating the runner Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8664/diffs#note_22190504 --- lib/ci/api/runners.rb | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/lib/ci/api/runners.rb b/lib/ci/api/runners.rb index c10858f4c5e..bcc82969eb3 100644 --- a/lib/ci/api/runners.rb +++ b/lib/ci/api/runners.rb @@ -28,27 +28,23 @@ module Ci post "register" do required_attributes! [:token] - project = nil + attributes = attributes_for_keys( + [:description, :tag_list, :run_untagged, :locked] + ) + runner = if runner_registration_token_valid? # Create shared runner. Requires admin access - Ci::Runner.new(is_shared: true) + Ci::Runner.create(attributes.merge(is_shared: true)) elsif project = Project.find_by(runners_token: params[:token]) - Ci::Runner.new + # Create a specific runner for project. + project.runners.create(attributes) end return forbidden! unless runner - attributes = attributes_for_keys( - [:description, :tag_list, :run_untagged, :locked] - ).merge(get_runner_version_from_params || {}) - - Ci::UpdateRunnerService.new(runner).update(attributes) - - # Assign the specific runner for the project - project.runners << runner if project - if runner.id + runner.update(get_runner_version_from_params) present runner, with: Entities::Runner else not_found! From 0e2c96e709161b35daeae2dad3aefcf9c85a75aa Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 3 Feb 2017 20:49:45 -0800 Subject: [PATCH 043/313] Use `let` in Profiles::NotificationsController spec --- .../profiles/notifications_controller_spec.rb | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/spec/controllers/profiles/notifications_controller_spec.rb b/spec/controllers/profiles/notifications_controller_spec.rb index c056ba852f0..58caf7999cf 100644 --- a/spec/controllers/profiles/notifications_controller_spec.rb +++ b/spec/controllers/profiles/notifications_controller_spec.rb @@ -1,9 +1,17 @@ require 'spec_helper' describe Profiles::NotificationsController do + let(:user) do + create(:user) do |user| + user.emails.create(email: 'original@example.com') + user.emails.create(email: 'new@example.com') + user.update(notification_email: 'original@example.com') + user.save! + end + end + describe 'GET show' do it 'renders' do - user = create_user sign_in(user) get :show @@ -14,7 +22,6 @@ describe Profiles::NotificationsController do describe 'POST update' do it 'updates only permitted attributes' do - user = create_user sign_in(user) put :update, user: { notification_email: 'new@example.com', notified_of_own_activity: true, admin: true } @@ -27,7 +34,6 @@ describe Profiles::NotificationsController do end it 'shows an error message if the params are invalid' do - user = create_user sign_in(user) put :update, user: { notification_email: '' } @@ -36,13 +42,4 @@ describe Profiles::NotificationsController do expect(controller).to set_flash[:alert].to('Failed to save new settings') end end - - def create_user - create(:user) do |user| - user.emails.create(email: 'original@example.com') - user.emails.create(email: 'new@example.com') - user.update(notification_email: 'original@example.com') - user.save! - end - end end From 7cd260b10727cef0621ecef429ec89e00873b1b7 Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 3 Feb 2017 21:01:45 -0800 Subject: [PATCH 044/313] Refactor NotificationService#pipeline_finished to use skip_current_user instead of passing nil for current_user --- app/services/notification_service.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index 5a7d5ef8747..e5283720913 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -327,8 +327,9 @@ class NotificationService recipients ||= build_recipients( pipeline, pipeline.project, - nil, # The acting user, who won't be added to recipients - action: pipeline.status).map(&:notification_email) + pipeline.user, + action: pipeline.status, + skip_current_user: false).map(&:notification_email) if recipients.any? mailer.public_send(email_template, pipeline, recipients).deliver_later From 9493791d1212f484217e74757550353a5ef07dcf Mon Sep 17 00:00:00 2001 From: Richard Macklin Date: Fri, 3 Feb 2017 21:03:26 -0800 Subject: [PATCH 045/313] Remove `try` from NotificationService#build_recipients After refactoring pipeline_finished to avoid passing `nil` for current_user, we shouldn't need to use `try` here anymore. --- app/services/notification_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb index e5283720913..3734e3c4253 100644 --- a/app/services/notification_service.rb +++ b/app/services/notification_service.rb @@ -628,7 +628,7 @@ class NotificationService recipients = reject_unsubscribed_users(recipients, target) recipients = reject_users_without_access(recipients, target) - recipients.delete(current_user) if skip_current_user && !current_user.try(:notified_of_own_activity?) + recipients.delete(current_user) if skip_current_user && !current_user.notified_of_own_activity? recipients.uniq end From 4d3f2ff1f27bc65dbfa9a3ffb6b64fc88a4cd9a0 Mon Sep 17 00:00:00 2001 From: Takuya Noguchi Date: Sat, 4 Feb 2017 03:24:17 +0900 Subject: [PATCH 046/313] Update doc for enabling or disabling GitLab CI --- .../unreleased/27656-doc-ci-enable-ci.yml | 4 ++++ doc/ci/enable_or_disable_ci.md | 18 +++++++++--------- doc/ci/img/features_settings.png | Bin 9243 -> 0 bytes doc/ci/img/permissions_settings.png | Bin 0 -> 39194 bytes 4 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 changelogs/unreleased/27656-doc-ci-enable-ci.yml delete mode 100644 doc/ci/img/features_settings.png create mode 100644 doc/ci/img/permissions_settings.png diff --git a/changelogs/unreleased/27656-doc-ci-enable-ci.yml b/changelogs/unreleased/27656-doc-ci-enable-ci.yml new file mode 100644 index 00000000000..e6315d683d4 --- /dev/null +++ b/changelogs/unreleased/27656-doc-ci-enable-ci.yml @@ -0,0 +1,4 @@ +--- +title: Update doc for enabling or disabling GitLab CI +merge_request: 8965 +author: Takuya Noguchi diff --git a/doc/ci/enable_or_disable_ci.md b/doc/ci/enable_or_disable_ci.md index c10f82054e2..7971daf2637 100644 --- a/doc/ci/enable_or_disable_ci.md +++ b/doc/ci/enable_or_disable_ci.md @@ -11,10 +11,10 @@ API. --- -As of GitLab 8.2, GitLab CI is mainly exposed via the `/builds` page of a -project. Disabling GitLab CI in a project does not delete any previous builds. -In fact, the `/builds` page can still be accessed, although it's hidden from -the left sidebar menu. +GitLab CI is exposed via the `/pipelines` and `/builds` pages of a project. +Disabling GitLab CI in a project does not delete any previous builds. +In fact, the `/pipelines` and `/builds` pages can still be accessed, although +it's hidden from the left sidebar menu. GitLab CI is enabled by default on new installations and can be disabled either individually under each project's settings, or site-wide by modifying the @@ -23,12 +23,12 @@ respectively. ### Per-project user setting -The setting to enable or disable GitLab CI can be found with the name **Builds** -under the **Features** area of a project's settings along with **Issues**, -**Merge Requests**, **Wiki** and **Snippets**. Select or deselect the checkbox -and hit **Save** for the settings to take effect. +The setting to enable or disable GitLab CI can be found with the name **Pipelines** +under the **Sharing & Permissions** area of a project's settings along with +**Merge Requests**. Choose one of **Disabled**, **Only team members** and +**Everyone with access** and hit **Save changes** for the settings to take effect. -![Features settings](img/features_settings.png) +![Sharing & Permissions settings](img/permissions_settings.png) --- diff --git a/doc/ci/img/features_settings.png b/doc/ci/img/features_settings.png deleted file mode 100644 index c159253d1c9ec7a92014b1d8a258d1303b0d601e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9243 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 literal 0 HcmV?d00001 From 2e54454e6165a34004678eb45de3530f26a2ae2a Mon Sep 17 00:00:00 2001 From: James Lopez Date: Thu, 24 Nov 2016 16:12:30 +0100 Subject: [PATCH 047/313] Add limit to the number of events showed in cycle analytics and spec --- bin/changelog | 2 ++ .../fix-cycle-analytics-events-limit.yml | 4 +++ .../cycle_analytics/events_query_spec.rb | 35 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 changelogs/unreleased/fix-cycle-analytics-events-limit.yml create mode 100644 spec/lib/gitlab/cycle_analytics/events_query_spec.rb diff --git a/bin/changelog b/bin/changelog index 4c894f8ff5b..70be4058137 100755 --- a/bin/changelog +++ b/bin/changelog @@ -80,6 +80,8 @@ class ChangelogEntry unless options.dry_run write + %x{git add #{file_path}} + amend_commit if options.amend end end diff --git a/changelogs/unreleased/fix-cycle-analytics-events-limit.yml b/changelogs/unreleased/fix-cycle-analytics-events-limit.yml new file mode 100644 index 00000000000..152b37ca430 --- /dev/null +++ b/changelogs/unreleased/fix-cycle-analytics-events-limit.yml @@ -0,0 +1,4 @@ +--- +title: Add limit to the number of events showed in cycle analytics +merge_request: +author: diff --git a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb new file mode 100644 index 00000000000..c00e71f6672 --- /dev/null +++ b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' + +describe Gitlab::CycleAnalytics::EventsQuery do + let(:max_events) { 3 } + let(:project) { create(:project) } + let(:user) { create(:user, :admin) } + let(:options) { { from: 30.days.ago } } + + let(:issue_event) do + Gitlab::CycleAnalytics::IssueEvent.new(project: project, options: options) + end + + subject { described_class.new(project: project, options: options).execute(issue_event) } + + before do + allow_any_instance_of(Gitlab::ReferenceExtractor).to receive(:issues).and_return(Issue.all) + stub_const('Gitlab::CycleAnalytics::EventsQuery::MAX_EVENTS', max_events) + + setup_events(count: 5) + end + + it 'limits the rows the max number' do + expect(subject.count).to eq(max_events) + end + + def setup_events(count:) + count.times do + issue = create(:issue, project: project, created_at: 2.days.ago) + milestone = create(:milestone, project: project) + + issue.update(milestone: milestone) + create_merge_request_closing_issue(issue) + end + end +end From 0c4c5408aa9a19c4d7ed4153a8bceead3b219007 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Fri, 25 Nov 2016 10:01:11 +0100 Subject: [PATCH 048/313] undo local changelog change --- bin/changelog | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/changelog b/bin/changelog index 70be4058137..4c894f8ff5b 100755 --- a/bin/changelog +++ b/bin/changelog @@ -80,8 +80,6 @@ class ChangelogEntry unless options.dry_run write - %x{git add #{file_path}} - amend_commit if options.amend end end From 40bc96c902fed5af93653e1c0960125e420783e5 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Mon, 28 Nov 2016 09:16:14 +0100 Subject: [PATCH 049/313] fix typo [ci skip] --- spec/lib/gitlab/cycle_analytics/events_query_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb index c00e71f6672..a0da93dadee 100644 --- a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' describe Gitlab::CycleAnalytics::EventsQuery do let(:max_events) { 3 } - let(:project) { create(:project) } + let(:project) { create(:empty_project) } let(:user) { create(:user, :admin) } let(:options) { { from: 30.days.ago } } @@ -19,7 +19,7 @@ describe Gitlab::CycleAnalytics::EventsQuery do setup_events(count: 5) end - it 'limits the rows the max number' do + it 'limits the rows to the max number' do expect(subject.count).to eq(max_events) end From 58a5d4a9e3f662428661d00ae543c6927b3a2ff4 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Mon, 28 Nov 2016 16:09:41 +0100 Subject: [PATCH 050/313] user project and not empty_project as we need the repo stuff --- spec/lib/gitlab/cycle_analytics/events_query_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb index a0da93dadee..6aac2ed78d9 100644 --- a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' describe Gitlab::CycleAnalytics::EventsQuery do let(:max_events) { 3 } - let(:project) { create(:empty_project) } + let(:project) { create(:project) } let(:user) { create(:user, :admin) } let(:options) { { from: 30.days.ago } } From 1b7c186723ebf2cd4b97481f3bd7e7285efbc792 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Mon, 6 Feb 2017 16:23:55 +0100 Subject: [PATCH 051/313] move query limit to base event fetcher --- lib/gitlab/cycle_analytics/base_event_fetcher.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/gitlab/cycle_analytics/base_event_fetcher.rb b/lib/gitlab/cycle_analytics/base_event_fetcher.rb index 0d8791d396b..ab115afcaa5 100644 --- a/lib/gitlab/cycle_analytics/base_event_fetcher.rb +++ b/lib/gitlab/cycle_analytics/base_event_fetcher.rb @@ -5,6 +5,8 @@ module Gitlab attr_reader :projections, :query, :stage, :order + MAX_EVENTS = 50 + def initialize(project:, stage:, options:) @project = project @stage = stage @@ -38,7 +40,7 @@ module Gitlab def events_query diff_fn = subtract_datetimes_diff(base_query, @options[:start_time_attrs], @options[:end_time_attrs]) - base_query.project(extract_diff_epoch(diff_fn).as('total_time'), *projections).order(order.desc) + base_query.project(extract_diff_epoch(diff_fn).as('total_time'), *projections).order(order.desc).take(MAX_EVENTS) end def default_order From 682e354df649c4aad7b28e6fd16aae3eccbf7e08 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Mon, 6 Feb 2017 16:28:17 +0100 Subject: [PATCH 052/313] add spec --- .../base_event_fetcher_spec.rb | 44 +++++++++++++++++++ .../cycle_analytics/events_query_spec.rb | 35 --------------- 2 files changed, 44 insertions(+), 35 deletions(-) create mode 100644 spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb delete mode 100644 spec/lib/gitlab/cycle_analytics/events_query_spec.rb diff --git a/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb new file mode 100644 index 00000000000..4aac63e54e2 --- /dev/null +++ b/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb @@ -0,0 +1,44 @@ +require 'spec_helper' + +describe Gitlab::CycleAnalytics::BaseEventFetcher do + let(:max_events) { 2 } + let(:project) { create(:project) } + let(:user) { create(:user, :admin) } + let(:start_time_attrs) { Issue.arel_table[:created_at] } + let(:end_time_attrs) { [Issue::Metrics.arel_table[:first_associated_with_milestone_at]] } + let(:options) { { start_time_attrs: start_time_attrs, + end_time_attrs: end_time_attrs, + from: 30.days.ago } } + + + subject do + described_class.new(project: project, + stage: :issue, + options: options).fetch + end + + before do + allow_any_instance_of(Gitlab::ReferenceExtractor).to receive(:issues).and_return(Issue.all) + allow_any_instance_of(Gitlab::CycleAnalytics::BaseEventFetcher).to receive(:serialize) do |event| + event + end + + stub_const('Gitlab::CycleAnalytics::BaseEventFetcher::MAX_EVENTS', max_events) + + setup_events(count: 3) + end + + it 'limits the rows to the max number' do + expect(subject.count).to eq(max_events) + end + + def setup_events(count:) + count.times do + issue = create(:issue, project: project, created_at: 2.days.ago) + milestone = create(:milestone, project: project) + + issue.update(milestone: milestone) + create_merge_request_closing_issue(issue) + end + end +end diff --git a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb b/spec/lib/gitlab/cycle_analytics/events_query_spec.rb deleted file mode 100644 index 6aac2ed78d9..00000000000 --- a/spec/lib/gitlab/cycle_analytics/events_query_spec.rb +++ /dev/null @@ -1,35 +0,0 @@ -require 'spec_helper' - -describe Gitlab::CycleAnalytics::EventsQuery do - let(:max_events) { 3 } - let(:project) { create(:project) } - let(:user) { create(:user, :admin) } - let(:options) { { from: 30.days.ago } } - - let(:issue_event) do - Gitlab::CycleAnalytics::IssueEvent.new(project: project, options: options) - end - - subject { described_class.new(project: project, options: options).execute(issue_event) } - - before do - allow_any_instance_of(Gitlab::ReferenceExtractor).to receive(:issues).and_return(Issue.all) - stub_const('Gitlab::CycleAnalytics::EventsQuery::MAX_EVENTS', max_events) - - setup_events(count: 5) - end - - it 'limits the rows to the max number' do - expect(subject.count).to eq(max_events) - end - - def setup_events(count:) - count.times do - issue = create(:issue, project: project, created_at: 2.days.ago) - milestone = create(:milestone, project: project) - - issue.update(milestone: milestone) - create_merge_request_closing_issue(issue) - end - end -end From 105154aeaed5dfcd643e4a6955d947e524699e45 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 7 Feb 2017 02:49:37 +0800 Subject: [PATCH 053/313] Just pass :services, feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8664#note_22853463 --- spec/services/ci/update_runner_service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/services/ci/update_runner_service_spec.rb b/spec/services/ci/update_runner_service_spec.rb index 8429881dd15..41372476228 100644 --- a/spec/services/ci/update_runner_service_spec.rb +++ b/spec/services/ci/update_runner_service_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Ci::UpdateRunnerService, services: true do +describe Ci::UpdateRunnerService, :services do let(:runner) { create(:ci_runner) } describe '#update' do From 80bc66596adee89b423d4da8cafcddf3b98c9678 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 7 Feb 2017 03:05:19 +0800 Subject: [PATCH 054/313] Only tick queue if anything is updated Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8664#note_22853522 --- app/services/ci/update_runner_service.rb | 4 +-- .../services/ci/update_runner_service_spec.rb | 33 ++++++++++++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/app/services/ci/update_runner_service.rb b/app/services/ci/update_runner_service.rb index 198b29b3a9d..450ee7da1c9 100644 --- a/app/services/ci/update_runner_service.rb +++ b/app/services/ci/update_runner_service.rb @@ -7,8 +7,8 @@ module Ci end def update(params) - runner.update(params).tap do - runner.tick_runner_queue + runner.update(params).tap do |updated| + runner.tick_runner_queue if updated end end end diff --git a/spec/services/ci/update_runner_service_spec.rb b/spec/services/ci/update_runner_service_spec.rb index 41372476228..e429fcfc72f 100644 --- a/spec/services/ci/update_runner_service_spec.rb +++ b/spec/services/ci/update_runner_service_spec.rb @@ -6,13 +6,36 @@ describe Ci::UpdateRunnerService, :services do describe '#update' do before do allow(runner).to receive(:tick_runner_queue) - - described_class.new(runner).update(description: 'new runner') end - it 'updates the runner and ticking the queue' do - expect(runner.description).to eq('new runner') - expect(runner).to have_received(:tick_runner_queue) + context 'with description params' do + let(:params) { { description: 'new runner' } } + + it 'updates the runner and ticking the queue' do + expect(update).to be_truthy + + runner.reload + + expect(runner).to have_received(:tick_runner_queue) + expect(runner.description).to eq('new runner') + end + end + + context 'when params are not valid' do + let(:params) { { run_untagged: false } } + + it 'does not update and give false because it is not valid' do + expect(update).to be_falsey + + runner.reload + + expect(runner).not_to have_received(:tick_runner_queue) + expect(runner.run_untagged).to be_truthy + end + end + + def update + described_class.new(runner).update(params) end end end From 345e94fdf9b99a15d65856abd1532eda256e2639 Mon Sep 17 00:00:00 2001 From: Mark Pundsack Date: Mon, 6 Feb 2017 16:49:23 -0600 Subject: [PATCH 055/313] Document types of pipelines --- doc/ci/pipelines.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index f91b9d350f7..590748cf9a7 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -13,6 +13,16 @@ executed. ![Pipelines example](img/pipelines.png) +### Types of Pipelines + +There are three types of pipelines that often use the single shorthand of "pipeline". People often talk about them as if each one is "the" pipeline, but really, they're just pieces of a single, comprehensive pipeline. + +![](/images/direction/cicd/types-of-pipelines.svg) + +1. **CI Pipeline**: Build and test stages defined in `.gitlab-ci.yml` +2. **Deploy Pipeline**: Deploy stage(s) defined in `.gitlab-ci.yml` The flow of deploying code to servers through various stages: e.g. development to staging to production +3. **Project Pipeline**: Cross-project CI dependencies [triggered via API]((triggers)), particularly for micro-services, but also for complicated build dependencies: e.g. api -> front-end, ce/ee -> omnibus. + ## Builds Builds are individual runs of [jobs]. Not to be confused with a `build` job or From 6a2eda9d8a8e552b7a45e1eccfc76054911f8242 Mon Sep 17 00:00:00 2001 From: Mark Pundsack Date: Mon, 6 Feb 2017 17:10:00 -0600 Subject: [PATCH 056/313] Add image --- doc/ci/img/types-of-pipelines.svg | 4 ++++ doc/ci/pipelines.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 doc/ci/img/types-of-pipelines.svg diff --git a/doc/ci/img/types-of-pipelines.svg b/doc/ci/img/types-of-pipelines.svg new file mode 100644 index 00000000000..5467ec02c78 --- /dev/null +++ b/doc/ci/img/types-of-pipelines.svg @@ -0,0 +1,4 @@ + + + + diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index 590748cf9a7..d099628c012 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -17,7 +17,7 @@ executed. There are three types of pipelines that often use the single shorthand of "pipeline". People often talk about them as if each one is "the" pipeline, but really, they're just pieces of a single, comprehensive pipeline. -![](/images/direction/cicd/types-of-pipelines.svg) +![](img/types-of-pipelines.svg) 1. **CI Pipeline**: Build and test stages defined in `.gitlab-ci.yml` 2. **Deploy Pipeline**: Deploy stage(s) defined in `.gitlab-ci.yml` The flow of deploying code to servers through various stages: e.g. development to staging to production From e278feb2158cbe9595e2afc9da019d97b40e1cdc Mon Sep 17 00:00:00 2001 From: Mark Pundsack Date: Mon, 6 Feb 2017 17:20:21 -0600 Subject: [PATCH 057/313] Update image --- doc/ci/img/types-of-pipelines.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ci/img/types-of-pipelines.svg b/doc/ci/img/types-of-pipelines.svg index 5467ec02c78..b63b5f56ba6 100644 --- a/doc/ci/img/types-of-pipelines.svg +++ b/doc/ci/img/types-of-pipelines.svg @@ -1,4 +1,4 @@ - + From 4a38a3bb2fc0abaad175d9287e17998b6c5bb93b Mon Sep 17 00:00:00 2001 From: Mark Pundsack Date: Mon, 6 Feb 2017 17:30:55 -0600 Subject: [PATCH 058/313] Add development workflows --- doc/ci/img/pipelines-goal.svg | 4 ++++ doc/ci/pipelines.md | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 doc/ci/img/pipelines-goal.svg diff --git a/doc/ci/img/pipelines-goal.svg b/doc/ci/img/pipelines-goal.svg new file mode 100644 index 00000000000..a925e2282a4 --- /dev/null +++ b/doc/ci/img/pipelines-goal.svg @@ -0,0 +1,4 @@ + + + + diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index d099628c012..0a9f4631614 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -13,7 +13,7 @@ executed. ![Pipelines example](img/pipelines.png) -### Types of Pipelines +## Types of Pipelines There are three types of pipelines that often use the single shorthand of "pipeline". People often talk about them as if each one is "the" pipeline, but really, they're just pieces of a single, comprehensive pipeline. @@ -23,6 +23,18 @@ There are three types of pipelines that often use the single shorthand of "pipel 2. **Deploy Pipeline**: Deploy stage(s) defined in `.gitlab-ci.yml` The flow of deploying code to servers through various stages: e.g. development to staging to production 3. **Project Pipeline**: Cross-project CI dependencies [triggered via API]((triggers)), particularly for micro-services, but also for complicated build dependencies: e.g. api -> front-end, ce/ee -> omnibus. +## Development Workflows + +Pipelines accommodate several development workflows: + +1. **Branch Flow** (e.g. different branch for dev, qa, staging, production) +2. **Trunk-based Flow** (e.g. feature branches and single master branch, possibly with tags for releases) +3. **Fork-based Flow** (e.g. merge requests come from forks) + +Example flow: + +![](img/pipelines-goal.svg) + ## Builds Builds are individual runs of [jobs]. Not to be confused with a `build` job or From 2338aa6a25ae07b6c00841431264fb02f77db36a Mon Sep 17 00:00:00 2001 From: Mark Pundsack Date: Mon, 6 Feb 2017 17:36:34 -0600 Subject: [PATCH 059/313] Add image titles --- doc/ci/pipelines.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index 0a9f4631614..35a80dd2977 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -17,7 +17,7 @@ executed. There are three types of pipelines that often use the single shorthand of "pipeline". People often talk about them as if each one is "the" pipeline, but really, they're just pieces of a single, comprehensive pipeline. -![](img/types-of-pipelines.svg) +![Types of Pipelines](img/types-of-pipelines.svg) 1. **CI Pipeline**: Build and test stages defined in `.gitlab-ci.yml` 2. **Deploy Pipeline**: Deploy stage(s) defined in `.gitlab-ci.yml` The flow of deploying code to servers through various stages: e.g. development to staging to production @@ -31,7 +31,7 @@ Pipelines accommodate several development workflows: 2. **Trunk-based Flow** (e.g. feature branches and single master branch, possibly with tags for releases) 3. **Fork-based Flow** (e.g. merge requests come from forks) -Example flow: +Example continuous delivery flow: ![](img/pipelines-goal.svg) From bf05c7e035459cdf554b6d651b57ab82031a6bf3 Mon Sep 17 00:00:00 2001 From: James Lopez Date: Tue, 7 Feb 2017 09:29:34 +0100 Subject: [PATCH 060/313] fix spec --- .../gitlab/cycle_analytics/base_event_fetcher_spec.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb b/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb index 4aac63e54e2..c455cd9b942 100644 --- a/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb +++ b/spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb @@ -6,10 +6,11 @@ describe Gitlab::CycleAnalytics::BaseEventFetcher do let(:user) { create(:user, :admin) } let(:start_time_attrs) { Issue.arel_table[:created_at] } let(:end_time_attrs) { [Issue::Metrics.arel_table[:first_associated_with_milestone_at]] } - let(:options) { { start_time_attrs: start_time_attrs, - end_time_attrs: end_time_attrs, - from: 30.days.ago } } - + let(:options) do + { start_time_attrs: start_time_attrs, + end_time_attrs: end_time_attrs, + from: 30.days.ago } + end subject do described_class.new(project: project, From 128b1eae092e4ee9384c99a4ba72b9122fc17e89 Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Tue, 7 Feb 2017 15:16:46 +0100 Subject: [PATCH 061/313] Update Rubocop to ruby 2.3 --- .rubocop.yml | 2 +- app/controllers/projects/wikis_controller.rb | 2 +- app/mailers/notify.rb | 2 +- app/models/application_setting.rb | 28 ++++++++------------ app/models/concerns/issuable.rb | 4 +-- app/models/concerns/milestoneish.rb | 2 +- app/models/group_milestone.rb | 2 +- app/models/project.rb | 2 +- app/models/user.rb | 2 +- app/models/wiki_page.rb | 8 ++---- app/services/create_tag_service.rb | 2 +- app/services/delete_tag_service.rb | 2 +- app/services/projects/create_service.rb | 2 +- app/workers/authorized_projects_worker.rb | 2 +- lib/api/branches.rb | 2 +- lib/api/entities.rb | 4 +-- lib/gitlab/ci/config/entry/configurable.rb | 2 +- lib/gitlab/email/message/repository_push.rb | 4 +-- lib/gitlab/git/blob_snippet.rb | 2 +- lib/gitlab/metrics.rb | 6 ++--- 20 files changed, 35 insertions(+), 47 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index cfff42e5c99..aa91b57d7b3 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,7 +5,7 @@ require: inherit_from: .rubocop_todo.yml AllCops: - TargetRubyVersion: 2.1 + TargetRubyVersion: 2.3 # Cop names are not d§splayed in offense messages by default. Change behavior # by overriding DisplayCopNames, or by giving the -D/--display-cop-names # option. diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index c3353446fd1..8e683931b2e 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -83,7 +83,7 @@ class Projects::WikisController < Projects::ApplicationController def destroy @page = @project_wiki.find_page(params[:id]) - @page.delete if @page + @page&.delete redirect_to( namespace_project_wiki_path(@project.namespace, @project, :home), diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb index 0cd3456b4de..5b9226a6b81 100644 --- a/app/mailers/notify.rb +++ b/app/mailers/notify.rb @@ -151,7 +151,7 @@ class Notify < BaseMailer headers['In-Reply-To'] = message_id(model) headers['References'] = message_id(model) - headers[:subject].prepend('Re: ') if headers[:subject] + headers[:subject]&.prepend('Re: ') mail_thread(model, headers) end diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index 9a4557524c4..74b358d8c40 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -116,31 +116,25 @@ class ApplicationSetting < ActiveRecord::Base numericality: { only_integer: true, greater_than_or_equal_to: 0 } validates_each :restricted_visibility_levels do |record, attr, value| - unless value.nil? - value.each do |level| - unless Gitlab::VisibilityLevel.options.has_value?(level) - record.errors.add(attr, "'#{level}' is not a valid visibility level") - end + value&.each do |level| + unless Gitlab::VisibilityLevel.options.has_value?(level) + record.errors.add(attr, "'#{level}' is not a valid visibility level") end end end validates_each :import_sources do |record, attr, value| - unless value.nil? - value.each do |source| - unless Gitlab::ImportSources.options.has_value?(source) - record.errors.add(attr, "'#{source}' is not a import source") - end + value&.each do |source| + unless Gitlab::ImportSources.options.has_value?(source) + record.errors.add(attr, "'#{source}' is not a import source") end end end validates_each :disabled_oauth_sign_in_sources do |record, attr, value| - unless value.nil? - value.each do |source| - unless Devise.omniauth_providers.include?(source.to_sym) - record.errors.add(attr, "'#{source}' is not an OAuth sign-in source") - end + value&.each do |source| + unless Devise.omniauth_providers.include?(source.to_sym) + record.errors.add(attr, "'#{source}' is not an OAuth sign-in source") end end end @@ -230,11 +224,11 @@ class ApplicationSetting < ActiveRecord::Base end def domain_whitelist_raw - self.domain_whitelist.join("\n") unless self.domain_whitelist.nil? + self.domain_whitelist&.join("\n") end def domain_blacklist_raw - self.domain_blacklist.join("\n") unless self.domain_blacklist.nil? + self.domain_blacklist&.join("\n") end def domain_whitelist_raw=(values) diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 3517969eabc..d1872dd931d 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -95,8 +95,8 @@ module Issuable def update_assignee_cache_counts # make sure we flush the cache for both the old *and* new assignees(if they exist) previous_assignee = User.find_by_id(assignee_id_was) if assignee_id_was - previous_assignee.update_cache_counts if previous_assignee - assignee.update_cache_counts if assignee + previous_assignee&.update_cache_counts + assignee&.update_cache_counts end # We want to use optimistic lock for cases when only title or description are involved diff --git a/app/models/concerns/milestoneish.rb b/app/models/concerns/milestoneish.rb index e9450dd0c26..f449229864d 100644 --- a/app/models/concerns/milestoneish.rb +++ b/app/models/concerns/milestoneish.rb @@ -73,7 +73,7 @@ module Milestoneish def memoize_per_user(user, method_name) @memoized ||= {} @memoized[method_name] ||= {} - @memoized[method_name][user.try!(:id)] ||= yield + @memoized[method_name][user&.id] ||= yield end # override in a class that includes this module to get a faster query diff --git a/app/models/group_milestone.rb b/app/models/group_milestone.rb index 7b6db2634b7..86d38e5468b 100644 --- a/app/models/group_milestone.rb +++ b/app/models/group_milestone.rb @@ -9,7 +9,7 @@ class GroupMilestone < GlobalMilestone def self.build(group, projects, title) super(projects, title).tap do |milestone| - milestone.group = group if milestone + milestone&.group = group end end diff --git a/app/models/project.rb b/app/models/project.rb index 0d286bfbaa8..05497933007 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -461,7 +461,7 @@ class Project < ActiveRecord::Base def reset_cache_and_import_attrs ProjectCacheWorker.perform_async(self.id) - self.import_data.destroy if self.import_data + self.import_data&.destroy end def import_url=(value) diff --git a/app/models/user.rb b/app/models/user.rb index 54f5388eb2c..15fe8084a9c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -304,7 +304,7 @@ class User < ActiveRecord::Base def find_by_personal_access_token(token_string) personal_access_token = PersonalAccessToken.active.find_by_token(token_string) if token_string - personal_access_token.user if personal_access_token + personal_access_token&.user end # Returns a user for the given SSH key. diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index c3de278f5b7..e93d0eab6d8 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -69,16 +69,12 @@ class WikiPage # The raw content of this page. def content - @attributes[:content] ||= if @page - @page.text_data - end + @attributes[:content] ||= @page&.text_data end # The processed/formatted content of this page. def formatted_content - @attributes[:formatted_content] ||= if @page - @page.formatted_data - end + @attributes[:formatted_content] ||= @page&.formatted_data end # The markup format for the page. diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb index fe9353afeb8..6c75d1f04ff 100644 --- a/app/services/create_tag_service.rb +++ b/app/services/create_tag_service.rb @@ -4,7 +4,7 @@ class CreateTagService < BaseService return error('Tag name invalid') unless valid_tag repository = project.repository - message.strip! if message + message&.strip! new_tag = nil diff --git a/app/services/delete_tag_service.rb b/app/services/delete_tag_service.rb index 9d4bffb93e9..eb726cb04b1 100644 --- a/app/services/delete_tag_service.rb +++ b/app/services/delete_tag_service.rb @@ -9,7 +9,7 @@ class DeleteTagService < BaseService if repository.rm_tag(current_user, tag_name) release = project.releases.find_by(tag: tag_name) - release.destroy if release + release&.destroy push_data = build_push_data(tag) EventCreateService.new.push(project, current_user, push_data) diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index c7cce0c55b9..6dc3d8c2416 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -97,7 +97,7 @@ module Projects @project.team << [current_user, :master, current_user] end - @project.group.refresh_members_authorized_projects if @project.group + @project.group&.refresh_members_authorized_projects end def skip_wiki? diff --git a/app/workers/authorized_projects_worker.rb b/app/workers/authorized_projects_worker.rb index 6abbb5a5250..0e20df506a3 100644 --- a/app/workers/authorized_projects_worker.rb +++ b/app/workers/authorized_projects_worker.rb @@ -16,6 +16,6 @@ class AuthorizedProjectsWorker def perform(user_id) user = User.find_by(id: user_id) - user.refresh_authorized_projects if user + user&.refresh_authorized_projects end end diff --git a/lib/api/branches.rb b/lib/api/branches.rb index be659fa4a6a..9331be1f7de 100644 --- a/lib/api/branches.rb +++ b/lib/api/branches.rb @@ -84,7 +84,7 @@ module API branch = user_project.repository.find_branch(params[:branch]) not_found!("Branch") unless branch protected_branch = user_project.protected_branches.find_by(name: branch.name) - protected_branch.destroy if protected_branch + protected_branch&.destroy present branch, with: Entities::RepoBranch, project: user_project end diff --git a/lib/api/entities.rb b/lib/api/entities.rb index b1ead48caf7..bedcd503724 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -382,9 +382,7 @@ module API expose :author, using: Entities::UserBasic, if: ->(event, options) { event.author } expose :author_username do |event, options| - if event.author - event.author.username - end + event.author&.username end end diff --git a/lib/gitlab/ci/config/entry/configurable.rb b/lib/gitlab/ci/config/entry/configurable.rb index 833ae4a0ff3..e05aca9881b 100644 --- a/lib/gitlab/ci/config/entry/configurable.rb +++ b/lib/gitlab/ci/config/entry/configurable.rb @@ -58,7 +58,7 @@ module Gitlab def helpers(*nodes) nodes.each do |symbol| define_method("#{symbol}_defined?") do - @entries[symbol].specified? if @entries[symbol] + @entries[symbol]&.specified? end define_method("#{symbol}_value") do diff --git a/lib/gitlab/email/message/repository_push.rb b/lib/gitlab/email/message/repository_push.rb index 0e3b65fceb4..6c69cd9e6a9 100644 --- a/lib/gitlab/email/message/repository_push.rb +++ b/lib/gitlab/email/message/repository_push.rb @@ -46,7 +46,7 @@ module Gitlab end def diffs_count - diffs.size if diffs + diffs&.size end def compare @@ -58,7 +58,7 @@ module Gitlab end def compare_timeout - diffs.overflow? if diffs + diffs&.overflow? end def reverse_compare? diff --git a/lib/gitlab/git/blob_snippet.rb b/lib/gitlab/git/blob_snippet.rb index e98de57fc22..d7975f88aaa 100644 --- a/lib/gitlab/git/blob_snippet.rb +++ b/lib/gitlab/git/blob_snippet.rb @@ -13,7 +13,7 @@ module Gitlab end def data - lines.join("\n") if lines + lines&.join("\n") end def name diff --git a/lib/gitlab/metrics.rb b/lib/gitlab/metrics.rb index 3d1ba33ec68..857e0abf710 100644 --- a/lib/gitlab/metrics.rb +++ b/lib/gitlab/metrics.rb @@ -112,7 +112,7 @@ module Gitlab def self.tag_transaction(name, value) trans = current_transaction - trans.add_tag(name, value) if trans + trans&.add_tag(name, value) end # Sets the action of the current transaction (if any) @@ -121,7 +121,7 @@ module Gitlab def self.action=(action) trans = current_transaction - trans.action = action if trans + trans&.action = action end # Tracks an event. @@ -130,7 +130,7 @@ module Gitlab def self.add_event(*args) trans = current_transaction - trans.add_event(*args) if trans + trans&.add_event(*args) end # Returns the prefix to use for the name of a series. From 8dced28a6630014ae278a3b874ecd922364beddb Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Tue, 7 Feb 2017 10:41:02 -0500 Subject: [PATCH 062/313] Display number of shown events on Plan stage of Cycle Analytics --- .../cycle_analytics/components/stage_plan_component.js.es6 | 5 +++++ app/assets/stylesheets/pages/cycle_analytics.scss | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/cycle_analytics/components/stage_plan_component.js.es6 b/app/assets/javascripts/cycle_analytics/components/stage_plan_component.js.es6 index 513298ba4e7..b221f7384e6 100644 --- a/app/assets/javascripts/cycle_analytics/components/stage_plan_component.js.es6 +++ b/app/assets/javascripts/cycle_analytics/components/stage_plan_component.js.es6 @@ -13,6 +13,11 @@
{{ stage.description }} + + Showing {{ items.length }} events +
+ `, +}); diff --git a/app/assets/javascripts/environments/components/environment_actions.js.es6 b/app/assets/javascripts/environments/components/environment_actions.js.es6 index ed1c78945db..c5a714d9673 100644 --- a/app/assets/javascripts/environments/components/environment_actions.js.es6 +++ b/app/assets/javascripts/environments/components/environment_actions.js.es6 @@ -1,50 +1,43 @@ -/* global Vue */ +const Vue = require('vue'); -window.Vue = require('vue'); - -(() => { - window.gl = window.gl || {}; - window.gl.environmentsList = window.gl.environmentsList || {}; - - gl.environmentsList.ActionsComponent = Vue.component('actions-component', { - props: { - actions: { - type: Array, - required: false, - default: () => [], - }, - - playIconSvg: { - type: String, - required: false, - }, +module.exports = Vue.component('actions-component', { + props: { + actions: { + type: Array, + required: false, + default: () => [], }, - template: ` -
- - `, - }); -})(); +
+ `, +}); diff --git a/app/assets/javascripts/environments/components/environment_external_url.js.es6 b/app/assets/javascripts/environments/components/environment_external_url.js.es6 index 28cc0022d17..2599bba3c59 100644 --- a/app/assets/javascripts/environments/components/environment_external_url.js.es6 +++ b/app/assets/javascripts/environments/components/environment_external_url.js.es6 @@ -1,23 +1,19 @@ -/* global Vue */ +/** + * Renders the external url link in environments table. + */ +const Vue = require('vue'); -window.Vue = require('vue'); - -(() => { - window.gl = window.gl || {}; - window.gl.environmentsList = window.gl.environmentsList || {}; - - gl.environmentsList.ExternalUrlComponent = Vue.component('external-url-component', { - props: { - externalUrl: { - type: String, - default: '', - }, +module.exports = Vue.component('external-url-component', { + props: { + externalUrl: { + type: String, + default: '', }, + }, - template: ` - - - - `, - }); -})(); + template: ` + + + + `, +}); diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index ae37bc24396..cf79969471e 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -1,489 +1,481 @@ -/* global Vue */ -/* global timeago */ -window.Vue = require('vue'); -window.timeago = require('vendor/timeago'); +const Vue = require('vue'); +const Timeago = require('vendor/timeago'); require('../../lib/utils/text_utility'); require('../../vue_shared/components/commit'); -require('./environment_actions'); -require('./environment_external_url'); -require('./environment_stop'); -require('./environment_rollback'); -require('./environment_terminal_button'); +const ActionsComponent = require('./environment_actions'); +const ExternalUrlComponent = require('./environment_external_url'); +const StopComponent = require('./environment_stop'); +const RollbackComponent = require('./environment_rollback'); +const TerminalButtonComponent = require('./environment_terminal_button'); -(() => { - /** - * Envrionment Item Component - * - * Renders a table row for each environment. - */ +/** + * Envrionment Item Component + * + * Renders a table row for each environment. + */ - window.gl = window.gl || {}; - window.gl.environmentsList = window.gl.environmentsList || {}; - window.gl.environmentsList.timeagoInstance = new timeago(); // eslint-disable-line +const timeagoInstance = new Timeago(); - gl.environmentsList.EnvironmentItem = Vue.component('environment-item', { +module.exports = Vue.component('environment-item', { - components: { - 'commit-component': gl.CommitComponent, - 'actions-component': gl.environmentsList.ActionsComponent, - 'external-url-component': gl.environmentsList.ExternalUrlComponent, - 'stop-component': gl.environmentsList.StopComponent, - 'rollback-component': gl.environmentsList.RollbackComponent, - 'terminal-button-component': gl.environmentsList.TerminalButtonComponent, + components: { + 'commit-component': gl.CommitComponent, + 'actions-component': ActionsComponent, + 'external-url-component': ExternalUrlComponent, + 'stop-component': StopComponent, + 'rollback-component': RollbackComponent, + 'terminal-button-component': TerminalButtonComponent, + }, + + props: { + model: { + type: Object, + required: true, + default: () => ({}), }, - props: { - model: { - type: Object, - required: true, - default: () => ({}), - }, - - canCreateDeployment: { - type: Boolean, - required: false, - default: false, - }, - - canReadEnvironment: { - type: Boolean, - required: false, - default: false, - }, - - commitIconSvg: { - type: String, - required: false, - }, - - playIconSvg: { - type: String, - required: false, - }, - - terminalIconSvg: { - type: String, - required: false, - }, + canCreateDeployment: { + type: Boolean, + required: false, + default: false, }, - computed: { - /** - * Verifies if `last_deployment` key exists in the current Envrionment. - * This key is required to render most of the html - this method works has - * an helper. - * - * @returns {Boolean} - */ - hasLastDeploymentKey() { - if (this.model.latest.last_deployment && - !this.$options.isObjectEmpty(this.model.latest.last_deployment)) { - return true; - } - return false; - }, + canReadEnvironment: { + type: Boolean, + required: false, + default: false, + }, - /** - * Verifies is the given environment has manual actions. - * Used to verify if we should render them or nor. - * - * @returns {Boolean|Undefined} - */ - hasManualActions() { - return this.model.latest.last_deployment && - this.model.latest.last_deployment.manual_actions && - this.model.latest.last_deployment.manual_actions.length > 0; - }, + commitIconSvg: { + type: String, + required: false, + }, - /** - * Returns the value of the `stop_action?` key provided in the response. - * - * @returns {Boolean} - */ - hasStopAction() { - return this.model['stop_action?']; - }, + playIconSvg: { + type: String, + required: false, + }, - /** - * Verifies if the `deployable` key is present in `last_deployment` key. - * Used to verify whether we should or not render the rollback partial. - * - * @returns {Boolean|Undefined} - */ - canRetry() { - return this.hasLastDeploymentKey && - this.model.latest.last_deployment && - this.model.latest.last_deployment.deployable; - }, + terminalIconSvg: { + type: String, + required: false, + }, + }, - /** - * Verifies if the date to be shown is present. - * - * @returns {Boolean|Undefined} - */ - canShowDate() { - return this.model.latest.last_deployment && - this.model.latest.last_deployment.deployable && - this.model.latest.last_deployment.deployable !== undefined; - }, - - /** - * Human readable date. - * - * @returns {String} - */ - createdDate() { - return gl.environmentsList.timeagoInstance.format( - this.model.latest.last_deployment.deployable.created_at, - ); - }, - - /** - * Returns the manual actions with the name parsed. - * - * @returns {Array.|Undefined} - */ - manualActions() { - if (this.hasManualActions) { - return this.model.latest.last_deployment.manual_actions.map((action) => { - const parsedAction = { - name: gl.text.humanize(action.name), - play_path: action.play_path, - }; - return parsedAction; - }); - } - return []; - }, - - /** - * Builds the string used in the user image alt attribute. - * - * @returns {String} - */ - userImageAltDescription() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.user && - this.model.latest.last_deployment.user.username) { - return `${this.model.latest.last_deployment.user.username}'s avatar'`; - } - return ''; - }, - - /** - * If provided, returns the commit tag. - * - * @returns {String|Undefined} - */ - commitTag() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.tag) { - return this.model.latest.last_deployment.tag; - } - return undefined; - }, - - /** - * If provided, returns the commit ref. - * - * @returns {Object|Undefined} - */ - commitRef() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.ref) { - return this.model.latest.last_deployment.ref; - } - return undefined; - }, - - /** - * If provided, returns the commit url. - * - * @returns {String|Undefined} - */ - commitUrl() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.commit && - this.model.latest.last_deployment.commit.commit_path) { - return this.model.latest.last_deployment.commit.commit_path; - } - return undefined; - }, - - /** - * If provided, returns the commit short sha. - * - * @returns {String|Undefined} - */ - commitShortSha() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.commit && - this.model.latest.last_deployment.commit.short_id) { - return this.model.latest.last_deployment.commit.short_id; - } - return undefined; - }, - - /** - * If provided, returns the commit title. - * - * @returns {String|Undefined} - */ - commitTitle() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.commit && - this.model.latest.last_deployment.commit.title) { - return this.model.latest.last_deployment.commit.title; - } - return undefined; - }, - - /** - * If provided, returns the commit tag. - * - * @returns {Object|Undefined} - */ - commitAuthor() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.commit && - this.model.latest.last_deployment.commit.author) { - return this.model.latest.last_deployment.commit.author; - } - - return undefined; - }, - - /** - * Verifies if the `retry_path` key is present and returns its value. - * - * @returns {String|Undefined} - */ - retryUrl() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.deployable && - this.model.latest.last_deployment.deployable.retry_path) { - return this.model.latest.last_deployment.deployable.retry_path; - } - return undefined; - }, - - /** - * Verifies if the `last?` key is present and returns its value. - * - * @returns {Boolean|Undefined} - */ - isLastDeployment() { - return this.model.latest.last_deployment && - this.model.latest.last_deployment['last?']; - }, - - /** - * Builds the name of the builds needed to display both the name and the id. - * - * @returns {String} - */ - buildName() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.deployable) { - return `${this.model.latest.last_deployment.deployable.name} #${this.model.latest.last_deployment.deployable.id}`; - } - return ''; - }, - - /** - * Builds the needed string to show the internal id. - * - * @returns {String} - */ - deploymentInternalId() { - if (this.model.latest.last_deployment && - this.model.latest.last_deployment.iid) { - return `#${this.model.latest.last_deployment.iid}`; - } - return ''; - }, - - /** - * Verifies if the user object is present under last_deployment object. - * - * @returns {Boolean} - */ - deploymentHasUser() { - return !this.$options.isObjectEmpty(this.model.latest.last_deployment) && - !this.$options.isObjectEmpty(this.model.latest.last_deployment.user); - }, - - /** - * Returns the user object nested with the last_deployment object. - * Used to render the template. - * - * @returns {Object} - */ - deploymentUser() { - if (!this.$options.isObjectEmpty(this.model.latest.last_deployment) && - !this.$options.isObjectEmpty(this.model.latest.last_deployment.user)) { - return this.model.latest.last_deployment.user; - } - return {}; - }, - - /** - * Verifies if the build name column should be rendered by verifing - * if all the information needed is present - * and if the environment is not a folder. - * - * @returns {Boolean} - */ - shouldRenderBuildName() { - return !this.model.isFolder && - !this.$options.isObjectEmpty(this.model.latest.last_deployment) && - !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); - }, - - /** - * Verifies if deplyment internal ID should be rendered by verifing - * if all the information needed is present - * and if the environment is not a folder. - * - * @returns {Boolean} - */ - shouldRenderDeploymentID() { - return !this.model.isFolder && - !this.$options.isObjectEmpty(this.model.latest.last_deployment) && - this.model.latest.last_deployment.iid !== undefined; - }, + computed: { + /** + * Verifies if `last_deployment` key exists in the current Envrionment. + * This key is required to render most of the html - this method works has + * an helper. + * + * @returns {Boolean} + */ + hasLastDeploymentKey() { + if (this.model.latest.last_deployment && + !this.$options.isObjectEmpty(this.model.latest.last_deployment)) { + return true; + } + return false; }, /** - * Helper to verify if certain given object are empty. - * Should be replaced by lodash _.isEmpty - https://lodash.com/docs/4.17.2#isEmpty - * @param {Object} object - * @returns {Bollean} + * Verifies is the given environment has manual actions. + * Used to verify if we should render them or nor. + * + * @returns {Boolean|Undefined} */ - isObjectEmpty(object) { - for (const key in object) { // eslint-disable-line - if (hasOwnProperty.call(object, key)) { - return false; - } - } - return true; + hasManualActions() { + return this.model.latest.last_deployment && + this.model.latest.last_deployment.manual_actions && + this.model.latest.last_deployment.manual_actions.length > 0; }, - template: ` - - - + /** + * Returns the value of the `stop_action?` key provided in the response. + * + * @returns {Boolean} + */ + hasStopAction() { + return this.model['stop_action?']; + }, + + /** + * Verifies if the `deployable` key is present in `last_deployment` key. + * Used to verify whether we should or not render the rollback partial. + * + * @returns {Boolean|Undefined} + */ + canRetry() { + return this.hasLastDeploymentKey && + this.model.latest.last_deployment && + this.model.latest.last_deployment.deployable; + }, + + /** + * Verifies if the date to be shown is present. + * + * @returns {Boolean|Undefined} + */ + canShowDate() { + return this.model.latest.last_deployment && + this.model.latest.last_deployment.deployable && + this.model.latest.last_deployment.deployable !== undefined; + }, + + /** + * Human readable date. + * + * @returns {String} + */ + createdDate() { + return timeagoInstance.format(this.model.latest.last_deployment.deployable.created_at); + }, + + /** + * Returns the manual actions with the name parsed. + * + * @returns {Array.|Undefined} + */ + manualActions() { + if (this.hasManualActions) { + return this.model.latest.last_deployment.manual_actions.map((action) => { + const parsedAction = { + name: gl.text.humanize(action.name), + play_path: action.play_path, + }; + return parsedAction; + }); + } + return []; + }, + + /** + * Builds the string used in the user image alt attribute. + * + * @returns {String} + */ + userImageAltDescription() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.user && + this.model.latest.last_deployment.user.username) { + return `${this.model.latest.last_deployment.user.username}'s avatar'`; + } + return ''; + }, + + /** + * If provided, returns the commit tag. + * + * @returns {String|Undefined} + */ + commitTag() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.tag) { + return this.model.latest.last_deployment.tag; + } + return undefined; + }, + + /** + * If provided, returns the commit ref. + * + * @returns {Object|Undefined} + */ + commitRef() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.ref) { + return this.model.latest.last_deployment.ref; + } + return undefined; + }, + + /** + * If provided, returns the commit url. + * + * @returns {String|Undefined} + */ + commitUrl() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.commit && + this.model.latest.last_deployment.commit.commit_path) { + return this.model.latest.last_deployment.commit.commit_path; + } + return undefined; + }, + + /** + * If provided, returns the commit short sha. + * + * @returns {String|Undefined} + */ + commitShortSha() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.commit && + this.model.latest.last_deployment.commit.short_id) { + return this.model.latest.last_deployment.commit.short_id; + } + return undefined; + }, + + /** + * If provided, returns the commit title. + * + * @returns {String|Undefined} + */ + commitTitle() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.commit && + this.model.latest.last_deployment.commit.title) { + return this.model.latest.last_deployment.commit.title; + } + return undefined; + }, + + /** + * If provided, returns the commit tag. + * + * @returns {Object|Undefined} + */ + commitAuthor() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.commit && + this.model.latest.last_deployment.commit.author) { + return this.model.latest.last_deployment.commit.author; + } + + return undefined; + }, + + /** + * Verifies if the `retry_path` key is present and returns its value. + * + * @returns {String|Undefined} + */ + retryUrl() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.deployable && + this.model.latest.last_deployment.deployable.retry_path) { + return this.model.latest.last_deployment.deployable.retry_path; + } + return undefined; + }, + + /** + * Verifies if the `last?` key is present and returns its value. + * + * @returns {Boolean|Undefined} + */ + isLastDeployment() { + return this.model.latest.last_deployment && + this.model.latest.last_deployment['last?']; + }, + + /** + * Builds the name of the builds needed to display both the name and the id. + * + * @returns {String} + */ + buildName() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.deployable) { + return `${this.model.latest.last_deployment.deployable.name} #${this.model.latest.last_deployment.deployable.id}`; + } + return ''; + }, + + /** + * Builds the needed string to show the internal id. + * + * @returns {String} + */ + deploymentInternalId() { + if (this.model.latest.last_deployment && + this.model.latest.last_deployment.iid) { + return `#${this.model.latest.last_deployment.iid}`; + } + return ''; + }, + + /** + * Verifies if the user object is present under last_deployment object. + * + * @returns {Boolean} + */ + deploymentHasUser() { + return !this.$options.isObjectEmpty(this.model.latest.last_deployment) && + !this.$options.isObjectEmpty(this.model.latest.last_deployment.user); + }, + + /** + * Returns the user object nested with the last_deployment object. + * Used to render the template. + * + * @returns {Object} + */ + deploymentUser() { + if (!this.$options.isObjectEmpty(this.model.latest.last_deployment) && + !this.$options.isObjectEmpty(this.model.latest.last_deployment.user)) { + return this.model.latest.last_deployment.user; + } + return {}; + }, + + /** + * Verifies if the build name column should be rendered by verifing + * if all the information needed is present + * and if the environment is not a folder. + * + * @returns {Boolean} + */ + shouldRenderBuildName() { + return !this.model.isFolder && + !this.$options.isObjectEmpty(this.model.latest.last_deployment) && + !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); + }, + + /** + * Verifies if deplyment internal ID should be rendered by verifing + * if all the information needed is present + * and if the environment is not a folder. + * + * @returns {Boolean} + */ + shouldRenderDeploymentID() { + return !this.model.isFolder && + !this.$options.isObjectEmpty(this.model.latest.last_deployment) && + this.model.latest.last_deployment.iid !== undefined; + }, + }, + + /** + * Helper to verify if certain given object are empty. + * Should be replaced by lodash _.isEmpty - https://lodash.com/docs/4.17.2#isEmpty + * @param {Object} object + * @returns {Bollean} + */ + isObjectEmpty(object) { + for (const key in object) { // eslint-disable-line + if (hasOwnProperty.call(object, key)) { + return false; + } + } + return true; + }, + + template: ` + + + + {{model.name}} + + + + + + + + {{model.name}} - - - - - - - - - {{model.name}} - - - - {{model.size}} - - - - - - - {{deploymentInternalId}} - - by - - - + + {{model.size}} - + + - - - {{buildName}} + + + {{deploymentInternalId}} + + + + by + + - + + - -
- - + + + {{buildName}} + + + + +
+ + +
+

+ No deployments yet +

+ + + + + {{createdDate}} + + + + +
+
+ +
-

- No deployments yet -

- - - - {{createdDate}} - - - - -
-
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
+
+ +
- - - `, - }); -})(); + +
+ + +
+ +
+ + +
+ +
+ + +
+
+ + + `, +}); diff --git a/app/assets/javascripts/environments/components/environment_rollback.js.es6 b/app/assets/javascripts/environments/components/environment_rollback.js.es6 index 5938340a128..daf126eb4e8 100644 --- a/app/assets/javascripts/environments/components/environment_rollback.js.es6 +++ b/app/assets/javascripts/environments/components/environment_rollback.js.es6 @@ -1,33 +1,30 @@ -/* global Vue */ +/** + * Renders Rollback or Re deploy button in environments table depending + * of the provided property `isLastDeployment` + */ +const Vue = require('vue'); -window.Vue = require('vue'); - -(() => { - window.gl = window.gl || {}; - window.gl.environmentsList = window.gl.environmentsList || {}; - - gl.environmentsList.RollbackComponent = Vue.component('rollback-component', { - props: { - retryUrl: { - type: String, - default: '', - }, - - isLastDeployment: { - type: Boolean, - default: true, - }, +module.exports = Vue.component('rollback-component', { + props: { + retryUrl: { + type: String, + default: '', }, - template: ` - - - Re-deploy - - - Rollback - - - `, - }); -})(); + isLastDeployment: { + type: Boolean, + default: true, + }, + }, + + template: ` + + + Re-deploy + + + Rollback + + + `, +}); diff --git a/app/assets/javascripts/environments/components/environment_stop.js.es6 b/app/assets/javascripts/environments/components/environment_stop.js.es6 index be9526989a0..96983a19568 100644 --- a/app/assets/javascripts/environments/components/environment_stop.js.es6 +++ b/app/assets/javascripts/environments/components/environment_stop.js.es6 @@ -1,27 +1,24 @@ -/* global Vue */ +/** + * Renders the stop "button" that allows stop an environment. + * Used in environments table. + */ +const Vue = require('vue'); -window.Vue = require('vue'); - -(() => { - window.gl = window.gl || {}; - window.gl.environmentsList = window.gl.environmentsList || {}; - - gl.environmentsList.StopComponent = Vue.component('stop-component', { - props: { - stopUrl: { - type: String, - default: '', - }, +module.exports = Vue.component('stop-component', { + props: { + stopUrl: { + type: String, + default: '', }, + }, - template: ` - - - - `, - }); -})(); + template: ` + + + + `, +}); diff --git a/app/assets/javascripts/environments/components/environment_terminal_button.js.es6 b/app/assets/javascripts/environments/components/environment_terminal_button.js.es6 index a3ad063f7cb..481e0d15e7a 100644 --- a/app/assets/javascripts/environments/components/environment_terminal_button.js.es6 +++ b/app/assets/javascripts/environments/components/environment_terminal_button.js.es6 @@ -1,28 +1,25 @@ -/* global Vue */ +/** + * Renders a terminal button to open a web terminal. + * Used in environments table. + */ +const Vue = require('vue'); -window.Vue = require('vue'); - -(() => { - window.gl = window.gl || {}; - window.gl.environmentsList = window.gl.environmentsList || {}; - - gl.environmentsList.TerminalButtonComponent = Vue.component('terminal-button-component', { - props: { - terminalPath: { - type: String, - default: '', - }, - terminalIconSvg: { - type: String, - default: '', - }, +module.exports = Vue.component('terminal-button-component', { + props: { + terminalPath: { + type: String, + default: '', }, + terminalIconSvg: { + type: String, + default: '', + }, + }, - template: ` - - - - `, - }); -})(); + template: ` + + + + `, +}); diff --git a/app/assets/javascripts/environments/environments_bundle.js.es6 b/app/assets/javascripts/environments/environments_bundle.js.es6 index 912f50aeec1..867eba1d384 100644 --- a/app/assets/javascripts/environments/environments_bundle.js.es6 +++ b/app/assets/javascripts/environments/environments_bundle.js.es6 @@ -1,5 +1,4 @@ -window.Vue = require('vue'); -require('./components/environment'); +const EnvironmentsComponent = require('./components/environment'); require('../vue_shared/vue_resource_interceptor'); $(() => { @@ -9,7 +8,7 @@ $(() => { gl.EnvironmentsListApp.$destroy(true); } - gl.EnvironmentsListApp = new gl.environmentsList.EnvironmentsComponent({ + gl.EnvironmentsListApp = new EnvironmentsComponent({ el: document.querySelector('#environments-list-view'), }); }); diff --git a/app/assets/javascripts/environments/services/environments_service.js.es6 b/app/assets/javascripts/environments/services/environments_service.js.es6 index 9b33fd02c53..9cef335868e 100644 --- a/app/assets/javascripts/environments/services/environments_service.js.es6 +++ b/app/assets/javascripts/environments/services/environments_service.js.es6 @@ -1,4 +1,4 @@ -const Vue = window.Vue = require('vue'); +const Vue = require('vue'); class EnvironmentsService { constructor(endpoint) { diff --git a/app/assets/javascripts/vue_shared/components/commit.js.es6 b/app/assets/javascripts/vue_shared/components/commit.js.es6 index 7f7c18ddeb1..ff88e236829 100644 --- a/app/assets/javascripts/vue_shared/components/commit.js.es6 +++ b/app/assets/javascripts/vue_shared/components/commit.js.es6 @@ -1,4 +1,5 @@ /* global Vue */ +window.Vue = require('vue'); (() => { window.gl = window.gl || {}; diff --git a/spec/javascripts/environments/environment_actions_spec.js.es6 b/spec/javascripts/environments/environment_actions_spec.js.es6 index b1838045a06..850586f9f3a 100644 --- a/spec/javascripts/environments/environment_actions_spec.js.es6 +++ b/spec/javascripts/environments/environment_actions_spec.js.es6 @@ -1,4 +1,4 @@ -require('~/environments/components/environment_actions'); +const ActionsComponent = require('~/environments/components/environment_actions'); describe('Actions Component', () => { preloadFixtures('static/environments/element.html.raw'); @@ -19,7 +19,7 @@ describe('Actions Component', () => { }, ]; - const component = new window.gl.environmentsList.ActionsComponent({ + const component = new ActionsComponent({ el: document.querySelector('.test-dom-element'), propsData: { actions: actionsMock, @@ -47,7 +47,7 @@ describe('Actions Component', () => { }, ]; - const component = new window.gl.environmentsList.ActionsComponent({ + const component = new ActionsComponent({ el: document.querySelector('.test-dom-element'), propsData: { actions: actionsMock, diff --git a/spec/javascripts/environments/environment_external_url_spec.js.es6 b/spec/javascripts/environments/environment_external_url_spec.js.es6 index a6a587e69f5..393dbb5aae0 100644 --- a/spec/javascripts/environments/environment_external_url_spec.js.es6 +++ b/spec/javascripts/environments/environment_external_url_spec.js.es6 @@ -1,4 +1,4 @@ -require('~/environments/components/environment_external_url'); +const ExternalUrlComponent = require('~/environments/components/environment_external_url'); describe('External URL Component', () => { preloadFixtures('static/environments/element.html.raw'); @@ -8,7 +8,7 @@ describe('External URL Component', () => { it('should link to the provided externalUrl prop', () => { const externalURL = 'https://gitlab.com'; - const component = new window.gl.environmentsList.ExternalUrlComponent({ + const component = new ExternalUrlComponent({ el: document.querySelector('.test-dom-element'), propsData: { externalUrl: externalURL, diff --git a/spec/javascripts/environments/environment_item_spec.js.es6 b/spec/javascripts/environments/environment_item_spec.js.es6 index 5dc7ef5ad76..dd614e50d7f 100644 --- a/spec/javascripts/environments/environment_item_spec.js.es6 +++ b/spec/javascripts/environments/environment_item_spec.js.es6 @@ -1,7 +1,7 @@ window.timeago = require('vendor/timeago'); -require('~/environments/components/environment_item'); +const EnvironmentItem = require('~/environments/components/environment_item'); -fdescribe('Environment item', () => { +describe('Environment item', () => { preloadFixtures('static/environments/table.html.raw'); beforeEach(() => { loadFixtures('static/environments/table.html.raw'); @@ -21,7 +21,7 @@ fdescribe('Environment item', () => { }, }; - component = new window.gl.environmentsList.EnvironmentItem({ + component = new EnvironmentItem({ el: document.querySelector('tr#environment-row'), propsData: { model: mockItem, @@ -111,7 +111,7 @@ fdescribe('Environment item', () => { }, }; - component = new window.gl.environmentsList.EnvironmentItem({ + component = new EnvironmentItem({ el: document.querySelector('tr#environment-row'), propsData: { model: environment, diff --git a/spec/javascripts/environments/environment_rollback_spec.js.es6 b/spec/javascripts/environments/environment_rollback_spec.js.es6 index 043b8708a6e..4a596baad09 100644 --- a/spec/javascripts/environments/environment_rollback_spec.js.es6 +++ b/spec/javascripts/environments/environment_rollback_spec.js.es6 @@ -1,4 +1,4 @@ -require('~/environments/components/environment_rollback'); +const RollbackComponent = require('~/environments/components/environment_rollback'); describe('Rollback Component', () => { preloadFixtures('static/environments/element.html.raw'); @@ -10,7 +10,7 @@ describe('Rollback Component', () => { }); it('Should link to the provided retryUrl', () => { - const component = new window.gl.environmentsList.RollbackComponent({ + const component = new RollbackComponent({ el: document.querySelector('.test-dom-element'), propsData: { retryUrl: retryURL, @@ -22,7 +22,7 @@ describe('Rollback Component', () => { }); it('Should render Re-deploy label when isLastDeployment is true', () => { - const component = new window.gl.environmentsList.RollbackComponent({ + const component = new RollbackComponent({ el: document.querySelector('.test-dom-element'), propsData: { retryUrl: retryURL, @@ -34,7 +34,7 @@ describe('Rollback Component', () => { }); it('Should render Rollback label when isLastDeployment is false', () => { - const component = new window.gl.environmentsList.RollbackComponent({ + const component = new RollbackComponent({ el: document.querySelector('.test-dom-element'), propsData: { retryUrl: retryURL, diff --git a/spec/javascripts/environments/environment_spec.js.es6 b/spec/javascripts/environments/environment_spec.js.es6 index 8b96f4b09db..1d1a688a4a5 100644 --- a/spec/javascripts/environments/environment_spec.js.es6 +++ b/spec/javascripts/environments/environment_spec.js.es6 @@ -1,7 +1,6 @@ -/* global Vue, environment */ - +const Vue = require('vue'); require('~/flash'); -require('~/environments/components/environment'); +const EnvironmentsComponent = require('~/environments/components/environment'); const { environment } = require('./mock_data'); describe('Environment', () => { @@ -32,7 +31,7 @@ describe('Environment', () => { }); it('should render the empty state', (done) => { - component = new gl.environmentsList.EnvironmentsComponent({ + component = new EnvironmentsComponent({ el: document.querySelector('#environments-list-view'), }); @@ -72,7 +71,7 @@ describe('Environment', () => { }); it('should render a table with environments', (done) => { - component = new gl.environmentsList.EnvironmentsComponent({ + component = new EnvironmentsComponent({ el: document.querySelector('#environments-list-view'), }); @@ -104,7 +103,7 @@ describe('Environment', () => { }); it('should render empty state', (done) => { - component = new gl.environmentsList.EnvironmentsComponent({ + component = new EnvironmentsComponent({ el: document.querySelector('#environments-list-view'), }); diff --git a/spec/javascripts/environments/environment_stop_spec.js.es6 b/spec/javascripts/environments/environment_stop_spec.js.es6 index 2dfce5ba824..5ca65b1debc 100644 --- a/spec/javascripts/environments/environment_stop_spec.js.es6 +++ b/spec/javascripts/environments/environment_stop_spec.js.es6 @@ -1,4 +1,4 @@ -require('~/environments/components/environment_stop'); +const StopComponent = require('~/environments/components/environment_stop'); describe('Stop Component', () => { preloadFixtures('static/environments/element.html.raw'); @@ -10,7 +10,7 @@ describe('Stop Component', () => { loadFixtures('static/environments/element.html.raw'); stopURL = '/stop'; - component = new window.gl.environmentsList.StopComponent({ + component = new StopComponent({ el: document.querySelector('.test-dom-element'), propsData: { stopUrl: stopURL, From 19bac884c67acebcc0e6dda2a3df824049b1f726 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 7 Feb 2017 15:06:31 +0100 Subject: [PATCH 078/313] Add route for environment folder and expose an API --- .../projects/environments_controller.rb | 18 ++++++++++++++++++ config/routes/project.rb | 4 ++++ 2 files changed, 22 insertions(+) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 2252ece68ce..3b7240d8469 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -28,6 +28,24 @@ class Projects::EnvironmentsController < Projects::ApplicationController end end + def folder + @environments = project.environments + .where(environment_type: params[:id]) + .with_state(params[:scope] || :available) + + respond_to do |format| + format.html + format.json do + render json: { + environments: EnvironmentSerializer + .new(project: @project, user: @current_user) + .with_pagination(request, response) + .represent(@environments), + } + end + end + end + def show @deployments = environment.deployments.order(id: :desc).page(params[:page]) end diff --git a/config/routes/project.rb b/config/routes/project.rb index 2ac98cf3842..84f123ff717 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -156,6 +156,10 @@ constraints(ProjectUrlConstrainer.new) do get :terminal get '/terminal.ws/authorize', to: 'environments#terminal_websocket_authorize', constraints: { format: nil } end + + collection do + get :folder, path: 'folders/:id' + end end resource :cycle_analytics, only: [:show] From 7a08456ee04fe3fddbc320dee7ea10b8b03b1c3b Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 9 Feb 2017 14:28:47 +0000 Subject: [PATCH 079/313] Updated issue boards docs --- .../img/issue_board_search_backlog.png | Bin 9769 -> 0 bytes .../img/issue_board_welcome_message.png | Bin 97419 -> 120751 bytes .../img/issue_boards_add_issues_modal.png | Bin 0 -> 211661 bytes doc/user/project/issue_board.md | 30 ++++++++---------- 4 files changed, 13 insertions(+), 17 deletions(-) delete mode 100644 doc/user/project/img/issue_board_search_backlog.png create mode 100644 doc/user/project/img/issue_boards_add_issues_modal.png diff --git a/doc/user/project/img/issue_board_search_backlog.png b/doc/user/project/img/issue_board_search_backlog.png deleted file mode 100644 index fbb67b9c18f184e70ae165de497fd921f19a2962..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9769 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 T^_V90t% diff --git a/doc/user/project/img/issue_board_welcome_message.png b/doc/user/project/img/issue_board_welcome_message.png index 5bfdac88ddeadece631cfbc577cc215bc176f7dd..5318e6ea4a9071175ed8c695be157856bc899ec2 100644 GIT binary patch literal 120751 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 M$f?Rgo|wP=e_xG)`2YX_ literal 97419 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 diff --git a/doc/user/project/img/issue_boards_add_issues_modal.png b/doc/user/project/img/issue_boards_add_issues_modal.png new file mode 100644 index 0000000000000000000000000000000000000000..cb653ced7fedc11592ae2c099947f46ed27f401d GIT binary patch literal 211661 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

VJ(k%7 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

D7MhLsej>v1V0rHdh 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%0Ds`g2;eDsSd-!G`3j#rwmo8N0emZ5d4hb zh+;ZGKv4%Mj$;ZZNdxjuuH+K+>vTrqT@_v9?}leGr}D30ljH7|P~$t8d3Rv$X?w|_ zT;f@8qc;{F&~}kMs7~u7l6mbOWpBK0@j($hk@Ptg2Ym9Fs{Lrka0L+yEQC zLe$?V8~hi37N?oX{9074ecE51RoXF~xM{sHk7wk?00dT-Bc(bud&HY=w^yu$j($R6 z{#c@wYQ2X%2=8GL{#GVPEIo4&dFJT0ash-qJ1C4$(G?h2a)#N6=mk0eBKqn?E%rC;`X?Ic4e|@R??gzH`Zws_^A~jApfC2%!_glY zJdO$gWry%=w7~jXCjP>|?|wn|9k>!&0zhffL8GIi<}P4grF=?Y3eS0OzYPlhgASiz zvd*`-)8P1l^BY6>(P&KZ4c<=! zO5fg#&ISJKn6JnRbXPzkDJR`A-4b`Z*>Gj;|2jk-wMpfJO#Y@+Uz)B=Qvpn7glqND zUPNYXZS5BxFDVII`W1W^=hb!Hx2l8$I2SC ze_2#32Oq`?Q@b3tsQZ6F%YZI+(7}sB9U;zf13F}$gy$x6)bxDSmW~-4S&0k z|CX8b2h+WKeo5R#-W|-rG Date: Thu, 9 Feb 2017 14:36:03 +0000 Subject: [PATCH 080/313] Documented removing issue --- .../project/img/issue_boards_remove_issue.png | Bin 0 -> 135168 bytes doc/user/project/issue_board.md | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 doc/user/project/img/issue_boards_remove_issue.png diff --git a/doc/user/project/img/issue_boards_remove_issue.png b/doc/user/project/img/issue_boards_remove_issue.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3beca97cf51bfc9dde9bf3a66a6647e3a327cb GIT binary patch literal 135168 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%0DqK2a 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 V(qtw+n}mUWq{S7)%0vwO{|}!GW_|zw literal 0 HcmV?d00001 diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md index 7738f504922..e7584bc1b83 100644 --- a/doc/user/project/issue_board.md +++ b/doc/user/project/issue_board.md @@ -107,6 +107,14 @@ You can filter by author, assignee, milestone and label. ![Bulk adding issues to lists](img/issue_boards_add_issues_modal.png) +## Removing issue from list + +Removing an issue from a list can be done by clicking the issue card and then +clicking the **Remove from board** in the sidebar. Doing this keeps the issue +open buts removes it from that list. + +![Remove issue from list](img/issue_boards_remove_issue.png) + ## Filtering issues You should be able to use the filters on top of your Issue Board to show only From 2bd1a229060c959a177171ddbb32d1f2202b4801 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 9 Feb 2017 15:51:49 +0000 Subject: [PATCH 081/313] Disables add issue button Previously was disabled until any list was present (except for done) this now takes into account the welcome blank state Closes #27931 --- app/assets/javascripts/boards/boards_bundle.js.es6 | 2 +- spec/features/boards/boards_spec.rb | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/assets/javascripts/boards/boards_bundle.js.es6 b/app/assets/javascripts/boards/boards_bundle.js.es6 index 8f30900198e..878ad1b6031 100644 --- a/app/assets/javascripts/boards/boards_bundle.js.es6 +++ b/app/assets/javascripts/boards/boards_bundle.js.es6 @@ -95,7 +95,7 @@ $(() => { }, computed: { disabled() { - return Store.shouldAddBlankState(); + return !this.store.lists.filter(list => list.type !== 'blank' && list.type !== 'done').length; }, }, template: ` diff --git a/spec/features/boards/boards_spec.rb b/spec/features/boards/boards_spec.rb index 7225f38b7e5..1b25b51cfb2 100644 --- a/spec/features/boards/boards_spec.rb +++ b/spec/features/boards/boards_spec.rb @@ -28,6 +28,12 @@ describe 'Issue Boards', feature: true, js: true do expect(page).to have_content('Welcome to your Issue Board!') end + it 'disables add issues button by default' do + button = page.find('.issue-boards-search button', text: 'Add issues') + + expect(button[:disabled]).to eq true + end + it 'hides the blank state when clicking nevermind button' do page.within(find('.board-blank-state')) do click_button("Nevermind, I'll use my own") From 125b7232392c939f923cd2d08e714ab6ac699989 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Thu, 9 Feb 2017 16:02:57 +0000 Subject: [PATCH 082/313] Added missing filter word --- doc/user/project/issue_board.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md index e7584bc1b83..3dcdc181d3d 100644 --- a/doc/user/project/issue_board.md +++ b/doc/user/project/issue_board.md @@ -100,8 +100,8 @@ add these issues to the selected list. By default the first list is selected, but this can be changed in the dropdown menu next to the **Add issues** button in the modal. -Within this modal you can also issues. This is done by using the filters at the -top of the modal. +Within this modal you can also filter issues. This is done by using the filters +at the top of the modal. You can filter by author, assignee, milestone and label. From 5d0c5663a0368545653be3992c364eea74830062 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Thu, 9 Feb 2017 16:36:32 +0000 Subject: [PATCH 083/313] Adds `.json` to the endpoint requested in order to avoid showing JSON --- .../javascripts/commit/pipelines/pipelines_service.js.es6 | 2 +- .../27932-merge-request-pipelines-displays-json.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27932-merge-request-pipelines-displays-json.yml diff --git a/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 b/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 index 483b414126a..e9cae893857 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 +++ b/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 @@ -9,7 +9,7 @@ */ class PipelinesService { constructor(endpoint) { - this.pipelines = Vue.resource(endpoint); + this.pipelines = Vue.resource(`${endpoint}.json`); } /** diff --git a/changelogs/unreleased/27932-merge-request-pipelines-displays-json.yml b/changelogs/unreleased/27932-merge-request-pipelines-displays-json.yml new file mode 100644 index 00000000000..b7505e28401 --- /dev/null +++ b/changelogs/unreleased/27932-merge-request-pipelines-displays-json.yml @@ -0,0 +1,4 @@ +--- +title: Fix Merge request pipelines displays JSON +merge_request: +author: From 482e7ff01201dba89a13f5e9979ea17c202c87c7 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Thu, 9 Feb 2017 17:32:08 +0000 Subject: [PATCH 084/313] Fix broken test and linter error --- .../javascripts/environments/components/environment_item.js.es6 | 2 +- spec/javascripts/environments/mock_data.js.es6 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index cf79969471e..d0c5a343d71 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -97,7 +97,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean} */ hasStopAction() { - return this.model['stop_action?']; + return this.model.latest['stop_action?']; }, /** diff --git a/spec/javascripts/environments/mock_data.js.es6 b/spec/javascripts/environments/mock_data.js.es6 index bdecc95d219..081897f5456 100644 --- a/spec/javascripts/environments/mock_data.js.es6 +++ b/spec/javascripts/environments/mock_data.js.es6 @@ -55,5 +55,5 @@ const environment = { module.exports = { environmentsList, - environment + environment, }; From 0b14b654b6e5d936f7241dcc0c249e0d4cc42728 Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Mon, 23 Jan 2017 18:40:25 -0200 Subject: [PATCH 085/313] Gather issuable metadata to avoid n+ queries on index view --- .../concerns/issuable_collections.rb | 22 +++++++ app/controllers/concerns/issues_action.rb | 3 + .../concerns/merge_requests_action.rb | 3 + app/controllers/projects/issues_controller.rb | 7 ++- .../projects/merge_requests_controller.rb | 7 ++- app/models/award_emoji.rb | 8 +++ app/models/concerns/issuable.rb | 5 ++ app/models/note.rb | 6 ++ app/views/projects/issues/_issue.html.haml | 17 +----- .../merge_requests/_merge_request.html.haml | 17 +----- .../shared/_issuable_meta_data.html.haml | 19 +++++++ changelogs/unreleased/issue_25900.yml | 4 ++ spec/controllers/dashboard_controller_spec.rb | 19 +++++++ .../projects/issues_controller_spec.rb | 2 + .../merge_requests_controller_spec.rb | 4 ++ spec/features/issuables/issuable_list_spec.rb | 57 +++++++++++++++++++ ...issuables_list_metadata_shared_examples.rb | 35 ++++++++++++ 17 files changed, 199 insertions(+), 36 deletions(-) create mode 100644 app/views/shared/_issuable_meta_data.html.haml create mode 100644 changelogs/unreleased/issue_25900.yml create mode 100644 spec/controllers/dashboard_controller_spec.rb create mode 100644 spec/features/issuables/issuable_list_spec.rb create mode 100644 spec/support/issuables_list_metadata_shared_examples.rb diff --git a/app/controllers/concerns/issuable_collections.rb b/app/controllers/concerns/issuable_collections.rb index 6247934f81e..a6e158ebae6 100644 --- a/app/controllers/concerns/issuable_collections.rb +++ b/app/controllers/concerns/issuable_collections.rb @@ -9,6 +9,28 @@ module IssuableCollections private + def issuable_meta_data(issuable_collection) + # map has to be used here since using pluck or select will + # throw an error when ordering issuables by priority which inserts + # a new order into the collection. + # We cannot use reorder to not mess up the paginated collection. + issuable_ids = issuable_collection.map(&:id) + issuable_note_count = Note.count_for_collection(issuable_ids, @collection_type) + issuable_votes_count = AwardEmoji.votes_for_collection(issuable_ids, @collection_type) + + issuable_ids.each_with_object({}) do |id, issuable_meta| + downvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.downvote? } + upvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.upvote? } + notes = issuable_note_count.find { |notes| notes.noteable_id == id } + + issuable_meta[id] = Issuable::IssuableMeta.new( + upvotes.try(:count).to_i, + downvotes.try(:count).to_i, + notes.try(:count).to_i + ) + end + end + def issues_collection issues_finder.execute.preload(:project, :author, :assignee, :labels, :milestone, project: :namespace) end diff --git a/app/controllers/concerns/issues_action.rb b/app/controllers/concerns/issues_action.rb index b46adcceb60..fb5edb34370 100644 --- a/app/controllers/concerns/issues_action.rb +++ b/app/controllers/concerns/issues_action.rb @@ -9,6 +9,9 @@ module IssuesAction .non_archived .page(params[:page]) + @collection_type = "Issue" + @issuable_meta_data = issuable_meta_data(@issues) + respond_to do |format| format.html format.atom { render layout: false } diff --git a/app/controllers/concerns/merge_requests_action.rb b/app/controllers/concerns/merge_requests_action.rb index fdb05bb3228..6229759dcf1 100644 --- a/app/controllers/concerns/merge_requests_action.rb +++ b/app/controllers/concerns/merge_requests_action.rb @@ -7,6 +7,9 @@ module MergeRequestsAction @merge_requests = merge_requests_collection .page(params[:page]) + + @collection_type = "MergeRequest" + @issuable_meta_data = issuable_meta_data(@merge_requests) end private diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index c75b8987a4b..744a4af1c51 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -23,8 +23,11 @@ class Projects::IssuesController < Projects::ApplicationController respond_to :html def index - @issues = issues_collection - @issues = @issues.page(params[:page]) + @collection_type = "Issue" + @issues = issues_collection + @issues = @issues.page(params[:page]) + @issuable_meta_data = issuable_meta_data(@issues) + if @issues.out_of_range? && @issues.total_pages != 0 return redirect_to url_for(params.merge(page: @issues.total_pages)) end diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index fbad66c5c40..c3e1760f168 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -36,8 +36,11 @@ class Projects::MergeRequestsController < Projects::ApplicationController before_action :authorize_can_resolve_conflicts!, only: [:conflicts, :conflict_for_path, :resolve_conflicts] def index - @merge_requests = merge_requests_collection - @merge_requests = @merge_requests.page(params[:page]) + @collection_type = "MergeRequest" + @merge_requests = merge_requests_collection + @merge_requests = @merge_requests.page(params[:page]) + @issuable_meta_data = issuable_meta_data(@merge_requests) + if @merge_requests.out_of_range? && @merge_requests.total_pages != 0 return redirect_to url_for(params.merge(page: @merge_requests.total_pages)) end diff --git a/app/models/award_emoji.rb b/app/models/award_emoji.rb index 46b17479d6d..6937ad3bdd9 100644 --- a/app/models/award_emoji.rb +++ b/app/models/award_emoji.rb @@ -16,6 +16,14 @@ class AwardEmoji < ActiveRecord::Base scope :downvotes, -> { where(name: DOWNVOTE_NAME) } scope :upvotes, -> { where(name: UPVOTE_NAME) } + class << self + def votes_for_collection(ids, type) + select('name', 'awardable_id', 'COUNT(*) as count'). + where('name IN (?) AND awardable_type = ? AND awardable_id IN (?)', [DOWNVOTE_NAME, UPVOTE_NAME], type, ids). + group('name', 'awardable_id') + end + end + def downvote? self.name == DOWNVOTE_NAME end diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb index 3517969eabc..bfb54e878fc 100644 --- a/app/models/concerns/issuable.rb +++ b/app/models/concerns/issuable.rb @@ -15,6 +15,11 @@ module Issuable include Taskable include TimeTrackable + # This object is used to gather issuable meta data for displaying + # upvotes, downvotes and notes count for issues and merge requests + # lists avoiding n+1 queries and improving performance. + IssuableMeta = Struct.new(:upvotes, :downvotes, :notes_count) + included do cache_markdown_field :title, pipeline: :single_line cache_markdown_field :description diff --git a/app/models/note.rb b/app/models/note.rb index bf090a0438c..029fe667a45 100644 --- a/app/models/note.rb +++ b/app/models/note.rb @@ -108,6 +108,12 @@ class Note < ActiveRecord::Base Discussion.for_diff_notes(active_notes). map { |d| [d.line_code, d] }.to_h end + + def count_for_collection(ids, type) + user.select('noteable_id', 'COUNT(*) as count'). + group(:noteable_id). + where(noteable_type: type, noteable_id: ids) + end end def cross_reference? diff --git a/app/views/projects/issues/_issue.html.haml b/app/views/projects/issues/_issue.html.haml index 5c9839cb330..0e3902c066a 100644 --- a/app/views/projects/issues/_issue.html.haml +++ b/app/views/projects/issues/_issue.html.haml @@ -17,22 +17,7 @@ %li = link_to_member(@project, issue.assignee, name: false, title: "Assigned to :name") - - upvotes, downvotes = issue.upvotes, issue.downvotes - - if upvotes > 0 - %li - = icon('thumbs-up') - = upvotes - - - if downvotes > 0 - %li - = icon('thumbs-down') - = downvotes - - - note_count = issue.notes.user.count - %li - = link_to issue_path(issue, anchor: 'notes'), class: ('no-comments' if note_count.zero?) do - = icon('comments') - = note_count + = render 'shared/issuable_meta_data', issuable: issue .issue-info #{issuable_reference(issue)} · diff --git a/app/views/projects/merge_requests/_merge_request.html.haml b/app/views/projects/merge_requests/_merge_request.html.haml index a5fbe9d6128..11b7aaec704 100644 --- a/app/views/projects/merge_requests/_merge_request.html.haml +++ b/app/views/projects/merge_requests/_merge_request.html.haml @@ -29,22 +29,7 @@ %li = link_to_member(merge_request.source_project, merge_request.assignee, name: false, title: "Assigned to :name") - - upvotes, downvotes = merge_request.upvotes, merge_request.downvotes - - if upvotes > 0 - %li - = icon('thumbs-up') - = upvotes - - - if downvotes > 0 - %li - = icon('thumbs-down') - = downvotes - - - note_count = merge_request.related_notes.user.count - %li - = link_to merge_request_path(merge_request, anchor: 'notes'), class: ('no-comments' if note_count.zero?) do - = icon('comments') - = note_count + = render 'shared/issuable_meta_data', issuable: merge_request .merge-request-info #{issuable_reference(merge_request)} · diff --git a/app/views/shared/_issuable_meta_data.html.haml b/app/views/shared/_issuable_meta_data.html.haml new file mode 100644 index 00000000000..1264e524d86 --- /dev/null +++ b/app/views/shared/_issuable_meta_data.html.haml @@ -0,0 +1,19 @@ +- note_count = @issuable_meta_data[issuable.id].notes_count +- issue_votes = @issuable_meta_data[issuable.id] +- upvotes, downvotes = issue_votes.upvotes, issue_votes.downvotes +- issuable_url = @collection_type == "Issue" ? issue_path(issuable, anchor: 'notes') : merge_request_path(issuable, anchor: 'notes') + +- if upvotes > 0 + %li + = icon('thumbs-up') + = upvotes + +- if downvotes > 0 + %li + = icon('thumbs-down') + = downvotes + +%li + = link_to issuable_url, class: ('no-comments' if note_count.zero?) do + = icon('comments') + = note_count diff --git a/changelogs/unreleased/issue_25900.yml b/changelogs/unreleased/issue_25900.yml new file mode 100644 index 00000000000..b4b72b8a20c --- /dev/null +++ b/changelogs/unreleased/issue_25900.yml @@ -0,0 +1,4 @@ +--- +title: Gather issuable metadata to avoid n+1 queries on index view +merge_request: +author: diff --git a/spec/controllers/dashboard_controller_spec.rb b/spec/controllers/dashboard_controller_spec.rb new file mode 100644 index 00000000000..566d8515198 --- /dev/null +++ b/spec/controllers/dashboard_controller_spec.rb @@ -0,0 +1,19 @@ +require 'spec_helper' + +describe DashboardController do + let(:user) { create(:user) } + let(:project) { create(:project) } + + before do + project.team << [user, :master] + sign_in(user) + end + + describe 'GET issues' do + it_behaves_like 'issuables list meta-data', :issue, :issues + end + + describe 'GET merge requests' do + it_behaves_like 'issuables list meta-data', :merge_request, :merge_requests + end +end diff --git a/spec/controllers/projects/issues_controller_spec.rb b/spec/controllers/projects/issues_controller_spec.rb index 4b89381eb96..e576bf9ef79 100644 --- a/spec/controllers/projects/issues_controller_spec.rb +++ b/spec/controllers/projects/issues_controller_spec.rb @@ -24,6 +24,8 @@ describe Projects::IssuesController do project.team << [user, :developer] end + it_behaves_like "issuables list meta-data", :issue + it "returns index" do get :index, namespace_id: project.namespace.path, project_id: project.path diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index 63780802cfa..bfd134e406e 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -147,6 +147,8 @@ describe Projects::MergeRequestsController do end describe 'GET index' do + let!(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } + def get_merge_requests(page = nil) get :index, namespace_id: project.namespace.to_param, @@ -154,6 +156,8 @@ describe Projects::MergeRequestsController do state: 'opened', page: page.to_param end + it_behaves_like "issuables list meta-data", :merge_request + context 'when page param' do let(:last_page) { project.merge_requests.page().total_pages } let!(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } diff --git a/spec/features/issuables/issuable_list_spec.rb b/spec/features/issuables/issuable_list_spec.rb new file mode 100644 index 00000000000..e31bc40adc3 --- /dev/null +++ b/spec/features/issuables/issuable_list_spec.rb @@ -0,0 +1,57 @@ +require 'rails_helper' + +describe 'issuable list', feature: true do + let(:project) { create(:empty_project) } + let(:user) { create(:user) } + + issuable_types = [:issue, :merge_request] + + before do + project.add_user(user, :developer) + login_as(user) + issuable_types.each { |type| create_issuables(type) } + end + + issuable_types.each do |issuable_type| + it "avoids N+1 database queries for #{issuable_type.to_s.humanize.pluralize}" do + control_count = ActiveRecord::QueryRecorder.new { visit_issuable_list(issuable_type) }.count + + create_issuables(issuable_type) + + expect { visit_issuable_list(issuable_type) }.not_to exceed_query_limit(control_count) + end + + it "counts upvotes, downvotes and notes count for each #{issuable_type.to_s.humanize}" do + visit_issuable_list(issuable_type) + + expect(first('.fa-thumbs-up').find(:xpath, '..')).to have_content(1) + expect(first('.fa-thumbs-down').find(:xpath, '..')).to have_content(1) + expect(first('.fa-comments').find(:xpath, '..')).to have_content(2) + end + end + + def visit_issuable_list(issuable_type) + if issuable_type == :issue + visit namespace_project_issues_path(project.namespace, project) + else + visit namespace_project_merge_requests_path(project.namespace, project) + end + end + + def create_issuables(issuable_type) + 3.times do + if issuable_type == :issue + issuable = create(:issue, project: project, author: user) + else + issuable = create(:merge_request, title: FFaker::Lorem.sentence, source_project: project, source_branch: FFaker::Name.name) + end + + 2.times do + create(:note_on_issue, noteable: issuable, project: project, note: 'Test note') + end + + create(:award_emoji, :downvote, awardable: issuable) + create(:award_emoji, :upvote, awardable: issuable) + end + end +end diff --git a/spec/support/issuables_list_metadata_shared_examples.rb b/spec/support/issuables_list_metadata_shared_examples.rb new file mode 100644 index 00000000000..dac94dfc31e --- /dev/null +++ b/spec/support/issuables_list_metadata_shared_examples.rb @@ -0,0 +1,35 @@ +shared_examples 'issuables list meta-data' do |issuable_type, action = nil| + before do + @issuable_ids = [] + + 2.times do + if issuable_type == :issue + issuable = create(issuable_type, project: project) + else + issuable = create(issuable_type, title: FFaker::Lorem.sentence, source_project: project, source_branch: FFaker::Name.name) + end + + @issuable_ids << issuable.id + + issuable.id.times { create(:note, noteable: issuable, project: issuable.project) } + (issuable.id + 1).times { create(:award_emoji, :downvote, awardable: issuable) } + (issuable.id + 2).times { create(:award_emoji, :upvote, awardable: issuable) } + end + end + + it "creates indexed meta-data object for issuable notes and votes count" do + if action + get action + else + get :index, namespace_id: project.namespace.path, project_id: project.path + end + + meta_data = assigns(:issuable_meta_data) + + @issuable_ids.each do |id| + expect(meta_data[id].notes_count).to eq(id) + expect(meta_data[id].downvotes).to eq(id + 1) + expect(meta_data[id].upvotes).to eq(id + 2) + end + end +end From d0d94e4f104c276ee4095a76d1204daae384c708 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 10 Feb 2017 09:36:52 +0100 Subject: [PATCH 086/313] Fix pagination headers in grouped environments API --- app/serializers/environment_serializer.rb | 23 +++++++++++-------- .../environment_serializer_spec.rb | 11 +++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/app/serializers/environment_serializer.rb b/app/serializers/environment_serializer.rb index fe16a3784c4..d0a60f134da 100644 --- a/app/serializers/environment_serializer.rb +++ b/app/serializers/environment_serializer.rb @@ -20,8 +20,6 @@ class EnvironmentSerializer < BaseSerializer end def represent(resource, opts = {}) - resource = @paginator.paginate(resource) if paginated? - if itemized? itemize(resource).map do |item| { name: item.name, @@ -29,6 +27,8 @@ class EnvironmentSerializer < BaseSerializer latest: super(item.latest, opts) } end else + resource = @paginator.paginate(resource) if paginated? + super(resource, opts) end end @@ -36,15 +36,20 @@ class EnvironmentSerializer < BaseSerializer private def itemize(resource) - items = resource.group(:item_name).order('item_name ASC') - .pluck('COALESCE(environment_type, name) AS item_name', - 'COUNT(*) AS environments_count', - 'MAX(id) AS last_environment_id') + items = resource.order('folder_name ASC') + .group('COALESCE(environment_type, name)') + .select('COALESCE(environment_type, name) AS folder_name', + 'COUNT(*) AS size', 'MAX(id) AS last_id') - environments = resource.where(id: items.map(&:last)).index_by(&:id) + # It makes a difference when you call `paginate` method, because + # although `page` is effective at the end, it calls counting methods + # immediately. + items = @paginator.paginate(items) if paginated? - items.map do |name, size, id| - Item.new(name, size, environments[id]) + environments = resource.where(id: items.map(&:last_id)).index_by(&:id) + + items.map do |item| + Item.new(item.folder_name, item.size, environments[item.last_id]) end end end diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb index 1b95f1ff198..6a6df377b35 100644 --- a/spec/serializers/environment_serializer_spec.rb +++ b/spec/serializers/environment_serializer_spec.rb @@ -181,6 +181,17 @@ describe EnvironmentSerializer do expect(subject.first[:name]).to eq 'production' expect(subject.second[:name]).to eq 'staging' end + + it 'appends correct total page count header' do + expect(subject).not_to be_empty + expect(response).to have_received(:[]=).with('X-Total', '3') + end + + it 'appends correct page count headers' do + expect(subject).not_to be_empty + expect(response).to have_received(:[]=).with('X-Total-Pages', '2') + expect(response).to have_received(:[]=).with('X-Per-Page', '2') + end end end end From 9520627fa9cb6e7eae08d1ed384fd5225bd612a7 Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Fri, 10 Feb 2017 12:54:16 +0000 Subject: [PATCH 087/313] Updated copy --- doc/user/project/issue_board.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/user/project/issue_board.md b/doc/user/project/issue_board.md index 3dcdc181d3d..2ffb170cadd 100644 --- a/doc/user/project/issue_board.md +++ b/doc/user/project/issue_board.md @@ -94,11 +94,11 @@ list view that is removed. You can always add it back later if you need. ## Adding issues to lists -You can bulk add issues to a list by clicking the **Add issues** button. -This opens up a modal window where you can select multiple issues and then -add these issues to the selected list. By default the first list is selected, -but this can be changed in the dropdown menu next to the **Add issues** button -in the modal. +Add issues to a list by clicking the **Add issues** button. This opens up a +modal window where you can see all the issues that do not belong to any list. +Select one or more issues and then add these issues to the selected list. +By default the first list is selected, but this can be changed in the dropdown +menu next to the **Add issues** button in the modal. Within this modal you can also filter issues. This is done by using the filters at the top of the modal. @@ -146,7 +146,7 @@ A typical workflow of using the Issue Board would be: and gets automatically closed. For instance you can create a list based on the label of 'Frontend' and one for -'Backend'. A designer can start working on an issue by dragging adding it to the +'Backend'. A designer can start working on an issue by adding it to the 'Frontend' list. That way, everyone knows that this issue is now being worked on by the designers. Then, once they're done, all they have to do is drag it over to the next list, 'Backend', where a backend developer can From 88d610c60e9064f92419481a9df6453b3c8079b3 Mon Sep 17 00:00:00 2001 From: Jarka Kadlecova Date: Thu, 9 Feb 2017 13:39:39 +0100 Subject: [PATCH 088/313] Add member: Always return 409 when a member exists --- .../unreleased/20732_member_exists_409.yml | 4 + doc/api/v3_to_v4.md | 1 + lib/api/api.rb | 1 + lib/api/members.rb | 11 +- lib/api/v3/members.rb | 134 +++++++ spec/requests/api/members_spec.rb | 4 +- spec/requests/api/v3/members_spec.rb | 342 ++++++++++++++++++ 7 files changed, 486 insertions(+), 11 deletions(-) create mode 100644 changelogs/unreleased/20732_member_exists_409.yml create mode 100644 lib/api/v3/members.rb create mode 100644 spec/requests/api/v3/members_spec.rb diff --git a/changelogs/unreleased/20732_member_exists_409.yml b/changelogs/unreleased/20732_member_exists_409.yml new file mode 100644 index 00000000000..135647c7ac3 --- /dev/null +++ b/changelogs/unreleased/20732_member_exists_409.yml @@ -0,0 +1,4 @@ +--- +title: 'Add member: Always return 409 when a member exists' +merge_request: +author: diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md index 707f0437b7e..7cb83a337f2 100644 --- a/doc/api/v3_to_v4.md +++ b/doc/api/v3_to_v4.md @@ -12,3 +12,4 @@ changes are in V4: - Endpoints under `projects/merge_request/:id` have been removed (use: `projects/merge_requests/:id`) - Project snippets do not return deprecated field `expires_at` - Endpoints under `projects/:id/keys` have been removed (use `projects/:id/deploy_keys`) +- Status 409 returned for POST `project/:id/members` when a member already exists diff --git a/lib/api/api.rb b/lib/api/api.rb index eb9792680ff..7ec089b9c29 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -7,6 +7,7 @@ module API version 'v3', using: :path do mount ::API::V3::DeployKeys mount ::API::V3::Issues + mount ::API::V3::Members mount ::API::V3::MergeRequests mount ::API::V3::Projects mount ::API::V3::ProjectSnippets diff --git a/lib/api/members.rb b/lib/api/members.rb index d85f1f78cd6..d1d78775c6d 100644 --- a/lib/api/members.rb +++ b/lib/api/members.rb @@ -56,16 +56,9 @@ module API member = source.members.find_by(user_id: params[:user_id]) - # We need this explicit check because `source.add_user` doesn't - # currently return the member created so it would return 201 even if - # the member already existed... - # The `source_type == 'group'` check is to ensure back-compatibility - # but 409 behavior should be used for both project and group members in 9.0! - conflict!('Member already exists') if source_type == 'group' && member + conflict!('Member already exists') if member - unless member - member = source.add_user(params[:user_id], params[:access_level], current_user: current_user, expires_at: params[:expires_at]) - end + member = source.add_user(params[:user_id], params[:access_level], current_user: current_user, expires_at: params[:expires_at]) if member.persisted? && member.valid? present member.user, with: Entities::Member, member: member diff --git a/lib/api/v3/members.rb b/lib/api/v3/members.rb new file mode 100644 index 00000000000..4e6cb2e3c52 --- /dev/null +++ b/lib/api/v3/members.rb @@ -0,0 +1,134 @@ +module API + module V3 + class Members < Grape::API + include PaginationParams + + before { authenticate! } + + helpers ::API::Helpers::MembersHelpers + + %w[group project].each do |source_type| + params do + requires :id, type: String, desc: "The #{source_type} ID" + end + resource source_type.pluralize do + desc 'Gets a list of group or project members viewable by the authenticated user.' do + success ::API::Entities::Member + end + params do + optional :query, type: String, desc: 'A query string to search for members' + use :pagination + end + get ":id/members" do + source = find_source(source_type, params[:id]) + + users = source.users + users = users.merge(User.search(params[:query])) if params[:query] + + present paginate(users), with: ::API::Entities::Member, source: source + end + + desc 'Gets a member of a group or project.' do + success ::API::Entities::Member + end + params do + requires :user_id, type: Integer, desc: 'The user ID of the member' + end + get ":id/members/:user_id" do + source = find_source(source_type, params[:id]) + + members = source.members + member = members.find_by!(user_id: params[:user_id]) + + present member.user, with: ::API::Entities::Member, member: member + end + + desc 'Adds a member to a group or project.' do + success ::API::Entities::Member + end + params do + requires :user_id, type: Integer, desc: 'The user ID of the new member' + requires :access_level, type: Integer, desc: 'A valid access level (defaults: `30`, developer access level)' + optional :expires_at, type: DateTime, desc: 'Date string in the format YEAR-MONTH-DAY' + end + post ":id/members" do + source = find_source(source_type, params[:id]) + authorize_admin_source!(source_type, source) + + member = source.members.find_by(user_id: params[:user_id]) + + # We need this explicit check because `source.add_user` doesn't + # currently return the member created so it would return 201 even if + # the member already existed... + # The `source_type == 'group'` check is to ensure back-compatibility + # but 409 behavior should be used for both project and group members in 9.0! + conflict!('Member already exists') if source_type == 'group' && member + + unless member + member = source.add_user(params[:user_id], params[:access_level], current_user: current_user, expires_at: params[:expires_at]) + end + if member.persisted? && member.valid? + present member.user, with: ::API::Entities::Member, member: member + else + # This is to ensure back-compatibility but 400 behavior should be used + # for all validation errors in 9.0! + render_api_error!('Access level is not known', 422) if member.errors.key?(:access_level) + render_validation_error!(member) + end + end + + desc 'Updates a member of a group or project.' do + success ::API::Entities::Member + end + params do + requires :user_id, type: Integer, desc: 'The user ID of the new member' + requires :access_level, type: Integer, desc: 'A valid access level' + optional :expires_at, type: DateTime, desc: 'Date string in the format YEAR-MONTH-DAY' + end + put ":id/members/:user_id" do + source = find_source(source_type, params[:id]) + authorize_admin_source!(source_type, source) + + member = source.members.find_by!(user_id: params[:user_id]) + attrs = attributes_for_keys [:access_level, :expires_at] + + if member.update_attributes(attrs) + present member.user, with: ::API::Entities::Member, member: member + else + # This is to ensure back-compatibility but 400 behavior should be used + # for all validation errors in 9.0! + render_api_error!('Access level is not known', 422) if member.errors.key?(:access_level) + render_validation_error!(member) + end + end + + desc 'Removes a user from a group or project.' + params do + requires :user_id, type: Integer, desc: 'The user ID of the member' + end + delete ":id/members/:user_id" do + source = find_source(source_type, params[:id]) + + # This is to ensure back-compatibility but find_by! should be used + # in that casse in 9.0! + member = source.members.find_by(user_id: params[:user_id]) + + # This is to ensure back-compatibility but this should be removed in + # favor of find_by! in 9.0! + not_found!("Member: user_id:#{params[:user_id]}") if source_type == 'group' && member.nil? + + # This is to ensure back-compatibility but 204 behavior should be used + # for all DELETE endpoints in 9.0! + if member.nil? + { message: "Access revoked", id: params[:user_id].to_i } + else + ::Members::DestroyService.new(source, current_user, declared_params).execute + + present member.user, with: ::API::Entities::Member, member: member + end + end + end + end + end + end +end diff --git a/spec/requests/api/members_spec.rb b/spec/requests/api/members_spec.rb index 9892e014cb9..3e9bcfd1a60 100644 --- a/spec/requests/api/members_spec.rb +++ b/spec/requests/api/members_spec.rb @@ -145,11 +145,11 @@ describe API::Members, api: true do end end - it "returns #{source_type == 'project' ? 201 : 409} if member already exists" do + it "returns 409 if member already exists" do post api("/#{source_type.pluralize}/#{source.id}/members", master), user_id: master.id, access_level: Member::MASTER - expect(response).to have_http_status(source_type == 'project' ? 201 : 409) + expect(response).to have_http_status(409) end it 'returns 400 when user_id is not given' do diff --git a/spec/requests/api/v3/members_spec.rb b/spec/requests/api/v3/members_spec.rb new file mode 100644 index 00000000000..28c3ca03960 --- /dev/null +++ b/spec/requests/api/v3/members_spec.rb @@ -0,0 +1,342 @@ +require 'spec_helper' + +describe API::Members, api: true do + include ApiHelpers + + let(:master) { create(:user) } + let(:developer) { create(:user) } + let(:access_requester) { create(:user) } + let(:stranger) { create(:user) } + + let(:project) do + create(:empty_project, :public, :access_requestable, creator_id: master.id, namespace: master.namespace) do |project| + project.team << [developer, :developer] + project.team << [master, :master] + project.request_access(access_requester) + end + end + + let!(:group) do + create(:group, :public, :access_requestable) do |group| + group.add_developer(developer) + group.add_owner(master) + group.request_access(access_requester) + end + end + + shared_examples 'GET /:sources/:id/members' do |source_type| + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) { get v3_api("/#{source_type.pluralize}/#{source.id}/members", stranger) } + end + + %i[master developer access_requester stranger].each do |type| + context "when authenticated as a #{type}" do + it 'returns 200' do + user = public_send(type) + get v3_api("/#{source_type.pluralize}/#{source.id}/members", user) + + expect(response).to have_http_status(200) + expect(json_response.size).to eq(2) + expect(json_response.map { |u| u['id'] }).to match_array [master.id, developer.id] + end + end + end + + it 'does not return invitees' do + create(:"#{source_type}_member", invite_token: '123', invite_email: 'test@abc.com', source: source, user: nil) + + get v3_api("/#{source_type.pluralize}/#{source.id}/members", developer) + + expect(response).to have_http_status(200) + expect(json_response.size).to eq(2) + expect(json_response.map { |u| u['id'] }).to match_array [master.id, developer.id] + end + + it 'finds members with query string' do + get v3_api("/#{source_type.pluralize}/#{source.id}/members", developer), query: master.username + + expect(response).to have_http_status(200) + expect(json_response.count).to eq(1) + expect(json_response.first['username']).to eq(master.username) + end + end + end + + shared_examples 'GET /:sources/:id/members/:user_id' do |source_type| + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) { get v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", stranger) } + end + + context 'when authenticated as a non-member' do + %i[access_requester stranger].each do |type| + context "as a #{type}" do + it 'returns 200' do + user = public_send(type) + get v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", user) + + expect(response).to have_http_status(200) + # User attributes + expect(json_response['id']).to eq(developer.id) + expect(json_response['name']).to eq(developer.name) + expect(json_response['username']).to eq(developer.username) + expect(json_response['state']).to eq(developer.state) + expect(json_response['avatar_url']).to eq(developer.avatar_url) + expect(json_response['web_url']).to eq(Gitlab::Routing.url_helpers.user_url(developer)) + + # Member attributes + expect(json_response['access_level']).to eq(Member::DEVELOPER) + end + end + end + end + end + end + + shared_examples 'POST /:sources/:id/members' do |source_type| + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", stranger), + user_id: access_requester.id, access_level: Member::MASTER + end + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester stranger developer].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + post v3_api("/#{source_type.pluralize}/#{source.id}/members", user), + user_id: access_requester.id, access_level: Member::MASTER + + expect(response).to have_http_status(403) + end + end + end + end + + context 'when authenticated as a master/owner' do + context 'and new member is already a requester' do + it 'transforms the requester into a proper member' do + expect do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", master), + user_id: access_requester.id, access_level: Member::MASTER + + expect(response).to have_http_status(201) + end.to change { source.members.count }.by(1) + expect(source.requesters.count).to eq(0) + expect(json_response['id']).to eq(access_requester.id) + expect(json_response['access_level']).to eq(Member::MASTER) + end + end + + it 'creates a new member' do + expect do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", master), + user_id: stranger.id, access_level: Member::DEVELOPER, expires_at: '2016-08-05' + + expect(response).to have_http_status(201) + end.to change { source.members.count }.by(1) + expect(json_response['id']).to eq(stranger.id) + expect(json_response['access_level']).to eq(Member::DEVELOPER) + expect(json_response['expires_at']).to eq('2016-08-05') + end + end + + it "returns #{source_type == 'project' ? 201 : 409} if member already exists" do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", master), + user_id: master.id, access_level: Member::MASTER + + expect(response).to have_http_status(source_type == 'project' ? 201 : 409) + end + + it 'returns 400 when user_id is not given' do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", master), + access_level: Member::MASTER + + expect(response).to have_http_status(400) + end + + it 'returns 400 when access_level is not given' do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", master), + user_id: stranger.id + + expect(response).to have_http_status(400) + end + + it 'returns 422 when access_level is not valid' do + post v3_api("/#{source_type.pluralize}/#{source.id}/members", master), + user_id: stranger.id, access_level: 1234 + + expect(response).to have_http_status(422) + end + end + end + + shared_examples 'PUT /:sources/:id/members/:user_id' do |source_type| + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) do + put v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", stranger), + access_level: Member::MASTER + end + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester stranger developer].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + put v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", user), + access_level: Member::MASTER + + expect(response).to have_http_status(403) + end + end + end + end + + context 'when authenticated as a master/owner' do + it 'updates the member' do + put v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", master), + access_level: Member::MASTER, expires_at: '2016-08-05' + + expect(response).to have_http_status(200) + expect(json_response['id']).to eq(developer.id) + expect(json_response['access_level']).to eq(Member::MASTER) + expect(json_response['expires_at']).to eq('2016-08-05') + end + end + + it 'returns 409 if member does not exist' do + put v3_api("/#{source_type.pluralize}/#{source.id}/members/123", master), + access_level: Member::MASTER + + expect(response).to have_http_status(404) + end + + it 'returns 400 when access_level is not given' do + put v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", master) + + expect(response).to have_http_status(400) + end + + it 'returns 422 when access level is not valid' do + put v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", master), + access_level: 1234 + + expect(response).to have_http_status(422) + end + end + end + + shared_examples 'DELETE /:sources/:id/members/:user_id' do |source_type| + context "with :sources == #{source_type.pluralize}" do + it_behaves_like 'a 404 response when source is private' do + let(:route) { delete v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", stranger) } + end + + context 'when authenticated as a non-member or member with insufficient rights' do + %i[access_requester stranger].each do |type| + context "as a #{type}" do + it 'returns 403' do + user = public_send(type) + delete v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", user) + + expect(response).to have_http_status(403) + end + end + end + end + + context 'when authenticated as a member and deleting themself' do + it 'deletes the member' do + expect do + delete v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", developer) + + expect(response).to have_http_status(200) + end.to change { source.members.count }.by(-1) + end + end + + context 'when authenticated as a master/owner' do + context 'and member is a requester' do + it "returns #{source_type == 'project' ? 200 : 404}" do + expect do + delete v3_api("/#{source_type.pluralize}/#{source.id}/members/#{access_requester.id}", master) + + expect(response).to have_http_status(source_type == 'project' ? 200 : 404) + end.not_to change { source.requesters.count } + end + end + + it 'deletes the member' do + expect do + delete v3_api("/#{source_type.pluralize}/#{source.id}/members/#{developer.id}", master) + + expect(response).to have_http_status(200) + end.to change { source.members.count }.by(-1) + end + end + + it "returns #{source_type == 'project' ? 200 : 404} if member does not exist" do + delete v3_api("/#{source_type.pluralize}/#{source.id}/members/123", master) + + expect(response).to have_http_status(source_type == 'project' ? 200 : 404) + end + end + end + + it_behaves_like 'GET /:sources/:id/members', 'project' do + let(:source) { project } + end + + it_behaves_like 'GET /:sources/:id/members', 'group' do + let(:source) { group } + end + + it_behaves_like 'GET /:sources/:id/members/:user_id', 'project' do + let(:source) { project } + end + + it_behaves_like 'GET /:sources/:id/members/:user_id', 'group' do + let(:source) { group } + end + + it_behaves_like 'POST /:sources/:id/members', 'project' do + let(:source) { project } + end + + it_behaves_like 'POST /:sources/:id/members', 'group' do + let(:source) { group } + end + + it_behaves_like 'PUT /:sources/:id/members/:user_id', 'project' do + let(:source) { project } + end + + it_behaves_like 'PUT /:sources/:id/members/:user_id', 'group' do + let(:source) { group } + end + + it_behaves_like 'DELETE /:sources/:id/members/:user_id', 'project' do + let(:source) { project } + end + + it_behaves_like 'DELETE /:sources/:id/members/:user_id', 'group' do + let(:source) { group } + end + + context 'Adding owner to project' do + it 'returns 403' do + expect do + post v3_api("/projects/#{project.id}/members", master), + user_id: stranger.id, access_level: Member::OWNER + + expect(response).to have_http_status(422) + end.to change { project.members.count }.by(0) + end + end +end From 293a54a9dbfc02d685296c1872199dece624f901 Mon Sep 17 00:00:00 2001 From: Mark Pundsack Date: Fri, 10 Feb 2017 13:49:35 -0600 Subject: [PATCH 089/313] Add image description --- doc/ci/pipelines.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index 35a80dd2977..5700e9bb026 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -33,7 +33,7 @@ Pipelines accommodate several development workflows: Example continuous delivery flow: -![](img/pipelines-goal.svg) +![CD Flow](img/pipelines-goal.svg) ## Builds From 86558d53ddcf008fff396d25c38c9462fb77f615 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Fri, 10 Feb 2017 19:41:15 +0000 Subject: [PATCH 090/313] Adds verification in case the endpoint already has `.json` --- .../commit/pipelines/pipelines_service.js.es6 | 19 +++++++++++++++++-- .../merge_requests/create_new_mr_spec.rb | 3 +++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 b/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 index e9cae893857..8ae98f9bf97 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 +++ b/app/assets/javascripts/commit/pipelines/pipelines_service.js.es6 @@ -8,8 +8,23 @@ * Uses Vue.Resource */ class PipelinesService { - constructor(endpoint) { - this.pipelines = Vue.resource(`${endpoint}.json`); + + /** + * FIXME: The url provided to request the pipelines in the new merge request + * page already has `.json`. + * This should be fixed when the endpoint is improved. + * + * @param {String} root + */ + constructor(root) { + let endpoint; + + if (root.indexOf('.json') === -1) { + endpoint = `${root}.json`; + } else { + endpoint = root; + } + this.pipelines = Vue.resource(endpoint); } /** diff --git a/spec/features/merge_requests/create_new_mr_spec.rb b/spec/features/merge_requests/create_new_mr_spec.rb index e853fb7e016..0832a3656a8 100644 --- a/spec/features/merge_requests/create_new_mr_spec.rb +++ b/spec/features/merge_requests/create_new_mr_spec.rb @@ -1,6 +1,8 @@ require 'spec_helper' feature 'Create New Merge Request', feature: true, js: true do + include WaitForVueResource + let(:user) { create(:user) } let(:project) { create(:project, :public) } @@ -99,6 +101,7 @@ feature 'Create New Merge Request', feature: true, js: true do page.within('.merge-request') do click_link 'Pipelines' + wait_for_vue_resource expect(page).to have_content "##{pipeline.id}" end From a97dcc077c68f4f320cd7a5686b9056adfef6c09 Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Wed, 8 Feb 2017 18:15:47 +0100 Subject: [PATCH 091/313] Add method for creating foreign keys concurrently This method allows one to create foreign keys without blocking access to the source table, but only on PostgreSQL. When creating a regular foreign key the "ALTER TABLE" statement used for this won't return until all data has been validated. This statement in turn will acquire a lock on the source table. As a result this lock can be held for quite a long amount of time, depending on the number of rows and system load. By breaking up the foreign key creation process in two steps (creation, and validation) we can reduce the amount of locking to a minimum. Locking is still necessary for the "ALTER TABLE" statement that adds the constraint, but this is a fast process and so will only block access for a few milliseconds. --- lib/gitlab/database/migration_helpers.rb | 50 +++++++++++- .../gitlab/database/migration_helpers_spec.rb | 76 +++++++++++++++++-- 2 files changed, 119 insertions(+), 7 deletions(-) diff --git a/lib/gitlab/database/migration_helpers.rb b/lib/gitlab/database/migration_helpers.rb index 0bd6e148ba8..4800a509b37 100644 --- a/lib/gitlab/database/migration_helpers.rb +++ b/lib/gitlab/database/migration_helpers.rb @@ -26,11 +26,59 @@ module Gitlab add_index(table_name, column_name, options) end + # Adds a foreign key with only minimal locking on the tables involved. + # + # This method only requires minimal locking when using PostgreSQL. When + # using MySQL this method will use Rails' default `add_foreign_key`. + # + # source - The source table containing the foreign key. + # target - The target table the key points to. + # column - The name of the column to create the foreign key on. + # on_delete - The action to perform when associated data is removed, + # defaults to "CASCADE". + def add_concurrent_foreign_key(source, target, column:, on_delete: :cascade) + # Transactions would result in ALTER TABLE locks being held for the + # duration of the transaction, defeating the purpose of this method. + if transaction_open? + raise 'add_concurrent_foreign_key can not be run inside a transaction' + end + + # While MySQL does allow disabling of foreign keys it has no equivalent + # of PostgreSQL's "VALIDATE CONSTRAINT". As a result we'll just fall + # back to the normal foreign key procedure. + if Database.mysql? + return add_foreign_key(source, target, + column: column, + on_delete: on_delete) + end + + disable_statement_timeout + + key_name = "fk_#{source}_#{target}_#{column}" + + # Using NOT VALID allows us to create a key without immediately + # validating it. This means we keep the ALTER TABLE lock only for a + # short period of time. The key _is_ enforced for any newly created + # data. + execute <<-EOF.strip_heredoc + ALTER TABLE #{source} + ADD CONSTRAINT #{key_name} + FOREIGN KEY (#{column}) + REFERENCES #{target} (id) + ON DELETE #{on_delete} NOT VALID; + EOF + + # Validate the existing constraint. This can potentially take a very + # long time to complete, but fortunately does not lock the source table + # while running. + execute("ALTER TABLE #{source} VALIDATE CONSTRAINT #{key_name};") + end + # Long-running migrations may take more than the timeout allowed by # the database. Disable the session's statement timeout to ensure # migrations don't get killed prematurely. (PostgreSQL only) def disable_statement_timeout - ActiveRecord::Base.connection.execute('SET statement_timeout TO 0') if Database.postgresql? + execute('SET statement_timeout TO 0') if Database.postgresql? end # Updates the value of a column in batches. diff --git a/spec/lib/gitlab/database/migration_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers_spec.rb index 7fd25b9e5bf..e94ca4fcfd2 100644 --- a/spec/lib/gitlab/database/migration_helpers_spec.rb +++ b/spec/lib/gitlab/database/migration_helpers_spec.rb @@ -12,15 +12,14 @@ describe Gitlab::Database::MigrationHelpers, lib: true do describe '#add_concurrent_index' do context 'outside a transaction' do before do - expect(model).to receive(:transaction_open?).and_return(false) - - unless Gitlab::Database.postgresql? - allow_any_instance_of(Gitlab::Database::MigrationHelpers).to receive(:disable_statement_timeout) - end + allow(model).to receive(:transaction_open?).and_return(false) end context 'using PostgreSQL' do - before { expect(Gitlab::Database).to receive(:postgresql?).and_return(true) } + before do + allow(Gitlab::Database).to receive(:postgresql?).and_return(true) + allow(model).to receive(:disable_statement_timeout) + end it 'creates the index concurrently' do expect(model).to receive(:add_index). @@ -59,6 +58,71 @@ describe Gitlab::Database::MigrationHelpers, lib: true do end end + describe '#add_concurrent_foreign_key' do + context 'inside a transaction' do + it 'raises an error' do + expect(model).to receive(:transaction_open?).and_return(true) + + expect do + model.add_concurrent_foreign_key(:projects, :users, column: :user_id) + end.to raise_error(RuntimeError) + end + end + + context 'outside a transaction' do + before do + allow(model).to receive(:transaction_open?).and_return(false) + end + + context 'using MySQL' do + it 'creates a regular foreign key' do + allow(Gitlab::Database).to receive(:mysql?).and_return(true) + + expect(model).to receive(:add_foreign_key). + with(:projects, :users, column: :user_id, on_delete: :cascade) + + model.add_concurrent_foreign_key(:projects, :users, column: :user_id) + end + end + + context 'using PostgreSQL' do + before do + allow(Gitlab::Database).to receive(:mysql?).and_return(false) + end + + it 'creates a concurrent foreign key' do + expect(model).to receive(:disable_statement_timeout) + expect(model).to receive(:execute).ordered.with(/NOT VALID/) + expect(model).to receive(:execute).ordered.with(/VALIDATE CONSTRAINT/) + + model.add_concurrent_foreign_key(:projects, :users, column: :user_id) + end + end + end + end + + describe '#disable_statement_timeout' do + context 'using PostgreSQL' do + it 'disables statement timeouts' do + expect(Gitlab::Database).to receive(:postgresql?).and_return(true) + + expect(model).to receive(:execute).with('SET statement_timeout TO 0') + + model.disable_statement_timeout + end + end + + context 'using MySQL' do + it 'does nothing' do + expect(Gitlab::Database).to receive(:postgresql?).and_return(false) + + expect(model).not_to receive(:execute) + + model.disable_statement_timeout + end + end + end + describe '#update_column_in_batches' do before do create_list(:empty_project, 5) From 766060bcdf3ff7c37f471b58e5d13721b263e37b Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Thu, 9 Feb 2017 16:52:43 +0100 Subject: [PATCH 092/313] Enforce use of add_concurrent_foreign_key This adds a Rubocop rule to enforce the use of add_concurrent_foreign_key instead of the regular add_foreign_key method. This cop has been disabled for existing migrations so we don't need to change those. --- .../20160919145149_add_group_id_to_labels.rb | 2 +- ...dd_pipeline_id_to_merge_request_metrics.rb | 2 +- ...1171301_add_project_id_to_subscriptions.rb | 2 +- .../migration/add_concurrent_foreign_key.rb | 27 +++++++++++++++ rubocop/rubocop.rb | 1 + .../add_concurrent_foreign_key_spec.rb | 33 +++++++++++++++++++ 6 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 rubocop/cop/migration/add_concurrent_foreign_key.rb create mode 100644 spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb diff --git a/db/migrate/20160919145149_add_group_id_to_labels.rb b/db/migrate/20160919145149_add_group_id_to_labels.rb index 05e21af0584..d10f3a6d104 100644 --- a/db/migrate/20160919145149_add_group_id_to_labels.rb +++ b/db/migrate/20160919145149_add_group_id_to_labels.rb @@ -7,7 +7,7 @@ class AddGroupIdToLabels < ActiveRecord::Migration def change add_column :labels, :group_id, :integer - add_foreign_key :labels, :namespaces, column: :group_id, on_delete: :cascade + add_foreign_key :labels, :namespaces, column: :group_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey add_concurrent_index :labels, :group_id end end diff --git a/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb b/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb index f49df6802a7..2abfe47b776 100644 --- a/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb +++ b/db/migrate/20161020083353_add_pipeline_id_to_merge_request_metrics.rb @@ -28,6 +28,6 @@ class AddPipelineIdToMergeRequestMetrics < ActiveRecord::Migration def change add_column :merge_request_metrics, :pipeline_id, :integer add_concurrent_index :merge_request_metrics, :pipeline_id - add_foreign_key :merge_request_metrics, :ci_commits, column: :pipeline_id, on_delete: :cascade + add_foreign_key :merge_request_metrics, :ci_commits, column: :pipeline_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey end end diff --git a/db/migrate/20161031171301_add_project_id_to_subscriptions.rb b/db/migrate/20161031171301_add_project_id_to_subscriptions.rb index 97534679b59..d5c343dc527 100644 --- a/db/migrate/20161031171301_add_project_id_to_subscriptions.rb +++ b/db/migrate/20161031171301_add_project_id_to_subscriptions.rb @@ -5,7 +5,7 @@ class AddProjectIdToSubscriptions < ActiveRecord::Migration def up add_column :subscriptions, :project_id, :integer - add_foreign_key :subscriptions, :projects, column: :project_id, on_delete: :cascade + add_foreign_key :subscriptions, :projects, column: :project_id, on_delete: :cascade # rubocop: disable Migration/AddConcurrentForeignKey end def down diff --git a/rubocop/cop/migration/add_concurrent_foreign_key.rb b/rubocop/cop/migration/add_concurrent_foreign_key.rb new file mode 100644 index 00000000000..e40a7087a47 --- /dev/null +++ b/rubocop/cop/migration/add_concurrent_foreign_key.rb @@ -0,0 +1,27 @@ +require_relative '../../migration_helpers' + +module RuboCop + module Cop + module Migration + # Cop that checks if `add_concurrent_foreign_key` is used instead of + # `add_foreign_key`. + class AddConcurrentForeignKey < RuboCop::Cop::Cop + include MigrationHelpers + + MSG = '`add_foreign_key` requires downtime, use `add_concurrent_foreign_key` instead' + + def on_send(node) + return unless in_migration?(node) + + name = node.children[1] + + add_offense(node, :selector) if name == :add_foreign_key + end + + def method_name(node) + node.children.first + end + end + end + end +end diff --git a/rubocop/rubocop.rb b/rubocop/rubocop.rb index aa35fb1701c..d4266d0deae 100644 --- a/rubocop/rubocop.rb +++ b/rubocop/rubocop.rb @@ -1,4 +1,5 @@ require_relative 'cop/gem_fetcher' require_relative 'cop/migration/add_column' require_relative 'cop/migration/add_column_with_default' +require_relative 'cop/migration/add_concurrent_foreign_key' require_relative 'cop/migration/add_index' diff --git a/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb b/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb new file mode 100644 index 00000000000..7cb24dc5646 --- /dev/null +++ b/spec/rubocop/cop/migration/add_concurrent_foreign_key_spec.rb @@ -0,0 +1,33 @@ +require 'spec_helper' +require 'rubocop' +require 'rubocop/rspec/support' +require_relative '../../../../rubocop/cop/migration/add_concurrent_foreign_key' + +describe RuboCop::Cop::Migration::AddConcurrentForeignKey do + include CopHelper + + let(:cop) { described_class.new } + + context 'outside of a migration' do + it 'does not register any offenses' do + inspect_source(cop, 'def up; add_foreign_key(:projects, :users, column: :user_id); end') + + expect(cop.offenses).to be_empty + end + end + + context 'in a migration' do + before do + allow(cop).to receive(:in_migration?).and_return(true) + end + + it 'registers an offense when using add_foreign_key' do + inspect_source(cop, 'def up; add_foreign_key(:projects, :users, column: :user_id); end') + + aggregate_failures do + expect(cop.offenses.size).to eq(1) + expect(cop.offenses.map(&:line)).to eq([1]) + end + end + end +end From cb8d031e959588c02efcd245ba914c07dab7f993 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 30 Nov 2016 15:07:42 +0800 Subject: [PATCH 093/313] Explicitly disable the RSpec/BeEql cop This is a little too picky, even for us. --- .rubocop.yml | 4 ++++ .rubocop_todo.yml | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 88345373a5b..e73597adca2 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -769,6 +769,10 @@ Rails/ScopeArgs: RSpec/AnyInstance: Enabled: false +# Check for expectations where `be(...)` can replace `eql(...)`. +RSpec/BeEql: + Enabled: false + # Check that the first argument to the top level describe is the tested class or # module. RSpec/DescribeClass: diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index d581610162f..c86cd714723 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -80,10 +80,6 @@ Performance/RedundantMatch: Performance/RedundantMerge: Enabled: false -# Offense count: 7 -RSpec/BeEql: - Enabled: false - # Offense count: 15 # Configuration parameters: CustomIncludeMethods. RSpec/EmptyExampleGroup: From 92cbc1e4ad8d874428089c4c65293fa218f67206 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 30 Nov 2016 15:13:42 +0800 Subject: [PATCH 094/313] Enable the `RSpec/ExpectActual` cop and correct offenses --- .rubocop.yml | 4 ++ .rubocop_todo.yml | 4 -- .../filtered_search/filter_issues_spec.rb | 33 +++------ spec/lib/gitlab/regex_spec.rb | 71 ++++++++++--------- 4 files changed, 53 insertions(+), 59 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index e73597adca2..21ea8372e4b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -801,6 +801,10 @@ RSpec/ExampleWording: not: does not IgnoredWords: [] +# Checks for `expect(...)` calls containing literal values. +RSpec/ExpectActual: + Enabled: true + # Checks the file and folder naming of the spec file. RSpec/FilePath: Enabled: false diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index c86cd714723..4714b64b896 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -85,10 +85,6 @@ Performance/RedundantMerge: RSpec/EmptyExampleGroup: Enabled: false -# Offense count: 24 -RSpec/ExpectActual: - Enabled: false - # Offense count: 58 # Configuration parameters: EnforcedStyle, SupportedStyles. # SupportedStyles: implicit, each, example diff --git a/spec/features/issues/filtered_search/filter_issues_spec.rb b/spec/features/issues/filtered_search/filter_issues_spec.rb index 6f7046c8461..64f448a83b7 100644 --- a/spec/features/issues/filtered_search/filter_issues_spec.rb +++ b/spec/features/issues/filtered_search/filter_issues_spec.rb @@ -113,13 +113,11 @@ describe 'Filter issues', js: true, feature: true do end it 'filters issues by invalid author' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end it 'filters issues by multiple authors' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end end @@ -158,8 +156,7 @@ describe 'Filter issues', js: true, feature: true do end it 'sorting' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end end @@ -182,13 +179,11 @@ describe 'Filter issues', js: true, feature: true do end it 'filters issues by invalid assignee' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end it 'filters issues by multiple assignees' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end end @@ -228,8 +223,7 @@ describe 'Filter issues', js: true, feature: true do context 'sorting' do it 'sorts' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end end end @@ -253,8 +247,7 @@ describe 'Filter issues', js: true, feature: true do end it 'filters issues by invalid label' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end it 'filters issues by multiple labels' do @@ -429,8 +422,7 @@ describe 'Filter issues', js: true, feature: true do context 'sorting' do it 'sorts' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end end end @@ -456,13 +448,11 @@ describe 'Filter issues', js: true, feature: true do end it 'filters issues by invalid milestones' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end it 'filters issues by multiple milestones' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end it 'filters issues by milestone containing special characters' do @@ -523,8 +513,7 @@ describe 'Filter issues', js: true, feature: true do context 'sorting' do it 'sorts' do - pending('to be tested, issue #26546') - expect(true).to be(false) + skip('to be tested, issue #26546') end end end diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb index c78cd30157e..1dbc2f6eb13 100644 --- a/spec/lib/gitlab/regex_spec.rb +++ b/spec/lib/gitlab/regex_spec.rb @@ -2,47 +2,52 @@ require 'spec_helper' describe Gitlab::Regex, lib: true do - describe 'project path regex' do - it { expect('gitlab-ce').to match(Gitlab::Regex.project_path_regex) } - it { expect('gitlab_git').to match(Gitlab::Regex.project_path_regex) } - it { expect('_underscore.js').to match(Gitlab::Regex.project_path_regex) } - it { expect('100px.com').to match(Gitlab::Regex.project_path_regex) } - it { expect('?gitlab').not_to match(Gitlab::Regex.project_path_regex) } - it { expect('git lab').not_to match(Gitlab::Regex.project_path_regex) } - it { expect('gitlab.git').not_to match(Gitlab::Regex.project_path_regex) } + describe '.project_path_regex' do + subject { described_class.project_path_regex } + + it { is_expected.to match('gitlab-ce') } + it { is_expected.to match('gitlab_git') } + it { is_expected.to match('_underscore.js') } + it { is_expected.to match('100px.com') } + it { is_expected.not_to match('?gitlab') } + it { is_expected.not_to match('git lab') } + it { is_expected.not_to match('gitlab.git') } end - describe 'project name regex' do - it { expect('gitlab-ce').to match(Gitlab::Regex.project_name_regex) } - it { expect('GitLab CE').to match(Gitlab::Regex.project_name_regex) } - it { expect('100 lines').to match(Gitlab::Regex.project_name_regex) } - it { expect('gitlab.git').to match(Gitlab::Regex.project_name_regex) } - it { expect('Český název').to match(Gitlab::Regex.project_name_regex) } - it { expect('Dash – is this').to match(Gitlab::Regex.project_name_regex) } - it { expect('?gitlab').not_to match(Gitlab::Regex.project_name_regex) } + describe '.project_name_regex' do + subject { described_class.project_name_regex } + + it { is_expected.to match('gitlab-ce') } + it { is_expected.to match('GitLab CE') } + it { is_expected.to match('100 lines') } + it { is_expected.to match('gitlab.git') } + it { is_expected.to match('Český název') } + it { is_expected.to match('Dash – is this') } + it { is_expected.not_to match('?gitlab') } end - describe 'file name regex' do - it { expect('foo@bar').to match(Gitlab::Regex.file_name_regex) } + describe '.file_name_regex' do + subject { described_class.file_name_regex } + + it { is_expected.to match('foo@bar') } end - describe 'file path regex' do - it { expect('foo@/bar').to match(Gitlab::Regex.file_path_regex) } + describe '.file_path_regex' do + subject { described_class.file_path_regex } + + it { is_expected.to match('foo@/bar') } end - describe 'environment slug regex' do - def be_matched - match(Gitlab::Regex.environment_slug_regex) - end + describe '.environment_slug_regex' do + subject { described_class.environment_slug_regex } - it { expect('foo').to be_matched } - it { expect('foo-1').to be_matched } - - it { expect('FOO').not_to be_matched } - it { expect('foo/1').not_to be_matched } - it { expect('foo.1').not_to be_matched } - it { expect('foo*1').not_to be_matched } - it { expect('9foo').not_to be_matched } - it { expect('foo-').not_to be_matched } + it { is_expected.to match('foo') } + it { is_expected.to match('foo-1') } + it { is_expected.not_to match('FOO') } + it { is_expected.not_to match('foo/1') } + it { is_expected.not_to match('foo.1') } + it { is_expected.not_to match('foo*1') } + it { is_expected.not_to match('9foo') } + it { is_expected.not_to match('foo-') } end end From 5db56efe424c9cd760580a755ec4e131d045769d Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 30 Nov 2016 15:34:29 +0800 Subject: [PATCH 095/313] Enable `Style/RedundantException` cop and correct offense --- .rubocop.yml | 4 ++++ .rubocop_todo.yml | 5 ----- app/helpers/preferences_helper.rb | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 21ea8372e4b..1061de7c797 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -339,6 +339,10 @@ Style/OpMethod: Style/ParenthesesAroundCondition: Enabled: true +# Checks for an obsolete RuntimeException argument in raise/fail. +Style/RedundantException: + Enabled: true + # Checks for parentheses that seem not to serve any purpose. Style/RedundantParentheses: Enabled: true diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 4714b64b896..7ef5523de4b 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -416,11 +416,6 @@ Style/RaiseArgs: Style/RedundantBegin: Enabled: false -# Offense count: 1 -# Cop supports --auto-correct. -Style/RedundantException: - Enabled: false - # Offense count: 29 # Cop supports --auto-correct. Style/RedundantFreeze: diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index 6e68aad4cb7..dd0a4ea03f0 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -23,7 +23,7 @@ module PreferencesHelper if defined.size != DASHBOARD_CHOICES.size # Ensure that anyone adding new options updates this method too - raise RuntimeError, "`User` defines #{defined.size} dashboard choices," + + raise "`User` defines #{defined.size} dashboard choices," \ " but `DASHBOARD_CHOICES` defined #{DASHBOARD_CHOICES.size}." else defined.map do |key, _| From c0fb47333a1336000a8ae605ef23572bb38d674a Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Fri, 10 Feb 2017 13:16:38 +1100 Subject: [PATCH 096/313] only print errors and warnings from webpack dev server --- config/webpack.config.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/webpack.config.js b/config/webpack.config.js index 00f448c1fbb..2ac779c8511 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -117,7 +117,8 @@ if (IS_PRODUCTION) { if (IS_DEV_SERVER) { config.devServer = { port: DEV_SERVER_PORT, - headers: { 'Access-Control-Allow-Origin': '*' } + headers: { 'Access-Control-Allow-Origin': '*' }, + stats: 'errors-only', }; config.output.publicPath = '//localhost:' + DEV_SERVER_PORT + config.output.publicPath; } From 0ca691751f516b5ee2a81a8ddedd64b8be287ec6 Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Fri, 10 Feb 2017 20:20:57 -0500 Subject: [PATCH 097/313] Remove animation for icons on filter dropdown --- app/assets/stylesheets/framework/animations.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/assets/stylesheets/framework/animations.scss b/app/assets/stylesheets/framework/animations.scss index 0a26b4c6a8c..0ca5a9343f7 100644 --- a/app/assets/stylesheets/framework/animations.scss +++ b/app/assets/stylesheets/framework/animations.scss @@ -128,8 +128,7 @@ .note-action-button .link-highlight, .toolbar-btn, -.dropdown-toggle-caret, -.fa:not(.fa-bell) { +.dropdown-toggle-caret { @include transition(color); } From 2a03f35461eeba8545a775b04751e6c7b866f8c0 Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Fri, 10 Feb 2017 20:21:18 -0500 Subject: [PATCH 098/313] Disable animation on avatars inside filter dropdowns --- app/assets/stylesheets/framework/avatar.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/assets/stylesheets/framework/avatar.scss b/app/assets/stylesheets/framework/avatar.scss index 1d59700543c..3f5b78ed445 100644 --- a/app/assets/stylesheets/framework/avatar.scss +++ b/app/assets/stylesheets/framework/avatar.scss @@ -28,6 +28,8 @@ .avatar { @extend .avatar-circle; + @include transition-property(none); + width: 40px; height: 40px; padding: 0; From 44826649b3f0e5d5d2c37e506eef7f5e8a0a724a Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 10 Feb 2017 10:37:16 -0500 Subject: [PATCH 099/313] Add margin to loading icon in Merge Request Widget --- app/assets/stylesheets/pages/merge_requests.scss | 8 ++++++-- ...ween-loading-icon-and-text-in-merge-request-widget.yml | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/27947-missing-margin-between-loading-icon-and-text-in-merge-request-widget.yml diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index c02a65b0903..0b0c4bc130d 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -85,14 +85,18 @@ -webkit-align-items: center; align-items: center; + i, + svg { + margin-right: 8px; + } + svg { - margin-right: 4px; position: relative; top: 1px; overflow: visible; } - &> span { + & > span { padding-right: 4px; } diff --git a/changelogs/unreleased/27947-missing-margin-between-loading-icon-and-text-in-merge-request-widget.yml b/changelogs/unreleased/27947-missing-margin-between-loading-icon-and-text-in-merge-request-widget.yml new file mode 100644 index 00000000000..1dfabd3813b --- /dev/null +++ b/changelogs/unreleased/27947-missing-margin-between-loading-icon-and-text-in-merge-request-widget.yml @@ -0,0 +1,4 @@ +--- +title: Add space between text and loading icon in Megre Request Widget +merge_request: 9119 +author: From d4317e4d22b33d0bfe07b231ddeb4dd774aa0bb7 Mon Sep 17 00:00:00 2001 From: winniehell Date: Thu, 9 Feb 2017 12:03:41 +0100 Subject: [PATCH 100/313] Use textarea for quick submit spec --- .../behaviors/quick_submit_spec.js | 28 ++++++++++--------- .../fixtures/behaviors/quick_submit.html.haml | 1 - 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/spec/javascripts/behaviors/quick_submit_spec.js b/spec/javascripts/behaviors/quick_submit_spec.js index 1541037888f..8113b16b74a 100644 --- a/spec/javascripts/behaviors/quick_submit_spec.js +++ b/spec/javascripts/behaviors/quick_submit_spec.js @@ -12,31 +12,33 @@ require('~/behaviors/quick_submit'); // Prevent a form submit from moving us off the testing page return e.preventDefault(); }); - return this.spies = { + this.spies = { submit: spyOnEvent('form', 'submit') }; + + this.textarea = $('.js-quick-submit textarea').first(); }); it('does not respond to other keyCodes', function() { - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ keyCode: 32 })); return expect(this.spies.submit).not.toHaveBeenTriggered(); }); it('does not respond to Enter alone', function() { - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ ctrlKey: false, metaKey: false })); return expect(this.spies.submit).not.toHaveBeenTriggered(); }); it('does not respond to repeated events', function() { - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ repeat: true })); return expect(this.spies.submit).not.toHaveBeenTriggered(); }); it('disables submit buttons', function() { - $('textarea').trigger(keydownEvent()); + this.textarea.trigger(keydownEvent()); expect($('input[type=submit]')).toBeDisabled(); return expect($('button[type=submit]')).toBeDisabled(); }); @@ -44,34 +46,34 @@ require('~/behaviors/quick_submit'); // only run the tests that apply to the current platform if (navigator.userAgent.match(/Macintosh/)) { it('responds to Meta+Enter', function() { - $('input.quick-submit-input').trigger(keydownEvent()); + this.textarea.trigger(keydownEvent()); return expect(this.spies.submit).toHaveBeenTriggered(); }); it('excludes other modifier keys', function() { - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ altKey: true })); - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ ctrlKey: true })); - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ shiftKey: true })); return expect(this.spies.submit).not.toHaveBeenTriggered(); }); } else { it('responds to Ctrl+Enter', function() { - $('input.quick-submit-input').trigger(keydownEvent()); + this.textarea.trigger(keydownEvent()); return expect(this.spies.submit).toHaveBeenTriggered(); }); it('excludes other modifier keys', function() { - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ altKey: true })); - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ metaKey: true })); - $('input.quick-submit-input').trigger(keydownEvent({ + this.textarea.trigger(keydownEvent({ shiftKey: true })); return expect(this.spies.submit).not.toHaveBeenTriggered(); diff --git a/spec/javascripts/fixtures/behaviors/quick_submit.html.haml b/spec/javascripts/fixtures/behaviors/quick_submit.html.haml index dc2ceed42f4..6dd53931a42 100644 --- a/spec/javascripts/fixtures/behaviors/quick_submit.html.haml +++ b/spec/javascripts/fixtures/behaviors/quick_submit.html.haml @@ -1,5 +1,4 @@ %form.js-quick-submit{ action: '/foo' } - %input{ type: 'text', class: 'quick-submit-input'} %textarea %input{ type: 'submit'} Submit From 128d8b61180845e0465a3fe4e5f64d417f4f819a Mon Sep 17 00:00:00 2001 From: winniehell Date: Thu, 9 Feb 2017 12:47:55 +0100 Subject: [PATCH 101/313] Replace static fixture for behaviors/quick_submit_spec.js (!9086) --- changelogs/unreleased/quick-submit-fixture.yml | 4 ++++ .../javascripts/behaviors/quick_submit_spec.js | 18 +++++++++++++----- .../fixtures/behaviors/quick_submit.html.haml | 5 ----- 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 changelogs/unreleased/quick-submit-fixture.yml delete mode 100644 spec/javascripts/fixtures/behaviors/quick_submit.html.haml diff --git a/changelogs/unreleased/quick-submit-fixture.yml b/changelogs/unreleased/quick-submit-fixture.yml new file mode 100644 index 00000000000..a2cf05dabec --- /dev/null +++ b/changelogs/unreleased/quick-submit-fixture.yml @@ -0,0 +1,4 @@ +--- +title: Replace static fixture for behaviors/quick_submit_spec.js +merge_request: 9086 +author: winniehell diff --git a/spec/javascripts/behaviors/quick_submit_spec.js b/spec/javascripts/behaviors/quick_submit_spec.js index 8113b16b74a..0e4c2c560cc 100644 --- a/spec/javascripts/behaviors/quick_submit_spec.js +++ b/spec/javascripts/behaviors/quick_submit_spec.js @@ -5,9 +5,9 @@ require('~/behaviors/quick_submit'); (function() { describe('Quick Submit behavior', function() { var keydownEvent; - preloadFixtures('static/behaviors/quick_submit.html.raw'); + preloadFixtures('issues/open-issue.html.raw'); beforeEach(function() { - loadFixtures('static/behaviors/quick_submit.html.raw'); + loadFixtures('issues/open-issue.html.raw'); $('form').submit(function(e) { // Prevent a form submit from moving us off the testing page return e.preventDefault(); @@ -37,10 +37,18 @@ require('~/behaviors/quick_submit'); })); return expect(this.spies.submit).not.toHaveBeenTriggered(); }); - it('disables submit buttons', function() { + it('disables input of type submit', function() { + const submitButton = $('.js-quick-submit input[type=submit]'); this.textarea.trigger(keydownEvent()); - expect($('input[type=submit]')).toBeDisabled(); - return expect($('button[type=submit]')).toBeDisabled(); + expect(submitButton).toBeDisabled(); + }); + it('disables button of type submit', function() { + // button doesn't exist in fixture, add it manually + const submitButton = $(''); + submitButton.insertAfter(this.textarea); + + this.textarea.trigger(keydownEvent()); + expect(submitButton).toBeDisabled(); }); // We cannot stub `navigator.userAgent` for CI's `rake karma` task, so we'll // only run the tests that apply to the current platform diff --git a/spec/javascripts/fixtures/behaviors/quick_submit.html.haml b/spec/javascripts/fixtures/behaviors/quick_submit.html.haml deleted file mode 100644 index 6dd53931a42..00000000000 --- a/spec/javascripts/fixtures/behaviors/quick_submit.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -%form.js-quick-submit{ action: '/foo' } - %textarea - - %input{ type: 'submit'} Submit - %button.btn{ type: 'submit' } Submit From dd5f32c1996e91a5ca6f699b093624bff7ddc5b3 Mon Sep 17 00:00:00 2001 From: winniehell Date: Thu, 9 Feb 2017 22:39:04 +0100 Subject: [PATCH 102/313] Replace static fixture for new_branch_spec.js (!9131) --- changelogs/unreleased/new-branch-fixture.yml | 4 +++ spec/javascripts/fixtures/branches.rb | 28 +++++++++++++++++++ .../javascripts/fixtures/new_branch.html.haml | 4 --- spec/javascripts/new_branch_spec.js | 4 +-- 4 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 changelogs/unreleased/new-branch-fixture.yml create mode 100644 spec/javascripts/fixtures/branches.rb delete mode 100644 spec/javascripts/fixtures/new_branch.html.haml diff --git a/changelogs/unreleased/new-branch-fixture.yml b/changelogs/unreleased/new-branch-fixture.yml new file mode 100644 index 00000000000..ce5ed816102 --- /dev/null +++ b/changelogs/unreleased/new-branch-fixture.yml @@ -0,0 +1,4 @@ +--- +title: Replace static fixture for new_branch_spec.js +merge_request: 9131 +author: winniehell diff --git a/spec/javascripts/fixtures/branches.rb b/spec/javascripts/fixtures/branches.rb new file mode 100644 index 00000000000..0e7c2351b66 --- /dev/null +++ b/spec/javascripts/fixtures/branches.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +describe Projects::BranchesController, '(JavaScript fixtures)', type: :controller do + include JavaScriptFixturesHelpers + + let(:admin) { create(:admin) } + let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} + let(:project) { create(:project, :repository, namespace: namespace, path: 'branches-project') } + + render_views + + before(:all) do + clean_frontend_fixtures('branches/') + end + + before(:each) do + sign_in(admin) + end + + it 'branches/new_branch.html.raw' do |example| + get :new, + namespace_id: project.namespace.to_param, + project_id: project.to_param + + expect(response).to be_success + store_frontend_fixture(response, example.description) + end +end diff --git a/spec/javascripts/fixtures/new_branch.html.haml b/spec/javascripts/fixtures/new_branch.html.haml deleted file mode 100644 index f06629e5ecc..00000000000 --- a/spec/javascripts/fixtures/new_branch.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%form.js-create-branch-form - %input.js-branch-name - .js-branch-name-error - %input{id: "ref"} diff --git a/spec/javascripts/new_branch_spec.js b/spec/javascripts/new_branch_spec.js index 9b657868523..1d014502c2a 100644 --- a/spec/javascripts/new_branch_spec.js +++ b/spec/javascripts/new_branch_spec.js @@ -8,7 +8,7 @@ require('~/new_branch_form'); describe('Branch', function() { return describe('create a new branch', function() { var expectToHaveError, fillNameWith; - preloadFixtures('static/new_branch.html.raw'); + preloadFixtures('branches/new_branch.html.raw'); fillNameWith = function(value) { return $('.js-branch-name').val(value).trigger('blur'); }; @@ -16,7 +16,7 @@ require('~/new_branch_form'); return expect($('.js-branch-name-error span').text()).toEqual(error); }; beforeEach(function() { - loadFixtures('static/new_branch.html.raw'); + loadFixtures('branches/new_branch.html.raw'); $('form').on('submit', function(e) { return e.preventDefault(); }); From b48d30e4d27d2482f5517fc58751953d32f0ded6 Mon Sep 17 00:00:00 2001 From: winniehell Date: Fri, 10 Feb 2017 19:29:03 +0100 Subject: [PATCH 103/313] Reintroduce coverage report for JavaScript (!9133) --- .gitlab-ci.yml | 4 ++-- changelogs/unreleased/cover-my-karma.yml | 4 ++++ config/karma.config.js | 7 +++++++ config/webpack.config.js | 1 + package.json | 10 ++++++++++ 5 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/cover-my-karma.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 733710bb005..8d6383dfdb9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -252,7 +252,7 @@ karma: name: coverage-javascript expire_in: 31d paths: - - coverage-javascript/default/ + - coverage-javascript/ lint-doc: stage: test @@ -395,7 +395,7 @@ pages: - mv public/ .public/ - mkdir public/ - mv coverage/ public/coverage-ruby/ || true - - mv coverage-javascript/default/ public/coverage-javascript/ || true + - mv coverage-javascript/ public/coverage-javascript/ || true - mv eslint-report.html public/ || true artifacts: paths: diff --git a/changelogs/unreleased/cover-my-karma.yml b/changelogs/unreleased/cover-my-karma.yml new file mode 100644 index 00000000000..4a823dc5ca4 --- /dev/null +++ b/changelogs/unreleased/cover-my-karma.yml @@ -0,0 +1,4 @@ +--- +title: Reintroduce coverage report for JavaScript +merge_request: 9133 +author: winniehell diff --git a/config/karma.config.js b/config/karma.config.js index 44229e2ee88..a1fbeab1f46 100644 --- a/config/karma.config.js +++ b/config/karma.config.js @@ -15,6 +15,13 @@ module.exports = function(config) { preprocessors: { 'spec/javascripts/**/*.js?(.es6)': ['webpack', 'sourcemap'], }, + reporters: ['progress', 'coverage-istanbul'], + coverageIstanbulReporter: { + reports: ['html', 'text-summary'], + dir: 'coverage-javascript/', + subdir: '.', + fixWebpackSourcePaths: true + }, webpack: webpackConfig, webpackMiddleware: { stats: 'errors-only' }, }); diff --git a/config/webpack.config.js b/config/webpack.config.js index 00f448c1fbb..e800cc3fd84 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -54,6 +54,7 @@ var config = { exclude: /(node_modules|vendor\/assets)/, loader: 'babel-loader', options: { + plugins: ['istanbul'], presets: [ ["es2015", {"modules": false}], 'stage-2' diff --git a/package.json b/package.json index 24e11a4607f..dbdbeabfb67 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "webpack-dev-server": "^2.3.0" }, "devDependencies": { + "babel-plugin-istanbul": "^4.0.0", "eslint": "^3.10.1", "eslint-config-airbnb-base": "^10.0.1", "eslint-plugin-filenames": "^1.1.0", @@ -45,9 +46,18 @@ "jasmine-core": "^2.5.2", "jasmine-jquery": "^2.1.1", "karma": "^1.4.1", + "karma-coverage-istanbul-reporter": "^0.2.0", "karma-jasmine": "^1.1.0", "karma-phantomjs-launcher": "^1.0.2", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^2.0.2" + }, + "nyc": { + "exclude": [ + "spec/javascripts/test_bundle.js", + "spec/javascripts/**/*_spec.js", + "spec/javascripts/**/*_spec.js.es6", + "app/assets/javascripts/droplab/**/*" + ] } } From bfb82f8a0d4d837a0472342c05de18c60037a2ea Mon Sep 17 00:00:00 2001 From: winniehell Date: Sat, 11 Feb 2017 00:45:54 +0100 Subject: [PATCH 104/313] Include all files with 0% coverage in report --- spec/javascripts/test_bundle.js | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/spec/javascripts/test_bundle.js b/spec/javascripts/test_bundle.js index 030d2de090a..ca707d872a4 100644 --- a/spec/javascripts/test_bundle.js +++ b/spec/javascripts/test_bundle.js @@ -42,3 +42,38 @@ testsContext.keys().forEach(function (path) { }); } }); + +// workaround: include all source files to find files with 0% coverage +// see also https://github.com/deepsweet/istanbul-instrumenter-loader/issues/15 +describe('Uncovered files', function () { + // the following files throw errors because of undefined variables + const troubleMakers = [ + './blob_edit/blob_edit_bundle.js', + './cycle_analytics/components/stage_plan_component.js', + './cycle_analytics/components/stage_staging_component.js', + './cycle_analytics/components/stage_test_component.js', + './diff_notes/components/jump_to_discussion.js', + './diff_notes/components/resolve_count.js', + './merge_conflicts/components/inline_conflict_lines.js', + './merge_conflicts/components/parallel_conflict_lines.js', + './network/branch_graph.js', + ]; + + const sourceFiles = require.context('~', true, /^\.\/(?!application\.js).*\.(js|es6)$/); + sourceFiles.keys().forEach(function (path) { + // ignore if there is a matching spec file + if (testsContext.keys().indexOf(`${path.replace(/\.js(\.es6)?$/, '')}_spec`) > -1) { + return; + } + + it(`includes '${path}'`, function () { + try { + sourceFiles(path); + } catch (err) { + if (troubleMakers.indexOf(path) === -1) { + expect(err).toBeNull(); + } + } + }); + }); +}); From 9a24db121c6eda400ee531bf0253038d9fb28a52 Mon Sep 17 00:00:00 2001 From: wendy0402 Date: Sun, 29 Jan 2017 07:14:56 +0700 Subject: [PATCH 105/313] fix issue creation from milestone doesn't assign the milestone --- app/services/issues/build_service.rb | 10 +++++++++- changelogs/unreleased/fix_issue_from_milestone.yml | 4 ++++ spec/services/issues/build_service_spec.rb | 11 ++++++++++- spec/services/issues/create_service_spec.rb | 1 + ...e_create_service_slash_commands_shared_examples.rb | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/fix_issue_from_milestone.yml diff --git a/app/services/issues/build_service.rb b/app/services/issues/build_service.rb index a63982f60c8..7cd927d8005 100644 --- a/app/services/issues/build_service.rb +++ b/app/services/issues/build_service.rb @@ -44,7 +44,15 @@ module Issues end def issue_params - @issue_params ||= issue_params_with_info_from_merge_request.merge(params.slice(:title, :description)) + @issue_params ||= issue_params_with_info_from_merge_request.merge(whitelisted_issue_params) + end + + def whitelisted_issue_params + if can?(current_user, :admin_issue, project) + params.slice(:title, :description, :milestone_id) + else + params.slice(:title, :description) + end end end end diff --git a/changelogs/unreleased/fix_issue_from_milestone.yml b/changelogs/unreleased/fix_issue_from_milestone.yml new file mode 100644 index 00000000000..02581e3ea09 --- /dev/null +++ b/changelogs/unreleased/fix_issue_from_milestone.yml @@ -0,0 +1,4 @@ +--- +title: fix milestone does not automatically assign when create issue from milestone +merge_request: +author: diff --git a/spec/services/issues/build_service_spec.rb b/spec/services/issues/build_service_spec.rb index 4cfba35c830..09807e5d35b 100644 --- a/spec/services/issues/build_service_spec.rb +++ b/spec/services/issues/build_service_spec.rb @@ -120,11 +120,20 @@ describe Issues::BuildService, services: true do end describe '#execute' do + let(:milestone) { create(:milestone, project: project) } + it 'builds a new issues with given params' do - issue = described_class.new(project, user, title: 'Issue #1', description: 'Issue description').execute + issue = described_class.new( + project, + user, + title: 'Issue #1', + description: 'Issue description', + milestone_id: milestone.id, + ).execute expect(issue.title).to eq('Issue #1') expect(issue.description).to eq('Issue description') + expect(issue.milestone).to eq(milestone) end end end diff --git a/spec/services/issues/create_service_spec.rb b/spec/services/issues/create_service_spec.rb index 30578ee4c7d..e1feeed8a67 100644 --- a/spec/services/issues/create_service_spec.rb +++ b/spec/services/issues/create_service_spec.rb @@ -46,6 +46,7 @@ describe Issues::CreateService, services: true do expect(issue).to be_persisted expect(issue.title).to eq('Awesome issue') + expect(issue.description).to eq('please fix') expect(issue.assignee).to be_nil expect(issue.labels).to be_empty expect(issue.milestone).to be_nil diff --git a/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb b/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb index dd54b0addda..c64574679b6 100644 --- a/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb +++ b/spec/support/services/issuable_create_service_slash_commands_shared_examples.rb @@ -58,7 +58,7 @@ shared_examples 'new issuable record that supports slash commands' do let(:example_params) do { assignee: create(:user), - milestone_id: double(:milestone), + milestone_id: 1, description: %(/assign @#{assignee.username}\n/milestone %"#{milestone.name}") } end From f7d8c29e71dc3a5aed4cf7252beaee6fe634de6b Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Sun, 12 Feb 2017 12:10:29 +0000 Subject: [PATCH 106/313] Fix broken path --- .../components/environment_item.js.es6 | 108 ++++++++++++++---- 1 file changed, 83 insertions(+), 25 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index 399473bec65..391539232b1 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -1,5 +1,5 @@ const Vue = require('vue'); -const Timeago = require('timeago.j'); +const Timeago = require('timeago.js'); require('../../lib/utils/text_utility'); require('../../vue_shared/components/commit'); @@ -72,7 +72,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean} */ hasLastDeploymentKey() { - if (this.model.latest.last_deployment && + if (this.model.lastest && this.model.latest.last_deployment && !this.$options.isObjectEmpty(this.model.latest.last_deployment)) { return true; } @@ -86,7 +86,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ hasManualActions() { - return this.model.latest.last_deployment && + return this.model.lastest && this.model.latest.last_deployment && this.model.latest.last_deployment.manual_actions && this.model.latest.last_deployment.manual_actions.length > 0; }, @@ -107,7 +107,8 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ canRetry() { - return this.hasLastDeploymentKey && + return this.model.lastest && + this.hasLastDeploymentKey && this.model.latest.last_deployment && this.model.latest.last_deployment.deployable; }, @@ -118,7 +119,8 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ canShowDate() { - return this.model.latest.last_deployment && + return this.model.lastest && + this.model.latest.last_deployment && this.model.latest.last_deployment.deployable && this.model.latest.last_deployment.deployable !== undefined; }, @@ -129,7 +131,13 @@ module.exports = Vue.component('environment-item', { * @returns {String} */ createdDate() { - return timeagoInstance.format(this.model.latest.last_deployment.deployable.created_at); + if (this.model.lastest && + this.model.latest.last_deployment && + this.model.lastest.last_deployment.deployable && + this.model.latest.last_deployment.deployable.created_at) { + return timeagoInstance.format(this.model.latest.last_deployment.deployable.created_at); + } + return ''; }, /** @@ -156,7 +164,8 @@ module.exports = Vue.component('environment-item', { * @returns {String} */ userImageAltDescription() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.user && this.model.latest.last_deployment.user.username) { return `${this.model.latest.last_deployment.user.username}'s avatar'`; @@ -170,7 +179,8 @@ module.exports = Vue.component('environment-item', { * @returns {String|Undefined} */ commitTag() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.tag) { return this.model.latest.last_deployment.tag; } @@ -183,7 +193,8 @@ module.exports = Vue.component('environment-item', { * @returns {Object|Undefined} */ commitRef() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.ref) { return this.model.latest.last_deployment.ref; } @@ -196,7 +207,8 @@ module.exports = Vue.component('environment-item', { * @returns {String|Undefined} */ commitUrl() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.commit && this.model.latest.last_deployment.commit.commit_path) { return this.model.latest.last_deployment.commit.commit_path; @@ -210,7 +222,8 @@ module.exports = Vue.component('environment-item', { * @returns {String|Undefined} */ commitShortSha() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.commit && this.model.latest.last_deployment.commit.short_id) { return this.model.latest.last_deployment.commit.short_id; @@ -224,7 +237,8 @@ module.exports = Vue.component('environment-item', { * @returns {String|Undefined} */ commitTitle() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.commit && this.model.latest.last_deployment.commit.title) { return this.model.latest.last_deployment.commit.title; @@ -238,7 +252,8 @@ module.exports = Vue.component('environment-item', { * @returns {Object|Undefined} */ commitAuthor() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.commit && this.model.latest.last_deployment.commit.author) { return this.model.latest.last_deployment.commit.author; @@ -253,7 +268,8 @@ module.exports = Vue.component('environment-item', { * @returns {String|Undefined} */ retryUrl() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.deployable && this.model.latest.last_deployment.deployable.retry_path) { return this.model.latest.last_deployment.deployable.retry_path; @@ -267,7 +283,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ isLastDeployment() { - return this.model.latest.last_deployment && + return this.model.latest && this.model.latest.last_deployment && this.model.latest.last_deployment['last?']; }, @@ -277,7 +293,8 @@ module.exports = Vue.component('environment-item', { * @returns {String} */ buildName() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.deployable) { return `${this.model.latest.last_deployment.deployable.name} #${this.model.latest.last_deployment.deployable.id}`; } @@ -290,7 +307,8 @@ module.exports = Vue.component('environment-item', { * @returns {String} */ deploymentInternalId() { - if (this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.iid) { return `#${this.model.latest.last_deployment.iid}`; } @@ -303,7 +321,8 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean} */ deploymentHasUser() { - return !this.$options.isObjectEmpty(this.model.latest.last_deployment) && + return this.model.latest && + !this.$options.isObjectEmpty(this.model.latest.last_deployment) && !this.$options.isObjectEmpty(this.model.latest.last_deployment.user); }, @@ -314,7 +333,8 @@ module.exports = Vue.component('environment-item', { * @returns {Object} */ deploymentUser() { - if (!this.$options.isObjectEmpty(this.model.latest.last_deployment) && + if (this.model.latest && + !this.$options.isObjectEmpty(this.model.latest.last_deployment) && !this.$options.isObjectEmpty(this.model.latest.last_deployment.user)) { return this.model.latest.last_deployment.user; } @@ -330,10 +350,39 @@ module.exports = Vue.component('environment-item', { */ shouldRenderBuildName() { return !this.model.isFolder && + this.model.lastest && !this.$options.isObjectEmpty(this.model.latest.last_deployment) && !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); }, + /** + * Verifies the presence of all the keys needed to render the buil_path. + * + * @return {String} + */ + buildPath() { + if (this.model.latest && + this.model.lastest.last_deployment && + this.model.latest.last_deployment.deployable && + this.model.lastest.last_deployment.deployable.build_path) { + return this.model.lastest.last_deployment.deployable.build_path; + } + + return ''; + }, + /** + * Verifies the presence of all the keys needed to render the external_url. + * + * @return {String} + */ + externalURL() { + if (this.model.latest && this.model.latest.external_url) { + return this.model.latest.external_url; + } + + return ''; + }, + /** * Verifies if deplyment internal ID should be rendered by verifing * if all the information needed is present @@ -343,9 +392,18 @@ module.exports = Vue.component('environment-item', { */ shouldRenderDeploymentID() { return !this.model.isFolder && + this.model.lastest && !this.$options.isObjectEmpty(this.model.latest.last_deployment) && this.model.latest.last_deployment.iid !== undefined; }, + + environmentPath() { + if (this.model && this.model.lastest && this.model.latest.environment_path) { + return this.model.latest.environment_path; + } + + return ''; + }, }, /** @@ -368,7 +426,7 @@ module.exports = Vue.component('environment-item', { + :href="environmentPath"> {{model.name}} @@ -406,7 +464,7 @@ module.exports = Vue.component('environment-item', { + :href="buildPath"> {{buildName}} @@ -445,21 +503,21 @@ module.exports = Vue.component('environment-item', {
-
+ :external-url="externalURL">
-
-
Date: Sun, 12 Feb 2017 13:43:46 +0000 Subject: [PATCH 107/313] Fix typo --- .../components/environment_item.js.es6 | 24 +++++++++---------- spec/features/projects/builds_spec.rb | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index 391539232b1..7805152b173 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -72,7 +72,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean} */ hasLastDeploymentKey() { - if (this.model.lastest && this.model.latest.last_deployment && + if (this.model.latest && this.model.latest.last_deployment && !this.$options.isObjectEmpty(this.model.latest.last_deployment)) { return true; } @@ -86,7 +86,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ hasManualActions() { - return this.model.lastest && this.model.latest.last_deployment && + return this.model.latest && this.model.latest.last_deployment && this.model.latest.last_deployment.manual_actions && this.model.latest.last_deployment.manual_actions.length > 0; }, @@ -107,7 +107,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ canRetry() { - return this.model.lastest && + return this.model.latest && this.hasLastDeploymentKey && this.model.latest.last_deployment && this.model.latest.last_deployment.deployable; @@ -119,7 +119,7 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ canShowDate() { - return this.model.lastest && + return this.model.latest && this.model.latest.last_deployment && this.model.latest.last_deployment.deployable && this.model.latest.last_deployment.deployable !== undefined; @@ -131,9 +131,9 @@ module.exports = Vue.component('environment-item', { * @returns {String} */ createdDate() { - if (this.model.lastest && + if (this.model.latest && this.model.latest.last_deployment && - this.model.lastest.last_deployment.deployable && + this.model.latest.last_deployment.deployable && this.model.latest.last_deployment.deployable.created_at) { return timeagoInstance.format(this.model.latest.last_deployment.deployable.created_at); } @@ -350,7 +350,7 @@ module.exports = Vue.component('environment-item', { */ shouldRenderBuildName() { return !this.model.isFolder && - this.model.lastest && + this.model.latest && !this.$options.isObjectEmpty(this.model.latest.last_deployment) && !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); }, @@ -362,10 +362,10 @@ module.exports = Vue.component('environment-item', { */ buildPath() { if (this.model.latest && - this.model.lastest.last_deployment && + this.model.latest.last_deployment && this.model.latest.last_deployment.deployable && - this.model.lastest.last_deployment.deployable.build_path) { - return this.model.lastest.last_deployment.deployable.build_path; + this.model.latest.last_deployment.deployable.build_path) { + return this.model.latest.last_deployment.deployable.build_path; } return ''; @@ -392,13 +392,13 @@ module.exports = Vue.component('environment-item', { */ shouldRenderDeploymentID() { return !this.model.isFolder && - this.model.lastest && + this.model.latest && !this.$options.isObjectEmpty(this.model.latest.last_deployment) && this.model.latest.last_deployment.iid !== undefined; }, environmentPath() { - if (this.model && this.model.lastest && this.model.latest.environment_path) { + if (this.model && this.model.latest && this.model.latest.environment_path) { return this.model.latest.environment_path; } diff --git a/spec/features/projects/builds_spec.rb b/spec/features/projects/builds_spec.rb index f7e0115643e..80ba5ff1a63 100644 --- a/spec/features/projects/builds_spec.rb +++ b/spec/features/projects/builds_spec.rb @@ -271,7 +271,7 @@ feature 'Builds', :feature do let!(:deployment) { create(:deployment, environment: environment, sha: project.commit.id) } let(:build) { create(:ci_build, :success, environment: environment.name, pipeline: pipeline) } - it 'shows a link to lastest deployment' do + it 'shows a link to latest deployment' do visit namespace_project_build_path(project.namespace, project, build) expect(page).to have_link('latest deployment') From 991a7ae86055df2d0eb619e1d29a1e24e322c741 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Thu, 9 Feb 2017 12:18:47 +0000 Subject: [PATCH 108/313] Adds pagination component --- .../components/environment.js.es6 | 25 +++++++++++++++++-- .../stores/environments_store.js.es6 | 13 ++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6 index 11a965fcddf..f89dbdbda1d 100644 --- a/app/assets/javascripts/environments/components/environment.js.es6 +++ b/app/assets/javascripts/environments/components/environment.js.es6 @@ -6,11 +6,13 @@ Vue.use(require('vue-resource')); const EnvironmentsService = require('../services/environments_service'); const EnvironmentItem = require('./environment_item'); const Store = require('../stores/environments_store'); +require('../../vue_shared/components/table_pagination'); module.exports = Vue.component('environment-component', { components: { 'environment-item': EnvironmentItem, + 'table-pagination': gl.VueGlPagination, }, data() { @@ -34,6 +36,10 @@ module.exports = Vue.component('environment-component', { commitIconSvg: environmentsData.commitIconSvg, playIconSvg: environmentsData.playIconSvg, terminalIconSvg: environmentsData.terminalIconSvg, + + // Pagination Properties, + paginationInformation: {}, + pageNumber: 1, }; }, @@ -61,14 +67,18 @@ module.exports = Vue.component('environment-component', { */ created() { const scope = this.$options.getQueryParameter('scope') || this.visibility; - const endpoint = `${this.endpoint}?scope=${scope}`; + const pageNumber = this.$options.getQueryParameter('page') || this.pageNumber; + const endpoint = `${this.endpoint}?scope=${scope}&page=${pageNumber}`; const service = new EnvironmentsService(endpoint); this.isLoading = true; return service.all() - .then(resp => resp.json()) + .then((resp) => { + debugger; + return resp.json(); + }) .then((json) => { this.store.storeAvailableCount(json.available_count); this.store.storeStoppedCount(json.stopped_count); @@ -111,6 +121,10 @@ module.exports = Vue.component('environment-component', { toggleRow(model) { return this.store.toggleFolder(model.name); }, + + changePage(pageNumber, scope) { + gl.utils.visitUrl(`?scope=${scope}&p=${pageNumber}`); + }, }, template: ` @@ -192,6 +206,13 @@ module.exports = Vue.component('environment-component', { + + +
diff --git a/app/assets/javascripts/environments/stores/environments_store.js.es6 b/app/assets/javascripts/environments/stores/environments_store.js.es6 index 749dd882188..e55b8624ac8 100644 --- a/app/assets/javascripts/environments/stores/environments_store.js.es6 +++ b/app/assets/javascripts/environments/stores/environments_store.js.es6 @@ -1,3 +1,4 @@ +require('~/lib/utils/common_utils'); /** * Environments Store. * @@ -10,6 +11,7 @@ class EnvironmentsStore { this.state.environments = []; this.state.stoppedCounter = 0; this.state.availableCounter = 0; + this.state.paginationInformation = {}; return this; } @@ -41,6 +43,17 @@ class EnvironmentsStore { return filteredEnvironments; } + storePagination(pagination = {}) { + const normalizedHeaders = gl.utils.normalizedHeaders(pagination); + + const paginationInformation = { + + }; + + this.paginationInformation = paginationInformation; + return paginationInformation; + } + /** * Stores the number of available environments. * From fb35980893f918f7dbad0f433447c6df13a1c757 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Thu, 9 Feb 2017 14:49:13 +0000 Subject: [PATCH 109/313] Verify `latest` key is present when needed --- .../environments/components/environment_item.js.es6 | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index 7805152b173..d3ca4cb8dde 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -355,6 +355,18 @@ module.exports = Vue.component('environment-item', { !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); }, + buildPath(){ + return this.model.latest && + this.model.latest.last_deployment && + this.model.latest.last_deployment.deployable && + this.model.latest.last_deployment.deployable.build_path || + ''; + }, + + externalURL() { + return this.model.latest && this.model.latest.external_url || ''; + }, + /** * Verifies the presence of all the keys needed to render the buil_path. * From 595afed2e3de93d1685b2f77dd8e72df2781a57b Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Thu, 9 Feb 2017 15:10:16 +0000 Subject: [PATCH 110/313] Integrates pagination component with API Adds pagination tests Remove misplaced comment Fix broken store test --- .../components/environment.js.es6 | 37 +++++++++++-------- .../components/environment_item.js.es6 | 16 +++++++- .../stores/environments_store.js.es6 | 12 ++++-- .../vue_pipelines_index/pipelines.js.es6 | 1 + .../components/table_pagination.js.es6 | 4 +- .../environments/environment_spec.js.es6 | 28 +++++++++++--- .../environments_store_spec.js.es6 | 36 +++++++++++++++--- 7 files changed, 100 insertions(+), 34 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6 index f89dbdbda1d..d5bb9f91e7f 100644 --- a/app/assets/javascripts/environments/components/environment.js.es6 +++ b/app/assets/javascripts/environments/components/environment.js.es6 @@ -59,6 +59,7 @@ module.exports = Vue.component('environment-component', { canCreateEnvironmentParsed() { return this.$options.convertPermissionToBoolean(this.canCreateEnvironment); }, + }, /** @@ -68,6 +69,7 @@ module.exports = Vue.component('environment-component', { created() { const scope = this.$options.getQueryParameter('scope') || this.visibility; const pageNumber = this.$options.getQueryParameter('page') || this.pageNumber; + const endpoint = `${this.endpoint}?scope=${scope}&page=${pageNumber}`; const service = new EnvironmentsService(endpoint); @@ -75,14 +77,15 @@ module.exports = Vue.component('environment-component', { this.isLoading = true; return service.all() - .then((resp) => { - debugger; - return resp.json(); - }) - .then((json) => { - this.store.storeAvailableCount(json.available_count); - this.store.storeStoppedCount(json.stopped_count); - this.store.storeEnvironments(json.environments); + .then(resp => ({ + headers: resp.headers, + body: resp.json(), + })) + .then((response) => { + this.store.storeAvailableCount(response.body.available_count); + this.store.storeStoppedCount(response.body.stopped_count); + this.store.storeEnvironments(response.body.environments); + this.store.storePagination(response.headers); }) .then(() => { this.isLoading = false; @@ -122,8 +125,14 @@ module.exports = Vue.component('environment-component', { return this.store.toggleFolder(model.name); }, - changePage(pageNumber, scope) { - gl.utils.visitUrl(`?scope=${scope}&p=${pageNumber}`); + /** + * Will change the page number and update the URL. + * + * @param {Number} pageNumber desired page to go to. + */ + changePage(pageNumber) { + const param = window.location.search.replace(/page=\d/g, `page=${pageNumber}`); + gl.utils.visitUrl(param); }, }, @@ -131,7 +140,7 @@ module.exports = Vue.component('environment-component', { diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index d3ca4cb8dde..1648f06a991 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -355,6 +355,11 @@ module.exports = Vue.component('environment-item', { !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); }, + /** + * Verifies the presence of all the keys needed to render the buil_path. + * + * @return {String} + */ buildPath(){ return this.model.latest && this.model.latest.last_deployment && @@ -363,8 +368,17 @@ module.exports = Vue.component('environment-item', { ''; }, + /** + * Verifies the presence of all the keys needed to render the external_url. + * + * @return {String} + */ externalURL() { - return this.model.latest && this.model.latest.external_url || ''; + if (this.model.latest && this.model.latest.external_url) { + return this.model.latest.external_url; + } + + return ''; }, /** diff --git a/app/assets/javascripts/environments/stores/environments_store.js.es6 b/app/assets/javascripts/environments/stores/environments_store.js.es6 index e55b8624ac8..252e349962e 100644 --- a/app/assets/javascripts/environments/stores/environments_store.js.es6 +++ b/app/assets/javascripts/environments/stores/environments_store.js.es6 @@ -44,13 +44,17 @@ class EnvironmentsStore { } storePagination(pagination = {}) { - const normalizedHeaders = gl.utils.normalizedHeaders(pagination); - + const normalizedHeaders = gl.utils.normalizeHeaders(pagination); const paginationInformation = { - + perPage: parseInt(normalizedHeaders['X-PER-PAGE'], 10), + page: parseInt(normalizedHeaders['X-PAGE'], 10), + total: parseInt(normalizedHeaders['X-TOTAL'], 10), + totalPages: parseInt(normalizedHeaders['X-TOTAL-PAGES'], 10), + nextPage: parseInt(normalizedHeaders['X-NEXT-PAGE'], 10), + previousPage: parseInt(normalizedHeaders['X-PREV-PAGE'], 10), }; - this.paginationInformation = paginationInformation; + this.state.paginationInformation = paginationInformation; return paginationInformation; } diff --git a/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 b/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 index e47dc6935d6..9e816a285e4 100644 --- a/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 +++ b/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 @@ -36,6 +36,7 @@ require('../vue_shared/components/pipelines_table'); }, methods: { change(pagenum, apiScope) { + if (!apiScope) apiScope = 'all'; gl.utils.visitUrl(`?scope=${apiScope}&p=${pagenum}`); }, }, diff --git a/app/assets/javascripts/vue_shared/components/table_pagination.js.es6 b/app/assets/javascripts/vue_shared/components/table_pagination.js.es6 index 67c6cb73761..d8042a9b7fc 100644 --- a/app/assets/javascripts/vue_shared/components/table_pagination.js.es6 +++ b/app/assets/javascripts/vue_shared/components/table_pagination.js.es6 @@ -57,9 +57,7 @@ window.Vue = require('vue'); }, methods: { changePage(e) { - let apiScope = gl.utils.getParameterByName('scope'); - - if (!apiScope) apiScope = 'all'; + const apiScope = gl.utils.getParameterByName('scope'); const text = e.target.innerText; const { totalPages, nextPage, previousPage } = this.pageInfo; diff --git a/spec/javascripts/environments/environment_spec.js.es6 b/spec/javascripts/environments/environment_spec.js.es6 index 1d1a688a4a5..f557dcee91f 100644 --- a/spec/javascripts/environments/environment_spec.js.es6 +++ b/spec/javascripts/environments/environment_spec.js.es6 @@ -49,7 +49,7 @@ describe('Environment', () => { }); }); - describe('with environments', () => { + describe('with paginated environments', () => { const environmentsResponseInterceptor = (request, next) => { next(request.respondWith(JSON.stringify({ environments: [environment], @@ -57,11 +57,22 @@ describe('Environment', () => { available_count: 0, }), { status: 200, + headers: { + 'X-Next-Page': '2', + 'X-Page': '1', + 'X-Per-Page': '1', + 'X-Prev-Page': '', + 'X-Total': '37', + 'X-Total-Pages': '2', + }, })); }; beforeEach(() => { Vue.http.interceptors.push(environmentsResponseInterceptor); + component = new EnvironmentsComponent({ + el: document.querySelector('#environments-list-view'), + }); }); afterEach(() => { @@ -71,10 +82,6 @@ describe('Environment', () => { }); it('should render a table with environments', (done) => { - component = new EnvironmentsComponent({ - el: document.querySelector('#environments-list-view'), - }); - setTimeout(() => { expect( component.$el.querySelectorAll('table tbody tr').length, @@ -82,6 +89,17 @@ describe('Environment', () => { done(); }, 0); }); + + describe('pagination', () => { + it('should render pagination', (done) => { + setTimeout(() => { + expect( + component.$el.querySelectorAll('.gl-pagination li').length, + ).toEqual(5); + done(); + }, 0); + }); + }); }); }); diff --git a/spec/javascripts/environments/environments_store_spec.js.es6 b/spec/javascripts/environments/environments_store_spec.js.es6 index 861136c621f..8fd660c3edb 100644 --- a/spec/javascripts/environments/environments_store_spec.js.es6 +++ b/spec/javascripts/environments/environments_store_spec.js.es6 @@ -10,24 +10,48 @@ const { environmentsList } = require('./mock_data'); }); it('should start with a blank state', () => { - expect(store.state.environments.length).toBe(0); - expect(store.state.stoppedCounter).toBe(0); - expect(store.state.availableCounter).toBe(0); + expect(store.state.environments.length).toEqual(0); + expect(store.state.stoppedCounter).toEqual(0); + expect(store.state.availableCounter).toEqual(0); + expect(store.state.paginationInformation).toEqual({}); }); it('should store environments', () => { store.storeEnvironments(environmentsList); - expect(store.state.environments.length).toBe(environmentsList.length); + expect(store.state.environments.length).toEqual(environmentsList.length); }); it('should store available count', () => { store.storeAvailableCount(2); - expect(store.state.availableCounter).toBe(2); + expect(store.state.availableCounter).toEqual(2); }); it('should store stopped count', () => { store.storeStoppedCount(2); - expect(store.state.stoppedCounter).toBe(2); + expect(store.state.stoppedCounter).toEqual(2); + }); + + it('should store pagination information', () => { + const pagination = { + 'X-nExt-pAge': '2', + 'X-page': '1', + 'X-Per-Page': '1', + 'X-Prev-Page': '2', + 'X-TOTAL': '37', + 'X-Total-Pages': '2', + }; + + const expectedResult = { + perPage: 1, + page: 1, + total: 37, + totalPages: 2, + nextPage: 2, + previousPage: 2, + }; + + store.storePagination(pagination); + expect(store.state.paginationInformation).toEqual(expectedResult); }); }); })(); From 27d7ec70b1efcaac73095e6ea3894b0eb9ba8473 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Fri, 10 Feb 2017 17:26:48 +0000 Subject: [PATCH 111/313] Remove spec checking for scope 'all' since it's no longer part of component Changes after review Fix typo --- .../environments/components/environment_item.js.es6 | 6 ++++-- .../javascripts/environments/environment_spec.js.es6 | 6 +++--- .../components/table_pagination_spec.js.es6 | 12 ++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index 1648f06a991..871a09977a4 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -72,7 +72,8 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean} */ hasLastDeploymentKey() { - if (this.model.latest && this.model.latest.last_deployment && + if (this.model.latest && + this.model.latest.last_deployment && !this.$options.isObjectEmpty(this.model.latest.last_deployment)) { return true; } @@ -86,7 +87,8 @@ module.exports = Vue.component('environment-item', { * @returns {Boolean|Undefined} */ hasManualActions() { - return this.model.latest && this.model.latest.last_deployment && + return this.model.latest && + this.model.latest.last_deployment && this.model.latest.last_deployment.manual_actions && this.model.latest.last_deployment.manual_actions.length > 0; }, diff --git a/spec/javascripts/environments/environment_spec.js.es6 b/spec/javascripts/environments/environment_spec.js.es6 index f557dcee91f..657d8d2ab02 100644 --- a/spec/javascripts/environments/environment_spec.js.es6 +++ b/spec/javascripts/environments/environment_spec.js.es6 @@ -58,11 +58,11 @@ describe('Environment', () => { }), { status: 200, headers: { - 'X-Next-Page': '2', - 'X-Page': '1', + 'X-nExt-pAge': '2', + 'x-page': '1', 'X-Per-Page': '1', 'X-Prev-Page': '', - 'X-Total': '37', + 'X-TOTAL': '37', 'X-Total-Pages': '2', }, })); diff --git a/spec/javascripts/vue_shared/components/table_pagination_spec.js.es6 b/spec/javascripts/vue_shared/components/table_pagination_spec.js.es6 index e84f0dcfe67..dd495cb43bc 100644 --- a/spec/javascripts/vue_shared/components/table_pagination_spec.js.es6 +++ b/spec/javascripts/vue_shared/components/table_pagination_spec.js.es6 @@ -34,7 +34,7 @@ describe('Pagination component', () => { component.changePage({ target: { innerText: '1' } }); expect(changeChanges.one).toEqual(1); - expect(changeChanges.two).toEqual('all'); + expect(changeChanges.two).toEqual(null); }); it('should go to the previous page', () => { @@ -55,7 +55,7 @@ describe('Pagination component', () => { component.changePage({ target: { innerText: 'Prev' } }); expect(changeChanges.one).toEqual(1); - expect(changeChanges.two).toEqual('all'); + expect(changeChanges.two).toEqual(null); }); it('should go to the next page', () => { @@ -76,7 +76,7 @@ describe('Pagination component', () => { component.changePage({ target: { innerText: 'Next' } }); expect(changeChanges.one).toEqual(5); - expect(changeChanges.two).toEqual('all'); + expect(changeChanges.two).toEqual(null); }); it('should go to the last page', () => { @@ -97,7 +97,7 @@ describe('Pagination component', () => { component.changePage({ target: { innerText: 'Last >>' } }); expect(changeChanges.one).toEqual(10); - expect(changeChanges.two).toEqual('all'); + expect(changeChanges.two).toEqual(null); }); it('should go to the first page', () => { @@ -118,7 +118,7 @@ describe('Pagination component', () => { component.changePage({ target: { innerText: '<< First' } }); expect(changeChanges.one).toEqual(1); - expect(changeChanges.two).toEqual('all'); + expect(changeChanges.two).toEqual(null); }); it('should do nothing', () => { @@ -139,7 +139,7 @@ describe('Pagination component', () => { component.changePage({ target: { innerText: '...' } }); expect(changeChanges.one).toEqual(1); - expect(changeChanges.two).toEqual('all'); + expect(changeChanges.two).toEqual(null); }); }); From c2fe699ac801fd2440cc4b57083a60a334cffa06 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Sun, 12 Feb 2017 13:04:00 +0000 Subject: [PATCH 112/313] Add pagination tests for environments table Remove fdescribe statement Fix conflict --- .../components/environment.js.es6 | 20 ++++++++- .../components/environment_item.js.es6 | 27 +----------- .../environments/environment_spec.js.es6 | 42 +++++++++++++++++++ 3 files changed, 62 insertions(+), 27 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6 index d5bb9f91e7f..6d9599e7645 100644 --- a/app/assets/javascripts/environments/components/environment.js.es6 +++ b/app/assets/javascripts/environments/components/environment.js.es6 @@ -128,11 +128,29 @@ module.exports = Vue.component('environment-component', { /** * Will change the page number and update the URL. * + * If no search params are present, we'll add param for page + * If param for page is already present, we'll update it + * If there are params but none for page, we'll add it at the end. + * * @param {Number} pageNumber desired page to go to. */ changePage(pageNumber) { - const param = window.location.search.replace(/page=\d/g, `page=${pageNumber}`); + let param; + if (window.location.search.length === 0) { + param = `?page=${pageNumber}`; + } + + if (window.location.search.indexOf('page') !== -1) { + param = window.location.search.replace(/page=\d/g, `page=${pageNumber}`); + } + + if (window.location.search.length && + window.location.search.indexOf('page') === -1) { + param = `${window.location.search}&page=${pageNumber}`; + } + gl.utils.visitUrl(param); + return param; }, }, diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index 871a09977a4..fc45c3c5f53 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -357,32 +357,6 @@ module.exports = Vue.component('environment-item', { !this.$options.isObjectEmpty(this.model.latest.last_deployment.deployable); }, - /** - * Verifies the presence of all the keys needed to render the buil_path. - * - * @return {String} - */ - buildPath(){ - return this.model.latest && - this.model.latest.last_deployment && - this.model.latest.last_deployment.deployable && - this.model.latest.last_deployment.deployable.build_path || - ''; - }, - - /** - * Verifies the presence of all the keys needed to render the external_url. - * - * @return {String} - */ - externalURL() { - if (this.model.latest && this.model.latest.external_url) { - return this.model.latest.external_url; - } - - return ''; - }, - /** * Verifies the presence of all the keys needed to render the buil_path. * @@ -398,6 +372,7 @@ module.exports = Vue.component('environment-item', { return ''; }, + /** * Verifies the presence of all the keys needed to render the external_url. * diff --git a/spec/javascripts/environments/environment_spec.js.es6 b/spec/javascripts/environments/environment_spec.js.es6 index 657d8d2ab02..edd0cad32d0 100644 --- a/spec/javascripts/environments/environment_spec.js.es6 +++ b/spec/javascripts/environments/environment_spec.js.es6 @@ -99,6 +99,48 @@ describe('Environment', () => { done(); }, 0); }); + + it('should update url when no search params are present', (done) => { + spyOn(gl.utils, 'visitUrl'); + setTimeout(() => { + component.$el.querySelector('.gl-pagination li:nth-child(5) a').click(); + expect(gl.utils.visitUrl).toHaveBeenCalledWith('?page=2'); + done(); + }, 0); + }); + + it('should update url when page is already present', (done) => { + spyOn(gl.utils, 'visitUrl'); + window.history.pushState({}, null, '?page=1'); + + setTimeout(() => { + component.$el.querySelector('.gl-pagination li:nth-child(5) a').click(); + expect(gl.utils.visitUrl).toHaveBeenCalledWith('?page=2'); + done(); + }, 0); + }); + + it('should update url when page and scope are already present', (done) => { + spyOn(gl.utils, 'visitUrl'); + window.history.pushState({}, null, '?scope=all&page=1'); + + setTimeout(() => { + component.$el.querySelector('.gl-pagination li:nth-child(5) a').click(); + expect(gl.utils.visitUrl).toHaveBeenCalledWith('?scope=all&page=2'); + done(); + }, 0); + }); + + it('should update url when page and scope are already present and page is first param', (done) => { + spyOn(gl.utils, 'visitUrl'); + window.history.pushState({}, null, '?page=1&scope=all'); + + setTimeout(() => { + component.$el.querySelector('.gl-pagination li:nth-child(5) a').click(); + expect(gl.utils.visitUrl).toHaveBeenCalledWith('?page=2&scope=all'); + done(); + }, 0); + }); }); }); }); From 2bb395eeb0b6efc4d0c6f38b4ec48eaa7f65a64d Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Sun, 12 Feb 2017 17:51:03 +0000 Subject: [PATCH 113/313] Adds container to tooltip in order to make it work with overflow:hidden in parent element --- app/views/projects/diffs/_file_header.html.haml | 6 +++--- changelogs/unreleased/28032-tooltips-file-name.yml | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/28032-tooltips-file-name.yml diff --git a/app/views/projects/diffs/_file_header.html.haml b/app/views/projects/diffs/_file_header.html.haml index 5b09b6907ab..1dbfe830d52 100644 --- a/app/views/projects/diffs/_file_header.html.haml +++ b/app/views/projects/diffs/_file_header.html.haml @@ -10,13 +10,13 @@ - if diff_file.renamed_file - old_path, new_path = mark_inline_diffs(diff_file.old_path, diff_file.new_path) - %strong.file-title-name.has-tooltip{ data: { title: old_path } } + %strong.file-title-name.has-tooltip{ data: { title: old_path, container: 'body' } } = old_path → - %strong.file-title-name.has-tooltip{ data: { title: new_path } } + %strong.file-title-name.has-tooltip{ data: { title: new_path, container: 'body' } } = new_path - else - %strong.file-title-name.has-tooltip{ data: { title: diff_file.new_path } } + %strong.file-title-name.has-tooltip{ data: { title: diff_file.new_path, container: 'body' } } = diff_file.new_path - if diff_file.deleted_file deleted diff --git a/changelogs/unreleased/28032-tooltips-file-name.yml b/changelogs/unreleased/28032-tooltips-file-name.yml new file mode 100644 index 00000000000..9fe11e7c2b6 --- /dev/null +++ b/changelogs/unreleased/28032-tooltips-file-name.yml @@ -0,0 +1,5 @@ +--- +title: Adds container to tooltip in order to make it work with overflow:hidden in + parent element +merge_request: +author: From fc7d2a88f4256a68eb884981fcc2dd99febaa668 Mon Sep 17 00:00:00 2001 From: winniehell Date: Sun, 12 Feb 2017 23:49:29 +0100 Subject: [PATCH 114/313] Replace static fixture for merge_request_tabs_spec.js (!9172) --- .../unreleased/merge-request-tabs-fixture.yml | 4 +++ .../fixtures/merge_request_tabs.html.haml | 22 ------------ spec/javascripts/fixtures/merge_requests.rb | 36 +++++++++++++++++++ spec/javascripts/merge_request_tabs_spec.js | 4 +-- 4 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 changelogs/unreleased/merge-request-tabs-fixture.yml delete mode 100644 spec/javascripts/fixtures/merge_request_tabs.html.haml create mode 100644 spec/javascripts/fixtures/merge_requests.rb diff --git a/changelogs/unreleased/merge-request-tabs-fixture.yml b/changelogs/unreleased/merge-request-tabs-fixture.yml new file mode 100644 index 00000000000..289cd7b604a --- /dev/null +++ b/changelogs/unreleased/merge-request-tabs-fixture.yml @@ -0,0 +1,4 @@ +--- +title: Replace static fixture for merge_request_tabs_spec.js +merge_request: 9172 +author: winniehell diff --git a/spec/javascripts/fixtures/merge_request_tabs.html.haml b/spec/javascripts/fixtures/merge_request_tabs.html.haml deleted file mode 100644 index 68678c3d7e3..00000000000 --- a/spec/javascripts/fixtures/merge_request_tabs.html.haml +++ /dev/null @@ -1,22 +0,0 @@ -%ul.nav.nav-tabs.merge-request-tabs - %li.notes-tab - %a{href: '/foo/bar/merge_requests/1', data: {target: 'div#notes', action: 'notes', toggle: 'tab'}} - Discussion - %li.commits-tab - %a{href: '/foo/bar/merge_requests/1/commits', data: {target: 'div#commits', action: 'commits', toggle: 'tab'}} - Commits - %li.diffs-tab - %a{href: '/foo/bar/merge_requests/1/diffs', data: {target: 'div#diffs', action: 'diffs', toggle: 'tab'}} - Diffs - -.tab-content - #notes.notes.tab-pane - Notes Content - #commits.commits.tab-pane - Commits Content - #diffs.diffs.tab-pane - Diffs Content - -.mr-loading-status - .loading - Loading Animation diff --git a/spec/javascripts/fixtures/merge_requests.rb b/spec/javascripts/fixtures/merge_requests.rb new file mode 100644 index 00000000000..62984097099 --- /dev/null +++ b/spec/javascripts/fixtures/merge_requests.rb @@ -0,0 +1,36 @@ +require 'spec_helper' + +describe Projects::MergeRequestsController, '(JavaScript fixtures)', type: :controller do + include JavaScriptFixturesHelpers + + let(:admin) { create(:admin) } + let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} + let(:project) { create(:project, namespace: namespace, path: 'merge-requests-project') } + + render_views + + before(:all) do + clean_frontend_fixtures('merge_requests/') + end + + before(:each) do + sign_in(admin) + end + + it 'merge_requests/merge_request_with_task_list.html.raw' do |example| + merge_request = create(:merge_request, :with_diffs, source_project: project, target_project: project, description: '- [ ] Task List Item') + render_merge_request(example.description, merge_request) + end + + private + + def render_merge_request(fixture_file_name, merge_request) + get :show, + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.to_param + + expect(response).to be_success + store_frontend_fixture(response, fixture_file_name) + end +end diff --git a/spec/javascripts/merge_request_tabs_spec.js b/spec/javascripts/merge_request_tabs_spec.js index 92a0f1c05f7..3810991f104 100644 --- a/spec/javascripts/merge_request_tabs_spec.js +++ b/spec/javascripts/merge_request_tabs_spec.js @@ -25,7 +25,7 @@ require('vendor/jquery.scrollTo'); }; $.extend(stubLocation, defaults, stubs || {}); }; - preloadFixtures('static/merge_request_tabs.html.raw'); + preloadFixtures('merge_requests/merge_request_with_task_list.html.raw'); beforeEach(function () { this.class = new gl.MergeRequestTabs({ stubLocation: stubLocation }); @@ -41,7 +41,7 @@ require('vendor/jquery.scrollTo'); describe('#activateTab', function () { beforeEach(function () { spyOn($, 'ajax').and.callFake(function () {}); - loadFixtures('static/merge_request_tabs.html.raw'); + loadFixtures('merge_requests/merge_request_with_task_list.html.raw'); this.subject = this.class.activateTab; }); it('shows the first tab when action is show', function () { From 0f06d2646afc1bd5b445910829d3d13f04de9c94 Mon Sep 17 00:00:00 2001 From: winniehell Date: Mon, 13 Feb 2017 01:06:54 +0100 Subject: [PATCH 115/313] Replace static fixture for header_spec.js (!9174) --- .../unreleased/dynamic-header-fixture.yml | 4 +++ spec/javascripts/fixtures/header.html.haml | 35 ------------------- spec/javascripts/header_spec.js | 2 +- 3 files changed, 5 insertions(+), 36 deletions(-) create mode 100644 changelogs/unreleased/dynamic-header-fixture.yml delete mode 100644 spec/javascripts/fixtures/header.html.haml diff --git a/changelogs/unreleased/dynamic-header-fixture.yml b/changelogs/unreleased/dynamic-header-fixture.yml new file mode 100644 index 00000000000..9789a1999c8 --- /dev/null +++ b/changelogs/unreleased/dynamic-header-fixture.yml @@ -0,0 +1,4 @@ +--- +title: Replace static fixture for header_spec.js +merge_request: 9174 +author: winniehell diff --git a/spec/javascripts/fixtures/header.html.haml b/spec/javascripts/fixtures/header.html.haml deleted file mode 100644 index f397f69e753..00000000000 --- a/spec/javascripts/fixtures/header.html.haml +++ /dev/null @@ -1,35 +0,0 @@ -%header.navbar.navbar-gitlab.nav_header_class - .container-fluid - .header-content - %button.side-nav-toggle - %span.sr-only - Toggle navigation - %i.fa.fa-bars - %button.navbar-toggle - %span.sr-only - Toggle navigation - %i.fa.fa-ellipsis-v - .navbar-collapse.collapse - %ui.nav.navbar-nav - %li.hidden-sm.hidden-xs - %li.visible-sm.visible-xs - %li - %a - %i.fa.fa-bell.fa-fw - %span.badge.todos-pending-count - %li - %a - %i.fa.fa-plus.fa-fw - %li.header-user.dropdown - %a - %img - %span.caret - .dropdown-menu-nav - .dropdown-menu-align-right - %ul - %li - %a.profile-link - %li - %a - %li.divider - %li.sign-out-link diff --git a/spec/javascripts/header_spec.js b/spec/javascripts/header_spec.js index cecebb0b038..2b263b71b7d 100644 --- a/spec/javascripts/header_spec.js +++ b/spec/javascripts/header_spec.js @@ -6,7 +6,7 @@ require('~/lib/utils/text_utility'); (function() { describe('Header', function() { var todosPendingCount = '.todos-pending-count'; - var fixtureTemplate = 'static/header.html.raw'; + var fixtureTemplate = 'issues/open-issue.html.raw'; function isTodosCountHidden() { return $(todosPendingCount).hasClass('hidden'); From fe5a753be903344a6cc1dc8f1e023b62887e920b Mon Sep 17 00:00:00 2001 From: Alex Braha Stoll Date: Mon, 13 Feb 2017 02:23:54 -0200 Subject: [PATCH 116/313] Fix haml-lint violation --- app/views/projects/wikis/_new.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/projects/wikis/_new.html.haml b/app/views/projects/wikis/_new.html.haml index d91a7096701..3d33679f07d 100644 --- a/app/views/projects/wikis/_new.html.haml +++ b/app/views/projects/wikis/_new.html.haml @@ -14,7 +14,7 @@ %span Page slug = text_field_tag :new_wiki_path, nil, placeholder: 'how-to-setup', class: 'form-control', required: true, :'data-wikis-path' => namespace_project_wikis_path(@project.namespace, @project), autofocus: true %span.new-wiki-page-slug-tip - =icon('lightbulb-o') + = icon('lightbulb-o') Tip: You can specify the full path for the new file. We will automatically create any missing directories. .form-actions From f2aa9b463086697771e2bf936a7d272307bcbd67 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Fri, 10 Feb 2017 16:14:18 -0600 Subject: [PATCH 117/313] Fix current build arrow Fix https://gitlab.com/gitlab-org/gitlab-ce/issues/27939 --- app/helpers/builds_helper.rb | 2 +- changelogs/unreleased/27939-fix-current-build-arrow.yml | 4 ++++ spec/features/projects/builds_spec.rb | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27939-fix-current-build-arrow.yml diff --git a/app/helpers/builds_helper.rb b/app/helpers/builds_helper.rb index 9fc69e12266..ff937b5ebd2 100644 --- a/app/helpers/builds_helper.rb +++ b/app/helpers/builds_helper.rb @@ -1,7 +1,7 @@ module BuildsHelper def sidebar_build_class(build, current_build) build_class = '' - build_class += ' active' if build == current_build + build_class += ' active' if build.id === current_build.id build_class += ' retried' if build.retried? build_class end diff --git a/changelogs/unreleased/27939-fix-current-build-arrow.yml b/changelogs/unreleased/27939-fix-current-build-arrow.yml new file mode 100644 index 00000000000..280ab090f2c --- /dev/null +++ b/changelogs/unreleased/27939-fix-current-build-arrow.yml @@ -0,0 +1,4 @@ +--- +title: Fix current build arrow indicator +merge_request: +author: diff --git a/spec/features/projects/builds_spec.rb b/spec/features/projects/builds_spec.rb index f7e0115643e..f1036b275f7 100644 --- a/spec/features/projects/builds_spec.rb +++ b/spec/features/projects/builds_spec.rb @@ -109,6 +109,10 @@ feature 'Builds', :feature do expect(page).to have_content pipeline.git_commit_message expect(page).to have_content pipeline.git_author_name end + + it 'shows active build' do + expect(page).to have_selector('.build-job.active') + end end context "Job from other project" do From c7b425a3e50a3b348c17e8df2d44e8019d6afe3c Mon Sep 17 00:00:00 2001 From: Jarka Kadlecova Date: Thu, 9 Feb 2017 11:34:02 +0100 Subject: [PATCH 118/313] Mark as WIP based on MR commits only --- .../merge_requests/refresh_service.rb | 6 ++- .../merge_requests/refresh_service_spec.rb | 41 +++++++++++++++---- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index b4bfb0e5e8c..581d18032e6 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -144,7 +144,11 @@ module MergeRequests return unless @commits.present? merge_requests_for_source_branch.each do |merge_request| - wip_commit = @commits.detect(&:work_in_progress?) + commit_shas = merge_request.commits_sha + + wip_commit = @commits.detect do |commit| + commit.work_in_progress? && commit_shas.include?(commit.sha) + end if wip_commit && !merge_request.work_in_progress? merge_request.update(title: merge_request.wip_title) diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index 2cc21acab7b..983dac6efdb 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -287,41 +287,64 @@ describe MergeRequests::RefreshService, services: true do it 'references the commit that caused the Work in Progress status' do refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') - allow(refresh_service).to receive(:find_new_commits) refresh_service.instance_variable_set("@commits", [ - instance_double( - Commit, + double( id: 'aaaaaaa', + sha: '38008cb17ce1466d8fec2dfa6f6ab8dcfe5cf49e', short_id: 'aaaaaaa', title: 'Fix issue', work_in_progress?: false ), - instance_double( - Commit, + double( id: 'bbbbbbb', + sha: '498214de67004b1da3d820901307bed2a68a8ef6', short_id: 'bbbbbbb', title: 'fixup! Fix issue', work_in_progress?: true, to_reference: 'bbbbbbb' ), - instance_double( - Commit, + double( id: 'ccccccc', + sha: '1b12f15a11fc6e62177bef08f47bc7b5ce50b141', short_id: 'ccccccc', title: 'fixup! Fix issue', work_in_progress?: true, to_reference: 'ccccccc' ), ]) - refresh_service.execute(@oldrev, @newrev, 'refs/heads/wip') reload_mrs - expect(@merge_request.notes.last.note).to eq( "marked as a **Work In Progress** from bbbbbbb" ) end + + it 'does not mark as WIP based on commits that do not belong to an MR' do + allow(refresh_service).to receive(:find_new_commits) + refresh_service.instance_variable_set("@commits", [ + double( + id: 'aaaaaaa', + sha: 'aaaaaaa', + short_id: 'aaaaaaa', + title: 'Fix issue', + work_in_progress?: false + ), + double( + id: 'bbbbbbb', + sha: 'bbbbbbbb', + short_id: 'bbbbbbb', + title: 'fixup! Fix issue', + work_in_progress?: true, + to_reference: 'bbbbbbb' + ) + ]) + + refresh_service.execute(@oldrev, @newrev, 'refs/heads/master') + reload_mrs + + expect(@merge_request.work_in_progress?).to be_falsey + end end def reload_mrs From 09e9706a02640583fd4eb049dfca275626964c32 Mon Sep 17 00:00:00 2001 From: Nur Rony Date: Mon, 13 Feb 2017 13:25:47 +0600 Subject: [PATCH 119/313] Fixes markdown in activity feed is light gray --- app/assets/stylesheets/pages/events.scss | 1 - .../27608-fixes-markdown-in-activity-feed-is-light-gray.yml | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27608-fixes-markdown-in-activity-feed-is-light-gray.yml diff --git a/app/assets/stylesheets/pages/events.scss b/app/assets/stylesheets/pages/events.scss index b989d72ce1c..5776d86983a 100644 --- a/app/assets/stylesheets/pages/events.scss +++ b/app/assets/stylesheets/pages/events.scss @@ -41,7 +41,6 @@ word-wrap: break-word; .md { - color: $gl-grayish-blue; font-size: $gl-font-size; .label { diff --git a/changelogs/unreleased/27608-fixes-markdown-in-activity-feed-is-light-gray.yml b/changelogs/unreleased/27608-fixes-markdown-in-activity-feed-is-light-gray.yml new file mode 100644 index 00000000000..8f297620e23 --- /dev/null +++ b/changelogs/unreleased/27608-fixes-markdown-in-activity-feed-is-light-gray.yml @@ -0,0 +1,4 @@ +--- +title: Fixes markdown in activity-feed is gray +merge_request: 9179 +author: From 1f94b952b5209180d4ee6cd38256258ac177e7df Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 13 Feb 2017 09:38:26 +0100 Subject: [PATCH 120/313] Show notifications settings when repository is disabled --- app/views/projects/_home_panel.html.haml | 4 +- .../projects/_home_panel.html.haml_spec.rb | 38 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 spec/views/projects/_home_panel.html.haml_spec.rb diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 1b9d87e9969..8d6046e3bc8 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -31,6 +31,8 @@ - if current_user && can?(current_user, :download_code, @project) = render 'projects/buttons/download', project: @project, ref: @ref = render 'projects/buttons/dropdown' - = render 'shared/notifications/button', notification_setting: @notification_setting = render 'projects/buttons/koding' + + - if current_user + = render 'shared/notifications/button', notification_setting: @notification_setting = render 'shared/members/access_request_buttons', source: @project diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb new file mode 100644 index 00000000000..0abd7c524a1 --- /dev/null +++ b/spec/views/projects/_home_panel.html.haml_spec.rb @@ -0,0 +1,38 @@ +require 'spec_helper' + +describe 'projects/_home_panel', :view do + let(:project) { create(:empty_project, :public) } + + let(:notification_settings) do + user.notification_settings_for(project) if user + end + + before do + assign(:project, project) + assign(:notification_setting, notification_settings) + + allow(view).to receive(:current_user).and_return(user) + allow(view).to receive(:can?).and_return(false) + end + + context 'user is signed in' do + let(:user) { create(:user) } + + it 'makes it possible to set notification level' do + render + + expect(view).to render_template('shared/notifications/_button') + expect(rendered).to have_selector('.notification-dropdown') + end + end + + context 'user is signed out' do + let(:user) { nil } + + it 'is not possible to set notification level' do + render + + expect(rendered).not_to have_selector('.notification_dropdown') + end + end +end From d1d5e2388d692160078647150c3fa134a205a835 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 13 Feb 2017 09:45:10 +0100 Subject: [PATCH 121/313] Improve home panel partial code and view specs --- app/views/projects/_home_panel.html.haml | 10 +++++----- spec/views/projects/_home_panel.html.haml_spec.rb | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/projects/_home_panel.html.haml b/app/views/projects/_home_panel.html.haml index 8d6046e3bc8..79a0dc1b959 100644 --- a/app/views/projects/_home_panel.html.haml +++ b/app/views/projects/_home_panel.html.haml @@ -28,11 +28,11 @@ .project-clone-holder = render "shared/clone_panel" - - if current_user && can?(current_user, :download_code, @project) - = render 'projects/buttons/download', project: @project, ref: @ref - = render 'projects/buttons/dropdown' - = render 'projects/buttons/koding' - - if current_user + - if can?(current_user, :download_code, @project) + = render 'projects/buttons/download', project: @project, ref: @ref + = render 'projects/buttons/dropdown' + = render 'projects/buttons/koding' + = render 'shared/notifications/button', notification_setting: @notification_setting = render 'shared/members/access_request_buttons', source: @project diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb index 0abd7c524a1..5af57cdf3b7 100644 --- a/spec/views/projects/_home_panel.html.haml_spec.rb +++ b/spec/views/projects/_home_panel.html.haml_spec.rb @@ -15,7 +15,7 @@ describe 'projects/_home_panel', :view do allow(view).to receive(:can?).and_return(false) end - context 'user is signed in' do + context 'when user is signed in' do let(:user) { create(:user) } it 'makes it possible to set notification level' do @@ -26,7 +26,7 @@ describe 'projects/_home_panel', :view do end end - context 'user is signed out' do + context 'when user is signed out' do let(:user) { nil } it 'is not possible to set notification level' do From ffc041ac19351f471c1766ecbec69c23bc4f90b0 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 13 Feb 2017 09:47:01 +0100 Subject: [PATCH 122/313] Add Changelog entry for notifications buttons fix --- .../fix-gb-notification-settings-when-no-repository.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/fix-gb-notification-settings-when-no-repository.yml diff --git a/changelogs/unreleased/fix-gb-notification-settings-when-no-repository.yml b/changelogs/unreleased/fix-gb-notification-settings-when-no-repository.yml new file mode 100644 index 00000000000..17fd1336b8e --- /dev/null +++ b/changelogs/unreleased/fix-gb-notification-settings-when-no-repository.yml @@ -0,0 +1,4 @@ +--- +title: Show notifications settings dropdown even if repository feature is disabled +merge_request: 9180 +author: From 4f5bb9807c09893c4595f6f1930044fad28423db Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Mon, 13 Feb 2017 10:22:00 +0100 Subject: [PATCH 123/313] Move merge requests index file inside the merge_requests dir [ci skip] --- doc/user/project/merge_requests.md | 170 +------------------- doc/user/project/merge_requests/index.md | 169 +++++++++++++++++++ doc/user/project/merge_requests/versions.md | 17 +- doc/workflow/README.md | 2 +- 4 files changed, 178 insertions(+), 180 deletions(-) create mode 100644 doc/user/project/merge_requests/index.md diff --git a/doc/user/project/merge_requests.md b/doc/user/project/merge_requests.md index be09337319f..84a79f04094 100644 --- a/doc/user/project/merge_requests.md +++ b/doc/user/project/merge_requests.md @@ -1,169 +1 @@ -# Merge Requests - -Merge requests allow you to exchange changes you made to source code and -collaborate with other people on the same project. - -## Authorization for merge requests - -There are two main ways to have a merge request flow with GitLab: - -1. Working with [protected branches][] in a single repository -1. Working with forks of an authoritative project - -[Learn more about the authorization for merge requests.](merge_requests/authorization_for_merge_requests.md) - -## Cherry-pick changes - -Cherry-pick any commit in the UI by simply clicking the **Cherry-pick** button -in a merged merge requests or a commit. - -[Learn more about cherry-picking changes.](merge_requests/cherry_pick_changes.md) - -## Merge when pipeline succeeds - -When reviewing a merge request that looks ready to merge but still has one or -more CI builds running, you can set it to be merged automatically when CI -pipeline succeeds. This way, you don't have to wait for the pipeline to finish -and remember to merge the request manually. - -[Learn more about merging when pipeline succeeds.](merge_requests/merge_when_pipeline_succeeds.md) - -## Resolve discussion comments in merge requests reviews - -Keep track of the progress during a code review with resolving comments. -Resolving comments prevents you from forgetting to address feedback and lets -you hide discussions that are no longer relevant. - -[Read more about resolving discussion comments in merge requests reviews.](merge_requests/merge_request_discussion_resolution.md) - -## Resolve conflicts - -When a merge request has conflicts, GitLab may provide the option to resolve -those conflicts in the GitLab UI. - -[Learn more about resolving merge conflicts in the UI.](merge_requests/resolve_conflicts.md) - -## Revert changes - -GitLab implements Git's powerful feature to revert any commit with introducing -a **Revert** button in merge requests and commit details. - -[Learn more about reverting changes in the UI](merge_requests/revert_changes.md) - -## Merge requests versions - -Every time you push to a branch that is tied to a merge request, a new version -of merge request diff is created. When you visit a merge request that contains -more than one pushes, you can select and compare the versions of those merge -request diffs. - -[Read more about the merge requests versions.](merge_requests/versions.md) - -## Work In Progress merge requests - -To prevent merge requests from accidentally being accepted before they're -completely ready, GitLab blocks the "Accept" button for merge requests that -have been marked as a **Work In Progress**. - -[Learn more about settings a merge request as "Work In Progress".](merge_requests/work_in_progress_merge_requests.md) - -## Ignore whitespace changes in Merge Request diff view - -If you click the **Hide whitespace changes** button, you can see the diff -without whitespace changes (if there are any). This is also working when on a -specific commit page. - -![MR diff](merge_requests/img/merge_request_diff.png) - ->**Tip:** -You can append `?w=1` while on the diffs page of a merge request to ignore any -whitespace changes. - -## Tips - -Here are some tips that will help you be more efficient with merge requests in -the command line. - -> **Note:** -This section might move in its own document in the future. - -### Checkout merge requests locally - -A merge request contains all the history from a repository, plus the additional -commits added to the branch associated with the merge request. Here's a few -tricks to checkout a merge request locally. - -Please note that you can checkout a merge request locally even if the source -project is a fork (even a private fork) of the target project. - -#### Checkout locally by adding a git alias - -Add the following alias to your `~/.gitconfig`: - -``` -[alias] - mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' - -``` - -Now you can check out a particular merge request from any repository and any -remote. For example, to check out the merge request with ID 5 as shown in GitLab -from the `upstream` remote, do: - -``` -git mr upstream 5 -``` - -This will fetch the merge request into a local `mr-upstream-5` branch and check -it out. - -#### Checkout locally by modifying `.git/config` for a given repository - -Locate the section for your GitLab remote in the `.git/config` file. It looks -like this: - -``` -[remote "origin"] - url = https://gitlab.com/gitlab-org/gitlab-ce.git - fetch = +refs/heads/*:refs/remotes/origin/* -``` - -You can open the file with: - -``` -git config -e -``` - -Now add the following line to the above section: - -``` -fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* -``` - -In the end, it should look like this: - -``` -[remote "origin"] - url = https://gitlab.com/gitlab-org/gitlab-ce.git - fetch = +refs/heads/*:refs/remotes/origin/* - fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* -``` - -Now you can fetch all the merge requests: - -``` -git fetch origin - -... -From https://gitlab.com/gitlab-org/gitlab-ce.git - * [new ref] refs/merge-requests/1/head -> origin/merge-requests/1 - * [new ref] refs/merge-requests/2/head -> origin/merge-requests/2 -... -``` - -And to check out a particular merge request: - -``` -git checkout origin/merge-requests/1 -``` - -[protected branches]: protected_branches.md +This document was moved to [merge_requests/index.md](merge_requests/index.md). diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md new file mode 100644 index 00000000000..a27e683143d --- /dev/null +++ b/doc/user/project/merge_requests/index.md @@ -0,0 +1,169 @@ +# Merge requests + +Merge requests allow you to exchange changes you made to source code and +collaborate with other people on the same project. + +## Authorization for merge requests + +There are two main ways to have a merge request flow with GitLab: + +1. Working with [protected branches][] in a single repository +1. Working with forks of an authoritative project + +[Learn more about the authorization for merge requests.](authorization_for_merge_requests.md) + +## Cherry-pick changes + +Cherry-pick any commit in the UI by simply clicking the **Cherry-pick** button +in a merged merge requests or a commit. + +[Learn more about cherry-picking changes.](cherry_pick_changes.md) + +## Merge when pipeline succeeds + +When reviewing a merge request that looks ready to merge but still has one or +more CI builds running, you can set it to be merged automatically when CI +pipeline succeeds. This way, you don't have to wait for the pipeline to finish +and remember to merge the request manually. + +[Learn more about merging when pipeline succeeds.](merge_when_pipeline_succeeds.md) + +## Resolve discussion comments in merge requests reviews + +Keep track of the progress during a code review with resolving comments. +Resolving comments prevents you from forgetting to address feedback and lets +you hide discussions that are no longer relevant. + +[Read more about resolving discussion comments in merge requests reviews.](merge_request_discussion_resolution.md) + +## Resolve conflicts + +When a merge request has conflicts, GitLab may provide the option to resolve +those conflicts in the GitLab UI. + +[Learn more about resolving merge conflicts in the UI.](resolve_conflicts.md) + +## Revert changes + +GitLab implements Git's powerful feature to revert any commit with introducing +a **Revert** button in merge requests and commit details. + +[Learn more about reverting changes in the UI](revert_changes.md) + +## Merge requests versions + +Every time you push to a branch that is tied to a merge request, a new version +of merge request diff is created. When you visit a merge request that contains +more than one pushes, you can select and compare the versions of those merge +request diffs. + +[Read more about the merge requests versions.](versions.md) + +## Work In Progress merge requests + +To prevent merge requests from accidentally being accepted before they're +completely ready, GitLab blocks the "Accept" button for merge requests that +have been marked as a **Work In Progress**. + +[Learn more about settings a merge request as "Work In Progress".](work_in_progress_merge_requests.md) + +## Ignore whitespace changes in Merge Request diff view + +If you click the **Hide whitespace changes** button, you can see the diff +without whitespace changes (if there are any). This is also working when on a +specific commit page. + +![MR diff](img/merge_request_diff.png) + +>**Tip:** +You can append `?w=1` while on the diffs page of a merge request to ignore any +whitespace changes. + +## Tips + +Here are some tips that will help you be more efficient with merge requests in +the command line. + +> **Note:** +This section might move in its own document in the future. + +### Checkout merge requests locally + +A merge request contains all the history from a repository, plus the additional +commits added to the branch associated with the merge request. Here's a few +tricks to checkout a merge request locally. + +Please note that you can checkout a merge request locally even if the source +project is a fork (even a private fork) of the target project. + +#### Checkout locally by adding a git alias + +Add the following alias to your `~/.gitconfig`: + +``` +[alias] + mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' - +``` + +Now you can check out a particular merge request from any repository and any +remote. For example, to check out the merge request with ID 5 as shown in GitLab +from the `upstream` remote, do: + +``` +git mr upstream 5 +``` + +This will fetch the merge request into a local `mr-upstream-5` branch and check +it out. + +#### Checkout locally by modifying `.git/config` for a given repository + +Locate the section for your GitLab remote in the `.git/config` file. It looks +like this: + +``` +[remote "origin"] + url = https://gitlab.com/gitlab-org/gitlab-ce.git + fetch = +refs/heads/*:refs/remotes/origin/* +``` + +You can open the file with: + +``` +git config -e +``` + +Now add the following line to the above section: + +``` +fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* +``` + +In the end, it should look like this: + +``` +[remote "origin"] + url = https://gitlab.com/gitlab-org/gitlab-ce.git + fetch = +refs/heads/*:refs/remotes/origin/* + fetch = +refs/merge-requests/*/head:refs/remotes/origin/merge-requests/* +``` + +Now you can fetch all the merge requests: + +``` +git fetch origin + +... +From https://gitlab.com/gitlab-org/gitlab-ce.git + * [new ref] refs/merge-requests/1/head -> origin/merge-requests/1 + * [new ref] refs/merge-requests/2/head -> origin/merge-requests/2 +... +``` + +And to check out a particular merge request: + +``` +git checkout origin/merge-requests/1 +``` + +[protected branches]: protected_branches.md diff --git a/doc/user/project/merge_requests/versions.md b/doc/user/project/merge_requests/versions.md index 77eab7ba5e3..610250ccf12 100644 --- a/doc/user/project/merge_requests/versions.md +++ b/doc/user/project/merge_requests/versions.md @@ -1,6 +1,12 @@ # Merge requests versions -> Will be [introduced][ce-5467] in GitLab 8.12. +>**Notes:** +- [Introduced][ce-5467] in GitLab 8.12. +- Comments are disabled while viewing outdated merge versions or comparing to + versions other than base. +- Merge request versions are based on push not on commit. So, if you pushed 5 + commits in a single push, it will be a single option in the dropdown. If you + pushed 5 times, that will count for 5 options. Every time you push to a branch that is tied to a merge request, a new version of merge request diff is created. When you visit a merge request that contains @@ -30,13 +36,4 @@ changes appears as a system note. ![Merge request versions system note](img/versions_system_note.png) ---- - ->**Notes:** -- Comments are disabled while viewing outdated merge versions or comparing to - versions other than base. -- Merge request versions are based on push not on commit. So, if you pushed 5 - commits in a single push, it will be a single option in the dropdown. If you - pushed 5 times, that will count for 5 options. - [ce-5467]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5467 diff --git a/doc/workflow/README.md b/doc/workflow/README.md index 0b6f00c6aa4..7a97b87f1c5 100644 --- a/doc/workflow/README.md +++ b/doc/workflow/README.md @@ -27,7 +27,7 @@ - [Web Editor](../user/project/repository/web_editor.md) - [Releases](releases.md) - [Milestones](milestones.md) -- [Merge Requests](../user/project/merge_requests.md) +- [Merge Requests](../user/project/merge_requests/index.md) - [Authorization for merge requests](../user/project/merge_requests/authorization_for_merge_requests.md) - [Cherry-pick changes](../user/project/merge_requests/cherry_pick_changes.md) - [Merge when pipeline succeeds](../user/project/merge_requests/merge_when_pipeline_succeeds.md) From 6db214f5eddf01e1a18c37ce1bf7985689261141 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Mon, 13 Feb 2017 11:43:30 +0100 Subject: [PATCH 124/313] Update issue boards docs --- doc/user/project/img/issue_board.png | Bin 90664 -> 76461 bytes .../img/issue_boards_add_issues_modal.png | Bin 211661 -> 177057 bytes doc/user/project/issue_board.md | 41 +++++++++--------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/doc/user/project/img/issue_board.png b/doc/user/project/img/issue_board.png index 95e8532e90895a7d83cfe3a3e9220b47d4755921..b636cb294b8f15eb6bea243ab6d8ab75926a4536 100644 GIT binary patch literal 76461 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

(0TakV|HeVB{Lkf`eqt~AQ2U1d;N<4E(U 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 literal 90664 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

~hC}>3JQhQ1#b)ME1!mgDRVg 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 O_H(DL&5BPsNBjxkY*-cm diff --git a/doc/user/project/img/issue_boards_add_issues_modal.png b/doc/user/project/img/issue_boards_add_issues_modal.png index cb653ced7fedc11592ae2c099947f46ed27f401d..33049dce74ffd65399b1d4c8fed4c38eb902fb81 100644 GIT binary patch literal 177057 zcmce-1yo#3*CvV++}(n^yA#|=AW7qH!QG+B3&GtT5-hm8H0~1I-GY0gOjm?ovK|`yY_ybI^plt6);dqQDI7WMN?7<=!B@rnm$! zzj?hNnW`wr!a)E0t@Fq>=60y{CizW@QFSXxXOJ@(w0UFNq-tde-ja*YdLWT@p(u{cb#yZ5IYdG z+J6|o78{I%B>pWrN_9QJRR`5^sIX4$M5+X1z&C)=>DY5F$Ep(qO>}?i zAsOI(TfwO~)cU!H_FG{PRguT3&By!S3fTt#JbZY;o=$eG{Ke7YNb*DOqsDCUiXgXO zQwx2N|8XM@De3q`a}rr)j-LtE)QSv>L0znC%JTxZd6sdnhz5+_DwD!@?`Mcj`$0M8d(v(yDs1ZV%A?x4!H!qN54YBTt|mVFw`N1wG+=Q22*?5UgHpyd71Q?(yz|Ki}@ZY<~AZ5{{Ck z!oB%nF>||r)tPfM{N3Hd~h$TCuF7s9zelr2H3An_CIc72$T~x-&97gyHX3dn>N~`oVhQE+B`x1PY zy?o+sVR`>gCtp;X(y+PlNO{OEwue)ZF1scZ--Pq3#UbRiL(GL1w(rhowMw!vN);%U@NA%b!kU5RbH$>84f`n6=Y?{o-IHDd+ zs0>)!4A$@7K6U24I1$WwNEji@w z1bkL39c0NL>LdP^{EVWCN^fs3JW**cDhGeYx=O6ZYVq)H&CIwdB9|HxNF!B zVwrg9dP8s5czi~7y;mHNGk05R{zgi5$XfUL7_D|jjD+#?F9`rofm|7(usi?d9$~rI zcTu{?zx(22q~KW&)0MIms!M>n z131v})$F#X{61CUJ-@u+-E~($M4v!OTZz$`yGS^hdowYU+=e{m%!MRK*-}kk{ zPyB47=@||~r+5);U;@K}Whi}9&aA3K-n)HwGI-*%UjV7(FQ!G|UK}h!2!QbNGHTG% znG)f(enNV?)pwY=;km8uqY;a^8NMKC<|vEsx)jT^z^xruSkY!vlVH)4tk|$>NAp{& zsY=Bn^&I8hv-894pT*ag2e&cUf34ei-<%~o27&qY6m?bA-NhQSMLPi=9-c6#`fPSW zG!O*5Vt;x-h)ct4XLKPBqk(CwAZ)kDvT&f5*|E?+l>DJ30jI_;%P|+7KYvel{bVz8 zm|&IajqzqJ3Lx3f=DaZrG+0HdDCO+w#Q&iTqNi$|>=Ma2m5mz%`T_7CAEB6{(;v&T zNv(NZ_}IK{jQs}o##a+drh5tfCow|G${C{e&^!3omimEhvNP9RdvYp-flZE-Fw9^* zd`aT>u?&m8iNO?2Adc7*Zv}lC?W;K!npnfPOBEvLa`JdMIPcC|?~V=rQI>aNSXfvi zDeRfoLfqW(@W`0hl$1GE9WHw#Yx4mPBGjfrHOa9*PNVNC+C1@E-D$tCc;H!96YU8@ zZE40+L&wc0@unY{L1Lbv+@F4?%sf%+$%9Yb>RPt})OQ8>49_`7&MKV0_H|=g;mcq) zN%4BBU$VbknZvxiyr5^)X5=%2ck0A9a}#I7Q69o1)|RzE>h{l&R&MrtB29-a!p`AT z^}T2Dla|)mN=J~Kv(ygoAU%#S&ujcqSjH_yl}dU699?46M*2w<5}PauE%FThd!7m* zW{wZQV~NEvGAAS_3j#L}4nk8?7hXrMi1AbOa`Va6fTVw4nWTlJ3*UvoLXABTZtiFu zD_RJysh zmu%$_ujlNF5?_98mvv7|tUr8p+M{2k>4CrylT!cukE5eLORgUFDwjb1f&#K<+xD^}Z$U^q78_;bf+P zWOM0rZ7l!zgRk8|yj@slpfLMawK_PG4#<20bqF5oMb&96Pz@-LFc`>+&tVvkN>F#O z%k*{FeCH;k>Gb&F2@ls9R$pxu8YfAhvgAl&R(2LWJcpDr+8b!8_8elMprxc1WpP<> z30UK2v?7jDL6`*9#VsbG5B)Lo6m)slL^VTJ7GnZxn~=F*xETZ;G0||6R(pGE)#!f9 z5?x;OYrl2)TL^YHSzo-rg=*vyp{6c##f_n~x2OqE7PqV0{Qg7zTz z?V*bE-T^uGxq$qUK=qHj2HD}4mCJlqKV~O^QQhc^XO2>f87*#?b-PLks+p3pfajAP z`w<_59I1x0OvZHRgsb<6J)uzcLyX?}aygc1t0n1Ru;*dmiR7ui%Ei^$T$JBoc-j0J zu~2q4-ioOU`N3JT>*3mcgj-|-^Sc>B-kRQC;U};C-dy6PQstbvbz;ffDb7z5ZH{?1 zxx(dHglW7cHjRwFF?3#oz8~FYcOV$ZbuI%d!k)R#;f=W&Y#SV^5Q!v@AYXNC(L3m2j3=4Jlkj_0;iWy0*=qS&17t~xKd_fN=H*ZjHC?F2a%<|qqB4 zinSF7)3T+_ei4U+uPfn+}%Izjckw>N67s(!&>y#E~$ABL5#RmR2rs7bE6Xu&uJ3| zq18v#B!TQR8%0{sVe;`RNOFBBH3yP@>jd5U)ucFVdU`q?BO~<7Fg8qNzqE@B&ufC` zt*u75oZ%sP)b3C*kH)kK2HkuIru*_W-4 z&W{@5f49V0!c&MkVQ9>>pUI$=um5z zCh+Zi^>}<29E>&emvddk=J~+(i$hyUE35;iom~UtdP*al)TZiNVX*3q(5)nApM`-R zf6Y#z3Q^I}p^|8H5AS>iN&zJe{7wj%%*);K7e5A zhM53Qfqg~Rp8b=CrK9vqXl{DC_xKj_K@%i4rOLsgyOHaMC+Ajt?BkZCeXRd?`iz$I z0GUV!|HGA;7ss1pb|&{|n_6u)&m|{BG%GU=vkC%ZjSv{(j*|6KWbtM9zBM23jvZeC zE`FxCysi>9D0fEv@ffeIlE}aS=K(H0e&4PzYj_06?e=Q(WUo7zLaClpQCRh2_EMG< z{Y1Ma4$&ysWlFc2hci3cygzFg0THprSVpLLrb=sa-rU3QQv3r-s;^StH|S8$a1aV= z*2rBMkXiz85I@@tUw%Jr2wvr!cNSXcG!yh292nZDV)BJWc1h0mG37*K)TnU;*&%yl zu4RmMQ>BU?c}UoL_8ZnYR1p;y4DeXWzxgHt>IpM}cAqcM`!$O_E+71^jQo2ge30Ia z5$fH3$I8u>qG1_T#9Qsxg}d$8&^+b_t`zQi>;ON=k3CuKEc}oxE6*l@TrwgwERF7( zWLpcEfy7C84>rWaolxg1-}zl#TIVc*BB-lv!8Zo^DmCqLQ1#HB?p+U3 zwkCN+dH#VlT?Bj!X`MGeot5}_l_mYd%saM}J*|0QX!A0cXTM^;JRMIlyXd-#loTN@ z-ud(e!^+Imn%7K#!X~NMe6I+Boh;0LHGo_}T7><}QW1A_rX{rOUHtJ)Ld$yRnHVkB zXFu#z_(<(K#*`$L82NTvW=i|zu&WqMgehCN^p|lFmU`cuGYWqchzTYw;VJD#k+&vY zuL7_q!xih-={L%IG68PSZAEa-_(+={0H^itXktfB{bH^hOB*i{Ro;MFTp z-)MTB_E6q};lye;*xN4JC(L23O-mqvLrVe^sgm3KCwug7NSl&Jd*JMlg{t8NyqxXb zZgMAv;>Ha-p1cDC#@jEF`3%5rlibG}{|EXJviYl}zIgJN-W(=n;pRxlFbN>ZKTbv1 zqRMi1(8%@sw3!?5JFUa_$aF3mI!0mQjw1s?4sm6vyO;JGQyqbjvE6Kb1xFE&ZQ9Rf z{^g<+RP2!@PG52;A9y%?J81+?b8#d8QrX*MXN$&ouJ`f-i+OVj_TB|v?5%g9{kfp= zf!|U-AKgI@aBFt>{BgYH`*(O?q_sMKd7kZP-HU-px8>@@dR%ZP-er6Z%ngZ1!UE;p zRzptqBDqi05BjTh^T8d`Jt{qk=zgiHZ&PFEhiF}q=O6bDYl3tLAf)1`gEgp5Umiqg zLvD(gpx<4a)X3G^BsY3N>$^#FMusDR7D{OCz8Si>G#6|^A^dUr{fpv+#zRsw=DVl> z!7v7bN`p|~esBdagy;4}E^<-H?%t9i6UOd^?_4{y)xA_}%v?i$Y-v}%O>p2>eLEy- z_UHSgtwbW{x8IQ(s)%(6C`8Eg4kw~8{ct%02TQf=&aeq9B8xmUfKM*Adh6+n38oxU zx1{*IYG!NUuJxA{Qc^SWsmL$6&UF1F=wT0yr@zPdsgLm|QAqD~OgvJn;%w zFibDBuwbz-tiAU!vU?hX#=Rx-xDF4{lN|2E)ZmoiKal_`Ne9Oa1xZ8+C(gr*m4mih z))Oi3O?Uj12?;v%p*a8Sz{+9Idp!Zf7*dC|0s$If2c0A1U!&P{Ddl2I8ywo6pGxoH ztL=W}6C=$POK8u!G+FPqcNTW~ks z10IT8f0(CqKw2CMTj}@7OJ@&^m$ct=8iEm#=!~ZiZTfZd@_e4B|I2@kJICV7oF{5D z-nOv+mC%PR$(qYhL_2NWTxu%!@6Ai=#S9)$0k+T+4BOE{Gq9}mz#PW)%|!KI(`Trm#HrI*YzutGek}fZHH@6vR?E z&U0k$W;RPNW4`ef@QgcVecY5766AGQQy`*xokr?CL$XYDOx z5GTs(fm4h1W-0v;dum&Ktx~Y|uwybIx79kX#JwN4*&V0l2^Vqa85>n&`=xAb_&y%Y z?9oPgF>9tGa!x=kZ;t+tuqG6J2#QkpUgm?Vw%EB0Ay6WOJ~y_zOM9CKs#2oo<$urw z9LpD%+^Mr4{CTYC(F{0JbGwgBV%ve28jsgg%FxY-6(lb@1hGK!|Cp@vVrC)Wlq(GM z;d5+_jGvKy6KSs&`2)O1FD`y@gAj?hDhBy|udg=ZW0b#j27q(a&``ia;Ph*A|IzB3 zo(02s?0(I-X*ue4djmT``17P^Zkb2qCl4}~JWl7fiU29PcA1BzDhSDopk$!$?hhg2 zfVhq=YPQuAH~}D1`^HlS-o!q6cz#nDPzg)SHKs#oE$28)PuMpLU@w_W9e^xE+>%k=7b_pY%P@m$@+y-0R6?qm9uThz8KtMh z%lP1I9<5dz9K~oxHj(g0&Zxa_f&tN8N$!8Y0cu8&(S3 z4m;ef^B2R(>ESePv8)CovqS2L&PKdpyhd#f`uh53Ibn4JbuL2)6P^_E=a2N9j0z)3 zg&E`Wem11$jIuTY-`C+=mN%GFFWToRtnK!!Z)7WTXzSr?BOz5Hu><3!fHt{L#0_)b%mXra37APL5TpNzUS^@we1bID6Ei z7k9B1>HDQLX;k{3AF2@fj~W8&dsY2C2^G`}HJ29FH<)OI7f>eaoh~D&g&Pz2za*6f za26IAU$dcWD=M}2L6U8z+cniPJOlCc7e?CqEqb#7(|)xUlgY_9BV}4CuuxM` zr6t-G`$R=HvcUSe&U&33441?ngq*r4QZLY8D<(bOWLfLekGmg00ws$Fs%;H(?cuw5^z9AZ-Jt+PJW9#&oK2D$;i;CDQ_~}YXlq7m#LM|Qn^i?6F{oBTcaSm(lL`(ClQ=)>@6-U}T%E`Yq zYBU*yIC1{)M*tahb$0`B4fJZM`1KJK+Xb=FNDtI`0N5^-nCS*6EO!1A`0P+Om8?Lnqbi1z3;?OO`{mA+@R1w2qLohN>AqLBql+i0y}bJf5rA^ z#zr5iOC_T4wT`G^)+*P90@f>d?hVlBP}70yTaNgo0x!(ab3{G0c5!NMhP1mE!Kmmh z=YoO)C%U6I#a!>p!x)YG+M);++#?^D8DjeCLYL~Taf@r)LYk9)ct4fOhDKSbEuwHR z^y5KxJfr;1#REhVG3OCdIwd2%yEeLtP=8Bu4Gmu=3mrd)6*F+)@KAn&qAiTqExJBp zRTts4IG|3=A6&3oK3Vns<0A3@>DfaHeTO3QKzi=`%OTh~!Z|iAD>6g^zbd^{KARcs zH@INOx;>|HVx=8^=*=z+!f?x&{uZXv4K^eLB#HJ_h$M;zj8aAB4$>Z@Z?r$5a>f|s z)G24astKXJPo)G%6KBS|WK~=Y_r?=fO-1%5CtXD`Z4oCX<}-sNJI#2G8_-Uf=TNHZ zqQrc^x6ER}o&2q}LT!P%*$*xg#W!B7>(M3~sriR1*9N{ch+MPeJt61vGv!Bf9Z0Wm zn39^>c+&_b@DlEJUEj06u42)9pUh9~;`q*S<|jmYP z0~Q0PdcC`HnJ1xE{t=XGYdSaXxH1w)F1Ogswqo5f3>UxRE@xTyP=Q&dI|)kVpZxP>|=(O+I8-_>rt2zwFHkPC?-RMp1#g{S0eYD5o+G2hl6Wtushtj zT|d7h)cGG927NJH>x2|0`l94K5+I|4TdP0Y%WPhcdvWE)n=M3Y1qQ>Hr4zQ#T#`~2 zLsurR;)tMG|Jh#8NK)LUXJE0g#IByWMZ~k+(7e37c14Yu#Q7=o#V;<}!5q_CGu^+L zc1j^KK9A9(Fp5e_Ew^nB+GA4x2WY zW?l^9=W12ZSGU zg3?#8a)oT*ONg1|*}ySaxUJ0WZ)Z3OJ6@ELl{IpAcNgSF^$PO80&}IcdycVM{eMsD zRW-iet&O3%x#XU2Xi$qiA`X3RjQ1_9|3O+j$!@V*(9A6?;!{#Qj(e>tjrm9~udX!V zKfZv4KC%79KMt)aqr|rY7xc(ui6l98RR^94LYM4WH=9}u3h3+v$o`y1%|Fe;^~Y@*60)*hF<+*O z)OUZ??My#G4xoX$U0z17;bK4_UB&HWy@+7WepscXw)UA7Z=Ef42U(w<(q8^QWPKYUv`OStkC z9@1n#R1R4!`cc%=#J8%raq=%p`@aM#zFuIIola0vRD79<5N-9w|EzU+0kLO1We}&Z9O0^0W$J?V=a>l^pN^O##snx(|n^ z{d4CyW2B;yVY1n%I5_dXpN?w8PZm2O*xLl1xCCB`8pRuJS*Yxv4$r*VLsPkY#--Ku z0?UO`svv=z{*2Ho$V)#84lgV8SRr5DeKEo5TCZ4^(`>-==_-lncASY}GPp){fW+2V&u zggTp|WHy-&@0X3OHj?WmyR}k$wYRRPVceI!EIUNy+w6p*7`f9no6pwbwMCVKt%PaS zugeMZhakk`y7=K2dJ)2Y2iH=&-J)`{*>qc%_nM`?fl3Defa7XTnvAbM(QhreHATg~ ztvEl2F=L+_3%5y~CYo!su9uDTp`bzOw64*GrCH$f+9yXPx67MEMq@7mu6Gd7g*h6{TJB7!!2 z&b1TESdHtcV#%5}zPCQB;L#MzfUH#ZN24f~qoR8OP7#K@Eaz_mr>mJ%)Z0W3e$v8TdK}0U3+}2 zGWbHP-FbYo_YHKumyc7o*k~raV-%34fK;jJmrOmiy&PIsHj7S% za7q>=R&jPF8=8#Vy~0j*xwtRlRcgxt!j$Do!4oxAdWTD2**1veey?tgK@MqPhy*6L zPBjE^8)=0Y35%brIUU8)HELb1fS2w`HNQs?CZbbDDa^P6CR>d-3~^L^)0!HqcUZEI zMfjcO8$v&?ZDtvU84ljRo7_G=9vy`*uDOmA=LDYG=A>6!g{2VX=ywd@zKWv zhWE4V#_Fw{>@J7fVV^@Ms<_Onxj-TqK!f*s9>uB3viamC#lGecxbd}RrE3tw3>Hwe zC>9o;=%YFE)0M^3aP?dPhN_hxwQKDSamUZ~3ydPdvUltYqa8An!Q;hu+kl@0)3HQ= zF`E4ocT}}-8uM{3n{PMy^V{8HDnfpj0s>G&BO+P=Pe4D}Eb5^`WMMDLI@xv8!k$qYwvs7i6Z?gD{p*B*udx#} ziM^(!^~^G3so~65Jp&^ZRL_`0XKqV8Ovv=%JGFmiTKDIa$LNgrHBn9eg)}j5b%2zVtX5JVGkEFif5pIf_ z3XcoB}>;g0qxssg#bY*k11WU*=r#G}JS?pKj~Y_)okUsz7OpehK~6MCWAIZoEKZ_Z(^YMx7<*UN1m zcFgXGSF=4dF4b_oFP~F&@AOee70o9F>W8!QaRIA8d8mVNZw#k;uE6J(hu8pyh}NRC zX>+dflxZ*Ep_l)*&yY|(NBaGHY}eG&w-TODBN_51XBcDIVrj2@fgi|(il|Po!I17I z@*G7JzdvSE7y&5+`&`@dPX=ML<&_WM_EzUIQK(F_9**nk_SZ`%B39ho^|r&1^gQjG z7&c(jCU9+0P#R(OU^9x-0-vq2YuNH21NA3n^Q8WOJ9u>>?bIF9W@YrWtGBFkYR#Gg z{^SWbB~4ls7mv>0prX<^T@gLwr{6Ve?qF7Lj}C)dA5AGjcQ~1UojF^al_AhwPh@b0 zNd&+?6>H(-`1oK?&U094gq)Dd953byeYvtSA0FgN2Yz1xZ}siowP}B5Gn-d4zo8m# z*E~@|@?J{wc+^^dgE86Q$Cj_f`Kx_*ChF#L^Z0sW+6hA16{-;N@rQ_j6T3zoO+eD6 zTbmEnAZV{-i0XbsGvscxzMzgfo?C$toBaB2;Mgd2Myw{$8Htux_wkR|bSyF>(_ax> zt%&pPelvBjyK3@6t@jy$sL>+7#GU!;ChLFrHZ=-Ie@xJ?u|T+*iBDzTLglN9{jThv zLMf)U0b|rSc^<;P6Er%iSKkL3<9&WgPQMZ2%RnZt^4jdlZvPBQTUTp&H9_KDjhrRB zBEN^LRI|H#XZ386{&ZfeH*enD`(jvBDWjPjt~F{hQ0RSX^t0HH-&rtJ-eOEO4>D-4jpA9 zB}822AK0hinylDKG>DG~`VwlbAm@oUsDQusW?uhZ@Zgh^sRFeplx-iW z*XXoP6>sd6pNl0`42oQx^akE?MXqC6bXl>M)SQZTjvt7)7m{UPhbAO;>1JbX_~8IK zt*3v#RSSstQH?UP=Q%FgmJ)Cs$!$EKjwDz&Xc8$O;AS(MDV*8LTWOI_Hn0VLSR1;^ z?#kKgV1m1_QyICf8q3sbyga$tk0=9$>pd8~rIdxZQX? zcYxO{WQ=al;*0$!)#Biv1{Qyu8S_c_wlQYD_6^FlmyTLMPr20v>&V8=B1CFQs0ltZ z1@;zOpD7lVQ-NWRnH8QK#GTr(2NJw@gy;O3CXthZ3m{P$&-4~KC$bx<9l{;Hl(}lF zU4eHDnk{kLr-q-J_pepMs7B)?rM+KL-{1E~GkmkTJZD)e(V8Nw{gLK;Bp5;TAV{XS zxS?mD8BqAtn(l{7*n2auca`M1pUU}WAX`{tqF@3ZhVz5xjIEnwQg0`AtWClJs0I0?-YhotFrqQ)+ioDySRBcM>z z>bQu6RCdO$`=Z4E{&h}$%&bhx5tn7X)4j}pk#R$yU|6NMDNH&xe{;g8m@}X-uZ6Xp zIHP^@-42fzD{a-4wEfGw+mm7JP#X=2Sd(eY1on%-4w#Jjk374|dn3s^zrM?4iMXQ% zUhRz@_@VF-qbIQf&KxBN$Oe-2aGvcyGq{yZoK-@<%Ov{nS_@0Cv)1@ zf~3Sv+=)jy-lc5FR*NGql8o(G3K{3%CujF!V)S9Jrv}T~4JkvNXWmJq`MsV>3k1E) zy3#}1XK)4U{YG;ZS+`s`$E`W<*-HtD7Ya zAY*o_d_-?C$LX@22l-uyuC4T4^cBWW(D=7>>Gw))U)M6Gz#Ep2`O35Egg}!1mL&6p z#2Ebs_0NfqAFo=Tn{DzjH$|eZ!#7>>k3)ql^uwR=yizI@s*25Ys=aYOWWws{90`=E zbhO?w8LbkO|2M1>_{O0te=l9o4Rr-m;NT(f$t!Q&wtcQ04r|>C3R9s^7mdSvhwE4( zr=tM9o340~F^)uS>6Domu(Tf)#naOqL;PtNWLos4T+}&6pcAW`zFKF6$7XxRs|{w3 z)pYTW(pQ~fy58@w%qT1q!)f&8?LPUhPFpfKN|$do$zIJ@IMb+0FlhfDR2CpLvEmJw ziaT)jH+y+8xnq=f;#Cez?3GjeWO_YQ5<^4ldoc*^;>dJ`yUa*NSJepe{aj?PmW=nA zeWiu<(mo#PfE=E`3l=B`nw$=N9%-yLA~DI4UT^_Ap(-k_P24wtLHb50Cz(} zLy8DII)nn@?2Dotbj8K+m2`S}iUZzxgzhYc4tZj$P6$t~l!fsqaqiii)bzF=cu4UH{H{_rhO%bdDmj9P6Ep7Gf{U3sJShnu9SQzZ>BnK6mnLRK{gxzS;~T@H%Jr^BjN>;x{zxz~ zpf#C|z#cK-XEECx-NDE4Q4;YJcbFXX#~fjZEx~V!1VQ(Nn1&*(mi+OxV!w68QJ)B! zb&315@if?6Muy8Xyt5=e)7+^Ckx>GGXM#BYuX~Wp#gRlTZ54pt^4V?L5ThueESwk} zk@Lvs;O1*_*iuIX#_>X(-_D!$v{NJ<4TH0_cq%;1fy!`Ht#Cn=BI1*O?mRMQh=tnZ*b` z;-8O$^qUe9DZat=GB_uTsfxPG^c;p^ND&7Q%bzDfew7N~g5ZXRTyc`^`vgFT%-cDN zQCPcxyPfp9)yStZ9cEKDsr>FuIUVD@!QQZng+G=92ueP-;9`kLSc@w!3)R`+2ALgC z3Fon30m|hI6A*2q3JQ&2dYLhwo8xslO&b|P1ejV#Wm;=771mz+gXsLF(_jrS%VJ=RGiFtYbbx-BYl3#2i~jytCD=y8IbHps=DEtdQg4wgGaMLwa=dGj66#~> zv(K>2HJW<{ooIOH0*B(oTKUqbv2=Zs`6+3HHl?n%xC&BIXY1`dMqnRukw^zmPaexT zATRaV_F1LH463xhTvL?Jadz2^+k#AtMv(89Y?@SsE45=;{3gH?)#yxE{Zs&)gZD!J zN?YFanbyGcAA|eyR(m)6n4Eb%Y+jHf6jNa>{FZ%#lYLUaJGpepF;V3pT+}Kr zijiCpA8w^eHuvJSIHJdBfL^+ntt_zPQ6A%Ul)Ls*Um#d%s^S+AmM6 zU7)3hTJ1=cp&@nFy%M;nZpc)4YLCFMCxPMRJ7N0SPZEBE^#H4d!8fQ;dgkT6t+H?~aPp0) zPsHLyMbytnVhk!hX-(J^*2*(B-ar)#pZ1lsp@!pOKNs=}s?PRjJ6NCa)!$h;m=y2w zANkX3s563t5j^Zyb5m>>Kb$d{Vx5~WA5T`#=_UqfNNNTG z%s~vKKvGqx5^K14K*Y~+qiwxnoQ6*EqUOi476+4seS?$7;Y-JB0T0S{De(Krv^e*Z zs0exiKMMF^kF?iNCi;u1(fY~? zAxnSnTsbiZ-GP`Rt4^Z42Hy{*83w*D%W&dhD=?X0(wP$jzKwUFoCx5q-|d`%Zb^(!_V5)BGhI5*gJ+0Qw>*Ne9HZV}{_ApO%>% zya6&^Tj$ceN@r|n4izuCf}C;1$T?Wf*VfqeJAI0^a6JoZgMWGEE4k(BzCO#JVN|O; zN^}NF*=Dr*4O|&*TQAn4cL3CAeym|5i3uVHnj|vxW|FxCP<23S=5H#%%sWQFoWk=( zpb{^^aF0zJ&6gwh2bA+8@g=d1u9*(x8Rtewi@MA{S9@*;a$sA?2>$)(rvKeq=#*FL zO$UdQzW5+kqWZP|rY&ElrP2ERo>J85)tlxnWEBSK;!%ZYc=RD>9g)O4QqvJ%wbpK7_Gu5k zM9gTKi(4z_V8$v{efcI9hlTe2j*D@5JF3q9xSYwQ*#7CnC9)6^hUs=^av#9?a7H>w zy*Gc{`$7Jihdhmk>Z+<&gO(WbsNzj&^@&8GFCwO%_(9x010-8@Ac43!&YjN{OTI@; zX%Sn-80t6Tn!fR?CK}?iw{R;X0Xz@?!@x-YH0Y-)sf4S>K=P1eYJ5WS(N3*34jMq_ zc#vglC!;Sucj4L~iIx2k(DPd}ZU3~4N7!7K-%XiUv?C)5g?x4dbD}58q&18w-pLavNj8KYM$UhDY>^^eI~#2! z9{1hpEV6m!NlT4##`#s(zz^aIo363jX3>l`j^qL$La)}q@4thH z^#hFiV++6NHgGvhRv9a0sZ7jT&_i;H%1uOe4(v^hLzlfWc2KfKLJb;YqH>-Q_S1|d zwDFZ*k<1dndS=}#Add=<5#a?#2=*uFOEqC9=D8$MZs}_A-{1+Ds%jT{rnMpR{1)7S z5dD-PvZiq1*X55o1q{2==p1Yx*ZS?soz#ge?V5A0`9rk#Xyu^Ir@UXA!R|hg`k<4h z&)Mt;kqT&_S|JiP-K$Nzd*1=tsaGqkVoQHL@bc+K9DC1e<>SsMlH=kN{>DNYBJ422 zsoqFgJl=^T|4u%e&98;2gT-i(z0CJK`-~x!kfg5zB{vm1LX+G8?`L z{HUEP&}+i=yMs`H+kQ3o;fa~UVPTMHbZB~WMumq4m~WjFX1Uxvmamr*tz~=~97XJr zSvNP-8LxjugB>2a0o6uR#Lq(!|2;v3DBKcbq z<}b!KBcSq=z2==Wf7{^*vSgsBLm}mPL~z*8ug-Veb)`T#q)@^i*Ll#XJTDPeg@B>Y zw&VIuE%<-YkNB)Vyg-FsO}fo)%y{};y_oguGY_saBor>%KhQjVB{ZlkM=N+Ym)=q5?D zpk11Q=M#vgn|2%FmBMb>M^?c(YC2Ydc$B`#X~YOARu!~DWDCx7B`jIR@b7a;308uYX0hV`x!u{*6elI*(*ye<=AVM2`7|`vXg8?^oqQ>Br=_0Qv$WltaL4 z3E8F6Ht#rx78VR=ylHko$=Uvgt&L<+>g~hB@L}_Wpm!gR-sKIO_sq=Tz2^V7=;dAU z=dzk5yJ>7`eB-*M_hq9{F8M0?Q*9@=XgWEE_pN&@Xfc)F0r?&TFBQrk@C)1V`bf60 z{yhs|Wo{mqoGgbJKy&t%B^gyiL*w;y1?$bLFZ1^k&UORn`;2rxe@>x`{Kh0*@!5=v zm?i0LuKRE3qMHvVz_qpzmi1?ACUOU9gPF~7F>B}f=iQ&`{}F;GG0DeI|99;FPd;?i zH2+9WI!rW%PWIo(8|T6J;IO}C`YNU~p#*H4zXbgH(?_9zOY?6exOqoWTK0eJVXGs& z@jsaQU)Y1Ox94An<@MjC&Kqhvc{J+aX7@{BKspMJ+=ph5Q&NURl+a%4ir0)y@wycQ z#$4|!bQ^f!Tl=i2gX4%_lYf|Aw!Cesg=^{E>N4lqIzEnUYip~o$Ch4||6G>*O3B~& zh}$%@_62hM=LtWx{Wwa;xMj&PkugJM;99VyKf-x>-nBQg{wGUw!(~ez4<5}`d;aU) z&Z|Dd@X6PXa_hc!I(pF1U57W(m?Ib)sLsX7{-W$hDE%gU>h-<@$IFPV=eK{Q^}j=O z|BrD}FJzQeJd2~g#}(h>E~V+N*@a$w#0$~0#n5mdoSZ#{MTM4%gPhWj&rqE)qBx7#6b)fDvuk+ z;!Eswvi7FK+p*g1BEYt$oEWpUD|$aZM`qtifS3TCoex$1)DTf9C%`ZhlDx$J`r2ah zvr+3_BZ0q+GqjP#2-s485Q#b%1j>LI;fEPDnLLU%7<~K56gm9SCaQ6D0OGa+7!0TNx8(+$Hn&{yYOhRVK3r4 z;QFPFDE>oR5x3v(w}Gd6{*ikE{pk^vD=U?0FPi%36N)Pa-Ch@|qKLHYMN-eLdo!s{ z1s6?@0BV*__5e?#GEK7^BG6ifzn*hV<*%0;LXMfnt-Go3r}*1!wIScIfgDZBq9q$p z#Kg}OgX?ZE*XxwZWHJKWWkpxuqrICn!k(IMv0BinrRR1>Qjs873K*iL#}7gq;~d}buj@8{)O>d{*bp0^{Q3U&W&Y_a!2_O}jPog!Vcu4U38-K5|7D%tok(FbfU@dpO7NVX{ z9ya$qk$^4uz77k*QkGZGTLTj;aVOTHi?~UJ-J|8mZh6#I8Pz)I&0sE$*S(7zTKyYX zyxBupbek>xe=+q{QEjeUw9ppUmf}{tMT>iIDDJL>;_e!tKyfK9!QI{6o#5^+!QHvp z=iGhodCEh^NY?*;#8TqL>tWHe>)7iX6YEYUUw$jo=i{aO$=Md-8_J$QpX$$>6m!TgTNK z$AtLUbmOgo<;$hFsR}}O;LfT$a78@ z=0Fu*UdIJUs>3Q^3oybxp>;AH$XkdA_aXm&_N1O@>j*$rR^slPspGSD(al)FNnfV{ zT^n8O89i7t|NIb3UhL14P+=0jJu4<)Z$9quDCf2Ku$;tn^=O#2pfJY*`;9k|b?0?R zlv=aGmKEj-X%6_EbGW_wB@r8?JL#Ea1;bh!^wg>w#k2nLy*R!?yfkG_a_qEKXB@4$duM$-gKP{ zFTdrTkQ%WOB;)RS%uLy*!U5kMyu7+4Hcw_1_Zld7WH<>4_J4dyme zy=CjA48fV!pY9iv9@Kt{UBKifFJd|XUgV_NFQe1=bvpafBmlW>@>96JxQ^CuV|u#V z<~@F&p4Vrfajf^~x?Sn>OK;3@LLZz_=RG-u^mCt}#qnCJGcK1Qhi4eytC9!lC*jZ7 z=XOl#Bnz?WZ9y#5qwd!Jq zi{A4;R%^Gio7*d;&xWOvyh(dY0to2(gKGgI^bki*QY!!zoid{0uF4WI`Dyv+B?i;@ z7GcGtlMR-yZ3H}O+J(J0Or0rKS*S?tE?=j#Y_Rj5)l5}xYSr{YwC>h(LmOwRbtFyz zU@orgPESEN`bp|}dzj@l5A(YIZ`?QPR-d5T09Js7BP&GSs0=_?~2|VT} z9Pz8*vR*Opuk0!`Q2(0e%Y`w%u?CCMReprDv``i2PbuaRABz*SN10{VTSio1JM~jy znbFb)vCi}8BK*Kydv~U5!*uQP_qE3Luq4-g=BGbqE1UzD8ZPkmnhDs^X6CFHGV83~kdh0y$1@zld;8o?LK13poWDA@X=(@*Q&sdIq@CQ@^3u(f z8as5<{ql1BYpSirq!QU?ZVF~d>dj?&yx*h(;$Kf9!K66bR~ihD_)5Hf5KCMo8W~wd zz&dFR+RtzQEq{c*SCKLlsSga+KUEffs|Y;27T?OLo4*tK!d8lP9@vTT$}ZQWbfw8me-M zkgSdmXUt8uiyuCZUq?(ep zQ+s2s%RUhim4-j?45|KJkF%Hci)$IMR;-pzvOcv6f{0-O&Jw(watJbHIAr?f)5Cht_j9(vhHn?nV*Qb z^th8YQw{f52I4n142+K&%8j{R+Wz@lHj?`G1>>(Z;qRucxXc-Tig80GDGjvNY~!w$ z<7xc-ua+41fTnE#ftbT*z;_YV#)kfN-NqF4w$t{cL0W%WlH?h01nu+;$v7sIF7PZEpsBc1}P=S^3!; z)lHY;Fo`;0{>hUH5<0qCAkd*y0R(*B&J(ttqcliy;427l2%W1N<)CZgcS&^wCLCEs zwK`x^`Dh|rx%S=kbysB_8`G{Jgw`+O8wU)>Qhm%B8_%rnjR;$l(6AX|wn{%Ocs zsjuIWtr6r-kA9op83R{)j4o!}Ew+n^pwt>KR&m8aE#9i`la7 za#?5)30Wi5&qNc~?MQ<|pd0sb8D#InHom$hDX*8ORVQr*c%vxZJi9aV`0%#a5Za#< z5Vob0woKQL4@F_^F5JcAKtgTyNAC1!Yi%)(FXA1<6ysvc-DWN2Wc2tiw^UCrfcDJN zh-9?i0Jy5|{>4Yy->JwV(db@#W)#OKxhWB5s!E^j=rLNabuau67gg{ShS{I;nOw;S zoxjx_zMSaH!=<&R)MW|XpmH!h1Mb#{;__JjCIu=I~OvY#b#G_re)p2ELfGZnkt;X8lx^(@ov}Y=;18J)Iy3% zHIIBhL*$TXLu=l(uE12|TcXJG^I<;M#Hq(0gm7`aq=XTISon)3GGs zJVQ;L1@GHJy8wxF7l)-btF5NE^?lm99Qex*<#vZ*3)a}SdqDElcvfvmY)koBj;RI? ztutTI;U8Y@u6Et5c8w{PcyV2j@9AP@Naop#xQD!3TAjocVq*tG`{j4XAzCW%4$8^G zQe8XhJ$vEjlHQNGY9Q0yv>sH-VFS`PGR(i_AfYW8lCM=HcEtpa~n}=-|BVj{{HqAaRy@CS>1u% zTqb4Vv@XqhS!Fst?$d`CHek$T)ph`7KqGVVA(-Jug9|y6JT!wx+QwskjD6-({0+>= zEBzgP^0U_ZWa(}0x<_7dg7TPR@m)~|H)*s_v*~i{_W6pN>R(!E)wR{%P>e$@{&o=6 z#WXZqGe{xD8PWKlSH026ih{yJp6t{|oBLvOo9){pVVTnD;?q2*j*sx}ryFq!J&lu- zX0ZnBI$8Zntd|?tkvKbY)htI!32s+vP6hFhX$^+lYigxn7jdU%}26ut*XQjVv7Xb;GUHEayXjF)n8I4m-TmM0=JI)A>DuX z%_r&o%b0as{p={5znUwSE+!~Z5B6Ji{5Br@tuoU$-_nb9MNR+g%nRyx2rRrI#cFb4 zRizLdJMo5+0Md3f{Zvk5OHC`mZCtnLj8Vf)Pt_2_bKBgYphAyfUt_C1 zHEATochg|C2a2$Kpxz>k6!Yq#H<&%`eeTi~+Z{+=7F!RnA!e{zcMVRHmCITPoUUri8{Fx#lG)?X+=hAIt&8W@N zAG`R#)W}u5d7gmLGYUafab8tcl|l?8GMn$B`i|71$Fc|$N2IWY^qm4rmvQKYo2psB z^$3#KBj1w8OEK>C@(Sks8(qAWU#m!DuR8HgLBW3*upmaL%$I$WCGHt>7DT}vO2Z#> zW&a>yrzlfbk1%Ej_&07JKR5F%v{VA@zbVs1nv5p7j%eEMSH=w`>iR!$GsaxE4KUb% zE)%0&$^!nB9!dloN>l|+_}nW5qLU6!Y`&PURuM$YT+3H=VPD@sZ;03i>|BmvIWs(X@x_RNi~hrwE}U~98wI?xq7sZ7Y) z@Y1JkBY*(Za&I^vDCwR-%!`TCxlQ(p9op8iwvxWd7)bN1|Jl;2)M10LHeeUCVLj(V6DHXohU z4-h7yC6-I&uP)>zcm18TMY@q2W!nmP7%qbx9K1y{(+ z$G`n0frs3I5l4#mor>ZA>hVz5cnP5ytib>Bn9Ac8_&O#~|Y2-Xse= zgpQ%y`gWqV1HPo&l5IHOmj2}L3+$#}m{Pq%vX~;lo*yV&iR&R(e4<|9v#kn%a%Hrd(*=y~lk zG`JK+e(wsJ3{PH&%ZG=8Jye3TZv-^%Ut2jn10)88+lRZi>#ec9d9`RK41iDgoTh| zfA%`72JJZdb$wJXn%6%AY~MLuYcz)1g!&g6*SMMPjmu>42HAvCoN+es`exS@&hEnP zq1)@hYByLR6(F<=zRBTy?sG<|RO{+ESU@SqnT=J=4Odum_@4*DT|B^_rE!3eX zc6$GH%0w2SwV#f7j8c?wFYU0#jL#ZS5ui(#*EU=(vS@uY;MgI4xfk2j*jMVDzQC*X zeRn&!b@|cKIl1=;U*vN5!M5z1SM@KC5M8v54CSqdjUfYtfoj7=WDB{Zk%IDOoMnB2 zyPrKl+veqw#{Ib;TfYPGB_etrtd>9QW5*gkb)f6&S{4B(R-FxvD)vi@=KYz@Ut)&X z5at*_@@~D%DQIqg2BT7!b*pxDIM=I}OAFPE=6IjtOc11T=*g7w_9ll$Lej1U*Wimw zEE(oGbgyfw6N=6`baTgMWZitmh?@WGR9>!1h7&#UL`O;_wQoJOavHA;IV|%uyseya zDLbv=;6^#G-3r^+9kSBhdk?Wa2L1U&Fqd(s=G70%>qUdP6CcCRTYkp-vGXC-7Z;Tq-X1f* zf9N5x##FjcGs!0l5`JdJ}W8^y@Gl0PmLDG*RS^edPC!# zvfa@EXmg)5?;@(C4&cG3k<+OnUKA*O3so|tbl@U_+VUzXD_`8*b+A({F(k<(Yn+@m zdg6aq*;AB1wKo;3kb_dk$C+2H5%F!R#*KUaazS#+QrtYceal&$JheLq6Ng`nM^s4C zYk%W|jPNzS^wS!;6c7K$`2%^2FZYt57e+%`r7lsAoG!}9!2oc&+k65^EA zK-ewiItWV5#dR_X^kERnQj0WiDjJ$?sLiZeiCCGMx}I0LlzskA_hQH1TkuG^?7%C3 z>b5r*xVqBZ6o=cR5?~`V>*ZWc5$`PB(WO&?_WqIYfUl{s(!ZTp!tp+XRZ`Bjl%e02hQME=TicWw&m}*b$Z4Ph>v$@gGg4(z%oanR1 zlEGNG%8-uz%pZ=xkJZL})Iis!h=l#VHH0v-s@Kc{CXqUx<_2SBvQk6F$|%MdQp#Cw zON3X7_@vj{Z6NLP6-IM@nw|92949h&E!hjr)9zIk8~zb=`wN25A~y5#4D+K8-5iSj z^CwWq*^4zw8}+4Ji9cq8QhdkbeL>CNTHYAhk57#UNconoAD7x_R(U?CoWxp5(>{@N zR6PiOg8$5NEqk!ofqUXd_wyL_O7r$aw%g8?Q21TzFA6MS!|M|iXLFi`=AW!jas{yX zZtTcLf*A_$bSn&Sp{WTg0GH|?KK`%2HI$V9l=BC3%a$}FOlchn&C&dgpg$r*_S&2d zJnwkhi^uj`f67)D9|^QJV8(XYw>iSeUomP#cxcJSa(mS?Rq`*t8oazw5s%sQXoa^#ekSEhn=RkqgU|F+ z694aaw81A#s>|2gqxyAzLGR!%QQ1dcSfNbUtH8|vXSZxtJ;z(x-BU93s|^b6ulzM; ze4IE0&Om`+gTF%i|I+2b%bB0fFstm$w#miuK~U2HW{$&wXZEM7Q{Nwp9JodkX5{kP zSKc34ZSiD17|1RAN&f8x*a?7RJbCbI|EUbS@GvXWAK{jEaMhO>SG$k$_#a-WpK+}_ zYiCsWCRp>D)}MxPTXgLN7r!^4W2-cAa_|}LiM!UAq$?uLc$;fv>SG)J#jCoN9+X6B zt_pLB_7wOr4Bka;@?nXVEPn*aSDyM;xlaR_4LPEb5-%;H|1T2*6fj(p+R}+S*BBT5 z{?J86|F~Y%T90(ZpU%`^WpX>%0%dfrlW+B7WX-LTIq56-dwjT53yD9~|JkqeuaXqN zu?48*rp>V&g><%_nKG`67wd8$|J#M(;}h=^^kX;y>Dh7^y;7iiVxO?aXAwC;j0;TknO zA{wN3E;!9fn~SJ|y8Ka}Un-S4C7cM`;OEPIkUN98{5%=cB>0K#j2_YSIg)a2fFZAm zA|bH_gL=sxV_X*aK4XS>6uMf8J039`9*|USt+G|^&8l@6qMbjERsArL38gGBVmhUY zX{@uo7+h+Ara}{7*+l}Zk>g3G>EiX+7p;-!l@|dlDVpl-8CYab%z#+6(vf|I~A>W|ECg7x^rKf+WXvjS%zMMc0~FE{?(P?TUGt07a?!*UOMKD5Qd%xw)C(&q1zicu|k47(R`kVXa4t{ z#I=D+P}i~Ble8Qkzdyl#4D7+2Exl1Xdv^^#;wli&QC5GE_TMGWbuFJnZ`DKq{$_aH43xBN@LY>pnwAj!G|&Y(Fcj)^ewLd8hpL z8g+#Hv86k9?;rR|y**RSdY^RpZomj%aVHYl+4^0xsfg$Y;2Gx>Td6=>i&GAyhxlR^ z*89~-nMm|MKv>0ubLUln3sRorzR3YHqv^*i>-VWX_YYXv3*0jl0bk_zC4Mu2-VZ3U zb*f?&(Z)L_A2oU(duBK$zv9YU@UXS=V)|O2-E?#1z`gYI$(fmP@^F?=Y5&2@mXhkI zCQ{zBsIIP$Hu8_rCtyNWD(aL)Nl%Y5Joktp0QBT3Li=Olpx*qvyo8{!z*VT&L@Q@9 zbJpVG{9LeNe!afh+BAERy8&Y$UX*ArER(BPa6>g`ZeIMvsJF~UyB4iQisoZ>XmKsG zX!e?!=$+7ZGW!``AOV`$>4S9Dbi5_zWDK=~##Ic`KM+rLo)c93#@j&DH{G^?e5-*u zKJQpC-C?Bs59(4{MB#SrP2o8W}79uIYA;pCq$YZkpmu*l}gGsvDc=p9}cLMR|!vp)i1zM>Op?hic}(JUgE z+B00@TbX9(_CWies6~ke79X6QD_wsAx0Lebh{lqb&v23lx%td5jpr%8Mut%W&lHc3 zON;V9CG-ovh;vMcR$fi)wmzIjJ$A%E)TW~_`y!$J0-`POqILg;9xmB8W(@(g+FZ$h z{j!X0*PfgxLP8|&y=FwfyV7++YP1(LtmdoRR5;$AF})PaNeiQXQdk3hsoE23@cS%H zZ?<&yO|r%S@Z1@H7Zd{_)fms%=w-L{kh%B02?-&J(2{Z#1pR#~)<=OtK91z8wAvxi z+R5?s*$$je{99IdvWz#RvU{F>!h4Y|k16w-qLu94&q4=8rO(rBRXu{w%AI+8*ZTbVm* zw2*L$y0?ERfS6vh($8fL*WL7XSUA?rlO4ujbHgP!oSfoTM#oIf6tTZI`npfRoJ9-3 z-`2{1Wy05dQvC2{!eeLs22P?4eMNM zl;mkyYEVbv`Mlaba6M?EFm+(k<+GAiauSi+T*>$p4{t2vJ+!aSh8EwDx9OB=(WdF< zw$U`)iJa`TFaVLqgI-7MI)@@eha>E(1WNvRMvpueP0Y4OeV$q(ZW8a#=UBB9!_{gk zHsbqtFHB(56AZX_COwQ^fL$c`vDXA>b$Q5ThG*?n_eZLD*7#G2sfN45BW<=?*_Ztc zWsRy_0*ZlAJAUyT5%u}d?49w3e~PO1HQWH(XCy3m9<<{SXIY;$FtLbe$wrhCCHMAo zM_amOc{=?3N*Yqg-Tdh0Ndt8?v|ua!V8_>eJ)S>NhAv3T;g!@4iN$3xnnHvj>fiKw zo%~?B)fIm~1UxO6Xw^mi+6VX)%PU*L40%|2k^Lu5DijxAsj-~c#H-hH1Q^7F3o=Lf z*1lZhkz~Gp_wOtAogf+Dm^)2a3z++dm0ThwY7FYfEpW6kIfFz{g%Cm{>J$s#d70vu zM-7%>0UUXY6l9S$>RLvV6*B2ZO{kJ<5a#(E2uo?8qBW~ug+^(CD&^HZ%WaOI%E6^G-n z!yjPE2;atO5Y(TP7!CoMHZuXj#UWvDx0KM8nE#=imIJ(}W8AchXBj6~J7-~Qrt@(* zxzI3{%;xua_GJ9E43LBSLf^0>8Y>S1MY{QSQ5;xQI9t)JY38#okYen`0t(4hLX|FK z7tn*=gT}-yENG#(i8SQ*u9&GPo!4npE(q-xwY2T-;10gBze(u0So7STZ4%|q*eCpv z<*gZ<^uMu3G4sY!t@@>@BZ;P4H%;^m3=x7L_(l?JF}mf|D#>bG0|%gUXKvRKMXM*QL>6~{SUO!?YvCc1Z* z^*5!dTG`EFXQ4t5e@I-;Z=K?UC?KG~*x$745nlo;Xhq|p%f#Z~GfNCVcbfOhotCSa zNt}>oK;b3x5>Z%{s({+5bZ*<7{UZmYtD`;2*ub|w^Xwz^Xr?L=4OW?Oh^ z)}G0gol&p#M`Tp`RitGpOP^zfr}d);oc&CS_}>-`XErczO{}$gNNYkbdtYRfmPDi> zjq*^JzHWqE0>MnVZcDeU9m8cZgfv!BxMlX!3qw;B3_~RCf%<&DT8~8 z;=9E7rnm&XqUT(eRs)l<(Wfo>;PH9usCYeTS$vvBp4BlLkzr*y@81WEWkz$Jv2Lw( z(a~7qhE}&s0< zLP<>m#ee)4Z#HYJWUAv^&=1uU5?M?JL2MNenLrKJeaEAK(Cvc2*q;E5BN&Uhb&cI6 z75iWQhV51FP3IexXm|S&DCjL=v_RPSzf^-e{I2Z3&PlRWz~-h?a+rQO(HZ)C*}E?7 z`P!2k50KGrOYH3x{d8Ahn&d$^-io98*!cqI$YR3kAusP$myS2XgKB}nf=#!s%inh_ zjgaJc2vbn1&Sk`2_5B5RPLE#_tu9h;_PzTsZ@@nAG%t}15knsM2SKwgEriy46mwRs zI?5}M{lb!70zg57q5w7u(+{9JwJZ$@t4wbT@z>IRmp~C#*$WK3xqJWBMPVK>XDNqi z{hXdybKm%{Dp@fir}?}6ZL0NktfBm1pw4yg1HsBE|KS{&Ab|v;y~H42d(c5IWj$r% z)yr*Jt!rb|)suyntNI7eGxR*&k)wMTuZX+;*RU`1SV47KwWdjiG?QCAarN#K<};#! zsNOTqDD{yhC(G|Le%8fxFy@cWQhBSlT$ruEXzyW0zPu(wrtRc15DTglyGGjRUiJQ# zdWlZANM!vY7R~FxaCLqq{^U&9w+X@alY$G~Cel1)vcJSIO?D>C=vDWLS>G11Uo)Eu zh1u5QBa#jl07M_TicKys`G(UWTwI@qv@E^vixw5v`eMqsVz3RN!J052pIw1)L4HM1 zyhPzp>VNw?qp&WoaBj@!%r3}m)cyz<@EP|B=r1^>KAQFT%o$G-=Tt3&#cgk*`e#Xp z1O!bY9e!1w1-(!bM+omG$j#h(PUMN^D3O}(@4W>40R%G{53C=Ls9C+GN>-?`>;BH+ z9v^j&lLs)o70xa$F5;oWv(chOKvR4xv;NysRc; z2-}2OL2Nr2K|C@7vPl}@qIwP8^@0qz2}tE_D)1n-Hn!Q^@`kohN#iX&snWXjMn0<@ zn0;%9&=(qmA9WLy_^l3(zMv}ond2>^<2qZb;-avPMBL|&eze0<@bJ&;q^bQ?F)VGT zM?z|&5co_=lf>Oh98oe@Q?EwI0US}Pu**n(J4a==2mJLSEzKjU^m1#Bec=;ET=fk>em z#4@F@+@8-Eg}|C$#e(&LGip6T4e}c_=Kd~ga!w=i??IQS=lP_wXXxAiTMTev#b#x4aX=zfPr0G&T3CC_LPGkpdCKIKTnxEu+ z#BX?7%nz2K15LkJU^o3|`<4Cav6ruQc9u9hTvxF2?41-_h^`uUEig!`X}3BeC!@+ zx79Z;+RmRmNH%B+gj!jUI@G6p#k_E4r5z5-S?cOo&kc817=jMH^CvMr&q#?JxKY!p zSIG~#RDDG^7v3mgKe>4sDVIQuOdVj;8)~4@`)1ajLDwiOgTAA!Nh@3NW zW$k{*IX#rCg@j03Hn^i&>beD(LM~=&k1xd6I!Kdog+R!y3SSC(3oIWu4o_i2x!)|( zU%wH|ohone8<>>q5sl`ps3$GwaD60|!ts5j5WZ&bB+Lc*pdAWuHXPTJTCv|B3VJR7nlb~`KCQd|1yprg+k(TpEwl%d9kpQ!XSvcIXWxIH z@x5NDSJ=9zsE0F$K^<7wQg#ZopV|0cXHkzp6(V5xUUyyKPgUPr)|ES9g#)#ygH<&e zqN4GkUsB~JCP|m|`LiAVIDC&Qkl^A8l)-#Uy>+(9q_;JT$A8t1k=H73yL{qe75W}K zQ?bZixyZcmW(zJujmy_2-Sz6PDNv>Jsr_Uz&OHX#OKZELED{;}@YZUrtu^Z4SO9OI zM58Jo_+e{|-3SB*{~EmbrW5u82Xl98Ik}1*JkVy{cne|LU6-fI@NIc72rGN_5&Y}N zBM(bXTE(m?CrG+3|88sUnX0jIqn>2s#Wq*Cd zP+5%WUlFl(~z>N2*s%Hne>%o$<#o8en#54h0MhAO)L+ zplV`^@aq@K9U`(ZK)){BS8Q!+GEwY!<1Qz%$RF{9bs!ZT&rVGS2Y3&NGs_g5wNf8qHgW46x?C8}SkWw;8aK<;a=IU8f(b30Xl1itD=p3V zG&G)mdRyPiDzKmuGj%CB&dy^d!DiZNj_u_t`KWrCn@kpb`Cq_zXsC$oKG|7JGW zz5gu1Q=jTYbYRa^?W%?i%!%C6(I$u}`9($8!td(aO;42I^qC5sE|bX=ghEzKjsiKe z?k};}7v}-g8rx)2HS69^bqsnQ8oVMos2LZgv`*wQ!Chz)&nOIuXilM^eeU|7`-rWHJes-=Q?Q$0HkB2V=s z9Sv^x-c!D|rb8LXZzXpzNg&j!R0A(NtZoeK_NjvtNRSkkgm~mtU28w}%YC1U9Wq8M z@1k9lG{c=XDjz>7!$r&JF=Zw^J3;C2)2J0d7zbErjtE;_wI6qFY1%DV;#1mbD$h;Y z^DW6u;Siv*VO1)45r=y#72fejby${p=JWi39p4%cHKz#uOrHRLY#jZAWK* zzN^KsOE&47#KxW=^^!H&gSZ# z8xS3F1_U2+Oe2x)AkM8-W1srUzGj39ymR zLF{R6BUFss$El7<|7;v*<YCNW`&LiT(BeS4Jj6&9qU3g#$CeT)vC7lQ?ht7^v>KaT6f1y}HMOC)5Ah&waEET| zoU;FY{b}$kC%7RsL6dwFC@ieODyKhHYEm95*5}-(2@qHjTEo{ll@C@11&6z!;C6jt zDYHIi?t6=w{3f0RSggd0UCS49n;)ic{dRg0ldLXcEe--XHc;R#oURY!GTHvtxf*qS ztB6o$B%fh$a3OTH3{EdFy|JV#y)AS{rn4Z4RG(NZ&>0hO>Tgb>6BSlSDf*j{u67Jp}j39#v!S2ObHsW*g z_VfqE**2n!f4H@`gF6x~EzCWiKfsndSRDGrwc68_;TxBfDR(zFgPOg+InL>a%Zg^3 zdSSoyx_+6GnuD=(YArIQ6>5?G*VjGFNA@zJ_WDK#)~ z`y97!nv4SMVeU9i>@Dly+RmafQM$_N1?)(cf0IhRW|`7m6Yu#VtB^!YxXs#8^T(*i zq-FW(b8MTj!8@;3shmxuq#hGA&UVZ%0y-+bIsbc{E5iLs7YJ+9AN)_H`T^Df85^2tG0wTJLH&J@8qHHlIrIK zj@yCt@f5p_SP8j4-m$^<+ZDI02SuF$-PaeY6CEBKA>ari$EqtpEEg)L5!bAm)K?PQ|t$vEEm}mU=8A{{zKfcFNGHg9~HF@cdjiY#_ zCS8R*D-e(DWcgqDSe|wN(?HK8AuL)kAM1WW9(^nD!$n7=LJ7L}(S=5=&AxMMU0P*x zaW%=MnR`SCNswNF=z(O_)owOX)4<%NHmpmI8IFsJ+zM2TVenjO3jk z(MH!CClS`dwEb_3KQD-FM3|RRg3H<38D5I{y#5{ie+s@IRP$YrNdQn0MiX z=MD?(dVfX~mb&}IF-8~=0gwFg;ox7TX#2)RFl#otiU$rr#g zTN@InZJ%+x>dm}02qp^p` za6zaOGr!rqq6s=Dr`90YnlGC@r@5l?#NE&0|d_fg{CGZ)vn{V zy~p9Z8^5-reKLSvQfFgsNa^^5p`-PJ&25fLYwf=3b(TFB zD=%p%ipafCehE$^m9wyLi!Y9K^`|6wV56qc>^r>f@FskEK+Ca7+pV5NB4chAmZ8St z9UVGW)z8bC-%D4hA)N!5~^LV%%CSV`-GqyG@!gde22vzWk0@`{HVNXW?h zH2BGiX8y%^S&nc4Bg(UXFpyFd8%l;v`WL6jP*+!vii(kJ23dDZ)h!F)@s#pvmEn}B zjns%VPnA8rh@J%-S@tR_DKi41E)d3Tg%#e~prhkgizJI^aPfX5u}Ck}L#SqP5>j$8K$=*j zIwGi`pnJ{3pp{0*l_?}5kiu3p4%@MQza1rg|M+OgVfqsqD{WH2AD`~{H|s~`M1cmc z^`8{RbWl~YrZa?opeM)rn^CBW%ehy)vij?ib+L00kL!>Ti*PUqiYX&6|j|1yU!=r*EG^{@GGx5*GJ9Ea_SbXf|#Vbm-51%se!f8k=rGsd_b zY9iX6m6_i35(I@hPl5UcdKvi|oZf?^kVq9RCDC~<1(J-9!YbzMUV+Lzrd&`s%4k?e zR&9>M!3u0TEw-paYd6iKUuJpkq4bGNI9OY}Vm@ac!VDTK4~qa--PgCcishJX6vLGT zAp|0$XKIl^H>ydF)5jgQGGWG#+b8xIMOy~LeOZl%;6gk$@*p<=y&KZyL}nvOfHCJQa)G@5##SF)sTO`nR|!G?#^VmxvFI6>u=t}Y zcVf5Yzr6qiE4rW>Q)SIoGggbbP>&l6=#1v)jKgfIeJn8)aIIL!Y_MR@eASI_1~8Vr zNW-5(glX^=gMjGD zH&RS0kgH4V$`WP0L)unw-nA!3e>$Di-a)cA`R=T5%3VW~vmMRW8X|t;z!PFDR+nqyakTOt9;#PqIcU6%F@jT@ets#E3f{PP`c#5E&?lxv`l0UyC1ZD zB55|?3@1p^c(VOmpeP4ot;=&K4-ug>W& zLkDX4TZwZ_uM=M`==Lr9s%vVX*Cg*=q+@*gtb*IJ+SQfeEwZ0w+}RnKG=`JFxE4NU zvtM`k*58ou+Zp1$GgEZM_i{|ZcXQp7OIdL7cAVy}qoVrM*}?iA)g}o=tLZ(94TDL7 zbf_A#TBzsQ(=Ds3eZz`uSp(Z06$7r!Os%Y>Bb|^AjPk+kRGccTa+Zu8?60Qxtao<< zY4|t@CSTYRuU@?F;~W#OQuq1xxyOOvrv1}(Qc0SM1Y@b-UoV#e%QWn-xM&St!OHA3 zJFTFdQHIepD;5?=ik_QID}3R9X!Z2 zt1OCZi$wRbvvhcKz9}+BV}3;Z@b0(Z7tDV?egv<;U32DW2zbL!a!p;vk9f6N@nekv`t>Rt$ zL{&zSjIXIuq!ltytWHIv-7N_j#JaJFj*pj)rv?8q-c@?3DxN7+j0g|6Qi_?rhg5)` zJ!pSJ&k&ZwFPvmuF8+-I?={tjq!l+6Dj4IRbX}paU?`zpw1}%loj{;iZ9|;1pQO5bjbR2W#`=xiJZal_uy4hMF8H%qP+mG#QV5vX zVQpdn+YCxf#a;I-Hw|+AOqc@W{7O#j~)&q*nfW7`727hf)M)Mq*H^`CF;Z zf9K18V(~Lv0b!FXeSWi9jWQG5MXYF8D|{~h?c<7SIMn5M&*4y=`g+yeF0-hY_OSlq z=bE+7ptCl1e=?hVJ?1l9%kx1nXL4h12MHeSP~1PT{CF9wE4rtH*{KnuX1`S|Z&)k8 zwI%)7Duf-=_o?7D-E&LBcgR`=s7TD;3E z$@bLYx(=I|GzP_ze3S;8)xF0ERExRNz@PyvHj5o8&^~DE;6Nk4I*p&tDm|xYx^jaw z0W2JahUwKvgC#C|Ye>AUy41NP%!0iQQXg993kWrrd_MfAtCNo)Rm(ckh7n zr%im;u`6Cn=qHt(tEnr8**Rbo|XbL_6+L-;GUY0PJVAy^e zuHyNSsgx&Gd$uujGOF`>zYTA#Z`Hp$GJo&A&+Ps7!elX1DE<;yH#E-r{jH~>$(zET zT9#!0&~&9xzk>sMh?=I`=KvALS%40>nM)%TcEG23HGL5C!HqA;%Y!AChf8L2%cbYq zqOJ}y7Xs~%hfBQE9G=aI;jkkZb*!O^UA_N9)?0?fwJlr21VRWw1Hmo0yL)hl;O;ao z!QEXOcM0z9+PFIex8UxsZ?pG3_uS|EenGFEy;e+<1o9$GjNnSR0Q#liwP$kf?YG~ z4)3%K{miWP4ey`B5u@>|ol0isQ&$D&l~y7`BIFela4DUw!^5!LTw?S3$C%5BclkZ) z-rxDtL~pvNp4_4$aN(Pnq$Dv}S;X=2grCJqJa_3ZZ>~oGutMkfW``YpaWeB22}u6F zbj<6&z`!7YJE&BtQ?E6I{8J@V90RraW@{~0PC@(o6THvxVf8YLe6+=%uIeyiEp9Vbtjh(9c3~#r?=C;UIf06lsAkPs-P-ZV$;q?7fn{qN*}rj{ zHLvf3fg_*=>q?}5r7U5W)0#=(eXVHwH6J%s%0jEsAg@GUF*BSv%e*`{DyO|~Rr7aMM4!-m>!;i5S zBNvi9G&DrW&YslP#sl8MAh07pfmK<0Mg}#@SB3OZ;^3jj9q(;2l4x&YG%CAErBd6X zgRt6Q80Dq5?4lcuG(8KpW)i6bW%)u2Lixl$1wB18K z|1;lrS>ALJ;{W^ycoJqQ(a`b=PMI>KdX1q_&uxs?U!Ef;QNd8e>HcE5Q*@A&8_#I+5OwY|83+a7Nvkn1kUx9 zAQ`Ap4)#>wtYE=op$+~|lMhWL(WVIQKR58J`Kx#I5!|k}mbtjN*ub9RpO*mqUQj8Q zki-qI9e{^NdQLE&;0#b!Ieh_mOr9{P3nv-A%K2M0KZ96R=Z6q8@8L^15wt0ShU zs3=o#H8fbp_xpu^^OBi*UW)klUhh}97jA|lI5}Yc9g|a(K-BLq`mBt}4mvktt&L6lkqO44;SNH`1 z!nM6KP>rGM(dHCSJN!19UH6=6%?8LPnzk=Y2^nzfhI9RIgvvi~VDV}4(#-O-WrS*` z=djpk#HB{6+>T@Rvl_hsfATIq;=T%D4nqkVui!r(Iz%kH?S3t`<$78_3mrE^0j+t6 z_x~1SBsB0+7EJ_1i00m-{v#)-^;~sf{*_ojau)xQ&D)m`Dwx51ltMHTZ`4A^3ak1V z`G6>>6#0cNvoKs~kjuznI9u(m*wTmXI z!=;}FwP;IJ-^&)ZO3<0J!%a{j9M72XVu4X@cQkgn2S?T|Q7@Il`dZ9ogEE`+THGU&TfdfNF+R6sY8bh|j_l3q(cu7+9dB z2I{DM$zt>$v@sMw749BugPEZV0}3EvvFWD708+}zXuukrk2->v^@BTP#_q`;Bp-8eeD7%^A3LAYBoG%XiqNyKDk!REOc#oLT3ohV6K5r`hzhmHP}#H&^J zvBbM{DQY{(rRLSkfHmtxdt)zrBHa=Co(tyIojXys8eD=#%R&!MRXU=pmQY^W0WlA) z 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≫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.uysk!NVPn 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�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 literal 211661 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

VJ(k%7 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

D7MhLsej>v1V0rHdh z-Y1QELqmiG;8Iiw(x3i0c@FnQ46CJHMj!Wfku31^>;7Iy-@y9Y;;h5CO@yumM2^$S z9Cu*j>cPpJ(o5b&fn`P-LAj!VFCiX#CYR zhgxMpF6&1vgdr~*!{kSB;S-l+F%)g|i9uFMq=f>J!gRaYORS21n6xtykhHB9qA%+Q z4Q~ClBn>PPOp?C%0fI~_{Nv^K4ZXjlSufhYZeC9xlB5$jOJj&IE@}p@-Do)7(CTl3 zCIPe9V&HiD3~})8N=$k|~vBc4o06Uflv z)SKxA&i(Uoun@~h^1}tQ>3_kDb2-O0WVa}Wn@_;%Rzkat9EbS>}#;WO@j?oN_ zN}Aut-7TgHQ2*wQJ}zv$H|54V7s2r7CuHnYoz%WD0LL7%TG#jS6;y-n1(bN923tH;1(CsXAKs_s!o+ zbC))hmM;ViFjnS=Ercvpg_~Yi`^TTLJ^Co<>`muwrKJ>w&h>&WPBJxAawra5(vV%5 za~cU@9VbI?LI6kxgVzW`K*cN9XwR_k$IbD=pPcfC_pY z@tC`?iBwY;ZjNR=twUgY=k;xdu?ocrL&mlz0&))&GA2Ip9pV6M;)lhcmUS) z?T|I5<_zNDLWi$q>FU;2l&*+a@7hBcyz}9@sC^a#_~*G*wxBvvl=hw<^RC!J1EL1N zZFCtO0TqkUAG&dE9|mffncKg*VhtIkKq`oqI2TqNHCI)ma_n{K(l^j!FfM%Pcj@h^ zD&G9o5oNG_AZPRxoRm9}uzggF{e5x!lnJBpt zv2{J)j3IiP*p*;9$S@~o1(hbD1kz%pvsf&wBeIZ5GQ4#Ub5X0;%cOPtl$|P(2&dbO zTV@KKlzVDT+Rpe8GbTwn?m(352N8@N8y)iDLBIp4!amxZ)>*(FPpsT;O^o8vRssfM z@DfPoS!tHbuJZd|2Na2bAlo6U*Vo5$_sj! zJmx@UL|{YpiLo*%Cs4Nqmm#*`3k>eAF6d<&^eB>AL5>7sGJq^`*ahaqsbvn5YJBiF zow(YW;n;jot!R#8(pkX)C37D=eS;gENAaa(R|HggEBt^SB7?O+aw_Nq^8HO0gCsax z$g0v)rPVs-W=3OXjl`(@bKkUVb0#9ggJCSzPd1ZL69|Q|^pj%lGRU=5d)goG)9wr9 z+W6d@naNK}4YRlbQT8RFOkpl5cLzyjPXZ3Tjx7h^A$kJbEQWUhZqM^|RTdV`?JDYl z2&)hzQmNvD(xRy^baS^x-L1m7ZTtZ>BnghoV!rBC=l$gxqsn_!bA)35<2Vy1{_48i zG>A1B0hN7XW___Je?;4lON;I^B^_7WK;2bL-Ah-zYPxT#G4UTF5rKNTHi`s%C!lMeY=QRi*3m??g9ycpf0pIes= z4^Y=b>8|vUioeKyG7=o@E)f0_t)qlZRQRT^x(o%1L+{f{n4Li4t@vkS>xZA$C(YbujP@^KK=8KRRzvv*V<;ZQ)mV-Ef_A-YHK54gS1^B3GsfS7P4 z$)8>!_A;x?&N7oyr1{yv3urmbmBY8#mp*WRu5PiQBrqGvIK$G|Bd8%wU@$DOy%V)# z*hX4%-;Es^+lhrtwpa~GA$hjd#|Kzm$oFzP+N3}0)Tq|h$IEWTi4iLPiY9GkBEr3w zA2~&MTyafSeL)j75c|4=mInZq&7;bo;=)ZREhaAC^pDeX!mcEd!_qnjSE#*9G8YCx z27)OmFvPA{5J@qC${6Xa@9@fB?Z9}e1~5LTwXPiQ;~@~YGsM(q!o}Aj$dFfXyQG#Y z8h_W4EI4z91s1&F?QBHcV$jJ8PfFO>vK*rpHSOU2+WVP)((j-H6d=Y6c3vQ!5WC>* zs)IfFZ&CFH+1Keyhyvdy>Ipy~X^?j|SY!L)ggQF%%&-F|*(LYqHVBBZL88_j1;phc z7_rHl;vc+g!)ogo+3a5tI+{G;;zsJd!-Rw2q`t*plPUayM65O6&vE`yT)H@Bw^3-2 z9&1m1V4!ri9z`W7E}v(o2`SmNJdBo^nK?5eD7mQf?+N;t=v_q*&oLJK(b&`qSQDyB z6R#7xs%%!=X8;9@K!DyeowiZm3xC1HpVL|Gus0&2jOTmvUr?C(*{KoHbF4%D6uZ`;1T ztz&L~&idAwq_}nsqmEhJTeA(=pUMbcKJZ{q3BLO`?vl{JojgMH|wsvH7zNpQ~XuZCB*|#F_Gs-Pc0n= z%x4%6H=eMhq(oF&x{xSFd@EIysHmj55HLC?E=V7Lm97tu8$hO z{~sWmR~#`xoaiwd)omt>YGLW0D|NLK;l8L%AELi*x}{+h{S^%Ybba&nu7)*2d(oQO zXZ#B^H-jSuLY>EQsJ>PNOLr=k$cu`KZV7!q7Z}L-JM(YExG!rn1ribkVm^r5!T;Qr z>>h|pAoUIL77$>Pvc6z|AvAv#gw)0{aB^|!tR;1T*c|@;yR0razFsTM04fY}FAe_P zbFegD6LWAj8g^p=*1NibCxt?50n8w$+{V_?7vr6cgF`|BabxFZyVa+u4{$wBOc22= zijRP7suwMrv45Wwph}ZcfXCfpfas4L>^70C3cbBgJTXvO^(-n-8(;&({CN7yZI?X) z8A~8MK-5PJ{ZB7|!GKJ7lD`WTV2|`Kqf?KVbVh%lO*F{ZzTvH&$TgCR2|hjj^>zhU=$LqHKnlRW>=CfGs^nbxzriI}eu;_X{h1t3D_=}n)4Ts17=QjS|#TLrt(<+~ute%vNgX(6g!S`oT zb$I~(OEwK>^Az7$rcyAhB5QR_IExNua1y%DLoSW*J%Gm0Dp0w#@oI$uHWD9y{|eN- z`UNTzn+x5dv`Iqg5QeJA3RW<^`T7f)6eDY+8Qp`BgW!!lc_x-PqQ#CFWzL0CyCG4I*-Uo%^Kd#m(~3=V$R($Zopd&3m% z+0MR5Sk--T!}g9sSN_lpT|S)zQaz_NbOjqRW}J#Qv;G9N6(gy(eph3Jxd>al+9H)g zkhbbwsd@)Pf5{24T1>GqzRv;WMs}B64E^AR_AqIu3|#lKLM6)2g&==HM=}LZ2c~;{ z(vh5t&)uAFS56MD;c(SfJZ<^n#Viw;>iOu{sG7sS(|3UkSh<(Ts?te+g5c;h-khN+ zKrMB4$10tOID&_va3MfmORI9)7&B}v=btoAmkv;FC9+4wk(&^X`RK7d`+Ek5)1A>| zW<7HLuSLCuV?STtyPw}J>(DB$?iJ5JC!lrXNqYIX0Y04d5LmWp8u|dQNrUnh@`^>)^4}Ss0j;>m3_%|CGnmj*{&6z zBfyLEeh{}jIoR2Ika~hU!g9MxP{=>z3gS2=qk5O|kv7~O&nT2kC5{&U^;Xv$D(>Aw z#ELvi)a<=cQAAhf{Fl}z=ct3Y$*rDM4&ih+TPN8cf&QrjLwJ+Tw$4k{P&8a}~ zd50F8OhZJIHem(lit<2*gU080ld{xtC?oS{hOs2;V&lOc_B#jO{GAV;&r7sc)=^%h z&~c}+_D`M*^@6eyu0`d}Woy_F5J&lCpv?C^*-sApkI-Y=TmpmqFxA2+dp zoF(Mkj%cd(Gd1!PZ&I{SX4KKbtHad(gVFoANpv-}w;s8L^_V~}|DO30A@o(+YaNzr zfRfK%2@*gT|HcHModfvjbat0gX!3E60fl^mTeEa})kt{8S{Vp=w{jUqyJeEfep2t~ zI(s`7Q%vUoNUMC?-5MG+fHNxCEZ(13RayZqgsq=&TYiqom{E$NZRr*du`qey{QNKsw|ARQ^D7&l!Zo7~a(1r}`%h=Q za98A;A3eC>%LgqJbQsB$_Zy#rrCa>p4=u%+bD^fCfFyByt0|Da{j&??^G zgbW*u=Jz5soiu#EQm#P|MC^p6n{$jS z9E-8YOTxW1(avo!6m@fN`%tcf!3v}k;232T=HWs2GGMWAG>Lu8b1Uiw3xjWctQSZ) zm6$3r!=Vgz=yz%137E~F?n7w-z@7scg^Z#(HEjKTsTZ5^Pg(GGUDg#GkvioszwqYE zO&+O8bx@Hq~erhK@wQY>UEAO!}B~-4RSTH|%Wbm5FZdek&GE_f`Qqb2&oB zEdRkA@t9D;?QX3NUIpc$ZDVH$c-zKX0|np-psJYgrzRsrW|jVJxZm^%g5A`S1ez8` z{0`b)!O@VZ5;2T;pgY(>v;XC4)XFghwAfb>z|Mwiv}9ZG$LT8Gf=V?+3iDUI30@C} zh4~$`ajuZA!GaN2R3SL`rd+V|Yksn5d-WK&&oYZ#hleR*hNl&DQn|69iiV(9)f41C zHH=55e@AkSa;}?f*I-r+$WF}g5jOds($ep3(&X8`u2cgdnxob3hhm78XIq9A(H?Tx zs?43XS}>LF&0wQm!96Xiadalj)MLg@K^N1Iq7zl3U1yB{_7Pa0h5u2ejBcm41YV}u zfZ}%0Mk#;|Xd@7;(=KUM$;!K}{3~d?!}@~+o@MN&inESKhUuiU1_)C54R_TH^Sz>{ zs6Kj_s3>2Zc=YfwrVDs6YICr~PU+9#3#iVpX7RA{Szv@m+mI?0`WAW%(3l5!S7#vM z@0aV8hChp;cfJWUq+55{IxAyGHT!F~U2BMv#jY{428SP1*8CwvtAKm>uH4i}cre3xKiYN4i zN?Hx%g!B?Xd;d+o+AN4A*0sv_%<#Z6$;!sp5HfVztOmM2LvS9?=|u-(pRF;Fj|k|j z%jBWWSV!Pecd>z`^7cL6k^ZboU?d8)HD+dbOCE}YcG+C}aG>~u5qgIJf2vlF)_2uG zXwis0M`94}N!655?d8r=Pvum=f;@;$Ca5#xeY$WO+TY?6ewGEnAN^K#y$w}{3%u>qG$Ty+pc*D!1St_L1!znpWeivN_^HUOula!q zrN-Bh0y;^DYNf@vmGl+LTiWNwN^}}3jzAF>%f6TKv@3-^nPh^GLEzD$ks_>h;RETo zOfISs`*q>gw4`37g_Z99aWKpGiaV2q1{(B*hyIOV;06AJw#3>M{S^L0zFesiPX1@3 zs9Ggqvqedh<+P#;O5z1)bTdV1#*E)ofsAEgb6hd{-3HY9sPqKmoEICZo5#$i} zAA9`?d#6^f*cex*dz}P;1}MNc0Rp-2(6_4 z>J^s|u+r!lIdvRjSb~N`k2*=QK#KqCZ5WZQ2lY+RZ-}at)RnC5FRjhH>^o!7_2O@j zB_pC~ipD-srE1!t?ekrlXTi&5zEjUTLA&Z4=@px^C4pXDwWvHLBKD|pc!I|etZ+NQ z+^eYQe*U{ms^FFd#B={?@f&UN%mMFjq)F2+`-9ptIg5Hdp+KzY^_reMx6Vw@7Uu+; z599f-`zo9xjP7W5TCUJ`#y7JaWbbsp=5bh)cu`0_*_vN|!ZZK4UV6TTzw?qz8L+=w z+@z{ex`?w|>~j)IjkHIjbF(ef!``0r><1~jcH^jWELPF3IPyr9%m&^Rw8GBM%oi(|qclRIpWGy|iz`vfG9giv;cu{;ldqW4A;zmPeyaF9W<#IM1=oEUK7uLPxYawWL5E7!SQ&I`uY&)3&NCQlHBE z=%mkTgsdaUJ&z|IkTIu^de(7~M-16?Fy(4t#&q?;iIy=HU-o~`cYHSuUybD9cEfI$ zf$q`6o>r;Wl2f|#Y9S^v(*e>Mf_SdCDkx1}$qUk7eSJrB{(Xbx-gpD2Dp)LA=zj4~ zHvgNUpbcwB3+%a(BGm<_cZJF*ym|PtX5;7nW311(bqvaNd%Zj@$t|qjyPZEMkSUk6 za>MQxECa3fJk;WYRCg-C?}?(!UE-|g>o#<@gWdHwGDctMY2}fZsK`KcFoZ4~Z-?$I zbu(VIR!UC3J<$6P{O|xrdc|M$KscfE&nC%shNC5?sv#!}g}7C#&%EM7f%XV>JOJw@ zT)`6|l~jYy@cER&F92rC)9vOgT;Y(oj{EKA70%v}mUkGb{|PL=}$Dl4?Ex89#o zMy77Bc|1HgQF7 z`W1plPbFyd=ZA?o_$R`;F)CiSTfb{fa}E<*M|Qtm0vV%e@jHXbI71lOPkpa=qt{p< zqlFh40FOo2C|Rd2O)|fOh+73c^04%WgxSNpsEA;BdiEK!z^wCvWkq02-EL&_?fD(H zp+9p>QbUEB&+YnmfwPA=&4zRXhsw0~Io3Ps$!GH04tI#63{(a@ zmX?;*wlx*E)H5Hd0<9y#WDKV0a42(;F@?=w_5LffJ~~)Zm)T`lVY{NW!R+A5Q|x5b zCLXB3IOsJ9xxQ>7XsZejK=Bd;-f;>XYBBCB$^=Dh%gc$1EYJy>i9QWMFfeFQMFUoY zi@^T#VclrX%N{(-y`#wwy*HYer+3~pUR$q6-{Ub*!~R6n)|KE(f5@wWt;k<*#nayZ zy;(wdxRKb_avCxTOzGZ$9p?>;0hd0SGLiz)!}Y>_Qa!gD3f^W+rNkfC2eTcH6fA6#1>~64U@T z44ifRaRQeFt@V`PS#WhS`!;VTzVXO3v~%Q2>!2v=hWZW!CxHATg5n^I(nWV~Q?!Pk{31^*t96`~kW3`7)XlydN+G;&~-HD&NBO;g? z7Ybq_540eB*84#*lAG@obN3#RiWI~|PSSK1(gUq73gt1JSlsuj-k=-38WV9#t8-)O z*RwDIp?bP`9zN2Y%o_tgg*lK$m6``ot4?lVXdEl%YWWc{B=h9uAsOR!A)$JHyn7+R zcVR#r$pf&NRLE8$O+YK`e{8k}uvuB1m`~--*qNHsv+?ZrU8GSwXX4Qx3FE6j!~{b{aq)S)MD%V%0r zs7u{pxtP2;>Je7ZhB8G+zbqH@0HQDzlQ>_l(s4*9uc$B$6I+8r<(mj~r73Gci_ahH zY0SKS3pBI1ESMf*Ho3OX2-;|r)H`0Ok_wbB+ae5zmzoN$F+wBu>9lReb6Vj&sClju zaUMDiIP}3~;Njb1e78cEaCg{^P@7a}mHs*XyNMSOgUIx+7Z{j?l>ty{zr-hN*y8D- z24*5Qx8pW`CNLVW3`Pyg*Z9p~lvcSANE(1ap@mq%Y7ajY4X$vHXeXzH(Sruw^|w{! z&1ffUb1mAmadJ0#(t|#De&?W`n)p(kHqCOxmikbQt{n-RaLqiW4(yUK!bL>6%E`s; zPV8Hvg&`f%2!Z}47|!l5J?MmylzPJITSgR%_&FjMgjH0guKD9Ov&ES}Nk;Al<=6|w zaivVUD<*(3}NqMM6Pd4ZaViLTa*N9FkwdAEp>a&cBf#EbCc*e>t(+m1L z*(W&L&Z;5#kF%FEthToS^W}=ygZ2RF-G@;?KNUtekK*8C1tgg5`_7{5IIsUYS4I{C&H^d-UeZV=Ob^TS+^*^6U#D5jR!htg{7 z@|Lf8g_ENVS=xl8${cB3rcZT^W)qte|8o9ew}D*aYzwK=4BM5-6OkwNLK9l>HFPtf zO@zfg$ga^MLcCUDP{akk%Fm?3L+j%1ycGxa*L@p!4VSj2m)e7q74vbxq$ll%biDn~ z6~QxggQMA!bCP6LzvbJtFY95YgO4olj_h}t!8lRLkIQVMm0UvaU+;zZuzdA5UALaT zjzPE}4QyIR|zJv!zs$bHFJ2y3eKd$CfMC-fyMm z=s!JQE?#5WUTqD~m9!>-rfMm^e@_K{QpV@%913^t-r9KD!Ywf!uCYEj^`O-~s4N_) zeGadg?_8bz9;1PuxqYi#KG4S!|?XLU6!euCA|#2i+kJ(yVp{( z9T8Zd^XEq9UL>5n&uoMDihCp0pVF}1m)T6-!zAO_q$m7U9>qWraztS9ZfX7@P1bSm z9GXs1KD%%K3xd=j_4iOB2}GXP*rlqm2pb5n`g_tT~->E%)#qhj=B618gtBmfV@(!k+jux&;gxCyLBccTh<}%T_y0*#|lOVO_W5*a>MVioiyEjp~PPoA2nU&Ib(&J8^A2Xj`x14`n=LGW%Qb_dZsvFHKL&^=zNn1<+#amuk9$=>M3AFwMg z>!FwsQYh8tRt(J~Sw{7$4micVuO&_mYS(_P%2N)oZFHWrZ{req6@J^JFM8wAR&WGV z)a3ke!hy@uuQBHI*9*8ro;c~coKk*e08nqp$71%vLw5JzYgtJ4*9)5CC!z;EkR6yv zoZ#+mzgZhuZA6RIZ+e&AvrqP0vrqBja_ySxbHPhtM?&>Ja&c9ck*M7Z|83t|S z8$Ib9W(V{b#q`R=2&`FVBNf4ijd?WE)6ZC8RBoceUWRAN4DY}F={>9cC=fNA9}MS! ztpXFIWYMp`liIXH)3!N)(IZ&*ED?{Fj<+&kGKy}V_6Wl~SYqwzh-w^F*%wD6ned^> z|GKr%!lc4t@FlmxJo-GFs|6t=P_p2L+i&}lMc|}^Ohw@OvGw~_QqKL2{>zKroa(@5 zcrtLs4fk}uz7y@VSduk+X*;7l2%z8o+}qd)78jh`W`2JMes+&uOo zOts|kcPqs@3*E-m0fmC5yB?eEAz}$7XPTq%AI(qnZ|z>{ff2WZI_nKcZ?$@~_04+d z17}YmD5XJ*15KJ6ci8s*X4_&ab+#<^&z2x(F)#iuuD8s;xTQN>axdS8}15W2W=%bi+(?Eg|#Vgr2g8dQ8)iTmNG)s9jMx?s&|Iknn( zR?qyD?Ce;pB`{5ji!ysi)0=!qgMT+BKUc$uCc*A)i4_Ew_mQ=OZEqIVJBoE@KXL#F4#orHe(NpvI`i;n=da$El%tLZ(2rnO z>0yq3O804^g{Q?;} zB!RXmFfPvNCg7sd_17D$u|yVJgCo6%K&tVudU>2)GO?FP%TFKAdArroC;P>i4^PUB z<9L)d3VWAmyP_W!qBkv>d-wNuUv0U*E27;#jJqJ(Wyb7T1nt5m=%@^KvluBgFUYE=E0Btsm~eiV-C)jH9JF0RZdVq4NVv2wU{-sK#J zW+dLtjM=>W0Odk|^JDs)dcq{t@!Y=BP96*Rh72XCQq?!z&wl%1Ar?2pKFhO=dF{98 zBz9XMyu4%=T%m0W)_cHkq&h6@ViK=5TM485RO|XclH&S2V(??_0SpCm**B5MR()k{e?F=)-+a|-0u18 z#Zzdf%MB)t7W?6O5vrL@rZ>)}csx$dwW^!^3H(UvJf*9q8b2kBi<$l9gx;rnT|Kqu z=c?|&SxP>~Hl4@9@<7c`VssOm7bLIn!7Tc4N*qJ5qEld}e8Sa2&Os9xZFr*frYnk0 z>P0)W$yrfRZn=>uy9cdfnEhvmv>L(MO2J!S#e=E^ZFFiw2{DAvWJ{%}bHsek!_N## zq9(i4q*oPRrIy6gb!{@l_4$#<9yKphR;r{7BBhH*ZNj9i3o?Uv>yduv4?MEYKB+ht zmyz&zYbO0HddXOuZC1J-V!q)#jY%u0YgPHaOteaC^x7x{Dc8(xHE#R(IT*^}gz-Sf zxeEE!{lx8CtVJTAWmITw1j{$H9+UUtU(z&%C+Cq&{naWC0xgT)uO zu)_{g9OQsQk8M@#`G%0Oz)lp z&oo+)7F;;~5VdH&(T}bEop>2yJN`8EwfT}HBi6a9N1gJPS>-`!M+l;ljrevUzxLBw zEBaT#Wcs@*dXSn|l_oa91v-*vaa(8PZTypewUxRH4#H>jhR(i6aLg@J z4wD|`3lDd@Oqoqs9Gkw;gbp1uN?Gfp=Vne&^&Q?t;Y`Y?ZgHLlF5zi`xy9Qnr{+(L z)sR>+kBORcb+4*!YY}W5vJ|iYB%imPX#){Yi)4=9$T+8jY|^ng$!iT3`yg@E%fG5< zPWNtn)*jz-2@hl2eld5<-Yd5nu#xbgn+d2>;U0(kCO8e&Nsw~RoVCYfRX=8`c}&C> zsgG(GdQ85_xolLp>)^qvkp&5S82F_1SdH8(S|U zUC_BGb(hZTBYM(I^5nD0TRs!N#dE;Q8)LXUaxE;QOC7!(ni4bw9X{?lOE^@?X{koi zPmC5z#aGLxK$4%QQn;-#Pvj)MN!URKG1}fXJa2G|s`k}sso7a1d>)2^fhVORK{yTP zzeMl>ssPRqz)JhxOWx%DDTU7b9m`K8sxN%N$VGlX9svipq=x)H4teve-N+a|5fn$5 zYlEClk8&*q*z=^`=|rN4 zH~xDRuZSp>YqWD7pR@+Z>#f<9iBMy$SMHr{8o$}Urx}km=owTVe|AEt)^DBWU zfvaDK=kK*eoxLl<_#s^OM#mePYV5KJ{eEk%Nc7~9sRALf5X$GKAMIQ)dC&7$XEM?3 zT~BgWI&R>=vU?B@SCtjYF}z{+z5Dc+uRAV+W5vM}z#KUOMbyUH48aOjQ6)D8-8I7b z*9o1eRmt9|&~S-u$YzEfzL3`})&$$(&%mnWd7TKi!EMT*9z1m(N)@Ft7Io-q*rP*0 zJ&c`gGW#3V+F5J%g+|NwtvNbX_9Uc&J^NkTh;tDmTQ6cY4Y+R{jpQUm*-i!b*%irb zI*=3EcwtGR#|;+fGHLAslnw<0lepW9=TDn+Oic)G$SgFqR`0e&NkhwTQqr*-afLWe zBFNACP!@|R8*wgA{euU34+OCY&OBok96!z}hA%G_sHV$_RK?{sQMR$+tbu0t)FWLo zT_&6~j-ouS-I)eIWNR`njn7`c{#4hs7eq14l<`UIU`L^wB<3r7maBwF_zhW5#0LBZ&)PshTQsvU>(}>QrsC?0W0mL#n_jYlr0UZ+D$oIMjnl_0dKy%YLBvte7^Jf-X#Kbc5}laYEO&uH1ysH2nvvAE=FYxIRM)Q(NW-x1Fy)g-|J{d2!PcQ1SBBVONN31-GYw2W&o`TlQS;Uq76<5W5X|#J>Q3 zL6#ynu{n{?*f*jwX_?|_wYM;Yw3{qUt<i$@!2&1NU+IV>60HRzbL}Bw_H<ZTb^tXB25~unb2ZbpK3$fjwremAxT8@LOrX+)hO(aT-^WuF(@Y zrFK0u8bztZ7q{k!Z*=o|9rYFqV`IhiF^n4HGRjl zI>w^$+4_A1W+2aT{waKs@1xxV@hn9wt00?)?;)p;g(c!oQh^5sHR%$!?iS+9IuQ?`IV>|r; zr(mo;CDl|?+QfR&2$Kw2H;AY&dBFSi{EJ(9H#O57X62*{7h;oUS2Ml}q>ZjjN)?)Z z(5=kBm|s8PRIG8)sSJejW0RN_yIe){tN+!2Cte)fle8T3`eieOssMK&1- z?)0Mz<(RXJ?OfgAlQc%=!;RJkE0(VVE1$*|fWp~r4an-r8$ypYSjqYRDqGLqU#0?M zkTHa*qPeIiEYw2Vp+{`9aFHUImXX@dGSOCaGix}RB4@wdgZy#Sr*b4Yp@#aDgvN!) z7O}2eQY=Mf;9C2AtmvDe+{Mr8t4^M)+nW8Qhf|=lLMix%na`)QZB{t0ktZ8PSK;j~ zLnKLRjUTAy;fH~-=+0@fj9fpjY8HwnQXwkuqU#xj)u`u}pW@l1P+yAF^a>amX=tGf z$?Q#HX9!7hDNN^~gTy69!%vt6zqsWm-*v0IG-!awkx0dxS4`37WJm8ictqC((;r|k zRN3j4b2|P%w%#eqvZhcI~5ohmQV` z$fmq1aSGzaMN1RahE)Lj+A(w9UXM70BHQ159@h8r7NhIDdkEwJ4HnPn+&q8A$hJF^ z#ToWk(^cHA1(J-n^ZtD3Y29D{fj6lgb#h{Uk@XHb^YQl;xIxgEbo`OI!_uBWOH#Xw z+WXR^uFh;mo!DbE^&vPPlH-!)Kv`rPVSpj)`&p<<(^;X#;ukR05_{vc?RC%ij?DUV z0+RgIAR86DNqQ4(@Y84VacCiyM*m-H%~Y+Wlj^L#^u~e{1|QgFMAOn1Ul>!m{XUkK zX`^u_hS#`aRY@oSa5erFi4dsoc7COkYbQ^XwwsB^L?wlhEH+HP%4}q6k0+IAK%kM-!(Xv zuSknT5*;RF;>?psCk11A@aGGMr8^f9!D%;J9q0_r)$W8`YU7^uW<#+1SL$OUu{Y0y zX}L)3=_Uf7HxzFkdu@(5u#~V<=6WwxT)D_DR;rmJ`~48o$<2);_mfnPzMpehDNct? zUcS}$Qx&1L8D59zqrwV`h--LkaaBXB`*q-DkC3J{E3(|L$f$5}Zw}f4AF!FmnA#6vl46zH0scu7T)-7;FwBbG#4M_x}&XgNa*&gTUNB=6U? zf&*W3MLLzY7F7}--Zuyxoms<>Vn+UkhpoJx5Q-0njd+coZb ztf>1dCXh%Yv{L?+OZ=|?PUe{Sq|vO_V(u*zu8`@vyi2icl#xS579J^*iMSB`5W;hY z1L=5B-JIB{6npxfj;P6#-Jbrdh-7EG%=qv57XhkGq`*Tt4!Y=4I%SJeSn4ryTYARL zXDB^wtrs^e-GEKT_btEo<$Fj>wDbT7wADXe|3U4la} z1QH`Z;zgu~e<#*+$CSQ)Srg|yRite>fN~^p`w>hL&ARvEZ!p^Xq^>?vb!sZj*P}er zO)z}e$p6wVcCv^>OHksT7aYaI7@$-seW79hICq*UhZaIyk1r@8*d2iaM-!o>UBU)^)aIMYZ1lT6P|$e2ajHYlSi*S@UTsxgD6p{jcXEFw3U4X*btoU z%12f$!l!R01HEWC=j zZ-17lS^+Q=8gCQCnXsWQCq-lG^}*5sG(GH8PvX+lE2a5~N+>(pz0B9d4jU8>D@5&g zrlp^TX7@e_M`ZSF9V9H~JB7?%{cs-6`kgx6LfZ=o<^wMsm%^syWJuj$7wlV@gkd4# z@I}sQFsQYjZ|+TQBu1B|K))~RuH5?JTxu{Xf-))EHq4_^GQUlg-OV1O*PRMzz*ziB zWwLMP;qPa{0upb81*4w^v$dBB4;86GvNgoeQ7MFwTdel=qyBFOGg}rbT?uXyU9cxi zwY08Bo;kNjN z7^aNYa4nL~VWgmIJ2!^3_K(S^WbdOf>- zv!fT9a}@U5O22x_h;^>9j<+vR&DBmYqd#npB792kJLs&-g`xZReiHO15hbrZA6?|YJ%XeN-d{rS`sG+fQ2 zDYPu$(D|#pV>&`-Py745gqUFJ^y5g+iny`@U-qWdP6gPouc=Un%t|5YNsGHLj@D@H zJ;Hb(V+JoPGh_9{pY+Z5a4;tDX{G6SeXabLtWih4-r~C5t;Ph_+`Azc9!j$X&`p(- z*WZR8yb&*5aQn~mVi7-QREjj$`TG#XQqQb_N>0n6KJVvaf5Breqt%3F72YLq3mEK8 zOr53seeHeaZ%DS`hnWB8pOSNJ$!+&V2^KwSQ2Ya$TR6P_K_mvF%@8?Iz{tilCV;b zJkh#Xni|E{$>o5u3?BO37HZg)YNqK^+dweNVz83tZXOE|Ff;@EXa?-<7tPS$Se0nC zg|DAc_o41Ir-g*Us8eoNI=-}o=h}Hi;thd?Bq6vTfqb%g{q%51@7up4&;9%EG;PbH z{!&=b8|dlK1ol{vkk4ykK1DTkvRowujOeir*s$KBP42JMj2zhSxAhmDW-i=58(Yl6 znzN#29(NB^39-_?rcg-}w#N)Fz4Evv2dIBoDQ3anXYn|5tECAyqKD|kM2UeX=g&(y z(tGnOwd!a`z-{41#7g8V_ME#}_Lk zDmLL;F#C?KTj1MY7M&b}o2UgLa>prfr5jk=pOhu0v-UkRTBQ-)Z;Shcc%X8h@J7nVBhbJ4CQuU$GX`4DgN|V0EwOl?VW=1LIWxw_gZ$UqeKuU$Tiz+9| zNo~o#D(0&f)Vd=SA(?iY8VRiL12$pRDBHewti+(vh-AlP;}4jfOwKI;xs{z;BWgcF+X1mYsyYqWg2E*3oR@nR17-jalCLiUINC7abAK<3hX8Yo;6xLJRpu8T) zTsT(Hn;s?6{NTV|zu}usWSxFZqmp(Y)ZAHE1S=*HPGMe6q>ZtSd3oq+%p{?!pP4v~ z%nYpi5i}r|*>l8>t=kqyC7mX5pNiGP{3dqBXi5@mrtZ@fa+9`FJVtTVnZ@M=lT1*jrH1QUD`xs8$sh?H>dVZ>J6`_AybAm12Zj14j|uMp9hoa2HMu&VlV~-u7OT+vyKU zOy^IS!=%TRx!RA%0Qcjs-tHM&Wk%2Zp>=&Ra(Oat>qi%dP~r`gwS&> zxzCijZwJEh`s>xWHp7<1*ZH6VOYYXl|F6xcRs zEe-#6`L>6lZ1$W6?2M^RsV6H7%gDqO9~b9WTT7ps)0C+$CA%}PEbl2lu!m^6c-4!e z;Vq<<)=U;%$Y5>(C9oHbsb})XI4WM2JSOy`xzOOSD8RgoHzAO-O?zCR98BxorN@K> z$&t_u3yEYV)H~@M_)nsW2y#<&3QAH_UDJ^xI^E&|=_i=~Y2XFllR1TRQ!t8U1(*Wf z0;`$3qTX)QI_6i2MK(u^8lPECDRU*?jjOOTW+A0hKOId^Z(DEzV|1b&DA`0OE`J-f z1TX9|0|Ns%1cZNTD%!?I<#{I_rmqXA(vltoc_#M^qVQ64>>obL>x3%%!10pg)bmwr zE$IomRGk5IjR#5L#!q+|-i-h}Fx5$!L*bmZ@IxjtyQ9M*hQQ}n6Qp#m%AkKrq%Mnl30uOaypo+t#EPk(+?p&r4zrpLKVvQ-Y3#iS;YZbQFDV5p zee3n-#A>c}g1_I%P-dF1V^Qms9xs)&cB@Dj(ptZuL6waXdqT0V4ta_RB|7Iqyk7Gn ztbVa6-AyO$=e(p^kj6~oMDs!FHIT$=&ATS$40SNl&MGp997PhP$I>J(ny%Y$@scW} zUs-NADuYdMuD3VO@fE7Vh>6t)eHc47Hg?e$@9&olahXO^_sBVbrxsp}Qo7`t#lr=F z8Vm(y*GqkV@U9C_A1PpG0qot!4Zt8hV|j|$WfT%OA^+%q453H0q@W;aS8l3Z@z6Fo zD9ei7N_uB;FqRyjOZSIn4J%}qSzpMCV-Itcl@@+vmw)}+p&WmxsLlh+VlA>Ya-_qb z^8&iwIMPGye-!lvU-loMRxtU_V`NR{juHWDibkG$^7p1UyEOIij(?p9uU_1dN{vd7 zS101k>kx?9oA!lsPt7+#k=ePFXSp-l?SWQg^7u~`UCGKf6@WS1pQv%q%?E-P{1mqDi%(yVBkw#OUU+;vN z-Q3ez+V8sjn60N0ZT3K*>-q~#U|7ET*-w?D27f~x``oP;MIbT&88wNv=EmKfofzOy z?@LqsXHT6T9$qprU@oQr704gR&kvL(vx)r2BfJW^6S%qHY^RZUenoRxEk8fLJUs&V zpEaO?Q$1k+ULm30F7n^ahSLgAvhrd}f*qp)N_YxLj=+_45o~hzZhD)XVRE6+gIO~6 zomnGlb4!5;2rpMR(IXuj1x|p+^aGp_|KCRd1_JUI4B_`rTul7x6WcvR;B+HEMAn0U zTKl{BplY$%cQ#jL(eX&Y?zZq7$X*HXFE>AM?psMDojr}UauYgOZ8NGpzg8lsSNr85 zt`Be?hGaTYz>4jzjk*{or4LA8zy<#I^d%%*)YD7qRq<8Z|fcZq0-~_r5oT1+5-@^ANZqdU1L=>pMA-ox+ zl1WoDL`|w9>zEAdn;Q_T`;%H9D8Su3trdgkqDMz>c?4{6So9}QKE`% z&PZD|+L3AY*TCaM)wVD+yR#DoY@UW6Dp|Mhd%r#U_dnKV>I`plHsE?2N!}_KM(iF= zD4@$8;#`YFmE8xbNC&$1X0QT|r~%vM=&k@NIbeVPd=u`arj>SbNhuQu zTeKLLF5ZFsg;4qiYYwlMdyXx?I;@g72yMO(7Xnw;pi3oBMGiiultdElZUfl0iNh%T zV?VtQul~wk!j~Ti-V}JcXc4(Di=fBSuK*nY>i^s6u|FC>@!K@w<2~inL!|0Ipg&2x zRy$}sYF*wgTRC_k zWn+$5rkf)L zrUl$TH@RoCr6@p*=JYV&yP4m2AyuW0DI!Pw8+ zy`)d>X2+W8l~xC$qgdacVz%EQDz>~Zo8dzzFKf&P!j1j4&sg}**UHqHOo(8A4PFBG zME;3b|Md;PgR=+!@b<#iZUOsdSMSln11`qy4^hF(2UI^`M`J}4v_>w3((c^srn6Hc zJsgW+J8cxF49+rg`RHKX_qlJFo^e;qvFYrsfW79c=quBt6|SDjv2 zEkpRK1!;q3vx})?-gNP+*ieXe$YR0bPEIlqPInvRfLZYVf64z6OQ^8N&>l3ff2Q|$ zvSLXJE>cYe$$YT={h6MK3PkjxDvm>Wn7W753U%{v=B9U|fA8FNzsL8`pMalcp0x-j zLUq{Pi~>2;`2NZ)Fe`wx&YiI1jVtt0?+P^e%o!33Er(TJ;-x#O^V;;FJohMj7T$kF zL_IB3D=?rdVZReT{uvnebPTuhxi4n!LI$7utp)=q>~P1Xx|(Xu9Hl5dbc{V%*|y(} zE9HipGhDT_zF|0Atz4F8h722ec%7g>dW{4psyDd!KYIc22w9V195Eqsvu7={uhK&D z*dv1@I|1J<&j+ozpSQd_M18a4Yd8sCz6a_(pRcFTm9BQ{bN751e`0vCSVN-f0>}|4 z5AD=DtXYz?w`rB|dLhMbIjp*i4Ur}~^yu$f4xe=w2&9gqO+?1CXOt|1(C4gJrgb#K z-R1`MkCI}+;h<_kJzfXiBEIOMM2UOLvM}2)0w0!3Dq%eJABKnQjNS}%mUqb$AK^!I zF@qhpogrfru|`AB+lGb%`cM&jivRBz@t+W`kLABI71`QfwBJah&fo}XO1Ba-^h+@R z?gMeXAPod$N6vvfQHD>$7kX}PE{%##uf;_#U+rs=Bus+=sv&hm;*Q>%Ijc(~VIg_` z;mr!F)YV-zmV06wXQHEx(OG_^E^MoxHwH+C_Z3o$j%MIK{s52us*`uLFY+>aFffxgD)Ti4H+2yHQ)Xp{F#bg|@O%zeBCnIm)9kj^??E zaZ};qLBr-d?`aqJyExdJU(vkYAK{Z&%Z08iY_JZt5~tC5)YgX*LRwM5k(q%{F2}dw z*BV(UcgQNgAAyg$wPC-j^rYxM98b17iBT?K5s``rWAGkPo0*PO0LpIJN=B?8OuviqswYBSfGbg$3khFI3t*4JQeZ%#(YmM4aq`Fw5Y5ptV=hOJ2PSV4ys zrZL8b6v17awEi;fLz&POw5E$dsw&Q0n~)Z;mU_B6@9*=qWS2S-p$#-}WMtqw9gBco zQFQ6Gg*qrD>{U*vL$to|e^aNSC#R8&XWAYB-f3v(kEi z{W%lxv`Es*SzdmMw5R>=CycBKoK`^0!GW>GD{{hA4!U52H{h}{GquVIt&#M*N z809oLGD3upzvE9SmsWo;98o;lZepTMZbc&)K^XGuU5>{qZeOw9l`o&0!s?U%?{l39 zzC?;1QG1i<0KI08po95<*}72SeE&=;)Kuq12;mY98}+s2A<4;-@n%E&MmQJIZ<=VJ zzdREiPhsPOiIkhuob3|{|OtGC*)q0Sh5@6+$R3#F}$%ax-t ztD4Fz#Vy_*iVTl9$W?OB5ZYS3{D2Yr8eCvGXF*@AAU2vYV1&OL^H%0)Q1s-G3`|AM z5^P(nsB^f)v|4HU*|5r2^`^m(N=*}p0(m61{vbWikvvM=#f}1w%ny9$?hY%Y9C*~V zy+dl_z4o+g8e+@0Egi7N18*`Rp@+8qj2E*@RP=50_&d*Lq1{x|FwJ3DDBAc|MlEvii+M5JM9F@e+1PBsG zW^JB-6TYKS5aVeL;T+2*v!#uCi$`vrr`$|D`|<=1E%5fHJ#Xz!ygM$Cn{g7aW)K-$ z+CRBb1O4s_Sfy%K;*p(Gq#0Y}*9OwaJAi;aVj(@HStmK|*Z9CXY^{ByJz9;!g5P=1TWS8BLs=rjO}%3_A!N@d$`AbHmx#SQpX zw;xUF!76o8E`XsqbLw-d)XB&W8yE^RK-DyrI-vY}EgW|{fXLCa;Bt)Ce8)Een^lLI zNaJr0b?jh;pm<&N>@nA$eVk|Y>O%%G^Qp7+HoB-r8!vVcnf~y z+dYv}t{pPR?kBysvXC+EXZX9~7~okruN^10_)96o;sJt@cFy7|wXZ$FzX=;8Cy?}O z9Saet(fs$Imaem#vq}*q#QojKXQv-OCWu?^PvOWhw*&mnp z*BPaxQdX{GN&aKIzl=in9_@|vCpNc>@xbtztLb#%IK)hdW-5_MyEn3Yx~}Y}^MwkH-|~=0V{|Baz^nKiX8NDBp6uXM)9kd$2KL;XMT1^HHR@qGOBf7!vToBnMEV4p4FCI#LZT z?Wy#L#|$p|hLDPxjmMk4tjR^Y#*iu62+H<7)3z#bd+O}R2(_)eFJrvIW&rDi#@c$@Lcj!W56b}@r3fH4QJ4;8=cT;{)|CGkCW#Ed*yRB`AyGlbtW zS08k;^0fr*N&g#DxP^h|6XMFe_6RFl2Q%w$DvR$2g)6=_$K+?r1?xySj+cab#21pK#T5MB^oV4HX>hhs|&Hr#153%83F!`|c^5qK2;| zV2dE=BRq=Je!j>F8@xkOD=l=WYDHmeE5 z_HR-WQ1vthaRlZ=T2qKNNYFmv?Pk7h?6Bb4P{Xrl~HtdNsX8 zI31f0O&ii^pc%O6cMC{ic**;&N!kc9=|Pk$aI!N$3uT4K8)l79)ZC+U*j5+(Lg}>V z>oZ@e*%XSh&TwT?)_~~s@bdX|{M&c|&B^}dzbwCLGXi6u-s!;je^9SnP<(OMe+co7wLrJY)Ab_skFz{&ioG{|2dYCi+M}qieDS;bAQ5^$RPhb8ZF4 z$!6ZfS;yR{FMJ&;sHguSL?gfa)6&p`f`WP{CZKE%iWW58)IVMavH6^&H=?L=nTOi& zwDKVxlDcJ0=axJFW>F_OKZ|HtLnKj(SQ6+!qrE*%wvcdy zi0;dq7-D_N%-OvI?|FVjCak{?Fx?|o$2;)y!Q=@YSqse3JG5^Z(5I(SMHV{rJyPo; z#!sjoZo!)YNLLKM&z-q7W@3E0xrG?7bG~=$q|E7cWDbw}a&UcZkwQgCA(2L(SABXV z7G?S*MCI7zGpCunu~$fbd^KQYM3B)29!}kDKaggGEu)%U39PEcnp@n|Pj&hu8lCpH ziFY6#W7p~ec$IN8TiwDUl^D3PEJzMO-p36I{4cn*&#fuunTKPKkv#i5;mfyL&n-?d z5FqQ~<}6amR62@`bL4ub%PrgQcUFj^R83`twi}pS7qgRe4Me6~oE_+4Y!Nqj)|f3RvA0BOZis2{*N{3W zT~L!rj?l)jcNJh7{180aYCL0V8;G4o{oXBEKyrVZsVks2z+l=y_c2t<4qb;1Xy@<6 z0LE>M^3oeeEbe_e&>@LV6idG1luNHPQ6<-XO6CAGX)VG2`Cb@9Vx|tj%QM=3T)VHl zU_H;`aTSai%&wfSRgt%N_W!mW1bCQ@ZDI1?T^#e+r+IlX@#!opVx$(3f5;-gzbO9e z1FaR8GwyjIPo3wx2lIlbAsI*O7Dgv*2hk{=N;W=l3cU&m*-q>XTq0d*F>BYO7SM1K zsmQO${_GE772=A7Wgts^%Qccp@h`X$i&q)tCF`pZVVT@*)?yv}3B7jiGbNFfoTlHDf~V!E7=7aWEU2BCd} zFt-Y%ze9`s&9JNXWOj}#>Ne>HZXW1_7FC_QHHG}qobvDG2BXqLn|eLM7qRc~%+?eU z%M??m=5HS{<8-0~-Ot)D-fU1?t}QzsWv}u*>@Wu2RQUG~G;TaP5H^1rS~+)_B^lel zbNtRuF>mewbzL)iM=hBO#=Yk^6hfM>(m0II2}%QWYFHI$%mxS%Ea1riJ6seCDbn3> z({fyT;hpktZ|I)!1H06-bZ-|vC##$teEN@|`N5y!gqnaMqSY2y5G!`1#Zgh7_AiIY zhqswIah^cpsnqRdb^$q^sf?)dU^stXErI@KcSmi$epPn{JoEJmEDU8jmw$bV@&?ks z+zAB5KS=4F-e==@<5cT@F#F}A39dE=yI%F(6VpZb_z}U``yQJb|8S%}|6pZ$EG{`2 zq?rg7>dJT#{!|58=aVuHsF>Yrv_--%6BEaaaJG*wi*Af!??_f_7EQ>c261u(M=ed8 zz+~`X9jw>94Y3i8c16~vEZl)lF348c9{&*0X|5%YQWe+V$drgUDeEp7CuAJ2dlZFK zV@_eTvpPV`O(*E%t?B@5a0V_%_jefa0liA0TT+14iziC@oHA@r>CW?03;9A2vOIEt*;J6P zvtnADkkC`7=i%^8K8HxxCGh%dDM$IlaiBNh?pM zA_E**63J`_(E=C<1o7wX8``KTN;2ZV{Qw8*FG(lU&+t~Sb{|-;-kk?m)uj=2v*cRm zus++_k$OtEo4HFhHh%CuI}ZY8zq-0QN(@#rX$iVcFp~H+&;>-_uFj(v=0_#1`8pqz zJ6#IGGNP&3Jg~P?&1vPDo%z<0=H^HTYpUJX@muraN^rE@al-VB@N+u|?sN*KRCWKN z7WeS74~nHQ{Y~mmIE5eq>cz?U??QjSo6wI*Y4%-VfV2>vyLm8I&Y6?YeIYh6yIjWgS(=aZ{9jr|4l{62@mS)LVL|7=$9EJ6 zdb3^tcDEyN)Zq>h~C2!?FmekMgXc0=RB1PUx~o)2y9uxew5 z!Vr^c5LyX^q!WlG^t+NM^&$$1Bv60@L5KkJjQ~X)d&WKI!=+yw?eFsmSdgx+Q!Min z>My9%PA6e2$z;2tuB4I$pEAaFLr|}-9Eenx>AMnAuH$d^7xJB?l+^Fx z-)h)v{O!k=wo%Ku+`TBIQSE1goU^jig#U{rlRtoiOC<_!g8={dwFaUJV-CYZgn%~7Onh~rszuA-&RnkkCw`Nv=_dj;tl1fL>8I3PiV>LE;*T7K zbTndzwP3t*w&l?E+2;gpF#@K<}9-L zFG=t9#?PyML6yZ*_k$GPPkbDK_jZB-z*+RVJ@|r|g{8=d{-8ahvDgt0<>5Pl>32qj zh@;cf@bV$d1zHY&W37Tc$qmK%+|{IxUe5(fNzy!qjhkNte1h?Z>*9K2?r5zAwwkE&~Q! zGzXw#8N|q*shpTueunq-?0m~HPd-%ivdaA^_ z%+c`!vsABia^w{ow)A#tV|NKD<%ff@BGjoBJ;*XhojVC-;?f$U(a`XEscDN%nNI0- znC+$WTKrRXT{y20uRLJE%=oMMX%1@N9uJtY=TU)Ta?_D0TUMdvZoCm%+>hrOT2mZNK77Z7lL;P=gb_7 zzD)5RRWKhy9r<@zh~jVWtjsd&eH~F~51zJrPi9QE*$X1B9oyFj#UqRg!k$ zyTtfS5Ccp{!R3~!_$ukM3^8{1p(N6=+gtV0*Z~u7%+4`02uJYDq{Q&)Zj>9KZHZF! zQr2!`qAWtHM6<=>TFyu6YU5J;^!d&4aX(5P9Kd$x4vcCP80)mp07SQxdeUmm{}AO6 zhW$y{dDawo5FC`!bfF$a#l<~JY6^+i&nqS#Yo<`-tQM|+q(VIN3C@-_ldL=zF!0;I zo>&T*#~Q{8RoQhi<@q4oEZll-ip6b=gyPuId57AK78m3iGFl-i9adqKw*w`WZ@qtp zPVVdHq1i)dh|4zxrfiFOD$ZsVqWt^0_`klm8l6QeHfe=qKL4dMk&l9xk;-P7r!ksD zNI6fAjR^qkt^RSwMMXWDZ-~{}i;9A-^=+0RS?}`)Y3|NRcViOB`Q)pN>vTs_jKv0C zuaCdx=Wj)A-x2KwH<#gNx;53KUIi8f2DCpQ%KWFGgy1+|*RIfYMAJ?2m1%zfuDcr{tv^UR^nYCk{3y4C**NeJ_E1A z&6sq(tgoak?J%!jnQex3{Ee@+rQEfEg@8XYxkcEn@lC#cQR8Emi%Ucu*B)2=u>XJo zHgROE1z6)koRZ0^iypSoemWvUoKm)iI%1$(9FskE#0+$dTz$g-^&BBN6Ma= z%_wSnKT)DFE@&qZQBbMH_QJ;$Z`PW0u?etl4bD3iK>-0O0jCFXu9}4R3MXB;c0sC{ zz02fhWBC);KbY;tsFb2jwoOU`u*PKrSmUy_5@dU2epGbC_~f7{ zFeebod|(Fr_z}ng>b%hW1!!3+P}a1r5-~1hO02=W-V+F3h23vG*dLVg+<*ki3BbhdcImy=ErQbK^__AeZ@>oz13h(QUs zzLacQ4J^VPVXvLR3wW@EuGJt8pkW36bCX=#13}Q2+^U4d{Jk2$xOh^DRy2sV76{mr zl^iGB3LG<4Tx28P8a;e8_B^2q>wZe(){?^ zkKj2VfN`OKk$n}T%(nA!JdtyixE8Z_4Dt-9M4;$2rvZy57SzlrM^eseed}~{W)aU1 zvricbqxpC0`0-CA37HA{X5k~HC5!I&=G*G*-niJizu6HLRlv!SLO@xBq7|ld4pOnR zw;7oo*7nNfazkA$^o+lFe^K}k$p5ha}ZwCV9k`-UP4)nYPil};sWKCk98UOv|<4#aEG$KyEI-*ep4lZdqz zXbF3D0_mUmmG3BHJhtQrrg@-}!-u=bWzuS5yr801d$y5&H$Ms;$y`m&7NT2ZZ9x3= zefnhm4(O1RXax!CUl8R$x9R7w`f7?D)xeL-1t%X*{2&i3;2w+Z6v_F|bc+OdJ~m(W zKDBnoj#(3xCpss(J@5F430+=d?H)?vTVMGStuE(7h=PF33!T*#J(?1=BcI}SDFzUl zjw_&L_>;bDkUs{%0o$m`OqP;w2t_RDuxv!2Hi0e>b(q~y$;Nbj=E1?1a8D(ZR>BL0 z_!!F&Fj4}8bF)e&uK2?8v%Of;KRFVe*%~)_i72McK0fkn+Xs&oErQ+tzQkt~ZVLh# z$ke}svYchHf%hF&&|pDmg4kJzT2J_E|-QgRg2qYx=!SequdHM6}Sk+ZElM84f=1Y7B3T*I$>!@@CuXE_7OFn<42{<9|YRYDo z>E1(~o_-@UiH`>{4JS(#B#BhHzP#&D7iok3fD-QZCQsblEB0{U3}-ZxC309GqbHGH z5?qxIVj}gF?liTa8j0Hd5eMIP+OALv8ZB*jNG#m76qi7XV?ZEdrSNB`u`ay34_Of@ zx9D;Cx5A>36#Clo8MW5IIKg=kk@A(g`<_FQWtGss)aA^%dC<=s~cT8st+G4G~-R|-57iRe%0jdwjz>-iX$@xmuB zKl0xV;*MUt5J~bTM!n<|#yvdH3(FQ(`N-w``lDP#!ri!k&{$`O#SC-yz%+VS4ROt= zt6W_nu2uU(BU)EvF2g`rDfA*uC(QR9YJVyD>$8-g%+uPc7i&Iw9PGy>EC?#|4h&FNZ34CFNa?D*Yh3Z`a`Cg z^4mI*C|jUjK99RjmYOgEY%lx8jLSd2hHWJb1pCo~^VWXZ**T-jb}&JK91Hr4%}tNa zN>|M&rgUR!hVQVOK*d1=tMLo*9 zqK7j6%8Yl0s5n+Bx{h{Taf9X~5aJ4wAO=+R2;(oy&KS&xCi1(U>rG-k{zMh^%o8kR zr_R0w<<$~f|Dnbic)`#>2|?SmrjuZYcSEP=?crR8!H&JWgOr`T^k+CGSbLM{UUF!eVOL0k5pD;I5Jb1zm9aEFVUIzb=qgUNKbB9srp<%GsPNgD|MT6;w| zepe0gO{D*-?7|a!S@l#M{GS>Be<~@-F>2(2GrB3KEfx zbvlM{;unsE6Jqz{lYPLh`W~WEa~lVB;s*wDNrS`5>i261nHV4-b#l*!+9orF?xAa3 zZ1a?3&BlVh5E*Ms?!2TrxfBI+k(rbEyyB^(>kWkOX$@to#=sc?p;wGS5Bc7I zB~tL<$jZRXDmQ&kzWER}Ah{Y7H=yALmTM_PL*;zCpKl2>J!ME@W99d>&{y?P2s)vL zqj{n$Pkm0%y5BUUpB~UPOVD9^Omh~p;&M)MQtTa_^8;+gEC^F;W zqt|-=Y9l!}I<+(E&mB-}_(y1R2|8MF7o73Dv`hZB8}x%P?@))!zHn2?pJBMHp{38B z6EEm|yQ~Yublaq_Z1H0~$by&+dN_>THi0WLIrN?Ezf|-pehsYVBCwosC1hG6Zl=!$ zsRCL4eB{b*CGv}^$-I5IIGyLS68PbrMXh6mS`Ws2eA}*ajh;ONI-?zGsFE~>=t*c> z8>zQ-uonXu#`S;sd$lmnl~^EnI^jWwfcrIeEXO7o5*~BlXIB!{7b}WY<@o(P|CoK4 zI(-TL(E4~AAa0~br*EA$YbBQZvi>`B;j(ygJ$HP@sZA1zKtiuaVkHriK`n)zY4klA z7@m=G3ji^aX{_TiCdJ?UX*vyjK;V=*0c={pLo zQWM%qd0KU`%%@I=G%#VENy{^UyhN(-?H;*aotuWnu!m0xxDE;gO zG(+LIKv`;A_~*qK%l${}WN$7Xb@0>T zq555pv1F)Za@~!quW+L`n&)(k!0T^BrMh%D5jQutyks$Sjo80p6m)uq+MwDKvICV| zz6M5X?jP=KFlbyxeDRKnVvvleUn zhqX6eZfSocb;3}l=PXU{o6QPaHT9YWZbRS>giZO>xQ;Bt7QeKjzORUy>G9!VP`PKA zy!we`9dWGu+`{39r>bWlm-k{~IskDGP)n!v2XO@ONZ9ujcq;cpCUpHpC5E{@zrtqplDPVP*VHp=Q^vt&a!i z+t8EH^F@NFfnoUl;LZ6I3TJq-21BCpL?E|dBL@0g#o`CKqCbT&vP{q89mD@mPt4}g zz3!B~Sc5&V^Fot#pZm8Se$F{tIAVWQ!3D4+Y*do+c~cLP5GVHV(}vF_qmDd(N{rZ0 zkC(^kIW&4>Xr|yxG*io>o_JZXFP8jm48FPLh(v0A&c|3gbEmr!}%1heS%j2cChI>0@*B*o#!8n(J{FDI0aa2(b8k zZ6Clyh^dlBM`>P{DWQeZ(2Y8$*G&)9%)swNmQT(y&K4GNc;gK5N+a($$XePQoM_y< zvF?I}N{HEi>@^z&lf-YtIHkSJ8o0ZwScWeTg{xoS_NN(=XqyN9X`-2b=fy|-nGAfL zGL=tJE&3F!CH`qjbLqr{sQWLh)iB)yq}$P9Ppokzx#ja`sVmL zpRL~}O=H_TMq}G;(loYh+iDuywrw?T8aq3-Z5wx|zjMxe?)$m-uk7q+p0#Jz%&b}S zU7B-$>$2jAMMM<(c6CWrcZin{91|^`hV~vYaD4{+>UdDd$H#$}iYr2{4TY>572B9C z=JTBY{Z-x3!*_%7e@i|Xa6(+NOwKUT3JaoWvPU$#G!)<#AH-9tr)jt=*p)}SF9+1E z*g4V^u%iVF@r{*W%h@e&nD$Z7On7Y745WSC8k$BQyP3%N#G9jqX3xNFw7*a(vZ?<` z@``SC$2@o&6+TR8JZG39Oz5PRPSaoYEmU(T7QY@@?L^2I1%HV0q7{BF%%ggg7P%i& zi?CmECJoyq0vj!xfLs9p_s}19advhW*6yv25dQOLGnuF3p z%mu9p31CX@+#n=*BtINy3TEl>2!tiGS4dSNWPXYY$TMwScc;Sr%m=at)6l;~)o<1- z9{f4}_66|-zRLZ?aEo8PspZ0=$2zjWNy@kJg!S7-w@9hsD2diL5Q3?pyqVKtkXA`e z>`cGsVB)S*9L7N2-OCh{qOB#hL}sz&@3FM$KrBG}D@ozN zorjc0h?y2mYJRQHP&~y0u^3NmPMk5~&lYSeJk21(;nT^WFZ3SLFX^AR13_-1tt>b^ zZS>&X1>D9N>QQi0%2#kKZu96r@znwwNsx}rGz<)?QO7qeCmWt+srK>~FNrsYeFCEC zw|_TEAcc7DO67asp)_UdUBD>q691C=if%^PYmyP=D;B^=G@Q>n8TYI*FhQaF?uY0_ zlAQ|5MyNN09uUASMn_2*g#W{s1XTD|Pfu@*@0v*7Y;XhP#qWC4*LUo&&w<6*V+0@_ zDzbJ>P<*O{N}S1m?lKjPAugquyTf5AMqs?(j~N!706-A7PK9f?yRL}d~5F+!R&P;!fXd){*e$mm$>Y00=I5=p|Fooi5o}16v z!-|{#&eJ+H?D^^OVv%nu-r^rX zduMW+4+LPxBtW}iP|!MYQ%ht9BYS{T*OceaQaW)8T}UhDs|Jk;>uo|vlY|KVMhC;V zpuZiD|ID3%Xx^~Ms-FIiKZDe)-y(uPE;RaFFbJQKYk%3q;$A|zBDJ6zbbyXy9#WBR zDi7Q+3+K&mee4qHSy-i}`5^RM3*3OOVjLqLDgeHMh&U457s~HL$0-sNgrReVEVa+(+g-Q;%rt~{B*+A zcZ|^ntG@EZ3j!Po4~(MT!^6YDLhvI?8Ysx}9|e){GkEwJa{)LH=JxwpMS=#4vuJmQ z%3N;{{sq?eM;SCacLB`DV5Vnt9PMu%3GfwBu!LVd*H1Ub=%gYIHM^6VkPPf=M9(J< zfyx>nCV<^p>gg{Kg&$au&@A5A=|4#7wHO~UNZg)M(n`WAhg4Od9c z+Y`LQ;_p_o^$n8W<&yJ=Ea7jM*Y914&N;cGB^Fug7wdtAIE8w*8tDC~sRBFBsu*vJ zbA(b;s~7WdW_K>->FO4&&Ntoodf`jY?d4R+l$=8RWMaXp5QU#_#Df*>w1?>+x<0b? zi3S0UITVxft3277QSb)I`&nUo23=j1ZhdOK&AJG8dYTVUA%Ui6Wq;-xO8M81=m#kT z_L|Wf2!Ok{5o%)Ba|OZ5bcUvJt5k-jXpA8A5Y%m1(*z3Ga@Z-AO2Ces-g6YQOiU7p zwCp*GEIOs6tBDYm6s&hz818$}<3rGolGvVW-nZ}9`}SiDT=ss@!1(LC@c?S<6msCkk11|Q z_qQ=D8F*o++0+%dnwlK-UkFSV8U++lDm=fRI|TYI!7kAs)Z+3A3Ni8VUn*l^bE@)x zuC(R8hr0eY2>##zF^r%8`0#)Mn?(_&hZaoo7uE0$3j86P%FAl{N$)So^L-Ru*f@MI zM3rO+D5xs}M?x>^FOh#IGuxIpd+H!MIT;$T7*kWt=|`tYM{E8b9SbslkumrN;DE`w z{L`=B$P;_}%>g0m74*7nXfr5(M-)W~9=^sr%-`qpH$3e%tNrRnRPO!eJp)K6BL9qM zCHeuI>+@aEJth+Rvy!iF-nTm0FZoyrpQU^uN`A@X{xLxhG*443`6+(mm{5|zm5L+s<@`>7>6dLsZk9j(=crYPB zWMl|J6tJ4WX;N^8SPTdVFrn-ZFwlA8V1F=jKfOP9orh5M(_&o&usg+M5)pykWd@Uj z3X6UJ1fnYTPPN11vpv~gs(%~&{PEv^9t1&6F2QnXlY|5o z#34{$cGGQYAk|B@Q`AY_yy)q6}e-A$YSKBCR z-&X2xlEBR&kTB~E59o`+zzRpVu;Z(1X0dk>p_iT=og!)Y3v!f>wM)TgUZG7(Vi;B+OAx;Jt zyYo)>o}+r6s#W1P_$K7KJNIVyWs)2t_={93&5Y#h?(?YO>Rw7&g(Zxeiwe?$yiJfC zs_#9=gFvPHcW*!WLYbSFiX|0C0m9N@$p22g>v!m4yy?TOpqTcnPVXO$XilitfV8B$L?I(0LMYR2e%W)WIa35*k<#19YZQdCPbZ4|>8jy?> z2gRaM-)2SBkX25C-6!4i1<8+fGzgtv=94cibNE}1ux>dr4?KPL>0#`pStXe-Ww{C&sBS`x49GC)i{|NIu=-;LoU{_IpajTuu z{j>Sx(shtGnr(OYBS;l138iMZ8Msf>aKy=i7}00CF1IM+weVaM=D!(Dguw(LYl_lK zZGP!ZC<^<{cC22X3UASHz9ZI>9M@d>2|JPIo1fIG79Z65JGCc+>J(&QVM>1#sWzN8l!#_|(N$DE%+%$tR7z zmwk8a5aTzw)OY^Y{_I&$!+u~O>^ovH`IsVdec*A2O;N#EBl7lZ z0wz|b>~%8sMnFR6rhH(h9=B1kB{`j_BI`bqcCIOc)g|o@jTCIbQTX8aQIhQn&K+^s zt@t2Je?B$e=K;HY!eibdcTljOAGPP{UGL-5`Rd3`e3eUc`MQF7X4bD0mi##{ck#4o zdk6c^;x6Og1Q5^0K;=9uptXo^?rvt*JP6}YK_(PFLjv(L<(JO5Nb+rHxuKX?imL}o z$4YGm0ez+`lLF7}_#%eAXR=WMO;NjYQI(;{!amck*n!DspSI)JV{#Nb`OT09_sWV# z9~;?QbkVA&+ZcCARR#iq?|LP?ReVJTU+$*Hi<;`Gxr1J;TXgv8l#G&xMlk)DuM*HJ zVY5X1A{~ty8456Jyh1WRN<66t(&tyE-(g?1Ur#MFxM{CyktQYe3^Yv2YBlS-9rFm? zcvkNxV#l})H8UR2xCh3YwDwn@6&P?h9;k;^&4pn@$xIHr+Vl|~V1{{cN#f3yHe`Br zW@jpnRViei_*kF#L@K(uLIjns8r?9I1&wk61KGtyHUG-}Y+dO2#lXh+mbOp}!ebt_ z1vO89m?e8v&cDYTgzr!CY|FE;!&R|e{BEGzKEp(^JduQ-2qG}JnbIRulL`IBxbmy> z)GGGPL%%7u2eLzuOIPgF0k5F>vrRA;zJ>a1y8(3R6b4*3L$>yw_Wt|`Am*qq@9Rv! zH{%)>R!#>_NT_ksot}Lb_P&rYg_}L~RB%UV#QSkkuWOVCA!g;92Y@KuDxx8WVAa^o zIyz1$lg%gnDBUUolXXxIq}B1s9JSgHGG( zhg?^Qsr+~rCL~W(vq&HbZ-|&Lg|~oyByI1$919T}+%{H|&lFPCBx^AsE|sX7dBvjz z>Z1l-9M^od*kKHp>D{X&ztiU>0c4mkF}aS{XtZfBbL+P-(|(a}gRBiS3e1>o)0k6@ z_!~KR@g3nX-4sN^?S65m-lMCiA?5C%ymQ`=`lOiI8ZZ2unflT3uiM+9E*HDi&6-t+ zeB8E}VPY;qcfD^zdX770qit189u?{A^Yf|}Mjy@EEWcEy1p-+j54pzo*YJJocgG@( zrFJ|}nBYWqUwWtHSz%B3FVt&h~nl?zSxJ$4OK&S zUb|s*my9q%w!58Qz%QPR{sQCGZ*7-uWiQ7n_jjvaY6O5JHvxupbD z?Nx5PdZw!!t3%vkhgAe=P2|}4uol?Y`1HE661GcWT1TKfAem$ND+OgtT*b*@&*#yT zh?wL^+|Agx%x;$9$iRxm8Q-|IKqY$mR|zu!YaluF7YzCA75l1QU64!E%-r0quP*Ti zVFXsQKnjEF8Xza*U477kxXeSyFv){a)6b+&CE@scaPfjc5Gt+k7#$%>78eCb^k609 zyZaT+s|F@udj&x4bK8=wzMU(SbGHx-?=gH?nG8HbR8Vl+bfMkLxO9$l(H|`jNv?B5 z`uXJE-L=DW97&QF7IHv5TNpN9iloBrjMXRBLOg6k_8P7o5>hw2KJkq7YwiqcJnqH- z?QZ-Q&%d3C`wd|9Mh$nj&)vqHC7NX=x}0h>-|*(Ks+LsyxSkZpQ{y>GIC8Mj&6AK+ zIS@$31!*cYyQSLh$X4(`*crcS203=B7NErAoZS?U099lVY>-G(=5AWO7nGtY8nxgs zGe7j+?`mY`~0}va0(`4XMbp+D8HqAtUht1Rjyiy5E1bHlgG0U zFF*8h>BZoG$&KfrtRs9b=JYE@Z%lgA=(u)_$n_7{qI1<}%;T`$-=0ua=gyEl|IN#fL2yvg=jV1f5yRxhWj9r{{t!es3OYx8S$ldJd20 zMP(IvBy<-uFm1l}m`3|RBE?2J2G?xgM2zw_JX^52D>g_Nb`gSY$&j!bt@^E zl2P5mPw(vYt6`-|tae(Az!1rYsLQ$;A+J0XKZSOL2V5m?CHeJOFRRjm;%+v%v<;el zokXcama~)9syIa9y#S^{MqFuu*8?)Ks zHe${29c^XM*DU%DT2Dr>g4&s+|R*jebU$P0b^ezz8OFy%&{9sJfFdd;!Sh>LTSd-c>EG2YPmgNF-0ZF ze{m`5#0)CkaY0gwmB64>p+umH2POVOQ8?zk^)_h8M^kq}EqK+!w&SFq{(P?Q!0h^r z=v}#QCLN`STVeNt3PYKqrJ-Pw#-%P(XjH_(NMm2*X}!aez&$_0_SiyGdPJ+4DWxu_ zy|=Eil1dTM@-)+G!Pj2jm%;Nf?Cnp2DW*bh^=z@HtHj&3ZY4oeG^E$Q%ZMwhZ1=`&r}HYJT}HfZ>36|+7}3gC5O8XGZ5jTifc z%00biRO^;og(pu;r(IG}&P^~do{u3i)=iI|dyNdUemoViAbE1?K4RF1XYR?CazG&Y zGfv7+O)zotxi=iohDuMht#(Fki36o|&MQpn;%$Q&Y^ezM!5{%>vAUd%Vz*86JpM+* zdW!DPPPepmGiNclGt{@oP^WDIk(j`;c|cy}<;ZwR#<#-I#n&yw4tsFhCl&7pzba?)f2LKN$7nJSy zWBvZ;S-1DcDGkbQ6Ji-C!*?wm3Up@wt60t%QV>(+SEjIU3X?{8AwGMF(ARbah{Yel z-{v4s5pmIJ4$YY=HwRm~%}vy@m=Cij%)`a>_uHIoB-=Yn^q8lOBpn7&On|)kxN(QAGrwzn zeEJ`i%4$5exZ~RFAP&Qej&J6K|MUQ(fJGis1GrIX=WGg(C6!Thj(djQbT#(8-N(TiVLcNc%4h zMWiU-Mf1ylf2I->g>ln_$5PM*aJi=f{hS9&R6_#Wdjhwb2Jnhk{dZV!pqy=TZ5&p7 zM4S>>Zz~qU{JoX9mZs6fT(uLTjcA5MNZ0|v!gpBOn@KW+v0`TRu0Rc##H*8yUa^%g zK_|IvGA+c>5zx&pkgb2dQI_C<4*}gQrEPCwR*Xal7N%?Bf+E5V^9BmYZl&<+Dv2p* z`+w}I3DKkBI4$Z81XXOu*P@<}hd})DP-aPB?%b6;%KV~v8o+MZ6R}Gx9T2ndBive> z+};pRv@nKBLwH}F*t6q;mcRV#hUwGU7V%S!4%Woyyw?1=2gT`=NAlIzbBRzNlsay< zuAlo;zeIa`%{{mFWD2r7_+>K(?-g-}4GQb2^=NsUJ_9#p|G8X&01rb5f8cgZ4i*gD z`$guQ4AoYwzhnb?X?ZMr%Q6`a;a0|ae9ra!h#xnLoz^c8&u2?$h_@;&R2REzoi=+W z?SoVV^g}*>tbT{6$en9=CeBEAH5>X6_pm6c7un+LFYpS34aW_h=`);&yBGOt&x*+a z!<^&kB6Ak_*xKqJg$&cDZiIeiCI&VGxa#%OV01d?ISUlMOh2DZ2vWYk7BT*EmZMc~ z3oK(S|MSbX5< z{xEbTua7tXNcA{9+GqZ;@k6VQ(!Tf0%_!bJ4u(Hg=ohp%0k`Xp(X!n!vIxh0rU|T^ zus^_7XTUW;6#)yAZtG~?^syu8@KBCjwC02!PxQhei&@kw1UT+48rehjCs=N96T@wq zyypUzuEU)p`9LD{^T*He%yp-v^&JA>9}k;#?~)IAWme1_XX0T41G(A>S!<1D(R{8+ zQm}**ftz)a1LZt&nT=oalvGog98aN(r-H9v@H)qyFe4*E_15wiJR?xa)0IR^HtHwn za3oCm5*Uo(gXY@59fvsOn9X6VZ-Cz~K0Q;zlyxSUTy841p*g|``9W@E;EF!T{Ymz+ zo&k4=yaE*>L7|KMk3fur7>TN2$I;aMixq*E04B_@GO6R!878kQ#Yp0`2w0-M-Tb5A zD+U+Gv=_LasSg|AC;H5`1JJa28Mf};nBg|_KcfwmZSRKirBhSP;8+p%=VxsmTHuyU z@6e4I2XAdcOYjhLa5O}G17BH4Lso&@1f=XTTW}S%TGokG;(~7-1co+g*FcF$0$07B zP9CP8*CssKwEB=}hq{Ob0m4rmf}O`xu3H`@DcO>?!)4MPZ zVKYN|BP`UFn8GD{wsn<3CaqP~&YDP>RWBAQ22&1Mx*N|7_st};@s+$Eo@_7w?2A|c zTkR><5Q1?e`BOWf(YV*|?yOLA>o6IBZ&2U# zCkT6fK?Vc--0}{maEhK~#0pL=@{Jp5y%nP5tQT6{H8CMYbuq;FdLAcO@B@EpBaDKh z(I3I=Q?jzt51xGWe9Cc>jY|s3D?;-(1`G@5#+qYJcIF*-Y&s(x?D{x`GN~We#!X~f zN?~Ycv6W7IBNX_*U@*^*VBatW%D@W6>i}ri_|&!Y`qe$r+?x-uO_HV(KD$#u(Gm1z z4bBHE%{%_=`+?J6_qe=E&jIhdv-b^3+!N*>1P~hh;oEP$bQdHJ)fj0T@TYN-v-`lu$t<317X`iV^0Y|540y|CKw>6f$1SJUBGRjah205&&PU7FRJh3(IF~uV{m8UUrHJ|$ zDeZ)rmlx3ZekGJDlei5l@Xy^D1lF+Y@_vAFksy#UXdd~cPse+d3}Tt1HC-EE!UADEGdb?DH`ig ziT?uI@0yU%Iu6mgatC{AJj3sB?u0KDm{PEeV8rVG^Uh`1j|1_G2l5q2E^1I2XGz1f zFStAiBTqO%1y|)^s*grG;c2Z|NKR}h!kR-2;MDz0tK(R!Lc`I&1L@az{YySR>aE^N z*u(biJtUld99rl!M14fi`4Of@wqHZTFgVYcOaANywJtmP(U=vG3xJWU$))=apj^2m z_7L{ZfT(BcudzREN@hOb@z-f&ximmu&PH?%zjoJD;;ONxeSUeV@o%KTlm>N}&;dNv zkW9Of-3e7gu73chVOU;;v^ZW2J7k1rvh1K|6+2tEXi+)nlzD!*xN5@~rm*5fiCp|3O zsMA$8#B8_h#0eStn3CHEuVC|`^MLZsDqFd8a%w%28Y6QLTP)3{Zsoa zv}%v;&t-JLH_3(?&&4cxuztqUkC#krWlqNYg*S{}wYY1;DY3k}3Y*Tm6{YgYL2FAC zBGU6L2vQ0+TWE!z(|c}W>X%j`s?U!`*`kaxQhGiD0akvB6LgV7_H@2kcS-}Lq`v!P z=Y91rtsW=89`DN(Kh9|2J!&ED!uAKBw~i}(lf*it!XeoyE*ac+-p$U#<<-j(m| zopjoS#6t2LOPkX0I4n)1gy=2pr0rElHxj|O8tNFKw3|WBLY#S!=!hyi-JSiM5{ug0 zUnnRZYs4{Z6^(Y-%DUF`tkm@BS(Ddu3zM(35=uyF+l^_|PWRfyjwIxZ=m2XR%jpc% z3RB+d4?cR}rCcR|EWgax&=yLLO0xClQJ!)xw7a_|ANADTi1UG{{Bltt>$L_a^nQ81 zqI0>DdG3xkl&!pC()%~JoYHZE@?yklD#d1kQp&$cfEL;@xnQ126T@}10Z@5zDO~Im zcEfNR5B>VM^K_~8!?Jg^%7rKFTXMa^@!05Axyvk@fB!F{B^%_|e3!S-{&T+dLJP#t z6@U73GzBV7z*>iI6|gsexKhxjf@vI_v!n`0+u>A$-+yPpF?^6$YFo&TC4360xVpC$ zX4jlwtD@^r^N~L@@yw1`@n3!QPDU?HV-^P6bQ#&ch?k?g(4f3LKo)rGK#~x5QLlb>iUs+ zPZHa*%WAHB8PtA0IP%f`2DGSC;-J>}Rcjcu&-$+~tO)!8?B)Hg8OO8TC2`5I!3c3J z!)9_FdsYHfQ3jsb?e@@X5&I=`AUE3=WH=so!WQA-W;bPJh!3Yx<6#0_*(uy{fz9z#Ba8^~Y+D zXPAiWZ{oa>C44l8XQP!=Q+e>^MKKx-TQrFaT0Jg&8hLy31*)Cf5-;udzNc$WxVu9` zxKqte6X05z;RSV9hQ~#}EWgph9WAwR>;`-`QuX6ogYV`6j3;iP8F;x9$L(BGNw1}J z4vr5d*uvZJ;G-ZS+7{~gJt6IX-T5f9IzE){=zyhU=z$QvsSJVC2^O+ zCTSE7u$L)XqE=c3&)gfxc$aNr%!ycH>_C_zv6FcCr9e7prnVB(ynWfXUF><$ zc10vtCoF-rAii@vc>IX3-{1-cj+C5kmk!CPxPd!RF?@{$ zY2^sM&$wW?&xI&w_$RPmc<&X;nQ(xOwUdLF9Oc%G=$4|n_aU!cuYm-z7uq%j9)jD zULCG@qo(MQB)(ot<#7=wg0Gc^XVJZQ)%LNKSzV6|Ib6#Ki{6q!#kS!^w}qG1`{GkW zQE4fSRuzD}?NRr&JdWL<@@+39fh-hG7h-&&7WP6?sc`}ks}Y-c>ig?eIHiU?&;6Bx zGZWdch^D=RMH$wLpoR#VPcI~Q7?vUZk6@UmNs04RMukojwB>KZwjH*o_EuueRDYRKRc!=BQWu2?pRX~RKi&ig5KlW5m?Y*~8L3RdERwS^9X?XKAOdtd|;;JUwFYRptVi+BD( z!`GfvGw#on0Ssr~a*vX_rEp%3w8#Gq^H!t>ywLRJUF=(-Gb1cY`0P7X@jF~DuSVFsSI4s^M*+Aw1Bs21 z9!hcZ-2Cbg1poC{32Z!Jyl;fN-bUiL>7!-1_Ou65_MhC-bVUa|$u&&UoURl~RauFF zkj&C=D+Wm;N0m{(5lzj9Q@WYR`s=~EiD)xSPk}_TLl&WlyO*{_Lgvrj`nWVI`LysE z{rGC3z&v9?bIbt|tG7ac6!0+c9nuH6gnF=4&(z{?rP4|!nu_3-t~Vo9)Jkl*MQU;& ze~yu;apZro*c!Amc63F5=lw@}eoX z`|0~NWCvBf-0wE>jH#?;Zfr5*b%!vq<+okta1^kA3z#Yrhp!%IM#!1&2MLL^#T+4@i7gTwjSusUhN(&}l z$nm^-^Hi-T_ZNqipz+|CED`rr5QU$_BNLX5WA)0r2RQDX7#-RkA0j;9dy1nLNh$0x zL_3&J`yI5^xDFSiIi8MWEu7#la$Jn-w}|r%Yg?A2GaTx%#6W7Q>~9E?rh&XVvGMds zup3re7#(9bFIKG;%zyQW-XxlQ!k^(>=EY4 zpl;iw5t(p_)X-v?6gkWiW|Z&?`**zY7Wi(~!Fk;YX}JcPAgOF;BWb*f8_rqf@ss1p z!CB|*OT-6b^bT$57kDim?~C)s$J;31RmHjgx2c0-iC6iFDPC&nkuZqSWO6RPG7LU& z^+mlPLj1&Kwr~0z(7<|MFkXgTX)%72dz+5d-uhF$Gv_Sn+yzA|O>oLx^-cKm*q24@ zsGE-?D^+QF`^(lJ7+8+Qocf2anB0%`)pT~IiZz#%tgTGrwj}^V=G?4wrQ>g|X=-K$ zJYR>bESpCyN3&W=FrVBF@pJd8R-Vu&QaVWQm*tDtjnuiW?gvrJZ6p-k35Xpwzy?X0R&JRsn*a(42P z^ir9^o4YVVimKOIOC?q}a~gMJVj^Yc`? zOL3D5o$ruBc!)W2lc9`|zT`<2FC8=lHN6lrj$lcz=W}SXi z-m7g%n(5lr^qw1!4dI@+$1!Q4x(ixUP-eyDHC8&H8YrH|dzK!p_Y8b(JAPD7CD)odD6SfJ9RJvASu$uG|3 zlHRF;de2gXR{m7WWpg{7GsIUb+mF4f@Z`uo;>(E!k%<5vl^-e1)4c?~N|$)q*ncwt zY>UKwc94EjDH&d!X$XlJS9pclyBTkQU-6PZ^wM%2KEcZKun<{6abCY(b+n4#WTb%G+&M!FjE;ox^rLuw;cYU^z z{u(){o%CeOwcKAil*M-e+J6o$x3p6V#xaRgnQRJ`Cp1k+Wk^Qk1Ox_WiCjh$cCE{O zprl@GK4^DR)Imd6Rm&`1K5^fdHrlyf#4K)nC)p?Z=Wa}9tjN1xOXavYk7OZVDZvI?WEDTBbPfq6lQSHFJJ8QLZd;@;6M`gbPu3~7%Jl_1wd$<-^VWYpgx#hLQ zM~q-H$ECgw48loiSNJdWa~KRI<^PO3g8g$u4Bg2g=MYMP{_17+77}>8+PfwZJW=@h&X0WZ4$CVQmb@fd(dX} z>=o-+NBbe|*qQ%l==gj0HBI|HZ|A#R%@cQa8>2`z*W7EG-h!JKE?upP1$=nOp0}O% zp{r{k?veo!2ho!NurPORvdQ+K^02CPbnub&bU6i}6Cw>Ek9s|>oc1Aua3}4;L;}#Y zPjo}kOFH+<1nU0K_`;R_VBl(OxYn91iCbN;J88rF1)}0NKVmoJb$|Z)M{}Fj$b=Yu z=dY-~SCYRC2~4HbavknKY6M6s_m%B^1__Zm58>Y?XF1gJQQ@LDg>f<7x0fIbaP>^YXr4Fp|-5PlY`rxEtZtpLwancwCa?!+*&fEwvcsF ztmM?2+`!-v%qv-+SjAx%kZ0|p(|Wy)bEYRa#c1#)vaI!M}+o1Hnh?z%BaU3BrnS`qifF6tKgS4+->eGg_iZwm=edhjv*)oM2Qtb z3~}s4Y^VV@=G)hBg7h~f!As0?8Qco1iV|i)~6Ke zC9!g1${5>yvrN$Vw=7swzr>KW%QHj0VpzW~`+Gl{s?&{s#512cEKqSY|CB2ZgG*76 zgOy&ImvS|LWAS}&C>4pK&DIF*8P8|P>u?G^dU1xghT*xoB>K@pw0T;`1j>B{p>p@7 zhr;bxd(vx2LF`1x5ma+~M|*xT1ZlqmRnPmV+I_{Eb_vyY-R;;1{qfZndrKXi1x8t` z5S_w351!80V${r0Ay=|Spr{}=@xbzRftgfuxUiVX zWBl<@T82|`FSlqF7*Dl~iC^*N7ZBz!sM4)eOP?u7oZ;6Of+LlRzS9T^6rr%Sv!XX( zik}^$^RLzO+{Et4(HjGNXo@3&g~_{t8-wx?_QKmrOV+{LGyg@W=k@HI4z&!yc-<5? zX>Tl=mJ*yjwoLWe495pC!5!SU#>vy_vgO4U3OTDEdfD-wxnrHaO$m9CMFq zG_E)z`^F-MQ#ED?IqUkNXy(d$8Hkr^==?FG5K|CFJ&1o@Dv_#|A;q&QMwQxA?=8vu zuu;ap4x~yy{)jqXufaA0$KC6q8@Vo93idX*$N$yEm$rR9$lG=w43|``_2`6cdj{_u zAQwYsVJygn2H_+cO!GE~$%RSsx~zr<=8I6j>bIF2nXwt9_DXI)SwwRX61t<|7feUY zJFKnR+f%mn33u^SamPYvG^OE| z*mT#L+W>dg$)7_bwDSWKQl^&7$r%cUTHLk5p(&76^<^OOKG~FIQmG{kM(@ceWu<_O zKtw%;hhoHb6n@Dl1@1xDOx4JQUX7nUM1}3Xxy#?J(9+bUV+V1&r{@w|OLu^S8}KKKnt&R#P1>B_ zfuRO2yMIgC51(9lxu&Be)kYq~nxZ>>`uBe%?*nba*NAI z^C0v?S{m<(;RQFcq<$Jh9*EFuX6c6~u81$;qJ>q{_JF_sx}R%%UAY4F z0;Sv?@OAj!_KVco-L@!;8c&Llpq(}OcHcuUxfk$C9l3N_&0lGwkmnFfkqa+Vg+3t{doa@I>=e)CKY;~EgV>dFXCF+k&S~0`k>H5r*cb@3TbRyOX zDP=wGqICIgSeJj`Z@J(gtRK0ez=dwiFItv)WIM>nmVm}(g+6Q3SB(T$Zx8u=J^ZZ0 z3Q=XEh^$S83i9>y9=x`a7NI;~cRX{$La{*77hGxFpQ%EO^e-1>l?r0<@G-sEMX7ha zDkoKtYu%%UFLZ+o!>rnH!#VF5nlJgdq0IjS4+BX{HGtaTEblmiaYXy62{w+0x2>2> zFs~1CI%lu7lOZt zMP;?oz8}@r_LUH!EWNPyp{>JmmS9E5{Xscmws+vD} zmG62vfhysN&&X%>T6F|4FW+BmpfQtz`G|LqTeY<)1y`ikW51 zs}egzI0~9OYR|`dwGSD?#<;|a^nBq#eVmz=5t@UN1x#G;snD2^u!3+RsTV?o?_~Oq znhzQDP{U`pVLa+S=Ug})dj`hii=0y~M7*1OvUn>5s1e1chcZst?Kg4U0+^8r-aj9U zu(%UGbEX)KCkA3YV&>6~z{N{HAfe^i$Nw^ZVv??OJM^$^Ed&uOj_iz6A8Ao(w)~{vG<5$?4e0UxrvlI4+h^7xekz^Y<*947x zxqOmnl%L$~e8R=%YQ)TV4)~M#d65sqe0GPw8Ya=fxs=`b!c033+WXA7dkp7F7sh$+ zs{rC+DB^9j43bgKPwoiK_nwIcbEaP$p?(H6ZUqK|EaO*D^+3unyU;)sJF)J8WFf(` zA(yVc1Fr`&G6buq19=VzAU$9NCq%TzpN zc2e%Dy^854?y03o>Onns{n;K1)ne`!Uk+53SvI6(EFwa@f|{zDl}T3^^i$GTossxLGaRLj~+dOUR% z=Kzuc{?Ua}Q~_T(@>iF?_PNMGGtS(f9>x`tD&3*y9L?8Mx2X#)!w-d0MGp2uCssEH z)({VI8~(~>CXi^2Gzk~`bZ5?IQx3b7!)m|q=BR$9rM3N*R9=TWpSS>)(IH+2{J6Lp z30RcvoP9nwIZl4#;%2uHZXI*%xd$W~)R$(~tLvmpXW}-t3#{`mc>7JT3aZG|(I^kM zXhzQHTT#2vdbW4uF}0~^Ms{uIaVaM4Im+74q|6TS;v^VXWDL1zYp}#Qf6HD0C&>@I z-wYxs44Pa@=1{oFTi~7!J0*T&#}gy}8cjro4(iXMls7v*=c#?z%* z%JN>$cK*zAUwfh(ab(x+km}yF54CE%A|rBLH2#36Bbn7VzLQkna2uvK*=O}-*J9b5 zTFwRAM?jId(~21GAu9D%N=)|&W(6G`?~t-vF=C0jZ_nOzRz?>RT4CzvWiHy&MhKU~ ziJ-_>OSSYRl2NZ2yJBS{Kq_sXb4R4Z0~js`Fu2c0{vy}!{BR1y^g*wkjvAC$^RqDD zB>b`HLmGLqZB?VXIAii(E+4K>(_MM(3?zK?T0%ZnQ^3mu82tUnU%d(XZ7 z;m`>;f-g?vlG&`8KU==+2}QxIyY5oIqSL&h-AIix@lT!$qUBwB2pZ*Lfw;3X`{dLV zsMPES007Xs$#1KROH!UQhFWDh?J}IMiDpH*T`($6`o|;D=n6b)%i#d@( z=$gje6;Cwh*I|WFwLj2EWNc?fhmkfVzqxp6CB<;L=SEiy%F9wb+*IPBM<2Q}2Vh08 zI6hV$_yX}&tT8dN-KgK6Q-k5cL)v#ms$!$tf1CV_mO+w&k3;!N-_H{v&AmIbYdMN$ zYNFo29zY^C^_@4p?0-9*n7>#ydKc)p3VZj!Akdx8J<+)lTd40Ds3#b!es1VtFiG0Q z?z5u8x}9uLpN)V>rEyWm9aPLaNpiKilrG8QGXr*}zTHxx^5k8MsQS_;K-WwTVOL*53!;QJ)*x!s3Lu z^^vK?Bgw`K$-L@<$0XOs2*pKvi(0rML5@8AaVgW@LaM{whOi#Vh>oDJldYZZVJWw$ z62YWVay~aNwGN?wcTwZ9c-CG-XwpUX+~QPI|!HiMuZRA0dwno$oW% zT-%k3#>WRGObdOeR=g%isS!d~=p(7x+cp*-`D6~#!W1VSj1TxtacAdKhST`w0E%KB zlkx!#>K#|HE*_Wqe$TuK5_sFCjKST{WV#^kanqZj?b3$!r`w3;c-K90j$jrPnz^Z` zY8x@eR)09nnyIz!`EA*}72&pSUur#y?=i$9(H+>9BDM5QY-f74jr!v9YAJV&eVa?b z38fa~WI_ahQT6aXsrXn?B6@HE&?*n`NPdm-la_?S3rBIjF}QqMjq!Fn9NuQjl!q+; z7k}C`;%v6sbI)TUBri)<-Y13UVHFKUC+KSup>mH_P_rMiR7kKp6 z?h5+wofw*fiVFp&~HGDR&Qpd9kfKuF4j`jpnuGXE>6@o)U- z-x$jP2-I#SCqaRcCGQXu`kQU;`incUwO+By^o8eWJ&8>u8UhVR6urORda`K9qG)Ug zf32|~q4z&Tav(rH7^W^AFPyF!bW`eQ`$R*=hT0=C)98yx!xW)@Z?Ud~x3fiQDWxNzjGK4T_JTY5q?CntYA~T=W2^oC;G{TxSeO^u!uoja z2fAC#vnGPNFKg{jPWwM|7lgLL412B9AidUs9&~%$Bu`bN3x1BVWk~PZ#z!J!8yx{I zqCfR}JeIkdq^-~I*~v{`DILe3c0ORkj>@zMC?+9k|4kT$4sf@Le5ZGS%U?-ef5^-_ z)C#P?z7q%{);6f9(x!_mk8q@>#Sh5@@F1M*kM=U{9(H}QHz`eMi&F0TGyC{Cx+i?2 zxNBe%(gh&NC_M2&0S;kJ!6iX4nUfO<$HI)v_vH%SHlr9USiG4mz@LmSuRop|Zxi7% zI@=9#x!BJj(N+jV!tZz?+6y~(8E4hbg@hlP$bfIh(-OPB9XXx_^}u5E${A%gcUzG$>mo19q#TJCO;VvUO+GkYKwKW4!rmdl&A=_x9`=%{> zPvkh@w8CKrnfwF8fMh*4QNoFj^!8!c(ZOG0NZzJG1GDc4JX^5kF0!JWp9#P_mjh5d zL)_O1rcX$}Ggtu?qDAvNeQNHv7G>%cy}03A&fsY8hF`_=&@;$8*hf8DSo5FRgk+yt z4<_1Kv}iwJiZIGDSqkL z7ak-Rqj0iP!t~_i5Pl(OkiJ!h$2o?RNv%%PcZ7|jjqjzS)GKXX2=nEd0>Mb6SFW=Osn`Ln zDie)b<9@AJ4mVUMLgbEojpSd)hu7DDiT~KW8iVr5lR1qX3cd*>>B#Yilt{_?>A)&! z14S8}aN0^$FY52{u7o#|QqyB&VtfbVBo?;QLGSg1E>q1vhIy3Z9ie$@Y4>q)aAhGr zisglDjh+ftvOjJj?f>kbeXQ~C>V=gw;@0)RApa#F8;c~JN6Wn_i6#pV`;AdA=&d8I z-s^90{S`rEn|H4%CXe#?%-^!O#!8biSVZM3Y7zNVnd8X764_G-<_>X zAI$Q)Zpge=75N<-zwy~kK4CC@!l>_Y+%ihc`2Tz}q=5CeM91fIN zpiNau9tWf_w%;Bfa5$B$VRZNYkP%^X3z(B$e80EU3>kVbKPU5i(c4A3s*4MK*ze^4 zNowxg`jr(1>f=FtF^Var(&IM&%6`+{fc|c{x=VmNsJOMQhEp?K@6Qy@s7nijv^A|@ z%W{n8=@iyeUfT#^6~`pdS(dik=y9o=^kJI>mOKFyN}F%P6tE5^5F!w{Tm>7_YDgMs zE79p$UA&jNqT|Ee8?2$S%_>3~5)phkX4b^?nM{nDR?`}8K@jCR8N%sAG5|Ataf1YD zGLvq6Hu!Q@Yd_}V!IF*IEV*P#*n@SFv4W?`RsW@=N}|er0IhWG0UJSk&vg-UQ`nK# zUec&zbA3~mh_~*%rwF_m_GUM<$Ejo$LZLm$H`BRUN67-V`V+)Ok>K34t;jI~&;H@q zi7K`L`M01;5HmfGMy}k^F2E^R!Ff>eYNT_1;`Zm=gT*W9vja-jZ@X3L*SW3FJTybV zAjcq561lsQOF|aYvFR0Jab3yLV$tYayN3qPNt%_PLJrNv8EZ?D@D=MHz7=1{?L{48)DU?7 zv@Z8;l^I3p@PPvUGdZ2m0Cq3Q}jbUuHdd3z58Yw zc{YBr?DP>3)=_-`yLq9;Sa+Bz!`@m)>k?SD^>`LQC!(TU6$KBbl}~*xF`jEgPn_Si zp9gHBFNYN>y*m@-93$v-BA}-i({HhTDk}xW9_ALJ1%j)(3k>h}>Ay}jRa7gezmGM+ zn-^P$jXggl*2?#VtRs!L5<(>b9#3Zu;RZdRUfmRMy_i#8y4103Zb1Ptpi>bK506tH z3%ZKC9elB~WY6ToB!w#v##=>@uKK9BqOm;D<{TSWX0wkV?ym1vL%-)ersaApGYwzAdb!yi}MXuZ$N{jq1m~bw5bsj&WjX%)~ zRFb2NgBcMBWW6yO?>9I+CaBx6B|1KneH;2}qn_dq%UBtdrs~(&>m}D=CX&0-;iGW* zEH~E!(FYwbe6DP~R}{gT718*gnkh|CJXKtpbNx(hgITgX7AzBr^cJop9?3Emy;wwS zV7W9Yu`2&e3`L9Yh8X@gGf_B3PLtuP5SC zCLx8`(%Sc@l&>qEBCJ0qn(pwF;%eVtsy`oJR0nZW`5OSs9yGUEaCAq`HB}uZruj(@-3Mii|cpf)>=V4Q5^eH=|bci{w@wkD8vX?B+-< zjB(a;vZ`&#(LNn%wNbH&<2 zgmPkuI0Xh|4mxIi-5I2BeyJk|kv*~FN7e*KRFwh%D!_*C5}fra$&@dR9dG*7y}EKt zFkKQZ_%xzol=Jvc1(OQWpoDokCIg= zl-fKh@rDA59D-aiPmc85eWtg(1-**wRy#HGkWCJ=;enIP%Ak17lPypEQSclQXDZ9Z?D&sa8Uo_{2N>YQxtFJ^O%M zq_u+OE2>X-4+5r-*%aNGpy%DjM5;(@A++~c5%wX zKKn6Bp7D}zUdT%|q7gMUj1ih{!lRr$1BEDNvgtIV9X^{9R-LojJf8H}pV)CLud9y@ zqJ|5XXO2=L409&W!!-U1RTi(brYhJkgCS+$zoqc2laBnjzyAH9 ziGP1Hfu0NnmT?mS^(d~cVFN*T2XS)yQIP^ACJYZ=$c=POWicP^UIvwnJoo%ASK(h3 zWZ2_|JdL6nFTBvJ1W*GVKejtE{P<(H{tk|d>-5V+h@b4~2wPJZ2{EA3bsl%)L>WR0 z8-4iL8|4!?x-wfMi^T`Fr41?UZ>Tmjf!(VjR}YwMr}Bf^wqjB)WOFoTop z4MMw$$w@IZh|XA4=@tOEMOS`bx(`7xKAVBV%e5_%Fu+c);rq#|(LV=tkn3BQR>Pwr z*6HFHMe7>A=2{i{q#oBFbso*;wj^c^HAaf(X@BXPn(Y*hr6-1B`q4|8Mz$>`GD8Y7 zysN%%n>@#8o8R2x_>+Jq+}QL%^u^N+tT^sDW7V;?j5FlV{z$)B4GBDs=Oe;1)mvtU zaKd>A_l}OPJ2t#q7{PR)SqB3C+6?1Uyy*ci{fXh}+6aTS9q#Of0SlRTA*7OyO;@NR znRT^pbW}2Tx?AO>L8e|H0_OF(DWUWG{!t7c=!(u%HihHEp-Z(fvPHHj*J$KvagWoy z*syp{WA3W~Cb;2;53EzadI7LIyfgAR!c?JsDma)<8GdUN7OSBEo%X!Yib=8T?y>s)->eiW<9 z8j;HiXA7w{^Yw4i-gsLTx*&FSCc7V)bul70hn8_|qvfz`eu=+TrXTaF3&{|r3y-1G zddA&#ix4`A+?PBbr zNd7((`%v+0Q_13ymnfXMG14Df(oh!HR5l-c)AL)7%C^lqoL zK9q6n&NIT9J0t8&Q@VRwObZzD^)Se=>D!s#a zo~f21vEn>}TWY_3sCcN&Ut0KxG`s61_!`o10EU==*;f^_#wOEY@d?#9@9i* zn5gh?DCGBHSSS6%F(0pdK~o9e%OuDQG6_p!(jee^0$qeu?%4iGfO;UgAjD_feA zxJn4&w`ZNvsS(Jx1#B6^YJXiv#S-^|)K}>Au7?50D!D zX;BJp@5j%(`a#)RPv%LJLAL`9GJThTf2nEVxU-@uMmfGJs*696&IX~~-vf^ zao9~O6cWe9`#-N-@E^C}1Sj6(+GQ1Sp@!NzQ7FMEeSIB$FM%(m)BdEWah~CLM8Nig z{t%wLf#6iGoImAL!i#N;)Kc$1f~L>DSoVU>mpu3q{u z*uGt#zCc9Db0|$1ko>9(&Uw%FRwze^IByzWG_K6XKiJOTaf(DvuDlwDqg*U=5HECF zT|=yy^LT2Jvgy8LaN}ml-R^!5NdvC#7e>zEm{8?mOZyvK`kONg5*w2d%#%1h*mZ0C z%%)PT&<=%l@^cwWeQnq?opGzi6K&Pl+$mn)n+!zcTHMl}KEQO(BvRvXadG7Y)F6c8 z6$RNbpKE4!lq5Mba6Qslv|xwxPSIX|BpWlJ$8`S;JYREmefpi3P6?T2VffdWaa@NLT{~P<$$m?{ME+fW z#sfqXPUV`l-N3EO=HZV%H^j-l{fXIyGS!J)J>lyw<{FOtlYpse9nsH!PunO#r>H@CO*@$^adi==F-)TbrQlw^~wL z%62sIuSRG;sNGZDcZUJchpNtT_(U>^BPX!Cvt5;Z=w{(c3F}nDIH>mLzC%|O^Q3^C zwyRSrEs-_2pgUCgBEt9TlIDvjgx$>t_=Y#ZQIYE#)5McW2>AC`zJ2Q}^RZdrLv`bm z;WJ3*`oP>gAo`u34^Y3rRfG(0_1Q?7qNlWG9%>IXg3-u7J_@1nOys+QOd6 zB2zM#=^s>PL{EBv7caBFrJOp&mjC<`Sh6B8o}KPyc~sS*lnq{6R3ICVwM1+RhisUb z%Ctn%Dh0S&Z+J@2bQsEGEnv2Q%8~6E$n7Kbq!vr+B_*1q7i>5s;CJYi($A*US z$H5w&g=X=>0v`Bqn)W5DT7?J1{+&~uYY2QvPMz}fM^86Y4b2tX!#$2TN-d~2L-S2p zNs4vPho77o@@ag;Qg7)Z^Yz{1HE6>Lh5oQhN~LB^ZtRG4Kowt)bewT5Gh5j|{t6WQ zMyUVuM-ddSZE|Of#b3N)({DIeX^sU)fCV;N2x7KevSmocVe%us%ux_atO5SJG;*c2 z8e0q2PSJe1uEZSaOQIusfQcZKIwC76SDJ8)A|HBt?3lgA!vQ0lO|o#(%Xk?M>k3EE zNK!+z_@>nqT{`^zS(ZkVo!Mw4K_i3IfMBmlYlJ@|CK}4ZXmGpz-W7AGlP3>aLq~jW_B_ zj;4I4=E*$!ymgC4Py~@IDmXq~Q2RtzEA+P%vdGLw>+Z;lv`5+%)BB7V&mF0j6BFx% zKy_Q1q)JI_Ne%J%kIQf)6nzB*7ow24TEQX-Ug{51aa@)}W%_Z8A9=op&038|%k@bQ zgpth-Gw&_K7pzDKPMwZW@P|6Kus2Vb#Kd}tq+vVLW*0u&A3O{boMg#S6k)09i^X;~ z#B@lvM3Sz)A*?Bx!{h{~oe0_dlMA3g*PuB4;n?I-sqB*;kjOlMD``b#WJLJ+fjvAt zB>gEeC9vS+4>D-z4mNf3X07-Gp6}0z8F!J~)|W%kHAgx}@*qRFnx`pZ)F1)pv8!ZK zi#p_`#Q+}WTBK8ip?970)llZo1gujSt)34CjA4k9> z3?pkQ{0=it<6?&9h?xiwa9;}AEm!f13kcx0?EbY(Mkbl{(om}x87ogO=~u_upV zRST~4&`~1WuBg1+!EpvSoRVz z2+&hi+Ix0#Tn_hiLlz!a3p31r2Ihi#4^AdIe_P>+bV;ZHF}oZmmnIPRf-iLOf>sH{ zc`9bIeD3*zN+TS*1*SUst@axI5#Wyk@pYmBkIKgUM%)J}Jtq8>97f z*{8^5i&8Sf9t1uwDN=t2R9jC00T0jf>CWp766M_42aIIPI$>JTyH0Q}g_w1#0~iSE zW1Rk>BqMTNrZbNp)1^QK&WZ$6j7uTk!2AZeEG;!nwopZG#ooCyNj>mB zt9230%fn;N8lEY$QttFbL~SzAb56o<(909q#%wBgX#Qt1ON~UipuKW+^Y7BCH91%ac015``xt%$HJ-YFA(7$9Qf0Q(aD z;;53m9BVOewyJ--onN82PaT;@*2|x59}cuYi>GRD!2?FFZ-G9iu1pl#kfP+!Y%Zn* z*A;9}0U9Nz1!gemnXoa_P#H8`H?L9&G6DUHPGBG>P7j*Id^<){$q@Jz+>QF(AwutV zG@MyZr;>2xBm<5?G9Q;P?(v7N)#)bn$Ao39#+Z(vw9s~{E1GXLMVu$vqXQ)3dOZ1g z*+ee@MkN3OHi;CII7-~d$Hyk%B-iOom^C1B50AcSOz)%J=$L?hjy~iOUxs%D8{Ok~ zTV(P{rfex6RffKkT~ZUtXcj0qFNIg(Nx3R|SUek@?wb6h!Flm=cLqjRntcO$VY6T& zNXh)(QvF@Rs_8swFS)+e)J!!gIX>SsnI@U$YlYg9k=Ht7;?>Wx)!JI2nyHzqK1~|| zFjPg>k46}QkG%WvCElIh6x-)FKxZo)`z!A4=wa73X!|fGSqR=i79bT)*`sl<2uhhG zU-D&&4HD#*2d0oKNo?ulOAo)ZYIpDVgB0qrWcrm37>=We-#%a6;^dvaPB&`al$5X*}5%U2b8ZC@F{i{cq{YxXoq76^1jLYJj-eYMhT}DD*%oABsOw@ zS}kRY-EIGT>*IcQ6!QEDpRTyW;z|Q8>kS+)w&C`Mt(lbSQh}1$DMfAL%C>Za;oHX* zk!3vVhcV}h7--4vFVbz{&L~{^?ITFKdOU*3ib%?(MTOhrnC5AKT2F3Z25+G8Q5Cx_ zf`;L-FLM&nV*!IOtHgx>ZqgO)GQ~zMsFVn^A|AH^GdQ*C57n{^At9Xif8$GN9aN@&2J^#Fm+V=U6TdF zQnxHWD8Beq!>ru!#a1I%ga4WdO6CVJiZ4LW8st7dK3C(ufY!?Ai0Ba^nl{0Ft_CLi zzFG<<*$lYpKq#^ysLKxC+_yj8^7u5B(^OpA^ci=N~&$sGLU##ftu@ZyUxNLwCl-dvsXOuH{ z)Tl5pnG%Ho;JRlKg>;%(M5JP`iP{y*LtdJpt#Of~{J>;XId%%3u&F!7+n=Bph&wZb zKbuht0R24)pJPfLu}c4$>l*)5&Fx<~Gg``Khs5jxv&N zvcP0VT4^8*1~XhPXC2r&%q8=EY+t~nil4s5ha;yN(jfDO-C7dnh)Hi;=YCtzZ~hKx z-&!9Lj7O`IVTY1v016!gpVVgo$jp8!b1LX*$Bwk_KD5$8*RZub3~(GgC(l+!x4L>)1Xu#A`wGUTB@4Pa$xU zS|Oj@jdQyEvP5}ZK3e_kF*q&jVP`rZexPdk^tx9*0i6>jJdT+6h5kwG87 zu}H}aE>$ZsD1$-~>rHc`o=>In<1Z2VB~690K-U~Ek6nVTO%~*g0xwmDea9}IXW*x3 z?Jo~9y(7^)F6pt3J= zLc%c*gL}}gC7?MS%813owKxdm#{S~z{Z_LElXfgf-61AW!mUUhQtBDSgD|L9ftLr9 z{9{IG)%AjHEKHl2Cv@f?)4dNDgbrS?y6=;m5mk7R3%T&ZjaN#*Bu58`qVNj*BxJcj zJ#Pt_;TLzhW~C6mC5~m=0_77Me^^ZVslULa=6e0eB-&vxMQhaN0>0M>Q>k*?RaQ@~ zv0{lW*f?7TMt*NbUkl|&dkQ>SFfN*2Y*R$$%D>$8nLzbS;wYX{TubJsuXalEAUolG z3@u@PlqV$4x>5rMG{ou+26MM)F30)FwS>op3zZC;D>C z3!#i=_O~T7Zos|c6VEbBO_2AaugD;KFWzKJ6S4d?yIe_tR0s#v4W+W=&1`$$5)aU( zN1YIDcc|}QV1C?O#ld&rjKd%JR2VKrxK;S1G^9>%`jWyi(OLA}&6r5e2JM!#G@|eM zhYA4-VDjzi*Eqn4Bwn8NwCU zS%+ciCvQ$glopS_`3OXgO=-DEsrhog9_0+VnCKiH1Q9kR`Dy2w3}4I&rmg>_OuzW8&&! zXGWdRNkxCMJ-%?IhjT~24rCp^*RrKc#(RcD==BK2z+{L?n^7Y*6OYgmPAK#aMpKNg zqHt@%XCWo$Qi@G;M4QL)e(j1h%%DoF7)xi|6_#JxySG1*c-?`*IpY05u6!00dol+i zxII<<%5gqmS%-Vf4PrlLi1YYqpWW3f&Z+cT(a>-sI80D(sK{zfG}wu1oE%xcfp+AY z(_D4V{<+pW*p2v9BgBK1@Y}wYdV6e(VQnzZu+z`EX02r07j+_sKC{!D$yi*={gpQR zwT6@R1g3bAhI{o~(#7H}V`$lpB^aCBp*prb)PD+}Yy_}yX%q{y(a;S>eEQ)s%D9OL zrv?7h#}wmtZ>64VP+>jR?eaG!o%U0u6Zh9KB$=ObO3jUpnTZl0n4hPBSXQ|WtHV)^ z8RaVpbkW;oIDC1hq)mw>XJRVo`YriVNtKo(9#r2W3ippd8cHWA7adI-RJ&!$m0m+t zA?H9#DA~R!WU7T?V!EzNOC+|8XOx;Y`4IG?dhmLk5ouwKS%KZt0z{T=!nbaTL7hJT|Z!O073`RyT=pWU!&Rh)G>Mfxelo7 zUP=INoI5lg13`DL3_&L}?9QdoS@Yy|m(9eFNKzQkp95XWBh)&3>6C2MAaL;~t56@& zr=;2hyl2FWe0tJT5n|PwTTIm+68FSZzkC=Bs%5wVbxD=fMu^DA`WO~j4_(PNjp8)> znKakBa}x7N3%VOJ1#~O#B5mS>78#++EDqWM_pa-^vFgSWNhNXUfyIi39%nNIMb{_y z8S5rY%r%fT0Z!Z8L}C` z{nI!U>iB@BJ}E_d#$pdThO^(ca6Pr>`vNx&IZ)wzBGJj78ph12WW1*teL0H)m9j8* z-r>;PkOh;98B6bLNKjz66!U2*Rn128ml~BENK4OZ6j>GIt1?$s{mAF{N8xD8x%KBM$4io63wUP(s-Ku z?T4Si)|4?T24fZKD?y;Bi%^)%fHV@N1Kmx~72)a(N7-M9r8|n8IDw@*t{AY!zKNo} zS_T#K+3`CqGH8~9w>60Is{}wuYP^=%x9CbmW>CmF0j-WEF_r1}hf%sqmHPabWH?+j)NVTPT;|Mv#>_g;5`w!vTNG+jmTPx<`A97RwA{6b=0&HC_v8NCGz zgSjdt0*vzSvHrATHU>c8QaF!?)t3L{=O08Z&;SNqb)XjgztngW!_b>-4ay{1=KRNx z{&PS6^@>g_z@R7j`h0)w(tp1gN7b7TS;Vv10{dTP;RF~|j|~?_{%`;M&v7>ffnk%` zuci%`|0MknB7Z$lsSX&ljT{KZ?X<;=rtkSRMyH=3r?Nd+(4xEiGEj`Q2 zEmNyp*8k-}ifdapzUoHMmJ%f2t*MxdBci^tzop{V%Mom}lZ(M=vigfXm2wCdt@( zK#Z~f5*%+os7hY2)5!DPORjH8@BS6x^tSPb$gn>&p7EI&#t_X7&kn?-hBhIQMZAXD zoStXy@e2Z17skIki~L0pg>2)8X9d>8tB17qQ9fi#ad;520IveA&>AY6Zd2KL{shPW z%l|8=I1ZDT3fA_2aQ*L(@I(MX_2U+0_4~g9;B$qlGm-1@S@qup?*GRZH?{~)b(pN| zd;;9j^~`Uq>5VW#tP1~Lxa-L1CW)v;br)y*!0 z3AH1fhY1$XvWK94*z>kNH}?VDmj+zxF#J&CwYMCk>*Od*H3Ybl$8P0sGp4?T(+T=L z$FG~shMZr|hv3BfPBj7wL~i(OZ0Ln0J+ajzlI@mpTQFrJJ=ODBhbTv&sBvDIzn-u7 zj2pquU-8mE!C3^4#cEdzmAWG!+*x{WWWN1qFe1ORa6v%ce@j;kh zNXFy#_S!_VXHI#3-YVRfM}zjYNtAlYVfbr{Wb|UQg_iWY!BlGl}? zgtFSGXiy1)S|NeZ$vaZ-#nZT!9s-+tCm{ychN;ptZdwYOksre1i$1#}MQ)B9l*tln z;>ANubk+oheX;E)wWoS(b@{+M@Rp;gr_#1Oxza*-Bk$bY7uGgJUU@WAq1H5{D-fk8 z)(0WdK6$03+Q7+C&4-^vrl?)=Y!?WXGJf8l(D+&H4RL&_u|ZlHRCHM}go$+HnTgAW zoa!t`3Ypr)m(!C!Asx_I%iShzlMguR^! zw6!}ni5D;$R`0+_4a2Win&wa{|AKxV<$X;GvuQXWzdtQM| zhH#tPZ6>k=*+2DbWd&F`mDAwM67u%M(ls>H`m!zcmUn9HEw^X#97d$qaj@Lj2Yed8%UF45Oj2*0L>Hz_MGQ|>jl0<3zk3nbzDSH#c;T!C?{&iwhKjbK9_42DZX zZZr1a{e2#v-IhIqE99d05cQJ6L{vOxIrASgETE#9#9-=ULECFfs}sV$6pMVws1q2= zHXm9wKG*7qni+8>yUfmV(;AgO$yZ-=w7bMhRp{d|eyOOgM*!RG> z(}+X_K~&dwr;g1NKdbx5fydkHDBI^R+%8_<6%B<}?j>ryhgv#>v#n`Z+>8mD>q-O8 z^vU#3kwF+p3V(e3thT{$tUhPaZF}ebOp-l9qp_{7^BHe=m?Y#U2 z=$_|^pgYxm^~7pA{ObeLifX9!FSi96sH1bxD%h|EZobP?hKoI zUoN1B{`g0GgC>6P;&k-v#g_;ky~ zyqpEHL`2~5!ReGYG9A;)94J;S;~fE+%fmH1RKz^nKoQ*8c- zW@Bq7OdzCtc0E=ZV7Z4zY+c?Dl(7aglW`}BGvl2~uj=B3 z43wO&I|@97UApDUPHxD0YIOv4ee*|OB;MQx1saCELS;%tQW-urh)?9FSz~CVX>26j z!d=?0@Gf9AD9`aR3>GG?HO563E0qbi?wmgDm$jsez=68X3dex@YjHL5k5r&#DG|#w zi$;lnNv))6)ZL>CdSRyk@5Mc zy0*ZL8zWTco0CTWl}S>U&X=EREFW=k!@oV>nff4mdA+B42dAW9AI+3&;w9?g{?n~5 zTmeQpDI{)NDMYHx?kdBr+E2v4yi6>Jic1YUi1iXLa(fi^(J1@HS!4+3!L}HC1y$*8 zCqso?%gwlsxo_S#W%WEoltZl8B!_mopNm$^%6H`gAf%GrmW9Jr@^V(kI-q6_K6>FFJx{sGQKIDgEkJkTtIndlh)!X0AsB#rnm{M2qTaS z?JWc|HXfGdSrq%M_3dlR6w}X(=xDlkD;_jkMxe7&HfX7=E+&8W?{Z@O zDSt(y@oxX(Zjtywir)>oxY^Zo-t#d*By)~@(ZveAovQ|JpF~A3it@8A3< zmup4F`vPk*k^78TGYiNeW3v#AMhVYYN(`d8_>3>3J$%^|Fn_UB9qii@WHNdRw~ECV zviDo@_oG%y^WNaEiU|A2DTvYJYR24EAYNhwMKjMZs=1a`oDMC{Bt|r95j_y~8;1l; zYfH8BPO+G#OY^PDbg!%H?4(!zY&-b|85a#kTiF49KgnD9Ir1hKFFeM_l3vhpgyZBLtcR_!6--bJQR-M<_ zGODL+7GG=xW3`~=YYX`yJ5T&1YKhEyASz>@a2dY*cv~|yw0TNHF3OB=(PB}s3`pZ} zcIl$nY1H=ip3etA>pRMsONu7Fb1X|6s#|U?-df;k17%!C-f~96!g$HNLxL_G^5E1q z)GF}t^Jf*9%)(HAm)YT_1U}(r19G~>EtPOJIZF4f2&~UJPDifW6JB+ZUPwe$Ts-_R zVK=3dSjXdU0jdxQrd&_GVqb(TgI8qpDKt|IzI>78lpcHjaO@;RG?Xon;}bg}*8nGQ zmf~0TO!V>bSuLz(AI@@EIwLoRz(kgP^<8MXbF**bgSez}?8q z@tpvbny=-UOE96k&(msoI!@`78U$Q6-5<#Uo-e5XiM*(-ymNz(;J;|&On~B-t@|w; zP%PHja{w-kZ4Nrpu^x&YI-w`S&kzHw9>sMd4#<%Nt&lc1c@D z<885apNlIGIm~Ec`l~Zbp4^`k8ZSIrR%&5lg=dBm?2Ox+ z5;OTlxU&!?F+Hr_GrTrHSN#!uD1w!IQt?b6ulHtTN%SL2c3v?kM>-^4Sm>dc9exwB z0g)l$;x%Ko;At3B-sHFHN{d=*S#@pqZxoLxTZUz^T1d=?a&4qeBsg>VSA_uvOa_X> z0XLwhoby`>p)Egm45o+A771rkgWM-LbVXuy$RfXguo zi>at*K5WCcLt~uU*PIs$EKow9{}j9Az7lmygUz}F@}j1Xsik_u!Sl%e0c8CVd>d)4 zdt&^GTHf9e%tQ0b7cgmGU*C@oUEtGOr{iF_EQYUwnFN~y!iOu|BvwHW! zOXe-?42WieJkxT_ij(U6Ef-k@txhf_`&!hmz4}b_ES8;^Yn7Vk4J3w%b|kw>7el_K zg_Th#zJ-Dhoh~>8H;N`!Y1M3V0V?Z0v)LjqHBGvpPj@ofQEkFdux-smlZD;bA%tVv zcb)E}FR+HIx(5B3g?PxnfisehRa=a)5Lb{O)($q%H|;(qZhVNiCNHeohSEShn9y2> zfL!1Zek_fvz!FM5M*iL!16qG>Oq_HmBW-{n^sO9E=h<_ZN7+hy*E6j8t+E;1PTwi7 zoJX(6%>P(@^G$0pv=6IFPY_be#%sUXszvE2P;m;lKst?IC-ZbYNqh-(jrDJ1(J4hC zoBTEt&)wfEXo(C{N1Ib&{RReI+d4Hq`NSE}>S(Ab)J|L8LGr4YqtWqWS0<#C=N#Mc zHLbndm(10=Id`C8&;c{2{?=MDOXx@$%0Ds`g2;eDsSd-!G`3j#rwmo8N0emZ5d4hb zh+;ZGKv4%Mj$;ZZNdxjuuH+K+>vTrqT@_v9?}leGr}D30ljH7|P~$t8d3Rv$X?w|_ zT;f@8qc;{F&~}kMs7~u7l6mbOWpBK0@j($hk@Ptg2Ym9Fs{Lrka0L+yEQC zLe$?V8~hi37N?oX{9074ecE51RoXF~xM{sHk7wk?00dT-Bc(bud&HY=w^yu$j($R6 z{#c@wYQ2X%2=8GL{#GVPEIo4&dFJT0ash-qJ1C4$(G?h2a)#N6=mk0eBKqn?E%rC;`X?Ic4e|@R??gzH`Zws_^A~jApfC2%!_glY zJdO$gWry%=w7~jXCjP>|?|wn|9k>!&0zhffL8GIi<}P4grF=?Y3eS0OzYPlhgASiz zvd*`-)8P1l^BY6>(P&KZ4c<=! zO5fg#&ISJKn6JnRbXPzkDJR`A-4b`Z*>Gj;|2jk-wMpfJO#Y@+Uz)B=Qvpn7glqND zUPNYXZS5BxFDVII`W1W^=hb!Hx2l8$I2SC ze_2#32Oq`?Q@b3tsQZ6F%YZI+(7}sB9U;zf13F}$gy$x6)bxDSmW~-4S&0k z|CX8b2h+WKeo5R#-W|-rG [Introduced][ce-5554] in GitLab 8.11. +>**Notes:** +- [Introduced][ce-5554] in GitLab 8.11. +- The Backlog column was replaced by the **Add issues** button in GitLab 8.17. The GitLab Issue Board is a software project management tool used to plan, organize, and visualize a workflow for a feature or product release. @@ -28,12 +30,11 @@ Below is a table of the definitions used for GitLab's Issue Board. | **List** | Each label that exists in the issue tracker can have its own dedicated list. Every list is named after the label it is based on and is represented by a column which contains all the issues associated with that label. You can think of a list like the results you get when you filter the issues by a label in your issue tracker. | | **Card** | Every card represents an issue and it is shown under the list for which it has a label. The information you can see on a card consists of the issue number, the issue title, the assignee and the labels associated with it. You can drag cards around from one list to another. Issues inside lists are [ordered by priority](labels.md#prioritize-labels). | -There are three types of lists, the ones you create based on your labels, and -two default: +There are two types of lists, the ones you create based on your labels, and +one default: -- **Done** (default): shows all closed issues. Always appears on the very right. -Label list: a list based on a label. It shows all issues with that label. - Label list: a list based on a label. It shows all opened issues with that label. +- **Done** (default): shows all closed issues. Always appears on the very right. ![GitLab Issue Board](img/issue_board.png) @@ -54,9 +55,9 @@ In short, here's a list of actions you can take in an Issue Board: If you are not able to perform one or more of the things above, make sure you have the right [permissions](#permissions). -## First time using the Issue Board +## First time using the issue board -The first time you navigate to your Issue Board, you will be presented with the +The first time you navigate to your Issue Board, you will be presented with a default list (**Done**) and a welcoming message that gives you two options. You can either create a predefined set of labels and create their corresponding lists to the Issue Board or opt-out and use your own lists. @@ -92,26 +93,24 @@ in the list's heading. A confirmation dialog will appear for you to confirm. Deleting a list doesn't have any effect in issues and labels, it's just the list view that is removed. You can always add it back later if you need. -## Adding issues to lists +## Adding issues to a list -Add issues to a list by clicking the **Add issues** button. This opens up a -modal window where you can see all the issues that do not belong to any list. -Select one or more issues and then add these issues to the selected list. -By default the first list is selected, but this can be changed in the dropdown -menu next to the **Add issues** button in the modal. +You can add issues to a list by clicking the **Add issues** button that is +present in the upper right corner of the issue board. This will open up a modal +window where you can see all the issues that do not belong to any list. -Within this modal you can also filter issues. This is done by using the filters -at the top of the modal. - -You can filter by author, assignee, milestone and label. +Select one or more issues by clicking on the cards and then click **Add issues** +to add them to the selected list. You can limit the issues you want to add to +the list by filtering by author, assignee, milestone and label. ![Bulk adding issues to lists](img/issue_boards_add_issues_modal.png) -## Removing issue from list +## Removing an issue from a list -Removing an issue from a list can be done by clicking the issue card and then -clicking the **Remove from board** in the sidebar. Doing this keeps the issue -open buts removes it from that list. +Removing an issue from a list can be done by clicking on the issue card and then +clicking the **Remove from board** button in the sidebar. Under the hood, the +respective label is removed, and as such it's also removed from the list and the +board itself. ![Remove issue from list](img/issue_boards_remove_issue.png) From 81eae63b7a4c601a8b64f8f1c1820ba8a4f40050 Mon Sep 17 00:00:00 2001 From: winniehell Date: Mon, 13 Feb 2017 13:02:53 +0100 Subject: [PATCH 125/313] Use safe navigation operator to make rubocop happy --- app/models/environment.rb | 2 +- app/services/issues/create_service.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/environment.rb b/app/models/environment.rb index 803060b3979..1a21b5e52b5 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -126,7 +126,7 @@ class Environment < ActiveRecord::Base return unless available? stop! - stop_action.play(current_user) if stop_action + stop_action&.play(current_user) end def actions_for(environment) diff --git a/app/services/issues/create_service.rb b/app/services/issues/create_service.rb index c9168f74249..961605a1005 100644 --- a/app/services/issues/create_service.rb +++ b/app/services/issues/create_service.rb @@ -15,7 +15,7 @@ module Issues def before_create(issuable) if @recaptcha_verified spam_log = current_user.spam_logs.find_by(id: @spam_log_id, title: issuable.title) - spam_log.update!(recaptcha_verified: true) if spam_log + spam_log&.update!(recaptcha_verified: true) else issuable.spam = spam_service.check(@api) issuable.spam_log = spam_service.spam_log From 188c231304845ff29506dc152aaea6ec42373015 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 13 Feb 2017 21:01:35 +0800 Subject: [PATCH 126/313] Add a test to make sure the queue ticks when updating runners --- spec/requests/api/runners_spec.rb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spec/requests/api/runners_spec.rb b/spec/requests/api/runners_spec.rb index f2d81a28cb8..daef9062e7d 100644 --- a/spec/requests/api/runners_spec.rb +++ b/spec/requests/api/runners_spec.rb @@ -183,6 +183,7 @@ describe API::Runners, api: true do it 'updates runner' do description = shared_runner.description active = shared_runner.active + runner_queue_value = shared_runner.ensure_runner_queue_value update_runner(shared_runner.id, admin, description: "#{description}_updated", active: !active, @@ -197,18 +198,24 @@ describe API::Runners, api: true do expect(shared_runner.tag_list).to include('ruby2.1', 'pgsql', 'mysql') expect(shared_runner.run_untagged?).to be(false) expect(shared_runner.locked?).to be(true) + expect(shared_runner.ensure_runner_queue_value) + .not_to eq(runner_queue_value) end end context 'when runner is not shared' do it 'updates runner' do description = specific_runner.description + runner_queue_value = specific_runner.ensure_runner_queue_value + update_runner(specific_runner.id, admin, description: 'test') specific_runner.reload expect(response).to have_http_status(200) expect(specific_runner.description).to eq('test') expect(specific_runner.description).not_to eq(description) + expect(specific_runner.ensure_runner_queue_value) + .not_to eq(runner_queue_value) end end From 7bb9cb1b0815b0b7c551e6ea74457cf099dba3b6 Mon Sep 17 00:00:00 2001 From: Pedro Moreira da Silva Date: Mon, 13 Feb 2017 13:27:49 +0000 Subject: [PATCH 127/313] Fix UX Guide apostrophe use for singular common nouns --- doc/development/ux_guide/copy.md | 384 +++++++++++++++---------------- 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/doc/development/ux_guide/copy.md b/doc/development/ux_guide/copy.md index 5b65d531e54..9414aafaadf 100644 --- a/doc/development/ux_guide/copy.md +++ b/doc/development/ux_guide/copy.md @@ -1,193 +1,193 @@ -# Copy - -The copy for GitLab is clear and direct. We strike a clear balance between professional and friendly. We can empathesize with users (such as celebrating completing all Todos), and remain respectful of the importance of the work. We are that trusted, friendly coworker that is helpful and understanding. - -The copy and messaging is a core part of the experience of GitLab and the conversation with our users. Follow the below conventions throughout GitLab. - -Portions of this page are inspired by work found in the [Material Design guidelines][material design]. - ->**Note:** -We are currently inconsistent with this guidance. Images below are created to illustrate the point. As this guidance is refined, we will ensure that our experiences align. - -## Contents -* [Brevity](#brevity) -* [Capitalization and punctuation](#capitalization-and-punctuation) -* [Terminology](#terminology) - ---- - -## Brevity -Users will skim content, rather than read text carefully. -When familiar with a web app, users rely on muscle memory, and may read even less when moving quickly. -A good experience should quickly orient a user, regardless of their experience, to the purpose of the current screen. This should happen without the user having to consciously read long strings of text. -In general, text is burdensome and adds cognitive load. This is especially pronounced in a powerful productivity tool such as GitLab. -We should _not_ rely on words as a crutch to explain the purpose of a screen. -The current navigation and composition of the elements on the screen should get the user 95% there, with the remaining 5% being specific elements such as text. -This means that, as a rule, copy should be very short. A long message or label is a red flag hinting at design that needs improvement. - ->**Example:** -Use `Add` instead of `Add issue` as a button label. -Preferrably use context and placement of controls to make it obvious what clicking on them will do. - ---- - -## Capitalization and punctuation - -### Case -Use sentence case for titles, headings, labels, menu items, and buttons. Use title case when referring to [features][features] or [products][products]. Note that some features are also objects (e.g. “Merge Requests” and “merge requests”). - -| :white_check_mark: Do | :no_entry_sign: Don’t | -| --- | --- | -| Add issues to the Issue Board feature in GitLab Hosted | Add Issues To The Issue Board Feature In GitLab Hosted | - -### Avoid periods -Avoid using periods in solitary sentences in these elements: - -* Labels -* Hover text -* Bulleted lists -* Dialog body text - -Periods should be used for: - -* Lists or dialogs with multiple sentences -* Any sentence followed by a link - -| :white_check_mark: **Do** place periods after sentences followed by a link | :no_entry_sign: **Don’t** place periods after a link if it‘s not followed by a sentence | -| --- | --- | -| Mention someone to notify them. [Learn more](#) | Mention someone to notify them. [Learn more](#). | - -| :white_check_mark: **Do** skip periods after solo sentences of body text | :no_entry_sign: **Don’t** place periods after body text if there is only a single sentence | -| --- | --- | -| To see the available commands, enter `/gitlab help` | To see the available commands, enter `/gitlab help`. | - -### Use contractions -Don’t make a sentence harder to understand just to follow this rule. For example, “do not” can give more emphasis than “don’t” when needed. - -| :white_check_mark: Do | :no_entry_sign: Don’t | -| --- | --- | -| it’s, can’t, wouldn’t, you’re, you’ve, haven’t, don’t | it is, cannot, would not, it’ll, should’ve | - -### Use numerals for numbers -Use “1, 2, 3” instead of “one, two, three” for numbers. One exception is when mixing uses of numbers, such as “Enter two 3s.” - -| :white_check_mark: Do | :no_entry_sign: Don’t | -| --- | --- | -| 3 new commits | Three new commits | - -### Punctuation -Omit punctuation after phrases and labels to create a cleaner and more readable interface. Use punctuation to add clarity or be grammatically correct. - -| Punctuation mark | Copy and paste | HTML entity | Unicode | Mac shortcut | Windows shortcut | Description | -|---|---|---|---|---|---|---| -| Period | **.** | | | | | Omit for single sentences in affordances like labels, hover text, bulleted lists, and dialog body text.

Use in lists or dialogs with multiple sentences, and any sentence followed by a link or inline code.

Place inside quotation marks unless you’re telling the reader what to enter and it’s ambiguous whether to include the period. | -| Comma | **,** | | | | | Place inside quotation marks.

Use a [serial comma][serial comma] in lists of three or more terms. | -| Exclamation point | **!** | | | | | Avoid exclamation points as they tend to come across as shouting. Some exceptions include greetings or congratulatory messages. | -| Colon | **:** | `:` | `\u003A` | | | Omit from labels, for example, in the labels for fields in a form. | -| Apostrophe | **’** | `’` | `\u2019` | ⌥ Option+⇧ Shift+] | Alt+0 1 4 6 | Use for contractions (I’m, you’re, ’89) and to show possession.

To show possession, add an *’s* to all single nouns and names, even if they already end in an *s*: “Your issues’s status was changed.” For singular proper names ending in *s*, use only an apostrophe: “James’ commits.” For plurals of a single letter, add an *’s*: “Dot your i’s and cross your t’s.”

Omit for decades or acronyms: “the 1990s”, “MRs.” | -| Quotation marks | **“**

**”**

**‘**

**’** | `“`

`”`

`‘`

`’` | `\u201C`

`\u201D`

`\u2018`

`\u2019` | ⌥ Option+[

⌥ Option+⇧ Shift+[

⌥ Option+]

⌥ Option+⇧ Shift+] | Alt+0 1 4 7

Alt+0 1 4 8

Alt+0 1 4 5

Alt+0 1 4 6 | Use proper quotation marks (also known as smart quotes, curly quotes, or typographer’s quotes) for quotes. Single quotation marks are used for quotes inside of quotes.

The right single quotation mark symbol is also used for apostrophes.

Don’t use primes, straight quotes, or free-standing accents for quotation marks. | -| Primes | **′**

**″** | `′`

`″` | `\u2032`

`\u2033` | | Alt+8 2 4 2

Alt+8 2 4 3 | Use prime (′) only in abbreviations for feet, arcminutes, and minutes: 3° 15′

Use double-prime (″) only in abbreviations for inches, arcseconds, and seconds: 3° 15′ 35″

Don’t use quotation marks, straight quotes, or free-standing accents for primes. | -| Straight quotes and accents | **"**

**'**

**`**

**´** | `"`

`'`

```

`´` | `\u0022`

`\u0027`

`\u0060`

`\u00B4` | | | Don’t use straight quotes or free-standing accents for primes or quotation marks.

Proper typography never uses straight quotes. They are left over from the age of typewriters and their only modern use is for code. | -| Ellipsis | **…** | `…` | | ⌥ Option+; | Alt+0 1 3 3 | Use to indicate an action in progress (“Downloading…”) or incomplete or truncated text. No space before the ellipsis.

Omit from menu items or buttons that open a dialog or start some other process. | -| Chevrons | **«**

**»**

**‹**

**›**

**<**

**>** | `«`

`»`

`‹`

`›`

`<`

`>` | `\u00AB`

`\u00BB`

`\u2039`

`\u203A`

`\u003C`

`\u003E`

| | | Omit from links or buttons that open another page or move to the next or previous step in a process. Also known as angle brackets, angular quote brackets, or guillemets. | -| Em dash | **—** | `—` | `\u2014` | ⌥ Option+⇧ Shift+- | Alt+0 1 5 1 | Avoid using dashes to separate text. If you must use dashes for this purpose — like this — use an em dash surrounded by spaces. | -| En dash | **–** | `–` | `\u2013` | ⌥ Option+- | Alt+0 1 5 0 | Use an en dash without spaces instead of a hyphen to indicate a range of values, such as numbers, times, and dates: “3–5 kg”, “8:00 AM–12:30 PM”, “10–17 Jan” | -| Hyphen | **-** | | | | | Use to represent negative numbers, or to avoid ambiguity in adjective-noun or noun-participle pairs. Example: “anti-inflammatory”; “5-mile walk.”

Omit in commonly understood terms and adverbs that end in *ly*: “frontend”, “greatly improved performance.”

Omit in the term “open source.” | -| Parentheses | **( )** | | | | | Use only to define acronyms or jargon: “Secure web connections are based on a technology called SSL (the secure sockets layer).”

Avoid other uses and instead rewrite the text, or use dashes or commas to set off the information. If parentheses are required: If the parenthetical is a complete, independent sentence, place the period inside the parentheses; if not, the period goes outside. | - -When using the Alt keystrokes in Windows, use the numeric keypad, not the row of numbers above the alphabet, and be sure Num Lock is turned on. - ---- - -## Terminology -Only use the terms in the tables below. - -### Projects and Groups - -| Term | Use | :no_entry_sign: Don't | -| ---- | --- | ----- | -| Members | When discussing the people who are a part of a project or a group. | Don't use `users`. | - -### Issues - -#### Adjectives (states) - -| Term | -| ---- | -| Open | -| Closed | -| Deleted | - ->**Example:** -Use `5 open issues` and don’t use `5 pending issues`. - -#### Verbs (actions) - -| Term | Use | :no_entry_sign: Don’t | -| ---- | --- | --- | -| Add | Add an issue | Don’t use `create` or `new` | -| View | View an open or closed issue || -| Edit | Edit an open or closed issue | Don’t use `update` | -| Close | Close an open issue || -| Re-open | Re-open a closed issue | There should never be a need to use `open` as a verb | -| Delete | Delete an open or closed issue || - -#### Add issue - -When viewing a list of issues, there is a button that is labeled `Add`. Given the context in the example, it is clearly referring to issues. If the context were not clear enough, the label could be `Add issue`. Clicking the button will bring you to the `Add issue` form. Other add flows should be similar. - -![Add issue button](img/copy-form-addissuebutton.png) - -The form should be titled `Add issue`. The submit button should be labeled `Submit`. Don’t use `Add`, `Create`, `New`, or `Save changes`. The cancel button should be labeled `Cancel`. Don’t use `Back`. - -![Add issue form](img/copy-form-addissueform.png) - -#### Edit issue - -When in context of an issue, the affordance to edit it is labeled `Edit`. If the context is not clear enough, `Edit issue` could be considered. Other edit flows should be similar. - -![Edit issue button](img/copy-form-editissuebutton.png) - -The form should be titled `Edit issue`. The submit button should be labeled `Save`. Don’t use `Edit`, `Update`, `Submit`, or `Save changes`. The cancel button should be labeled `Cancel`. Don’t use `Back`. - -![Edit issue form](img/copy-form-editissueform.png) - - -### Merge requests - -#### Adjectives (states) - -| Term | -| ---- | -| Open | -| Merged | - -#### Verbs (actions) - -| Term | Use | :no_entry_sign: Don’t | -| ---- | --- | --- | -| Add | Add a merge request | Do not use `create` or `new` | -| View | View an open or merged merge request || -| Edit | Edit an open or merged merge request| Do not use `update` | -| Approve | Approve an open merge request || -| Remove approval, unapproved | Remove approval of an open merge request | Do not use `unapprove` as that is not an English word| -| Merge | Merge an open merge request || - -### Comments & Discussions - -#### Comment -A **comment** is a written piece of text that users of GitLab can create. Comments have the meta data of author and timestamp. Comments can be added in a variety of contexts, such as issues, merge requests, and discussions. - -#### Discussion -A **discussion** is a group of 1 or more comments. A discussion can include subdiscussions. Some discussions have the special capability of being able to be **resolved**. Both the comments in the discussion and the discussion itself can be resolved. - ---- - -Portions of this page are modifications based on work created and shared by the [Android Open Source Project][android project] and used according to terms described in the [Creative Commons 2.5 Attribution License][creative commons]. - -[material design]: https://material.io/guidelines/ -[features]: https://about.gitlab.com/features/ "GitLab features page" -[products]: https://about.gitlab.com/products/ "GitLab products page" -[serial comma]: https://en.wikipedia.org/wiki/Serial_comma "“Serial comma” in Wikipedia" -[android project]: http://source.android.com/ +# Copy + +The copy for GitLab is clear and direct. We strike a clear balance between professional and friendly. We can empathesize with users (such as celebrating completing all Todos), and remain respectful of the importance of the work. We are that trusted, friendly coworker that is helpful and understanding. + +The copy and messaging is a core part of the experience of GitLab and the conversation with our users. Follow the below conventions throughout GitLab. + +Portions of this page are inspired by work found in the [Material Design guidelines][material design]. + +>**Note:** +We are currently inconsistent with this guidance. Images below are created to illustrate the point. As this guidance is refined, we will ensure that our experiences align. + +## Contents +* [Brevity](#brevity) +* [Capitalization and punctuation](#capitalization-and-punctuation) +* [Terminology](#terminology) + +--- + +## Brevity +Users will skim content, rather than read text carefully. +When familiar with a web app, users rely on muscle memory, and may read even less when moving quickly. +A good experience should quickly orient a user, regardless of their experience, to the purpose of the current screen. This should happen without the user having to consciously read long strings of text. +In general, text is burdensome and adds cognitive load. This is especially pronounced in a powerful productivity tool such as GitLab. +We should _not_ rely on words as a crutch to explain the purpose of a screen. +The current navigation and composition of the elements on the screen should get the user 95% there, with the remaining 5% being specific elements such as text. +This means that, as a rule, copy should be very short. A long message or label is a red flag hinting at design that needs improvement. + +>**Example:** +Use `Add` instead of `Add issue` as a button label. +Preferrably use context and placement of controls to make it obvious what clicking on them will do. + +--- + +## Capitalization and punctuation + +### Case +Use sentence case for titles, headings, labels, menu items, and buttons. Use title case when referring to [features][features] or [products][products]. Note that some features are also objects (e.g. “Merge Requests” and “merge requests”). + +| :white_check_mark: Do | :no_entry_sign: Don’t | +| --- | --- | +| Add issues to the Issue Board feature in GitLab Hosted | Add Issues To The Issue Board Feature In GitLab Hosted | + +### Avoid periods +Avoid using periods in solitary sentences in these elements: + +* Labels +* Hover text +* Bulleted lists +* Dialog body text + +Periods should be used for: + +* Lists or dialogs with multiple sentences +* Any sentence followed by a link + +| :white_check_mark: **Do** place periods after sentences followed by a link | :no_entry_sign: **Don’t** place periods after a link if it‘s not followed by a sentence | +| --- | --- | +| Mention someone to notify them. [Learn more](#) | Mention someone to notify them. [Learn more](#). | + +| :white_check_mark: **Do** skip periods after solo sentences of body text | :no_entry_sign: **Don’t** place periods after body text if there is only a single sentence | +| --- | --- | +| To see the available commands, enter `/gitlab help` | To see the available commands, enter `/gitlab help`. | + +### Use contractions +Don’t make a sentence harder to understand just to follow this rule. For example, “do not” can give more emphasis than “don’t” when needed. + +| :white_check_mark: Do | :no_entry_sign: Don’t | +| --- | --- | +| it’s, can’t, wouldn’t, you’re, you’ve, haven’t, don’t | it is, cannot, would not, it’ll, should’ve | + +### Use numerals for numbers +Use “1, 2, 3” instead of “one, two, three” for numbers. One exception is when mixing uses of numbers, such as “Enter two 3s.” + +| :white_check_mark: Do | :no_entry_sign: Don’t | +| --- | --- | +| 3 new commits | Three new commits | + +### Punctuation +Omit punctuation after phrases and labels to create a cleaner and more readable interface. Use punctuation to add clarity or be grammatically correct. + +| Punctuation mark | Copy and paste | HTML entity | Unicode | Mac shortcut | Windows shortcut | Description | +|---|---|---|---|---|---|---| +| Period | **.** | | | | | Omit for single sentences in affordances like labels, hover text, bulleted lists, and dialog body text.

Use in lists or dialogs with multiple sentences, and any sentence followed by a link or inline code.

Place inside quotation marks unless you’re telling the reader what to enter and it’s ambiguous whether to include the period. | +| Comma | **,** | | | | | Place inside quotation marks.

Use a [serial comma][serial comma] in lists of three or more terms. | +| Exclamation point | **!** | | | | | Avoid exclamation points as they tend to come across as shouting. Some exceptions include greetings or congratulatory messages. | +| Colon | **:** | `:` | `\u003A` | | | Omit from labels, for example, in the labels for fields in a form. | +| Apostrophe | **’** | `’` | `\u2019` | ⌥ Option+⇧ Shift+] | Alt+0 1 4 6 | Use for contractions (I’m, you’re, ’89) and to show possession.

To show possession, add an *’s* to all singular common nouns and names, even if they already end in an *s*: “Look into this worker process’s log.” For singular proper names ending in *s*, use only an apostrophe: “James’ commits.” For plurals of a single letter, add an *’s*: “Dot your i’s and cross your t’s.”

Omit for decades or acronyms: “the 1990s”, “MRs.” | +| Quotation marks | **“**

**”**

**‘**

**’** | `“`

`”`

`‘`

`’` | `\u201C`

`\u201D`

`\u2018`

`\u2019` | ⌥ Option+[

⌥ Option+⇧ Shift+[

⌥ Option+]

⌥ Option+⇧ Shift+] | Alt+0 1 4 7

Alt+0 1 4 8

Alt+0 1 4 5

Alt+0 1 4 6 | Use proper quotation marks (also known as smart quotes, curly quotes, or typographer’s quotes) for quotes. Single quotation marks are used for quotes inside of quotes.

The right single quotation mark symbol is also used for apostrophes.

Don’t use primes, straight quotes, or free-standing accents for quotation marks. | +| Primes | **′**

**″** | `′`

`″` | `\u2032`

`\u2033` | | Alt+8 2 4 2

Alt+8 2 4 3 | Use prime (′) only in abbreviations for feet, arcminutes, and minutes: 3° 15′

Use double-prime (″) only in abbreviations for inches, arcseconds, and seconds: 3° 15′ 35″

Don’t use quotation marks, straight quotes, or free-standing accents for primes. | +| Straight quotes and accents | **"**

**'**

**`**

**´** | `"`

`'`

```

`´` | `\u0022`

`\u0027`

`\u0060`

`\u00B4` | | | Don’t use straight quotes or free-standing accents for primes or quotation marks.

Proper typography never uses straight quotes. They are left over from the age of typewriters and their only modern use is for code. | +| Ellipsis | **…** | `…` | | ⌥ Option+; | Alt+0 1 3 3 | Use to indicate an action in progress (“Downloading…”) or incomplete or truncated text. No space before the ellipsis.

Omit from menu items or buttons that open a dialog or start some other process. | +| Chevrons | **«**

**»**

**‹**

**›**

**<**

**>** | `«`

`»`

`‹`

`›`

`<`

`>` | `\u00AB`

`\u00BB`

`\u2039`

`\u203A`

`\u003C`

`\u003E`

| | | Omit from links or buttons that open another page or move to the next or previous step in a process. Also known as angle brackets, angular quote brackets, or guillemets. | +| Em dash | **—** | `—` | `\u2014` | ⌥ Option+⇧ Shift+- | Alt+0 1 5 1 | Avoid using dashes to separate text. If you must use dashes for this purpose — like this — use an em dash surrounded by spaces. | +| En dash | **–** | `–` | `\u2013` | ⌥ Option+- | Alt+0 1 5 0 | Use an en dash without spaces instead of a hyphen to indicate a range of values, such as numbers, times, and dates: “3–5 kg”, “8:00 AM–12:30 PM”, “10–17 Jan” | +| Hyphen | **-** | | | | | Use to represent negative numbers, or to avoid ambiguity in adjective-noun or noun-participle pairs. Example: “anti-inflammatory”; “5-mile walk.”

Omit in commonly understood terms and adverbs that end in *ly*: “frontend”, “greatly improved performance.”

Omit in the term “open source.” | +| Parentheses | **( )** | | | | | Use only to define acronyms or jargon: “Secure web connections are based on a technology called SSL (the secure sockets layer).”

Avoid other uses and instead rewrite the text, or use dashes or commas to set off the information. If parentheses are required: If the parenthetical is a complete, independent sentence, place the period inside the parentheses; if not, the period goes outside. | + +When using the Alt keystrokes in Windows, use the numeric keypad, not the row of numbers above the alphabet, and be sure Num Lock is turned on. + +--- + +## Terminology +Only use the terms in the tables below. + +### Projects and Groups + +| Term | Use | :no_entry_sign: Don't | +| ---- | --- | ----- | +| Members | When discussing the people who are a part of a project or a group. | Don't use `users`. | + +### Issues + +#### Adjectives (states) + +| Term | +| ---- | +| Open | +| Closed | +| Deleted | + +>**Example:** +Use `5 open issues` and don’t use `5 pending issues`. + +#### Verbs (actions) + +| Term | Use | :no_entry_sign: Don’t | +| ---- | --- | --- | +| Add | Add an issue | Don’t use `create` or `new` | +| View | View an open or closed issue || +| Edit | Edit an open or closed issue | Don’t use `update` | +| Close | Close an open issue || +| Re-open | Re-open a closed issue | There should never be a need to use `open` as a verb | +| Delete | Delete an open or closed issue || + +#### Add issue + +When viewing a list of issues, there is a button that is labeled `Add`. Given the context in the example, it is clearly referring to issues. If the context were not clear enough, the label could be `Add issue`. Clicking the button will bring you to the `Add issue` form. Other add flows should be similar. + +![Add issue button](img/copy-form-addissuebutton.png) + +The form should be titled `Add issue`. The submit button should be labeled `Submit`. Don’t use `Add`, `Create`, `New`, or `Save changes`. The cancel button should be labeled `Cancel`. Don’t use `Back`. + +![Add issue form](img/copy-form-addissueform.png) + +#### Edit issue + +When in context of an issue, the affordance to edit it is labeled `Edit`. If the context is not clear enough, `Edit issue` could be considered. Other edit flows should be similar. + +![Edit issue button](img/copy-form-editissuebutton.png) + +The form should be titled `Edit issue`. The submit button should be labeled `Save`. Don’t use `Edit`, `Update`, `Submit`, or `Save changes`. The cancel button should be labeled `Cancel`. Don’t use `Back`. + +![Edit issue form](img/copy-form-editissueform.png) + + +### Merge requests + +#### Adjectives (states) + +| Term | +| ---- | +| Open | +| Merged | + +#### Verbs (actions) + +| Term | Use | :no_entry_sign: Don’t | +| ---- | --- | --- | +| Add | Add a merge request | Do not use `create` or `new` | +| View | View an open or merged merge request || +| Edit | Edit an open or merged merge request| Do not use `update` | +| Approve | Approve an open merge request || +| Remove approval, unapproved | Remove approval of an open merge request | Do not use `unapprove` as that is not an English word| +| Merge | Merge an open merge request || + +### Comments & Discussions + +#### Comment +A **comment** is a written piece of text that users of GitLab can create. Comments have the meta data of author and timestamp. Comments can be added in a variety of contexts, such as issues, merge requests, and discussions. + +#### Discussion +A **discussion** is a group of 1 or more comments. A discussion can include subdiscussions. Some discussions have the special capability of being able to be **resolved**. Both the comments in the discussion and the discussion itself can be resolved. + +--- + +Portions of this page are modifications based on work created and shared by the [Android Open Source Project][android project] and used according to terms described in the [Creative Commons 2.5 Attribution License][creative commons]. + +[material design]: https://material.io/guidelines/ +[features]: https://about.gitlab.com/features/ "GitLab features page" +[products]: https://about.gitlab.com/products/ "GitLab products page" +[serial comma]: https://en.wikipedia.org/wiki/Serial_comma "“Serial comma” in Wikipedia" +[android project]: http://source.android.com/ [creative commons]: http://creativecommons.org/licenses/by/2.5/ \ No newline at end of file From a9924ee4d299b96da1e8dd58a6c9ed42b5dfacbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Thu, 9 Feb 2017 12:19:32 +0100 Subject: [PATCH 128/313] Don't instantiate AR objects in Event.in_projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- app/models/event.rb | 2 +- .../unreleased/27395-reduce-group-activity-sql-queries.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27395-reduce-group-activity-sql-queries.yml diff --git a/app/models/event.rb b/app/models/event.rb index 2662f170765..c90fee95426 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -36,7 +36,7 @@ class Event < ActiveRecord::Base scope :code_push, -> { where(action: PUSHED) } scope :in_projects, ->(projects) do - where(project_id: projects.map(&:id)).recent + where(project_id: projects).recent end scope :with_associations, -> { includes(project: :namespace) } diff --git a/changelogs/unreleased/27395-reduce-group-activity-sql-queries.yml b/changelogs/unreleased/27395-reduce-group-activity-sql-queries.yml new file mode 100644 index 00000000000..3f6d922f2a0 --- /dev/null +++ b/changelogs/unreleased/27395-reduce-group-activity-sql-queries.yml @@ -0,0 +1,4 @@ +--- +title: Don't instantiate AR objects in Event.in_projects +merge_request: +author: From 473b04a9f07ded15538af23f986ec618f5f8160c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Thu, 9 Feb 2017 12:19:55 +0100 Subject: [PATCH 129/313] Include :author, :project, and :target in Event.with_associations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- app/models/event.rb | 2 +- .../unreleased/27395-reduce-group-activity-sql-queries-2.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27395-reduce-group-activity-sql-queries-2.yml diff --git a/app/models/event.rb b/app/models/event.rb index c90fee95426..57f441187b4 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -39,7 +39,7 @@ class Event < ActiveRecord::Base where(project_id: projects).recent end - scope :with_associations, -> { includes(project: :namespace) } + scope :with_associations, -> { includes(:author, :project, :target, project: :namespace) } scope :for_milestone_id, ->(milestone_id) { where(target_type: "Milestone", target_id: milestone_id) } class << self diff --git a/changelogs/unreleased/27395-reduce-group-activity-sql-queries-2.yml b/changelogs/unreleased/27395-reduce-group-activity-sql-queries-2.yml new file mode 100644 index 00000000000..f3ce1709518 --- /dev/null +++ b/changelogs/unreleased/27395-reduce-group-activity-sql-queries-2.yml @@ -0,0 +1,4 @@ +--- +title: Include :author, :project, and :target in Event.with_associations +merge_request: +author: From 1698d71ccfce229b8d7c36a87a67764d53e97c8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Mon, 13 Feb 2017 15:19:03 +0100 Subject: [PATCH 130/313] Use preload for Event#target since it's a polymorphic association MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also, don't use limit in subquery, MySQL don't like that. Signed-off-by: Rémy Coutable --- .../dashboard/projects_controller.rb | 23 +++++++++---------- app/models/event.rb | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/controllers/dashboard/projects_controller.rb b/app/controllers/dashboard/projects_controller.rb index 3ba8c2f8bb9..325ae565537 100644 --- a/app/controllers/dashboard/projects_controller.rb +++ b/app/controllers/dashboard/projects_controller.rb @@ -1,19 +1,14 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController include FilterProjects - before_action :event_filter - def index - @projects = current_user.authorized_projects.sorted_by_activity - @projects = filter_projects(@projects) - @projects = @projects.includes(:namespace) + @projects = load_projects(current_user.authorized_projects) @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.page(params[:page]) respond_to do |format| format.html { @last_push = current_user.recent_push } format.atom do - event_filter load_events render layout: false end @@ -26,9 +21,8 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController end def starred - @projects = current_user.viewable_starred_projects.sorted_by_activity - @projects = filter_projects(@projects) - @projects = @projects.includes(:namespace, :forked_from_project, :tags) + @projects = load_projects(current_user.viewable_starred_projects) + @projects = @projects.includes(:forked_from_project, :tags) @projects = @projects.sort(@sort = params[:sort]) @projects = @projects.page(params[:page]) @@ -37,7 +31,6 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController respond_to do |format| format.html - format.json do render json: { html: view_to_html_string("dashboard/projects/_projects", locals: { projects: @projects }) @@ -48,9 +41,15 @@ class Dashboard::ProjectsController < Dashboard::ApplicationController private + def load_projects(base_scope) + projects = base_scope.sorted_by_activity.includes(:namespace) + + filter_projects(projects) + end + def load_events - @events = Event.in_projects(@projects) - @events = @event_filter.apply_filter(@events).with_associations + @events = Event.in_projects(load_projects(current_user.authorized_projects)) + @events = event_filter.apply_filter(@events).with_associations @events = @events.limit(20).offset(params[:offset] || 0) end end diff --git a/app/models/event.rb b/app/models/event.rb index 57f441187b4..cf89ac5207f 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -39,7 +39,7 @@ class Event < ActiveRecord::Base where(project_id: projects).recent end - scope :with_associations, -> { includes(:author, :project, :target, project: :namespace) } + scope :with_associations, -> { includes(:author, :project, project: :namespace).preload(:target) } scope :for_milestone_id, ->(milestone_id) { where(target_type: "Milestone", target_id: milestone_id) } class << self From 950e2986656e17948ef227985d786ee22fb92fb2 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 08:36:24 -0600 Subject: [PATCH 131/313] Change wording of MR comment box --- app/views/projects/notes/_hints.html.haml | 1 - spec/views/projects/notes/_form.html.haml_spec.rb | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/views/projects/notes/_hints.html.haml b/app/views/projects/notes/_hints.html.haml index 6c14f48d41b..81d97eabe65 100644 --- a/app/views/projects/notes/_hints.html.haml +++ b/app/views/projects/notes/_hints.html.haml @@ -1,7 +1,6 @@ - supports_slash_commands = local_assigns.fetch(:supports_slash_commands, false) .comment-toolbar.clearfix .toolbar-text - Styling with = link_to 'Markdown', help_page_path('user/markdown'), target: '_blank', tabindex: -1 - if supports_slash_commands and diff --git a/spec/views/projects/notes/_form.html.haml_spec.rb b/spec/views/projects/notes/_form.html.haml_spec.rb index b14b1ece2d0..b61f016967f 100644 --- a/spec/views/projects/notes/_form.html.haml_spec.rb +++ b/spec/views/projects/notes/_form.html.haml_spec.rb @@ -21,7 +21,7 @@ describe 'projects/notes/_form' do let(:note) { build(:"note_on_#{noteable}", project: project) } it 'says that only markdown is supported, not slash commands' do - expect(rendered).to have_content('Styling with Markdown and slash commands are supported') + expect(rendered).to have_content('Markdown and slash commands are supported') end end end @@ -30,7 +30,7 @@ describe 'projects/notes/_form' do let(:note) { build(:note_on_commit, project: project) } it 'says that only markdown is supported, not slash commands' do - expect(rendered).to have_content('Styling with Markdown is supported') + expect(rendered).to have_content('Markdown is supported') end end end From e31b982a13413151dd7317ee15aadcbde0f72edb Mon Sep 17 00:00:00 2001 From: Pawel Chojnacki Date: Tue, 7 Feb 2017 13:56:50 +0100 Subject: [PATCH 132/313] Make deploy key not show in User's keys list --- app/models/user.rb | 7 ++++- ..._should_not_show_up_in_users_keys_list.yml | 4 +++ .../profiles/keys_controller_spec.rb | 19 ++++++------ spec/factories/keys.rb | 7 +++-- spec/models/user_spec.rb | 29 +++++++++++++++++++ 5 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 changelogs/unreleased/27480-deploy_keys_should_not_show_up_in_users_keys_list.yml diff --git a/app/models/user.rb b/app/models/user.rb index 867e61af56a..1649bf04eaa 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -51,7 +51,12 @@ class User < ActiveRecord::Base has_one :namespace, -> { where type: nil }, dependent: :destroy, foreign_key: :owner_id # Profile - has_many :keys, dependent: :destroy + has_many :keys, -> do + type = Key.arel_table[:type] + where(type.not_eq('DeployKey').or(type.eq(nil))) + end, dependent: :destroy + has_many :deploy_keys, -> { where(type: 'DeployKey') }, dependent: :destroy + has_many :emails, dependent: :destroy has_many :personal_access_tokens, dependent: :destroy has_many :identities, dependent: :destroy, autosave: true diff --git a/changelogs/unreleased/27480-deploy_keys_should_not_show_up_in_users_keys_list.yml b/changelogs/unreleased/27480-deploy_keys_should_not_show_up_in_users_keys_list.yml new file mode 100644 index 00000000000..6e9192cb632 --- /dev/null +++ b/changelogs/unreleased/27480-deploy_keys_should_not_show_up_in_users_keys_list.yml @@ -0,0 +1,4 @@ +--- +title: Do not display deploy keys in user's own ssh keys list +merge_request: 9024 +author: diff --git a/spec/controllers/profiles/keys_controller_spec.rb b/spec/controllers/profiles/keys_controller_spec.rb index 6bcfae0fc13..f7219690722 100644 --- a/spec/controllers/profiles/keys_controller_spec.rb +++ b/spec/controllers/profiles/keys_controller_spec.rb @@ -42,10 +42,9 @@ describe Profiles::KeysController do end describe "user with keys" do - before do - user.keys << create(:key) - user.keys << create(:another_key) - end + let!(:key) { create(:key, user: user) } + let!(:another_key) { create(:another_key, user: user) } + let!(:deploy_key) { create(:deploy_key, user: user) } it "does generally work" do get :get_keys, username: user.username @@ -53,16 +52,16 @@ describe Profiles::KeysController do expect(response).to be_success end - it "renders all keys separated with a new line" do + it "renders all non deploy keys separated with a new line" do get :get_keys, username: user.username - expect(response.body).not_to eq("") + expect(response.body).not_to eq('') expect(response.body).to eq(user.all_ssh_keys.join("\n")) - # Unique part of key 1 - expect(response.body).to match(/PWx6WM4lhHNedGfBpPJNPpZ/) - # Key 2 - expect(response.body).to match(/AQDmTillFzNTrrGgwaCKaSj/) + expect(response.body).to include(key.key.sub(' dummy@gitlab.com', '')) + expect(response.body).to include(another_key.key) + + expect(response.body).not_to include(deploy_key.key) end it "does not render the comment of the key" do diff --git a/spec/factories/keys.rb b/spec/factories/keys.rb index d69c5b38d0a..dd93b439b2b 100644 --- a/spec/factories/keys.rb +++ b/spec/factories/keys.rb @@ -2,10 +2,13 @@ FactoryGirl.define do factory :key do title key do - "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= dummy@gitlab.com" + 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0= dummy@gitlab.com' end factory :deploy_key, class: 'DeployKey' do + key do + 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFf6RYK3qu/RKF/3ndJmL5xgMLp3O96x8lTay+QGZ0+9FnnAXMdUqBq/ZU6d/gyMB4IaW3nHzM1w049++yAB6UPCzMB8Uo27K5/jyZCtj7Vm9PFNjF/8am1kp46c/SeYicQgQaSBdzIW3UDEa1Ef68qroOlvpi9PYZ/tA7M0YP0K5PXX+E36zaIRnJVMPT3f2k+GnrxtjafZrwFdpOP/Fol5BQLBgcsyiU+LM1SuaCrzd8c9vyaTA1CxrkxaZh+buAi0PmdDtaDrHd42gqZkXCKavyvgM5o2CkQ5LJHCgzpXy05qNFzmThBSkb+XtoxbyagBiGbVZtSVow6Xa7qewz' + end end factory :personal_key do @@ -14,7 +17,7 @@ FactoryGirl.define do factory :another_key do key do - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmTillFzNTrrGgwaCKaSj+QCz81E6jBc/s9av0+3b1Hwfxgkqjl4nAK/OD2NjgyrONDTDfR8cRN4eAAy6nY8GLkOyYBDyuc5nTMqs5z3yVuTwf3koGm/YQQCmo91psZ2BgDFTor8SVEE5Mm1D1k3JDMhDFxzzrOtRYFPci9lskTJaBjpqWZ4E9rDTD2q/QZntCqbC3wE9uSemRQB5f8kik7vD/AD8VQXuzKladrZKkzkONCPWsXDspUitjM8HkQdOf0PsYn1CMUC1xKYbCxkg5TkEosIwGv6CoEArUrdu/4+10LVslq494mAvEItywzrluCLCnwELfW+h/m8UHoVhZ" + 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDmTillFzNTrrGgwaCKaSj+QCz81E6jBc/s9av0+3b1Hwfxgkqjl4nAK/OD2NjgyrONDTDfR8cRN4eAAy6nY8GLkOyYBDyuc5nTMqs5z3yVuTwf3koGm/YQQCmo91psZ2BgDFTor8SVEE5Mm1D1k3JDMhDFxzzrOtRYFPci9lskTJaBjpqWZ4E9rDTD2q/QZntCqbC3wE9uSemRQB5f8kik7vD/AD8VQXuzKladrZKkzkONCPWsXDspUitjM8HkQdOf0PsYn1CMUC1xKYbCxkg5TkEosIwGv6CoEArUrdu/4+10LVslq494mAvEItywzrluCLCnwELfW+h/m8UHoVhZ' end factory :another_deploy_key, class: 'DeployKey' do diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 7fd49c73b37..89cef7ab978 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -19,6 +19,7 @@ describe User, models: true do it { is_expected.to have_many(:project_members).dependent(:destroy) } it { is_expected.to have_many(:groups) } it { is_expected.to have_many(:keys).dependent(:destroy) } + it { is_expected.to have_many(:deploy_keys).dependent(:destroy) } it { is_expected.to have_many(:events).dependent(:destroy) } it { is_expected.to have_many(:recent_events).class_name('Event') } it { is_expected.to have_many(:issues).dependent(:destroy) } @@ -303,6 +304,34 @@ describe User, models: true do end end + shared_context 'user keys' do + let(:user) { create(:user) } + let!(:key) { create(:key, user: user) } + let!(:deploy_key) { create(:deploy_key, user: user) } + end + + describe '#keys' do + include_context 'user keys' + + context 'with key and deploy key stored' do + it 'returns stored key, but not deploy_key' do + expect(user.keys).to include key + expect(user.keys).not_to include deploy_key + end + end + end + + describe '#deploy_keys' do + include_context 'user keys' + + context 'with key and deploy key stored' do + it 'returns stored deploy key, but not normal key' do + expect(user.deploy_keys).to include deploy_key + expect(user.deploy_keys).not_to include key + end + end + end + describe '#confirm' do before do allow_any_instance_of(ApplicationSetting).to receive(:send_user_confirmation_email).and_return(true) From 217937e5699326e2897a8919f421b401d077225c Mon Sep 17 00:00:00 2001 From: Jan Christophersen Date: Mon, 13 Feb 2017 16:04:06 +0100 Subject: [PATCH 133/313] Show mentioned/issues being closed from a Merge Requests title --- app/models/merge_request.rb | 4 +-- ...ose-issues-with-merge-request-title-ui.yml | 5 +++ .../merge_requests/closes_issues_spec.rb | 32 +++++++++++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 changelogs/unreleased/24333-close-issues-with-merge-request-title-ui.yml diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index c0d4dd0197f..38646eba3ac 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -561,7 +561,7 @@ class MergeRequest < ActiveRecord::Base # Return the set of issues that will be closed if this merge request is accepted. def closes_issues(current_user = self.author) if target_branch == project.default_branch - messages = [description] + messages = [title, description] messages.concat(commits.map(&:safe_message)) if merge_request_diff Gitlab::ClosingIssueExtractor.new(project, current_user). @@ -575,7 +575,7 @@ class MergeRequest < ActiveRecord::Base return [] unless target_branch == project.default_branch ext = Gitlab::ReferenceExtractor.new(project, current_user) - ext.analyze(description) + ext.analyze("#{title}\n#{description}") ext.issues - closes_issues(current_user) end diff --git a/changelogs/unreleased/24333-close-issues-with-merge-request-title-ui.yml b/changelogs/unreleased/24333-close-issues-with-merge-request-title-ui.yml new file mode 100644 index 00000000000..fa137a29cb4 --- /dev/null +++ b/changelogs/unreleased/24333-close-issues-with-merge-request-title-ui.yml @@ -0,0 +1,5 @@ +--- +title: Show Issues mentioned / being closed from a Merge Requests title below the + 'Accept Merge Request' button +merge_request: 9194 +author: Jan Christophersen diff --git a/spec/features/merge_requests/closes_issues_spec.rb b/spec/features/merge_requests/closes_issues_spec.rb index c73065cdce1..eafcab6a0d7 100644 --- a/spec/features/merge_requests/closes_issues_spec.rb +++ b/spec/features/merge_requests/closes_issues_spec.rb @@ -10,10 +10,12 @@ feature 'Merge Request closing issues message', feature: true do :merge_request, :simple, source_project: project, - description: merge_request_description + description: merge_request_description, + title: merge_request_title ) end let(:merge_request_description) { 'Merge Request Description' } + let(:merge_request_title) { 'Merge Request Title' } before do project.team << [user, :master] @@ -45,8 +47,32 @@ feature 'Merge Request closing issues message', feature: true do end end - context 'closing some issues and mentioning, but not closing, others' do - let(:merge_request_description) { "Description\n\ncloses #{issue_1.to_reference}\n\n refers to #{issue_2.to_reference}" } + context 'closing some issues in title and mentioning, but not closing, others' do + let(:merge_request_title) { "closes #{issue_1.to_reference}\n\n refers to #{issue_2.to_reference}" } + + it 'does not display closing issue message' do + expect(page).to have_content("Accepting this merge request will close issue #{issue_1.to_reference}. Issue #{issue_2.to_reference} is mentioned but will not be closed.") + end + end + + context 'closing issues using title but not mentioning any other issue' do + let(:merge_request_title) { "closing #{issue_1.to_reference}, #{issue_2.to_reference}" } + + it 'does not display closing issue message' do + expect(page).to have_content("Accepting this merge request will close issues #{issue_1.to_reference} and #{issue_2.to_reference}") + end + end + + context 'mentioning issues using title but not closing them' do + let(:merge_request_title) { "Refers to #{issue_1.to_reference} and #{issue_2.to_reference}" } + + it 'does not display closing issue message' do + expect(page).to have_content("Issues #{issue_1.to_reference} and #{issue_2.to_reference} are mentioned but will not be closed.") + end + end + + context 'closing some issues using title and mentioning, but not closing, others' do + let(:merge_request_title) { "closes #{issue_1.to_reference}\n\n refers to #{issue_2.to_reference}" } it 'does not display closing issue message' do expect(page).to have_content("Accepting this merge request will close issue #{issue_1.to_reference}. Issue #{issue_2.to_reference} is mentioned but will not be closed.") From 8adc356902624960647f932a8c701dc6ba4c3bb9 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Fri, 27 Jan 2017 16:53:27 -0200 Subject: [PATCH 134/313] Remove deprecated templates endpoints in V4 --- app/assets/javascripts/api.js | 2 +- ...ce-gitignore-and-yml-endpoints-removal.yml | 4 + doc/api/v3_to_v4.md | 10 + lib/api/api.rb | 1 + lib/api/templates.rb | 95 ++++---- lib/api/v3/templates.rb | 122 +++++++++++ spec/requests/api/templates_spec.rb | 58 ++--- spec/requests/api/v3/templates_spec.rb | 203 ++++++++++++++++++ 8 files changed, 398 insertions(+), 97 deletions(-) create mode 100644 changelogs/unreleased/22818-licence-gitignore-and-yml-endpoints-removal.yml create mode 100644 lib/api/v3/templates.rb create mode 100644 spec/requests/api/v3/templates_spec.rb diff --git a/app/assets/javascripts/api.js b/app/assets/javascripts/api.js index b4a8c827d7f..84bbe90f3b1 100644 --- a/app/assets/javascripts/api.js +++ b/app/assets/javascripts/api.js @@ -11,7 +11,7 @@ licensePath: "/api/:version/templates/licenses/:key", gitignorePath: "/api/:version/templates/gitignores/:key", gitlabCiYmlPath: "/api/:version/templates/gitlab_ci_ymls/:key", - dockerfilePath: "/api/:version/dockerfiles/:key", + dockerfilePath: "/api/:version/templates/dockerfiles/:key", issuableTemplatePath: "/:namespace_path/:project_path/templates/:type/:key", group: function(group_id, callback) { var url = Api.buildUrl(Api.groupPath) diff --git a/changelogs/unreleased/22818-licence-gitignore-and-yml-endpoints-removal.yml b/changelogs/unreleased/22818-licence-gitignore-and-yml-endpoints-removal.yml new file mode 100644 index 00000000000..05d5993ddf3 --- /dev/null +++ b/changelogs/unreleased/22818-licence-gitignore-and-yml-endpoints-removal.yml @@ -0,0 +1,4 @@ +--- +title: V3 deprecated templates endpoints removal +merge_request: 8853 +author: diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md index 7cb83a337f2..0ae07b5d3de 100644 --- a/doc/api/v3_to_v4.md +++ b/doc/api/v3_to_v4.md @@ -13,3 +13,13 @@ changes are in V4: - Project snippets do not return deprecated field `expires_at` - Endpoints under `projects/:id/keys` have been removed (use `projects/:id/deploy_keys`) - Status 409 returned for POST `project/:id/members` when a member already exists +- Removed the following deprecated Templates endpoints (these are still accessible with `/templates` prefix) + - `/licences` + - `/licences/:key` + - `/gitignores` + - `/gitlab_ci_ymls` + - `/dockerfiles` + - `/gitignores/:key` + - `/gitlab_ci_ymls/:key` + - `/dockerfiles/:key` + diff --git a/lib/api/api.rb b/lib/api/api.rb index 7ec089b9c29..06346ae822a 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -11,6 +11,7 @@ module API mount ::API::V3::MergeRequests mount ::API::V3::Projects mount ::API::V3::ProjectSnippets + mount ::API::V3::Templates end before { allow_access_with_scope :api } diff --git a/lib/api/templates.rb b/lib/api/templates.rb index e23f99256a5..8a2d66efd89 100644 --- a/lib/api/templates.rb +++ b/lib/api/templates.rb @@ -24,7 +24,6 @@ module API /[\<\{\[] (fullname|name\sof\s(author|copyright\sowner)) [\>\}\]]/xi.freeze - DEPRECATION_MESSAGE = ' This endpoint is deprecated and will be removed in GitLab 9.0.'.freeze helpers do def parsed_license_template @@ -46,74 +45,58 @@ module API end end - { "licenses" => :deprecated, "templates/licenses" => :ok }.each do |route, status| - desc 'Get the list of the available license template' do - detailed_desc = 'This feature was introduced in GitLab 8.7.' - detailed_desc << DEPRECATION_MESSAGE unless status == :ok - detail detailed_desc - success Entities::RepoLicense - end - params do - optional :popular, type: Boolean, desc: 'If passed, returns only popular licenses' - end - get route do - options = { - featured: declared(params).popular.present? ? true : nil - } - present Licensee::License.all(options), with: Entities::RepoLicense - end + desc 'Get the list of the available license template' do + detail 'This feature was introduced in GitLab 8.7.' + success ::API::Entities::RepoLicense + end + params do + optional :popular, type: Boolean, desc: 'If passed, returns only popular licenses' + end + get "templates/licenses" do + options = { + featured: declared(params).popular.present? ? true : nil + } + present Licensee::License.all(options), with: ::API::Entities::RepoLicense end - { "licenses/:name" => :deprecated, "templates/licenses/:name" => :ok }.each do |route, status| - desc 'Get the text for a specific license' do - detailed_desc = 'This feature was introduced in GitLab 8.7.' - detailed_desc << DEPRECATION_MESSAGE unless status == :ok - detail detailed_desc - success Entities::RepoLicense - end - params do - requires :name, type: String, desc: 'The name of the template' - end - get route, requirements: { name: /[\w\.-]+/ } do - not_found!('License') unless Licensee::License.find(declared(params).name) + desc 'Get the text for a specific license' do + detail 'This feature was introduced in GitLab 8.7.' + success ::API::Entities::RepoLicense + end + params do + requires :name, type: String, desc: 'The name of the template' + end + get "templates/licenses/:name", requirements: { name: /[\w\.-]+/ } do + not_found!('License') unless Licensee::License.find(declared(params).name) - template = parsed_license_template + template = parsed_license_template - present template, with: Entities::RepoLicense - end + present template, with: ::API::Entities::RepoLicense end GLOBAL_TEMPLATE_TYPES.each do |template_type, properties| klass = properties[:klass] gitlab_version = properties[:gitlab_version] - { template_type => :deprecated, "templates/#{template_type}" => :ok }.each do |route, status| - desc 'Get the list of the available template' do - detailed_desc = "This feature was introduced in GitLab #{gitlab_version}." - detailed_desc << DEPRECATION_MESSAGE unless status == :ok - detail detailed_desc - success Entities::TemplatesList - end - get route do - present klass.all, with: Entities::TemplatesList - end + desc 'Get the list of the available template' do + detail "This feature was introduced in GitLab #{gitlab_version}." + success Entities::TemplatesList + end + get "templates/#{template_type}" do + present klass.all, with: Entities::TemplatesList end - { "#{template_type}/:name" => :deprecated, "templates/#{template_type}/:name" => :ok }.each do |route, status| - desc 'Get the text for a specific template present in local filesystem' do - detailed_desc = "This feature was introduced in GitLab #{gitlab_version}." - detailed_desc << DEPRECATION_MESSAGE unless status == :ok - detail detailed_desc - success Entities::Template - end - params do - requires :name, type: String, desc: 'The name of the template' - end - get route do - new_template = klass.find(declared(params).name) + desc 'Get the text for a specific template present in local filesystem' do + detail "This feature was introduced in GitLab #{gitlab_version}." + success Entities::Template + end + params do + requires :name, type: String, desc: 'The name of the template' + end + get "templates/#{template_type}/:name" do + new_template = klass.find(declared(params).name) - render_response(template_type, new_template) - end + render_response(template_type, new_template) end end end diff --git a/lib/api/v3/templates.rb b/lib/api/v3/templates.rb new file mode 100644 index 00000000000..4c577a8d2b7 --- /dev/null +++ b/lib/api/v3/templates.rb @@ -0,0 +1,122 @@ +module API + module V3 + class Templates < Grape::API + GLOBAL_TEMPLATE_TYPES = { + gitignores: { + klass: Gitlab::Template::GitignoreTemplate, + gitlab_version: 8.8 + }, + gitlab_ci_ymls: { + klass: Gitlab::Template::GitlabCiYmlTemplate, + gitlab_version: 8.9 + }, + dockerfiles: { + klass: Gitlab::Template::DockerfileTemplate, + gitlab_version: 8.15 + } + }.freeze + PROJECT_TEMPLATE_REGEX = + /[\<\{\[] + (project|description| + one\sline\s.+\swhat\sit\sdoes\.) # matching the start and end is enough here + [\>\}\]]/xi.freeze + YEAR_TEMPLATE_REGEX = /[<{\[](year|yyyy)[>}\]]/i.freeze + FULLNAME_TEMPLATE_REGEX = + /[\<\{\[] + (fullname|name\sof\s(author|copyright\sowner)) + [\>\}\]]/xi.freeze + DEPRECATION_MESSAGE = ' This endpoint is deprecated and has been removed in V4.'.freeze + + helpers do + def parsed_license_template + # We create a fresh Licensee::License object since we'll modify its + # content in place below. + template = Licensee::License.new(params[:name]) + + template.content.gsub!(YEAR_TEMPLATE_REGEX, Time.now.year.to_s) + template.content.gsub!(PROJECT_TEMPLATE_REGEX, params[:project]) if params[:project].present? + + fullname = params[:fullname].presence || current_user.try(:name) + template.content.gsub!(FULLNAME_TEMPLATE_REGEX, fullname) if fullname + template + end + + def render_response(template_type, template) + not_found!(template_type.to_s.singularize) unless template + present template, with: ::API::Entities::Template + end + end + + { "licenses" => :deprecated, "templates/licenses" => :ok }.each do |route, status| + desc 'Get the list of the available license template' do + detailed_desc = 'This feature was introduced in GitLab 8.7.' + detailed_desc << DEPRECATION_MESSAGE unless status == :ok + detail detailed_desc + success ::API::Entities::RepoLicense + end + params do + optional :popular, type: Boolean, desc: 'If passed, returns only popular licenses' + end + get route do + options = { + featured: declared(params).popular.present? ? true : nil + } + present Licensee::License.all(options), with: ::API::Entities::RepoLicense + end + end + + { "licenses/:name" => :deprecated, "templates/licenses/:name" => :ok }.each do |route, status| + desc 'Get the text for a specific license' do + detailed_desc = 'This feature was introduced in GitLab 8.7.' + detailed_desc << DEPRECATION_MESSAGE unless status == :ok + detail detailed_desc + success ::API::Entities::RepoLicense + end + params do + requires :name, type: String, desc: 'The name of the template' + end + get route, requirements: { name: /[\w\.-]+/ } do + not_found!('License') unless Licensee::License.find(declared(params).name) + + template = parsed_license_template + + present template, with: ::API::Entities::RepoLicense + end + end + + GLOBAL_TEMPLATE_TYPES.each do |template_type, properties| + klass = properties[:klass] + gitlab_version = properties[:gitlab_version] + + { template_type => :deprecated, "templates/#{template_type}" => :ok }.each do |route, status| + desc 'Get the list of the available template' do + detailed_desc = "This feature was introduced in GitLab #{gitlab_version}." + detailed_desc << DEPRECATION_MESSAGE unless status == :ok + detail detailed_desc + success ::API::Entities::TemplatesList + end + get route do + present klass.all, with: ::API::Entities::TemplatesList + end + end + + { "#{template_type}/:name" => :deprecated, "templates/#{template_type}/:name" => :ok }.each do |route, status| + desc 'Get the text for a specific template present in local filesystem' do + detailed_desc = "This feature was introduced in GitLab #{gitlab_version}." + detailed_desc << DEPRECATION_MESSAGE unless status == :ok + detail detailed_desc + success ::API::Entities::Template + end + params do + requires :name, type: String, desc: 'The name of the template' + end + get route do + new_template = klass.find(declared(params).name) + + render_response(template_type, new_template) + end + end + end + end + end +end diff --git a/spec/requests/api/templates_spec.rb b/spec/requests/api/templates_spec.rb index d32ba60fc4c..c0a8c0832bb 100644 --- a/spec/requests/api/templates_spec.rb +++ b/spec/requests/api/templates_spec.rb @@ -3,23 +3,23 @@ require 'spec_helper' describe API::Templates, api: true do include ApiHelpers - shared_examples_for 'the Template Entity' do |path| - before { get api(path) } + context 'the Template Entity' do + before { get api('/templates/gitignores/Ruby') } it { expect(json_response['name']).to eq('Ruby') } it { expect(json_response['content']).to include('*.gem') } end - - shared_examples_for 'the TemplateList Entity' do |path| - before { get api(path) } + + context 'the TemplateList Entity' do + before { get api('/templates/gitignores') } it { expect(json_response.first['name']).not_to be_nil } it { expect(json_response.first['content']).to be_nil } end - shared_examples_for 'requesting gitignores' do |path| + context 'requesting gitignores' do it 'returns a list of available gitignore templates' do - get api(path) + get api('/templates/gitignores') expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -27,9 +27,9 @@ describe API::Templates, api: true do end end - shared_examples_for 'requesting gitlab-ci-ymls' do |path| + context 'requesting gitlab-ci-ymls' do it 'returns a list of available gitlab_ci_ymls' do - get api(path) + get api('/templates/gitlab_ci_ymls') expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -37,17 +37,17 @@ describe API::Templates, api: true do end end - shared_examples_for 'requesting gitlab-ci-yml for Ruby' do |path| + context 'requesting gitlab-ci-yml for Ruby' do it 'adds a disclaimer on the top' do - get api(path) + get api('/templates/gitlab_ci_ymls/Ruby') expect(response).to have_http_status(200) expect(json_response['content']).to start_with("# This file is a template,") end end - shared_examples_for 'the License Template Entity' do |path| - before { get api(path) } + context 'the License Template Entity' do + before { get api('/templates/licenses/mit') } it 'returns a license template' do expect(json_response['key']).to eq('mit') @@ -64,9 +64,9 @@ describe API::Templates, api: true do end end - shared_examples_for 'GET licenses' do |path| + context 'GET templates/licenses' do it 'returns a list of available license templates' do - get api(path) + get api('/templates/licenses') expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -77,7 +77,7 @@ describe API::Templates, api: true do describe 'the popular parameter' do context 'with popular=1' do it 'returns a list of available popular license templates' do - get api("#{path}?popular=1") + get api('/templates/licenses?popular=1') expect(response).to have_http_status(200) expect(json_response).to be_an Array @@ -88,10 +88,10 @@ describe API::Templates, api: true do end end - shared_examples_for 'GET licenses/:name' do |path| + context 'GET templates/licenses/:name' do context 'with :project and :fullname given' do before do - get api("#{path}/#{license_type}?project=My+Awesome+Project&fullname=Anton+#{license_type.upcase}") + get api("/templates/licenses/#{license_type}?project=My+Awesome+Project&fullname=Anton+#{license_type.upcase}") end context 'for the mit license' do @@ -178,26 +178,4 @@ describe API::Templates, api: true do end end end - - describe 'with /templates namespace' do - it_behaves_like 'the Template Entity', '/templates/gitignores/Ruby' - it_behaves_like 'the TemplateList Entity', '/templates/gitignores' - it_behaves_like 'requesting gitignores', '/templates/gitignores' - it_behaves_like 'requesting gitlab-ci-ymls', '/templates/gitlab_ci_ymls' - it_behaves_like 'requesting gitlab-ci-yml for Ruby', '/templates/gitlab_ci_ymls/Ruby' - it_behaves_like 'the License Template Entity', '/templates/licenses/mit' - it_behaves_like 'GET licenses', '/templates/licenses' - it_behaves_like 'GET licenses/:name', '/templates/licenses' - end - - describe 'without /templates namespace' do - it_behaves_like 'the Template Entity', '/gitignores/Ruby' - it_behaves_like 'the TemplateList Entity', '/gitignores' - it_behaves_like 'requesting gitignores', '/gitignores' - it_behaves_like 'requesting gitlab-ci-ymls', '/gitlab_ci_ymls' - it_behaves_like 'requesting gitlab-ci-yml for Ruby', '/gitlab_ci_ymls/Ruby' - it_behaves_like 'the License Template Entity', '/licenses/mit' - it_behaves_like 'GET licenses', '/licenses' - it_behaves_like 'GET licenses/:name', '/licenses' - end end diff --git a/spec/requests/api/v3/templates_spec.rb b/spec/requests/api/v3/templates_spec.rb new file mode 100644 index 00000000000..4fd4e70bedd --- /dev/null +++ b/spec/requests/api/v3/templates_spec.rb @@ -0,0 +1,203 @@ +require 'spec_helper' + +describe API::V3::Templates, api: true do + include ApiHelpers + + shared_examples_for 'the Template Entity' do |path| + before { get v3_api(path) } + + it { expect(json_response['name']).to eq('Ruby') } + it { expect(json_response['content']).to include('*.gem') } + end + + shared_examples_for 'the TemplateList Entity' do |path| + before { get v3_api(path) } + + it { expect(json_response.first['name']).not_to be_nil } + it { expect(json_response.first['content']).to be_nil } + end + + shared_examples_for 'requesting gitignores' do |path| + it 'returns a list of available gitignore templates' do + get v3_api(path) + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.size).to be > 15 + end + end + + shared_examples_for 'requesting gitlab-ci-ymls' do |path| + it 'returns a list of available gitlab_ci_ymls' do + get v3_api(path) + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).not_to be_nil + end + end + + shared_examples_for 'requesting gitlab-ci-yml for Ruby' do |path| + it 'adds a disclaimer on the top' do + get v3_api(path) + + expect(response).to have_http_status(200) + expect(json_response['content']).to start_with("# This file is a template,") + end + end + + shared_examples_for 'the License Template Entity' do |path| + before { get v3_api(path) } + + it 'returns a license template' do + expect(json_response['key']).to eq('mit') + expect(json_response['name']).to eq('MIT License') + expect(json_response['nickname']).to be_nil + expect(json_response['popular']).to be true + expect(json_response['html_url']).to eq('http://choosealicense.com/licenses/mit/') + expect(json_response['source_url']).to eq('https://opensource.org/licenses/MIT') + expect(json_response['description']).to include('A permissive license that is short and to the point.') + expect(json_response['conditions']).to eq(%w[include-copyright]) + expect(json_response['permissions']).to eq(%w[commercial-use modifications distribution private-use]) + expect(json_response['limitations']).to eq(%w[no-liability]) + expect(json_response['content']).to include('The MIT License (MIT)') + end + end + + shared_examples_for 'GET licenses' do |path| + it 'returns a list of available license templates' do + get v3_api(path) + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.size).to eq(15) + expect(json_response.map { |l| l['key'] }).to include('agpl-3.0') + end + + describe 'the popular parameter' do + context 'with popular=1' do + it 'returns a list of available popular license templates' do + get v3_api("#{path}?popular=1") + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.size).to eq(3) + expect(json_response.map { |l| l['key'] }).to include('apache-2.0') + end + end + end + end + + shared_examples_for 'GET licenses/:name' do |path| + context 'with :project and :fullname given' do + before do + get v3_api("#{path}/#{license_type}?project=My+Awesome+Project&fullname=Anton+#{license_type.upcase}") + end + + context 'for the mit license' do + let(:license_type) { 'mit' } + + it 'returns the license text' do + expect(json_response['content']).to include('The MIT License (MIT)') + end + + it 'replaces placeholder values' do + expect(json_response['content']).to include("Copyright (c) #{Time.now.year} Anton") + end + end + + context 'for the agpl-3.0 license' do + let(:license_type) { 'agpl-3.0' } + + it 'returns the license text' do + expect(json_response['content']).to include('GNU AFFERO GENERAL PUBLIC LICENSE') + end + + it 'replaces placeholder values' do + expect(json_response['content']).to include('My Awesome Project') + expect(json_response['content']).to include("Copyright (C) #{Time.now.year} Anton") + end + end + + context 'for the gpl-3.0 license' do + let(:license_type) { 'gpl-3.0' } + + it 'returns the license text' do + expect(json_response['content']).to include('GNU GENERAL PUBLIC LICENSE') + end + + it 'replaces placeholder values' do + expect(json_response['content']).to include('My Awesome Project') + expect(json_response['content']).to include("Copyright (C) #{Time.now.year} Anton") + end + end + + context 'for the gpl-2.0 license' do + let(:license_type) { 'gpl-2.0' } + + it 'returns the license text' do + expect(json_response['content']).to include('GNU GENERAL PUBLIC LICENSE') + end + + it 'replaces placeholder values' do + expect(json_response['content']).to include('My Awesome Project') + expect(json_response['content']).to include("Copyright (C) #{Time.now.year} Anton") + end + end + + context 'for the apache-2.0 license' do + let(:license_type) { 'apache-2.0' } + + it 'returns the license text' do + expect(json_response['content']).to include('Apache License') + end + + it 'replaces placeholder values' do + expect(json_response['content']).to include("Copyright #{Time.now.year} Anton") + end + end + + context 'for an uknown license' do + let(:license_type) { 'muth-over9000' } + + it 'returns a 404' do + expect(response).to have_http_status(404) + end + end + end + + context 'with no :fullname given' do + context 'with an authenticated user' do + let(:user) { create(:user) } + + it 'replaces the copyright owner placeholder with the name of the current user' do + get v3_api('/templates/licenses/mit', user) + + expect(json_response['content']).to include("Copyright (c) #{Time.now.year} #{user.name}") + end + end + end + end + + describe 'with /templates namespace' do + it_behaves_like 'the Template Entity', '/templates/gitignores/Ruby' + it_behaves_like 'the TemplateList Entity', '/templates/gitignores' + it_behaves_like 'requesting gitignores', '/templates/gitignores' + it_behaves_like 'requesting gitlab-ci-ymls', '/templates/gitlab_ci_ymls' + it_behaves_like 'requesting gitlab-ci-yml for Ruby', '/templates/gitlab_ci_ymls/Ruby' + it_behaves_like 'the License Template Entity', '/templates/licenses/mit' + it_behaves_like 'GET licenses', '/templates/licenses' + it_behaves_like 'GET licenses/:name', '/templates/licenses' + end + + describe 'without /templates namespace' do + it_behaves_like 'the Template Entity', '/gitignores/Ruby' + it_behaves_like 'the TemplateList Entity', '/gitignores' + it_behaves_like 'requesting gitignores', '/gitignores' + it_behaves_like 'requesting gitlab-ci-ymls', '/gitlab_ci_ymls' + it_behaves_like 'requesting gitlab-ci-yml for Ruby', '/gitlab_ci_ymls/Ruby' + it_behaves_like 'the License Template Entity', '/licenses/mit' + it_behaves_like 'GET licenses', '/licenses' + it_behaves_like 'GET licenses/:name', '/licenses' + end +end From 17c8d15b14f6c3ecc98e1466e9148cf100cc12c6 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Fri, 10 Feb 2017 15:26:23 -0500 Subject: [PATCH 135/313] Enable `Lint/EmptyWhen` cop and correct offense --- .rubocop.yml | 4 ++++ .rubocop_todo.yml | 4 ---- lib/gitlab/diff/parser.rb | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index 1061de7c797..6e8f599bf25 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -572,6 +572,10 @@ Lint/ElseLayout: Lint/EmptyEnsure: Enabled: true +# Checks for the presence of `when` branches without a body. +Lint/EmptyWhen: + Enabled: true + # Align ends correctly. Lint/EndAlignment: Enabled: true diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 7ef5523de4b..648b3fc49d2 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -21,10 +21,6 @@ Lint/AmbiguousRegexpLiteral: Lint/AssignmentInCondition: Enabled: false -# Offense count: 1 -Lint/EmptyWhen: - Enabled: false - # Offense count: 20 Lint/HandleExceptions: Enabled: false diff --git a/lib/gitlab/diff/parser.rb b/lib/gitlab/diff/parser.rb index 59a2367b65d..89320f5d9dc 100644 --- a/lib/gitlab/diff/parser.rb +++ b/lib/gitlab/diff/parser.rb @@ -45,7 +45,7 @@ module Gitlab line_new += 1 when "-" line_old += 1 - when "\\" + when "\\" # rubocop:disable Lint/EmptyWhen # No increment else line_new += 1 From 581cfbae24d629433e2e4eb6f6a2bb2a2938cada Mon Sep 17 00:00:00 2001 From: Yorick Peterse Date: Mon, 13 Feb 2017 17:11:50 +0100 Subject: [PATCH 136/313] Don't connect in Gitlab::Database.adapter_name We don't need to connect when requesting the name of the database adapter. This in turn should prevent us from requesting/leaking connections just by asking whether we're using PostgreSQL or MySQL. --- changelogs/unreleased/fix-ar-connection-leaks.yml | 4 ++++ lib/gitlab/database.rb | 2 +- spec/lib/gitlab/database_spec.rb | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/fix-ar-connection-leaks.yml diff --git a/changelogs/unreleased/fix-ar-connection-leaks.yml b/changelogs/unreleased/fix-ar-connection-leaks.yml new file mode 100644 index 00000000000..9da715560ad --- /dev/null +++ b/changelogs/unreleased/fix-ar-connection-leaks.yml @@ -0,0 +1,4 @@ +--- +title: Don't connect in Gitlab::Database.adapter_name +merge_request: +author: diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index dc2537d36aa..a3d6be9959b 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -6,7 +6,7 @@ module Gitlab MAX_INT_VALUE = 2147483647 def self.adapter_name - connection.adapter_name + ActiveRecord::Base.configurations[Rails.env]['adapter'] end def self.mysql? diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb index b142b3a2781..41252f31997 100644 --- a/spec/lib/gitlab/database_spec.rb +++ b/spec/lib/gitlab/database_spec.rb @@ -5,6 +5,12 @@ class MigrationTest end describe Gitlab::Database, lib: true do + describe '.adapter_name' do + it 'returns the name of the adapter' do + expect(described_class.adapter_name).to be_an_instance_of(String) + end + end + # These are just simple smoke tests to check if the methods work (regardless # of what they may return). describe '.mysql?' do From 948e1b845cd93c6450794379282712ec3b4a9caf Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Mon, 13 Feb 2017 10:35:25 -0600 Subject: [PATCH 137/313] Respect autocrlf setting when creating/updating file through web UI --- app/models/repository.rb | 8 ++++++++ spec/models/repository_spec.rb | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/models/repository.rb b/app/models/repository.rb index d2d92a064a4..56c582cd9be 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -1230,6 +1230,14 @@ class Repository action[:content] end + detect = CharlockHolmes::EncodingDetector.new.detect(content) if content + + unless detect && detect[:type] == :binary + # When writing to the repo directly as we are doing here, + # the `core.autocrlf` config isn't taken into account. + content.gsub!("\r\n", "\n") if self.autocrlf + end + oid = rugged.write(content, :blob) index.add(path: path, oid: oid, mode: mode) diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 9bfa6409607..838fd3754b2 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -351,6 +351,17 @@ describe Repository, models: true do expect(blob.data).to eq('Changelog!') end + it 'respects the autocrlf setting' do + repository.commit_file(user, 'hello.txt', "Hello,\r\nWorld", + message: 'Add hello world', + branch_name: 'master', + update: true) + + blob = repository.blob_at('master', 'hello.txt') + + expect(blob.data).to eq("Hello,\nWorld") + end + context "when an author is specified" do it "uses the given email/name to set the commit's author" do expect do From 136dc79433295aded9ecabb15aae2dc1e228b903 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 13 Feb 2017 21:45:26 +0800 Subject: [PATCH 138/313] Have some simple way to create connection pool --- lib/gitlab/database.rb | 24 ++++++++++++++++ spec/lib/gitlab/database_spec.rb | 48 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index dc2537d36aa..e6612bc3aad 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -69,6 +69,30 @@ module Gitlab end end + def self.with_connection_pool(pool_size) + pool = create_connection_pool(pool_size) + + yield(pool) + + ensure + pool.disconnect! + end + + def self.create_connection_pool(pool_size) + # See activerecord-4.2.7.1/lib/active_record/connection_adapters/connection_specification.rb + env = Rails.env + original_config = ActiveRecord::Base.configurations + env_config = original_config[env].merge('pool' => pool_size) + config = original_config.merge(env => env_config) + + spec = + ActiveRecord:: + ConnectionAdapters:: + ConnectionSpecification::Resolver.new(config).spec(env.to_sym) + + ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec) + end + def self.connection ActiveRecord::Base.connection end diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb index b142b3a2781..c9be832b1a0 100644 --- a/spec/lib/gitlab/database_spec.rb +++ b/spec/lib/gitlab/database_spec.rb @@ -71,6 +71,54 @@ describe Gitlab::Database, lib: true do end end + describe '.with_connection_pool' do + it 'creates a new connection pool and disconnect it after used' do + closed_pool = nil + + described_class.with_connection_pool(1) do |pool| + pool.with_connection do |connection| + connection.execute('SELECT 1 AS value') + end + + expect(pool).to be_connected + + closed_pool = pool + end + + expect(closed_pool).not_to be_connected + end + + it 'disconnects the pool even an exception was raised' do + error = Class.new(RuntimeError) + closed_pool = nil + + begin + described_class.with_connection_pool(1) do |pool| + pool.with_connection do |connection| + connection.execute('SELECT 1 AS value') + end + + closed_pool = pool + + raise error.new('boom') + end + rescue error + end + + expect(closed_pool).not_to be_connected + end + end + + describe '.create_connection_pool' do + it 'creates a new connection pool with specific pool size' do + pool = described_class.create_connection_pool(5) + + expect(pool) + .to be_kind_of(ActiveRecord::ConnectionAdapters::ConnectionPool) + expect(pool.spec.config[:pool]).to eq(5) + end + end + describe '#true_value' do it 'returns correct value for PostgreSQL' do expect(described_class).to receive(:postgresql?).and_return(true) From 97739f15c73064ad56312f2cdc35a417985b6de4 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Sun, 12 Feb 2017 19:56:25 -0800 Subject: [PATCH 139/313] Add indices to improve loading of labels page --- changelogs/unreleased/sh-add-labels-index.yml | 4 ++++ ...2829_add_index_to_labels_for_title_and_project.rb | 12 ++++++++++++ db/schema.rb | 2 ++ 3 files changed, 18 insertions(+) create mode 100644 changelogs/unreleased/sh-add-labels-index.yml create mode 100644 db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb diff --git a/changelogs/unreleased/sh-add-labels-index.yml b/changelogs/unreleased/sh-add-labels-index.yml new file mode 100644 index 00000000000..b948a75081c --- /dev/null +++ b/changelogs/unreleased/sh-add-labels-index.yml @@ -0,0 +1,4 @@ +--- +title: Add indices to improve loading of labels page +merge_request: +author: diff --git a/db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb b/db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb new file mode 100644 index 00000000000..f922ed209aa --- /dev/null +++ b/db/migrate/20170210062829_add_index_to_labels_for_title_and_project.rb @@ -0,0 +1,12 @@ +class AddIndexToLabelsForTitleAndProject < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def change + add_concurrent_index :labels, :title + add_concurrent_index :labels, :project_id + end +end diff --git a/db/schema.rb b/db/schema.rb index d71911eaf14..feeea55ce9b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -581,6 +581,8 @@ ActiveRecord::Schema.define(version: 20170210075922) do add_index "labels", ["group_id", "project_id", "title"], name: "index_labels_on_group_id_and_project_id_and_title", unique: true, using: :btree add_index "labels", ["type", "project_id"], name: "index_labels_on_type_and_project_id", using: :btree + add_index "labels", ["project_id"], name: "index_labels_on_project_id", using: :btree + add_index "labels", ["title"], name: "index_labels_on_title", using: :btree create_table "lfs_objects", force: :cascade do |t| t.string "oid", null: false From 17f5a34bfd7d122d1bdc8e11632ff072a89e9cbd Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Fri, 10 Feb 2017 10:44:42 -0600 Subject: [PATCH 140/313] Display loading indicator when filtering ref switcher dropdown --- app/assets/javascripts/gl_dropdown.js | 2 ++ .../27966-branch-ref-switcher-input-filter-broken.yml | 4 ++++ spec/features/projects/ref_switcher_spec.rb | 6 +++--- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/27966-branch-ref-switcher-input-filter-broken.yml diff --git a/app/assets/javascripts/gl_dropdown.js b/app/assets/javascripts/gl_dropdown.js index 77fa662892a..0d618caf350 100644 --- a/app/assets/javascripts/gl_dropdown.js +++ b/app/assets/javascripts/gl_dropdown.js @@ -47,9 +47,11 @@ } // Only filter asynchronously only if option remote is set if (this.options.remote) { + $inputContainer.parent().addClass('is-loading'); clearTimeout(timeout); return timeout = setTimeout(function() { return this.options.query(this.input.val(), function(data) { + $inputContainer.parent().removeClass('is-loading'); return this.options.callback(data); }.bind(this)); }.bind(this), 250); diff --git a/changelogs/unreleased/27966-branch-ref-switcher-input-filter-broken.yml b/changelogs/unreleased/27966-branch-ref-switcher-input-filter-broken.yml new file mode 100644 index 00000000000..6fa13395a7d --- /dev/null +++ b/changelogs/unreleased/27966-branch-ref-switcher-input-filter-broken.yml @@ -0,0 +1,4 @@ +--- +title: Display loading indicator when filtering ref switcher dropdown +merge_request: +author: diff --git a/spec/features/projects/ref_switcher_spec.rb b/spec/features/projects/ref_switcher_spec.rb index 38fe2d92885..4eafac1acd8 100644 --- a/spec/features/projects/ref_switcher_spec.rb +++ b/spec/features/projects/ref_switcher_spec.rb @@ -20,9 +20,9 @@ feature 'Ref switcher', feature: true, js: true do input.set 'binary' wait_for_ajax - input.native.send_keys :down - input.native.send_keys :down - input.native.send_keys :enter + page.within '.dropdown-content ul' do + input.native.send_keys :enter + end end expect(page).to have_title 'binary-encoding' From 4304ea802ffd8c09a3880856db41bbe8ce4f64a0 Mon Sep 17 00:00:00 2001 From: Pratik Borsadiya Date: Mon, 13 Feb 2017 22:41:39 +0530 Subject: [PATCH 141/313] Layout alignment fix in new project and edit project screen --- app/assets/stylesheets/pages/projects.scss | 8 ++------ app/views/projects/edit.html.haml | 4 ++-- app/views/projects/new.html.haml | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index 8b59c20cb65..9a72148f408 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -35,12 +35,8 @@ margin-bottom: 10px; } - .project-path { - padding-right: 0; - - .form-control { - border-radius: $border-radius-base; - } + .project-path .form-control { + border-radius: $border-radius-base; } .input-group > div { diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 9c5c1a6d707..c533a29999a 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -6,7 +6,7 @@ .col-lg-9 .project-edit-errors = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit-project" }, authenticity_token: true do |f| - %fieldset.append-bottom-0 + %fieldset .row .form-group.col-md-9 = f.label :name, class: 'label-light', for: 'project_name_edit' do @@ -33,7 +33,7 @@ = f.text_field :tag_list, value: @project.tag_list.to_s, maxlength: 2000, class: "form-control" %p.help-block Separate tags with commas. %hr - %fieldset.append-bottom-0 + %fieldset %h5.prepend-top-0 Sharing & Permissions .form_group.prepend-top-20.sharing-and-permissions diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index 41473fae4de..a07885537b9 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -12,7 +12,7 @@ Create or Import your project from popular Git services .col-lg-9 = form_for @project, html: { class: 'new_project' } do |f| - %fieldset.append-bottom-0 + .row .form-group.col-xs-12.col-sm-6 = f.label :namespace_id, class: 'label-light' do %span From f0a922840337f1114ae376ef43e28d480f2ad9fa Mon Sep 17 00:00:00 2001 From: Jan Christophersen Date: Mon, 13 Feb 2017 18:30:26 +0100 Subject: [PATCH 142/313] Add 'Most Recent Activity' header to the User Profile page --- app/views/users/show.html.haml | 2 ++ .../unreleased/26286-most-recent-activity-profile-header.yml | 4 ++++ 2 files changed, 6 insertions(+) create mode 100644 changelogs/unreleased/26286-most-recent-activity-profile-header.yml diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml index 44254040e4e..dc2fea450bd 100644 --- a/app/views/users/show.html.haml +++ b/app/views/users/show.html.haml @@ -106,6 +106,8 @@ %i.fa.fa-spinner.fa-spin .user-calendar-activities + %h4.prepend-top-20 + Most Recent Activity .content_list{ data: { href: user_path } } = spinner diff --git a/changelogs/unreleased/26286-most-recent-activity-profile-header.yml b/changelogs/unreleased/26286-most-recent-activity-profile-header.yml new file mode 100644 index 00000000000..74d5a43a804 --- /dev/null +++ b/changelogs/unreleased/26286-most-recent-activity-profile-header.yml @@ -0,0 +1,4 @@ +--- +title: Added 'Most Recent Activity' header to the User Profile page +merge_request: 9189 +author: Jan Christophersen From 4f51e1fad0609c0cd50468243a83970728186a8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Thu, 26 Jan 2017 18:59:50 +0100 Subject: [PATCH 143/313] Add comment events to contributions calendar MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- app/models/event.rb | 7 +- app/views/users/calendar.html.haml | 2 +- app/views/users/calendar_activities.html.haml | 6 +- ...45-add-discussion-contribs-to-calendar.yml | 4 + lib/gitlab/contributions_calendar.rb | 6 +- spec/features/calendar_spec.rb | 232 ++++++++++-------- 6 files changed, 147 insertions(+), 110 deletions(-) create mode 100644 changelogs/unreleased/22645-add-discussion-contribs-to-calendar.yml diff --git a/app/models/event.rb b/app/models/event.rb index 2662f170765..1a5828a2828 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -45,9 +45,10 @@ class Event < ActiveRecord::Base class << self # Update Gitlab::ContributionsCalendar#activity_dates if this changes def contributions - where("action = ? OR (target_type in (?) AND action in (?))", - Event::PUSHED, ["MergeRequest", "Issue"], - [Event::CREATED, Event::CLOSED, Event::MERGED]) + where("action = ? OR (target_type IN (?) AND action IN (?)) OR (target_type = ? AND action = ?)", + Event::PUSHED, + ["MergeRequest", "Issue"], [Event::CREATED, Event::CLOSED, Event::MERGED], + "Note", Event::COMMENTED) end def limit_recent(limit = 20, offset = nil) diff --git a/app/views/users/calendar.html.haml b/app/views/users/calendar.html.haml index 6228245d8d0..57b8845c55d 100644 --- a/app/views/users/calendar.html.haml +++ b/app/views/users/calendar.html.haml @@ -1,7 +1,7 @@ .clearfix.calendar .js-contrib-calendar .calendar-hint - Summary of issues, merge requests, and push events + Summary of issues, merge requests, push events, and comments :javascript new Calendar( #{@activity_dates.to_json}, diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml index b09782749f5..dae147ca8be 100644 --- a/app/views/users/calendar_activities.html.haml +++ b/app/views/users/calendar_activities.html.haml @@ -13,8 +13,10 @@ #{event.action_name} #{event.ref_type} #{event.ref_name} - else = event_action_name(event) - - if event.target - %strong= link_to "#{event.target.to_reference}", [event.project.namespace.becomes(Namespace), event.project, event.target] + - if event.note? + %strong= link_to event.note_target.to_reference, event_note_target_path(event) + - elsif event.target + %strong= link_to event.target.to_reference, [event.project.namespace.becomes(Namespace), event.project, event.target] at %strong diff --git a/changelogs/unreleased/22645-add-discussion-contribs-to-calendar.yml b/changelogs/unreleased/22645-add-discussion-contribs-to-calendar.yml new file mode 100644 index 00000000000..9b3c2bd9278 --- /dev/null +++ b/changelogs/unreleased/22645-add-discussion-contribs-to-calendar.yml @@ -0,0 +1,4 @@ +--- +title: Add discussion events to contributions calendar +merge_request: 8821 +author: diff --git a/lib/gitlab/contributions_calendar.rb b/lib/gitlab/contributions_calendar.rb index 7e3d5647b39..15992b77680 100644 --- a/lib/gitlab/contributions_calendar.rb +++ b/lib/gitlab/contributions_calendar.rb @@ -22,8 +22,10 @@ module Gitlab having(action: [Event::CREATED, Event::CLOSED], target_type: "Issue") mr_events = event_counts(date_from, :merge_requests). having(action: [Event::MERGED, Event::CREATED, Event::CLOSED], target_type: "MergeRequest") + note_events = event_counts(date_from, :merge_requests). + having(action: [Event::COMMENTED], target_type: "Note") - union = Gitlab::SQL::Union.new([repo_events, issue_events, mr_events]) + union = Gitlab::SQL::Union.new([repo_events, issue_events, mr_events, note_events]) events = Event.find_by_sql(union.to_sql).map(&:attributes) @activity_events = events.each_with_object(Hash.new {|h, k| h[k] = 0 }) do |event, activities| @@ -38,7 +40,7 @@ module Gitlab # Use visible_to_user? instead of the complicated logic in activity_dates # because we're only viewing the events for a single day. - events.select {|event| event.visible_to_user?(current_user) } + events.select { |event| event.visible_to_user?(current_user) } end def starting_year diff --git a/spec/features/calendar_spec.rb b/spec/features/calendar_spec.rb index 3e0b6364e0d..35d090c4b7f 100644 --- a/spec/features/calendar_spec.rb +++ b/spec/features/calendar_spec.rb @@ -1,9 +1,11 @@ require 'spec_helper' -feature 'Contributions Calendar', js: true, feature: true do +feature 'Contributions Calendar', :feature, :js do include WaitForAjax + let(:user) { create(:user) } let(:contributed_project) { create(:project, :public) } + let(:issue_note) { create(:note, project: contributed_project) } # Ex/ Sunday Jan 1, 2016 date_format = '%A %b %-d, %Y' @@ -12,31 +14,31 @@ feature 'Contributions Calendar', js: true, feature: true do issue_params = { title: issue_title } def get_cell_color_selector(contributions) - contribution_cell = '.user-contrib-cell' - activity_colors = Array['#ededed', '#acd5f2', '#7fa8c9', '#527ba0', '#254e77'] - activity_colors_index = 0 + activity_colors = %w[#ededed #acd5f2 #7fa8c9 #527ba0 #254e77] + # We currently don't actually test the cases with contributions >= 20 + activity_colors_index = + if contributions > 0 && contributions < 10 + 1 + elsif contributions >= 10 && contributions < 20 + 2 + elsif contributions >= 20 && contributions < 30 + 3 + elsif contributions >= 30 + 4 + else + 0 + end - if contributions > 0 && contributions < 10 - activity_colors_index = 1 - elsif contributions >= 10 && contributions < 20 - activity_colors_index = 2 - elsif contributions >= 20 && contributions < 30 - activity_colors_index = 3 - elsif contributions >= 30 - activity_colors_index = 4 - end - - "#{contribution_cell}[fill='#{activity_colors[activity_colors_index]}']" + ".user-contrib-cell[fill='#{activity_colors[activity_colors_index]}']" end def get_cell_date_selector(contributions, date) - contribution_text = 'No contributions' - - if contributions === 1 - contribution_text = '1 contribution' - elsif contributions > 1 - contribution_text = "#{contributions} contributions" - end + contribution_text = + if contributions.zero? + 'No contributions' + else + "#{contributions} #{'contribution'.pluralize(contributions)}" + end "#{get_cell_color_selector(contributions)}[data-original-title='#{contribution_text}
#{date}']" end @@ -45,129 +47,155 @@ feature 'Contributions Calendar', js: true, feature: true do push_params = { project: contributed_project, action: Event::PUSHED, - author_id: @user.id, + author_id: user.id, data: { commit_count: 3 } } Event.create(push_params) end - def get_first_cell_content + def note_comment_contribution + note_comment_params = { + project: contributed_project, + action: Event::COMMENTED, + target: issue_note, + author_id: user.id + } + + Event.create(note_comment_params) + end + + def selected_day_activities find('.user-calendar-activities').text end before do - login_as :user - visit @user.username - wait_for_ajax + login_as user end - it 'displays calendar', js: true do - expect(page).to have_css('.js-contrib-calendar') - end - - describe 'select calendar day', js: true do - let(:cells) { page.all('.user-contrib-cell') } - let(:first_cell_content_before) { get_first_cell_content } - + describe 'calendar day selection' do before do - cells[0].click + visit user.username wait_for_ajax - first_cell_content_before end - it 'displays calendar day activities', js: true do - expect(get_first_cell_content).not_to eq('') + it 'displays calendar' do + expect(page).to have_css('.js-contrib-calendar') end - describe 'select another calendar day', js: true do - before do - cells[1].click - wait_for_ajax - end + describe 'select calendar day' do + let(:cells) { page.all('.user-contrib-cell') } - it 'displays different calendar day activities', js: true do - expect(get_first_cell_content).not_to eq(first_cell_content_before) - end - end - - describe 'deselect calendar day', js: true do before do cells[0].click wait_for_ajax + @first_day_activities = selected_day_activities end - it 'hides calendar day activities', js: true do - expect(get_first_cell_content).to eq('') + it 'displays calendar day activities' do + expect(selected_day_activities).not_to be_empty + end + + describe 'select another calendar day' do + before do + cells[1].click + wait_for_ajax + end + + it 'displays different calendar day activities' do + expect(selected_day_activities).not_to eq(@first_day_activities) + end + end + + describe 'deselect calendar day' do + before do + cells[0].click + wait_for_ajax + end + + it 'hides calendar day activities' do + expect(selected_day_activities).to be_empty + end end end end - describe '1 calendar activity' do - before do - Issues::CreateService.new(contributed_project, @user, issue_params).execute - visit @user.username - wait_for_ajax + describe 'calendar daily activities' do + shared_context 'visit user page' do + before do + visit user.username + wait_for_ajax + end end - it 'displays calendar activity log', js: true do - expect(find('.content_list .event-note')).to have_content issue_title - end + shared_examples 'a day with activity' do |contribution_count:| + include_context 'visit user page' - it 'displays calendar activity square color for 1 contribution', js: true do - expect(page).to have_selector(get_cell_color_selector(1), count: 1) - end - - it 'displays calendar activity square on the correct date', js: true do - today = Date.today.strftime(date_format) - expect(page).to have_selector(get_cell_date_selector(1, today), count: 1) - end - end - - describe '10 calendar activities' do - before do - (0..9).each do |i| - push_code_contribution() + it 'displays calendar activity square color for 1 contribution' do + expect(page).to have_selector(get_cell_color_selector(contribution_count), count: 1) end - visit @user.username - wait_for_ajax + it 'displays calendar activity square on the correct date' do + today = Date.today.strftime(date_format) + expect(page).to have_selector(get_cell_date_selector(contribution_count, today), count: 1) + end end - it 'displays calendar activity square color for 10 contributions', js: true do - expect(page).to have_selector(get_cell_color_selector(10), count: 1) + describe '1 issue creation calendar activity' do + before do + Issues::CreateService.new(contributed_project, user, issue_params).execute + end + + it_behaves_like 'a day with activity', contribution_count: 1 + + describe 'issue title is shown on activity page' do + include_context 'visit user page' + + it 'displays calendar activity log' do + expect(find('.content_list .event-note')).to have_content issue_title + end + end end - it 'displays calendar activity square on the correct date', js: true do - today = Date.today.strftime(date_format) - expect(page).to have_selector(get_cell_date_selector(10, today), count: 1) - end - end + describe '1 comment calendar activity' do + before do + note_comment_contribution + end - describe 'calendar activity on two days' do - before do - push_code_contribution() - - Timecop.freeze(Date.yesterday) - Issues::CreateService.new(contributed_project, @user, issue_params).execute - Timecop.return - - visit @user.username - wait_for_ajax + it_behaves_like 'a day with activity', contribution_count: 1 end - it 'displays calendar activity squares for both days', js: true do - expect(page).to have_selector(get_cell_color_selector(1), count: 2) + describe '10 calendar activities' do + before do + 10.times { push_code_contribution } + end + + it_behaves_like 'a day with activity', contribution_count: 10 end - it 'displays calendar activity square for yesterday', js: true do - yesterday = Date.yesterday.strftime(date_format) - expect(page).to have_selector(get_cell_date_selector(1, yesterday), count: 1) - end + describe 'calendar activity on two days' do + before do + push_code_contribution - it 'displays calendar activity square for today', js: true do - today = Date.today.strftime(date_format) - expect(page).to have_selector(get_cell_date_selector(1, today), count: 1) + Timecop.freeze(Date.yesterday) do + Issues::CreateService.new(contributed_project, user, issue_params).execute + end + end + include_context 'visit user page' + + it 'displays calendar activity squares for both days' do + expect(page).to have_selector(get_cell_color_selector(1), count: 2) + end + + it 'displays calendar activity square for yesterday' do + yesterday = Date.yesterday.strftime(date_format) + expect(page).to have_selector(get_cell_date_selector(1, yesterday), count: 1) + end + + it 'displays calendar activity square for today' do + today = Date.today.strftime(date_format) + expect(page).to have_selector(get_cell_date_selector(1, today), count: 1) + end end end end From 1536109ccd297924474da3e46019b191013c55d4 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Thu, 9 Feb 2017 22:35:32 -0500 Subject: [PATCH 144/313] Retrigger at.js for slash commands with autocomplete suffix --- app/assets/javascripts/gfm_auto_complete.js.es6 | 3 +++ ...-character-is-part-of-an-autocompleted-text.yml | 4 ++++ spec/features/issues/gfm_autocomplete_spec.rb | 14 ++++++++++++++ 3 files changed, 21 insertions(+) create mode 100644 changelogs/unreleased/27883-autocomplete-seems-to-not-trigger-when-at-character-is-part-of-an-autocompleted-text.yml diff --git a/app/assets/javascripts/gfm_auto_complete.js.es6 b/app/assets/javascripts/gfm_auto_complete.js.es6 index 7f1f2a5d278..0f6994dd2d1 100644 --- a/app/assets/javascripts/gfm_auto_complete.js.es6 +++ b/app/assets/javascripts/gfm_auto_complete.js.es6 @@ -103,6 +103,9 @@ this.input.each((i, input) => { const $input = $(input); $input.off('focus.setupAtWho').on('focus.setupAtWho', this.setupAtWho.bind(this, $input)); + // This triggers at.js again + // Needed for slash commands with suffixes (ex: /label ~) + $input.on('inserted-commands.atwho', $input.trigger.bind($input, 'keyup')); }); }, setupAtWho: function($input) { diff --git a/changelogs/unreleased/27883-autocomplete-seems-to-not-trigger-when-at-character-is-part-of-an-autocompleted-text.yml b/changelogs/unreleased/27883-autocomplete-seems-to-not-trigger-when-at-character-is-part-of-an-autocompleted-text.yml new file mode 100644 index 00000000000..52b7e96682d --- /dev/null +++ b/changelogs/unreleased/27883-autocomplete-seems-to-not-trigger-when-at-character-is-part-of-an-autocompleted-text.yml @@ -0,0 +1,4 @@ +--- +title: Trigger autocomplete after selecting a slash command +merge_request: 9117 +author: diff --git a/spec/features/issues/gfm_autocomplete_spec.rb b/spec/features/issues/gfm_autocomplete_spec.rb index 93139dc9e94..7135565294b 100644 --- a/spec/features/issues/gfm_autocomplete_spec.rb +++ b/spec/features/issues/gfm_autocomplete_spec.rb @@ -182,6 +182,20 @@ feature 'GFM autocomplete', feature: true, js: true do expect(page).not_to have_selector('.atwho-view') end + it 'triggers autocomplete after selecting a slash command' do + note = find('#note_note') + page.within '.timeline-content-form' do + note.native.send_keys('') + note.native.send_keys('/as') + note.click + end + + find('.atwho-view li', text: '/assign').native.send_keys(:tab) + + user_item = find('.atwho-view li', text: user.username) + expect(user_item).to have_content(user.username) + end + def expect_to_wrap(should_wrap, item, note, value) expect(item).to have_content(value) expect(item).not_to have_content("\"#{value}\"") From 86ace2a9470805cd110f61c928f0857289f9af63 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 7 Feb 2017 16:34:05 -0600 Subject: [PATCH 145/313] remove unnecessary "npm install"s --- .gitlab-ci.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 733710bb005..f1df95ba618 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -246,7 +246,6 @@ karma: <<: *use-db <<: *dedicated-runner script: - - npm link istanbul - bundle exec rake karma artifacts: name: coverage-javascript @@ -326,8 +325,6 @@ lint:javascript: - node_modules/ stage: test image: "node:7.1" - before_script: - - npm install script: - npm --silent run eslint @@ -338,8 +335,6 @@ lint:javascript:report: - node_modules/ stage: post-test image: "node:7.1" - before_script: - - npm install script: - find app/ spec/ -name '*.js' -or -name '*.js.es6' -exec sed --in-place 's|/\* eslint-disable .*\*/||' {} \; # run report over all files - npm --silent run eslint-report || true # ignore exit code From 469bc859ce92b2ef8cb5be56376504e44e239197 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 7 Feb 2017 16:49:03 -0600 Subject: [PATCH 146/313] remove recursive npm calls to avoid dependence on npm after switch to yarn --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 24e11a4607f..7b1c7a14d02 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,12 @@ "scripts": { "dev-server": "webpack-dev-server --config config/webpack.config.js", "eslint": "eslint --max-warnings 0 --ext .js,.js.es6 .", - "eslint-fix": "npm run eslint -- --fix", - "eslint-report": "npm run eslint -- --format html --output-file ./eslint-report.html", + "eslint-fix": "eslint --max-warnings 0 --ext .js,.js.es6 --fix .", + "eslint-report": "eslint --max-warnings 0 --ext .js,.js.es6 --format html --output-file ./eslint-report.html .", "karma": "karma start config/karma.config.js --single-run", "karma-start": "karma start config/karma.config.js", "webpack": "webpack --config config/webpack.config.js", - "webpack-prod": "NODE_ENV=production npm run webpack" + "webpack-prod": "NODE_ENV=production webpack --config config/webpack.config.js" }, "dependencies": { "babel-core": "^6.22.1", From 8beb5998a8356feeb4ce75f7d749407bdd9034bc Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 7 Feb 2017 16:57:43 -0600 Subject: [PATCH 147/313] replace npm run calls with yarn --- .gitlab-ci.yml | 6 +++--- lib/tasks/eslint.rake | 2 +- lib/tasks/karma.rake | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f1df95ba618..71d5dce7314 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -107,7 +107,7 @@ setup-test-env: <<: *dedicated-runner stage: prepare script: - - npm install + - yarn install - bundle exec rake gitlab:assets:compile - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init' artifacts: @@ -326,7 +326,7 @@ lint:javascript: stage: test image: "node:7.1" script: - - npm --silent run eslint + - yarn run eslint lint:javascript:report: <<: *dedicated-runner @@ -337,7 +337,7 @@ lint:javascript:report: image: "node:7.1" script: - find app/ spec/ -name '*.js' -or -name '*.js.es6' -exec sed --in-place 's|/\* eslint-disable .*\*/||' {} \; # run report over all files - - npm --silent run eslint-report || true # ignore exit code + - yarn run eslint-report || true # ignore exit code artifacts: name: eslint-report expire_in: 31d diff --git a/lib/tasks/eslint.rake b/lib/tasks/eslint.rake index d43cbad1909..2514b050695 100644 --- a/lib/tasks/eslint.rake +++ b/lib/tasks/eslint.rake @@ -1,7 +1,7 @@ unless Rails.env.production? desc "GitLab | Run ESLint" task :eslint do - system("npm", "run", "eslint") + system("yarn", "run", "eslint") end end diff --git a/lib/tasks/karma.rake b/lib/tasks/karma.rake index 89812a179ec..35cfed9dc75 100644 --- a/lib/tasks/karma.rake +++ b/lib/tasks/karma.rake @@ -11,7 +11,7 @@ unless Rails.env.production? desc 'GitLab | Karma | Run JavaScript tests' task :tests do - sh "npm run karma" do |ok, res| + sh "yarn run karma" do |ok, res| abort('rake karma:tests failed') unless ok end end From a4c003632577116f55200d863a508220beacd2f2 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 7 Feb 2017 16:58:59 -0600 Subject: [PATCH 148/313] add yarn lock file --- yarn.lock | 3914 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3914 insertions(+) create mode 100644 yarn.lock diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..05aea4fd6f0 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3914 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +abbrev@1, abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + +accepts@1.3.3, accepts@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" + +acorn@^3.0.0, acorn@^3.0.4, acorn@^3.1.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +after@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0: + version "4.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.2.tgz#f166c3c11cbc6cb9dcc102a5bcfe5b72c95287e6" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +alter@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" + dependencies: + stable "~0.1.3" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + +aproba@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.0.tgz#4d8f047a318604e18e3c06a0e52230d3d19f147b" + +are-we-there-yet@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.0 || ^1.1.13" + +argparse@^1.0.7: + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-slice@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert@^1.1.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + dependencies: + util "0.10.3" + +ast-traverse@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" + +ast-types@0.8.12: + version "0.8.12" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" + +ast-types@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" + +ast-types@0.9.5: + version "0.9.5" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.5.tgz#1a660a09945dbceb1f9c9cbb715002617424e04a" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@0.2.x, async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@1.x, async@^1.3.0, async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^0.9.0, async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws4@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.16.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" + dependencies: + chalk "^1.1.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +babel-core@^5.4.0, babel-core@^5.6.21, babel-core@^5.8.38: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" + dependencies: + babel-plugin-constant-folding "^1.0.1" + babel-plugin-dead-code-elimination "^1.0.2" + babel-plugin-eval "^1.0.1" + babel-plugin-inline-environment-variables "^1.0.1" + babel-plugin-jscript "^1.0.4" + babel-plugin-member-expression-literals "^1.0.1" + babel-plugin-property-literals "^1.0.1" + babel-plugin-proto-to-assign "^1.0.3" + babel-plugin-react-constant-elements "^1.0.3" + babel-plugin-react-display-name "^1.0.3" + babel-plugin-remove-console "^1.0.1" + babel-plugin-remove-debugger "^1.0.1" + babel-plugin-runtime "^1.0.7" + babel-plugin-undeclared-variables-check "^1.0.2" + babel-plugin-undefined-to-void "^1.1.6" + babylon "^5.8.38" + bluebird "^2.9.33" + chalk "^1.0.0" + convert-source-map "^1.1.0" + core-js "^1.0.0" + debug "^2.1.1" + detect-indent "^3.0.0" + esutils "^2.0.0" + fs-readdir-recursive "^0.1.0" + globals "^6.4.0" + home-or-tmp "^1.0.0" + is-integer "^1.0.4" + js-tokens "1.0.1" + json5 "^0.4.0" + lodash "^3.10.0" + minimatch "^2.0.3" + output-file-sync "^1.1.0" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + private "^0.1.6" + regenerator "0.8.40" + regexpu "^1.3.0" + repeating "^1.1.2" + resolve "^1.1.6" + shebang-regex "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + source-map-support "^0.2.10" + to-fast-properties "^1.0.0" + trim-right "^1.0.0" + try-resolve "^1.0.0" + +babel-loader@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-5.4.2.tgz#77fe28d8e60d0f056b1c1bca25b8494cdaab9c76" + dependencies: + babel-core "^5.4.0" + loader-utils "^0.2.9" + object-assign "^3.0.0" + +babel-plugin-constant-folding@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" + +babel-plugin-dead-code-elimination@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" + +babel-plugin-eval@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" + +babel-plugin-inline-environment-variables@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" + +babel-plugin-jscript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" + +babel-plugin-member-expression-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" + +babel-plugin-property-literals@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" + +babel-plugin-proto-to-assign@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" + dependencies: + lodash "^3.9.3" + +babel-plugin-react-constant-elements@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" + +babel-plugin-react-display-name@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" + +babel-plugin-remove-console@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" + +babel-plugin-remove-debugger@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" + +babel-plugin-runtime@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" + +babel-plugin-undeclared-variables-check@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" + dependencies: + leven "^1.0.2" + +babel-plugin-undefined-to-void@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" + +babel@^5.8.38: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babel/-/babel-5.8.38.tgz#dfb087c22894917c576fb67ce9cf328d458629fb" + dependencies: + babel-core "^5.6.21" + chokidar "^1.0.0" + commander "^2.6.0" + convert-source-map "^1.1.0" + fs-readdir-recursive "^0.1.0" + glob "^5.0.5" + lodash "^3.2.0" + output-file-sync "^1.1.0" + path-exists "^1.0.0" + path-is-absolute "^1.0.0" + slash "^1.0.0" + source-map "^0.5.0" + +babylon@^5.8.38: + version "5.8.38" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" + +backo2@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + +balanced-match@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" + +base64-arraybuffer@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + +base64-js@^1.0.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +base64id@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +better-assert@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + dependencies: + callsite "1.0.0" + +big.js@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" + +binary-extensions@^1.0.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" + +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^2.9.33: + version "2.11.0" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" + +bluebird@^3.3.0: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + +body-parser@^1.12.4: + version "1.16.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.16.0.tgz#924a5e472c6229fb9d69b85a20d5f2532dec788b" + dependencies: + bytes "2.4.0" + content-type "~1.0.2" + debug "2.6.0" + depd "~1.1.0" + http-errors "~1.5.1" + iconv-lite "0.4.15" + on-finished "~2.3.0" + qs "6.2.1" + raw-body "~2.2.0" + type-is "~1.6.14" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +bootstrap-sass@3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/bootstrap-sass/-/bootstrap-sass-3.3.6.tgz#363b0d300e868d3e70134c1a742bb17288444fd1" + +brace-expansion@^1.0.0: + version "1.1.6" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" + dependencies: + balanced-match "^0.4.1" + concat-map "0.0.1" + +braces@^0.1.2: + version "0.1.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + dependencies: + expand-range "^0.1.0" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +breakable@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" + +browserify-aes@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" + dependencies: + inherits "^2.0.1" + +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" + dependencies: + pako "~0.2.0" + +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + +buffer@^4.9.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + +bytes@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" + +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsite@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2, camelcase@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chokidar@^1.0.0, chokidar@^1.4.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + +circular-json@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-width@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +colors@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +combine-lists@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + dependencies: + lodash "^4.5.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@^2.5.0, commander@^2.6.0, commander@^2.8.1, commander@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + dependencies: + graceful-readlink ">= 1.0.0" + +commoner@~0.10.3: + version "0.10.8" + resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" + dependencies: + commander "^2.5.0" + detective "^4.3.1" + glob "^5.0.15" + graceful-fs "^4.1.2" + iconv-lite "^0.4.5" + mkdirp "^0.5.0" + private "^0.1.6" + q "^1.1.2" + recast "^0.11.17" + +component-bind@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + +component-emitter@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +component-inherit@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + +compressible@~2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.9.tgz#6daab4e2b599c2770dd9e21e7a891b1c5a755425" + dependencies: + mime-db ">= 1.24.0 < 2" + +compression-webpack-plugin@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-0.3.2.tgz#1edfb0e749d7366d3e701670c463359b2c0cf704" + dependencies: + async "0.2.x" + webpack-sources "^0.1.0" + optionalDependencies: + node-zopfli "^2.0.0" + +compression@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" + dependencies: + accepts "~1.3.3" + bytes "2.3.0" + compressible "~2.0.8" + debug "~2.2.0" + on-headers "~1.0.1" + vary "~1.1.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + +concat-stream@^1.4.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +connect-history-api-fallback@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" + +connect@^3.3.5: + version "3.5.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" + dependencies: + debug "~2.2.0" + finalhandler "0.5.0" + parseurl "~1.3.1" + utils-merge "1.0.0" + +console-browserify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + dependencies: + date-now "^0.1.4" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" + +convert-source-map@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.3.0.tgz#e9f3e9c6e2728efc2676696a70eb382f73106a67" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + +core-js@^2.2.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +crypto-browserify@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" + dependencies: + browserify-aes "0.4.0" + pbkdf2-compat "2.0.1" + ripemd160 "0.2.0" + sha.js "2.2.6" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +custom-event@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + +d3@3.5.11: + version "3.5.11" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.11.tgz#d130750eed0554db70e8432102f920a12407b69c" + +d@^0.1.1, d@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" + dependencies: + es5-ext "~0.10.2" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +date-now@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + +dateformat@^1.0.6: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.0, debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + +decamelize@^1.0.0, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-extend@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +defaults@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +defined@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + +defs@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" + dependencies: + alter "~0.2.0" + ast-traverse "~0.1.1" + breakable "~1.0.0" + esprima-fb "~15001.1001.0-dev-harmony-fb" + simple-fmt "~0.1.0" + simple-is "~0.2.0" + stringmap "~0.2.2" + stringset "~0.2.1" + tryor "~0.1.2" + yargs "~3.27.0" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +depd@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +detect-indent@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detective@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.2.tgz#77697e2e7947ac3fe7c8e26a6d6f115235afa91c" + dependencies: + acorn "^3.1.0" + defined "^1.0.0" + +di@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + +doctrine@1.5.0, doctrine@^1.2.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +dom-serialize@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + dependencies: + custom-event "~1.0.0" + ent "~2.2.0" + extend "^3.0.0" + void-elements "^2.0.0" + +domain-browser@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + +dropzone@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dropzone/-/dropzone-4.2.0.tgz#fbe7acbb9918e0706489072ef663effeef8a79f3" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +engine.io-client@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.2.tgz#c38767547f2a7d184f5752f6f0ad501006703766" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.2" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.1" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + +engine.io-parser@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a" + dependencies: + after "0.8.2" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.7" + wtf-8 "1.0.0" + +engine.io@1.8.2: + version "1.8.2" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.2.tgz#6b59be730b348c0125b0a4589de1c355abcf7a7e" + dependencies: + accepts "1.3.3" + base64id "1.0.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.2" + ws "1.1.1" + +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + +ent@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + +errno@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + dependencies: + prr "~0.0.0" + +error-ex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" + dependencies: + is-arrayish "^0.2.1" + +es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: + version "0.10.12" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" + dependencies: + es6-iterator "2" + es6-symbol "~3.1" + +es6-iterator@2: + version "2.0.0" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" + dependencies: + d "^0.1.1" + es5-ext "^0.10.7" + es6-symbol "3" + +es6-map@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.4.tgz#a34b147be224773a4d7da8072794cefa3632b897" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-set "~0.1.3" + es6-symbol "~3.1.0" + event-emitter "~0.3.4" + +es6-promise@~4.0.3: + version "4.0.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" + +es6-set@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.4.tgz#9516b6761c2964b92ff479456233a247dc707ce8" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + es6-iterator "2" + es6-symbol "3" + event-emitter "~0.3.4" + +es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" + dependencies: + d "~0.1.1" + es5-ext "~0.10.11" + +es6-weak-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" + dependencies: + d "^0.1.1" + es5-ext "^0.10.8" + es6-iterator "2" + es6-symbol "3" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-config-airbnb-base@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-10.0.1.tgz#f17d4e52992c1d45d1b7713efbcd5ecd0e7e0506" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-module-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" + dependencies: + debug "2.2.0" + pkg-dir "^1.0.0" + +eslint-plugin-filenames@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-filenames/-/eslint-plugin-filenames-1.1.0.tgz#bb925218ab25b1aad1c622cfa9cb8f43cc03a4ff" + dependencies: + lodash.camelcase "4.1.1" + lodash.kebabcase "4.0.1" + lodash.snakecase "4.0.1" + +eslint-plugin-import@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz#72ba306fad305d67c4816348a4699a4229ac8b4e" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.5.0" + eslint-import-resolver-node "^0.2.0" + eslint-module-utils "^2.0.0" + has "^1.0.1" + lodash.cond "^4.3.0" + minimatch "^3.0.3" + pkg-up "^1.0.0" + +eslint-plugin-jasmine@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-2.2.0.tgz#7135879383c39a667c721d302b9f20f0389543de" + +eslint@^3.10.1: + version "3.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.15.0.tgz#bdcc6a6c5ffe08160e7b93c066695362a91e30f2" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.4.6" + debug "^2.1.1" + doctrine "^1.2.2" + escope "^3.6.0" + espree "^3.4.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.0.tgz#41656fa5628e042878025ef467e78f125cb86e1d" + dependencies: + acorn "4.0.4" + acorn-jsx "^3.0.0" + +esprima-fb@~15001.1001.0-dev-harmony-fb: + version "15001.1001.0-dev-harmony-fb" + resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" + +esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + +esprima@^3.1.1, esprima@~3.1.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esrecurse@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" + dependencies: + estraverse "~4.1.0" + object-assign "^4.0.1" + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + +estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +estraverse@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" + +esutils@^2.0.0, esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +etag@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" + +event-emitter@~0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" + dependencies: + d "~0.1.1" + es5-ext "~0.10.7" + +eventemitter3@1.x.x: + version "1.2.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-braces@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + dependencies: + array-slice "^0.2.3" + array-unique "^0.2.1" + braces "^0.1.2" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + dependencies: + is-number "^0.1.1" + repeat-string "^0.2.2" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +exports-loader@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.3.tgz#57dc78917f709b96f247fa91e69b554c855013c8" + dependencies: + loader-utils "0.2.x" + source-map "0.1.x" + +express@^4.13.3: + version "4.14.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.14.1.tgz#646c237f766f148c2120aff073817b9e4d7e0d33" + dependencies: + accepts "~1.3.3" + array-flatten "1.1.1" + content-disposition "0.5.2" + content-type "~1.0.2" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "~2.2.0" + depd "~1.1.0" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + finalhandler "0.5.1" + fresh "0.3.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.1" + path-to-regexp "0.1.7" + proxy-addr "~1.1.3" + qs "6.2.0" + range-parser "~1.2.0" + send "0.14.2" + serve-static "~1.11.2" + type-is "~1.6.14" + utils-merge "1.0.0" + vary "~1.1.0" + +extend@^3.0.0, extend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extract-zip@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4" + dependencies: + concat-stream "1.5.0" + debug "0.7.4" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" + dependencies: + websocket-driver ">=0.5.1" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +finalhandler@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.1.tgz#2c400d8d4530935bc232549c5fa385ec07de6fcd" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.1" + unpipe "~1.0.0" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +flat-cache@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +for-in@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" + +for-own@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.4.tgz#0149b41a39088c7515f51ebe1c1386d45f935072" + dependencies: + for-in "^0.1.5" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +forwarded@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" + +fresh@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + +fs-extra@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-readdir-recursive@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.0.17" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.0.17.tgz#8537f3f12272678765b4fd6528c0f1f66f8f4558" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.29" + +fstream-ignore@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" + +gauge@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.2.tgz#15cecc31b02d05345a5d6b0e171cdb3ad2307774" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + supports-color "^0.2.0" + wide-align "^1.1.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.6" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob@^5.0.15, glob@^5.0.5: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^6.4.0: + version "6.4.1" + resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" + +globals@^9.14.0: + version "9.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +"graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + +handlebars@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + +has-cors@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hasha@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + dependencies: + is-stream "^1.0.1" + pinkie-promise "^2.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +home-or-tmp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" + dependencies: + os-tmpdir "^1.0.1" + user-home "^1.1.1" + +hosted-git-info@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" + +http-errors@~1.5.0, http-errors@~1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" + +http-proxy-middleware@~0.17.1: + version "0.17.3" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.3.tgz#940382147149b856084f5534752d5b5a8168cd1d" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + +http-proxy@^1.13.0, http-proxy@^1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + dependencies: + eventemitter3 "1.x.x" + requires-port "1.x.x" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" + +iconv-lite@0.4.15, iconv-lite@^0.4.5: + version "0.4.15" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +ignore@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.2.2.tgz#1c51e1ef53bab6ddc15db4d9ac4ec139eceb3410" + +imports-loader@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.6.5.tgz#ae74653031d59e37b3c2fb2544ac61aeae3530a6" + dependencies: + loader-utils "0.2.x" + source-map "0.1.x" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +indexof@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +interpret@^0.6.4: + version "0.6.6" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" + +interpret@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +ipaddr.js@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.0.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.4.tgz#cfc86ccd5dc5a52fa80489111c6920c457e2d98b" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-integer@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.6.tgz#5273819fada880d123e1ac00a938e7172dd8d95e" + dependencies: + is-finite "^1.0.0" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.15.0" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + +is-number@^2.0.2, is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + dependencies: + path-is-inside "^1.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-resolvable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" + dependencies: + tryit "^1.0.1" + +is-stream@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul@^0.4.0, istanbul@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +jasmine-core@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297" + +jasmine-jquery@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz#d4095e646944a26763235769ab018d9f30f0d47b" + +jodid25519@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" + dependencies: + jsbn "~0.1.0" + +"jquery-ui@github:jquery/jquery-ui#1.11.4": + version "1.11.4" + resolved "https://codeload.github.com/jquery/jquery-ui/tar.gz/d6713024e16de90ea71dc0544ba34e1df01b4d8a" + +jquery-ujs@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/jquery-ujs/-/jquery-ujs-1.2.1.tgz#6ee75b1ef4e9ac95e7124f8d71f7d351f5548e92" + dependencies: + jquery ">=1.8.0" + +jquery@2.2.1, jquery@>=1.8.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.1.tgz#3c3e16854ad3d2ac44ac65021b17426d22ad803f" + +js-tokens@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" + +js-tokens@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" + +js-yaml@3.x, js-yaml@^3.5.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.1.tgz#782ba50200be7b9e5a8537001b7804db3ad02628" + dependencies: + argparse "^1.0.7" + esprima "^3.1.1" + +jsbn@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-loader@^0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json3@3.3.2, json3@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + +json5@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" + +json5@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" + dependencies: + extsprintf "1.0.2" + json-schema "0.2.3" + verror "1.3.6" + +karma-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.1.tgz#5aff8b39cf6994dc22de4c84362c76001b637cf6" + dependencies: + dateformat "^1.0.6" + istanbul "^0.4.0" + lodash "^3.8.0" + minimatch "^3.0.0" + source-map "^0.5.1" + +karma-jasmine@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" + +karma-phantomjs-launcher@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.2.tgz#19e1041498fd75563ed86730a22c1fe579fa8fb1" + dependencies: + lodash "^4.0.1" + phantomjs-prebuilt "^2.1.7" + +karma-sourcemap-loader@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8" + dependencies: + graceful-fs "^4.1.2" + +karma-webpack@^1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-1.8.1.tgz#39d5fd2edeea3cc3ef5b405989b37d5b0e6a3b4e" + dependencies: + async "~0.9.0" + loader-utils "^0.2.5" + lodash "^3.8.0" + source-map "^0.1.41" + webpack-dev-middleware "^1.0.11" + +karma@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/karma/-/karma-1.4.1.tgz#41981a71d54237606b0a3ea8c58c90773f41650e" + dependencies: + bluebird "^3.3.0" + body-parser "^1.12.4" + chokidar "^1.4.1" + colors "^1.1.0" + combine-lists "^1.0.0" + connect "^3.3.5" + core-js "^2.2.0" + di "^0.0.1" + dom-serialize "^2.2.0" + expand-braces "^0.1.1" + glob "^7.1.1" + graceful-fs "^4.1.2" + http-proxy "^1.13.0" + isbinaryfile "^3.0.0" + lodash "^3.8.0" + log4js "^0.6.31" + mime "^1.3.4" + minimatch "^3.0.0" + optimist "^0.6.1" + qjobs "^1.1.4" + range-parser "^1.2.0" + rimraf "^2.3.3" + safe-buffer "^5.0.1" + socket.io "1.7.2" + source-map "^0.5.3" + tmp "0.0.28" + useragent "^2.1.10" + +kew@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + +kind-of@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" + dependencies: + is-buffer "^1.0.2" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +leven@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.5, loader-utils@^0.2.9: + version "0.2.16" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" + dependencies: + big.js "^3.1.3" + emojis-list "^2.0.0" + json5 "^0.5.0" + object-assign "^4.0.1" + +lodash.camelcase@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.1.1.tgz#065b3ff08f0b7662f389934c46a5504c90e0b2d8" + dependencies: + lodash.capitalize "^4.0.0" + lodash.deburr "^4.0.0" + lodash.words "^4.0.0" + +lodash.capitalize@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.deburr@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" + +lodash.kebabcase@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz#5e63bc9aa2a5562ff3b97ca7af2f803de1bcb90e" + dependencies: + lodash.deburr "^4.0.0" + lodash.words "^4.0.0" + +lodash.snakecase@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.0.1.tgz#bd012e5d2f93f7b58b9303e9a7fbfd5db13d6281" + dependencies: + lodash.deburr "^4.0.0" + lodash.words "^4.0.0" + +lodash.words@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-4.2.0.tgz#5ecfeaf8ecf8acaa8e0c8386295f1993c9cf4036" + +lodash@^3.10.0, lodash@^3.2.0, lodash@^3.8.0, lodash@^3.9.3: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.2, lodash@^4.3.0, lodash@^4.5.0: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +log4js@^0.6.31: + version "0.6.38" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + dependencies: + readable-stream "~1.0.2" + semver "~4.3.3" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2.2.x: + version "2.2.4" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + +memory-fs@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@~0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +"mime-db@>= 1.24.0 < 2", mime-db@~1.26.0: + version "1.26.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: + version "2.1.14" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" + dependencies: + mime-db "~1.26.0" + +mime@1.3.4, mime@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" + dependencies: + brace-expansion "^1.0.0" + +minimatch@^2.0.3: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mousetrap@1.4.6: + version "1.4.6" + resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.4.6.tgz#eaca72e22e56d5b769b7555873b688c3332e390a" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +nan@^2.0.0, nan@^2.3.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.1.tgz#d5b01691253326a97a2bbee9e61c55d8d60351e2" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +node-libs-browser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.9.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "3.3.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + +node-pre-gyp@^0.6.29, node-pre-gyp@^0.6.4: + version "0.6.33" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.33.tgz#640ac55198f6a925972e0c16c4ac26a034d5ecc9" + dependencies: + mkdirp "~0.5.1" + nopt "~3.0.6" + npmlog "^4.0.1" + rc "~1.1.6" + request "^2.79.0" + rimraf "~2.5.4" + semver "~5.3.0" + tar "~2.2.1" + tar-pack "~3.3.0" + +node-zopfli@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-zopfli/-/node-zopfli-2.0.2.tgz#a7a473ae92aaea85d4c68d45bbf2c944c46116b8" + dependencies: + commander "^2.8.1" + defaults "^1.0.2" + nan "^2.0.0" + node-pre-gyp "^0.6.4" + +nopt@3.x, nopt@~3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" + +npmlog@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.1" + set-blocking "~2.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-component@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + +optimist@^0.6.1, optimist@~0.6.0, optimist@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + +original@>=0.0.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" + +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +output-file-sync@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" + +parseqs@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + dependencies: + better-assert "~1.0.0" + +parseuri@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + dependencies: + better-assert "~1.0.0" + +parseurl@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" + +path-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + +path-exists@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pbkdf2-compat@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +phantomjs-prebuilt@^2.1.7: + version "2.1.14" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0" + dependencies: + es6-promise "~4.0.3" + extract-zip "~1.5.0" + fs-extra "~1.0.0" + hasha "~2.2.0" + kew "~0.7.0" + progress "~1.1.8" + request "~2.79.0" + request-progress "~2.0.1" + which "~1.2.10" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +private@^0.1.6, private@~0.1.5: + version "0.1.7" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process@^0.11.0: + version "0.11.9" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" + +progress@^1.1.8, progress@~1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +proxy-addr@~1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.3.tgz#dc97502f5722e888467b3fa2297a7b1ff47df074" + dependencies: + forwarded "~0.1.0" + ipaddr.js "1.2.0" + +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@^1.1.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + +qjobs@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + +qs@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" + +qs@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" + +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + +randomatic@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" + dependencies: + is-number "^2.0.2" + kind-of "^3.0.2" + +range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.15" + unpipe "1.0.0" + +rc@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~1.0.4" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0, readable-stream@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~1.0.2: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@~2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.4: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +recast@0.10.33: + version "0.10.33" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" + dependencies: + ast-types "0.8.12" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +recast@^0.10.10: + version "0.10.43" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" + dependencies: + ast-types "0.8.15" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + source-map "~0.5.0" + +recast@^0.11.17: + version "0.11.21" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.21.tgz#4e83081c6359ecb2e526d14f4138879333f20ac9" + dependencies: + ast-types "0.9.5" + esprima "~3.1.0" + private "~0.1.5" + source-map "~0.5.0" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" + +regenerator@0.8.40: + version "0.8.40" + resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" + dependencies: + commoner "~0.10.3" + defs "~1.1.0" + esprima-fb "~15001.1001.0-dev-harmony-fb" + private "~0.1.5" + recast "0.10.33" + through "~2.3.8" + +regex-cache@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + dependencies: + is-equal-shallow "^0.1.3" + is-primitive "^2.0.0" + +regexpu@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" + dependencies: + esprima "^2.6.0" + recast "^0.10.10" + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.0, repeating@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +request-progress@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + dependencies: + throttleit "^1.0.0" + +request@^2.79.0, request@~2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +requires-port@1.0.x, requires-port@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +resolve@^1.1.6: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + +ripemd160@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +safe-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" + +select2@3.5.2-browserify: + version "3.5.2-browserify" + resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.2-browserify.tgz#dc4dafda38d67a734e8a97a46f0d3529ae05391d" + +"semver@2 || 3 || 4 || 5", semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@~4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +send@0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.14.2.tgz#39b0438b3f510be5dc6f667a11f71689368cdeef" + dependencies: + debug "~2.2.0" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.7.0" + fresh "0.3.0" + http-errors "~1.5.1" + mime "1.3.4" + ms "0.7.2" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-index@^1.7.2: + version "1.8.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" + dependencies: + accepts "~1.3.3" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.5.0" + mime-types "~2.1.11" + parseurl "~1.3.1" + +serve-static@~1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.11.2.tgz#2cf9889bd4435a320cc36895c9aa57bd662e6ac7" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.14.2" + +set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +sha.js@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@^0.7.5: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +simple-fmt@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" + +simple-is@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" + +socket.io-client@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.2.tgz#39fdb0c3dd450e321b7e40cfd83612ec533dd644" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.2" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" + +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" + dependencies: + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" + +socket.io@1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.2.tgz#83bbbdf2e79263b378900da403e7843e05dc3b71" + dependencies: + debug "2.3.3" + engine.io "1.8.2" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.7.2" + socket.io-parser "2.3.1" + +sockjs-client@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.2.tgz#f0212a8550e4c9468c8cceaeefd2e3493c033ad5" + dependencies: + debug "^2.2.0" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.1" + +sockjs@^0.3.15: + version "0.3.18" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" + dependencies: + faye-websocket "^0.10.0" + uuid "^2.0.2" + +source-list-map@~0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + +source-map-support@^0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" + dependencies: + source-map "0.1.32" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + dependencies: + amdefine ">=0.0.4" + +source-map@0.1.x, source-map@^0.1.41: + version "0.1.43" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.4.4, source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: + version "0.5.6" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + dependencies: + amdefine ">=0.0.4" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jodid25519 "^1.0.0" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stable@~0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.5.tgz#08232f60c732e9890784b5bed0734f8b32a887b9" + +stats-webpack-plugin@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.4.3.tgz#b2f618202f28dd04ab47d7ecf54ab846137b7aea" + +"statuses@>= 1.3.1 < 2", statuses@~1.3.0, statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + +stream-browserify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-cache@~0.0.1: + version "0.0.2" + resolved "https://registry.yarnpkg.com/stream-cache/-/stream-cache-0.0.2.tgz#1ac5ad6832428ca55667dbdee395dad4e6db118f" + +stream-http@^2.3.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.3.tgz#4c3ddbf9635968ea2cfd4e48d43de5def2625ac3" + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.1.0" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^3.0.0" + +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +stringmap@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" + +stringset@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" + +stringstream@~0.0.4: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.0, supports-color@^3.1.1: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tapable@^0.1.8, tapable@~0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + +tar-pack@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" + dependencies: + debug "~2.2.0" + fstream "~1.0.10" + fstream-ignore "~1.0.5" + once "~1.3.3" + readable-stream "~2.1.4" + rimraf "~2.5.1" + tar "~2.2.1" + uid-number "~0.0.6" + +tar@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +throttleit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + +through@^2.3.6, through@~2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +timers-browserify@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" + dependencies: + setimmediate "^1.0.4" + +tmp@0.0.28, tmp@0.0.x: + version "0.0.28" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + dependencies: + os-tmpdir "~1.0.1" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + +to-fast-properties@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" + +tough-cookie@~2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +try-resolve@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" + +tryit@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" + +tryor@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-is@~1.6.14: + version "1.6.14" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.13" + +typedarray@^0.0.6, typedarray@~0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.6, uglify-js@~2.7.3: + version "2.7.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" + dependencies: + async "~0.2.6" + source-map "~0.5.1" + uglify-to-browserify "~1.0.0" + yargs "~3.10.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@~0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + +underscore@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url-parse@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +useragent@^2.1.10: + version "2.1.12" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.12.tgz#aa7da6cdc48bdc37ba86790871a7321d64edbaa2" + dependencies: + lru-cache "2.2.x" + tmp "0.0.x" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +util@0.10.3, util@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1" + +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" + +uuid@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" + +uuid@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +vary@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.0.tgz#e1e5affbbd16ae768dd2674394b9ad3022653140" + +verror@1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" + dependencies: + extsprintf "1.0.2" + +vm-browserify@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + dependencies: + indexof "0.0.1" + +void-elements@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + +vue-resource@0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/vue-resource/-/vue-resource-0.9.3.tgz#ab46e1c44ea219142dcc28ae4043b3b04c80959d" + +vue@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.0.3.tgz#3f7698f83d6ad1f0e35955447901672876c63fde" + +watchpack@^0.2.1: + version "0.2.9" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" + dependencies: + async "^0.9.0" + chokidar "^1.0.0" + graceful-fs "^4.1.2" + +webpack-core@~0.6.9: + version "0.6.9" + resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + dependencies: + source-list-map "~0.1.7" + source-map "~0.4.1" + +webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.4.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.0.tgz#7d5be2651e692fddfafd8aaed177c16ff51f0eb8" + dependencies: + memory-fs "~0.4.1" + mime "^1.3.4" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + +webpack-dev-server@^1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.3.tgz#cbb6a0d3e7c8eb5453b3e9befcbe843219f62661" + dependencies: + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + express "^4.13.3" + http-proxy-middleware "~0.17.1" + open "0.0.5" + optimist "~0.6.1" + serve-index "^1.7.2" + sockjs "^0.3.15" + sockjs-client "^1.0.3" + stream-cache "~0.0.1" + strip-ansi "^3.0.0" + supports-color "^3.1.1" + webpack-dev-middleware "^1.4.0" + +webpack-sources@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.4.tgz#ccc2c817e08e5fa393239412690bb481821393cd" + dependencies: + source-list-map "~0.1.7" + source-map "~0.5.3" + +webpack@^1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" + dependencies: + acorn "^3.0.0" + async "^1.3.0" + clone "^1.0.2" + enhanced-resolve "~0.9.0" + interpret "^0.6.4" + loader-utils "^0.2.11" + memory-fs "~0.3.0" + mkdirp "~0.5.0" + node-libs-browser "^0.7.0" + optimist "~0.6.0" + supports-color "^3.1.0" + tapable "~0.1.8" + uglify-js "~2.7.3" + watchpack "^0.2.1" + webpack-core "~0.6.9" + +websocket-driver@>=0.5.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + dependencies: + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" + +which@^1.1.1, which@~1.2.10: + version "1.2.12" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" + dependencies: + isexe "^1.1.1" + +wide-align@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" + dependencies: + string-width "^1.0.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +window-size@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@^1.0.0, wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +ws@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" + +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + +xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +y18n@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yargs@~3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" + dependencies: + camelcase "^1.2.1" + cliui "^2.1.0" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +yeast@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" From 93d4234efa43dea4165a8b0b87c51eb7d6131f28 Mon Sep 17 00:00:00 2001 From: Joe Marty Date: Tue, 7 Feb 2017 14:43:08 -0600 Subject: [PATCH 149/313] Add omniauth-oauth2-generic strategy - Allows configurable Single Sign On with most simple OAuth2 providers - Adds documentation for the new strategy Closes #26744 --- Gemfile | 1 + Gemfile.lock | 3 ++ doc/integration/oauth2_generic.md | 60 +++++++++++++++++++++++++++++++ doc/integration/omniauth.md | 1 + 4 files changed, 65 insertions(+) create mode 100644 doc/integration/oauth2_generic.md diff --git a/Gemfile b/Gemfile index 79433b12823..0060f122512 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,7 @@ gem 'omniauth-github', '~> 1.1.1' gem 'omniauth-gitlab', '~> 1.0.2' gem 'omniauth-google-oauth2', '~> 0.4.1' gem 'omniauth-kerberos', '~> 0.3.0', group: :kerberos +gem 'omniauth-oauth2-generic', '~> 0.2.2' gem 'omniauth-saml', '~> 1.7.0' gem 'omniauth-shibboleth', '~> 1.2.0' gem 'omniauth-twitter', '~> 1.2.0' diff --git a/Gemfile.lock b/Gemfile.lock index 235426afa49..a3c2fad41ba 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -483,6 +483,8 @@ GEM omniauth-oauth2 (1.3.1) oauth2 (~> 1.0) omniauth (~> 1.2) + omniauth-oauth2-generic (0.2.2) + omniauth-oauth2 (~> 1.0) omniauth-saml (1.7.0) omniauth (~> 1.3) ruby-saml (~> 1.4) @@ -931,6 +933,7 @@ DEPENDENCIES omniauth-gitlab (~> 1.0.2) omniauth-google-oauth2 (~> 0.4.1) omniauth-kerberos (~> 0.3.0) + omniauth-oauth2-generic (~> 0.2.2) omniauth-saml (~> 1.7.0) omniauth-shibboleth (~> 1.2.0) omniauth-twitter (~> 1.2.0) diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md new file mode 100644 index 00000000000..3953df18d85 --- /dev/null +++ b/doc/integration/oauth2_generic.md @@ -0,0 +1,60 @@ +# Sign into Gitlab with (almost) any OAuth2 provider + +The `omniauth-oauth2-generic` gem allows Single Sign On between Gitlab and your own OAuth2 provider (or any simple OAuth2 provider compatible with this gem) + +This strategy is designed to allow configuration of the simple OmniAuth SSO process outlined below: + +1. Strategy directs client to your authorization URL (**configurable**), with specified ID and key +1. OAuth provider handles authentication of request, user, and (optionally) authorization to access user's profile +1. OAuth provider directs client back to Gitlab where Strategy handles retrieval of access token +1. Strategy requests user information from a **configurable** "user profile" URL (using the access token) +1. Strategy parses user information from the response, using a **configurable** format +1. Gitlab finds or creates the returned user and logs them in + +**Limitations of this Strategy:** + +- It can only be used for Single Sign on, and will not provide any other access granted by any OAuth provider (such as importing projects or users, etc). +- It only supports the Authorization Grant flow (most common for client-server applications, like Gitlab) +- It is not able to fetch user information from more than one URL +- It has not been tested with user information formats other than JSON + +### Config Instructions +1. To enable the OAuth2 generic strategy you must register your application in the OAuth2 provider you wish to authenticate with. + That provider should generate an ID and secret key for you to use with this strategy. + + The redirect URI you provide when registering the application should be: + + ``` + http://your-gitlab.host.com/users/auth/oauth2_generic/callback + ``` + +1. You should now be able to get a Client ID and Client Secret. Where this shows up will differ for each provider. + This may also be called Application ID and Secret. + +1. On your GitLab server, open the configuration file. + + For omnibus package: + + ```sh + sudo editor /etc/gitlab/gitlab.rb + ``` + + For installations from source: + + ```sh + cd /home/git/gitlab + + sudo -u git -H editor config/gitlab.yml + ``` + +1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. + +1. Add the provider-specific configuration for your provider, as [described in the gem's README](https://gitlab.com/satorix/omniauth-oauth2-generic#gitlab-config-example) + +1. Save the configuration file. + +1. Restart GitLab for the changes to take effect. + +On the sign in page there should now be a new button below the regular sign in form. +Click the button to begin your provider's authentication process. This will direct the browser to your OAuth2 Provider's authentication page. +If everything goes well the user will be returned to your GitLab instance and will be signed in. diff --git a/doc/integration/omniauth.md b/doc/integration/omniauth.md index 98a680d0dbe..47e20d7566a 100644 --- a/doc/integration/omniauth.md +++ b/doc/integration/omniauth.md @@ -31,6 +31,7 @@ contains some settings that are common for all providers. - [Azure](azure.md) - [Auth0](auth0.md) - [Authentiq](../administration/auth/authentiq.md) +- [OAuth2Generic](oauth2_generic.md) ## Initial OmniAuth Configuration From be567848b386bdb28fcc35d745db1bdaaabc90e3 Mon Sep 17 00:00:00 2001 From: Joe Marty Date: Tue, 7 Feb 2017 15:05:51 -0600 Subject: [PATCH 150/313] Add changelog entry for #26744 --- .../unreleased/26744-add-omniauth-oauth2-generic-strategy.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml diff --git a/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml b/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml new file mode 100644 index 00000000000..abf6c3b02c2 --- /dev/null +++ b/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml @@ -0,0 +1,3 @@ +title: Add the omniaut-oauth2-generic OmniAuth strategy +merge_request: 9048 +author: Joe Marty \ No newline at end of file From 70f75ca10848df6b28a2bc60c3b8d62731a0ea77 Mon Sep 17 00:00:00 2001 From: Joe Marty Date: Tue, 7 Feb 2017 15:32:26 -0600 Subject: [PATCH 151/313] Edit omniauth-oauth2-generic docs for style conformance --- doc/integration/oauth2_generic.md | 57 +++++++++++++++++-------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md index 3953df18d85..5ff63a56c3e 100644 --- a/doc/integration/oauth2_generic.md +++ b/doc/integration/oauth2_generic.md @@ -1,6 +1,7 @@ # Sign into Gitlab with (almost) any OAuth2 provider -The `omniauth-oauth2-generic` gem allows Single Sign On between Gitlab and your own OAuth2 provider (or any simple OAuth2 provider compatible with this gem) +The `omniauth-oauth2-generic` gem allows Single Sign On between Gitlab and your own OAuth2 provider +(or any OAuth2 provider compatible with this gem) This strategy is designed to allow configuration of the simple OmniAuth SSO process outlined below: @@ -11,50 +12,54 @@ This strategy is designed to allow configuration of the simple OmniAuth SSO proc 1. Strategy parses user information from the response, using a **configurable** format 1. Gitlab finds or creates the returned user and logs them in -**Limitations of this Strategy:** +### Limitations of this Strategy: -- It can only be used for Single Sign on, and will not provide any other access granted by any OAuth provider (such as importing projects or users, etc). +- It can only be used for Single Sign on, and will not provide any other access granted by any OAuth provider + (importing projects or users, etc) - It only supports the Authorization Grant flow (most common for client-server applications, like Gitlab) - It is not able to fetch user information from more than one URL - It has not been tested with user information formats other than JSON ### Config Instructions -1. To enable the OAuth2 generic strategy you must register your application in the OAuth2 provider you wish to authenticate with. - That provider should generate an ID and secret key for you to use with this strategy. +1. Register your application in the OAuth2 provider you wish to authenticate with. The redirect URI you provide when registering the application should be: - ``` - http://your-gitlab.host.com/users/auth/oauth2_generic/callback - ``` + ``` + http://your-gitlab.host.com/users/auth/oauth2_generic/callback + ``` -1. You should now be able to get a Client ID and Client Secret. Where this shows up will differ for each provider. - This may also be called Application ID and Secret. +1. You should now be able to get a Client ID and Client Secret. + Where this shows up will differ for each provider. + This may also be called Application ID and Secret -1. On your GitLab server, open the configuration file. +1. On your GitLab server, open the configuration file. - For omnibus package: + For omnibus package: - ```sh - sudo editor /etc/gitlab/gitlab.rb - ``` + ```sh + sudo editor /etc/gitlab/gitlab.rb + ``` - For installations from source: + For installations from source: - ```sh - cd /home/git/gitlab + ```sh + cd /home/git/gitlab - sudo -u git -H editor config/gitlab.yml - ``` + sudo -u git -H editor config/gitlab.yml + ``` -1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings. +1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings -1. Add the provider-specific configuration for your provider, as [described in the gem's README](https://gitlab.com/satorix/omniauth-oauth2-generic#gitlab-config-example) +1. Add the provider-specific configuration for your provider, as [described in the gem's README][1] -1. Save the configuration file. +1. Save the configuration file -1. Restart GitLab for the changes to take effect. +1. Restart GitLab for the changes to take effect On the sign in page there should now be a new button below the regular sign in form. -Click the button to begin your provider's authentication process. This will direct the browser to your OAuth2 Provider's authentication page. -If everything goes well the user will be returned to your GitLab instance and will be signed in. +Click the button to begin your provider's authentication process. This will direct +the browser to your OAuth2 Provider's authentication page. If everything goes well +the user will be returned to your GitLab instance and will be signed in. + +[1]: https://gitlab.com/satorix/omniauth-oauth2-generic#gitlab-config-example \ No newline at end of file From 6d756b2b6a8cf470b3ba646048d3969889e55c94 Mon Sep 17 00:00:00 2001 From: Joe Marty Date: Fri, 10 Feb 2017 10:11:12 -0600 Subject: [PATCH 152/313] Fix spelling errors in docs and changelog --- .../26744-add-omniauth-oauth2-generic-strategy.yml | 2 +- doc/integration/oauth2_generic.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml b/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml index abf6c3b02c2..15da43b8091 100644 --- a/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml +++ b/changelogs/unreleased/26744-add-omniauth-oauth2-generic-strategy.yml @@ -1,3 +1,3 @@ -title: Add the omniaut-oauth2-generic OmniAuth strategy +title: Add the oauth2_generic OmniAuth strategy merge_request: 9048 author: Joe Marty \ No newline at end of file diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md index 5ff63a56c3e..0661bc62d2d 100644 --- a/doc/integration/oauth2_generic.md +++ b/doc/integration/oauth2_generic.md @@ -1,22 +1,22 @@ -# Sign into Gitlab with (almost) any OAuth2 provider +# Sign into GitLab with (almost) any OAuth2 provider -The `omniauth-oauth2-generic` gem allows Single Sign On between Gitlab and your own OAuth2 provider +The `omniauth-oauth2-generic` gem allows Single Sign On between GitLab and your own OAuth2 provider (or any OAuth2 provider compatible with this gem) This strategy is designed to allow configuration of the simple OmniAuth SSO process outlined below: 1. Strategy directs client to your authorization URL (**configurable**), with specified ID and key 1. OAuth provider handles authentication of request, user, and (optionally) authorization to access user's profile -1. OAuth provider directs client back to Gitlab where Strategy handles retrieval of access token +1. OAuth provider directs client back to GitLab where Strategy handles retrieval of access token 1. Strategy requests user information from a **configurable** "user profile" URL (using the access token) 1. Strategy parses user information from the response, using a **configurable** format -1. Gitlab finds or creates the returned user and logs them in +1. GitLab finds or creates the returned user and logs them in ### Limitations of this Strategy: - It can only be used for Single Sign on, and will not provide any other access granted by any OAuth provider (importing projects or users, etc) -- It only supports the Authorization Grant flow (most common for client-server applications, like Gitlab) +- It only supports the Authorization Grant flow (most common for client-server applications, like GitLab) - It is not able to fetch user information from more than one URL - It has not been tested with user information formats other than JSON @@ -35,7 +35,7 @@ This strategy is designed to allow configuration of the simple OmniAuth SSO proc 1. On your GitLab server, open the configuration file. - For omnibus package: + For Omnibus package: ```sh sudo editor /etc/gitlab/gitlab.rb From d1e951c343a4916f19e2c275bc9cded35e5a56d8 Mon Sep 17 00:00:00 2001 From: Joe Marty Date: Mon, 13 Feb 2017 09:57:36 -0600 Subject: [PATCH 153/313] Adjust doc formatting --- doc/integration/oauth2_generic.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/integration/oauth2_generic.md b/doc/integration/oauth2_generic.md index 0661bc62d2d..e71706fef7d 100644 --- a/doc/integration/oauth2_generic.md +++ b/doc/integration/oauth2_generic.md @@ -21,6 +21,7 @@ This strategy is designed to allow configuration of the simple OmniAuth SSO proc - It has not been tested with user information formats other than JSON ### Config Instructions + 1. Register your application in the OAuth2 provider you wish to authenticate with. The redirect URI you provide when registering the application should be: @@ -38,15 +39,14 @@ This strategy is designed to allow configuration of the simple OmniAuth SSO proc For Omnibus package: ```sh - sudo editor /etc/gitlab/gitlab.rb + sudo editor /etc/gitlab/gitlab.rb ``` For installations from source: ```sh - cd /home/git/gitlab - - sudo -u git -H editor config/gitlab.yml + cd /home/git/gitlab + sudo -u git -H editor config/gitlab.yml ``` 1. See [Initial OmniAuth Configuration](omniauth.md#initial-omniauth-configuration) for initial settings From c2102e6e3bf4fa5220d5fa4d3a4c1549f7385162 Mon Sep 17 00:00:00 2001 From: Oswaldo Ferreira Date: Thu, 2 Feb 2017 15:57:34 -0200 Subject: [PATCH 154/313] Move /projects/fork/:id to /projects/:id/fork --- .../unreleased/14492-change-fork-endpoint.yml | 4 + doc/api/projects.md | 2 +- doc/api/v3_to_v4.md | 1 + lib/api/projects.rb | 2 +- spec/requests/api/fork_spec.rb | 134 ------------------ spec/requests/api/projects_spec.rb | 126 ++++++++++++++++ 6 files changed, 133 insertions(+), 136 deletions(-) create mode 100644 changelogs/unreleased/14492-change-fork-endpoint.yml delete mode 100644 spec/requests/api/fork_spec.rb diff --git a/changelogs/unreleased/14492-change-fork-endpoint.yml b/changelogs/unreleased/14492-change-fork-endpoint.yml new file mode 100644 index 00000000000..39024b51b54 --- /dev/null +++ b/changelogs/unreleased/14492-change-fork-endpoint.yml @@ -0,0 +1,4 @@ +--- +title: Move /projects/fork/:id to /projects/:id/fork +merge_request: 8940 +author: diff --git a/doc/api/projects.md b/doc/api/projects.md index bad238f57d7..e579b89d836 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -705,7 +705,7 @@ Parameters: Forks a project into the user namespace of the authenticated user or the one provided. ``` -POST /projects/fork/:id +POST /projects/:id/fork ``` Parameters: diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md index 0ae07b5d3de..7811025f34e 100644 --- a/doc/api/v3_to_v4.md +++ b/doc/api/v3_to_v4.md @@ -22,4 +22,5 @@ changes are in V4: - `/gitignores/:key` - `/gitlab_ci_ymls/:key` - `/dockerfiles/:key` +- Moved `/projects/fork/:id` to `/projects/:id/fork` diff --git a/lib/api/projects.rb b/lib/api/projects.rb index bd4b23195ac..2cacb246db8 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -220,7 +220,7 @@ module API params do optional :namespace, type: String, desc: 'The ID or name of the namespace that the project will be forked into' end - post 'fork/:id' do + post ':id/fork' do fork_params = declared_params(include_missing: false) namespace_id = fork_params[:namespace] diff --git a/spec/requests/api/fork_spec.rb b/spec/requests/api/fork_spec.rb deleted file mode 100644 index 92ac4fd334d..00000000000 --- a/spec/requests/api/fork_spec.rb +++ /dev/null @@ -1,134 +0,0 @@ -require 'spec_helper' - -describe API::Projects, api: true do - include ApiHelpers - let(:user) { create(:user) } - let(:user2) { create(:user) } - let(:admin) { create(:admin) } - let(:group) { create(:group) } - let(:group2) do - group = create(:group, name: 'group2_name') - group.add_owner(user2) - group - end - - describe 'POST /projects/fork/:id' do - let(:project) do - create(:project, :repository, creator: user, namespace: user.namespace) - end - - before do - project.add_reporter(user2) - end - - context 'when authenticated' do - it 'forks if user has sufficient access to project' do - post api("/projects/fork/#{project.id}", user2) - - expect(response).to have_http_status(201) - expect(json_response['name']).to eq(project.name) - expect(json_response['path']).to eq(project.path) - expect(json_response['owner']['id']).to eq(user2.id) - expect(json_response['namespace']['id']).to eq(user2.namespace.id) - expect(json_response['forked_from_project']['id']).to eq(project.id) - end - - it 'forks if user is admin' do - post api("/projects/fork/#{project.id}", admin) - - expect(response).to have_http_status(201) - expect(json_response['name']).to eq(project.name) - expect(json_response['path']).to eq(project.path) - expect(json_response['owner']['id']).to eq(admin.id) - expect(json_response['namespace']['id']).to eq(admin.namespace.id) - expect(json_response['forked_from_project']['id']).to eq(project.id) - end - - it 'fails on missing project access for the project to fork' do - new_user = create(:user) - post api("/projects/fork/#{project.id}", new_user) - - expect(response).to have_http_status(404) - expect(json_response['message']).to eq('404 Project Not Found') - end - - it 'fails if forked project exists in the user namespace' do - post api("/projects/fork/#{project.id}", user) - - expect(response).to have_http_status(409) - expect(json_response['message']['name']).to eq(['has already been taken']) - expect(json_response['message']['path']).to eq(['has already been taken']) - end - - it 'fails if project to fork from does not exist' do - post api('/projects/fork/424242', user) - - expect(response).to have_http_status(404) - expect(json_response['message']).to eq('404 Project Not Found') - end - - it 'forks with explicit own user namespace id' do - post api("/projects/fork/#{project.id}", user2), namespace: user2.namespace.id - - expect(response).to have_http_status(201) - expect(json_response['owner']['id']).to eq(user2.id) - end - - it 'forks with explicit own user name as namespace' do - post api("/projects/fork/#{project.id}", user2), namespace: user2.username - - expect(response).to have_http_status(201) - expect(json_response['owner']['id']).to eq(user2.id) - end - - it 'forks to another user when admin' do - post api("/projects/fork/#{project.id}", admin), namespace: user2.username - - expect(response).to have_http_status(201) - expect(json_response['owner']['id']).to eq(user2.id) - end - - it 'fails if trying to fork to another user when not admin' do - post api("/projects/fork/#{project.id}", user2), namespace: admin.namespace.id - - expect(response).to have_http_status(404) - end - - it 'fails if trying to fork to non-existent namespace' do - post api("/projects/fork/#{project.id}", user2), namespace: 42424242 - - expect(response).to have_http_status(404) - expect(json_response['message']).to eq('404 Target Namespace Not Found') - end - - it 'forks to owned group' do - post api("/projects/fork/#{project.id}", user2), namespace: group2.name - - expect(response).to have_http_status(201) - expect(json_response['namespace']['name']).to eq(group2.name) - end - - it 'fails to fork to not owned group' do - post api("/projects/fork/#{project.id}", user2), namespace: group.name - - expect(response).to have_http_status(404) - end - - it 'forks to not owned group when admin' do - post api("/projects/fork/#{project.id}", admin), namespace: group.name - - expect(response).to have_http_status(201) - expect(json_response['namespace']['name']).to eq(group.name) - end - end - - context 'when unauthenticated' do - it 'returns authentication error' do - post api("/projects/fork/#{project.id}") - - expect(response).to have_http_status(401) - expect(json_response['message']).to eq('401 Unauthorized') - end - end - end -end diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index ac0bbec44e0..17b5e372bdc 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -1332,4 +1332,130 @@ describe API::Projects, api: true do end end end + + describe 'POST /projects/:id/fork' do + let(:project) do + create(:project, :repository, creator: user, namespace: user.namespace) + end + let(:group) { create(:group) } + let(:group2) do + group = create(:group, name: 'group2_name') + group.add_owner(user2) + group + end + + before do + project.add_reporter(user2) + end + + context 'when authenticated' do + it 'forks if user has sufficient access to project' do + post api("/projects/#{project.id}/fork", user2) + + expect(response).to have_http_status(201) + expect(json_response['name']).to eq(project.name) + expect(json_response['path']).to eq(project.path) + expect(json_response['owner']['id']).to eq(user2.id) + expect(json_response['namespace']['id']).to eq(user2.namespace.id) + expect(json_response['forked_from_project']['id']).to eq(project.id) + end + + it 'forks if user is admin' do + post api("/projects/#{project.id}/fork", admin) + + expect(response).to have_http_status(201) + expect(json_response['name']).to eq(project.name) + expect(json_response['path']).to eq(project.path) + expect(json_response['owner']['id']).to eq(admin.id) + expect(json_response['namespace']['id']).to eq(admin.namespace.id) + expect(json_response['forked_from_project']['id']).to eq(project.id) + end + + it 'fails on missing project access for the project to fork' do + new_user = create(:user) + post api("/projects/#{project.id}/fork", new_user) + + expect(response).to have_http_status(404) + expect(json_response['message']).to eq('404 Project Not Found') + end + + it 'fails if forked project exists in the user namespace' do + post api("/projects/#{project.id}/fork", user) + + expect(response).to have_http_status(409) + expect(json_response['message']['name']).to eq(['has already been taken']) + expect(json_response['message']['path']).to eq(['has already been taken']) + end + + it 'fails if project to fork from does not exist' do + post api('/projects/424242/fork', user) + + expect(response).to have_http_status(404) + expect(json_response['message']).to eq('404 Project Not Found') + end + + it 'forks with explicit own user namespace id' do + post api("/projects/#{project.id}/fork", user2), namespace: user2.namespace.id + + expect(response).to have_http_status(201) + expect(json_response['owner']['id']).to eq(user2.id) + end + + it 'forks with explicit own user name as namespace' do + post api("/projects/#{project.id}/fork", user2), namespace: user2.username + + expect(response).to have_http_status(201) + expect(json_response['owner']['id']).to eq(user2.id) + end + + it 'forks to another user when admin' do + post api("/projects/#{project.id}/fork", admin), namespace: user2.username + + expect(response).to have_http_status(201) + expect(json_response['owner']['id']).to eq(user2.id) + end + + it 'fails if trying to fork to another user when not admin' do + post api("/projects/#{project.id}/fork", user2), namespace: admin.namespace.id + + expect(response).to have_http_status(404) + end + + it 'fails if trying to fork to non-existent namespace' do + post api("/projects/#{project.id}/fork", user2), namespace: 42424242 + + expect(response).to have_http_status(404) + expect(json_response['message']).to eq('404 Target Namespace Not Found') + end + + it 'forks to owned group' do + post api("/projects/#{project.id}/fork", user2), namespace: group2.name + + expect(response).to have_http_status(201) + expect(json_response['namespace']['name']).to eq(group2.name) + end + + it 'fails to fork to not owned group' do + post api("/projects/#{project.id}/fork", user2), namespace: group.name + + expect(response).to have_http_status(404) + end + + it 'forks to not owned group when admin' do + post api("/projects/#{project.id}/fork", admin), namespace: group.name + + expect(response).to have_http_status(201) + expect(json_response['namespace']['name']).to eq(group.name) + end + end + + context 'when unauthenticated' do + it 'returns authentication error' do + post api("/projects/#{project.id}/fork") + + expect(response).to have_http_status(401) + expect(json_response['message']).to eq('401 Unauthorized') + end + end + end end From 2c55fd0019ea9ac33e310151a61892fada42d5a2 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 13 Feb 2017 13:26:33 +0200 Subject: [PATCH 155/313] Add GFM support to nested groups Signed-off-by: Dmitriy Zaporozhets --- app/models/group.rb | 2 +- app/models/user.rb | 2 +- app/services/projects/participants_service.rb | 2 +- lib/banzai/filter/abstract_reference_filter.rb | 2 +- lib/banzai/filter/user_reference_filter.rb | 6 +++--- lib/gitlab/regex.rb | 4 ++++ .../lib/banzai/filter/user_reference_filter_spec.rb | 13 +++++++++++++ spec/lib/gitlab/regex_spec.rb | 12 ++++++++++++ 8 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/models/group.rb b/app/models/group.rb index cc6624ff4aa..240a17f1dc1 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -81,7 +81,7 @@ class Group < Namespace end def to_reference(_from_project = nil, full: nil) - "#{self.class.reference_prefix}#{name}" + "#{self.class.reference_prefix}#{full_path}" end def web_url diff --git a/app/models/user.rb b/app/models/user.rb index 1649bf04eaa..ad997ce2b13 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -335,7 +335,7 @@ class User < ActiveRecord::Base def reference_pattern %r{ #{Regexp.escape(reference_prefix)} - (?#{Gitlab::Regex::NAMESPACE_REGEX_STR}) + (?#{Gitlab::Regex::NAMESPACE_REF_REGEX_STR}) }x end end diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb index 96c363c8d1a..e6193fcacee 100644 --- a/app/services/projects/participants_service.rb +++ b/app/services/projects/participants_service.rb @@ -36,7 +36,7 @@ module Projects def groups current_user.authorized_groups.sort_by(&:path).map do |group| count = group.users.count - { username: group.path, name: group.name, count: count, avatar_url: group.avatar_url } + { username: group.full_path, name: group.full_name, count: count, avatar_url: group.avatar_url } end end diff --git a/lib/banzai/filter/abstract_reference_filter.rb b/lib/banzai/filter/abstract_reference_filter.rb index a3d495a5da0..955d857c679 100644 --- a/lib/banzai/filter/abstract_reference_filter.rb +++ b/lib/banzai/filter/abstract_reference_filter.rb @@ -285,7 +285,7 @@ module Banzai end def current_project_namespace_path - @current_project_namespace_path ||= project.namespace.path + @current_project_namespace_path ||= project.namespace.full_path end private diff --git a/lib/banzai/filter/user_reference_filter.rb b/lib/banzai/filter/user_reference_filter.rb index 1aa9355b256..c973897f420 100644 --- a/lib/banzai/filter/user_reference_filter.rb +++ b/lib/banzai/filter/user_reference_filter.rb @@ -75,8 +75,8 @@ module Banzai # corresponding Namespace objects. def namespaces @namespaces ||= - Namespace.where(path: usernames).each_with_object({}) do |row, hash| - hash[row.path] = row + Namespace.where_full_path_in(usernames).each_with_object({}) do |row, hash| + hash[row.full_path] = row end end @@ -122,7 +122,7 @@ module Banzai def link_to_namespace(namespace, link_content: nil) if namespace.is_a?(Group) - link_to_group(namespace.path, namespace, link_content: link_content) + link_to_group(namespace.full_path, namespace, link_content: link_content) else link_to_user(namespace.path, namespace, link_content: link_content) end diff --git a/lib/gitlab/regex.rb b/lib/gitlab/regex.rb index a3fa7c1331a..c77fe2d8bdc 100644 --- a/lib/gitlab/regex.rb +++ b/lib/gitlab/regex.rb @@ -13,6 +13,10 @@ module Gitlab NAMESPACE_REGEX_STR = '(?:' + NAMESPACE_REGEX_STR_SIMPLE + ')(?#{reference}<\/a>\.\)/) diff --git a/spec/lib/gitlab/regex_spec.rb b/spec/lib/gitlab/regex_spec.rb index 1dbc2f6eb13..089ec4e2737 100644 --- a/spec/lib/gitlab/regex_spec.rb +++ b/spec/lib/gitlab/regex_spec.rb @@ -50,4 +50,16 @@ describe Gitlab::Regex, lib: true do it { is_expected.not_to match('9foo') } it { is_expected.not_to match('foo-') } end + + describe 'NAMESPACE_REF_REGEX_STR' do + subject { %r{\A#{Gitlab::Regex::NAMESPACE_REF_REGEX_STR}\z} } + + it { is_expected.to match('gitlab.org') } + it { is_expected.to match('gitlab.org/gitlab-git') } + it { is_expected.not_to match('gitlab.org.') } + it { is_expected.not_to match('gitlab.org/') } + it { is_expected.not_to match('/gitlab.org') } + it { is_expected.not_to match('gitlab.git') } + it { is_expected.not_to match('gitlab git') } + end end From 010c9337b5e024d5af586fcc8d73fe72a52fd9f1 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Mon, 13 Feb 2017 15:55:12 -0600 Subject: [PATCH 156/313] Add tests --- spec/javascripts/gl_dropdown_spec.js.es6 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/spec/javascripts/gl_dropdown_spec.js.es6 b/spec/javascripts/gl_dropdown_spec.js.es6 index 317f38c5888..c207fb00a47 100644 --- a/spec/javascripts/gl_dropdown_spec.js.es6 +++ b/spec/javascripts/gl_dropdown_spec.js.es6 @@ -139,6 +139,14 @@ require('~/lib/utils/url_utility'); this.dropdownButtonElement.click(); }); + it('should show loading indicator while search results are being fetched by backend', () => { + const dropdownMenu = document.querySelector('.dropdown-menu'); + + expect(dropdownMenu.className.indexOf('is-loading') !== -1).toEqual(true); + remoteCallback(); + expect(dropdownMenu.className.indexOf('is-loading') !== -1).toEqual(false); + }); + it('should not focus search input while remote task is not complete', () => { expect($(document.activeElement)).not.toEqual($(SEARCH_INPUT_SELECTOR)); remoteCallback(); From 9a3d2712941e01842f925beef2a3f0f6ca21434e Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Mon, 13 Feb 2017 12:33:23 -0600 Subject: [PATCH 157/313] display yarn version and node version within CI logs --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 71d5dce7314..edf008d2793 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -107,6 +107,8 @@ setup-test-env: <<: *dedicated-runner stage: prepare script: + - node --version + - yarn --version - yarn install - bundle exec rake gitlab:assets:compile - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init' From 79ce7579bb7dad3dba344893fb20c2f1346c84a0 Mon Sep 17 00:00:00 2001 From: wendy0402 Date: Tue, 14 Feb 2017 09:28:45 +0700 Subject: [PATCH 158/313] Make it possible to pass coverage value to commit status API --- doc/api/commits.md | 2 ++ lib/api/commit_statuses.rb | 4 +++- lib/api/entities.rb | 2 +- spec/requests/api/commit_statuses_spec.rb | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/api/commits.md b/doc/api/commits.md index 53ce381c8ae..ef2400aaf3c 100644 --- a/doc/api/commits.md +++ b/doc/api/commits.md @@ -444,6 +444,7 @@ POST /projects/:id/statuses/:sha | `name` or `context` | string | no | The label to differentiate this status from the status of other systems. Default value is `default` | `target_url` | string | no | The target URL to associate with this status | `description` | string | no | The short description of the status +| `coverage` | float | no | The total code coverage ```bash curl --request POST --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" "https://gitlab.example.com/api/v3/projects/17/statuses/18f3e63d05582537db6d183d9d557be09e1f90c8?state=success" @@ -464,6 +465,7 @@ Example response: "name" : "default", "sha" : "18f3e63d05582537db6d183d9d557be09e1f90c8", "status" : "success", + "coverage": 100.0, "description" : null, "id" : 93, "target_url" : null, diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb index b6e6820c3f4..0b6076bd28c 100644 --- a/lib/api/commit_statuses.rb +++ b/lib/api/commit_statuses.rb @@ -46,6 +46,7 @@ module API optional :description, type: String, desc: 'A short description of the status' optional :name, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"' optional :context, type: String, desc: 'A string label to differentiate this status from the status of other systems. Default: "default"' + optional :coverage, type: Float, desc: 'The total code coverage' end post ':id/statuses/:sha' do authorize! :create_commit_status, user_project @@ -75,7 +76,8 @@ module API name: name, ref: ref, target_url: params[:target_url], - description: params[:description] + description: params[:description], + coverage: params[:coverage] ) render_validation_error!(status) if status.invalid? diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 2a071e649fa..d4234ffe818 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -367,7 +367,7 @@ module API class CommitStatus < Grape::Entity expose :id, :sha, :ref, :status, :name, :target_url, :description, - :created_at, :started_at, :finished_at, :allow_failure + :created_at, :started_at, :finished_at, :allow_failure, :coverage expose :author, using: Entities::UserBasic end diff --git a/spec/requests/api/commit_statuses_spec.rb b/spec/requests/api/commit_statuses_spec.rb index 88361def3cf..eb53fd71872 100644 --- a/spec/requests/api/commit_statuses_spec.rb +++ b/spec/requests/api/commit_statuses_spec.rb @@ -156,6 +156,7 @@ describe API::CommitStatuses, api: true do context: 'coverage', ref: 'develop', description: 'test', + coverage: 80.0, target_url: 'http://gitlab.com/status' } post api(post_url, developer), optional_params @@ -167,6 +168,7 @@ describe API::CommitStatuses, api: true do expect(json_response['status']).to eq('success') expect(json_response['name']).to eq('coverage') expect(json_response['ref']).to eq('develop') + expect(json_response['coverage']).to eq(80.0) expect(json_response['description']).to eq('test') expect(json_response['target_url']).to eq('http://gitlab.com/status') end From 0f206980d770826d887674e5182fa2bef232cde2 Mon Sep 17 00:00:00 2001 From: wendy0402 Date: Tue, 14 Feb 2017 11:25:52 +0700 Subject: [PATCH 159/313] add changelog --- .../unreleased/pass_coverage_value_to_commit_status_api.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/pass_coverage_value_to_commit_status_api.yml diff --git a/changelogs/unreleased/pass_coverage_value_to_commit_status_api.yml b/changelogs/unreleased/pass_coverage_value_to_commit_status_api.yml new file mode 100644 index 00000000000..74e0c18fa67 --- /dev/null +++ b/changelogs/unreleased/pass_coverage_value_to_commit_status_api.yml @@ -0,0 +1,4 @@ +--- +title: Make it possible to pass coverage value to commit status API +merge_request: 9214 +author: wendy0402 From 947dcfba372278f1d6e9fe3437d3f4199a79a530 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Mon, 13 Feb 2017 23:25:34 -0600 Subject: [PATCH 160/313] Use es6-promise package to avoid webpack warnings See https://github.com/stefanpenner/es6-promise/issues/100 ``` [WDS] Warnings while compiling. ./vendor/assets/javascripts/es6-promise.auto.js Module not found: Error: Can't resolve 'vertx' in '/Users/eric/Documents/gitlab/gitlab-development-kit/gitlab/vendor/assets/javascripts' @ ./vendor/assets/javascripts/es6-promise.auto.js 140:16-26 @ ./app/assets/javascripts/application.js @ multi (webpack)-dev-server/client?http://localhost:3808 ./application.js ``` --- app/assets/javascripts/application.js | 3 +- package.json | 1 + vendor/assets/javascripts/es6-promise.auto.js | 1156 ----------------- 3 files changed, 2 insertions(+), 1158 deletions(-) delete mode 100644 vendor/assets/javascripts/es6-promise.auto.js diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index c9612784f9b..4b5c9686cab 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -56,8 +56,7 @@ requireAll(require.context('./u2f', false, /^\.\/.*\.(js|es6)$/)); requireAll(require.context('./droplab', false, /^\.\/.*\.(js|es6)$/)); requireAll(require.context('.', false, /^\.\/(?!application\.js).*\.(js|es6)$/)); require('vendor/fuzzaldrin-plus'); -window.ES6Promise = require('vendor/es6-promise.auto'); -window.ES6Promise.polyfill(); +require('es6-promise').polyfill(); (function () { document.addEventListener('beforeunload', function () { diff --git a/package.json b/package.json index 24e11a4607f..e36925aa4f2 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "compression-webpack-plugin": "^0.3.2", "d3": "3.5.11", "dropzone": "4.2.0", + "es6-promise": "^4.0.5", "imports-loader": "^0.6.5", "jquery": "2.2.1", "jquery-ui": "github:jquery/jquery-ui#1.11.4", diff --git a/vendor/assets/javascripts/es6-promise.auto.js b/vendor/assets/javascripts/es6-promise.auto.js deleted file mode 100644 index b8887115a37..00000000000 --- a/vendor/assets/javascripts/es6-promise.auto.js +++ /dev/null @@ -1,1156 +0,0 @@ -/*! - * @overview es6-promise - a tiny implementation of Promises/A+. - * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald) - * @license Licensed under MIT license - * See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE - * @version 4.0.5 - */ - -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.ES6Promise = factory()); -}(this, (function () { 'use strict'; - -function objectOrFunction(x) { - return typeof x === 'function' || typeof x === 'object' && x !== null; -} - -function isFunction(x) { - return typeof x === 'function'; -} - -var _isArray = undefined; -if (!Array.isArray) { - _isArray = function (x) { - return Object.prototype.toString.call(x) === '[object Array]'; - }; -} else { - _isArray = Array.isArray; -} - -var isArray = _isArray; - -var len = 0; -var vertxNext = undefined; -var customSchedulerFn = undefined; - -var asap = function asap(callback, arg) { - queue[len] = callback; - queue[len + 1] = arg; - len += 2; - if (len === 2) { - // If len is 2, that means that we need to schedule an async flush. - // If additional callbacks are queued before the queue is flushed, they - // will be processed by this flush that we are scheduling. - if (customSchedulerFn) { - customSchedulerFn(flush); - } else { - scheduleFlush(); - } - } -}; - -function setScheduler(scheduleFn) { - customSchedulerFn = scheduleFn; -} - -function setAsap(asapFn) { - asap = asapFn; -} - -var browserWindow = typeof window !== 'undefined' ? window : undefined; -var browserGlobal = browserWindow || {}; -var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver; -var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]'; - -// test for web worker but not in IE10 -var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined'; - -// node -function useNextTick() { - // node version 0.10.x displays a deprecation warning when nextTick is used recursively - // see https://github.com/cujojs/when/issues/410 for details - return function () { - return process.nextTick(flush); - }; -} - -// vertx -function useVertxTimer() { - if (typeof vertxNext !== 'undefined') { - return function () { - vertxNext(flush); - }; - } - - return useSetTimeout(); -} - -function useMutationObserver() { - var iterations = 0; - var observer = new BrowserMutationObserver(flush); - var node = document.createTextNode(''); - observer.observe(node, { characterData: true }); - - return function () { - node.data = iterations = ++iterations % 2; - }; -} - -// web worker -function useMessageChannel() { - var channel = new MessageChannel(); - channel.port1.onmessage = flush; - return function () { - return channel.port2.postMessage(0); - }; -} - -function useSetTimeout() { - // Store setTimeout reference so es6-promise will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var globalSetTimeout = setTimeout; - return function () { - return globalSetTimeout(flush, 1); - }; -} - -var queue = new Array(1000); -function flush() { - for (var i = 0; i < len; i += 2) { - var callback = queue[i]; - var arg = queue[i + 1]; - - callback(arg); - - queue[i] = undefined; - queue[i + 1] = undefined; - } - - len = 0; -} - -function attemptVertx() { - try { - var r = require; - var vertx = r('vertx'); - vertxNext = vertx.runOnLoop || vertx.runOnContext; - return useVertxTimer(); - } catch (e) { - return useSetTimeout(); - } -} - -var scheduleFlush = undefined; -// Decide what async method to use to triggering processing of queued callbacks: -if (isNode) { - scheduleFlush = useNextTick(); -} else if (BrowserMutationObserver) { - scheduleFlush = useMutationObserver(); -} else if (isWorker) { - scheduleFlush = useMessageChannel(); -} else if (browserWindow === undefined && typeof require === 'function') { - scheduleFlush = attemptVertx(); -} else { - scheduleFlush = useSetTimeout(); -} - -function then(onFulfillment, onRejection) { - var _arguments = arguments; - - var parent = this; - - var child = new this.constructor(noop); - - if (child[PROMISE_ID] === undefined) { - makePromise(child); - } - - var _state = parent._state; - - if (_state) { - (function () { - var callback = _arguments[_state - 1]; - asap(function () { - return invokeCallback(_state, child, callback, parent._result); - }); - })(); - } else { - subscribe(parent, child, onFulfillment, onRejection); - } - - return child; -} - -/** - `Promise.resolve` returns a promise that will become resolved with the - passed `value`. It is shorthand for the following: - - ```javascript - let promise = new Promise(function(resolve, reject){ - resolve(1); - }); - - promise.then(function(value){ - // value === 1 - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = Promise.resolve(1); - - promise.then(function(value){ - // value === 1 - }); - ``` - - @method resolve - @static - @param {Any} value value that the returned promise will be resolved with - Useful for tooling. - @return {Promise} a promise that will become fulfilled with the given - `value` -*/ -function resolve(object) { - /*jshint validthis:true */ - var Constructor = this; - - if (object && typeof object === 'object' && object.constructor === Constructor) { - return object; - } - - var promise = new Constructor(noop); - _resolve(promise, object); - return promise; -} - -var PROMISE_ID = Math.random().toString(36).substring(16); - -function noop() {} - -var PENDING = void 0; -var FULFILLED = 1; -var REJECTED = 2; - -var GET_THEN_ERROR = new ErrorObject(); - -function selfFulfillment() { - return new TypeError("You cannot resolve a promise with itself"); -} - -function cannotReturnOwn() { - return new TypeError('A promises callback cannot return that same promise.'); -} - -function getThen(promise) { - try { - return promise.then; - } catch (error) { - GET_THEN_ERROR.error = error; - return GET_THEN_ERROR; - } -} - -function tryThen(then, value, fulfillmentHandler, rejectionHandler) { - try { - then.call(value, fulfillmentHandler, rejectionHandler); - } catch (e) { - return e; - } -} - -function handleForeignThenable(promise, thenable, then) { - asap(function (promise) { - var sealed = false; - var error = tryThen(then, thenable, function (value) { - if (sealed) { - return; - } - sealed = true; - if (thenable !== value) { - _resolve(promise, value); - } else { - fulfill(promise, value); - } - }, function (reason) { - if (sealed) { - return; - } - sealed = true; - - _reject(promise, reason); - }, 'Settle: ' + (promise._label || ' unknown promise')); - - if (!sealed && error) { - sealed = true; - _reject(promise, error); - } - }, promise); -} - -function handleOwnThenable(promise, thenable) { - if (thenable._state === FULFILLED) { - fulfill(promise, thenable._result); - } else if (thenable._state === REJECTED) { - _reject(promise, thenable._result); - } else { - subscribe(thenable, undefined, function (value) { - return _resolve(promise, value); - }, function (reason) { - return _reject(promise, reason); - }); - } -} - -function handleMaybeThenable(promise, maybeThenable, then$$) { - if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) { - handleOwnThenable(promise, maybeThenable); - } else { - if (then$$ === GET_THEN_ERROR) { - _reject(promise, GET_THEN_ERROR.error); - } else if (then$$ === undefined) { - fulfill(promise, maybeThenable); - } else if (isFunction(then$$)) { - handleForeignThenable(promise, maybeThenable, then$$); - } else { - fulfill(promise, maybeThenable); - } - } -} - -function _resolve(promise, value) { - if (promise === value) { - _reject(promise, selfFulfillment()); - } else if (objectOrFunction(value)) { - handleMaybeThenable(promise, value, getThen(value)); - } else { - fulfill(promise, value); - } -} - -function publishRejection(promise) { - if (promise._onerror) { - promise._onerror(promise._result); - } - - publish(promise); -} - -function fulfill(promise, value) { - if (promise._state !== PENDING) { - return; - } - - promise._result = value; - promise._state = FULFILLED; - - if (promise._subscribers.length !== 0) { - asap(publish, promise); - } -} - -function _reject(promise, reason) { - if (promise._state !== PENDING) { - return; - } - promise._state = REJECTED; - promise._result = reason; - - asap(publishRejection, promise); -} - -function subscribe(parent, child, onFulfillment, onRejection) { - var _subscribers = parent._subscribers; - var length = _subscribers.length; - - parent._onerror = null; - - _subscribers[length] = child; - _subscribers[length + FULFILLED] = onFulfillment; - _subscribers[length + REJECTED] = onRejection; - - if (length === 0 && parent._state) { - asap(publish, parent); - } -} - -function publish(promise) { - var subscribers = promise._subscribers; - var settled = promise._state; - - if (subscribers.length === 0) { - return; - } - - var child = undefined, - callback = undefined, - detail = promise._result; - - for (var i = 0; i < subscribers.length; i += 3) { - child = subscribers[i]; - callback = subscribers[i + settled]; - - if (child) { - invokeCallback(settled, child, callback, detail); - } else { - callback(detail); - } - } - - promise._subscribers.length = 0; -} - -function ErrorObject() { - this.error = null; -} - -var TRY_CATCH_ERROR = new ErrorObject(); - -function tryCatch(callback, detail) { - try { - return callback(detail); - } catch (e) { - TRY_CATCH_ERROR.error = e; - return TRY_CATCH_ERROR; - } -} - -function invokeCallback(settled, promise, callback, detail) { - var hasCallback = isFunction(callback), - value = undefined, - error = undefined, - succeeded = undefined, - failed = undefined; - - if (hasCallback) { - value = tryCatch(callback, detail); - - if (value === TRY_CATCH_ERROR) { - failed = true; - error = value.error; - value = null; - } else { - succeeded = true; - } - - if (promise === value) { - _reject(promise, cannotReturnOwn()); - return; - } - } else { - value = detail; - succeeded = true; - } - - if (promise._state !== PENDING) { - // noop - } else if (hasCallback && succeeded) { - _resolve(promise, value); - } else if (failed) { - _reject(promise, error); - } else if (settled === FULFILLED) { - fulfill(promise, value); - } else if (settled === REJECTED) { - _reject(promise, value); - } -} - -function initializePromise(promise, resolver) { - try { - resolver(function resolvePromise(value) { - _resolve(promise, value); - }, function rejectPromise(reason) { - _reject(promise, reason); - }); - } catch (e) { - _reject(promise, e); - } -} - -var id = 0; -function nextId() { - return id++; -} - -function makePromise(promise) { - promise[PROMISE_ID] = id++; - promise._state = undefined; - promise._result = undefined; - promise._subscribers = []; -} - -function Enumerator(Constructor, input) { - this._instanceConstructor = Constructor; - this.promise = new Constructor(noop); - - if (!this.promise[PROMISE_ID]) { - makePromise(this.promise); - } - - if (isArray(input)) { - this._input = input; - this.length = input.length; - this._remaining = input.length; - - this._result = new Array(this.length); - - if (this.length === 0) { - fulfill(this.promise, this._result); - } else { - this.length = this.length || 0; - this._enumerate(); - if (this._remaining === 0) { - fulfill(this.promise, this._result); - } - } - } else { - _reject(this.promise, validationError()); - } -} - -function validationError() { - return new Error('Array Methods must be provided an Array'); -}; - -Enumerator.prototype._enumerate = function () { - var length = this.length; - var _input = this._input; - - for (var i = 0; this._state === PENDING && i < length; i++) { - this._eachEntry(_input[i], i); - } -}; - -Enumerator.prototype._eachEntry = function (entry, i) { - var c = this._instanceConstructor; - var resolve$$ = c.resolve; - - if (resolve$$ === resolve) { - var _then = getThen(entry); - - if (_then === then && entry._state !== PENDING) { - this._settledAt(entry._state, i, entry._result); - } else if (typeof _then !== 'function') { - this._remaining--; - this._result[i] = entry; - } else if (c === Promise) { - var promise = new c(noop); - handleMaybeThenable(promise, entry, _then); - this._willSettleAt(promise, i); - } else { - this._willSettleAt(new c(function (resolve$$) { - return resolve$$(entry); - }), i); - } - } else { - this._willSettleAt(resolve$$(entry), i); - } -}; - -Enumerator.prototype._settledAt = function (state, i, value) { - var promise = this.promise; - - if (promise._state === PENDING) { - this._remaining--; - - if (state === REJECTED) { - _reject(promise, value); - } else { - this._result[i] = value; - } - } - - if (this._remaining === 0) { - fulfill(promise, this._result); - } -}; - -Enumerator.prototype._willSettleAt = function (promise, i) { - var enumerator = this; - - subscribe(promise, undefined, function (value) { - return enumerator._settledAt(FULFILLED, i, value); - }, function (reason) { - return enumerator._settledAt(REJECTED, i, reason); - }); -}; - -/** - `Promise.all` accepts an array of promises, and returns a new promise which - is fulfilled with an array of fulfillment values for the passed promises, or - rejected with the reason of the first passed promise to be rejected. It casts all - elements of the passed iterable to promises as it runs this algorithm. - - Example: - - ```javascript - let promise1 = resolve(1); - let promise2 = resolve(2); - let promise3 = resolve(3); - let promises = [ promise1, promise2, promise3 ]; - - Promise.all(promises).then(function(array){ - // The array here would be [ 1, 2, 3 ]; - }); - ``` - - If any of the `promises` given to `all` are rejected, the first promise - that is rejected will be given as an argument to the returned promises's - rejection handler. For example: - - Example: - - ```javascript - let promise1 = resolve(1); - let promise2 = reject(new Error("2")); - let promise3 = reject(new Error("3")); - let promises = [ promise1, promise2, promise3 ]; - - Promise.all(promises).then(function(array){ - // Code here never runs because there are rejected promises! - }, function(error) { - // error.message === "2" - }); - ``` - - @method all - @static - @param {Array} entries array of promises - @param {String} label optional string for labeling the promise. - Useful for tooling. - @return {Promise} promise that is fulfilled when all `promises` have been - fulfilled, or rejected if any of them become rejected. - @static -*/ -function all(entries) { - return new Enumerator(this, entries).promise; -} - -/** - `Promise.race` returns a new promise which is settled in the same way as the - first passed promise to settle. - - Example: - - ```javascript - let promise1 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 2'); - }, 100); - }); - - Promise.race([promise1, promise2]).then(function(result){ - // result === 'promise 2' because it was resolved before promise1 - // was resolved. - }); - ``` - - `Promise.race` is deterministic in that only the state of the first - settled promise matters. For example, even if other promises given to the - `promises` array argument are resolved, but the first settled promise has - become rejected before the other promises became fulfilled, the returned - promise will become rejected: - - ```javascript - let promise1 = new Promise(function(resolve, reject){ - setTimeout(function(){ - resolve('promise 1'); - }, 200); - }); - - let promise2 = new Promise(function(resolve, reject){ - setTimeout(function(){ - reject(new Error('promise 2')); - }, 100); - }); - - Promise.race([promise1, promise2]).then(function(result){ - // Code here never runs - }, function(reason){ - // reason.message === 'promise 2' because promise 2 became rejected before - // promise 1 became fulfilled - }); - ``` - - An example real-world use case is implementing timeouts: - - ```javascript - Promise.race([ajax('foo.json'), timeout(5000)]) - ``` - - @method race - @static - @param {Array} promises array of promises to observe - Useful for tooling. - @return {Promise} a promise which settles in the same way as the first passed - promise to settle. -*/ -function race(entries) { - /*jshint validthis:true */ - var Constructor = this; - - if (!isArray(entries)) { - return new Constructor(function (_, reject) { - return reject(new TypeError('You must pass an array to race.')); - }); - } else { - return new Constructor(function (resolve, reject) { - var length = entries.length; - for (var i = 0; i < length; i++) { - Constructor.resolve(entries[i]).then(resolve, reject); - } - }); - } -} - -/** - `Promise.reject` returns a promise rejected with the passed `reason`. - It is shorthand for the following: - - ```javascript - let promise = new Promise(function(resolve, reject){ - reject(new Error('WHOOPS')); - }); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - Instead of writing the above, your code now simply becomes the following: - - ```javascript - let promise = Promise.reject(new Error('WHOOPS')); - - promise.then(function(value){ - // Code here doesn't run because the promise is rejected! - }, function(reason){ - // reason.message === 'WHOOPS' - }); - ``` - - @method reject - @static - @param {Any} reason value that the returned promise will be rejected with. - Useful for tooling. - @return {Promise} a promise rejected with the given `reason`. -*/ -function reject(reason) { - /*jshint validthis:true */ - var Constructor = this; - var promise = new Constructor(noop); - _reject(promise, reason); - return promise; -} - -function needsResolver() { - throw new TypeError('You must pass a resolver function as the first argument to the promise constructor'); -} - -function needsNew() { - throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function."); -} - -/** - Promise objects represent the eventual result of an asynchronous operation. The - primary way of interacting with a promise is through its `then` method, which - registers callbacks to receive either a promise's eventual value or the reason - why the promise cannot be fulfilled. - - Terminology - ----------- - - - `promise` is an object or function with a `then` method whose behavior conforms to this specification. - - `thenable` is an object or function that defines a `then` method. - - `value` is any legal JavaScript value (including undefined, a thenable, or a promise). - - `exception` is a value that is thrown using the throw statement. - - `reason` is a value that indicates why a promise was rejected. - - `settled` the final resting state of a promise, fulfilled or rejected. - - A promise can be in one of three states: pending, fulfilled, or rejected. - - Promises that are fulfilled have a fulfillment value and are in the fulfilled - state. Promises that are rejected have a rejection reason and are in the - rejected state. A fulfillment value is never a thenable. - - Promises can also be said to *resolve* a value. If this value is also a - promise, then the original promise's settled state will match the value's - settled state. So a promise that *resolves* a promise that rejects will - itself reject, and a promise that *resolves* a promise that fulfills will - itself fulfill. - - - Basic Usage: - ------------ - - ```js - let promise = new Promise(function(resolve, reject) { - // on success - resolve(value); - - // on failure - reject(reason); - }); - - promise.then(function(value) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Advanced Usage: - --------------- - - Promises shine when abstracting away asynchronous interactions such as - `XMLHttpRequest`s. - - ```js - function getJSON(url) { - return new Promise(function(resolve, reject){ - let xhr = new XMLHttpRequest(); - - xhr.open('GET', url); - xhr.onreadystatechange = handler; - xhr.responseType = 'json'; - xhr.setRequestHeader('Accept', 'application/json'); - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200) { - resolve(this.response); - } else { - reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']')); - } - } - }; - }); - } - - getJSON('/posts.json').then(function(json) { - // on fulfillment - }, function(reason) { - // on rejection - }); - ``` - - Unlike callbacks, promises are great composable primitives. - - ```js - Promise.all([ - getJSON('/posts'), - getJSON('/comments') - ]).then(function(values){ - values[0] // => postsJSON - values[1] // => commentsJSON - - return values; - }); - ``` - - @class Promise - @param {function} resolver - Useful for tooling. - @constructor -*/ -function Promise(resolver) { - this[PROMISE_ID] = nextId(); - this._result = this._state = undefined; - this._subscribers = []; - - if (noop !== resolver) { - typeof resolver !== 'function' && needsResolver(); - this instanceof Promise ? initializePromise(this, resolver) : needsNew(); - } -} - -Promise.all = all; -Promise.race = race; -Promise.resolve = resolve; -Promise.reject = reject; -Promise._setScheduler = setScheduler; -Promise._setAsap = setAsap; -Promise._asap = asap; - -Promise.prototype = { - constructor: Promise, - - /** - The primary way of interacting with a promise is through its `then` method, - which registers callbacks to receive either a promise's eventual value or the - reason why the promise cannot be fulfilled. - - ```js - findUser().then(function(user){ - // user is available - }, function(reason){ - // user is unavailable, and you are given the reason why - }); - ``` - - Chaining - -------- - - The return value of `then` is itself a promise. This second, 'downstream' - promise is resolved with the return value of the first promise's fulfillment - or rejection handler, or rejected if the handler throws an exception. - - ```js - findUser().then(function (user) { - return user.name; - }, function (reason) { - return 'default name'; - }).then(function (userName) { - // If `findUser` fulfilled, `userName` will be the user's name, otherwise it - // will be `'default name'` - }); - - findUser().then(function (user) { - throw new Error('Found user, but still unhappy'); - }, function (reason) { - throw new Error('`findUser` rejected and we're unhappy'); - }).then(function (value) { - // never reached - }, function (reason) { - // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'. - // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'. - }); - ``` - If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream. - - ```js - findUser().then(function (user) { - throw new PedagogicalException('Upstream error'); - }).then(function (value) { - // never reached - }).then(function (value) { - // never reached - }, function (reason) { - // The `PedgagocialException` is propagated all the way down to here - }); - ``` - - Assimilation - ------------ - - Sometimes the value you want to propagate to a downstream promise can only be - retrieved asynchronously. This can be achieved by returning a promise in the - fulfillment or rejection handler. The downstream promise will then be pending - until the returned promise is settled. This is called *assimilation*. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // The user's comments are now available - }); - ``` - - If the assimliated promise rejects, then the downstream promise will also reject. - - ```js - findUser().then(function (user) { - return findCommentsByAuthor(user); - }).then(function (comments) { - // If `findCommentsByAuthor` fulfills, we'll have the value here - }, function (reason) { - // If `findCommentsByAuthor` rejects, we'll have the reason here - }); - ``` - - Simple Example - -------------- - - Synchronous Example - - ```javascript - let result; - - try { - result = findResult(); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - findResult(function(result, err){ - if (err) { - // failure - } else { - // success - } - }); - ``` - - Promise Example; - - ```javascript - findResult().then(function(result){ - // success - }, function(reason){ - // failure - }); - ``` - - Advanced Example - -------------- - - Synchronous Example - - ```javascript - let author, books; - - try { - author = findAuthor(); - books = findBooksByAuthor(author); - // success - } catch(reason) { - // failure - } - ``` - - Errback Example - - ```js - - function foundBooks(books) { - - } - - function failure(reason) { - - } - - findAuthor(function(author, err){ - if (err) { - failure(err); - // failure - } else { - try { - findBoooksByAuthor(author, function(books, err) { - if (err) { - failure(err); - } else { - try { - foundBooks(books); - } catch(reason) { - failure(reason); - } - } - }); - } catch(error) { - failure(err); - } - // success - } - }); - ``` - - Promise Example; - - ```javascript - findAuthor(). - then(findBooksByAuthor). - then(function(books){ - // found books - }).catch(function(reason){ - // something went wrong - }); - ``` - - @method then - @param {Function} onFulfilled - @param {Function} onRejected - Useful for tooling. - @return {Promise} - */ - then: then, - - /** - `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same - as the catch block of a try/catch statement. - - ```js - function findAuthor(){ - throw new Error('couldn't find that author'); - } - - // synchronous - try { - findAuthor(); - } catch(reason) { - // something went wrong - } - - // async with promises - findAuthor().catch(function(reason){ - // something went wrong - }); - ``` - - @method catch - @param {Function} onRejection - Useful for tooling. - @return {Promise} - */ - 'catch': function _catch(onRejection) { - return this.then(null, onRejection); - } -}; - -function polyfill() { - var local = undefined; - - if (typeof global !== 'undefined') { - local = global; - } else if (typeof self !== 'undefined') { - local = self; - } else { - try { - local = Function('return this')(); - } catch (e) { - throw new Error('polyfill failed because global object is unavailable in this environment'); - } - } - - var P = local.Promise; - - if (P) { - var promiseToString = null; - try { - promiseToString = Object.prototype.toString.call(P.resolve()); - } catch (e) { - // silently ignored - } - - if (promiseToString === '[object Promise]' && !P.cast) { - return; - } - } - - local.Promise = Promise; -} - -// Strange compat.. -Promise.polyfill = polyfill; -Promise.Promise = Promise; - -return Promise; - -}))); From 4e3c9a57453ddf4b6b5fcc4e6f14a53142c67307 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Mon, 13 Feb 2017 16:23:15 -0600 Subject: [PATCH 161/313] add yarn check to ensure package.json doesn't diverge from yarn.lock --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index edf008d2793..b2622ac7e0f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -109,7 +109,8 @@ setup-test-env: script: - node --version - yarn --version - - yarn install + - yarn install --pure-lockfile + - yarn check # ensure that yarn.lock matches package.json - bundle exec rake gitlab:assets:compile - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init' artifacts: From 109e8ef4485fb45f0a50690e732ee2b9c6e910b0 Mon Sep 17 00:00:00 2001 From: Mark Fletcher Date: Fri, 30 Dec 2016 13:26:30 +0000 Subject: [PATCH 162/313] Make WikiPage comparable according to StaticModel interface * Add WikiPage#id method returning associated SHA for wiki page commit --- app/models/wiki_page.rb | 4 ++++ spec/models/wiki_page_spec.rb | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/app/models/wiki_page.rb b/app/models/wiki_page.rb index 6347b274341..2caebb496db 100644 --- a/app/models/wiki_page.rb +++ b/app/models/wiki_page.rb @@ -207,6 +207,10 @@ class WikiPage 'projects/wikis/wiki_page' end + def id + page.version.to_s + end + private def set_attributes diff --git a/spec/models/wiki_page_spec.rb b/spec/models/wiki_page_spec.rb index 579ebac7afb..753dc938c52 100644 --- a/spec/models/wiki_page_spec.rb +++ b/spec/models/wiki_page_spec.rb @@ -318,6 +318,19 @@ describe WikiPage, models: true do end end + describe '#==' do + let(:original_wiki_page) { create(:wiki_page) } + + it 'returns true for identical wiki page' do + expect(original_wiki_page).to eq(original_wiki_page) + end + + it 'returns false for updated wiki page' do + updated_wiki_page = original_wiki_page.update("Updated content") + expect(original_wiki_page).not_to eq(updated_wiki_page) + end + end + private def remove_temp_repo(path) From a616b475b16fa2689ab09fee9bb9c79c24f8bb27 Mon Sep 17 00:00:00 2001 From: Mark Fletcher Date: Tue, 20 Dec 2016 13:31:21 +0000 Subject: [PATCH 163/313] Add tests for WikiPages services * Alter wiki_pages factory with custom creation operation --- spec/factories/wiki_pages.rb | 18 +++++++++ .../wiki_pages/create_service_spec.rb | 36 ++++++++++++++++++ .../wiki_pages/update_service_spec.rb | 37 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 spec/services/wiki_pages/create_service_spec.rb create mode 100644 spec/services/wiki_pages/update_service_spec.rb diff --git a/spec/factories/wiki_pages.rb b/spec/factories/wiki_pages.rb index efa6cbe5bb1..4105f59e289 100644 --- a/spec/factories/wiki_pages.rb +++ b/spec/factories/wiki_pages.rb @@ -2,8 +2,26 @@ require 'ostruct' FactoryGirl.define do factory :wiki_page do + transient do + attrs do + { + title: 'Title', + content: 'Content for wiki page', + format: 'markdown' + } + end + end + page { OpenStruct.new(url_path: 'some-name') } association :wiki, factory: :project_wiki, strategy: :build initialize_with { new(wiki, page, true) } + + before(:create) do |page, evaluator| + page.attributes = evaluator.attrs + end + + to_create do |page| + page.create + end end end diff --git a/spec/services/wiki_pages/create_service_spec.rb b/spec/services/wiki_pages/create_service_spec.rb new file mode 100644 index 00000000000..5341ba3d261 --- /dev/null +++ b/spec/services/wiki_pages/create_service_spec.rb @@ -0,0 +1,36 @@ +require 'spec_helper' + +describe WikiPages::CreateService, services: true do + let(:project) { create(:empty_project) } + let(:user) { create(:user) } + let(:opts) do + { + title: 'Title', + content: 'Content for wiki page', + format: 'markdown' + } + end + let(:service) { described_class.new(project, user, opts) } + + describe '#execute' do + context "valid params" do + before do + allow(service).to receive(:execute_hooks) + project.add_master(user) + end + + subject { service.execute } + + it 'creates a valid wiki page' do + is_expected.to be_valid + expect(subject.title).to eq(opts[:title]) + expect(subject.content).to eq(opts[:content]) + expect(subject.format).to eq(opts[:format].to_sym) + end + + it 'executes webhooks' do + expect(service).to have_received(:execute_hooks).once.with(subject, 'create') + end + end + end +end diff --git a/spec/services/wiki_pages/update_service_spec.rb b/spec/services/wiki_pages/update_service_spec.rb new file mode 100644 index 00000000000..2bccca764d7 --- /dev/null +++ b/spec/services/wiki_pages/update_service_spec.rb @@ -0,0 +1,37 @@ +require 'spec_helper' + +describe WikiPages::UpdateService, services: true do + let(:project) { create(:empty_project) } + let(:user) { create(:user) } + let(:wiki_page) { create(:wiki_page) } + let(:opts) do + { + content: 'New content for wiki page', + format: 'markdown', + message: 'New wiki message' + } + end + let(:service) { described_class.new(project, user, opts) } + + describe '#execute' do + context "valid params" do + before do + allow(service).to receive(:execute_hooks) + project.add_master(user) + end + + subject { service.execute(wiki_page) } + + it 'updates the wiki page' do + is_expected.to be_valid + expect(subject.content).to eq(opts[:content]) + expect(subject.format).to eq(opts[:format].to_sym) + expect(subject.message).to eq(opts[:message]) + end + + it 'executes webhooks' do + expect(service).to have_received(:execute_hooks).once.with(subject, 'update') + end + end + end +end From db6a29bcf5e938da53085535210e3982d8af17e2 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Mon, 13 Feb 2017 23:47:43 -0600 Subject: [PATCH 164/313] update yarn.lock to reflect latest package.json --- yarn.lock | 1660 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 1037 insertions(+), 623 deletions(-) diff --git a/yarn.lock b/yarn.lock index 05aea4fd6f0..e5bb2937cf6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13,17 +13,23 @@ accepts@1.3.3, accepts@~1.3.3: mime-types "~2.1.11" negotiator "0.6.1" +acorn-dynamic-import@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.1.tgz#23f671eb6e650dab277fef477c321b1178a8cca2" + dependencies: + acorn "^4.0.3" + acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" dependencies: acorn "^3.0.4" -acorn@4.0.4: +acorn@4.0.4, acorn@^4.0.3, acorn@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" -acorn@^3.0.0, acorn@^3.0.4, acorn@^3.1.0: +acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -31,7 +37,7 @@ after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" -ajv-keywords@^1.0.0: +ajv-keywords@^1.0.0, ajv-keywords@^1.1.1: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" @@ -50,12 +56,6 @@ align-text@^0.1.1, align-text@^0.1.3: longest "^1.0.1" repeat-string "^1.5.2" -alter@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/alter/-/alter-0.2.0.tgz#c7588808617572034aae62480af26b1d4d1cb3cd" - dependencies: - stable "~0.1.3" - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -64,6 +64,10 @@ ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -106,10 +110,6 @@ arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -140,6 +140,14 @@ arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +asn1.js@^4.0.0: + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -158,22 +166,6 @@ assert@^1.1.1: dependencies: util "0.10.3" -ast-traverse@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" - -ast-types@0.8.12: - version "0.8.12" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" - -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" - -ast-types@0.9.5: - version "0.9.5" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.5.tgz#1a660a09945dbceb1f9c9cbb715002617424e04a" - async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" @@ -182,11 +174,17 @@ async@0.2.x, async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" -async@1.x, async@^1.3.0, async@^1.4.0: +async@1.x, async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^0.9.0, async@~0.9.0: +async@^2.1.2: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + +async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -202,7 +200,7 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.16.0: +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: @@ -210,149 +208,548 @@ babel-code-frame@^6.16.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@^5.4.0, babel-core@^5.6.21, babel-core@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" +babel-core@^6.22.1, babel-core@^6.23.0: + version "6.23.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.23.1.tgz#c143cb621bb2f621710c220c5d579d15b8a442df" dependencies: - babel-plugin-constant-folding "^1.0.1" - babel-plugin-dead-code-elimination "^1.0.2" - babel-plugin-eval "^1.0.1" - babel-plugin-inline-environment-variables "^1.0.1" - babel-plugin-jscript "^1.0.4" - babel-plugin-member-expression-literals "^1.0.1" - babel-plugin-property-literals "^1.0.1" - babel-plugin-proto-to-assign "^1.0.3" - babel-plugin-react-constant-elements "^1.0.3" - babel-plugin-react-display-name "^1.0.3" - babel-plugin-remove-console "^1.0.1" - babel-plugin-remove-debugger "^1.0.1" - babel-plugin-runtime "^1.0.7" - babel-plugin-undeclared-variables-check "^1.0.2" - babel-plugin-undefined-to-void "^1.1.6" - babylon "^5.8.38" - bluebird "^2.9.33" - chalk "^1.0.0" + babel-code-frame "^6.22.0" + babel-generator "^6.23.0" + babel-helpers "^6.23.0" + babel-messages "^6.23.0" + babel-register "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.11.0" convert-source-map "^1.1.0" - core-js "^1.0.0" debug "^2.1.1" - detect-indent "^3.0.0" - esutils "^2.0.0" - fs-readdir-recursive "^0.1.0" - globals "^6.4.0" - home-or-tmp "^1.0.0" - is-integer "^1.0.4" - js-tokens "1.0.1" - json5 "^0.4.0" - lodash "^3.10.0" - minimatch "^2.0.3" - output-file-sync "^1.1.0" - path-exists "^1.0.0" + json5 "^0.5.0" + lodash "^4.2.0" + minimatch "^3.0.2" path-is-absolute "^1.0.0" private "^0.1.6" - regenerator "0.8.40" - regexpu "^1.3.0" - repeating "^1.1.2" - resolve "^1.1.6" - shebang-regex "^1.0.0" - slash "^1.0.0" - source-map "^0.5.0" - source-map-support "^0.2.10" - to-fast-properties "^1.0.0" - trim-right "^1.0.0" - try-resolve "^1.0.0" - -babel-loader@^5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-5.4.2.tgz#77fe28d8e60d0f056b1c1bca25b8494cdaab9c76" - dependencies: - babel-core "^5.4.0" - loader-utils "^0.2.9" - object-assign "^3.0.0" - -babel-plugin-constant-folding@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz#8361d364c98e449c3692bdba51eff0844290aa8e" - -babel-plugin-dead-code-elimination@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" - -babel-plugin-eval@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" - -babel-plugin-inline-environment-variables@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz#1f58ce91207ad6a826a8bf645fafe68ff5fe3ffe" - -babel-plugin-jscript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz#8f342c38276e87a47d5fa0a8bd3d5eb6ccad8fcc" - -babel-plugin-member-expression-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz#cc5edb0faa8dc927170e74d6d1c02440021624d3" - -babel-plugin-property-literals@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz#0252301900192980b1c118efea48ce93aab83336" - -babel-plugin-proto-to-assign@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz#c49e7afd02f577bc4da05ea2df002250cf7cd123" - dependencies: - lodash "^3.9.3" - -babel-plugin-react-constant-elements@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz#946736e8378429cbc349dcff62f51c143b34e35a" - -babel-plugin-react-display-name@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz#754fe38926e8424a4e7b15ab6ea6139dee0514fc" - -babel-plugin-remove-console@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz#d8f24556c3a05005d42aaaafd27787f53ff013a7" - -babel-plugin-remove-debugger@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz#fd2ea3cd61a428ad1f3b9c89882ff4293e8c14c7" - -babel-plugin-runtime@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" - -babel-plugin-undeclared-variables-check@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz#5cf1aa539d813ff64e99641290af620965f65dee" - dependencies: - leven "^1.0.2" - -babel-plugin-undefined-to-void@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" - -babel@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babel/-/babel-5.8.38.tgz#dfb087c22894917c576fb67ce9cf328d458629fb" - dependencies: - babel-core "^5.6.21" - chokidar "^1.0.0" - commander "^2.6.0" - convert-source-map "^1.1.0" - fs-readdir-recursive "^0.1.0" - glob "^5.0.5" - lodash "^3.2.0" - output-file-sync "^1.1.0" - path-exists "^1.0.0" - path-is-absolute "^1.0.0" slash "^1.0.0" source-map "^0.5.0" -babylon@^5.8.38: - version "5.8.38" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-5.8.38.tgz#ec9b120b11bf6ccd4173a18bf217e60b79859ffd" +babel-generator@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +babel-helper-bindify-decorators@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.22.0.tgz#d7f5bc261275941ac62acfc4e20dacfb8a3fe952" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-builder-binary-assignment-operator-visitor@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.22.0.tgz#29df56be144d81bdeac08262bfa41d2c5e91cdcd" + dependencies: + babel-helper-explode-assignable-expression "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-helper-call-delegate@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.22.0.tgz#119921b56120f17e9dae3f74b4f5cc7bcc1b37ef" + dependencies: + babel-helper-hoist-variables "^6.22.0" + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-define-map@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.23.0.tgz#1444f960c9691d69a2ced6a205315f8fd00804e7" + dependencies: + babel-helper-function-name "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + lodash "^4.2.0" + +babel-helper-explode-assignable-expression@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.22.0.tgz#c97bf76eed3e0bae4048121f2b9dae1a4e7d0478" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-explode-class@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.22.0.tgz#646304924aa6388a516843ba7f1855ef8dfeb69b" + dependencies: + babel-helper-bindify-decorators "^6.22.0" + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-function-name@^6.22.0, babel-helper-function-name@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.23.0.tgz#25742d67175c8903dbe4b6cb9d9e1fcb8dcf23a6" + dependencies: + babel-helper-get-function-arity "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-helper-get-function-arity@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.22.0.tgz#0beb464ad69dc7347410ac6ade9f03a50634f5ce" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-helper-hoist-variables@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.22.0.tgz#3eacbf731d80705845dd2e9718f600cfb9b4ba72" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-helper-optimise-call-expression@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.23.0.tgz#f3ee7eed355b4282138b33d02b78369e470622f5" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.23.0" + +babel-helper-regex@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.22.0.tgz#79f532be1647b1f0ee3474b5f5c3da58001d247d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + lodash "^4.2.0" + +babel-helper-remap-async-to-generator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.22.0.tgz#2186ae73278ed03b8b15ced089609da981053383" + dependencies: + babel-helper-function-name "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" + +babel-helper-replace-supers@^6.22.0, babel-helper-replace-supers@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.23.0.tgz#eeaf8ad9b58ec4337ca94223bacdca1f8d9b4bfd" + dependencies: + babel-helper-optimise-call-expression "^6.23.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-helpers@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-loader@^6.2.10: + version "6.2.10" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.10.tgz#adefc2b242320cd5d15e65b31cea0e8b1b02d4b0" + dependencies: + find-cache-dir "^0.1.1" + loader-utils "^0.2.11" + mkdirp "^0.5.1" + object-assign "^4.0.1" + +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-async-generators@^6.5.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + +babel-plugin-syntax-class-properties@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + +babel-plugin-syntax-decorators@^6.13.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + +babel-plugin-syntax-dynamic-import@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-object-rest-spread@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-generator-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.22.0.tgz#a720a98153a7596f204099cd5409f4b3c05bab46" + dependencies: + babel-helper-remap-async-to-generator "^6.22.0" + babel-plugin-syntax-async-generators "^6.5.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.22.0.tgz#194b6938ec195ad36efc4c33a971acf00d8cd35e" + dependencies: + babel-helper-remap-async-to-generator "^6.22.0" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-class-properties@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.23.0.tgz#187b747ee404399013563c993db038f34754ac3b" + dependencies: + babel-helper-function-name "^6.23.0" + babel-plugin-syntax-class-properties "^6.8.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-plugin-transform-decorators@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.22.0.tgz#c03635b27a23b23b7224f49232c237a73988d27c" + dependencies: + babel-helper-explode-class "^6.22.0" + babel-plugin-syntax-decorators "^6.13.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.23.0.tgz#e48895cf0b375be148cd7c8879b422707a053b51" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + lodash "^4.2.0" + +babel-plugin-transform-es2015-classes@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.23.0.tgz#49b53f326202a2fd1b3bbaa5e2edd8a4f78643c1" + dependencies: + babel-helper-define-map "^6.23.0" + babel-helper-function-name "^6.23.0" + babel-helper-optimise-call-expression "^6.23.0" + babel-helper-replace-supers "^6.23.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.22.0.tgz#7c383e9629bba4820c11b0425bdd6290f7f057e7" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.22.0" + +babel-plugin-transform-es2015-destructuring@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.22.0.tgz#672397031c21610d72dd2bbb0ba9fb6277e1c36b" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-for-of@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.22.0.tgz#f5fcc8b09093f9a23c76ac3d9e392c3ec4b77104" + dependencies: + babel-helper-function-name "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.22.0.tgz#bf69cd34889a41c33d90dfb740e0091ccff52f21" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + +babel-plugin-transform-es2015-modules-commonjs@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz#cba7aa6379fb7ec99250e6d46de2973aaffa7b92" + dependencies: + babel-plugin-transform-strict-mode "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-types "^6.23.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.23.0.tgz#ae3469227ffac39b0310d90fec73bfdc4f6317b0" + dependencies: + babel-helper-hoist-variables "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-plugin-transform-es2015-modules-umd@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.23.0.tgz#8d284ae2e19ed8fe21d2b1b26d6e7e0fcd94f0f1" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.22.0.tgz#daa60e114a042ea769dd53fe528fc82311eb98fc" + dependencies: + babel-helper-replace-supers "^6.22.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.23.0.tgz#3a2aabb70c8af945d5ce386f1a4250625a83ae3b" + dependencies: + babel-helper-call-delegate "^6.22.0" + babel-helper-get-function-arity "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.23.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.22.0.tgz#8ba776e0affaa60bff21e921403b8a652a2ff723" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.22.0.tgz#ab316829e866ee3f4b9eb96939757d19a5bc4593" + dependencies: + babel-helper-regex "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.22.0.tgz#8d9cc27e7ee1decfe65454fb986452a04a613d20" + dependencies: + babel-helper-regex "^6.22.0" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.22.0.tgz#d57c8335281918e54ef053118ce6eb108468084d" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.22.0" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-object-rest-spread@^6.22.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.23.0.tgz#875d6bc9be761c58a2ae3feee5dc4895d8c7f921" + dependencies: + babel-plugin-syntax-object-rest-spread "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.22.0.tgz#65740593a319c44522157538d690b84094617ea6" + dependencies: + regenerator-transform "0.9.8" + +babel-plugin-transform-strict-mode@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.22.0.tgz#e008df01340fdc87e959da65991b7e05970c8c7c" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.22.0" + +babel-preset-es2015@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.22.0.tgz#af5a98ecb35eb8af764ad8a5a05eb36dc4386835" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.22.0" + babel-plugin-transform-es2015-classes "^6.22.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.22.0" + babel-plugin-transform-es2015-modules-systemjs "^6.22.0" + babel-plugin-transform-es2015-modules-umd "^6.22.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.22.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + +babel-preset-stage-2@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.22.0.tgz#ccd565f19c245cade394b21216df704a73b27c07" + dependencies: + babel-plugin-syntax-dynamic-import "^6.18.0" + babel-plugin-transform-class-properties "^6.22.0" + babel-plugin-transform-decorators "^6.22.0" + babel-preset-stage-3 "^6.22.0" + +babel-preset-stage-3@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.22.0.tgz#a4e92bbace7456fafdf651d7a7657ee0bbca9c2e" + dependencies: + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-generator-functions "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-object-rest-spread "^6.22.0" + +babel-register@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.23.0.tgz#c9aa3d4cca94b51da34826c4a0f9e08145d74ff3" + dependencies: + babel-core "^6.23.0" + babel-runtime "^6.22.0" + core-js "^2.4.0" + home-or-tmp "^2.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + source-map-support "^0.4.2" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-template@^6.22.0, babel-template@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.23.0" + babel-types "^6.23.0" + babylon "^6.11.0" + lodash "^4.2.0" + +babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" + dependencies: + babel-code-frame "^6.22.0" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-types "^6.23.0" + babylon "^6.15.0" + debug "^2.2.0" + globals "^9.0.0" + invariant "^2.2.0" + lodash "^4.2.0" + +babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" + dependencies: + babel-runtime "^6.22.0" + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^1.0.1" + +babylon@^6.11.0, babylon@^6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" backo2@1.0.2: version "1.0.2" @@ -408,14 +805,14 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^2.9.33: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - bluebird@^3.3.0: version "3.4.7" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + body-parser@^1.12.4: version "1.16.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.16.0.tgz#924a5e472c6229fb9d69b85a20d5f2532dec788b" @@ -462,16 +859,55 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -breakable@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/breakable/-/breakable-1.0.0.tgz#784a797915a38ead27bad456b5572cb4bbaa78c1" +brorand@^1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.7.tgz#6677fa5e4901bdbf9c9ec2a748e28dca407a9bfc" -browserify-aes@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-0.4.0.tgz#067149b668df31c4b58533e02d01e806d8608e2c" +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" dependencies: + buffer-xor "^1.0.2" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" inherits "^2.0.1" +browserify-cipher@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + +browserify-rsa@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.0.tgz#10773910c3c206d5420a46aad8694f820b85968f" + dependencies: + bn.js "^4.1.1" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.2" + elliptic "^6.0.0" + inherits "^2.0.1" + parse-asn1 "^5.0.0" + browserify-zlib@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" @@ -482,7 +918,11 @@ buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" -buffer@^4.9.0: +buffer-xor@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + +buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: @@ -520,20 +960,13 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2, camelcase@^1.2.1: +camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" caseless@~0.11.0: version "0.11.0" @@ -556,7 +989,7 @@ chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@^1.0.0, chokidar@^1.4.1: +chokidar@^1.4.1, chokidar@^1.4.3, chokidar@^1.6.0: version "1.6.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" dependencies: @@ -571,6 +1004,12 @@ chokidar@^1.0.0, chokidar@^1.4.1: optionalDependencies: fsevents "^1.0.0" +cipher-base@^1.0.0, cipher-base@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" + dependencies: + inherits "^2.0.1" + circular-json@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d" @@ -593,6 +1032,14 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + clone@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" @@ -621,25 +1068,15 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@^2.5.0, commander@^2.6.0, commander@^2.8.1, commander@^2.9.0: +commander@^2.8.1, commander@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" -commoner@~0.10.3: - version "0.10.8" - resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5" - dependencies: - commander "^2.5.0" - detective "^4.3.1" - glob "^5.0.15" - graceful-fs "^4.1.2" - iconv-lite "^0.4.5" - mkdirp "^0.5.0" - private "^0.1.6" - q "^1.1.2" - recast "^0.11.17" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" component-bind@1.0.0: version "1.0.0" @@ -754,11 +1191,7 @@ cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - -core-js@^2.2.0: +core-js@^2.2.0, core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" @@ -766,26 +1199,49 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +create-ecdh@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + ripemd160 "^1.0.0" + sha.js "^2.3.6" + +create-hmac@^1.1.0, create-hmac@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170" + dependencies: + create-hash "^1.1.0" + inherits "^2.0.1" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" dependencies: boom "2.x.x" -crypto-browserify@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.3.0.tgz#b9fc75bb4a0ed61dcf1cd5dae96eb30c9c3e506c" +crypto-browserify@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" dependencies: - browserify-aes "0.4.0" - pbkdf2-compat "2.0.1" - ripemd160 "0.2.0" - sha.js "2.2.6" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" custom-event@~1.0.0: version "1.0.1" @@ -811,13 +1267,6 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -dateformat@^1.0.6: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - debug@0.7.4: version "0.7.4" resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" @@ -840,7 +1289,7 @@ debug@2.6.0, debug@^2.1.1, debug@^2.2.0: dependencies: ms "0.7.2" -decamelize@^1.0.0, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -858,25 +1307,6 @@ defaults@^1.0.2: dependencies: clone "^1.0.2" -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -defs@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/defs/-/defs-1.1.1.tgz#b22609f2c7a11ba7a3db116805c139b1caffa9d2" - dependencies: - alter "~0.2.0" - ast-traverse "~0.1.1" - breakable "~1.0.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - simple-fmt "~0.1.0" - simple-is "~0.2.0" - stringmap "~0.2.2" - stringset "~0.2.1" - tryor "~0.1.2" - yargs "~3.27.0" - del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -901,29 +1331,35 @@ depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +des.js@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" -detect-indent@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" dependencies: - get-stdin "^4.0.1" - minimist "^1.1.0" - repeating "^1.1.0" - -detective@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/detective/-/detective-4.3.2.tgz#77697e2e7947ac3fe7c8e26a6d6f115235afa91c" - dependencies: - acorn "^3.1.0" - defined "^1.0.0" + repeating "^2.0.0" di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" +diffie-hellman@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + doctrine@1.5.0, doctrine@^1.2.2: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" @@ -958,6 +1394,15 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +elliptic@^6.0.0: + version "6.3.3" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.3.tgz#5482d9646d54bcb89fd7d994fc9e2e9568876e3f" + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + inherits "^2.0.1" + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -1005,13 +1450,14 @@ engine.io@1.8.2: engine.io-parser "1.3.2" ws "1.1.1" -enhanced-resolve@~0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" +enhanced-resolve@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec" dependencies: graceful-fs "^4.1.2" - memory-fs "^0.2.0" - tapable "^0.1.8" + memory-fs "^0.4.0" + object-assign "^4.0.1" + tapable "^0.2.5" ent@~2.2.0: version "2.2.0" @@ -1205,15 +1651,11 @@ espree@^3.4.0: acorn "4.0.4" acorn-jsx "^3.0.0" -esprima-fb@~15001.1001.0-dev-harmony-fb: - version "15001.1001.0-dev-harmony-fb" - resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz#43beb57ec26e8cf237d3dd8b33e42533577f2659" - -esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: +esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.1, esprima@~3.1.0: +esprima@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -1236,7 +1678,7 @@ estraverse@~4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" -esutils@^2.0.0, esutils@^2.0.2: +esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -1259,12 +1701,18 @@ events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" -eventsource@0.1.6: +eventsource@~0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" dependencies: original ">=0.0.5" +evp_bytestokey@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" + dependencies: + create-hash "^1.1.1" + exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" @@ -1296,13 +1744,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -exports-loader@^0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.3.tgz#57dc78917f709b96f247fa91e69b554c855013c8" - dependencies: - loader-utils "0.2.x" - source-map "0.1.x" - express@^4.13.3: version "4.14.1" resolved "https://registry.yarnpkg.com/express/-/express-4.14.1.tgz#646c237f766f148c2120aff073817b9e4d7e0d33" @@ -1427,6 +1868,14 @@ finalhandler@0.5.1: statuses "~1.3.1" unpipe "~1.0.0" +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -1481,10 +1930,6 @@ fs-extra@~1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" -fs-readdir-recursive@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz#315b4fb8c1ca5b8c47defef319d073dad3568059" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1541,9 +1986,9 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" getpass@^0.1.1: version "0.1.6" @@ -1564,7 +2009,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^5.0.15, glob@^5.0.5: +glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -1585,11 +2030,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -globals@^6.4.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" - -globals@^9.14.0: +globals@^9.0.0, globals@^9.14.0: version "9.14.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" @@ -1604,7 +2045,7 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1612,6 +2053,10 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +handle-thing@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + handlebars@^4.0.1: version "4.0.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" @@ -1661,6 +2106,12 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" +hash.js@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" + dependencies: + inherits "^2.0.1" + hasha@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" @@ -1681,17 +2132,34 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -home-or-tmp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-1.0.0.tgz#4b9f1e40800c3e50c6c27f781676afcce71f3985" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" dependencies: + os-homedir "^1.0.0" os-tmpdir "^1.0.1" - user-home "^1.1.1" hosted-git-info@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.0.tgz#41948caf85ce82fed36e4e6a0ed371a6664379e2" + +http-deceiver@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + http-errors@~1.5.0, http-errors@~1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" @@ -1728,7 +2196,7 @@ https-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" -iconv-lite@0.4.15, iconv-lite@^0.4.5: +iconv-lite@0.4.15: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" @@ -1751,12 +2219,6 @@ imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -1798,14 +2260,16 @@ inquirer@^0.12.0: strip-ansi "^3.0.0" through "^2.3.6" -interpret@^0.6.4: - version "0.6.6" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-0.6.6.tgz#fecd7a18e7ce5ca6abfb953e1f86213a49f1625b" - interpret@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" +invariant@^2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -1884,12 +2348,6 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-integer@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-integer/-/is-integer-1.0.6.tgz#5273819fada880d123e1ac00a938e7172dd8d95e" - dependencies: - is-finite "^1.0.0" - is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: version "2.15.0" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" @@ -1981,7 +2439,7 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul@^0.4.0, istanbul@^0.4.5: +istanbul@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" dependencies: @@ -2028,9 +2486,9 @@ jquery@2.2.1, jquery@>=1.8.0: version "2.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.1.tgz#3c3e16854ad3d2ac44ac65021b17426d22ad803f" -js-tokens@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" +js-cookie@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-2.1.3.tgz#48071625217ac9ecfab8c343a13d42ec09ff0526" js-tokens@^3.0.0: version "3.0.1" @@ -2047,6 +2505,10 @@ jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -2073,10 +2535,6 @@ json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" - json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -2103,16 +2561,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" -karma-coverage@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.1.tgz#5aff8b39cf6994dc22de4c84362c76001b637cf6" - dependencies: - dateformat "^1.0.6" - istanbul "^0.4.0" - lodash "^3.8.0" - minimatch "^3.0.0" - source-map "^0.5.1" - karma-jasmine@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" @@ -2130,9 +2578,9 @@ karma-sourcemap-loader@^0.3.7: dependencies: graceful-fs "^4.1.2" -karma-webpack@^1.8.0: - version "1.8.1" - resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-1.8.1.tgz#39d5fd2edeea3cc3ef5b405989b37d5b0e6a3b4e" +karma-webpack@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.2.tgz#bd38350af5645c9644090770939ebe7ce726f864" dependencies: async "~0.9.0" loader-utils "^0.2.5" @@ -2140,7 +2588,7 @@ karma-webpack@^1.8.0: source-map "^0.1.41" webpack-dev-middleware "^1.0.11" -karma@^1.3.0: +karma@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/karma/-/karma-1.4.1.tgz#41981a71d54237606b0a3ea8c58c90773f41650e" dependencies: @@ -2198,10 +2646,6 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" -leven@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/leven/-/leven-1.0.2.tgz#9144b6eebca5f1d0680169f1a6770dcea60b75c3" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -2219,7 +2663,11 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.5, loader-utils@^0.2.9: +loader-runner@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + +loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5: version "0.2.16" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" dependencies: @@ -2266,11 +2714,11 @@ lodash.words@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.words/-/lodash.words-4.2.0.tgz#5ecfeaf8ecf8acaa8e0c8386295f1993c9cf4036" -lodash@^3.10.0, lodash@^3.2.0, lodash@^3.8.0, lodash@^3.9.3: +lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.2, lodash@^4.3.0, lodash@^4.5.0: +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -2285,58 +2733,27 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" + js-tokens "^3.0.0" lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" -memory-fs@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" - -memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" dependencies: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -2363,6 +2780,13 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" +miller-rabin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + "mime-db@>= 1.24.0 < 2", mime-db@~1.26.0: version "1.26.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" @@ -2377,30 +2801,24 @@ mime@1.3.4, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" + "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" -minimatch@^2.0.3: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" @@ -2413,6 +2831,10 @@ mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkd dependencies: minimist "0.0.8" +moment@2.x: + version "2.17.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.1.tgz#fed9506063f36b10f066c8b59a144d7faebe1d82" + mousetrap@1.4.6: version "1.4.6" resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.4.6.tgz#eaca72e22e56d5b769b7555873b688c3332e390a" @@ -2441,16 +2863,16 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -node-libs-browser@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-0.7.0.tgz#3e272c0819e308935e26674408d7af0e1491b83b" +node-libs-browser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" dependencies: assert "^1.1.1" browserify-zlib "^0.1.4" - buffer "^4.9.0" + buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" - crypto-browserify "3.3.0" + crypto-browserify "^3.11.0" domain-browser "^1.1.1" events "^1.0.0" https-browserify "0.0.1" @@ -2498,7 +2920,7 @@ nopt@3.x, nopt@~3.0.6: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.3.5" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" dependencies: @@ -2532,10 +2954,6 @@ object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2551,6 +2969,10 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +obuf@^1.0.0, obuf@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -2577,11 +2999,14 @@ onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" -open@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" -optimist@^0.6.1, optimist@~0.6.0, optimist@~0.6.1: +optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" dependencies: @@ -2627,18 +3052,20 @@ os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -output-file-sync@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" - dependencies: - graceful-fs "^4.1.4" - mkdirp "^0.5.1" - object-assign "^4.1.0" - pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" +parse-asn1@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.0.0.tgz#35060f6d5015d37628c770f4e091a0b5a278bc23" + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -2680,10 +3107,6 @@ path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" -path-exists@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-1.0.0.tgz#d5a8998eb71ef37a74c34eb0d9eba6e878eea081" - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -2710,9 +3133,11 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -pbkdf2-compat@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pbkdf2-compat/-/pbkdf2-compat-2.0.1.tgz#b6e0c8fa99494d94e0511575802a59a5c142f288" +pbkdf2@^3.0.3: + version "3.0.9" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693" + dependencies: + create-hmac "^1.1.2" pend@~1.2.0: version "1.2.0" @@ -2736,6 +3161,12 @@ pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" +pikaday@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.5.1.tgz#0a48549bc1a14ea1d08c44074d761bc2f2bfcfd3" + optionalDependencies: + moment "2.x" + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -2762,6 +3193,14 @@ pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -2770,7 +3209,7 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -private@^0.1.6, private@~0.1.5: +private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -2797,6 +3236,16 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +public-encrypt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -2805,10 +3254,6 @@ punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@^1.1.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" @@ -2844,6 +3289,10 @@ randomatic@^1.1.3: is-number "^2.0.2" kind-of "^3.0.2" +randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" + range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -2941,60 +3390,27 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" -recast@0.10.33: - version "0.10.33" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" - dependencies: - ast-types "0.8.12" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.10.10: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - -recast@^0.11.17: - version "0.11.21" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.21.tgz#4e83081c6359ecb2e526d14f4138879333f20ac9" - dependencies: - ast-types "0.9.5" - esprima "~3.1.0" - private "~0.1.5" - source-map "~0.5.0" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator@0.8.40: - version "0.8.40" - resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + +regenerator-transform@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" dependencies: - commoner "~0.10.3" - defs "~1.1.0" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - recast "0.10.33" - through "~2.3.8" + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" regex-cache@^0.4.2: version "0.4.3" @@ -3003,12 +3419,10 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" -regexpu@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" dependencies: - esprima "^2.6.0" - recast "^0.10.10" regenerate "^1.2.1" regjsgen "^0.2.0" regjsparser "^0.1.4" @@ -3035,12 +3449,6 @@ repeat-string@^1.5.2: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" -repeating@^1.1.0, repeating@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - dependencies: - is-finite "^1.0.0" - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -3078,6 +3486,14 @@ request@^2.79.0, request@~2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + require-uncached@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -3093,14 +3509,10 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@1.1.x: +resolve@1.1.x, resolve@^1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" - restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -3120,9 +3532,9 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@~2.5.1, rimraf@~2.5.4: dependencies: glob "^7.0.5" -ripemd160@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-0.2.0.tgz#2bf198bde167cacfa51c0a928e84b68bbe171fce" +ripemd160@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" run-async@^0.1.0: version "0.1.0" @@ -3138,6 +3550,10 @@ safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + select2@3.5.2-browserify: version "3.5.2-browserify" resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.2-browserify.tgz#dc4dafda38d67a734e8a97a46f0d3529ae05391d" @@ -3189,7 +3605,7 @@ serve-static@~1.11.2: parseurl "~1.3.1" send "0.14.2" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -3205,13 +3621,11 @@ setprototypeof@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" -sha.js@2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.2.6.tgz#17ddeddc5f722fb66501658895461977867315ba" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" +sha.js@^2.3.6: + version "2.4.8" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" + dependencies: + inherits "^2.0.1" shelljs@^0.7.5: version "0.7.6" @@ -3225,14 +3639,6 @@ signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -simple-fmt@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/simple-fmt/-/simple-fmt-0.1.0.tgz#191bf566a59e6530482cb25ab53b4a8dc85c3a6b" - -simple-is@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" - slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -3291,18 +3697,18 @@ socket.io@1.7.2: socket.io-client "1.7.2" socket.io-parser "2.3.1" -sockjs-client@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.2.tgz#f0212a8550e4c9468c8cceaeefd2e3493c033ad5" +sockjs-client@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.1.tgz#284843e9a9784d7c474b1571b3240fca9dda4bb0" dependencies: debug "^2.2.0" - eventsource "0.1.6" + eventsource "~0.1.6" faye-websocket "~0.11.0" inherits "^2.0.1" json3 "^3.3.2" url-parse "^1.1.1" -sockjs@^0.3.15: +sockjs@0.3.18: version "0.3.18" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.18.tgz#d9b289316ca7df77595ef299e075f0f937eb4207" dependencies: @@ -3313,17 +3719,11 @@ source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" -source-map-support@^0.2.10: - version "0.2.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.2.10.tgz#ea5a3900a1c1cb25096a0ae8cc5c2b4b10ded3dc" +source-map-support@^0.4.2: + version "0.4.11" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322" dependencies: - source-map "0.1.32" - -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" - dependencies: - amdefine ">=0.0.4" + source-map "^0.5.3" source-map@0.1.x, source-map@^0.1.41: version "0.1.43" @@ -3331,13 +3731,13 @@ source-map@0.1.x, source-map@^0.1.41: dependencies: amdefine ">=0.0.4" -source-map@^0.4.4, source-map@~0.4.1: +source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@~0.5.0, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1, source-map@~0.5.3: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -3361,6 +3761,26 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdy-transport@^2.0.15: + version "2.0.18" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.18.tgz#43fc9c56be2cccc12bb3e2754aa971154e836ea6" + dependencies: + debug "^2.2.0" + hpack.js "^2.1.6" + obuf "^1.1.0" + readable-stream "^2.0.1" + wbuf "^1.4.0" + +spdy@^3.4.1: + version "3.4.4" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.4.tgz#e0406407ca90ff01b553eb013505442649f5a819" + dependencies: + debug "^2.2.0" + handle-thing "^1.2.4" + http-deceiver "^1.2.4" + select-hose "^2.0.0" + spdy-transport "^2.0.15" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -3380,11 +3800,7 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -stable@~0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.5.tgz#08232f60c732e9890784b5bed0734f8b32a887b9" - -stats-webpack-plugin@^0.4.2: +stats-webpack-plugin@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.4.3.tgz#b2f618202f28dd04ab47d7ecf54ab846137b7aea" @@ -3399,10 +3815,6 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-cache@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/stream-cache/-/stream-cache-0.0.2.tgz#1ac5ad6832428ca55667dbdee395dad4e6db118f" - stream-http@^2.3.1: version "2.6.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.6.3.tgz#4c3ddbf9635968ea2cfd4e48d43de5def2625ac3" @@ -3413,7 +3825,7 @@ stream-http@^2.3.1: to-arraybuffer "^1.0.0" xtend "^4.0.0" -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: @@ -3432,14 +3844,6 @@ string_decoder@^0.10.25, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -stringmap@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1" - -stringset@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/stringset/-/stringset-0.2.1.tgz#ef259c4e349344377fcd1c913dd2e848c9c042b5" - stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3460,12 +3864,6 @@ strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" @@ -3499,9 +3897,9 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -tapable@^0.1.8, tapable@~0.1.8: - version "0.1.10" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" +tapable@^0.2.5, tapable@~0.2.5: + version "0.2.6" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" tar-pack@~3.3.0: version "3.3.0" @@ -3532,10 +3930,14 @@ throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" -through@^2.3.6, through@~2.3.8: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" +timeago.js@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/timeago.js/-/timeago.js-2.0.5.tgz#730c74fbdb0b0917a553675a4460e3a7f80db86c" + timers-browserify@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" @@ -3556,7 +3958,7 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" -to-fast-properties@^1.0.0: +to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" @@ -3566,26 +3968,14 @@ tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.0: +trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" -try-resolve@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/try-resolve/-/try-resolve-1.0.1.tgz#cfde6fabd72d63e5797cfaab873abbe8e700e912" - tryit@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb" -tryor@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/tryor/-/tryor-0.1.2.tgz#8145e4ca7caff40acde3ccf946e8b8bb75b4172b" - tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" @@ -3615,7 +4005,7 @@ typedarray@^0.0.6, typedarray@~0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-js@^2.6, uglify-js@~2.7.3: +uglify-js@^2.6, uglify-js@^2.7.5: version "2.7.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" dependencies: @@ -3665,10 +4055,6 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -3739,22 +4125,21 @@ vue@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/vue/-/vue-2.0.3.tgz#3f7698f83d6ad1f0e35955447901672876c63fde" -watchpack@^0.2.1: - version "0.2.9" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-0.2.9.tgz#62eaa4ab5e5ba35fdfc018275626e3c0f5e3fb0b" +watchpack@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.2.1.tgz#01efa80c5c29e5c56ba55d6f5470a35b6402f0b2" dependencies: - async "^0.9.0" - chokidar "^1.0.0" + async "^2.1.2" + chokidar "^1.4.3" graceful-fs "^4.1.2" -webpack-core@~0.6.9: - version "0.6.9" - resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" +wbuf@^1.1.0, wbuf@^1.4.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" dependencies: - source-list-map "~0.1.7" - source-map "~0.4.1" + minimalistic-assert "^1.0.0" -webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.4.0: +webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.9.0: version "1.10.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.0.tgz#7d5be2651e692fddfafd8aaed177c16ff51f0eb8" dependencies: @@ -3763,50 +4148,59 @@ webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.4.0: path-is-absolute "^1.0.0" range-parser "^1.0.3" -webpack-dev-server@^1.16.2: - version "1.16.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-1.16.3.tgz#cbb6a0d3e7c8eb5453b3e9befcbe843219f62661" +webpack-dev-server@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.3.0.tgz#0437704bbd4d941a6e4c061eb3cc232ed7d06101" dependencies: + ansi-html "0.0.7" + chokidar "^1.6.0" compression "^1.5.2" connect-history-api-fallback "^1.3.0" express "^4.13.3" + html-entities "^1.2.0" http-proxy-middleware "~0.17.1" - open "0.0.5" - optimist "~0.6.1" + opn "4.0.2" + portfinder "^1.0.9" serve-index "^1.7.2" - sockjs "^0.3.15" - sockjs-client "^1.0.3" - stream-cache "~0.0.1" + sockjs "0.3.18" + sockjs-client "1.1.1" + spdy "^3.4.1" strip-ansi "^3.0.0" supports-color "^3.1.1" - webpack-dev-middleware "^1.4.0" + webpack-dev-middleware "^1.9.0" + yargs "^6.0.0" -webpack-sources@^0.1.0: +webpack-sources@^0.1.0, webpack-sources@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.4.tgz#ccc2c817e08e5fa393239412690bb481821393cd" dependencies: source-list-map "~0.1.7" source-map "~0.5.3" -webpack@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-1.14.0.tgz#54f1ffb92051a328a5b2057d6ae33c289462c823" +webpack@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.2.1.tgz#7bb1d72ae2087dd1a4af526afec15eed17dda475" dependencies: - acorn "^3.0.0" - async "^1.3.0" - clone "^1.0.2" - enhanced-resolve "~0.9.0" - interpret "^0.6.4" - loader-utils "^0.2.11" - memory-fs "~0.3.0" + acorn "^4.0.4" + acorn-dynamic-import "^2.0.0" + ajv "^4.7.0" + ajv-keywords "^1.1.1" + async "^2.1.2" + enhanced-resolve "^3.0.0" + interpret "^1.0.0" + json-loader "^0.5.4" + loader-runner "^2.3.0" + loader-utils "^0.2.16" + memory-fs "~0.4.1" mkdirp "~0.5.0" - node-libs-browser "^0.7.0" - optimist "~0.6.0" + node-libs-browser "^2.0.0" + source-map "^0.5.3" supports-color "^3.1.0" - tapable "~0.1.8" - uglify-js "~2.7.3" - watchpack "^0.2.1" - webpack-core "~0.6.9" + tapable "~0.2.5" + uglify-js "^2.7.5" + watchpack "^1.2.0" + webpack-sources "^0.1.4" + yargs "^6.0.0" websocket-driver@>=0.5.1: version "0.6.5" @@ -3818,6 +4212,10 @@ websocket-extensions@>=0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + which@^1.1.1, which@~1.2.10: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" @@ -3834,10 +4232,6 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" @@ -3850,6 +4244,13 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -3879,10 +4280,34 @@ xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -y18n@^3.2.0: +y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -3892,17 +4317,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yargs@~3.27.0: - version "3.27.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.27.0.tgz#21205469316e939131d59f2da0c6d7f98221ea40" - dependencies: - camelcase "^1.2.1" - cliui "^2.1.0" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" From 03f1abfcc3e43fce188f94a770f5f7b6af6f36b5 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 14 Feb 2017 13:48:13 +0800 Subject: [PATCH 165/313] Only ensure against yield so that pool should be available Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9192#note_23293693 --- lib/gitlab/database.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index e6612bc3aad..a6e9ea3dead 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -72,10 +72,11 @@ module Gitlab def self.with_connection_pool(pool_size) pool = create_connection_pool(pool_size) - yield(pool) - - ensure - pool.disconnect! + begin + yield(pool) + ensure + pool.disconnect! + end end def self.create_connection_pool(pool_size) From 142432ce5ae78cc873b9748f41e54257adc56dcc Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Tue, 14 Feb 2017 17:27:29 +1100 Subject: [PATCH 166/313] update issue count when closing/reopening an issue --- app/assets/javascripts/issue.js | 3 +++ spec/javascripts/issue_spec.js | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/app/assets/javascripts/issue.js b/app/assets/javascripts/issue.js index 6c08b1b8e61..1776b3d61f6 100644 --- a/app/assets/javascripts/issue.js +++ b/app/assets/javascripts/issue.js @@ -54,16 +54,19 @@ require('vendor/task_list'); success: function(data, textStatus, jqXHR) { if ('id' in data) { $(document).trigger('issuable:change'); + const currentTotal = Number($('.issue_counter').text()); if (isClose) { $('a.btn-close').addClass('hidden'); $('a.btn-reopen').removeClass('hidden'); $('div.status-box-closed').removeClass('hidden'); $('div.status-box-open').addClass('hidden'); + $('.issue_counter').text(currentTotal - 1); } else { $('a.btn-reopen').addClass('hidden'); $('a.btn-close').removeClass('hidden'); $('div.status-box-closed').addClass('hidden'); $('div.status-box-open').removeClass('hidden'); + $('.issue_counter').text(currentTotal + 1); } } else { new Flash(issueFailMessage, 'alert'); diff --git a/spec/javascripts/issue_spec.js b/spec/javascripts/issue_spec.js index 5b0b7aa7903..beb544468ef 100644 --- a/spec/javascripts/issue_spec.js +++ b/spec/javascripts/issue_spec.js @@ -105,6 +105,7 @@ require('~/issue'); expectIssueState(false); expect($btnClose).toHaveProp('disabled', false); + expect($('.issue_counter')).toHaveText(0); }); it('fails to close an issue with success:false', function() { @@ -121,6 +122,7 @@ require('~/issue'); expectIssueState(true); expect($btnClose).toHaveProp('disabled', false); expectErrorMessage(); + expect($('.issue_counter')).toHaveText(1); }); it('fails to closes an issue with HTTP error', function() { @@ -135,6 +137,7 @@ require('~/issue'); expectIssueState(true); expect($btnClose).toHaveProp('disabled', true); expectErrorMessage(); + expect($('.issue_counter')).toHaveText(1); }); }); @@ -159,6 +162,7 @@ require('~/issue'); expectIssueState(true); expect($btnReopen).toHaveProp('disabled', false); + expect($('.issue_counter')).toHaveText(1); }); }); }).call(this); From 1fc6f6cc7101a9c4dee694682a3533a5e4ba3447 Mon Sep 17 00:00:00 2001 From: Mark Fletcher Date: Tue, 20 Dec 2016 13:32:43 +0000 Subject: [PATCH 167/313] Execute web hooks for WikiPage delete operation * Add a new DestroyService for Wiki Pages * Alter WikiPagesController to use the new service --- app/controllers/projects/wikis_controller.rb | 2 +- app/services/wiki_pages/destroy_service.rb | 11 ++++++++++ ...ge-delete-does-not-trigger-the-webhook.yml | 4 ++++ doc/user/project/integrations/webhooks.md | 2 +- .../wiki_pages/destroy_service_spec.rb | 21 +++++++++++++++++++ 5 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 app/services/wiki_pages/destroy_service.rb create mode 100644 changelogs/unreleased/19302-wiki-page-delete-does-not-trigger-the-webhook.yml create mode 100644 spec/services/wiki_pages/destroy_service_spec.rb diff --git a/app/controllers/projects/wikis_controller.rb b/app/controllers/projects/wikis_controller.rb index 0faa71c4d7d..2d8064c9878 100644 --- a/app/controllers/projects/wikis_controller.rb +++ b/app/controllers/projects/wikis_controller.rb @@ -84,7 +84,7 @@ class Projects::WikisController < Projects::ApplicationController def destroy @page = @project_wiki.find_page(params[:id]) - @page&.delete + WikiPages::DestroyService.new(@project, current_user).execute(@page) redirect_to( namespace_project_wiki_path(@project.namespace, @project, :home), diff --git a/app/services/wiki_pages/destroy_service.rb b/app/services/wiki_pages/destroy_service.rb new file mode 100644 index 00000000000..6b93fb2f6d7 --- /dev/null +++ b/app/services/wiki_pages/destroy_service.rb @@ -0,0 +1,11 @@ +module WikiPages + class DestroyService < WikiPages::BaseService + def execute(page) + if page&.delete + execute_hooks(page, 'delete') + end + + page + end + end +end diff --git a/changelogs/unreleased/19302-wiki-page-delete-does-not-trigger-the-webhook.yml b/changelogs/unreleased/19302-wiki-page-delete-does-not-trigger-the-webhook.yml new file mode 100644 index 00000000000..d74057dca8a --- /dev/null +++ b/changelogs/unreleased/19302-wiki-page-delete-does-not-trigger-the-webhook.yml @@ -0,0 +1,4 @@ +--- +title: Execute web hooks for WikiPage delete operation +merge_request: 8198 +author: diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md index 9df0c765f84..55d480bfb72 100644 --- a/doc/user/project/integrations/webhooks.md +++ b/doc/user/project/integrations/webhooks.md @@ -714,7 +714,7 @@ X-Gitlab-Event: Merge Request Hook ### Wiki Page events -Triggered when a wiki page is created or edited. +Triggered when a wiki page is created, edited or deleted. **Request Header**: diff --git a/spec/services/wiki_pages/destroy_service_spec.rb b/spec/services/wiki_pages/destroy_service_spec.rb new file mode 100644 index 00000000000..a4b9a390fe2 --- /dev/null +++ b/spec/services/wiki_pages/destroy_service_spec.rb @@ -0,0 +1,21 @@ +require 'spec_helper' + +describe WikiPages::DestroyService, services: true do + let(:project) { create(:empty_project) } + let(:user) { create(:user) } + let(:wiki_page) { create(:wiki_page) } + let(:service) { described_class.new(project, user) } + + describe '#execute' do + before do + allow(service).to receive(:execute_hooks) + project.add_master(user) + end + + it 'executes webhooks' do + service.execute(wiki_page) + + expect(service).to have_received(:execute_hooks).once.with(wiki_page, 'delete') + end + end +end From 215fadbcc86c3aac68569fee47e8d205dd250d7a Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 14 Feb 2017 00:14:28 -0600 Subject: [PATCH 168/313] fix eslint builds within .gitlab-ci.yml --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b2622ac7e0f..7d0c976d816 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -327,7 +327,7 @@ lint:javascript: paths: - node_modules/ stage: test - image: "node:7.1" + before_script: [] script: - yarn run eslint @@ -337,7 +337,7 @@ lint:javascript:report: paths: - node_modules/ stage: post-test - image: "node:7.1" + before_script: [] script: - find app/ spec/ -name '*.js' -or -name '*.js.es6' -exec sed --in-place 's|/\* eslint-disable .*\*/||' {} \; # run report over all files - yarn run eslint-report || true # ignore exit code From e8b5b082da28bff1c9728c913484bdf12f936b95 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 14 Feb 2017 00:55:11 -0600 Subject: [PATCH 169/313] add CHANGELOG.md entry for !9055 --- changelogs/unreleased/replace-npm-with-yarn.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/replace-npm-with-yarn.yml diff --git a/changelogs/unreleased/replace-npm-with-yarn.yml b/changelogs/unreleased/replace-npm-with-yarn.yml new file mode 100644 index 00000000000..5e795eb0c8d --- /dev/null +++ b/changelogs/unreleased/replace-npm-with-yarn.yml @@ -0,0 +1,4 @@ +--- +title: replace npm with yarn and add yarn.lock +merge_request: 9055 +author: From 34b8cdf87ce8e36e5f442bf7068869833f35243b Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 14 Feb 2017 01:35:27 -0600 Subject: [PATCH 170/313] enable eslint to resolve webpack modules according to webpack.config.js --- .eslintrc | 14 ++++++++++---- package.json | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.eslintrc b/.eslintrc index 1a2cd821af7..0fcd866778f 100644 --- a/.eslintrc +++ b/.eslintrc @@ -12,12 +12,18 @@ "localStorage": false }, "plugins": [ - "filenames" + "filenames", + "import" ], + "settings": { + "import/resolver": { + "webpack": { + "config": "./config/webpack.config.js" + } + } + }, "rules": { "filenames/match-regex": [2, "^[a-z0-9_]+(.js)?$"], - "no-multiple-empty-lines": ["error", { "max": 1 }], - "import/no-extraneous-dependencies": "off", - "import/no-unresolved": "off" + "no-multiple-empty-lines": ["error", { "max": 1 }] } } diff --git a/package.json b/package.json index 24e11a4607f..3a7cdb14ad1 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "devDependencies": { "eslint": "^3.10.1", "eslint-config-airbnb-base": "^10.0.1", + "eslint-import-resolver-webpack": "^0.8.1", "eslint-plugin-filenames": "^1.1.0", "eslint-plugin-import": "^2.2.0", "eslint-plugin-jasmine": "^2.1.0", From b06ac70ab5fec093bf189e8d0efb6ddb22796051 Mon Sep 17 00:00:00 2001 From: winniehell Date: Mon, 13 Feb 2017 23:35:08 +0100 Subject: [PATCH 171/313] Add dynamic fixture for todos --- spec/javascripts/fixtures/todos.rb | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 spec/javascripts/fixtures/todos.rb diff --git a/spec/javascripts/fixtures/todos.rb b/spec/javascripts/fixtures/todos.rb new file mode 100644 index 00000000000..30ccf49e7e8 --- /dev/null +++ b/spec/javascripts/fixtures/todos.rb @@ -0,0 +1,30 @@ +require 'spec_helper' + +describe Dashboard::TodosController, '(JavaScript fixtures)', type: :controller do + include JavaScriptFixturesHelpers + + let(:admin) { create(:admin) } + let(:namespace) { create(:namespace, name: 'frontend-fixtures' )} + let(:project) { create(:project_empty_repo, namespace: namespace, path: 'todos-project') } + let(:issue_1) { create(:issue, title: 'issue_1', project: project) } + let!(:todo_1) { create(:todo, user: admin, project: project, target: issue_1, created_at: 5.hours.ago) } + let(:issue_2) { create(:issue, title: 'issue_2', project: project) } + let!(:todo_2) { create(:todo, :done, user: admin, project: project, target: issue_2, created_at: 50.hours.ago) } + + render_views + + before(:all) do + clean_frontend_fixtures('todos/') + end + + before(:each) do + sign_in(admin) + end + + it 'todos/todos.html.raw' do |example| + get :index + + expect(response).to be_success + store_frontend_fixture(response, example.description) + end +end From d8517fd457995927f8a2196e9dba1b6d68d027ad Mon Sep 17 00:00:00 2001 From: winniehell Date: Tue, 14 Feb 2017 01:09:57 +0100 Subject: [PATCH 172/313] Replace static fixture for right_sidebar_spec.js (!9211) --- .../unreleased/dynamic-todos-fixture.yml | 4 ++ spec/javascripts/fixtures/.gitignore | 1 + spec/javascripts/fixtures/todos.json | 4 -- spec/javascripts/fixtures/todos.rb | 40 ++++++++++++++----- spec/javascripts/right_sidebar_spec.js | 4 +- 5 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 changelogs/unreleased/dynamic-todos-fixture.yml delete mode 100644 spec/javascripts/fixtures/todos.json diff --git a/changelogs/unreleased/dynamic-todos-fixture.yml b/changelogs/unreleased/dynamic-todos-fixture.yml new file mode 100644 index 00000000000..580bc729e3c --- /dev/null +++ b/changelogs/unreleased/dynamic-todos-fixture.yml @@ -0,0 +1,4 @@ +--- +title: Replace static fixture for right_sidebar_spec.js +merge_request: 9211 +author: winniehell diff --git a/spec/javascripts/fixtures/.gitignore b/spec/javascripts/fixtures/.gitignore index 009b68d5d1c..0c35cdd778e 100644 --- a/spec/javascripts/fixtures/.gitignore +++ b/spec/javascripts/fixtures/.gitignore @@ -1 +1,2 @@ *.html.raw +*.json diff --git a/spec/javascripts/fixtures/todos.json b/spec/javascripts/fixtures/todos.json deleted file mode 100644 index 62c2387d515..00000000000 --- a/spec/javascripts/fixtures/todos.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "count": 1, - "delete_path": "/dashboard/todos/1" -} \ No newline at end of file diff --git a/spec/javascripts/fixtures/todos.rb b/spec/javascripts/fixtures/todos.rb index 30ccf49e7e8..2c08b06ea9e 100644 --- a/spec/javascripts/fixtures/todos.rb +++ b/spec/javascripts/fixtures/todos.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe Dashboard::TodosController, '(JavaScript fixtures)', type: :controller do +describe 'Todos (JavaScript fixtures)' do include JavaScriptFixturesHelpers let(:admin) { create(:admin) } @@ -11,20 +11,42 @@ describe Dashboard::TodosController, '(JavaScript fixtures)', type: :controller let(:issue_2) { create(:issue, title: 'issue_2', project: project) } let!(:todo_2) { create(:todo, :done, user: admin, project: project, target: issue_2, created_at: 50.hours.ago) } - render_views - before(:all) do clean_frontend_fixtures('todos/') end - before(:each) do - sign_in(admin) + describe Dashboard::TodosController, '(JavaScript fixtures)', type: :controller do + render_views + + before(:each) do + sign_in(admin) + end + + it 'todos/todos.html.raw' do |example| + get :index + + expect(response).to be_success + store_frontend_fixture(response, example.description) + end end - it 'todos/todos.html.raw' do |example| - get :index + describe Projects::TodosController, '(JavaScript fixtures)', type: :controller do + render_views - expect(response).to be_success - store_frontend_fixture(response, example.description) + before(:each) do + sign_in(admin) + end + + it 'todos/todos.json' do |example| + post :create, + namespace_id: namespace.path, + project_id: project.path, + issuable_type: 'issue', + issuable_id: issue_2.id, + format: 'json' + + expect(response).to be_success + store_frontend_fixture(response, example.description) + end end end diff --git a/spec/javascripts/right_sidebar_spec.js b/spec/javascripts/right_sidebar_spec.js index f7636865aa1..9284af8a8d9 100644 --- a/spec/javascripts/right_sidebar_spec.js +++ b/spec/javascripts/right_sidebar_spec.js @@ -34,7 +34,7 @@ require('~/extensions/jquery.js'); describe('RightSidebar', function() { var fixtureName = 'issues/open-issue.html.raw'; preloadFixtures(fixtureName); - loadJSONFixtures('todos.json'); + loadJSONFixtures('todos/todos.json'); beforeEach(function() { loadFixtures(fixtureName); @@ -64,7 +64,7 @@ require('~/extensions/jquery.js'); }); it('should broadcast todo:toggle event when add todo clicked', function() { - var todos = getJSONFixture('todos.json'); + var todos = getJSONFixture('todos/todos.json'); spyOn(jQuery, 'ajax').and.callFake(function() { var d = $.Deferred(); var response = todos; From b493360f7f8b72e91287ec5827e644074976e506 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Mon, 13 Feb 2017 07:39:57 -0500 Subject: [PATCH 173/313] Set max width for text in mini pipeline graph --- app/assets/stylesheets/pages/pipelines.scss | 2 +- .../unreleased/27924-set-max-width-mini-pipeline-text.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27924-set-max-width-mini-pipeline-text.yml diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss index 0c7019dc64f..00eb5b30fd5 100644 --- a/app/assets/stylesheets/pages/pipelines.scss +++ b/app/assets/stylesheets/pages/pipelines.scss @@ -864,7 +864,7 @@ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; - width: 90px; + max-width: 70%; color: $gl-text-color-secondary; margin-left: 2px; display: inline-block; diff --git a/changelogs/unreleased/27924-set-max-width-mini-pipeline-text.yml b/changelogs/unreleased/27924-set-max-width-mini-pipeline-text.yml new file mode 100644 index 00000000000..53077eedc11 --- /dev/null +++ b/changelogs/unreleased/27924-set-max-width-mini-pipeline-text.yml @@ -0,0 +1,4 @@ +--- +title: Set maximum width for mini pipeline graph text so it is not truncated to early +merge_request: 9188 +author: From a7702271391524262788accfc78e6ef58b63f88e Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 6 Feb 2017 12:22:55 +0800 Subject: [PATCH 174/313] Remove inactive default email services Note that we no longer generate this by default. This is for clearing legacy default data. --- ...remove-inactive-default-email-services.yml | 4 +++ ..._remove_inactive_default_email_services.rb | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 changelogs/unreleased/remove-inactive-default-email-services.yml create mode 100644 db/post_migrate/20170206040400_remove_inactive_default_email_services.rb diff --git a/changelogs/unreleased/remove-inactive-default-email-services.yml b/changelogs/unreleased/remove-inactive-default-email-services.yml new file mode 100644 index 00000000000..c32c1390e4e --- /dev/null +++ b/changelogs/unreleased/remove-inactive-default-email-services.yml @@ -0,0 +1,4 @@ +--- +title: Remove inactive default email services +merge_request: 8987 +author: diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb new file mode 100644 index 00000000000..18affebde73 --- /dev/null +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -0,0 +1,27 @@ +class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def up + execute <<-SQL.strip_heredoc + DELETE FROM services + WHERE type = 'BuildsEmailService' + AND active = #{false_value} + AND properties = '{"notify_only_broken_builds":true}'; + + DELETE FROM services + WHERE type = 'PipelinesEmailService' + AND active = #{false_value} + AND properties = '{"notify_only_broken_pipelines":true}'; + SQL + end + + def false_value + quote(false) + end + + def quote(value) + ActiveRecord::Base.connection.quote(value) + end +end From 25cd5aa228ebe10ce9eabb17c75eb86e9d8c152c Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 6 Feb 2017 12:39:36 +0800 Subject: [PATCH 175/313] Run two threads to improve migration running time --- ..._remove_inactive_default_email_services.rb | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index 18affebde73..dc7750f3244 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -4,24 +4,38 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration DOWNTIME = false def up - execute <<-SQL.strip_heredoc + builds_service = spawn <<-SQL.strip_heredoc DELETE FROM services WHERE type = 'BuildsEmailService' AND active = #{false_value} AND properties = '{"notify_only_broken_builds":true}'; + SQL + pipelines_service = spawn <<-SQL.strip_heredoc DELETE FROM services WHERE type = 'PipelinesEmailService' AND active = #{false_value} AND properties = '{"notify_only_broken_pipelines":true}'; SQL + + [builds_service, pipelines_service].each(&:join) end - def false_value - quote(false) + private + + def spawn(query) + Thread.new do + ActiveRecord::Base.connection_pool.with_connection do + ActiveRecord::Base.connection.execute(query) + end + end end def quote(value) ActiveRecord::Base.connection.quote(value) end + + def false_value + quote(false) + end end From 887aeefba63429b6603c75e385148a2c6be34be1 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 6 Feb 2017 21:51:19 +0800 Subject: [PATCH 176/313] Use IS FALSE for both pg and mysql; Handle connections by ourselves so that even if the setting has 1 connection we could still use more connections. --- ..._remove_inactive_default_email_services.rb | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index dc7750f3244..b107d9204d2 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -7,14 +7,14 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration builds_service = spawn <<-SQL.strip_heredoc DELETE FROM services WHERE type = 'BuildsEmailService' - AND active = #{false_value} + AND active IS FALSE AND properties = '{"notify_only_broken_builds":true}'; SQL pipelines_service = spawn <<-SQL.strip_heredoc DELETE FROM services WHERE type = 'PipelinesEmailService' - AND active = #{false_value} + AND active IS FALSE AND properties = '{"notify_only_broken_pipelines":true}'; SQL @@ -25,17 +25,19 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration def spawn(query) Thread.new do - ActiveRecord::Base.connection_pool.with_connection do - ActiveRecord::Base.connection.execute(query) + with_connection do |connection| + connection.execute(query) end end end - def quote(value) - ActiveRecord::Base.connection.quote(value) - end + def with_connection + pool = ActiveRecord::Base.establish_connection + connection = pool.connection - def false_value - quote(false) + yield(connection) + + ensure + connection.close end end From 521a7cafd4226a03d7f0b5d35a2370559fb345cb Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 7 Feb 2017 00:01:56 +0800 Subject: [PATCH 177/313] Try this way to provide database connection --- ...70206040400_remove_inactive_default_email_services.rb | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index b107d9204d2..d69f68a13d2 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -31,13 +31,10 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration end end - def with_connection + def with_connection(&block) pool = ActiveRecord::Base.establish_connection - connection = pool.connection - - yield(connection) - + pool.with_connection(&block) ensure - connection.close + pool.disconnect! end end From 0c2f4a3c422c522bd32bdcf36425e836ebee8ea6 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 7 Feb 2017 19:29:17 +0800 Subject: [PATCH 178/313] Bump schema to pass `rake db:setup` --- db/schema.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index d421d5c6774..57e3f2f6c54 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170210075922) do +ActiveRecord::Schema.define(version: 20170206040400) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From 7ecee7a4d79718bc46086ee8dec23a00cea39b39 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 7 Feb 2017 22:09:13 +0800 Subject: [PATCH 179/313] Introduce ThreadedConnectionPool for customized pool This way we could reuse this pool for other migrations Feedback: * https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8987#note_22923350 * https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8987#note_22923365 --- ..._remove_inactive_default_email_services.rb | 45 +++++++---------- .../database/threaded_connection_pool.rb | 48 +++++++++++++++++++ 2 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 lib/gitlab/database/threaded_connection_pool.rb diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index d69f68a13d2..52e7f91bb01 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -3,38 +3,27 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration DOWNTIME = false + disable_ddl_transaction! + def up - builds_service = spawn <<-SQL.strip_heredoc - DELETE FROM services - WHERE type = 'BuildsEmailService' - AND active IS FALSE - AND properties = '{"notify_only_broken_builds":true}'; - SQL + Gitlab::Database::ThreadedConnectionPool.with_pool(2) do |pool| + pool.execute_async <<-SQL.strip_heredoc + DELETE FROM services + WHERE type = 'BuildsEmailService' + AND active IS FALSE + AND properties = '{"notify_only_broken_builds":true}'; + SQL - pipelines_service = spawn <<-SQL.strip_heredoc - DELETE FROM services - WHERE type = 'PipelinesEmailService' - AND active IS FALSE - AND properties = '{"notify_only_broken_pipelines":true}'; - SQL - - [builds_service, pipelines_service].each(&:join) - end - - private - - def spawn(query) - Thread.new do - with_connection do |connection| - connection.execute(query) - end + pool.execute_async <<-SQL.strip_heredoc + DELETE FROM services + WHERE type = 'PipelinesEmailService' + AND active IS FALSE + AND properties = '{"notify_only_broken_pipelines":true}'; + SQL end end - def with_connection(&block) - pool = ActiveRecord::Base.establish_connection - pool.with_connection(&block) - ensure - pool.disconnect! + def down + # Nothing can be done to restore the records end end diff --git a/lib/gitlab/database/threaded_connection_pool.rb b/lib/gitlab/database/threaded_connection_pool.rb new file mode 100644 index 00000000000..1316b005741 --- /dev/null +++ b/lib/gitlab/database/threaded_connection_pool.rb @@ -0,0 +1,48 @@ +module Gitlab + module Database + class ThreadedConnectionPool + def self.with_pool(pool_size) + pool = new(pool_size) + + yield(pool) + + ensure + pool.join + pool.close + end + + def initialize(pool_size) + config = ActiveRecord::Base.configurations[Rails.env] + @ar_pool = ActiveRecord::Base.establish_connection( + config.merge(pool: pool_size)) + @workers = [] + @mutex = Mutex.new + end + + def execute_async(sql) + @mutex.synchronize do + @workers << Thread.new do + @ar_pool.with_connection do |connection| + connection.execute(sql) + end + end + end + end + + def join + threads = nil + + @mutex.synchronize do + threads = @workers.dup + @workers.clear + end + + threads.each(&:join) + end + + def close + @ar_pool.disconnect! + end + end + end +end From 1d8db6652f635d3f5326071b9dd00621b87e228b Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 9 Feb 2017 21:11:15 +0800 Subject: [PATCH 180/313] Revert "Bump schema to pass `rake db:setup`" This reverts commit f2ed7cbc9b36b6ad9bcc714b271e98ead756b816. --- db/schema.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/schema.rb b/db/schema.rb index 57e3f2f6c54..de07b3837ad 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170206040400) do +ActiveRecord::Schema.define(version: 20170204181513) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From 8aa1055fe3d24aa606f6a8d3c635f97b788e4e85 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 9 Feb 2017 21:11:31 +0800 Subject: [PATCH 181/313] Use threads directly, introduce pool later: Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8987#note_22938402 --- ..._remove_inactive_default_email_services.rb | 38 +++++++++++++-- .../database/threaded_connection_pool.rb | 48 ------------------- 2 files changed, 33 insertions(+), 53 deletions(-) delete mode 100644 lib/gitlab/database/threaded_connection_pool.rb diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index 52e7f91bb01..f3863881229 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -6,24 +6,52 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration disable_ddl_transaction! def up - Gitlab::Database::ThreadedConnectionPool.with_pool(2) do |pool| - pool.execute_async <<-SQL.strip_heredoc + pool = create_connection_pool + threads = [] + + threads << Thread.new do + pool.with_connection do |connection| + connection.execute <<-SQL.strip_heredoc DELETE FROM services WHERE type = 'BuildsEmailService' AND active IS FALSE AND properties = '{"notify_only_broken_builds":true}'; - SQL + SQL + end + end - pool.execute_async <<-SQL.strip_heredoc + threads << Thread.new do + pool.with_connection do |connection| + connection.execute <<-SQL.strip_heredoc DELETE FROM services WHERE type = 'PipelinesEmailService' AND active IS FALSE AND properties = '{"notify_only_broken_pipelines":true}'; - SQL + SQL + end end + + threads.each(&:join) end def down # Nothing can be done to restore the records end + + private + + def create_connection_pool + # See activerecord-4.2.7.1/lib/active_record/connection_adapters/connection_specification.rb + env = Rails.env + original_config = ActiveRecord::Base.configurations + env_config = original_config[env].merge('pool' => 2) + config = original_config.merge(env => env_config) + + spec = + ActiveRecord:: + ConnectionAdapters:: + ConnectionSpecification::Resolver.new(config).spec(env.to_sym) + + ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec) + end end diff --git a/lib/gitlab/database/threaded_connection_pool.rb b/lib/gitlab/database/threaded_connection_pool.rb deleted file mode 100644 index 1316b005741..00000000000 --- a/lib/gitlab/database/threaded_connection_pool.rb +++ /dev/null @@ -1,48 +0,0 @@ -module Gitlab - module Database - class ThreadedConnectionPool - def self.with_pool(pool_size) - pool = new(pool_size) - - yield(pool) - - ensure - pool.join - pool.close - end - - def initialize(pool_size) - config = ActiveRecord::Base.configurations[Rails.env] - @ar_pool = ActiveRecord::Base.establish_connection( - config.merge(pool: pool_size)) - @workers = [] - @mutex = Mutex.new - end - - def execute_async(sql) - @mutex.synchronize do - @workers << Thread.new do - @ar_pool.with_connection do |connection| - connection.execute(sql) - end - end - end - end - - def join - threads = nil - - @mutex.synchronize do - threads = @workers.dup - @workers.clear - end - - threads.each(&:join) - end - - def close - @ar_pool.disconnect! - end - end - end -end From ae93d08b9cf01b8a12a5f6cacbd9c89e87e54ac4 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Sat, 11 Feb 2017 01:10:15 +0800 Subject: [PATCH 182/313] Disconnect the pool after done --- .../20170206040400_remove_inactive_default_email_services.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index f3863881229..249a9e805f1 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -32,6 +32,7 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration end threads.each(&:join) + pool.disconnect! end def down From ca659822257f21f09d5b22660ba7ae39395d79e6 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 14 Feb 2017 20:17:17 +0800 Subject: [PATCH 183/313] Use Gitlab::Database.with_connection_pool from !9192 --- ..._remove_inactive_default_email_services.rb | 61 +++++++------------ db/schema.rb | 2 +- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb index 249a9e805f1..a8e63e8bc7d 100644 --- a/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb +++ b/db/post_migrate/20170206040400_remove_inactive_default_email_services.rb @@ -6,53 +6,36 @@ class RemoveInactiveDefaultEmailServices < ActiveRecord::Migration disable_ddl_transaction! def up - pool = create_connection_pool - threads = [] + Gitlab::Database.with_connection_pool(2) do |pool| + threads = [] - threads << Thread.new do - pool.with_connection do |connection| - connection.execute <<-SQL.strip_heredoc - DELETE FROM services - WHERE type = 'BuildsEmailService' - AND active IS FALSE - AND properties = '{"notify_only_broken_builds":true}'; - SQL + threads << Thread.new do + pool.with_connection do |connection| + connection.execute <<-SQL.strip_heredoc + DELETE FROM services + WHERE type = 'BuildsEmailService' + AND active IS FALSE + AND properties = '{"notify_only_broken_builds":true}'; + SQL + end end - end - threads << Thread.new do - pool.with_connection do |connection| - connection.execute <<-SQL.strip_heredoc - DELETE FROM services - WHERE type = 'PipelinesEmailService' - AND active IS FALSE - AND properties = '{"notify_only_broken_pipelines":true}'; - SQL + threads << Thread.new do + pool.with_connection do |connection| + connection.execute <<-SQL.strip_heredoc + DELETE FROM services + WHERE type = 'PipelinesEmailService' + AND active IS FALSE + AND properties = '{"notify_only_broken_pipelines":true}'; + SQL + end end - end - threads.each(&:join) - pool.disconnect! + threads.each(&:join) + end end def down # Nothing can be done to restore the records end - - private - - def create_connection_pool - # See activerecord-4.2.7.1/lib/active_record/connection_adapters/connection_specification.rb - env = Rails.env - original_config = ActiveRecord::Base.configurations - env_config = original_config[env].merge('pool' => 2) - config = original_config.merge(env => env_config) - - spec = - ActiveRecord:: - ConnectionAdapters:: - ConnectionSpecification::Resolver.new(config).spec(env.to_sym) - - ActiveRecord::ConnectionAdapters::ConnectionPool.new(spec) - end end diff --git a/db/schema.rb b/db/schema.rb index de07b3837ad..d421d5c6774 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170204181513) do +ActiveRecord::Schema.define(version: 20170210075922) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From c48539463ff2250058fbfa9d1811977f01313b7c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 14 Feb 2017 15:34:36 +0200 Subject: [PATCH 184/313] Expose Namespace#full_path in namespaces API Signed-off-by: Dmitriy Zaporozhets --- app/assets/javascripts/namespace_select.js | 4 ++-- app/views/admin/projects/index.html.haml | 2 +- doc/api/namespaces.md | 9 ++++++++- lib/api/entities.rb | 2 +- spec/requests/api/namespaces_spec.rb | 6 ++++-- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/namespace_select.js b/app/assets/javascripts/namespace_select.js index 514556ade0b..2ae5617206e 100644 --- a/app/assets/javascripts/namespace_select.js +++ b/app/assets/javascripts/namespace_select.js @@ -29,7 +29,7 @@ if (selected.id == null) { return selected.text; } else { - return selected.kind + ": " + selected.path; + return selected.kind + ": " + selected.full_path; } }, data: function(term, dataCallback) { @@ -50,7 +50,7 @@ if (namespace.id == null) { return namespace.text; } else { - return namespace.kind + ": " + namespace.path; + return namespace.kind + ": " + namespace.full_path; } }, renderRow: this.renderRow, diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index cf8d438670b..cdef63daca9 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -30,7 +30,7 @@ - toggle_text = 'Namespace' - if params[:namespace_id].present? - namespace = Namespace.find(params[:namespace_id]) - - toggle_text = "#{namespace.kind}: #{namespace.path}" + - toggle_text = "#{namespace.kind}: #{namespace.full_path}" = dropdown_toggle(toggle_text, { toggle: 'dropdown' }, { toggle_class: 'js-namespace-select large' }) .dropdown-menu.dropdown-select.dropdown-menu-align-right = dropdown_title('Namespaces') diff --git a/doc/api/namespaces.md b/doc/api/namespaces.md index 88cd407d792..1d97b5de688 100644 --- a/doc/api/namespaces.md +++ b/doc/api/namespaces.md @@ -35,6 +35,12 @@ Example response: "id": 2, "path": "group1", "kind": "group" + }, + { + "id": 3, + "path": "bar", + "kind": "group", + "full_path": "foo/bar", } ] ``` @@ -64,7 +70,8 @@ Example response: { "id": 4, "path": "twitter", - "kind": "group" + "kind": "group", + "full_path": "twitter", } ] ``` diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 2a071e649fa..2fd88380d6b 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -414,7 +414,7 @@ module API end class Namespace < Grape::Entity - expose :id, :name, :path, :kind + expose :id, :name, :path, :kind, :full_path end class MemberAccess < Grape::Entity diff --git a/spec/requests/api/namespaces_spec.rb b/spec/requests/api/namespaces_spec.rb index c1edf384d5c..a945d56f529 100644 --- a/spec/requests/api/namespaces_spec.rb +++ b/spec/requests/api/namespaces_spec.rb @@ -5,7 +5,7 @@ describe API::Namespaces, api: true do let(:admin) { create(:admin) } let(:user) { create(:user) } let!(:group1) { create(:group) } - let!(:group2) { create(:group) } + let!(:group2) { create(:group, :nested) } describe "GET /namespaces" do context "when unauthenticated" do @@ -25,11 +25,13 @@ describe API::Namespaces, api: true do end it "admin: returns an array of matched namespaces" do - get api("/namespaces?search=#{group1.name}", admin) + get api("/namespaces?search=#{group2.name}", admin) expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.length).to eq(1) + expect(json_response.last['path']).to eq(group2.path) + expect(json_response.last['full_path']).to eq(group2.full_path) end end From 6b64a2ca3d1cad7e2cffde4ab24970c709f6da3a Mon Sep 17 00:00:00 2001 From: Dongqing Hu Date: Tue, 14 Feb 2017 21:43:12 +0800 Subject: [PATCH 185/313] Don't ignore the parameter of MergeRequestsHelper#mr_change_branches_path --- app/helpers/merge_requests_helper.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index b5f8c23a667..7d8505d704e 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -75,10 +75,10 @@ module MergeRequestsHelper new_namespace_project_merge_request_path( @project.namespace, @project, merge_request: { - source_project_id: @merge_request.source_project_id, - target_project_id: @merge_request.target_project_id, - source_branch: @merge_request.source_branch, - target_branch: @merge_request.target_branch, + source_project_id: merge_request.source_project_id, + target_project_id: merge_request.target_project_id, + source_branch: merge_request.source_branch, + target_branch: merge_request.target_branch, }, change_branches: true ) From 7460159ec91fc7b1ec840dc0a10aa21b3dbbf070 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 14 Feb 2017 14:56:28 +0100 Subject: [PATCH 186/313] Reuse pipeline methods to preserve Law of Demeter --- app/views/projects/pipelines/_info.html.haml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/projects/pipelines/_info.html.haml b/app/views/projects/pipelines/_info.html.haml index a6cd2d83bd5..e0c972aa2fb 100644 --- a/app/views/projects/pipelines/_info.html.haml +++ b/app/views/projects/pipelines/_info.html.haml @@ -7,9 +7,9 @@ = commit_author_link(@commit) .header-action-buttons - if can?(current_user, :update_pipeline, @pipeline.project) - - if @pipeline.builds.latest.failed.any?(&:retryable?) + - if @pipeline.retryable? = link_to "Retry failed", retry_namespace_project_pipeline_path(@pipeline.project.namespace, @pipeline.project, @pipeline.id), class: 'btn btn-inverted-secondary', method: :post - - if @pipeline.builds.running_or_pending.any? + - if @pipeline.cancelable? = link_to "Cancel running", cancel_namespace_project_pipeline_path(@pipeline.project.namespace, @pipeline.project, @pipeline.id), data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post - if @commit From 84b42aebbcfb71593a12c678723ac8260af2b52e Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Tue, 14 Feb 2017 15:03:20 +0100 Subject: [PATCH 187/313] Fix project link on issue creation --- lib/gitlab/chat_commands/presenters/issue_new.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/chat_commands/presenters/issue_new.rb b/lib/gitlab/chat_commands/presenters/issue_new.rb index 0d31660039a..3674ba25641 100644 --- a/lib/gitlab/chat_commands/presenters/issue_new.rb +++ b/lib/gitlab/chat_commands/presenters/issue_new.rb @@ -10,7 +10,7 @@ module Gitlab private - def new_issue + def new_issue { attachments: [ { @@ -38,7 +38,7 @@ module Gitlab end def project_link - "[#{project.name_with_namespace}](#{projects_url(project)})" + "[#{project.name_with_namespace}](#{project.web_url})" end def author_profile_link From 0e21f5426782cd780c703346d27f0b1edd1dccd8 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 14 Feb 2017 15:03:54 +0100 Subject: [PATCH 188/313] Add Changelog entry for pipeline buttons fix --- .../fix-gb-pipeline-retry-cancel-buttons-consistency.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/fix-gb-pipeline-retry-cancel-buttons-consistency.yml diff --git a/changelogs/unreleased/fix-gb-pipeline-retry-cancel-buttons-consistency.yml b/changelogs/unreleased/fix-gb-pipeline-retry-cancel-buttons-consistency.yml new file mode 100644 index 00000000000..d747e0e63a3 --- /dev/null +++ b/changelogs/unreleased/fix-gb-pipeline-retry-cancel-buttons-consistency.yml @@ -0,0 +1,4 @@ +--- +title: Fix pipeline retry and cancel buttons on pipeline details page +merge_request: 9225 +author: From 178b6014f856dbca1653961a1f8341d7d1d38d2f Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Tue, 14 Feb 2017 15:15:41 +0100 Subject: [PATCH 189/313] Remove deprecated CI service --- app/models/project_services/gitlab_ci_service.rb | 8 -------- app/models/service.rb | 2 +- .../zj-remove-deprecated-ci-service.yml | 4 ++++ ...4111112_delete_deprecated_gitlab_ci_service.rb | 15 +++++++++++++++ db/schema.rb | 2 +- 5 files changed, 21 insertions(+), 10 deletions(-) delete mode 100644 app/models/project_services/gitlab_ci_service.rb create mode 100644 changelogs/unreleased/zj-remove-deprecated-ci-service.yml create mode 100644 db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb deleted file mode 100644 index bbc312f5215..00000000000 --- a/app/models/project_services/gitlab_ci_service.rb +++ /dev/null @@ -1,8 +0,0 @@ -# TODO(ayufan): The GitLabCiService is deprecated and the type should be removed when the database entries are removed -class GitlabCiService < CiService - # We override the active accessor to always make GitLabCiService disabled - # Otherwise the GitLabCiService can be picked, but should never be since it's deprecated - def active - false - end -end diff --git a/app/models/service.rb b/app/models/service.rb index 043be222f3a..facaaf9b331 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -27,7 +27,7 @@ class Service < ActiveRecord::Base validates :project_id, presence: true, unless: Proc.new { |service| service.template? } - scope :visible, -> { where.not(type: ['GitlabIssueTrackerService', 'GitlabCiService']) } + scope :visible, -> { where.not(type: 'GitlabIssueTrackerService') } scope :issue_trackers, -> { where(category: 'issue_tracker') } scope :external_wikis, -> { where(type: 'ExternalWikiService').active } scope :active, -> { where(active: true) } diff --git a/changelogs/unreleased/zj-remove-deprecated-ci-service.yml b/changelogs/unreleased/zj-remove-deprecated-ci-service.yml new file mode 100644 index 00000000000..044f4ae627d --- /dev/null +++ b/changelogs/unreleased/zj-remove-deprecated-ci-service.yml @@ -0,0 +1,4 @@ +--- +title: Remove deprecated GitlabCiService +merge_request: +author: diff --git a/db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb b/db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb new file mode 100644 index 00000000000..09a827d22b0 --- /dev/null +++ b/db/post_migrate/20170214111112_delete_deprecated_gitlab_ci_service.rb @@ -0,0 +1,15 @@ +class DeleteDeprecatedGitlabCiService < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + def up + disable_statement_timeout + + execute("DELETE FROM services WHERE type = 'GitlabCiService';") + end + + def down + # noop + end +end diff --git a/db/schema.rb b/db/schema.rb index d421d5c6774..4db9849e9c4 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170210075922) do +ActiveRecord::Schema.define(version: 20170214111112) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From 8f7550859179acd397ed61c7b298bad42b6a8551 Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Fri, 10 Feb 2017 17:44:35 -0200 Subject: [PATCH 190/313] Fix timezone on issue boards due date --- app/assets/javascripts/boards/filters/due_date_filters.js.es6 | 2 +- changelogs/unreleased/issue_23317.yml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/issue_23317.yml diff --git a/app/assets/javascripts/boards/filters/due_date_filters.js.es6 b/app/assets/javascripts/boards/filters/due_date_filters.js.es6 index ac2966cef5d..03425bb145b 100644 --- a/app/assets/javascripts/boards/filters/due_date_filters.js.es6 +++ b/app/assets/javascripts/boards/filters/due_date_filters.js.es6 @@ -3,5 +3,5 @@ Vue.filter('due-date', (value) => { const date = new Date(value); - return dateFormat(date, 'mmm d, yyyy'); + return dateFormat(date, 'mmm d, yyyy', true); }); diff --git a/changelogs/unreleased/issue_23317.yml b/changelogs/unreleased/issue_23317.yml new file mode 100644 index 00000000000..788ae159f5e --- /dev/null +++ b/changelogs/unreleased/issue_23317.yml @@ -0,0 +1,4 @@ +--- +title: Fix timezone on issue boards due date +merge_request: +author: From b65cd9df58e5eeb60f8b946651ac47e571f6804e Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Tue, 14 Feb 2017 16:07:46 +0100 Subject: [PATCH 191/313] Add MySQL info in install requirements [ci skip] --- doc/install/database_mysql.md | 79 ++++++++++++++++++----------------- doc/install/requirements.md | 15 +++++-- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/doc/install/database_mysql.md b/doc/install/database_mysql.md index 65bfb0f7d6e..da2dac23c6a 100644 --- a/doc/install/database_mysql.md +++ b/doc/install/database_mysql.md @@ -1,64 +1,67 @@ # Database MySQL -## Note - -We do not recommend using MySQL due to various issues. For example, case [(in)sensitivity](https://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html) and [problems](https://bugs.mysql.com/bug.php?id=65830) that [suggested](https://bugs.mysql.com/bug.php?id=50909) [fixes](https://bugs.mysql.com/bug.php?id=65830) [have](https://bugs.mysql.com/bug.php?id=63164). +>**Note:** +We do not recommend using MySQL due to various issues. For example, case +[(in)sensitivity](https://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html) +and [problems](https://bugs.mysql.com/bug.php?id=65830) that +[suggested](https://bugs.mysql.com/bug.php?id=50909) +[fixes](https://bugs.mysql.com/bug.php?id=65830) [have](https://bugs.mysql.com/bug.php?id=63164). ## Initial database setup - # Install the database packages - sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev +``` +# Install the database packages +sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev - # Ensure you have MySQL version 5.5.14 or later - mysql --version +# Ensure you have MySQL version 5.5.14 or later +mysql --version - # Pick a MySQL root password (can be anything), type it and press enter - # Retype the MySQL root password and press enter +# Pick a MySQL root password (can be anything), type it and press enter +# Retype the MySQL root password and press enter - # Secure your installation - sudo mysql_secure_installation +# Secure your installation +sudo mysql_secure_installation - # Login to MySQL - mysql -u root -p +# Login to MySQL +mysql -u root -p - # Type the MySQL root password +# Type the MySQL root password - # Create a user for GitLab - # do not type the 'mysql>', this is part of the prompt - # change $password in the command below to a real password you pick - mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password'; +# Create a user for GitLab +# do not type the 'mysql>', this is part of the prompt +# change $password in the command below to a real password you pick +mysql> CREATE USER 'git'@'localhost' IDENTIFIED BY '$password'; - # Ensure you can use the InnoDB engine which is necessary to support long indexes - # If this fails, check your MySQL config files (e.g. `/etc/mysql/*.cnf`, `/etc/mysql/conf.d/*`) for the setting "innodb = off" - mysql> SET storage_engine=INNODB; +# Ensure you can use the InnoDB engine which is necessary to support long indexes +# If this fails, check your MySQL config files (e.g. `/etc/mysql/*.cnf`, `/etc/mysql/conf.d/*`) for the setting "innodb = off" +mysql> SET storage_engine=INNODB; - # If you have MySQL < 5.7.7 and want to enable utf8mb4 character set support with your GitLab install, you must set the following NOW: - mysql> SET GLOBAL innodb_file_per_table=1, innodb_file_format=Barracuda, innodb_large_prefix=1; +# If you have MySQL < 5.7.7 and want to enable utf8mb4 character set support with your GitLab install, you must set the following NOW: +mysql> SET GLOBAL innodb_file_per_table=1, innodb_file_format=Barracuda, innodb_large_prefix=1; - # Create the GitLab production database - mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_general_ci`; +# Create the GitLab production database +mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_general_ci`; - # Grant the GitLab user necessary permissions on the database - mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE TEMPORARY TABLES, DROP, INDEX, ALTER, LOCK TABLES, REFERENCES ON `gitlabhq_production`.* TO 'git'@'localhost'; +# Grant the GitLab user necessary permissions on the database +mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, CREATE TEMPORARY TABLES, DROP, INDEX, ALTER, LOCK TABLES, REFERENCES ON `gitlabhq_production`.* TO 'git'@'localhost'; - # Quit the database session - mysql> \q +# Quit the database session +mysql> \q - # Try connecting to the new database with the new user - sudo -u git -H mysql -u git -p -D gitlabhq_production +# Try connecting to the new database with the new user +sudo -u git -H mysql -u git -p -D gitlabhq_production - # Type the password you replaced $password with earlier +# Type the password you replaced $password with earlier - # You should now see a 'mysql>' prompt +# You should now see a 'mysql>' prompt - # Quit the database session - mysql> \q - - # You are done installing the database for now and can go back to the rest of the installation. +# Quit the database session +mysql> \q +``` +You are done installing the database for now and can go back to the rest of the installation. Please proceed to the rest of the installation before running through the utf8mb4 support section. - ### MySQL utf8mb4 support After installation or upgrade, remember to [convert any new tables](#convert) to `utf8mb4`/`utf8mb4_general_ci`. diff --git a/doc/install/requirements.md b/doc/install/requirements.md index e942346e2d7..3f90597ec80 100644 --- a/doc/install/requirements.md +++ b/doc/install/requirements.md @@ -15,11 +15,11 @@ For the installations options please see [the installation page on the GitLab we ### Unsupported Unix distributions -- OS X - Arch Linux - Fedora -- Gentoo - FreeBSD +- Gentoo +- macOS On the above unsupported distributions is still possible to install GitLab yourself. Please see the [installation from source guide](installation.md) and the [installation guides](https://about.gitlab.com/installation/) for more information. @@ -120,7 +120,12 @@ To change the Unicorn workers when you have the Omnibus package please see [the ## Database -If you want to run the database separately expect a size of about 1 MB per user. +We currently support the following databases: + +- PostgreSQL (recommended) +- MySQL/MariaDB + +If you want to run the database separately, expect a size of about 1 MB per user. ### PostgreSQL Requirements @@ -128,7 +133,9 @@ Users using PostgreSQL must ensure the `pg_trgm` extension is loaded into every GitLab database. This extension can be enabled (using a PostgreSQL super user) by running the following query for every database: - CREATE EXTENSION pg_trgm; +``` +CREATE EXTENSION pg_trgm; +``` On some systems you may need to install an additional package (e.g. `postgresql-contrib`) for this extension to become available. From 4e9e29d295fe2f8cd258cde4b65e244eb74a1ae6 Mon Sep 17 00:00:00 2001 From: Toon Claes Date: Wed, 1 Feb 2017 11:23:57 +0100 Subject: [PATCH 192/313] API: Consolidate /projects endpoint It consolidates these endpoints: - /projects - /projects/owned - /projects/visible - /projects/starred - /projects/all Into the /projects endpoint using query parameters. --- .../23061-consolidate-project-lists.yml | 4 + doc/api/groups.md | 2 + doc/api/projects.md | 186 +------------ doc/api/v3_to_v4.md | 2 +- lib/api/groups.rb | 3 + lib/api/helpers.rb | 8 + lib/api/projects.rb | 59 +--- spec/requests/api/groups_spec.rb | 20 ++ spec/requests/api/projects_spec.rb | 262 +++++++----------- 9 files changed, 148 insertions(+), 398 deletions(-) create mode 100644 changelogs/unreleased/23061-consolidate-project-lists.yml diff --git a/changelogs/unreleased/23061-consolidate-project-lists.yml b/changelogs/unreleased/23061-consolidate-project-lists.yml new file mode 100644 index 00000000000..dbb8fed55c0 --- /dev/null +++ b/changelogs/unreleased/23061-consolidate-project-lists.yml @@ -0,0 +1,4 @@ +--- +title: 'API: Consolidate /projects endpoint' +merge_request: 8962 +author: diff --git a/doc/api/groups.md b/doc/api/groups.md index a3a43ca7f1c..4a39dbc5555 100644 --- a/doc/api/groups.md +++ b/doc/api/groups.md @@ -73,6 +73,8 @@ Parameters: | `sort` | string | no | Return projects sorted in `asc` or `desc` order. Default is `desc` | | `search` | string | no | Return list of authorized projects matching the search criteria | | `simple` | boolean | no | Return only the ID, URL, name, and path of each project | +| `owned` | boolean | no | Limit by projects owned by the current user | +| `starred` | boolean | no | Limit by projects starred by the current user | Example response: diff --git a/doc/api/projects.md b/doc/api/projects.md index e579b89d836..fa51158956a 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -36,6 +36,8 @@ Parameters: | `sort` | string | no | Return projects sorted in `asc` or `desc` order. Default is `desc` | | `search` | string | no | Return list of authorized projects matching the search criteria | | `simple` | boolean | no | Return only the ID, URL, name, and path of each project | +| `owned` | boolean | no | Limit by projects owned by the current user | +| `starred` | boolean | no | Limit by projects starred by the current user | ```json [ @@ -152,190 +154,6 @@ Parameters: ] ``` -Get a list of projects which the authenticated user can see. - -``` -GET /projects/visible -``` - -Parameters: - -| Attribute | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `archived` | boolean | no | Limit by archived status | -| `visibility` | string | no | Limit by visibility `public`, `internal`, or `private` | -| `order_by` | string | no | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at` | -| `sort` | string | no | Return projects sorted in `asc` or `desc` order. Default is `desc` | -| `search` | string | no | Return list of authorized projects matching the search criteria | -| `simple` | boolean | no | Return only the ID, URL, name, and path of each project | - -```json -[ - { - "id": 4, - "description": null, - "default_branch": "master", - "public": false, - "visibility_level": 0, - "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git", - "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git", - "web_url": "http://example.com/diaspora/diaspora-client", - "tag_list": [ - "example", - "disapora client" - ], - "owner": { - "id": 3, - "name": "Diaspora", - "created_at": "2013-09-30T13:46:02Z" - }, - "name": "Diaspora Client", - "name_with_namespace": "Diaspora / Diaspora Client", - "path": "diaspora-client", - "path_with_namespace": "diaspora/diaspora-client", - "issues_enabled": true, - "open_issues_count": 1, - "merge_requests_enabled": true, - "builds_enabled": true, - "wiki_enabled": true, - "snippets_enabled": false, - "container_registry_enabled": false, - "created_at": "2013-09-30T13:46:02Z", - "last_activity_at": "2013-09-30T13:46:02Z", - "creator_id": 3, - "namespace": { - "id": 3, - "name": "Diaspora", - "path": "diaspora", - "kind": "group" - }, - "archived": false, - "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png", - "shared_runners_enabled": true, - "forks_count": 0, - "star_count": 0, - "runners_token": "b8547b1dc37721d05889db52fa2f02", - "public_builds": true, - "shared_with_groups": [] - }, - { - "id": 6, - "description": null, - "default_branch": "master", - "public": false, - "visibility_level": 0, - "ssh_url_to_repo": "git@example.com:brightbox/puppet.git", - "http_url_to_repo": "http://example.com/brightbox/puppet.git", - "web_url": "http://example.com/brightbox/puppet", - "tag_list": [ - "example", - "puppet" - ], - "owner": { - "id": 4, - "name": "Brightbox", - "created_at": "2013-09-30T13:46:02Z" - }, - "name": "Puppet", - "name_with_namespace": "Brightbox / Puppet", - "path": "puppet", - "path_with_namespace": "brightbox/puppet", - "issues_enabled": true, - "open_issues_count": 1, - "merge_requests_enabled": true, - "builds_enabled": true, - "wiki_enabled": true, - "snippets_enabled": false, - "container_registry_enabled": false, - "created_at": "2013-09-30T13:46:02Z", - "last_activity_at": "2013-09-30T13:46:02Z", - "creator_id": 3, - "namespace": { - "id": 4, - "name": "Brightbox", - "path": "brightbox", - "kind": "group" - }, - "permissions": { - "project_access": { - "access_level": 10, - "notification_level": 3 - }, - "group_access": { - "access_level": 50, - "notification_level": 3 - } - }, - "archived": false, - "avatar_url": null, - "shared_runners_enabled": true, - "forks_count": 0, - "star_count": 0, - "runners_token": "b8547b1dc37721d05889db52fa2f02", - "public_builds": true, - "shared_with_groups": [] - } -] -``` - -### List owned projects - -Get a list of projects which are owned by the authenticated user. - -``` -GET /projects/owned -``` - -Parameters: - -| Attribute | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `archived` | boolean | no | Limit by archived status | -| `visibility` | string | no | Limit by visibility `public`, `internal`, or `private` | -| `order_by` | string | no | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at` | -| `sort` | string | no | Return projects sorted in `asc` or `desc` order. Default is `desc` | -| `search` | string | no | Return list of authorized projects matching the search criteria | -| `simple` | boolean | no | Return only the ID, URL, name, and path of each project | -| `statistics` | boolean | no | Include project statistics | - -### List starred projects - -Get a list of projects which are starred by the authenticated user. - -``` -GET /projects/starred -``` - -Parameters: - -| Attribute | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `archived` | boolean | no | Limit by archived status | -| `visibility` | string | no | Limit by visibility `public`, `internal`, or `private` | -| `order_by` | string | no | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at` | -| `sort` | string | no | Return projects sorted in `asc` or `desc` order. Default is `desc` | -| `search` | string | no | Return list of authorized projects matching the search criteria | -| `simple` | boolean | no | Return only the ID, URL, name, and path of each project | - -### List ALL projects - -Get a list of all GitLab projects (admin only). - -``` -GET /projects/all -``` - -Parameters: - -| Attribute | Type | Required | Description | -| --------- | ---- | -------- | ----------- | -| `archived` | boolean | no | Limit by archived status | -| `visibility` | string | no | Limit by visibility `public`, `internal`, or `private` | -| `order_by` | string | no | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, or `last_activity_at` fields. Default is `created_at` | -| `sort` | string | no | Return projects sorted in `asc` or `desc` order. Default is `desc` | -| `search` | string | no | Return list of authorized projects matching the search criteria | -| `statistics` | boolean | no | Include project statistics | - ### Get single project Get a specific project, identified by project ID or NAMESPACE/PROJECT_NAME, which is owned by the authenticated user. diff --git a/doc/api/v3_to_v4.md b/doc/api/v3_to_v4.md index 7811025f34e..84ff72bc36c 100644 --- a/doc/api/v3_to_v4.md +++ b/doc/api/v3_to_v4.md @@ -23,4 +23,4 @@ changes are in V4: - `/gitlab_ci_ymls/:key` - `/dockerfiles/:key` - Moved `/projects/fork/:id` to `/projects/:id/fork` - +- Endpoints `/projects/owned`, `/projects/visible`, `/projects/starred` & `/projects/all` are consolidated into `/projects` using query parameters diff --git a/lib/api/groups.rb b/lib/api/groups.rb index 5c132bdd6f9..9f29c4466ab 100644 --- a/lib/api/groups.rb +++ b/lib/api/groups.rb @@ -143,6 +143,9 @@ module API desc: 'Return projects sorted in ascending and descending order' optional :simple, type: Boolean, default: false, desc: 'Return only the ID, URL, name, and path of each project' + optional :owned, type: Boolean, default: false, desc: 'Limit by owned by authenticated user' + optional :starred, type: Boolean, default: false, desc: 'Limit by starred status' + use :pagination end get ":id/projects" do diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index dfab60f7fa5..13896dd91b9 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -256,6 +256,14 @@ module API # project helpers def filter_projects(projects) + if params[:owned] + projects = projects.merge(current_user.owned_projects) + end + + if params[:starred] + projects = projects.merge(current_user.starred_projects) + end + if params[:search].present? projects = projects.search(params[:search]) end diff --git a/lib/api/projects.rb b/lib/api/projects.rb index 2cacb246db8..68c2732ec80 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -50,6 +50,8 @@ module API optional :visibility, type: String, values: %w[public internal private], desc: 'Limit by visibility' optional :search, type: String, desc: 'Return list of authorized projects matching the search criteria' + optional :owned, type: Boolean, default: false, desc: 'Limit by owned by authenticated user' + optional :starred, type: Boolean, default: false, desc: 'Limit by starred status' end params :statistics_params do @@ -82,62 +84,9 @@ module API params do use :collection_params end - get '/visible' do - entity = current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails - present_projects ProjectsFinder.new.execute(current_user), with: entity - end - - desc 'Get a projects list for authenticated user' do - success Entities::BasicProjectDetails - end - params do - use :collection_params - end get do - authenticate! - - present_projects current_user.authorized_projects, - with: Entities::ProjectWithAccess - end - - desc 'Get an owned projects list for authenticated user' do - success Entities::BasicProjectDetails - end - params do - use :collection_params - use :statistics_params - end - get '/owned' do - authenticate! - - present_projects current_user.owned_projects, - with: Entities::ProjectWithAccess, - statistics: params[:statistics] - end - - desc 'Gets starred project for the authenticated user' do - success Entities::BasicProjectDetails - end - params do - use :collection_params - end - get '/starred' do - authenticate! - - present_projects current_user.viewable_starred_projects - end - - desc 'Get all projects for admin user' do - success Entities::BasicProjectDetails - end - params do - use :collection_params - use :statistics_params - end - get '/all' do - authenticated_as_admin! - - present_projects Project.all, with: Entities::ProjectWithAccess, statistics: params[:statistics] + entity = current_user ? Entities::ProjectWithAccess : Entities::BasicProjectDetails + present_projects ProjectsFinder.new.execute(current_user), with: entity, statistics: params[:statistics] end desc 'Create new project' do diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb index f78bde6f53a..ccd7898586c 100644 --- a/spec/requests/api/groups_spec.rb +++ b/spec/requests/api/groups_spec.rb @@ -338,6 +338,26 @@ describe API::Groups, api: true do expect(json_response.length).to eq(1) expect(json_response.first['name']).to eq(project3.name) end + + it 'only returns the projects owned by user' do + project2.group.add_owner(user3) + + get api("/groups/#{project2.group.id}/projects", user3), owned: true + + expect(response).to have_http_status(200) + expect(json_response.length).to eq(1) + expect(json_response.first['name']).to eq(project2.name) + end + + it 'only returns the projects starred by user' do + user1.starred_projects = [project1] + + get api("/groups/#{group1.id}/projects", user1), starred: true + + expect(response).to have_http_status(200) + expect(json_response.length).to eq(1) + expect(json_response.first['name']).to eq(project1.name) + end end context "when authenticated as admin" do diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index 17b5e372bdc..bca7642b6fc 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -41,26 +41,40 @@ describe API::Projects, api: true do end describe 'GET /projects' do - before { project } + shared_examples_for 'projects response' do + it 'returns an array of projects' do + get api('/projects', current_user) + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.map { |p| p['id'] }).to contain_exactly(*projects.map(&:id)) + end + end + + let!(:public_project) { create(:empty_project, :public, name: 'public_project') } + before do + project + project2 + project3 + project4 + end context 'when unauthenticated' do - it 'returns authentication error' do - get api('/projects') - expect(response).to have_http_status(401) + it_behaves_like 'projects response' do + let(:current_user) { nil } + let(:projects) { [public_project] } end end context 'when authenticated as regular user' do - it 'returns an array of projects' do - get api('/projects', user) - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.first['name']).to eq(project.name) - expect(json_response.first['owner']['username']).to eq(user.username) + it_behaves_like 'projects response' do + let(:current_user) { user } + let(:projects) { [public_project, project, project2, project3] } end it 'includes the project labels as the tag_list' do get api('/projects', user) + expect(response.status).to eq 200 expect(json_response).to be_an Array expect(json_response.first.keys).to include('tag_list') @@ -68,21 +82,39 @@ describe API::Projects, api: true do it 'includes open_issues_count' do get api('/projects', user) + expect(response.status).to eq 200 expect(json_response).to be_an Array expect(json_response.first.keys).to include('open_issues_count') end - it 'does not include open_issues_count' do + it 'does not include open_issues_count if issues are disabled' do project.project_feature.update_attribute(:issues_access_level, ProjectFeature::DISABLED) get api('/projects', user) + expect(response.status).to eq 200 expect(json_response).to be_an Array - expect(json_response.first.keys).not_to include('open_issues_count') + expect(json_response.find { |hash| hash['id'] == project.id }.keys).not_to include('open_issues_count') end - context 'GET /projects?simple=true' do + it "does not include statistics by default" do + get api('/projects', user) + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.first).not_to include('statistics') + end + + it "includes statistics if requested" do + get api('/projects', user), statistics: true + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.first).to include 'statistics' + end + + context 'and with simple=true' do it 'returns a simplified version of all the projects' do expected_keys = ["id", "http_url_to_repo", "web_url", "name", "name_with_namespace", "path", "path_with_namespace"] @@ -97,6 +129,7 @@ describe API::Projects, api: true do context 'and using search' do it 'returns searched project' do get api('/projects', user), { search: project.name } + expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.length).to eq(1) @@ -106,196 +139,109 @@ describe API::Projects, api: true do context 'and using the visibility filter' do it 'filters based on private visibility param' do get api('/projects', user), { visibility: 'private' } + expect(response).to have_http_status(200) expect(json_response).to be_an Array - expect(json_response.length).to eq(user.namespace.projects.where(visibility_level: Gitlab::VisibilityLevel::PRIVATE).count) + expect(json_response.map { |p| p['id'] }).to contain_exactly(project.id, project2.id, project3.id) end it 'filters based on internal visibility param' do + project2.update_attribute(:visibility_level, Gitlab::VisibilityLevel::INTERNAL) + get api('/projects', user), { visibility: 'internal' } + expect(response).to have_http_status(200) expect(json_response).to be_an Array - expect(json_response.length).to eq(user.namespace.projects.where(visibility_level: Gitlab::VisibilityLevel::INTERNAL).count) + expect(json_response.map { |p| p['id'] }).to contain_exactly(project2.id) end it 'filters based on public visibility param' do get api('/projects', user), { visibility: 'public' } + expect(response).to have_http_status(200) expect(json_response).to be_an Array - expect(json_response.length).to eq(user.namespace.projects.where(visibility_level: Gitlab::VisibilityLevel::PUBLIC).count) + expect(json_response.map { |p| p['id'] }).to contain_exactly(public_project.id) end end context 'and using sorting' do - before do - project2 - project3 - end - it 'returns the correct order when sorted by id' do get api('/projects', user), { order_by: 'id', sort: 'desc' } + expect(response).to have_http_status(200) expect(json_response).to be_an Array expect(json_response.first['id']).to eq(project3.id) end end - end - end - describe 'GET /projects/all' do - before { project } + context 'and with owned=true' do + it 'returns an array of projects the user owns' do + get api('/projects', user4), owned: true - context 'when unauthenticated' do - it 'returns authentication error' do - get api('/projects/all') - expect(response).to have_http_status(401) - end - end - - context 'when authenticated as regular user' do - it 'returns authentication error' do - get api('/projects/all', user) - expect(response).to have_http_status(403) - end - end - - context 'when authenticated as admin' do - it 'returns an array of all projects' do - get api('/projects/all', admin) - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - - expect(json_response).to satisfy do |response| - response.one? do |entry| - entry.has_key?('permissions') && - entry['name'] == project.name && - entry['owner']['username'] == user.username - end + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.first['name']).to eq(project4.name) + expect(json_response.first['owner']['username']).to eq(user4.username) end end - it "does not include statistics by default" do - get api('/projects/all', admin) + context 'and with starred=true' do + let(:public_project) { create(:empty_project, :public) } - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.first).not_to include('statistics') + before do + project_member2 + user3.update_attributes(starred_projects: [project, project2, project3, public_project]) + end + + it 'returns the starred projects viewable by the user' do + get api('/projects', user3), starred: true + + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.map { |project| project['id'] }).to contain_exactly(project.id, public_project.id) + end end - it "includes statistics if requested" do - get api('/projects/all', admin), statistics: true + context 'and with all query parameters' do + # | | project5 | project6 | project7 | project8 | project9 | + # |---------+----------+----------+----------+----------+----------| + # | search | x | | x | x | x | + # | starred | x | x | | x | x | + # | public | x | x | x | | x | + # | owned | x | x | x | x | | + let!(:project5) { create(:empty_project, :public, path: 'gitlab5', namespace: user.namespace) } + let!(:project6) { create(:empty_project, :public, path: 'project6', namespace: user.namespace) } + let!(:project7) { create(:empty_project, :public, path: 'gitlab7', namespace: user.namespace) } + let!(:project8) { create(:empty_project, path: 'gitlab8', namespace: user.namespace) } + let!(:project9) { create(:empty_project, :public, path: 'gitlab9') } - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.first).to include 'statistics' - end - end - end + before do + user.update_attributes(starred_projects: [project5, project6, project8, project9]) + end - describe 'GET /projects/owned' do - before do - project3 - project4 - end + it 'returns only projects that satify all query parameters' do + get api('/projects', user), { visibility: 'public', owned: true, starred: true, search: 'gitlab' } - context 'when unauthenticated' do - it 'returns authentication error' do - get api('/projects/owned') - expect(response).to have_http_status(401) - end - end - - context 'when authenticated as project owner' do - it 'returns an array of projects the user owns' do - get api('/projects/owned', user4) - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.first['name']).to eq(project4.name) - expect(json_response.first['owner']['username']).to eq(user4.username) - end - - it "does not include statistics by default" do - get api('/projects/owned', user4) - - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.first).not_to include('statistics') - end - - it "includes statistics if requested" do - attributes = { - commit_count: 23, - storage_size: 702, - repository_size: 123, - lfs_objects_size: 234, - build_artifacts_size: 345, - } - - project4.statistics.update!(attributes) - - get api('/projects/owned', user4), statistics: true - - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.first['statistics']).to eq attributes.stringify_keys - end - end - end - - describe 'GET /projects/visible' do - shared_examples_for 'visible projects response' do - it 'returns the visible projects' do - get api('/projects/visible', current_user) - - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.map { |p| p['id'] }).to contain_exactly(*projects.map(&:id)) - end - end - - let!(:public_project) { create(:empty_project, :public) } - before do - project - project2 - project3 - project4 - end - - context 'when unauthenticated' do - it_behaves_like 'visible projects response' do - let(:current_user) { nil } - let(:projects) { [public_project] } - end - end - - context 'when authenticated' do - it_behaves_like 'visible projects response' do - let(:current_user) { user } - let(:projects) { [public_project, project, project2, project3] } + expect(response).to have_http_status(200) + expect(json_response).to be_an Array + expect(json_response.size).to eq(1) + expect(json_response.first['id']).to eq(project5.id) + end end end context 'when authenticated as a different user' do - it_behaves_like 'visible projects response' do + it_behaves_like 'projects response' do let(:current_user) { user2 } let(:projects) { [public_project] } end end - end - describe 'GET /projects/starred' do - let(:public_project) { create(:empty_project, :public) } - - before do - project_member2 - user3.update_attributes(starred_projects: [project, project2, project3, public_project]) - end - - it 'returns the starred projects viewable by the user' do - get api('/projects/starred', user3) - expect(response).to have_http_status(200) - expect(json_response).to be_an Array - expect(json_response.map { |project| project['id'] }).to contain_exactly(project.id, public_project.id) + context 'when authenticated as admin' do + it_behaves_like 'projects response' do + let(:current_user) { admin } + let(:projects) { Project.all } + end end end From 613856face7f2ea58c229682a3acbba3e64be01b Mon Sep 17 00:00:00 2001 From: dixpac Date: Tue, 14 Feb 2017 16:33:50 +0100 Subject: [PATCH 193/313] Move tag services to `Tags` namespace CreateTagService and DeleteTagService where in root namespace, by following service code organization I moved them in Tags::CreateService and Tags::DestroyService --- app/controllers/projects/tags_controller.rb | 4 +- app/services/create_tag_service.rb | 30 ------------- app/services/delete_tag_service.rb | 42 ------------------ app/services/tags/create_service.rb | 32 ++++++++++++++ app/services/tags/destroy_service.rb | 44 +++++++++++++++++++ .../move_tags_service_to_namespace.yml | 4 ++ lib/api/tags.rb | 4 +- .../create_service_spec.rb} | 2 +- .../destroy_service_spec.rb} | 2 +- 9 files changed, 86 insertions(+), 78 deletions(-) delete mode 100644 app/services/create_tag_service.rb delete mode 100644 app/services/delete_tag_service.rb create mode 100644 app/services/tags/create_service.rb create mode 100644 app/services/tags/destroy_service.rb create mode 100644 changelogs/unreleased/move_tags_service_to_namespace.yml rename spec/services/{create_tag_service_spec.rb => tags/create_service_spec.rb} (97%) rename spec/services/{delete_tag_service_spec.rb => tags/destroy_service_spec.rb} (88%) diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb index e2d9d5ed460..33379659d73 100644 --- a/app/controllers/projects/tags_controller.rb +++ b/app/controllers/projects/tags_controller.rb @@ -27,7 +27,7 @@ class Projects::TagsController < Projects::ApplicationController end def create - result = CreateTagService.new(@project, current_user). + result = Tags::CreateService.new(@project, current_user). execute(params[:tag_name], params[:ref], params[:message], params[:release_description]) if result[:status] == :success @@ -41,7 +41,7 @@ class Projects::TagsController < Projects::ApplicationController end def destroy - DeleteTagService.new(project, current_user).execute(params[:id]) + Tags::DestroyService.new(project, current_user).execute(params[:id]) respond_to do |format| format.html do diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb deleted file mode 100644 index 6c75d1f04ff..00000000000 --- a/app/services/create_tag_service.rb +++ /dev/null @@ -1,30 +0,0 @@ -class CreateTagService < BaseService - def execute(tag_name, target, message, release_description = nil) - valid_tag = Gitlab::GitRefValidator.validate(tag_name) - return error('Tag name invalid') unless valid_tag - - repository = project.repository - message&.strip! - - new_tag = nil - - begin - new_tag = repository.add_tag(current_user, tag_name, target, message) - rescue Rugged::TagError - return error("Tag #{tag_name} already exists") - rescue GitHooksService::PreReceiveError => ex - return error(ex.message) - end - - if new_tag - if release_description - CreateReleaseService.new(@project, @current_user). - execute(tag_name, release_description) - end - - success.merge(tag: new_tag) - else - error("Target #{target} is invalid") - end - end -end diff --git a/app/services/delete_tag_service.rb b/app/services/delete_tag_service.rb deleted file mode 100644 index eb726cb04b1..00000000000 --- a/app/services/delete_tag_service.rb +++ /dev/null @@ -1,42 +0,0 @@ -class DeleteTagService < BaseService - def execute(tag_name) - repository = project.repository - tag = repository.find_tag(tag_name) - - unless tag - return error('No such tag', 404) - end - - if repository.rm_tag(current_user, tag_name) - release = project.releases.find_by(tag: tag_name) - release&.destroy - - push_data = build_push_data(tag) - EventCreateService.new.push(project, current_user, push_data) - project.execute_hooks(push_data.dup, :tag_push_hooks) - project.execute_services(push_data.dup, :tag_push_hooks) - - success('Tag was removed') - else - error('Failed to remove tag') - end - end - - def error(message, return_code = 400) - super(message).merge(return_code: return_code) - end - - def success(message) - super().merge(message: message) - end - - def build_push_data(tag) - Gitlab::DataBuilder::Push.build( - project, - current_user, - tag.dereferenced_target.sha, - Gitlab::Git::BLANK_SHA, - "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", - []) - end -end diff --git a/app/services/tags/create_service.rb b/app/services/tags/create_service.rb new file mode 100644 index 00000000000..1756da9e519 --- /dev/null +++ b/app/services/tags/create_service.rb @@ -0,0 +1,32 @@ +module Tags + class CreateService < BaseService + def execute(tag_name, target, message, release_description = nil) + valid_tag = Gitlab::GitRefValidator.validate(tag_name) + return error('Tag name invalid') unless valid_tag + + repository = project.repository + message&.strip! + + new_tag = nil + + begin + new_tag = repository.add_tag(current_user, tag_name, target, message) + rescue Rugged::TagError + return error("Tag #{tag_name} already exists") + rescue GitHooksService::PreReceiveError => ex + return error(ex.message) + end + + if new_tag + if release_description + CreateReleaseService.new(@project, @current_user). + execute(tag_name, release_description) + end + + success.merge(tag: new_tag) + else + error("Target #{target} is invalid") + end + end + end +end diff --git a/app/services/tags/destroy_service.rb b/app/services/tags/destroy_service.rb new file mode 100644 index 00000000000..910b4f5e361 --- /dev/null +++ b/app/services/tags/destroy_service.rb @@ -0,0 +1,44 @@ +module Tags + class DestroyService < BaseService + def execute(tag_name) + repository = project.repository + tag = repository.find_tag(tag_name) + + unless tag + return error('No such tag', 404) + end + + if repository.rm_tag(current_user, tag_name) + release = project.releases.find_by(tag: tag_name) + release&.destroy + + push_data = build_push_data(tag) + EventCreateService.new.push(project, current_user, push_data) + project.execute_hooks(push_data.dup, :tag_push_hooks) + project.execute_services(push_data.dup, :tag_push_hooks) + + success('Tag was removed') + else + error('Failed to remove tag') + end + end + + def error(message, return_code = 400) + super(message).merge(return_code: return_code) + end + + def success(message) + super().merge(message: message) + end + + def build_push_data(tag) + Gitlab::DataBuilder::Push.build( + project, + current_user, + tag.dereferenced_target.sha, + Gitlab::Git::BLANK_SHA, + "#{Gitlab::Git::TAG_REF_PREFIX}#{tag.name}", + []) + end + end +end diff --git a/changelogs/unreleased/move_tags_service_to_namespace.yml b/changelogs/unreleased/move_tags_service_to_namespace.yml new file mode 100644 index 00000000000..ba76f291162 --- /dev/null +++ b/changelogs/unreleased/move_tags_service_to_namespace.yml @@ -0,0 +1,4 @@ +--- +title: Move tag services to Tags namespace +merge_request: +author: dixpac diff --git a/lib/api/tags.rb b/lib/api/tags.rb index 5b345db3a41..b6fd8f569a9 100644 --- a/lib/api/tags.rb +++ b/lib/api/tags.rb @@ -40,7 +40,7 @@ module API post ':id/repository/tags' do authorize_push_project - result = CreateTagService.new(user_project, current_user). + result = ::Tags::CreateService.new(user_project, current_user). execute(params[:tag_name], params[:ref], params[:message], params[:release_description]) if result[:status] == :success @@ -59,7 +59,7 @@ module API delete ":id/repository/tags/:tag_name", requirements: { tag_name: /.+/ } do authorize_push_project - result = DeleteTagService.new(user_project, current_user). + result = ::Tags::DestroyService.new(user_project, current_user). execute(params[:tag_name]) if result[:status] == :success diff --git a/spec/services/create_tag_service_spec.rb b/spec/services/tags/create_service_spec.rb similarity index 97% rename from spec/services/create_tag_service_spec.rb rename to spec/services/tags/create_service_spec.rb index 7dc43c50b0d..5478b8c9ec0 100644 --- a/spec/services/create_tag_service_spec.rb +++ b/spec/services/tags/create_service_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe CreateTagService, services: true do +describe Tags::CreateService, services: true do let(:project) { create(:project) } let(:repository) { project.repository } let(:user) { create(:user) } diff --git a/spec/services/delete_tag_service_spec.rb b/spec/services/tags/destroy_service_spec.rb similarity index 88% rename from spec/services/delete_tag_service_spec.rb rename to spec/services/tags/destroy_service_spec.rb index 477551f5036..a388c93379a 100644 --- a/spec/services/delete_tag_service_spec.rb +++ b/spec/services/tags/destroy_service_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -describe DeleteTagService, services: true do +describe Tags::DestroyService, services: true do let(:project) { create(:project) } let(:repository) { project.repository } let(:user) { create(:user) } From 6676b4f0dd05ffb6071a3329cca4459e7cddcdc3 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Tue, 14 Feb 2017 16:03:24 +0200 Subject: [PATCH 194/313] Use Namespace#full_path instead of Namespace#path Signed-off-by: Dmitriy Zaporozhets --- app/helpers/namespaces_helper.rb | 2 +- app/helpers/submodule_helper.rb | 2 +- app/models/merge_request.rb | 4 +- app/models/project.rb | 28 +++++++------ .../project_services/drone_ci_service.rb | 6 +-- app/services/projects/transfer_service.rb | 6 +-- app/views/admin/dashboard/index.html.haml | 2 +- app/views/import/base/unauthorized.js.haml | 2 +- app/views/projects/edit.html.haml | 2 +- .../projects/group_links/_index.html.haml | 2 +- .../projects/pages_domains/show.html.haml | 2 +- app/views/shared/members/_group.html.haml | 2 +- doc/api/projects.md | 27 ++++++++----- lib/backup/repository.rb | 2 +- lib/gitlab/google_code_import/importer.rb | 2 +- lib/gitlab/import_export.rb | 2 +- lib/gitlab/import_export/importer.rb | 2 +- lib/gitlab/shell.rb | 2 +- .../import_export/import_export_spec.rb | 5 ++- spec/models/project_spec.rb | 39 ++++++++++++++----- spec/requests/api/projects_spec.rb | 1 + spec/requests/api/v3/projects_spec.rb | 1 + 22 files changed, 90 insertions(+), 53 deletions(-) diff --git a/app/helpers/namespaces_helper.rb b/app/helpers/namespaces_helper.rb index e0b8dc1393b..0676767d910 100644 --- a/app/helpers/namespaces_helper.rb +++ b/app/helpers/namespaces_helper.rb @@ -10,7 +10,7 @@ module NamespacesHelper data_attr_users = { 'data-options-parent' => 'users' } group_opts = [ - "Groups", groups.sort_by(&:human_name).map { |g| [display_path ? g.path : g.human_name, g.id, data_attr_group] } + "Groups", groups.sort_by(&:human_name).map { |g| [display_path ? g.full_path : g.human_name, g.id, data_attr_group] } ] users_opts = [ diff --git a/app/helpers/submodule_helper.rb b/app/helpers/submodule_helper.rb index b3f50ceebe4..9a748aaaf33 100644 --- a/app/helpers/submodule_helper.rb +++ b/app/helpers/submodule_helper.rb @@ -63,7 +63,7 @@ module SubmoduleHelper namespace = components.pop.gsub(/^\.\.$/, '') if namespace.empty? - namespace = @project.namespace.path + namespace = @project.namespace.full_path end [ diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 38646eba3ac..204d2b153ad 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -598,7 +598,7 @@ class MergeRequest < ActiveRecord::Base def source_project_namespace if source_project && source_project.namespace - source_project.namespace.path + source_project.namespace.full_path else "(removed)" end @@ -606,7 +606,7 @@ class MergeRequest < ActiveRecord::Base def target_project_namespace if target_project && target_project.namespace - target_project.namespace.path + target_project.namespace.full_path else "(removed)" end diff --git a/app/models/project.rb b/app/models/project.rb index aa408b4556e..ed43fc2e575 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -454,7 +454,7 @@ class Project < ActiveRecord::Base if forked? job_id = RepositoryForkWorker.perform_async(id, forked_from_project.repository_storage_path, forked_from_project.path_with_namespace, - self.namespace.path) + self.namespace.full_path) else job_id = RepositoryImportWorker.perform_async(self.id) end @@ -942,8 +942,8 @@ class Project < ActiveRecord::Base Gitlab::AppLogger.info "Project was renamed: #{old_path_with_namespace} -> #{new_path_with_namespace}" - Gitlab::UploadsTransfer.new.rename_project(path_was, path, namespace.path) - Gitlab::PagesTransfer.new.rename_project(path_was, path, namespace.path) + Gitlab::UploadsTransfer.new.rename_project(path_was, path, namespace.full_path) + Gitlab::PagesTransfer.new.rename_project(path_was, path, namespace.full_path) end # Expires various caches before a project is renamed. @@ -1150,19 +1150,25 @@ class Project < ActiveRecord::Base end def pages_url + subdomain, _, url_path = full_path.partition('/') + # The hostname always needs to be in downcased # All web servers convert hostname to lowercase - host = "#{namespace.path}.#{Settings.pages.host}".downcase + host = "#{subdomain}.#{Settings.pages.host}".downcase # The host in URL always needs to be downcased url = Gitlab.config.pages.url.sub(/^https?:\/\//) do |prefix| - "#{prefix}#{namespace.path}." + "#{prefix}#{subdomain}." end.downcase # If the project path is the same as host, we serve it as group page - return url if host == path + return url if host == url_path - "#{url}/#{path}" + "#{url}/#{url_path}" + end + + def pages_subdomain + full_path.partition('/').first end def pages_path @@ -1179,8 +1185,8 @@ class Project < ActiveRecord::Base # 3. We asynchronously remove pages with force temp_path = "#{path}.#{SecureRandom.hex}.deleted" - if Gitlab::PagesTransfer.new.rename_project(path, temp_path, namespace.path) - PagesWorker.perform_in(5.minutes, :remove, namespace.path, temp_path) + if Gitlab::PagesTransfer.new.rename_project(path, temp_path, namespace.full_path) + PagesWorker.perform_in(5.minutes, :remove, namespace.full_path, temp_path) end end @@ -1230,7 +1236,7 @@ class Project < ActiveRecord::Base end def ensure_dir_exist - gitlab_shell.add_namespace(repository_storage_path, namespace.path) + gitlab_shell.add_namespace(repository_storage_path, namespace.full_path) end def predefined_variables @@ -1238,7 +1244,7 @@ class Project < ActiveRecord::Base { key: 'CI_PROJECT_ID', value: id.to_s, public: true }, { key: 'CI_PROJECT_NAME', value: path, public: true }, { key: 'CI_PROJECT_PATH', value: path_with_namespace, public: true }, - { key: 'CI_PROJECT_NAMESPACE', value: namespace.path, public: true }, + { key: 'CI_PROJECT_NAMESPACE', value: namespace.full_path, public: true }, { key: 'CI_PROJECT_URL', value: web_url, public: true } ] end diff --git a/app/models/project_services/drone_ci_service.rb b/app/models/project_services/drone_ci_service.rb index 0a217d8caba..942ec9371e5 100644 --- a/app/models/project_services/drone_ci_service.rb +++ b/app/models/project_services/drone_ci_service.rb @@ -12,7 +12,7 @@ class DroneCiService < CiService def compose_service_hook hook = service_hook || build_service_hook # If using a service template, project may not be available - hook.url = [drone_url, "/api/hook", "?owner=#{project.namespace.path}", "&name=#{project.path}", "&access_token=#{token}"].join if project + hook.url = [drone_url, "/api/hook", "?owner=#{project.namespace.full_path}", "&name=#{project.path}", "&access_token=#{token}"].join if project hook.enable_ssl_verification = !!enable_ssl_verification hook.save end @@ -38,7 +38,7 @@ class DroneCiService < CiService def commit_status_path(sha, ref) url = [drone_url, - "gitlab/#{project.namespace.path}/#{project.path}/commits/#{sha}", + "gitlab/#{project.full_path}/commits/#{sha}", "?branch=#{URI::encode(ref.to_s)}&access_token=#{token}"] URI.join(*url).to_s @@ -73,7 +73,7 @@ class DroneCiService < CiService def build_page(sha, ref) url = [drone_url, - "gitlab/#{project.namespace.path}/#{project.path}/redirect/commits/#{sha}", + "gitlab/#{project.full_path}/redirect/commits/#{sha}", "?branch=#{URI::encode(ref.to_s)}"] URI.join(*url).to_s diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb index 484700c8c29..20dfbddc823 100644 --- a/app/services/projects/transfer_service.rb +++ b/app/services/projects/transfer_service.rb @@ -30,7 +30,7 @@ module Projects Project.transaction do old_path = project.path_with_namespace old_group = project.group - new_path = File.join(new_namespace.try(:path) || '', project.path) + new_path = File.join(new_namespace.try(:full_path) || '', project.path) if Project.where(path: project.path, namespace_id: new_namespace.try(:id)).present? raise TransferError.new("Project with same path in target namespace already exists") @@ -63,10 +63,10 @@ module Projects Labels::TransferService.new(current_user, old_group, project).execute # Move uploads - Gitlab::UploadsTransfer.new.move_project(project.path, old_namespace.path, new_namespace.path) + Gitlab::UploadsTransfer.new.move_project(project.path, old_namespace.full_path, new_namespace.full_path) # Move pages - Gitlab::PagesTransfer.new.move_project(project.path, old_namespace.path, new_namespace.path) + Gitlab::PagesTransfer.new.move_project(project.path, old_namespace.full_path, new_namespace.full_path) project.old_path_with_namespace = old_path diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 5238623e936..e67ad663720 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -163,6 +163,6 @@ - @groups.each do |group| %p = link_to [:admin, group], class: 'str-truncated-60' do - = group.name + = group.full_name %span.light.pull-right #{time_ago_with_tooltip(group.created_at)} diff --git a/app/views/import/base/unauthorized.js.haml b/app/views/import/base/unauthorized.js.haml index 36f8069c1f7..ada5f99f4e2 100644 --- a/app/views/import/base/unauthorized.js.haml +++ b/app/views/import/base/unauthorized.js.haml @@ -4,7 +4,7 @@ import_button = tr.find(".btn-import") origin_target = target_field.text() project_name = "#{@project_name}" - origin_namespace = "#{@target_namespace.path}" + origin_namespace = "#{@target_namespace.full_path}" target_field.empty() target_field.append("

This namespace has already been taken! Please choose another one.

") target_field.append("") diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 9c5c1a6d707..f2905fa3ce9 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -232,7 +232,7 @@ .form-group .input-group .input-group-addon - #{URI.join(root_url, @project.namespace.path)}/ + #{URI.join(root_url, @project.namespace.full_path)}/ = f.text_field :path, class: 'form-control' %ul %li Be careful. Renaming a project's repository can have unintended side effects. diff --git a/app/views/projects/group_links/_index.html.haml b/app/views/projects/group_links/_index.html.haml index 99d0df2ac34..b6116dbec41 100644 --- a/app/views/projects/group_links/_index.html.haml +++ b/app/views/projects/group_links/_index.html.haml @@ -39,7 +39,7 @@ = icon("folder-open-o", class: "settings-list-icon") .pull-left = link_to group do - = group.name + = group.full_name %br up to #{group_link.human_access} - if group_link.expires? diff --git a/app/views/projects/pages_domains/show.html.haml b/app/views/projects/pages_domains/show.html.haml index 52dddb052a7..876cac0dacb 100644 --- a/app/views/projects/pages_domains/show.html.haml +++ b/app/views/projects/pages_domains/show.html.haml @@ -17,7 +17,7 @@ %p To access the domain create a new DNS record: %pre - #{@domain.domain} CNAME #{@domain.project.namespace.path}.#{Settings.pages.host}. + #{@domain.domain} CNAME #{@domain.project.pages_subdomain}.#{Settings.pages.host}. %tr %td Certificate diff --git a/app/views/shared/members/_group.html.haml b/app/views/shared/members/_group.html.haml index 81b5bc1de30..1d5a61cffce 100644 --- a/app/views/shared/members/_group.html.haml +++ b/app/views/shared/members/_group.html.haml @@ -6,7 +6,7 @@ %span.list-item-name = image_tag group_icon(group), class: "avatar s40", alt: '' %strong - = link_to group.name, group_path(group) + = link_to group.full_name, group_path(group) .cgray Joined #{time_ago_with_tooltip(group.created_at)} - if group_link.expires? diff --git a/doc/api/projects.md b/doc/api/projects.md index bad238f57d7..f4679d29a4b 100644 --- a/doc/api/projects.md +++ b/doc/api/projects.md @@ -75,7 +75,8 @@ Parameters: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "archived": false, "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png", @@ -125,7 +126,8 @@ Parameters: "id": 4, "name": "Brightbox", "path": "brightbox", - "kind": "group" + "kind": "group", + "full_path": "brightbox" }, "permissions": { "project_access": { @@ -207,7 +209,8 @@ Parameters: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "archived": false, "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png", @@ -254,7 +257,8 @@ Parameters: "id": 4, "name": "Brightbox", "path": "brightbox", - "kind": "group" + "kind": "group", + "full_path": "brightbox" }, "permissions": { "project_access": { @@ -389,7 +393,8 @@ Parameters: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "permissions": { "project_access": { @@ -767,7 +772,8 @@ Example response: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "archived": true, "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png", @@ -832,7 +838,8 @@ Example response: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "archived": true, "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png", @@ -903,7 +910,8 @@ Example response: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "permissions": { "project_access": { @@ -985,7 +993,8 @@ Example response: "id": 3, "name": "Diaspora", "path": "diaspora", - "kind": "group" + "kind": "group", + "full_path": "diaspora" }, "permissions": { "project_access": { diff --git a/lib/backup/repository.rb b/lib/backup/repository.rb index d746070913d..91e43dcb114 100644 --- a/lib/backup/repository.rb +++ b/lib/backup/repository.rb @@ -12,7 +12,7 @@ module Backup path_to_project_bundle = path_to_bundle(project) # Create namespace dir if missing - FileUtils.mkdir_p(File.join(backup_repos_path, project.namespace.path)) if project.namespace + FileUtils.mkdir_p(File.join(backup_repos_path, project.namespace.full_path)) if project.namespace if project.empty_repo? $progress.puts "[SKIPPED]".color(:cyan) diff --git a/lib/gitlab/google_code_import/importer.rb b/lib/gitlab/google_code_import/importer.rb index 1f4edc36928..b02b9737493 100644 --- a/lib/gitlab/google_code_import/importer.rb +++ b/lib/gitlab/google_code_import/importer.rb @@ -310,7 +310,7 @@ module Gitlab if name == project.import_source "##{id}" else - "#{project.namespace.path}/#{name}##{id}" + "#{project.namespace.full_path}/#{name}##{id}" end text = "~~#{text}~~" if deleted text diff --git a/lib/gitlab/import_export.rb b/lib/gitlab/import_export.rb index d679edec36b..a46a41bc56e 100644 --- a/lib/gitlab/import_export.rb +++ b/lib/gitlab/import_export.rb @@ -35,7 +35,7 @@ module Gitlab end def export_filename(project:) - basename = "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_#{project.namespace.path}_#{project.path}" + basename = "#{Time.now.strftime('%Y-%m-%d_%H-%M-%3N')}_#{project.namespace.full_path}_#{project.path}" "#{basename[0..FILENAME_LIMIT]}_export.tar.gz" end diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb index e9ee47fc090..063ce74ecad 100644 --- a/lib/gitlab/import_export/importer.rb +++ b/lib/gitlab/import_export/importer.rb @@ -56,7 +56,7 @@ module Gitlab end def path_with_namespace - File.join(@project.namespace.path, @project.path) + File.join(@project.namespace.full_path, @project.path) end def repo_path diff --git a/lib/gitlab/shell.rb b/lib/gitlab/shell.rb index 82e194c1af1..942cedd6cd4 100644 --- a/lib/gitlab/shell.rb +++ b/lib/gitlab/shell.rb @@ -172,7 +172,7 @@ module Gitlab # add_namespace("/path/to/storage", "gitlab") # def add_namespace(storage, name) - FileUtils.mkdir(full_path(storage, name), mode: 0770) unless exists?(storage, name) + FileUtils.mkdir_p(full_path(storage, name), mode: 0770) unless exists?(storage, name) end # Remove directory from repositories storage diff --git a/spec/lib/gitlab/import_export/import_export_spec.rb b/spec/lib/gitlab/import_export/import_export_spec.rb index 53f7d244d88..20743811dab 100644 --- a/spec/lib/gitlab/import_export/import_export_spec.rb +++ b/spec/lib/gitlab/import_export/import_export_spec.rb @@ -2,14 +2,15 @@ require 'spec_helper' describe Gitlab::ImportExport, services: true do describe 'export filename' do - let(:project) { create(:empty_project, :public, path: 'project-path') } + let(:group) { create(:group, :nested) } + let(:project) { create(:empty_project, :public, path: 'project-path', namespace: group) } it 'contains the project path' do expect(described_class.export_filename(project: project)).to include(project.path) end it 'contains the namespace path' do - expect(described_class.export_filename(project: project)).to include(project.namespace.path) + expect(described_class.export_filename(project: project)).to include(project.namespace.full_path) end it 'does not go over a certain length' do diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 35f3dd00870..b0087a9e15d 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -1852,8 +1852,8 @@ describe Project, models: true do end describe '#pages_url' do - let(:group) { create :group, name: group_name } - let(:project) { create :empty_project, namespace: group, name: project_name } + let(:group) { create :group, name: 'Group' } + let(:nested_group) { create :group, parent: group } let(:domain) { 'Example.com' } subject { project.pages_url } @@ -1863,18 +1863,37 @@ describe Project, models: true do allow(Gitlab.config.pages).to receive(:url).and_return('http://example.com') end - context 'group page' do - let(:group_name) { 'Group' } - let(:project_name) { 'group.example.com' } + context 'top-level group' do + let(:project) { create :empty_project, namespace: group, name: project_name } - it { is_expected.to eq("http://group.example.com") } + context 'group page' do + let(:project_name) { 'group.example.com' } + + it { is_expected.to eq("http://group.example.com") } + end + + context 'project page' do + let(:project_name) { 'Project' } + + it { is_expected.to eq("http://group.example.com/project") } + end end - context 'project page' do - let(:group_name) { 'Group' } - let(:project_name) { 'Project' } + context 'nested group' do + let(:project) { create :empty_project, namespace: nested_group, name: project_name } + let(:expected_url) { "http://group.example.com/#{nested_group.path}/#{project.path}" } - it { is_expected.to eq("http://group.example.com/project") } + context 'group page' do + let(:project_name) { 'group.example.com' } + + it { is_expected.to eq(expected_url) } + end + + context 'project page' do + let(:project_name) { 'Project' } + + it { is_expected.to eq(expected_url) } + end end end end diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index ac0bbec44e0..5ea89c7e27c 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -639,6 +639,7 @@ describe API::Projects, api: true do 'name' => user.namespace.name, 'path' => user.namespace.path, 'kind' => user.namespace.kind, + 'full_path' => user.namespace.full_path, }) end diff --git a/spec/requests/api/v3/projects_spec.rb b/spec/requests/api/v3/projects_spec.rb index a495122bba7..36d99d80e79 100644 --- a/spec/requests/api/v3/projects_spec.rb +++ b/spec/requests/api/v3/projects_spec.rb @@ -682,6 +682,7 @@ describe API::V3::Projects, api: true do 'name' => user.namespace.name, 'path' => user.namespace.path, 'kind' => user.namespace.kind, + 'full_path' => user.namespace.full_path, }) end From 409a3250438981331a6f97422d53bc1095ff13d4 Mon Sep 17 00:00:00 2001 From: winniehell Date: Fri, 10 Feb 2017 00:12:51 +0100 Subject: [PATCH 195/313] Replace static fixture for behaviors/requires_input_spec.js (!9162) --- .../unreleased/requires-input-fixture.yml | 4 ++++ .../behaviors/requires_input_spec.js | 13 +++++++------ .../behaviors/requires_input.html.haml | 18 ------------------ 3 files changed, 11 insertions(+), 24 deletions(-) create mode 100644 changelogs/unreleased/requires-input-fixture.yml delete mode 100644 spec/javascripts/fixtures/behaviors/requires_input.html.haml diff --git a/changelogs/unreleased/requires-input-fixture.yml b/changelogs/unreleased/requires-input-fixture.yml new file mode 100644 index 00000000000..be674499429 --- /dev/null +++ b/changelogs/unreleased/requires-input-fixture.yml @@ -0,0 +1,4 @@ +--- +title: Replace static fixture for behaviors/requires_input_spec.js +merge_request: 9162 +author: winniehell diff --git a/spec/javascripts/behaviors/requires_input_spec.js b/spec/javascripts/behaviors/requires_input_spec.js index a958ac76e66..631fca06514 100644 --- a/spec/javascripts/behaviors/requires_input_spec.js +++ b/spec/javascripts/behaviors/requires_input_spec.js @@ -4,18 +4,19 @@ require('~/behaviors/requires_input'); (function() { describe('requiresInput', function() { - preloadFixtures('static/behaviors/requires_input.html.raw'); + preloadFixtures('branches/new_branch.html.raw'); beforeEach(function() { - return loadFixtures('static/behaviors/requires_input.html.raw'); + loadFixtures('branches/new_branch.html.raw'); + this.submitButton = $('button[type="submit"]'); }); it('disables submit when any field is required', function() { $('.js-requires-input').requiresInput(); - return expect($('.submit')).toBeDisabled(); + return expect(this.submitButton).toBeDisabled(); }); it('enables submit when no field is required', function() { $('*[required=required]').removeAttr('required'); $('.js-requires-input').requiresInput(); - return expect($('.submit')).not.toBeDisabled(); + return expect(this.submitButton).not.toBeDisabled(); }); it('enables submit when all required fields are pre-filled', function() { $('*[required=required]').remove(); @@ -25,9 +26,9 @@ require('~/behaviors/requires_input'); it('enables submit when all required fields receive input', function() { $('.js-requires-input').requiresInput(); $('#required1').val('input1').change(); - expect($('.submit')).toBeDisabled(); + expect(this.submitButton).toBeDisabled(); $('#optional1').val('input1').change(); - expect($('.submit')).toBeDisabled(); + expect(this.submitButton).toBeDisabled(); $('#required2').val('input2').change(); $('#required3').val('input3').change(); $('#required4').val('input4').change(); diff --git a/spec/javascripts/fixtures/behaviors/requires_input.html.haml b/spec/javascripts/fixtures/behaviors/requires_input.html.haml deleted file mode 100644 index c3f905e912e..00000000000 --- a/spec/javascripts/fixtures/behaviors/requires_input.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -%form.js-requires-input - %input{type: 'text', id: 'required1', required: 'required'} - %input{type: 'text', id: 'required2', required: 'required'} - %input{type: 'text', id: 'required3', required: 'required', value: 'Pre-filled'} - %input{type: 'text', id: 'optional1'} - - %textarea{id: 'required4', required: 'required'} - %textarea{id: 'optional2'} - - %select{id: 'required5', required: 'required'} - %option Zero - %option{value: '1'} One - %select{id: 'optional3', required: 'required'} - %option Zero - %option{value: '1'} One - - %button.submit{type: 'submit', value: 'Submit'} - %input.submit{type: 'submit', value: 'Submit'} From b05003af4753062d3dde37f57ff28854f417f673 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Tue, 14 Feb 2017 18:37:21 +0100 Subject: [PATCH 196/313] SidekiqStatus need to be qualified in some cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- lib/gitlab/sidekiq_status/client_middleware.rb | 2 +- lib/gitlab/sidekiq_status/server_middleware.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/sidekiq_status/client_middleware.rb b/lib/gitlab/sidekiq_status/client_middleware.rb index 779a9998b22..d47609f490d 100644 --- a/lib/gitlab/sidekiq_status/client_middleware.rb +++ b/lib/gitlab/sidekiq_status/client_middleware.rb @@ -2,7 +2,7 @@ module Gitlab module SidekiqStatus class ClientMiddleware def call(_, job, _, _) - SidekiqStatus.set(job['jid']) + Gitlab::SidekiqStatus.set(job['jid']) yield end end diff --git a/lib/gitlab/sidekiq_status/server_middleware.rb b/lib/gitlab/sidekiq_status/server_middleware.rb index 31dfa46ff9d..ceab10b8301 100644 --- a/lib/gitlab/sidekiq_status/server_middleware.rb +++ b/lib/gitlab/sidekiq_status/server_middleware.rb @@ -4,7 +4,7 @@ module Gitlab def call(worker, job, queue) ret = yield - SidekiqStatus.unset(job['jid']) + Gitlab::SidekiqStatus.unset(job['jid']) ret end From de12a69a3c33562e7cd4fa81b5e12799a3f68f95 Mon Sep 17 00:00:00 2001 From: Felipe Artur Date: Fri, 27 Jan 2017 17:22:17 -0200 Subject: [PATCH 197/313] Disable invalid service templates --- changelogs/unreleased/issue_25112.yml | 4 ++++ ...211073944_disable_invalid_service_templates.rb | 15 +++++++++++++++ db/schema.rb | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/issue_25112.yml create mode 100644 db/post_migrate/20170211073944_disable_invalid_service_templates.rb diff --git a/changelogs/unreleased/issue_25112.yml b/changelogs/unreleased/issue_25112.yml new file mode 100644 index 00000000000..c43d2732b9a --- /dev/null +++ b/changelogs/unreleased/issue_25112.yml @@ -0,0 +1,4 @@ +--- +title: Disable invalid service templates +merge_request: +author: diff --git a/db/post_migrate/20170211073944_disable_invalid_service_templates.rb b/db/post_migrate/20170211073944_disable_invalid_service_templates.rb new file mode 100644 index 00000000000..84954b1ef64 --- /dev/null +++ b/db/post_migrate/20170211073944_disable_invalid_service_templates.rb @@ -0,0 +1,15 @@ +class DisableInvalidServiceTemplates < ActiveRecord::Migration + DOWNTIME = false + + unless defined?(Service) + class Service < ActiveRecord::Base + self.inheritance_column = nil + end + end + + def up + Service.where(template: true, active: true).each do |template| + template.update(active: false) unless template.valid? + end + end +end diff --git a/db/schema.rb b/db/schema.rb index d421d5c6774..3dde4b9c82b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170210075922) do +ActiveRecord::Schema.define(version: 20170211073944) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" From fa810e4f85a2f30535af44538428866b09d630a4 Mon Sep 17 00:00:00 2001 From: Jan Christophersen Date: Tue, 14 Feb 2017 14:56:25 +0100 Subject: [PATCH 198/313] Add Links to Branches in Calendar Activity --- app/views/users/calendar_activities.html.haml | 14 +++++++++----- .../26287-link-branch-in-calendar-activity.yml | 4 ++++ 2 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 changelogs/unreleased/26287-link-branch-in-calendar-activity.yml diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml index dae147ca8be..4afd31f788b 100644 --- a/app/views/users/calendar_activities.html.haml +++ b/app/views/users/calendar_activities.html.haml @@ -10,13 +10,17 @@ %i.fa.fa-clock-o = event.created_at.to_s(:time) - if event.push? - #{event.action_name} #{event.ref_type} #{event.ref_name} + #{event.action_name} #{event.ref_type} + %strong + - commits_path = namespace_project_commits_path(event.project.namespace, event.project, event.ref_name) + = link_to_if event.project.repository.branch_exists?(event.ref_name), event.ref_name, commits_path - else = event_action_name(event) - - if event.note? - %strong= link_to event.note_target.to_reference, event_note_target_path(event) - - elsif event.target - %strong= link_to event.target.to_reference, [event.project.namespace.becomes(Namespace), event.project, event.target] + %strong + - if event.note? + = link_to event.note_target.to_reference, event_note_target_path(event) + - elsif event.target + = link_to event.target.to_reference, [event.project.namespace.becomes(Namespace), event.project, event.target] at %strong diff --git a/changelogs/unreleased/26287-link-branch-in-calendar-activity.yml b/changelogs/unreleased/26287-link-branch-in-calendar-activity.yml new file mode 100644 index 00000000000..35855578d21 --- /dev/null +++ b/changelogs/unreleased/26287-link-branch-in-calendar-activity.yml @@ -0,0 +1,4 @@ +--- +title: Add Links to Branches in Calendar Activity +merge_request: 9224 +author: Jan Christophersen From 14cfdeaae56367fa80fc67687fbbad42e6f32a2b Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Tue, 14 Feb 2017 11:46:36 -0600 Subject: [PATCH 199/313] Fix z index bugs --- app/assets/stylesheets/pages/issuable.scss | 1 - app/assets/stylesheets/pages/tree.scss | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index da5c44b5fdc..a53cc27fac9 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -193,7 +193,6 @@ top: $header-height; bottom: 0; right: 0; - z-index: 8; transition: width .3s; background: $gray-light; padding: 10px 20px; diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index 8fafe472621..948921efc0b 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -171,6 +171,8 @@ .tree-controls { float: right; margin-top: 11px; + position: relative; + z-index: 2; .project-action-button { margin-left: $btn-side-margin; From 8ea8cfb8096378327530fb38306594cdf114c274 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Tue, 14 Feb 2017 11:58:40 -0600 Subject: [PATCH 200/313] Add changelog --- changelogs/unreleased/28142-overlap-bugs.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelogs/unreleased/28142-overlap-bugs.yml diff --git a/changelogs/unreleased/28142-overlap-bugs.yml b/changelogs/unreleased/28142-overlap-bugs.yml new file mode 100644 index 00000000000..9fdabdf204a --- /dev/null +++ b/changelogs/unreleased/28142-overlap-bugs.yml @@ -0,0 +1,4 @@ +--- +title: Fix z index issues with sidebar +merge_request: +author: From 0d26545ea17c098e01f14c154b82e0645f4fb42d Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Tue, 14 Feb 2017 12:05:59 -0600 Subject: [PATCH 201/313] sync yarn.lock with recent changes to package.json --- yarn.lock | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 129 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e5bb2937cf6..025a3320cbc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -110,6 +110,10 @@ arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" +array-find@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-find/-/array-find-1.0.0.tgz#6c8e286d11ed768327f8e62ecee87353ca3e78b8" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1459,6 +1463,14 @@ enhanced-resolve@^3.0.0: object-assign "^4.0.1" tapable "^0.2.5" +enhanced-resolve@~0.9.0: + version "0.9.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz#4d6e689b3725f86090927ccc86cd9f1635b89e2e" + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.2.0" + tapable "^0.1.8" + ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" @@ -1501,7 +1513,7 @@ es6-map@^0.1.3: es6-symbol "~3.1.0" event-emitter "~0.3.4" -es6-promise@~4.0.3: +es6-promise@^4.0.5, es6-promise@~4.0.3: version "4.0.5" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" @@ -1571,6 +1583,22 @@ eslint-import-resolver-node@^0.2.0: object-assign "^4.0.1" resolve "^1.1.6" +eslint-import-resolver-webpack@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.8.1.tgz#c7f8b4d5bd3c5b489457e5728c5db1c4ffbac9aa" + dependencies: + array-find "^1.0.0" + debug "^2.2.0" + enhanced-resolve "~0.9.0" + find-root "^0.1.1" + has "^1.0.1" + interpret "^1.0.0" + is-absolute "^0.2.3" + lodash.get "^3.7.0" + node-libs-browser "^1.0.0" + resolve "^1.2.0" + semver "^5.3.0" + eslint-module-utils@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.0.0.tgz#a6f8c21d901358759cdc35dbac1982ae1ee58bce" @@ -1876,6 +1904,10 @@ find-cache-dir@^0.1.1: mkdirp "^0.5.1" pkg-dir "^1.0.0" +find-root@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-0.1.2.tgz#98d2267cff1916ccaf2743b3a0eea81d79d7dcd1" + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -2278,6 +2310,13 @@ ipaddr.js@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.2.0.tgz#8aba49c9192799585bdd643e0ccb50e8ae777ba4" +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -2395,6 +2434,12 @@ is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + is-resolvable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" @@ -2409,10 +2454,20 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -2676,6 +2731,16 @@ loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0. json5 "^0.5.0" object-assign "^4.0.1" +lodash._baseget@^3.0.0: + version "3.7.2" + resolved "https://registry.yarnpkg.com/lodash._baseget/-/lodash._baseget-3.7.2.tgz#1b6ae1d5facf3c25532350a13c1197cb8bb674f4" + +lodash._topath@^3.0.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/lodash._topath/-/lodash._topath-3.8.1.tgz#3ec5e2606014f4cb97f755fe6914edd8bfc00eac" + dependencies: + lodash.isarray "^3.0.0" + lodash.camelcase@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.1.1.tgz#065b3ff08f0b7662f389934c46a5504c90e0b2d8" @@ -2696,6 +2761,17 @@ lodash.deburr@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.deburr/-/lodash.deburr-4.1.0.tgz#ddb1bbb3ef07458c0177ba07de14422cb033ff9b" +lodash.get@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-3.7.0.tgz#3ce68ae2c91683b281cc5394128303cbf75e691f" + dependencies: + lodash._baseget "^3.0.0" + lodash._topath "^3.0.0" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + lodash.kebabcase@4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.0.1.tgz#5e63bc9aa2a5562ff3b97ca7af2f803de1bcb90e" @@ -2747,6 +2823,10 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +memory-fs@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" + memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -2863,6 +2943,34 @@ negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +node-libs-browser@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-1.1.1.tgz#2a38243abedd7dffcd07a97c9aca5668975a6fea" + dependencies: + assert "^1.1.1" + browserify-zlib "^0.1.4" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" + path-browserify "0.0.0" + process "^0.11.0" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.0.5" + stream-browserify "^2.0.1" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^1.4.2" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -3217,7 +3325,7 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -process@^0.11.0: +process@^0.11.0, process@~0.11.0: version "0.11.9" resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" @@ -3513,6 +3621,10 @@ resolve@1.1.x, resolve@^1.1.6: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" +resolve@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -3558,7 +3670,7 @@ select2@3.5.2-browserify: version "3.5.2-browserify" resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.2-browserify.tgz#dc4dafda38d67a734e8a97a46f0d3529ae05391d" -"semver@2 || 3 || 4 || 5", semver@~5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -3897,6 +4009,10 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" +tapable@^0.1.8: + version "0.1.10" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.1.10.tgz#29c35707c2b70e50d07482b5d202e8ed446dafd4" + tapable@^0.2.5, tapable@~0.2.5: version "0.2.6" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d" @@ -3938,6 +4054,12 @@ timeago.js@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/timeago.js/-/timeago.js-2.0.5.tgz#730c74fbdb0b0917a553675a4460e3a7f80db86c" +timers-browserify@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" + dependencies: + process "~0.11.0" + timers-browserify@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86" @@ -4026,6 +4148,10 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + underscore@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" From 309aee45b69888f9b51aaa0ce393a3f13b08c255 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Thu, 27 Oct 2016 09:26:58 -0400 Subject: [PATCH 202/313] entities: use the RepoCommit entity for branch commits Fixes #23895. --- changelogs/unreleased/api-entities.yml | 4 +++ doc/api/branches.md | 10 ++++++++ doc/api/commits.md | 18 ++++++++++--- lib/api/entities.rb | 35 +++++++++++++------------- spec/requests/api/branches_spec.rb | 13 +++++++++- spec/requests/api/commits_spec.rb | 20 +++++++++++---- 6 files changed, 74 insertions(+), 26 deletions(-) create mode 100644 changelogs/unreleased/api-entities.yml diff --git a/changelogs/unreleased/api-entities.yml b/changelogs/unreleased/api-entities.yml new file mode 100644 index 00000000000..2003d00fd52 --- /dev/null +++ b/changelogs/unreleased/api-entities.yml @@ -0,0 +1,4 @@ +--- +title: "Use an entity for RepoBranch commits and enhance RepoCommit" +merge_request: 7138 +author: Ben Boeckel diff --git a/doc/api/branches.md b/doc/api/branches.md index ffcfea41453..5eaa8d2e920 100644 --- a/doc/api/branches.md +++ b/doc/api/branches.md @@ -34,6 +34,8 @@ Example response: "committer_email": "john@example.com", "committer_name": "John Smith", "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", + "short_id": "7b5c3cc", + "title": "add projects API", "message": "add projects API", "parent_ids": [ "4ad91d3c1144c406e50c7b33bae684bd6837faf8" @@ -78,6 +80,8 @@ Example response: "committer_email": "john@example.com", "committer_name": "John Smith", "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", + "short_id": "7b5c3cc", + "title": "add projects API", "message": "add projects API", "parent_ids": [ "4ad91d3c1144c406e50c7b33bae684bd6837faf8" @@ -119,6 +123,8 @@ Example response: "committer_email": "john@example.com", "committer_name": "John Smith", "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", + "short_id": "7b5c3cc", + "title": "add projects API", "message": "add projects API", "parent_ids": [ "4ad91d3c1144c406e50c7b33bae684bd6837faf8" @@ -163,6 +169,8 @@ Example response: "committer_email": "john@example.com", "committer_name": "John Smith", "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", + "short_id": "7b5c3cc", + "title": "add projects API", "message": "add projects API", "parent_ids": [ "4ad91d3c1144c406e50c7b33bae684bd6837faf8" @@ -204,6 +212,8 @@ Example response: "committer_email": "john@example.com", "committer_name": "John Smith", "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", + "short_id": "7b5c3cc", + "title": "add projects API", "message": "add projects API", "parent_ids": [ "4ad91d3c1144c406e50c7b33bae684bd6837faf8" diff --git a/doc/api/commits.md b/doc/api/commits.md index 53ce381c8ae..abf6de5cfdc 100644 --- a/doc/api/commits.md +++ b/doc/api/commits.md @@ -29,11 +29,15 @@ Example response: "title": "Replace sanitize with escape once", "author_name": "Dmitriy Zaporozhets", "author_email": "dzaporozhets@sphereconsultinginc.com", + "authored_date": "2012-09-20T11:50:22+03:00", "committer_name": "Administrator", "committer_email": "admin@example.com", + "committed_date": "2012-09-20T11:50:22+03:00", "created_at": "2012-09-20T11:50:22+03:00", "message": "Replace sanitize with escape once", - "allow_failure": false + "parent_ids": [ + "6104942438c14ec7bd21c6cd5bd995272b3faff6" + ] }, { "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6", @@ -45,7 +49,9 @@ Example response: "committer_email": "dmitriy.zaporozhets@gmail.com", "created_at": "2012-09-20T09:06:12+03:00", "message": "Sanitize for network graph", - "allow_failure": false + "parent_ids": [ + "ae1d9fb46aa2b07ee9836d49862ec4e2c46fbbba" + ] } ] ``` @@ -214,10 +220,16 @@ Example response: "title": "Feature added", "author_name": "Dmitriy Zaporozhets", "author_email": "dmitriy.zaporozhets@gmail.com", + "authored_date": "2016-12-12T20:10:39.000+01:00", "created_at": "2016-12-12T20:10:39.000+01:00", "committer_name": "Administrator", "committer_email": "admin@example.com", - "message": "Feature added\n\nSigned-off-by: Dmitriy Zaporozhets \n" + "committed_date": "2016-12-12T20:10:39.000+01:00", + "title": "Feature added", + "message": "Feature added\n\nSigned-off-by: Dmitriy Zaporozhets \n", + "parent_ids": [ + "a738f717824ff53aebad8b090c1b79a14f2bd9e8" + ] } ``` diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 2a071e649fa..0b8204fe7f3 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -155,10 +155,27 @@ module API expose :shared_projects, using: Entities::Project end + class RepoCommit < Grape::Entity + expose :id, :short_id, :title, :created_at + expose :parent_ids + expose :safe_message, as: :message + expose :author_name, :author_email, :authored_date + expose :committer_name, :committer_email, :committed_date + end + + class RepoCommitStats < Grape::Entity + expose :additions, :deletions, :total + end + + class RepoCommitDetail < RepoCommit + expose :stats, using: Entities::RepoCommitStats + expose :status + end + class RepoBranch < Grape::Entity expose :name - expose :commit do |repo_branch, options| + expose :commit, using: Entities::RepoCommit do |repo_branch, options| options[:project].repository.commit(repo_branch.dereferenced_target) end @@ -193,22 +210,6 @@ module API end end - class RepoCommit < Grape::Entity - expose :id, :short_id, :title, :author_name, :author_email, :created_at - expose :committer_name, :committer_email - expose :safe_message, as: :message - end - - class RepoCommitStats < Grape::Entity - expose :additions, :deletions, :total - end - - class RepoCommitDetail < RepoCommit - expose :parent_ids, :committed_date, :authored_date - expose :stats, using: Entities::RepoCommitStats - expose :status - end - class ProjectSnippet < Grape::Entity expose :id, :title, :file_name expose :author, using: Entities::UserBasic diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index 5a3ffc284f2..3e66236f6ae 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -31,7 +31,18 @@ describe API::Branches, api: true do expect(response).to have_http_status(200) expect(json_response['name']).to eq(branch_name) - expect(json_response['commit']['id']).to eq(branch_sha) + json_commit = json_response['commit'] + expect(json_commit['id']).to eq(branch_sha) + expect(json_commit).to have_key('short_id') + expect(json_commit).to have_key('title') + expect(json_commit).to have_key('message') + expect(json_commit).to have_key('author_name') + expect(json_commit).to have_key('author_email') + expect(json_commit).to have_key('authored_date') + expect(json_commit).to have_key('committer_name') + expect(json_commit).to have_key('committer_email') + expect(json_commit).to have_key('committed_date') + expect(json_commit).to have_key('parent_ids') expect(json_response['merged']).to eq(false) expect(json_response['protected']).to eq(false) expect(json_response['developers_can_push']).to eq(false) diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb index af9028a8978..3d0d6735359 100644 --- a/spec/requests/api/commits_spec.rb +++ b/spec/requests/api/commits_spec.rb @@ -367,11 +367,21 @@ describe API::Commits, api: true do get api("/projects/#{project.id}/repository/commits/#{project.repository.commit.id}", user) expect(response).to have_http_status(200) - expect(json_response['id']).to eq(project.repository.commit.id) - expect(json_response['title']).to eq(project.repository.commit.title) - expect(json_response['stats']['additions']).to eq(project.repository.commit.stats.additions) - expect(json_response['stats']['deletions']).to eq(project.repository.commit.stats.deletions) - expect(json_response['stats']['total']).to eq(project.repository.commit.stats.total) + commit = project.repository.commit + expect(json_response['id']).to eq(commit.id) + expect(json_response['short_id']).to eq(commit.short_id) + expect(json_response['title']).to eq(commit.title) + expect(json_response['message']).to eq(commit.safe_message) + expect(json_response['author_name']).to eq(commit.author_name) + expect(json_response['author_email']).to eq(commit.author_email) + expect(json_response['authored_date']).to eq(commit.authored_date.iso8601(3)) + expect(json_response['committer_name']).to eq(commit.committer_name) + expect(json_response['committer_email']).to eq(commit.committer_email) + expect(json_response['committed_date']).to eq(commit.committed_date.iso8601(3)) + expect(json_response['parent_ids']).to eq(commit.parent_ids) + expect(json_response['stats']['additions']).to eq(commit.stats.additions) + expect(json_response['stats']['deletions']).to eq(commit.stats.deletions) + expect(json_response['stats']['total']).to eq(commit.stats.total) end it "returns a 404 error if not found" do From b7aa096129c42877596c3261838439f99216c077 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Tue, 14 Feb 2017 13:50:44 -0600 Subject: [PATCH 203/313] Fix yarn lock and package.json mismatch caused by MR 9133 --- yarn.lock | 341 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 239 insertions(+), 102 deletions(-) diff --git a/yarn.lock b/yarn.lock index 025a3320cbc..42cdc8b3fcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,12 +1,10 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 - - abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -accepts@1.3.3, accepts@~1.3.3: +accepts@~1.3.3, accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" dependencies: @@ -25,14 +23,14 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" -acorn@4.0.4, acorn@^4.0.3, acorn@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" - acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" +acorn@^4.0.3, acorn@^4.0.4, acorn@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -83,6 +81,12 @@ anymatch@^1.3.0: arrify "^1.0.0" micromatch "^2.1.5" +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + aproba@^1.0.3: version "1.1.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.0.tgz#4d8f047a318604e18e3c06a0e52230d3d19f147b" @@ -140,7 +144,7 @@ arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -174,20 +178,20 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@0.2.x, async@~0.2.6: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - -async@1.x, async@^1.4.0, async@^1.5.2: +async@^1.4.0, async@^1.4.2, async@^1.5.2, async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.2: +async@^2.1.2, async@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" dependencies: lodash "^4.14.0" +async@~0.2.6, async@0.2.x: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -236,7 +240,7 @@ babel-core@^6.22.1, babel-core@^6.23.0: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.23.0: +babel-generator@^6.18.0, babel-generator@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5" dependencies: @@ -388,6 +392,14 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-istanbul@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.0.0.tgz#36bde8fbef4837e5ff0366531a2beabd7b1ffa10" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.4.2" + test-exclude "^4.0.0" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -718,7 +730,7 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.22.0, babel-template@^6.23.0: +babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" dependencies: @@ -728,7 +740,7 @@ babel-template@^6.22.0, babel-template@^6.23.0: babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: +babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: version "6.23.1" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" dependencies: @@ -742,7 +754,7 @@ babel-traverse@^6.22.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: +babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" dependencies: @@ -751,7 +763,7 @@ babel-types@^6.19.0, babel-types@^6.22.0, babel-types@^6.23.0: lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0, babylon@^6.15.0: +babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0: version "6.15.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" @@ -1128,14 +1140,6 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" - dependencies: - inherits "~2.0.1" - readable-stream "~2.0.0" - typedarray "~0.0.5" - concat-stream@^1.4.6: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" @@ -1144,6 +1148,14 @@ concat-stream@^1.4.6: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" + dependencies: + inherits "~2.0.1" + readable-stream "~2.0.0" + typedarray "~0.0.5" + connect-history-api-fallback@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" @@ -1251,16 +1263,16 @@ custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" -d3@3.5.11: - version "3.5.11" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.11.tgz#d130750eed0554db70e8432102f920a12407b69c" - d@^0.1.1, d@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" dependencies: es5-ext "~0.10.2" +d3@3.5.11: + version "3.5.11" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.11.tgz#d130750eed0554db70e8432102f920a12407b69c" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1271,28 +1283,28 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" +debug@^2.1.1, debug@^2.2.0, debug@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" -debug@2.2.0, debug@~2.2.0: +debug@~2.2.0, debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + debug@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" dependencies: ms "0.7.2" -debug@2.6.0, debug@^2.1.1, debug@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" - dependencies: - ms "0.7.2" - decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1305,6 +1317,12 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + defaults@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -1364,7 +1382,7 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -doctrine@1.5.0, doctrine@^1.2.2: +doctrine@^1.2.2, doctrine@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" dependencies: @@ -1527,7 +1545,7 @@ es6-set@~0.1.3: es6-symbol "3" event-emitter "~0.3.4" -es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: +es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: version "3.1.0" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" dependencies: @@ -1679,7 +1697,7 @@ espree@^3.4.0: acorn "4.0.4" acorn-jsx "^3.0.0" -esprima@2.7.x, esprima@^2.7.1: +esprima@^2.7.1, esprima@2.7.x: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -1866,6 +1884,13 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + dependencies: + glob "^7.0.3" + minimatch "^3.0.3" + fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -1915,6 +1940,12 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + flat-cache@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96" @@ -2089,7 +2120,7 @@ handle-thing@^1.2.4: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" -handlebars@^4.0.1: +handlebars@^4.0.1, handlebars@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" dependencies: @@ -2262,7 +2293,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2468,14 +2499,14 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" @@ -2494,6 +2525,70 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" +istanbul-api@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.1.tgz#d36e2f1560d1a43ce304c4ff7338182de61c8f73" + dependencies: + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-hook "^1.0.0" + istanbul-lib-instrument "^1.3.0" + istanbul-lib-report "^1.0.0-alpha.3" + istanbul-lib-source-maps "^1.1.0" + istanbul-reports "^1.0.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" + +istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.1.tgz#f263efb519c051c5f1f3343034fc40e7b43ff212" + +istanbul-lib-hook@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0.tgz#fc5367ee27f59268e8f060b0c7aaf051d9c425c5" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.3.0, istanbul-lib-instrument@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.4.2.tgz#0e2fdfac93c1dabf2e31578637dc78a19089f43e" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.13.0" + istanbul-lib-coverage "^1.0.0" + semver "^5.3.0" + +istanbul-lib-report@^1.0.0-alpha.3: + version "1.0.0-alpha.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" + dependencies: + async "^1.4.2" + istanbul-lib-coverage "^1.0.0-alpha" + mkdirp "^0.5.1" + path-parse "^1.0.5" + rimraf "^2.4.3" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" + dependencies: + istanbul-lib-coverage "^1.0.0-alpha.0" + mkdirp "^0.5.1" + rimraf "^2.4.4" + source-map "^0.5.3" + +istanbul-reports@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.1.tgz#9a17176bc4a6cbebdae52b2f15961d52fa623fbc" + dependencies: + handlebars "^4.0.3" + istanbul@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" @@ -2537,7 +2632,7 @@ jquery-ujs@1.2.1: dependencies: jquery ">=1.8.0" -jquery@2.2.1, jquery@>=1.8.0: +jquery@>=1.8.0, jquery@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.1.tgz#3c3e16854ad3d2ac44ac65021b17426d22ad803f" @@ -2549,7 +2644,7 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@3.x, js-yaml@^3.5.1: +js-yaml@^3.5.1, js-yaml@^3.7.0, js-yaml@3.x: version "3.8.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.1.tgz#782ba50200be7b9e5a8537001b7804db3ad02628" dependencies: @@ -2586,7 +2681,7 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@3.3.2, json3@^3.3.2: +json3@^3.3.2, json3@3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -2616,6 +2711,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" +karma-coverage-istanbul-reporter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-0.2.0.tgz#5766263338adeb0026f7e4ac7a89a5f056c5642c" + dependencies: + istanbul-api "^1.1.1" + karma-jasmine@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" @@ -2722,7 +2823,7 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5: +loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@0.2.x: version "0.2.16" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" dependencies: @@ -2731,6 +2832,13 @@ loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0. json5 "^0.5.0" object-assign "^4.0.1" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash._baseget@^3.0.0: version "3.7.2" resolved "https://registry.yarnpkg.com/lodash._baseget/-/lodash._baseget-3.7.2.tgz#1b6ae1d5facf3c25532350a13c1197cb8bb674f4" @@ -2877,7 +2985,7 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: dependencies: mime-db "~1.26.0" -mime@1.3.4, mime@^1.3.4: +mime@^1.3.4, mime@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" @@ -2885,29 +2993,29 @@ minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, "minimatch@2 || 3": version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" -minimist@0.0.8, minimist@~0.0.1: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" +minimist@~0.0.1, minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1, mkdirp@0.5.x: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" dependencies: minimist "0.0.8" @@ -3022,7 +3130,7 @@ node-zopfli@^2.0.0: nan "^2.0.0" node-pre-gyp "^0.6.4" -nopt@3.x, nopt@~3.0.6: +nopt@~3.0.6, nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -3058,14 +3166,14 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" - object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" @@ -3091,7 +3199,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@1.x, once@^1.3.0: +once@^1.3.0, once@^1.4.0, once@1.x: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3160,6 +3268,16 @@ os-tmpdir@^1.0.1, os-tmpdir@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -3221,6 +3339,10 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -3229,6 +3351,10 @@ path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -3354,18 +3480,22 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + qs@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" @@ -3374,10 +3504,6 @@ qs@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" - querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -3617,7 +3743,7 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@1.1.x, resolve@^1.1.6: +resolve@^1.1.6, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -3638,7 +3764,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@~2.5.1, rimraf@~2.5.4: +rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -3670,7 +3796,7 @@ select2@3.5.2-browserify: version "3.5.2-browserify" resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.2-browserify.tgz#dc4dafda38d67a734e8a97a46f0d3529ae05391d" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: +semver@^5.3.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5": version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -3837,7 +3963,7 @@ source-map-support@^0.4.2: dependencies: source-map "^0.5.3" -source-map@0.1.x, source-map@^0.1.41: +source-map@^0.1.41, source-map@0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: @@ -3937,6 +4063,10 @@ stream-http@^2.3.1: to-arraybuffer "^1.0.0" xtend "^4.0.0" +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -3952,10 +4082,6 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^3.0.0" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -3992,7 +4118,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.0, supports-color@^3.1.1: +supports-color@^3.1.0, supports-color@^3.1.1, supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: @@ -4038,6 +4164,16 @@ tar@~2.2.1: fstream "^1.0.2" inherits "2" +test-exclude@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.0.0.tgz#0ddc0100b8ae7e88b34eb4fd98a907e961991900" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4156,17 +4292,10 @@ underscore@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - url-parse@^1.1.1: version "1.1.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" @@ -4174,6 +4303,13 @@ url-parse@^1.1.1: querystringify "0.0.x" requires-port "1.0.x" +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -4198,7 +4334,7 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@0.10.3, util@^0.10.3: +util@^0.10.3, util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: @@ -4358,10 +4494,6 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -4370,6 +4502,10 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -4452,3 +4588,4 @@ yauzl@2.4.1: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + From 35216e3e88ad0ef413926844dede4a57edfc9d01 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 14 Feb 2017 15:44:39 -0500 Subject: [PATCH 204/313] Update CHANGELOG.md for 8.16.5 [ci skip] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 71d38e5453d..1a2b2d3d4c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ documentation](doc/development/changelog.md) for instructions on adding your own entry. +## 8.16.5 (2017-02-14) + +- Patch Asciidocs rendering to block XSS. +- Fix XSS vulnerability in SVG attachments. +- Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. +- Patch XSS vulnerability in RDOC support. + ## 8.16.4 (2017-02-02) - Support non-ASCII characters in GFM autocomplete. !8729 From acfc16a3f459ca6e2bffdaa2822af4418c9e87f0 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 14 Feb 2017 15:52:55 -0500 Subject: [PATCH 205/313] Update CHANGELOG.md for 8.16.5 [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a2b2d3d4c6..04649cfbaeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ entry. ## 8.16.5 (2017-02-14) +- No changes. - Patch Asciidocs rendering to block XSS. - Fix XSS vulnerability in SVG attachments. - Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. From d06906e6245c4b6768fed30b793d30bb8fd581e0 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 14 Feb 2017 15:57:17 -0500 Subject: [PATCH 206/313] Update CHANGELOG.md for 8.16.5 [ci skip] --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04649cfbaeb..a43afa03116 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ entry. ## 8.16.5 (2017-02-14) +- No changes. - No changes. - Patch Asciidocs rendering to block XSS. - Fix XSS vulnerability in SVG attachments. From 334cd746b3870b59bdd608dddebf4662cef5fc2c Mon Sep 17 00:00:00 2001 From: nerro Date: Fri, 3 Feb 2017 11:04:55 +0000 Subject: [PATCH 207/313] #27631: Add missing top-area div to activity header page --- app/views/dashboard/_activity_head.html.haml | 15 ++++++++------- ...1-fix-small-height-of-activity-header-page.yml | 4 ++++ 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 changelogs/unreleased/27631-fix-small-height-of-activity-header-page.yml diff --git a/app/views/dashboard/_activity_head.html.haml b/app/views/dashboard/_activity_head.html.haml index 02b94beee92..68a46f61eb7 100644 --- a/app/views/dashboard/_activity_head.html.haml +++ b/app/views/dashboard/_activity_head.html.haml @@ -1,7 +1,8 @@ -%ul.nav-links - %li{ class: ("active" unless params[:filter]) }> - = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do - Your Projects - %li{ class: ("active" if params[:filter] == 'starred') }> - = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do - Starred Projects +.top-area + %ul.nav-links + %li{ class: ("active" unless params[:filter]) }> + = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do + Your Projects + %li{ class: ("active" if params[:filter] == 'starred') }> + = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do + Starred Projects diff --git a/changelogs/unreleased/27631-fix-small-height-of-activity-header-page.yml b/changelogs/unreleased/27631-fix-small-height-of-activity-header-page.yml new file mode 100644 index 00000000000..59da28964f7 --- /dev/null +++ b/changelogs/unreleased/27631-fix-small-height-of-activity-header-page.yml @@ -0,0 +1,4 @@ +--- +title: "Fix small height of activity header page" +merge_request: 8952 +author: Pavel Sorokin From 0733b142ac705a53de4f80e1b8c4929d30012905 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 14 Feb 2017 16:35:50 -0500 Subject: [PATCH 208/313] Update CHANGELOG.md for 8.15.6 [ci skip] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a43afa03116..6f0492700c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -183,6 +183,13 @@ entry. - Add margin to markdown math blocks. - Add hover state to MR comment reply button. +## 8.15.6 (2017-02-14) + +- Patch Asciidocs rendering to block XSS. +- Fix XSS vulnerability in SVG attachments. +- Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. +- Patch XSS vulnerability in RDOC support. + ## 8.15.4 (2017-01-09) - Make successful pipeline emails off for watchers. !8176 From f3535bbff66d410983d39ec51f75d08683407fbf Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 14 Feb 2017 16:48:40 -0500 Subject: [PATCH 209/313] Update CHANGELOG.md for 8.14.9 [ci skip] --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f0492700c5..e524062a2eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -453,6 +453,13 @@ entry. - Whitelist next project names: help, ci, admin, search. !8227 - Adds back CSS for progress-bars. !8237 +## 8.14.9 (2017-02-14) + +- Patch Asciidocs rendering to block XSS. +- Fix XSS vulnerability in SVG attachments. +- Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. +- Patch XSS vulnerability in RDOC support. + ## 8.14.8 (2017-01-25) - Accept environment variables from the `pre-receive` script. !7967 From d4f7f70f1e7c0b8481d33176fd0886a79022217a Mon Sep 17 00:00:00 2001 From: Phil Hughes Date: Tue, 14 Feb 2017 21:45:36 +0000 Subject: [PATCH 210/313] Stop Pikaday using moment --- app/assets/javascripts/due_date_select.js.es6 | 6 ++++-- app/assets/javascripts/issuable_form.js | 3 ++- app/assets/javascripts/member_expiration_date.js.es6 | 3 ++- app/views/profiles/personal_access_tokens/index.html.haml | 2 +- config/webpack.config.js | 1 + 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/due_date_select.js.es6 b/app/assets/javascripts/due_date_select.js.es6 index ab5ce23d261..9169fcd7328 100644 --- a/app/assets/javascripts/due_date_select.js.es6 +++ b/app/assets/javascripts/due_date_select.js.es6 @@ -48,7 +48,7 @@ const calendar = new Pikaday({ field: $dueDateInput.get(0), theme: 'gitlab-theme', - format: 'YYYY-MM-DD', + format: 'yyyy-mm-dd', onSelect: (dateText) => { const formattedDate = dateFormat(new Date(dateText), 'yyyy-mm-dd'); @@ -63,6 +63,7 @@ } }); + calendar.setDate(new Date($dueDateInput.val())); this.$datePicker.append(calendar.el); this.$datePicker.data('pikaday', calendar); } @@ -169,11 +170,12 @@ const calendar = new Pikaday({ field: $datePicker.get(0), theme: 'gitlab-theme', - format: 'YYYY-MM-DD', + format: 'yyyy-mm-dd', onSelect(dateText) { $datePicker.val(dateFormat(new Date(dateText), 'yyyy-mm-dd')); } }); + calendar.setDate(new Date($datePicker.val())); $datePicker.data('pikaday', calendar); }); diff --git a/app/assets/javascripts/issuable_form.js b/app/assets/javascripts/issuable_form.js index 2ec545db665..c7c744ef61f 100644 --- a/app/assets/javascripts/issuable_form.js +++ b/app/assets/javascripts/issuable_form.js @@ -40,11 +40,12 @@ calendar = new Pikaday({ field: $issuableDueDate.get(0), theme: 'gitlab-theme', - format: 'YYYY-MM-DD', + format: 'yyyy-mm-dd', onSelect: function(dateText) { $issuableDueDate.val(dateFormat(new Date(dateText), 'yyyy-mm-dd')); } }); + calendar.setDate(new Date($issuableDueDate.val())); } } diff --git a/app/assets/javascripts/member_expiration_date.js.es6 b/app/assets/javascripts/member_expiration_date.js.es6 index f57d4a20498..efe7c78a8ec 100644 --- a/app/assets/javascripts/member_expiration_date.js.es6 +++ b/app/assets/javascripts/member_expiration_date.js.es6 @@ -19,7 +19,7 @@ const calendar = new Pikaday({ field: $input.get(0), theme: 'gitlab-theme', - format: 'YYYY-MM-DD', + format: 'yyyy-mm-dd', minDate: new Date(), onSelect(dateText) { $input.val(dateFormat(new Date(dateText), 'yyyy-mm-dd')); @@ -30,6 +30,7 @@ }, }); + calendar.setDate(new Date($input.val())); $input.data('pikaday', calendar); }); diff --git a/app/views/profiles/personal_access_tokens/index.html.haml b/app/views/profiles/personal_access_tokens/index.html.haml index 2c006e1712d..b10f5fc08e2 100644 --- a/app/views/profiles/personal_access_tokens/index.html.haml +++ b/app/views/profiles/personal_access_tokens/index.html.haml @@ -91,7 +91,7 @@ new Pikaday({ field: $dateField.get(0), theme: 'gitlab-theme', - format: 'YYYY-MM-DD', + format: 'yyyy-mm-dd', minDate: new Date(), onSelect: function(dateText) { $dateField.val(dateFormat(new Date(dateText), 'yyyy-mm-dd')); diff --git a/config/webpack.config.js b/config/webpack.config.js index 5d5e4bb570a..07023bdee51 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -83,6 +83,7 @@ var config = { new CompressionPlugin({ asset: '[path].gz[query]', }), + new webpack.IgnorePlugin(/moment/, /pikaday/), ], resolve: { From 41ec1afd01bebd35304c0514d8dd017097410367 Mon Sep 17 00:00:00 2001 From: blackst0ne Date: Wed, 15 Feb 2017 09:28:35 +1100 Subject: [PATCH 211/313] Alphabetically sort tags on runner list --- app/views/admin/runners/_runner.html.haml | 2 +- app/views/projects/runners/_form.html.haml | 2 +- app/views/projects/runners/_runner.html.haml | 2 +- app/views/projects/runners/show.html.haml | 2 +- .../unreleased/alphabetically_sort_tags_on_runner_list.yml | 4 ++++ 5 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 changelogs/unreleased/alphabetically_sort_tags_on_runner_list.yml diff --git a/app/views/admin/runners/_runner.html.haml b/app/views/admin/runners/_runner.html.haml index 975bd950ae1..deb62845e1c 100644 --- a/app/views/admin/runners/_runner.html.haml +++ b/app/views/admin/runners/_runner.html.haml @@ -22,7 +22,7 @@ %td #{runner.builds.count(:all)} %td - - runner.tag_list.each do |tag| + - runner.tag_list.sort.each do |tag| %span.label.label-primary = tag %td diff --git a/app/views/projects/runners/_form.html.haml b/app/views/projects/runners/_form.html.haml index 98e72f6c547..2ef1f98ba48 100644 --- a/app/views/projects/runners/_form.html.haml +++ b/app/views/projects/runners/_form.html.haml @@ -32,7 +32,7 @@ = label_tag :tag_list, class: 'control-label' do Tags .col-sm-10 - = f.text_field :tag_list, value: runner.tag_list.to_s, class: 'form-control' + = f.text_field :tag_list, value: runner.tag_list.sort.join(', '), class: 'form-control' .help-block You can setup jobs to only use Runners with specific tags .form-actions = f.submit 'Save changes', class: 'btn btn-save' diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml index 7036b8a5ccc..deeadb609f6 100644 --- a/app/views/projects/runners/_runner.html.haml +++ b/app/views/projects/runners/_runner.html.haml @@ -31,6 +31,6 @@ = runner.description - if runner.tag_list.present? %p - - runner.tag_list.each do |tag| + - runner.tag_list.sort.each do |tag| %span.label.label-primary = tag diff --git a/app/views/projects/runners/show.html.haml b/app/views/projects/runners/show.html.haml index 61b99f35d74..49415ba557b 100644 --- a/app/views/projects/runners/show.html.haml +++ b/app/views/projects/runners/show.html.haml @@ -28,7 +28,7 @@ %tr %td Tags %td - - @runner.tag_list.each do |tag| + - @runner.tag_list.sort.each do |tag| %span.label.label-primary = tag %tr diff --git a/changelogs/unreleased/alphabetically_sort_tags_on_runner_list.yml b/changelogs/unreleased/alphabetically_sort_tags_on_runner_list.yml new file mode 100644 index 00000000000..ffcf197a596 --- /dev/null +++ b/changelogs/unreleased/alphabetically_sort_tags_on_runner_list.yml @@ -0,0 +1,4 @@ +--- +title: Alphabetically sort tags on runner list +merge_request: 8922 +author: blackst0ne From 1452729304393978ec93b712130dff6687db01b9 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Tue, 14 Feb 2017 22:04:43 -0500 Subject: [PATCH 212/313] Remove duplicate CHANGELOG.md entries for 8.16.5 --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e524062a2eb..cbaac0f69d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,6 @@ entry. ## 8.16.5 (2017-02-14) -- No changes. -- No changes. - Patch Asciidocs rendering to block XSS. - Fix XSS vulnerability in SVG attachments. - Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. From a855d427d238eaf7c980b418a046613e0f710955 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Mon, 13 Feb 2017 21:27:32 -0600 Subject: [PATCH 213/313] Fix stray pipelines API request when showing MR Fixes https://gitlab.com/gitlab-org/gitlab-ce/issues/27925 --- .../javascripts/commit/pipelines/pipelines_bundle.js.es6 | 9 ++++++--- .../javascripts/commit/pipelines/pipelines_table.js.es6 | 5 ++--- app/assets/javascripts/merge_request_tabs.js.es6 | 8 ++++++++ app/views/projects/commit/_pipelines_list.haml | 5 ++++- app/views/projects/merge_requests/_show.html.haml | 2 +- .../27925-fix-mr-stray-pipelines-api-request.yml | 4 ++++ 6 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 changelogs/unreleased/27925-fix-mr-stray-pipelines-api-request.yml diff --git a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js.es6 b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js.es6 index fbfec7743c7..b5a988df897 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js.es6 +++ b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js.es6 @@ -20,7 +20,10 @@ $(() => { gl.commits.PipelinesTableBundle.$destroy(true); } - gl.commits.pipelines.PipelinesTableBundle = new gl.commits.pipelines.PipelinesTableView({ - el: document.querySelector('#commit-pipeline-table-view'), - }); + const pipelineTableViewEl = document.querySelector('#commit-pipeline-table-view'); + gl.commits.pipelines.PipelinesTableBundle = new gl.commits.pipelines.PipelinesTableView(); + + if (pipelineTableViewEl && pipelineTableViewEl.dataset.disableInitialization === undefined) { + gl.commits.pipelines.PipelinesTableBundle.$mount(pipelineTableViewEl); + } }); diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 b/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 index ce0dbd4d56b..5983ad4afc2 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 +++ b/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 @@ -56,15 +56,14 @@ require('./pipelines_store'); }, /** - * When the component is created the service to fetch the data will be - * initialized with the correct endpoint. + * When the component is about to be mounted, tell the service to fetch the data * * A request to fetch the pipelines will be made. * In case of a successfull response we will store the data in the provided * store, in case of a failed response we need to warn the user. * */ - created() { + beforeMount() { const pipelinesService = new gl.commits.pipelines.PipelinesService(this.endpoint); this.isLoading = true; diff --git a/app/assets/javascripts/merge_request_tabs.js.es6 b/app/assets/javascripts/merge_request_tabs.js.es6 index cc049e00477..da9bd9e9d82 100644 --- a/app/assets/javascripts/merge_request_tabs.js.es6 +++ b/app/assets/javascripts/merge_request_tabs.js.es6 @@ -61,6 +61,7 @@ require('./flash'); constructor({ action, setUrl, stubLocation } = {}) { this.diffsLoaded = false; + this.pipelinesLoaded = false; this.commitsLoaded = false; this.fixedLayoutPref = null; @@ -128,6 +129,13 @@ require('./flash'); $.scrollTo('.merge-request-details .merge-request-tabs', { offset: 0, }); + } else if (action === 'pipelines') { + if (this.pipelinesLoaded) { + return; + } + const pipelineTableViewEl = document.querySelector('#commit-pipeline-table-view'); + gl.commits.pipelines.PipelinesTableBundle.$mount(pipelineTableViewEl); + this.pipelinesLoaded = true; } else { this.expandView(); this.resetViewContainer(); diff --git a/app/views/projects/commit/_pipelines_list.haml b/app/views/projects/commit/_pipelines_list.haml index aae2cb8a04b..33917513f37 100644 --- a/app/views/projects/commit/_pipelines_list.haml +++ b/app/views/projects/commit/_pipelines_list.haml @@ -1,4 +1,7 @@ -#commit-pipeline-table-view{ data: { endpoint: endpoint } } +- disable_initialization = local_assigns.fetch(:disable_initialization, false) +#commit-pipeline-table-view{ data: { disable_initialization: disable_initialization, + endpoint: endpoint, +} } .pipeline-svgs{ data: { "commit_icon_svg" => custom_icon("icon_commit"), "icon_status_canceled" => custom_icon("icon_status_canceled"), "icon_status_running" => custom_icon("icon_status_running"), diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml index dd615d3036c..521b0694ca9 100644 --- a/app/views/projects/merge_requests/_show.html.haml +++ b/app/views/projects/merge_requests/_show.html.haml @@ -94,7 +94,7 @@ -# This tab is always loaded via AJAX #pipelines.pipelines.tab-pane - if @pipelines.any? - = render 'projects/commit/pipelines_list', endpoint: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) + = render 'projects/commit/pipelines_list', disable_initialization: true, endpoint: pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request) #diffs.diffs.tab-pane -# This tab is always loaded via AJAX diff --git a/changelogs/unreleased/27925-fix-mr-stray-pipelines-api-request.yml b/changelogs/unreleased/27925-fix-mr-stray-pipelines-api-request.yml new file mode 100644 index 00000000000..f7bdb62b7f3 --- /dev/null +++ b/changelogs/unreleased/27925-fix-mr-stray-pipelines-api-request.yml @@ -0,0 +1,4 @@ +--- +title: Fix stray pipelines API request when showing MR +merge_request: +author: From 0dfccd995aa9bf560e59299f3a4f1705d6981115 Mon Sep 17 00:00:00 2001 From: Semyon Pupkov Date: Sun, 12 Feb 2017 13:02:26 +0500 Subject: [PATCH 214/313] Add active_when helper Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/24036 --- app/helpers/application_helper.rb | 9 +++++++ app/views/admin/logs/show.html.haml | 5 ++-- app/views/admin/projects/index.html.haml | 6 ++--- app/views/admin/users/index.html.haml | 14 +++++----- app/views/dashboard/_activity_head.html.haml | 4 +-- app/views/dashboard/todos/index.html.haml | 6 ++--- app/views/devise/shared/_signin_box.html.haml | 2 +- app/views/devise/shared/_tabs_ldap.html.haml | 2 +- app/views/explore/projects/_filter.html.haml | 4 +-- app/views/kaminari/gitlab/_page.html.haml | 2 +- app/views/projects/pipelines/index.html.haml | 8 +++--- .../wikis/_sidebar_wiki_page.html.haml | 2 +- app/views/search/_category.html.haml | 26 +++++++++---------- app/views/shared/builds/_tabs.html.haml | 8 +++--- app/views/shared/issuable/_nav.html.haml | 10 +++---- .../snippets/_snippets_scope_menu.html.haml | 8 +++--- spec/helpers/application_helper_spec.rb | 5 ++++ 17 files changed, 66 insertions(+), 55 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index bee323993a0..6db813d4a02 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -296,4 +296,13 @@ module ApplicationHelper def page_class "issue-boards-page" if current_controller?(:boards) end + + # Returns active css class when condition returns true + # otherwise returns nil. + # + # Example: + # %li{ class: active_when(params[:filter] == '1') } + def active_when(condition) + 'active' if condition + end end diff --git a/app/views/admin/logs/show.html.haml b/app/views/admin/logs/show.html.haml index 13d00dd1fcb..5e585ce789b 100644 --- a/app/views/admin/logs/show.html.haml +++ b/app/views/admin/logs/show.html.haml @@ -8,15 +8,14 @@ %div{ class: container_class } %ul.nav-links.log-tabs - loggers.each do |klass| - %li{ class: (klass == Gitlab::GitLogger ? 'active' : '') }> + %li{ class: active_when(klass == Gitlab::GitLogger) }> = link_to klass::file_name, "##{klass::file_name_noext}", 'data-toggle' => 'tab' .row-content-block To prevent performance issues admin logs output the last 2000 lines .tab-content - loggers.each do |klass| - .tab-pane{ class: (klass == Gitlab::GitLogger ? 'active' : ''), - id: klass::file_name_noext } + .tab-pane{ class: active_when(klass == Gitlab::GitLogger), id: klass::file_name_noext } .file-holder#README .js-file-title.file-title %i.fa.fa-file diff --git a/app/views/admin/projects/index.html.haml b/app/views/admin/projects/index.html.haml index cf8d438670b..756782c7d4e 100644 --- a/app/views/admin/projects/index.html.haml +++ b/app/views/admin/projects/index.html.haml @@ -48,13 +48,13 @@ = link_to admin_projects_path do All - = nav_link(html_options: { class: params[:visibility_level] == Gitlab::VisibilityLevel::PRIVATE.to_s ? 'active' : '' }) do + = nav_link(html_options: { class: active_when(params[:visibility_level] == Gitlab::VisibilityLevel::PRIVATE.to_s) }) do = link_to admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PRIVATE) do Private - = nav_link(html_options: { class: params[:visibility_level] == Gitlab::VisibilityLevel::INTERNAL.to_s ? 'active' : '' }) do + = nav_link(html_options: { class: active_when(params[:visibility_level] == Gitlab::VisibilityLevel::INTERNAL.to_s) }) do = link_to admin_projects_path(visibility_level: Gitlab::VisibilityLevel::INTERNAL) do Internal - = nav_link(html_options: { class: params[:visibility_level] == Gitlab::VisibilityLevel::PUBLIC.to_s ? 'active' : '' }) do + = nav_link(html_options: { class: active_when(params[:visibility_level] == Gitlab::VisibilityLevel::PUBLIC.to_s) }) do = link_to admin_projects_path(visibility_level: Gitlab::VisibilityLevel::PUBLIC) do Public diff --git a/app/views/admin/users/index.html.haml b/app/views/admin/users/index.html.haml index 4dc44225d49..298cf0fa950 100644 --- a/app/views/admin/users/index.html.haml +++ b/app/views/admin/users/index.html.haml @@ -38,31 +38,31 @@ .nav-block %ul.nav-links.wide.scrolling-tabs.white.scrolling-tabs .fade-left - = nav_link(html_options: { class: ('active' unless params[:filter]) }) do + = nav_link(html_options: { class: active_when(params[:filter].nil?) }) do = link_to admin_users_path do Active %small.badge= number_with_delimiter(User.active.count) - = nav_link(html_options: { class: ('active' if params[:filter] == 'admins') }) do + = nav_link(html_options: { class: active_when(params[:filter] == 'admins') }) do = link_to admin_users_path(filter: "admins") do Admins %small.badge= number_with_delimiter(User.admins.count) - = nav_link(html_options: { class: "#{'active' if params[:filter] == 'two_factor_enabled'} filter-two-factor-enabled" }) do + = nav_link(html_options: { class: "#{active_when(params[:filter] == 'two_factor_enabled')} filter-two-factor-enabled" }) do = link_to admin_users_path(filter: 'two_factor_enabled') do 2FA Enabled %small.badge= number_with_delimiter(User.with_two_factor.count) - = nav_link(html_options: { class: "#{'active' if params[:filter] == 'two_factor_disabled'} filter-two-factor-disabled" }) do + = nav_link(html_options: { class: "#{active_when(params[:filter] == 'two_factor_disabled')} filter-two-factor-disabled" }) do = link_to admin_users_path(filter: 'two_factor_disabled') do 2FA Disabled %small.badge= number_with_delimiter(User.without_two_factor.count) - = nav_link(html_options: { class: ('active' if params[:filter] == 'external') }) do + = nav_link(html_options: { class: active_when(params[:filter] == 'external') }) do = link_to admin_users_path(filter: 'external') do External %small.badge= number_with_delimiter(User.external.count) - = nav_link(html_options: { class: ('active' if params[:filter] == 'blocked') }) do + = nav_link(html_options: { class: active_when(params[:filter] == 'blocked') }) do = link_to admin_users_path(filter: "blocked") do Blocked %small.badge= number_with_delimiter(User.blocked.count) - = nav_link(html_options: { class: ('active' if params[:filter] == 'wop') }) do + = nav_link(html_options: { class: active_when(params[:filter] == 'wop') }) do = link_to admin_users_path(filter: "wop") do Without projects %small.badge= number_with_delimiter(User.without_projects.count) diff --git a/app/views/dashboard/_activity_head.html.haml b/app/views/dashboard/_activity_head.html.haml index 68a46f61eb7..ecdf76ef5c5 100644 --- a/app/views/dashboard/_activity_head.html.haml +++ b/app/views/dashboard/_activity_head.html.haml @@ -1,8 +1,8 @@ .top-area %ul.nav-links - %li{ class: ("active" unless params[:filter]) }> + %li{ class: active_when(params[:filter].nil?) }> = link_to activity_dashboard_path, class: 'shortcuts-activity', data: {placement: 'right'} do Your Projects - %li{ class: ("active" if params[:filter] == 'starred') }> + %li{ class: active_when(params[:filter] == 'starred') }> = link_to activity_dashboard_path(filter: 'starred'), data: {placement: 'right'} do Starred Projects diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml index c4bf2c90cc2..16a5713948a 100644 --- a/app/views/dashboard/todos/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -4,15 +4,13 @@ - if current_user.todos.any? .top-area %ul.nav-links - - todo_pending_active = ('active' if params[:state].blank? || params[:state] == 'pending') - %li{ class: "todos-pending #{todo_pending_active}" }> + %li.todos-pending{ class: active_when(params[:state].blank? || params[:state] == 'pending') }> = link_to todos_filter_path(state: 'pending') do %span To do %span.badge = number_with_delimiter(todos_pending_count) - - todo_done_active = ('active' if params[:state] == 'done') - %li{ class: "todos-done #{todo_done_active}" }> + %li.todos-done{ class: active_when(params[:state] == 'done') }> = link_to todos_filter_path(state: 'done') do %span Done diff --git a/app/views/devise/shared/_signin_box.html.haml b/app/views/devise/shared/_signin_box.html.haml index eddfce363a7..da4769e214e 100644 --- a/app/views/devise/shared/_signin_box.html.haml +++ b/app/views/devise/shared/_signin_box.html.haml @@ -4,7 +4,7 @@ .login-body = render 'devise/sessions/new_crowd' - @ldap_servers.each_with_index do |server, i| - .login-box.tab-pane{ id: "#{server['provider_name']}", role: 'tabpanel', class: (:active if i.zero? && !crowd_enabled?) } + .login-box.tab-pane{ id: "#{server['provider_name']}", role: 'tabpanel', class: active_when(i.zero? && !crowd_enabled?) } .login-body = render 'devise/sessions/new_ldap', server: server - if signin_enabled? diff --git a/app/views/devise/shared/_tabs_ldap.html.haml b/app/views/devise/shared/_tabs_ldap.html.haml index 8c4ad30c832..dd34600490e 100644 --- a/app/views/devise/shared/_tabs_ldap.html.haml +++ b/app/views/devise/shared/_tabs_ldap.html.haml @@ -3,7 +3,7 @@ %li.active = link_to "Crowd", "#crowd", 'data-toggle' => 'tab' - @ldap_servers.each_with_index do |server, i| - %li{ class: (:active if i.zero? && !crowd_enabled?) } + %li{ class: active_when(i.zero? && !crowd_enabled?) } = link_to server['label'], "##{server['provider_name']}", 'data-toggle' => 'tab' - if signin_enabled? %li diff --git a/app/views/explore/projects/_filter.html.haml b/app/views/explore/projects/_filter.html.haml index e3088848492..56f463572bb 100644 --- a/app/views/explore/projects/_filter.html.haml +++ b/app/views/explore/projects/_filter.html.haml @@ -13,7 +13,7 @@ = link_to filter_projects_path(visibility_level: nil) do Any - Gitlab::VisibilityLevel.values.each do |level| - %li{ class: (level.to_s == params[:visibility_level]) ? 'active' : 'light' } + %li{ class: active_when(level.to_s == params[:visibility_level]) || 'light' } = link_to filter_projects_path(visibility_level: level) do = visibility_level_icon(level) = visibility_level_label(level) @@ -34,7 +34,7 @@ Any - @tags.each do |tag| - %li{ class: (tag.name == params[:tag]) ? 'active' : 'light' } + %li{ class: active_when(tag.name == params[:tag]) || 'light' } = link_to filter_projects_path(tag: tag.name) do = icon('tag') = tag.name diff --git a/app/views/kaminari/gitlab/_page.html.haml b/app/views/kaminari/gitlab/_page.html.haml index cefe0066a8f..5c5be03a7cd 100644 --- a/app/views/kaminari/gitlab/_page.html.haml +++ b/app/views/kaminari/gitlab/_page.html.haml @@ -6,5 +6,5 @@ -# total_pages: total number of pages -# per_page: number of items to fetch per page -# remote: data-remote -%li{ class: "page#{' active' if page.current?}#{' sibling' if page.next? || page.prev?}" } +%li.page{ class: [active_when(page.current?), ('sibling' if page.next? || page.prev?)] } = link_to page, url, { remote: remote, rel: page.next? ? 'next' : page.prev? ? 'prev' : nil } diff --git a/app/views/projects/pipelines/index.html.haml b/app/views/projects/pipelines/index.html.haml index 81e393d7626..6e0428e2a31 100644 --- a/app/views/projects/pipelines/index.html.haml +++ b/app/views/projects/pipelines/index.html.haml @@ -5,23 +5,23 @@ %div{ class: container_class } .top-area %ul.nav-links - %li{ class: ('active' if @scope.nil?) }> + %li{ class: active_when(@scope.nil?) }> = link_to project_pipelines_path(@project) do All %span.badge.js-totalbuilds-count = number_with_delimiter(@pipelines_count) - %li{ class: ('active' if @scope == 'running') }> + %li{ class: active_when(@scope == 'running') }> = link_to project_pipelines_path(@project, scope: :running) do Running %span.badge.js-running-count = number_with_delimiter(@running_or_pending_count) - %li{ class: ('active' if @scope == 'branches') }> + %li{ class: active_when(@scope == 'branches') }> = link_to project_pipelines_path(@project, scope: :branches) do Branches - %li{ class: ('active' if @scope == 'tags') }> + %li{ class: active_when(@scope == 'tags') }> = link_to project_pipelines_path(@project, scope: :tags) do Tags diff --git a/app/views/projects/wikis/_sidebar_wiki_page.html.haml b/app/views/projects/wikis/_sidebar_wiki_page.html.haml index eb9bd14920d..0a61d90177b 100644 --- a/app/views/projects/wikis/_sidebar_wiki_page.html.haml +++ b/app/views/projects/wikis/_sidebar_wiki_page.html.haml @@ -1,3 +1,3 @@ -%li{ class: params[:id] == wiki_page.slug ? 'active' : '' } +%li{ class: active_when(params[:id] == wiki_page.slug) } = link_to namespace_project_wiki_path(@project.namespace, @project, wiki_page) do = wiki_page.title.capitalize diff --git a/app/views/search/_category.html.haml b/app/views/search/_category.html.haml index 8cbecb725b5..5afb95ac430 100644 --- a/app/views/search/_category.html.haml +++ b/app/views/search/_category.html.haml @@ -1,70 +1,70 @@ %ul.nav-links.search-filter - if @project - %li{ class: ("active" if @scope == 'blobs') } + %li{ class: active_when(@scope == 'blobs') } = link_to search_filter_path(scope: 'blobs') do Code %span.badge = @search_results.blobs_count - %li{ class: ("active" if @scope == 'issues') } + %li{ class: active_when(@scope == 'issues') } = link_to search_filter_path(scope: 'issues') do Issues %span.badge = @search_results.issues_count - %li{ class: ("active" if @scope == 'merge_requests') } + %li{ class: active_when(@scope == 'merge_requests') } = link_to search_filter_path(scope: 'merge_requests') do Merge requests %span.badge = @search_results.merge_requests_count - %li{ class: ("active" if @scope == 'milestones') } + %li{ class: active_when(@scope == 'milestones') } = link_to search_filter_path(scope: 'milestones') do Milestones %span.badge = @search_results.milestones_count - %li{ class: ("active" if @scope == 'notes') } + %li{ class: active_when(@scope == 'notes') } = link_to search_filter_path(scope: 'notes') do Comments %span.badge = @search_results.notes_count - %li{ class: ("active" if @scope == 'wiki_blobs') } + %li{ class: active_when(@scope == 'wiki_blobs') } = link_to search_filter_path(scope: 'wiki_blobs') do Wiki %span.badge = @search_results.wiki_blobs_count - %li{ class: ("active" if @scope == 'commits') } + %li{ class: active_when(@scope == 'commits') } = link_to search_filter_path(scope: 'commits') do Commits %span.badge = @search_results.commits_count - elsif @show_snippets - %li{ class: ("active" if @scope == 'snippet_blobs') } + %li{ class: active_when(@scope == 'snippet_blobs') } = link_to search_filter_path(scope: 'snippet_blobs', snippets: true, group_id: nil, project_id: nil) do Snippet Contents %span.badge = @search_results.snippet_blobs_count - %li{ class: ("active" if @scope == 'snippet_titles') } + %li{ class: active_when(@scope == 'snippet_titles') } = link_to search_filter_path(scope: 'snippet_titles', snippets: true, group_id: nil, project_id: nil) do Titles and Filenames %span.badge = @search_results.snippet_titles_count - else - %li{ class: ("active" if @scope == 'projects') } + %li{ class: active_when(@scope == 'projects') } = link_to search_filter_path(scope: 'projects') do Projects %span.badge = @search_results.projects_count - %li{ class: ("active" if @scope == 'issues') } + %li{ class: active_when(@scope == 'issues') } = link_to search_filter_path(scope: 'issues') do Issues %span.badge = @search_results.issues_count - %li{ class: ("active" if @scope == 'merge_requests') } + %li{ class: active_when(@scope == 'merge_requests') } = link_to search_filter_path(scope: 'merge_requests') do Merge requests %span.badge = @search_results.merge_requests_count - %li{ class: ("active" if @scope == 'milestones') } + %li{ class: active_when(@scope == 'milestones') } = link_to search_filter_path(scope: 'milestones') do Milestones %span.badge diff --git a/app/views/shared/builds/_tabs.html.haml b/app/views/shared/builds/_tabs.html.haml index b6047ece592..3baa956b910 100644 --- a/app/views/shared/builds/_tabs.html.haml +++ b/app/views/shared/builds/_tabs.html.haml @@ -1,23 +1,23 @@ %ul.nav-links - %li{ class: ('active' if scope.nil?) }> + %li{ class: active_when(scope.nil?) }> = link_to build_path_proc.call(nil) do All %span.badge.js-totalbuilds-count = number_with_delimiter(all_builds.count(:id)) - %li{ class: ('active' if scope == 'pending') }> + %li{ class: active_when(scope == 'pending') }> = link_to build_path_proc.call('pending') do Pending %span.badge = number_with_delimiter(all_builds.pending.count(:id)) - %li{ class: ('active' if scope == 'running') }> + %li{ class: active_when(scope == 'running') }> = link_to build_path_proc.call('running') do Running %span.badge = number_with_delimiter(all_builds.running.count(:id)) - %li{ class: ('active' if scope == 'finished') }> + %li{ class: active_when(scope == 'finished') }> = link_to build_path_proc.call('finished') do Finished %span.badge diff --git a/app/views/shared/issuable/_nav.html.haml b/app/views/shared/issuable/_nav.html.haml index 1154316c03f..ad995cbe962 100644 --- a/app/views/shared/issuable/_nav.html.haml +++ b/app/views/shared/issuable/_nav.html.haml @@ -3,23 +3,23 @@ - issuables = @issues || @merge_requests %ul.nav-links.issues-state-filters - %li{ class: ("active" if params[:state] == 'opened') }> + %li{ class: active_when(params[:state] == 'opened') }> = link_to page_filter_path(state: 'opened', label: true), id: 'state-opened', title: "Filter by #{page_context_word} that are currently opened." do #{issuables_state_counter_text(type, :opened)} - if type == :merge_requests - %li{ class: ("active" if params[:state] == 'merged') }> + %li{ class: active_when(params[:state] == 'merged') }> = link_to page_filter_path(state: 'merged', label: true), id: 'state-merged', title: 'Filter by merge requests that are currently merged.' do #{issuables_state_counter_text(type, :merged)} - %li{ class: ("active" if params[:state] == 'closed') }> + %li{ class: active_when(params[:state] == 'closed') }> = link_to page_filter_path(state: 'closed', label: true), id: 'state-closed', title: 'Filter by merge requests that are currently closed and unmerged.' do #{issuables_state_counter_text(type, :closed)} - else - %li{ class: ("active" if params[:state] == 'closed') }> + %li{ class: active_when(params[:state] == 'closed') }> = link_to page_filter_path(state: 'closed', label: true), id: 'state-all', title: 'Filter by issues that are currently closed.' do #{issuables_state_counter_text(type, :closed)} - %li{ class: ("active" if params[:state] == 'all') }> + %li{ class: active_when(params[:state] == 'all') }> = link_to page_filter_path(state: 'all', label: true), id: 'state-all', title: "Show all #{page_context_word}." do #{issuables_state_counter_text(type, :all)} diff --git a/app/views/snippets/_snippets_scope_menu.html.haml b/app/views/snippets/_snippets_scope_menu.html.haml index 2dda5fed647..8b6a98a054a 100644 --- a/app/views/snippets/_snippets_scope_menu.html.haml +++ b/app/views/snippets/_snippets_scope_menu.html.haml @@ -2,7 +2,7 @@ - include_private = local_assigns.fetch(:include_private, false) .nav-links.snippet-scope-menu - %li{ class: ("active" unless params[:scope]) } + %li{ class: active_when(params[:scope].nil?) } = link_to subject_snippets_path(subject) do All %span.badge @@ -12,19 +12,19 @@ = subject.snippets.public_and_internal.count - if include_private - %li{ class: ("active" if params[:scope] == "are_private") } + %li{ class: active_when(params[:scope] == "are_private") } = link_to subject_snippets_path(subject, scope: 'are_private') do Private %span.badge = subject.snippets.are_private.count - %li{ class: ("active" if params[:scope] == "are_internal") } + %li{ class: active_when(params[:scope] == "are_internal") } = link_to subject_snippets_path(subject, scope: 'are_internal') do Internal %span.badge = subject.snippets.are_internal.count - %li{ class: ("active" if params[:scope] == "are_public") } + %li{ class: active_when(params[:scope] == "are_public") } = link_to subject_snippets_path(subject, scope: 'are_public') do Public %span.badge diff --git a/spec/helpers/application_helper_spec.rb b/spec/helpers/application_helper_spec.rb index 8b201f348f1..fd40fe99941 100644 --- a/spec/helpers/application_helper_spec.rb +++ b/spec/helpers/application_helper_spec.rb @@ -265,4 +265,9 @@ describe ApplicationHelper do expect(helper.render_markup('foo.adoc', content)).to eq('NOEL') end end + + describe '#active_when' do + it { expect(helper.active_when(true)).to eq('active') } + it { expect(helper.active_when(false)).to eq(nil) } + end end From a084437b5c1b7226ce64e74bab1972bb1dbd49e0 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Mon, 13 Feb 2017 17:59:57 +0100 Subject: [PATCH 215/313] Rename builds to jobs in docs [ci skip] --- doc/administration/build_artifacts.md | 97 +----- doc/administration/job_artifacts.md | 114 +++++++ doc/ci/README.md | 18 +- doc/ci/build_artifacts/README.md | 5 +- doc/ci/docker/README.md | 4 +- doc/ci/docker/using_docker_build.md | 72 +++-- doc/ci/docker/using_docker_images.md | 22 +- doc/ci/enable_or_disable_ci.md | 2 +- doc/ci/environments.md | 10 +- doc/ci/examples/deployment/README.md | 2 +- .../deployment/composer-npm-deploy.md | 4 +- doc/ci/examples/php.md | 12 +- doc/ci/examples/test-scala-application.md | 8 +- doc/ci/git_submodules.md | 18 +- doc/ci/pipelines.md | 28 +- doc/ci/quick_start/README.md | 78 +++-- doc/ci/quick_start/img/build_log.png | Bin 24461 -> 35261 bytes doc/ci/quick_start/img/builds_status.png | Bin 24278 -> 19127 bytes doc/ci/quick_start/img/new_commit.png | Bin 4772 -> 5584 bytes doc/ci/quick_start/img/pipelines_status.png | Bin 25494 -> 22872 bytes doc/ci/quick_start/img/runners_activated.png | Bin 12337 -> 18215 bytes .../img/single_commit_status_pending.png | Bin 15785 -> 13631 bytes doc/ci/quick_start/img/status_pending.png | Bin 9521 -> 0 bytes doc/ci/runners/README.md | 139 +++++---- doc/ci/services/mysql.md | 4 +- doc/ci/services/postgres.md | 4 +- doc/ci/services/redis.md | 2 +- doc/ci/ssh_keys/README.md | 6 +- doc/ci/triggers/README.md | 59 ++-- doc/ci/triggers/img/builds_page.png | Bin 29044 -> 20383 bytes doc/ci/triggers/img/trigger_single_build.png | Bin 8233 -> 6585 bytes doc/ci/triggers/img/trigger_variables.png | Bin 3652 -> 3637 bytes doc/ci/triggers/img/triggers_page.png | Bin 5119 -> 5116 bytes doc/ci/variables/README.md | 60 ++-- doc/ci/yaml/README.md | 295 +++++++++--------- doc/development/code_review.md | 2 +- doc/install/installation.md | 2 +- doc/raketasks/backup_restore.md | 4 +- doc/university/glossary/README.md | 74 ++--- .../settings/continuous_integration.md | 6 +- doc/user/permissions.md | 22 +- doc/user/project/builds/artifacts.md | 137 +------- .../builds/img/build_artifacts_browser.png | Bin 3782 -> 0 bytes .../img/build_artifacts_browser_button.png | Bin 4891 -> 0 bytes .../img/build_artifacts_builds_page.png | Bin 22022 -> 0 bytes .../img/build_artifacts_pipelines_page.png | Bin 28339 -> 0 bytes doc/user/project/integrations/webhooks.md | 2 +- doc/user/project/merge_requests/index.md | 2 +- .../merge_when_pipeline_succeeds.md | 12 +- .../project/new_ci_build_permissions_model.md | 82 ++--- doc/user/project/pages/index.md | 10 +- .../pipelines/img/job_artifacts_browser.png | Bin 0 -> 3771 bytes .../img/job_artifacts_browser_button.png | Bin 0 -> 5534 bytes .../img/job_artifacts_builds_page.png | Bin 0 -> 15191 bytes .../img/job_artifacts_pipelines_page.png | Bin 0 -> 16550 bytes .../img/job_latest_artifacts_browser.png} | Bin .../img/pipelines_settings_test_coverage.png | Bin 2603 -> 2549 bytes .../img/pipelines_test_coverage_mr_widget.png | Bin 6391 -> 6375 bytes doc/user/project/pipelines/job_artifacts.md | 118 +++++++ doc/user/project/pipelines/settings.md | 16 +- doc/user/project/slash_commands.md | 2 +- doc/workflow/shortcuts.md | 4 +- doc/workflow/todos.md | 4 +- 63 files changed, 789 insertions(+), 773 deletions(-) create mode 100644 doc/administration/job_artifacts.md delete mode 100644 doc/ci/quick_start/img/status_pending.png delete mode 100644 doc/user/project/builds/img/build_artifacts_browser.png delete mode 100644 doc/user/project/builds/img/build_artifacts_browser_button.png delete mode 100644 doc/user/project/builds/img/build_artifacts_builds_page.png delete mode 100644 doc/user/project/builds/img/build_artifacts_pipelines_page.png create mode 100644 doc/user/project/pipelines/img/job_artifacts_browser.png create mode 100644 doc/user/project/pipelines/img/job_artifacts_browser_button.png create mode 100644 doc/user/project/pipelines/img/job_artifacts_builds_page.png create mode 100644 doc/user/project/pipelines/img/job_artifacts_pipelines_page.png rename doc/user/project/{builds/img/build_latest_artifacts_browser.png => pipelines/img/job_latest_artifacts_browser.png} (100%) create mode 100644 doc/user/project/pipelines/job_artifacts.md diff --git a/doc/administration/build_artifacts.md b/doc/administration/build_artifacts.md index cca422892ec..5a892a35fcc 100644 --- a/doc/administration/build_artifacts.md +++ b/doc/administration/build_artifacts.md @@ -1,96 +1 @@ -# Build artifacts administration - ->**Notes:** ->- Introduced in GitLab 8.2 and GitLab Runner 0.7.0. ->- Starting from GitLab 8.4 and GitLab Runner 1.0, the artifacts archive format - changed to `ZIP`. ->- This is the administration documentation. For the user guide see - [user/project/builds/artifacts.md](../user/project/builds/artifacts.md). - -Artifacts is a list of files and directories which are attached to a build -after it completes successfully. This feature is enabled by default in all -GitLab installations. Keep reading if you want to know how to disable it. - -## Disabling build artifacts - -To disable artifacts site-wide, follow the steps below. - ---- - -**In Omnibus installations:** - -1. Edit `/etc/gitlab/gitlab.rb` and add the following line: - - ```ruby - gitlab_rails['artifacts_enabled'] = false - ``` - -1. Save the file and [reconfigure GitLab][] for the changes to take effect. - ---- - -**In installations from source:** - -1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines: - - ```yaml - artifacts: - enabled: false - ``` - -1. Save the file and [restart GitLab][] for the changes to take effect. - -## Storing build artifacts - -After a successful build, GitLab Runner uploads an archive containing the build -artifacts to GitLab. - -To change the location where the artifacts are stored, follow the steps below. - ---- - -**In Omnibus installations:** - -_The artifacts are stored by default in -`/var/opt/gitlab/gitlab-rails/shared/artifacts`._ - -1. To change the storage path for example to `/mnt/storage/artifacts`, edit - `/etc/gitlab/gitlab.rb` and add the following line: - - ```ruby - gitlab_rails['artifacts_path'] = "/mnt/storage/artifacts" - ``` - -1. Save the file and [reconfigure GitLab][] for the changes to take effect. - ---- - -**In installations from source:** - -_The artifacts are stored by default in -`/home/git/gitlab/shared/artifacts`._ - -1. To change the storage path for example to `/mnt/storage/artifacts`, edit - `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines: - - ```yaml - artifacts: - enabled: true - path: /mnt/storage/artifacts - ``` - -1. Save the file and [restart GitLab][] for the changes to take effect. - -## Set the maximum file size of the artifacts - -Provided the artifacts are enabled, you can change the maximum file size of the -artifacts through the [Admin area settings](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size). - -[reconfigure gitlab]: restart_gitlab.md "How to restart GitLab" -[restart gitlab]: restart_gitlab.md "How to restart GitLab" - -## Storage statistics - -You can see the total storage used for build artifacts on groups and projects -in the administration area, as well as through the [groups](../api/groups.md) -and [projects APIs](../api/projects.md). +This document was moved to [jobs_artifacts](jobs_artifacts.md). diff --git a/doc/administration/job_artifacts.md b/doc/administration/job_artifacts.md new file mode 100644 index 00000000000..7b0610ae414 --- /dev/null +++ b/doc/administration/job_artifacts.md @@ -0,0 +1,114 @@ +# Jobs artifacts administration + +>**Notes:** +>- Introduced in GitLab 8.2 and GitLab Runner 0.7.0. +>- Starting with GitLab 8.4 and GitLab Runner 1.0, the artifacts archive format + changed to `ZIP`. +>- Starting with GitLab 8.17, builds are renamed to jobs. +>- This is the administration documentation. For the user guide see + [pipelines/job_artifacts](../user/project/pipelines/job_artifacts.md). + +Artifacts is a list of files and directories which are attached to a job +after it completes successfully. This feature is enabled by default in all +GitLab installations. Keep reading if you want to know how to disable it. + +## Disabling job artifacts + +To disable artifacts site-wide, follow the steps below. + +--- + +**In Omnibus installations:** + +1. Edit `/etc/gitlab/gitlab.rb` and add the following line: + + ```ruby + gitlab_rails['artifacts_enabled'] = false + ``` + +1. Save the file and [reconfigure GitLab][] for the changes to take effect. + +--- + +**In installations from source:** + +1. Edit `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines: + + ```yaml + artifacts: + enabled: false + ``` + +1. Save the file and [restart GitLab][] for the changes to take effect. + +## Storing job artifacts + +After a successful job, GitLab Runner uploads an archive containing the job +artifacts to GitLab. + +To change the location where the artifacts are stored, follow the steps below. + +--- + +**In Omnibus installations:** + +_The artifacts are stored by default in +`/var/opt/gitlab/gitlab-rails/shared/artifacts`._ + +1. To change the storage path for example to `/mnt/storage/artifacts`, edit + `/etc/gitlab/gitlab.rb` and add the following line: + + ```ruby + gitlab_rails['artifacts_path'] = "/mnt/storage/artifacts" + ``` + +1. Save the file and [reconfigure GitLab][] for the changes to take effect. + +--- + +**In installations from source:** + +_The artifacts are stored by default in +`/home/git/gitlab/shared/artifacts`._ + +1. To change the storage path for example to `/mnt/storage/artifacts`, edit + `/home/git/gitlab/config/gitlab.yml` and add or amend the following lines: + + ```yaml + artifacts: + enabled: true + path: /mnt/storage/artifacts + ``` + +1. Save the file and [restart GitLab][] for the changes to take effect. + +## Set the maximum file size of the artifacts + +Provided the artifacts are enabled, you can change the maximum file size of the +artifacts through the [Admin area settings](../user/admin_area/settings/continuous_integration.md#maximum-artifacts-size). + +## Storage statistics + +You can see the total storage used for job artifacts on groups and projects +in the administration area, as well as through the [groups](../api/groups.md) +and [projects APIs](../api/projects.md). + +## Implementation details + +When GitLab receives an artifacts archive, an archive metadata file is also +generated. This metadata file describes all the entries that are located in the +artifacts archive itself. The metadata file is in a binary format, with +additional GZIP compression. + +GitLab does not extract the artifacts archive in order to save space, memory +and disk I/O. It instead inspects the metadata file which contains all the +relevant information. This is especially important when there is a lot of +artifacts, or an archive is a very large file. + +When clicking on a specific file, [GitLab Workhorse] extracts it +from the archive and the download begins. This implementation saves space, +memory and disk I/O. + +[reconfigure gitlab]: restart_gitlab.md "How to restart GitLab" +[restart gitlab]: restart_gitlab.md "How to restart GitLab" +[gitlab workhorse]: https://gitlab.com/gitlab-org/gitlab-workhorse "GitLab Workhorse repository" diff --git a/doc/ci/README.md b/doc/ci/README.md index dd14698e9cd..cbab7c9f18d 100644 --- a/doc/ci/README.md +++ b/doc/ci/README.md @@ -2,22 +2,22 @@ ## CI User documentation -- [Get started with GitLab CI](quick_start/README.md) +- [Getting started with GitLab CI](quick_start/README.md) - [CI examples for various languages](examples/README.md) - [Learn how to enable or disable GitLab CI](enable_or_disable_ci.md) -- [Pipelines and builds](pipelines.md) +- [Pipelines and jobs](pipelines.md) - [Environments and deployments](environments.md) - [Learn how `.gitlab-ci.yml` works](yaml/README.md) -- [Configure a Runner, the application that runs your builds](runners/README.md) +- [Configure a Runner, the application that runs your jobs](runners/README.md) - [Use Docker images with GitLab Runner](docker/using_docker_images.md) - [Use CI to build Docker images](docker/using_docker_build.md) - [CI Variables](variables/README.md) - Learn how to use variables defined in your `.gitlab-ci.yml` or secured ones defined in your project's settings - [Use SSH keys in your build environment](ssh_keys/README.md) -- [Trigger builds through the API](triggers/README.md) -- [Build artifacts](../user/project/builds/artifacts.md) +- [Trigger jobs through the API](triggers/README.md) +- [Job artifacts](../user/project/pipelines/job_artifacts.md) - [User permissions](../user/permissions.md#gitlab-ci) -- [Build permissions](../user/permissions.md#build-permissions) +- [Jobs permissions](../user/permissions.md#jobs-permissions) - [API](../api/ci/README.md) - [CI services (linked docker containers)](services/README.md) - [CI/CD pipelines settings](../user/project/pipelines/settings.md) @@ -27,6 +27,6 @@ ## Breaking changes -- [New CI build permissions model](../user/project/new_ci_build_permissions_model.md) - Read about what changed in GitLab 8.12 and how that affects your builds. - There's a new way to access your Git submodules and LFS objects in builds. +- [New CI job permissions model](../user/project/new_ci_build_permissions_model.md) + Read about what changed in GitLab 8.12 and how that affects your jobs. + There's a new way to access your Git submodules and LFS objects in jobs. diff --git a/doc/ci/build_artifacts/README.md b/doc/ci/build_artifacts/README.md index 05605f10fb4..e7692b8b9a2 100644 --- a/doc/ci/build_artifacts/README.md +++ b/doc/ci/build_artifacts/README.md @@ -1,4 +1 @@ -This document was moved to: - -- [user/project/builds/artifacts.md](../../user/project/builds/artifacts.md) - user guide -- [administration/build_artifacts.md](../../administration/build_artifacts.md) - administrator guide +This document was moved to [user/project/job_artifacts.md](../../user/project/job_artifacts.md). diff --git a/doc/ci/docker/README.md b/doc/ci/docker/README.md index 84eaf29efd1..99669a9272a 100644 --- a/doc/ci/docker/README.md +++ b/doc/ci/docker/README.md @@ -1,4 +1,4 @@ # Docker integration -+ [Using Docker Images](using_docker_images.md) -+ [Using Docker Build](using_docker_build.md) \ No newline at end of file +- [Using Docker Images](using_docker_images.md) +- [Using Docker Build](using_docker_build.md) diff --git a/doc/ci/docker/using_docker_build.md b/doc/ci/docker/using_docker_build.md index 28141cced3b..2b3082acd5d 100644 --- a/doc/ci/docker/using_docker_build.md +++ b/doc/ci/docker/using_docker_build.md @@ -12,6 +12,7 @@ One of the new trends in Continuous Integration/Deployment is to: 1. deploy to a server from the pushed image. It's also useful when your application already has the `Dockerfile` that can be used to create and test an image: + ```bash $ docker build -t my-image dockerfiles/ $ docker run my-docker-image /script/to/run/tests @@ -19,23 +20,23 @@ $ docker tag my-image my-registry:5000/my-image $ docker push my-registry:5000/my-image ``` -This requires special configuration of GitLab Runner to enable `docker` support during builds. +This requires special configuration of GitLab Runner to enable `docker` support during jobs. ## Runner Configuration -There are three methods to enable the use of `docker build` and `docker run` during builds; each with their own tradeoffs. +There are three methods to enable the use of `docker build` and `docker run` during jobs; each with their own tradeoffs. ### Use shell executor The simplest approach is to install GitLab Runner in `shell` execution mode. -GitLab Runner then executes build scripts as the `gitlab-runner` user. +GitLab Runner then executes job scripts as the `gitlab-runner` user. 1. Install [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/#installation). -1. During GitLab Runner installation select `shell` as method of executing build scripts or use command: +1. During GitLab Runner installation select `shell` as method of executing job scripts or use command: ```bash - $ sudo gitlab-ci-multi-runner register -n \ + sudo gitlab-ci-multi-runner register -n \ --url https://gitlab.com/ci \ --registration-token REGISTRATION_TOKEN \ --executor shell \ @@ -50,16 +51,17 @@ GitLab Runner then executes build scripts as the `gitlab-runner` user. 3. Add `gitlab-runner` user to `docker` group: ```bash - $ sudo usermod -aG docker gitlab-runner + sudo usermod -aG docker gitlab-runner ``` 4. Verify that `gitlab-runner` has access to Docker: ```bash - $ sudo -u gitlab-runner -H docker info + sudo -u gitlab-runner -H docker info ``` You can now verify that everything works by adding `docker info` to `.gitlab-ci.yml`: + ```yaml before_script: - docker info @@ -80,12 +82,12 @@ For more information please read [On Docker security: `docker` group considered The second approach is to use the special docker-in-docker (dind) [Docker image](https://hub.docker.com/_/docker/) with all tools installed -(`docker` and `docker-compose`) and run the build script in context of that +(`docker` and `docker-compose`) and run the job script in context of that image in privileged mode. In order to do that, follow the steps: -1. Install [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/#installation). +1. Install [GitLab Runner](https://docs.gitlab.com/runner/install). 1. Register GitLab Runner from the command line to use `docker` and `privileged` mode: @@ -155,10 +157,10 @@ not without its own challenges: escalation which can lead to container breakout. For more information, check out the official Docker documentation on [Runtime privilege and Linux capabilities][docker-cap]. -- Using docker-in-docker, each build is in a clean environment without the past - history. Concurrent builds work fine because every build gets it's own +- When using docker-in-docker, each job is in a clean environment without the past + history. Concurrent jobs work fine because every build gets it's own instance of Docker engine so they won't conflict with each other. But this - also means builds can be slower because there's no caching of layers. + also means jobs can be slower because there's no caching of layers. - By default, `docker:dind` uses `--storage-driver vfs` which is the slowest form offered. To use a different driver, see [Using the overlayfs driver](#using-the-overlayfs-driver). @@ -171,7 +173,7 @@ The third approach is to bind-mount `/var/run/docker.sock` into the container so In order to do that, follow the steps: -1. Install [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/#installation). +1. Install [GitLab Runner](https://docs.gitlab.com/runner/install). 1. Register GitLab Runner from the command line to use `docker` and share `/var/run/docker.sock`: @@ -187,7 +189,9 @@ In order to do that, follow the steps: The above command will register a new Runner to use the special `docker:latest` image which is provided by Docker. **Notice that it's using - the Docker daemon of the Runner itself, and any containers spawned by docker commands will be siblings of the Runner rather than children of the runner.** This may have complications and limitations that are unsuitable for your workflow. + the Docker daemon of the Runner itself, and any containers spawned by docker + commands will be siblings of the Runner rather than children of the runner.** + This may have complications and limitations that are unsuitable for your workflow. The above command will create a `config.toml` entry similar to this: @@ -206,7 +210,8 @@ In order to do that, follow the steps: Insecure = false ``` -1. You can now use `docker` in the build script (note that you don't need to include the `docker:dind` service as when using the Docker in Docker executor): +1. You can now use `docker` in the build script (note that you don't need to + include the `docker:dind` service as when using the Docker in Docker executor): ```yaml image: docker:latest @@ -221,18 +226,23 @@ In order to do that, follow the steps: - docker run my-docker-image /script/to/run/tests ``` -While the above method avoids using Docker in privileged mode, you should be aware of the following implications: -* By sharing the docker daemon, you are effectively disabling all -the security mechanisms of containers and exposing your host to privilege -escalation which can lead to container breakout. For example, if a project -ran `docker rm -f $(docker ps -a -q)` it would remove the GitLab Runner -containers. -* Concurrent builds may not work; if your tests -create containers with specific names, they may conflict with each other. -* Sharing files and directories from the source repo into containers may not -work as expected since volume mounting is done in the context of the host -machine, not the build container. -e.g. `docker run --rm -t -i -v $(pwd)/src:/home/app/src test-image:latest run_app_tests` +While the above method avoids using Docker in privileged mode, you should be +aware of the following implications: + +- By sharing the docker daemon, you are effectively disabling all + the security mechanisms of containers and exposing your host to privilege + escalation which can lead to container breakout. For example, if a project + ran `docker rm -f $(docker ps -a -q)` it would remove the GitLab Runner + containers. +- Concurrent jobs may not work; if your tests + create containers with specific names, they may conflict with each other. +- Sharing files and directories from the source repo into containers may not + work as expected since volume mounting is done in the context of the host + machine, not the build container, e.g.: + + ``` + docker run --rm -t -i -v $(pwd)/src:/home/app/src test-image:latest run_app_tests + ``` ## Using the OverlayFS driver @@ -299,7 +309,7 @@ push to the Registry connected to your project. Its password is provided in the of your Docker images. Here's a more elaborate example that splits up the tasks into 4 pipeline stages, -including two tests that run in parallel. The build is stored in the container +including two tests that run in parallel. The `build` is stored in the container registry and used by subsequent stages, downloading the image when needed. Changes to `master` also get tagged as `latest` and deployed using an application-specific deploy script: @@ -360,17 +370,17 @@ deploy: Some things you should be aware of when using the Container Registry: - You must log in to the container registry before running commands. Putting - this in `before_script` will run it before each build job. + this in `before_script` will run it before each job. - Using `docker build --pull` makes sure that Docker fetches any changes to base images before building just in case your cache is stale. It takes slightly longer, but means you don’t get stuck without security patches to base images. - Doing an explicit `docker pull` before each `docker run` makes sure to fetch the latest image that was just built. This is especially important if you are using multiple runners that cache images locally. Using the git SHA in your - image tag makes this less necessary since each build will be unique and you + image tag makes this less necessary since each job will be unique and you shouldn't ever have a stale image, but it's still possible if you re-build a given commit after a dependency has changed. -- You don't want to build directly to `latest` in case there are multiple builds +- You don't want to build directly to `latest` in case there are multiple jobs happening simultaneously. [docker-in-docker]: https://blog.docker.com/2013/09/docker-can-now-run-within-docker/ diff --git a/doc/ci/docker/using_docker_images.md b/doc/ci/docker/using_docker_images.md index aba77490915..9dee61bfa1f 100644 --- a/doc/ci/docker/using_docker_images.md +++ b/doc/ci/docker/using_docker_images.md @@ -8,7 +8,7 @@ run applications in independent "containers" that are run within a single Linux instance. [Docker Hub][hub] has a rich database of pre-built images that can be used to test and build your applications. -Docker, when used with GitLab CI, runs each build in a separate and isolated +Docker, when used with GitLab CI, runs each job in a separate and isolated container using the predefined image that is set up in [`.gitlab-ci.yml`](../yaml/README.md). @@ -45,12 +45,12 @@ can be found at [Docker Hub][hub]. For more information about images and Docker Hub please read the [Docker Fundamentals][] documentation. In short, with `image` we refer to the docker image, which will be used to -create a container on which your build will run. +create a container on which your job will run. ## What is a service The `services` keyword defines just another docker image that is run during -your build and is linked to the docker image that the `image` keyword defines. +your job and is linked to the docker image that the `image` keyword defines. This allows you to access the service image during build time. The service image can run any application, but the most common use case is to @@ -61,13 +61,13 @@ time the project is built. You can see some widely used services examples in the relevant documentation of [CI services examples](../services/README.md). -### How services are linked to the build +### How services are linked to the job To better understand how the container linking works, read [Linking containers together][linking-containers]. To summarize, if you add `mysql` as service to your application, the image will -then be used to create a container that is linked to the build container. +then be used to create a container that is linked to the job container. The service container for MySQL will be accessible under the hostname `mysql`. So, in order to access your database service you have to connect to the host @@ -133,7 +133,7 @@ Look for the `[runners.docker]` section: services = ["mysql:latest", "postgres:latest"] ``` -The image and services defined this way will be added to all builds run by +The image and services defined this way will be added to all job run by that runner. ## Define an image from a private Docker registry @@ -167,7 +167,7 @@ services: - tutum/wordpress:latest ``` -When the build is run, `tutum/wordpress` will be started and you will have +When the job is run, `tutum/wordpress` will be started and you will have access to it from your build container under the hostname `tutum__wordpress`. The alias hostname for the service is made from the image name following these @@ -202,21 +202,21 @@ See the specific documentation for ## How Docker integration works -Below is a high level overview of the steps performed by docker during build +Below is a high level overview of the steps performed by docker during job time. 1. Create any service container: `mysql`, `postgresql`, `mongodb`, `redis`. 1. Create cache container to store all volumes as defined in `config.toml` and `Dockerfile` of build image (`ruby:2.1` as in above example). 1. Create build container and link any service container to build container. -1. Start build container and send build script to the container. -1. Run build script. +1. Start build container and send job script to the container. +1. Run job script. 1. Checkout code in: `/builds/group-name/project-name/`. 1. Run any step defined in `.gitlab-ci.yml`. 1. Check exit status of build script. 1. Remove build container and all created service containers. -## How to debug a build locally +## How to debug a job locally *Note: The following commands are run without root privileges. You should be able to run docker with your regular user account.* diff --git a/doc/ci/enable_or_disable_ci.md b/doc/ci/enable_or_disable_ci.md index 7971daf2637..796a025b951 100644 --- a/doc/ci/enable_or_disable_ci.md +++ b/doc/ci/enable_or_disable_ci.md @@ -12,7 +12,7 @@ API. --- GitLab CI is exposed via the `/pipelines` and `/builds` pages of a project. -Disabling GitLab CI in a project does not delete any previous builds. +Disabling GitLab CI in a project does not delete any previous jobs. In fact, the `/pipelines` and `/builds` pages can still be accessed, although it's hidden from the left sidebar menu. diff --git a/doc/ci/environments.md b/doc/ci/environments.md index cb62ed723f0..3bba94f8b83 100644 --- a/doc/ci/environments.md +++ b/doc/ci/environments.md @@ -75,7 +75,7 @@ We have defined 3 [stages](yaml/README.md#stages): - deploy The jobs assigned to these stages will run in this order. If a job fails, then -the builds that are assigned to the next stage won't run, rendering the pipeline +the jobs that are assigned to the next stage won't run, rendering the pipeline as failed. In our case, the `test` job will run first, then the `build` and lastly the `deploy_staging`. With this, we ensure that first the tests pass, then our app is able to be built successfully, and lastly we deploy to the @@ -119,7 +119,7 @@ There's a bunch of information there, specifically you can see: - The environment's name with a link to its deployments - The last deployment ID number and who performed it -- The build ID of the last deployment with its respective job name +- The job ID of the last deployment with its respective job name - The commit information of the last deployment such as who committed, to what branch and the Git SHA of the commit - The exact time the last deployment was performed @@ -219,9 +219,9 @@ deploy_prod: The `when: manual` action exposes a play button in GitLab's UI and the `deploy_prod` job will only be triggered if and when we click that play button. -You can find it in the pipeline, build, environment, and deployment views. +You can find it in the pipeline, job, environment, and deployment views. -| Pipelines | Single pipeline | Environments | Deployments | Builds | +| Pipelines | Single pipeline | Environments | Deployments | jobs | | --------- | ----------------| ------------ | ----------- | -------| | ![Pipelines manual action](img/environments_manual_action_pipelines.png) | ![Pipelines manual action](img/environments_manual_action_single_pipeline.png) | ![Environments manual action](img/environments_manual_action_environments.png) | ![Deployments manual action](img/environments_manual_action_deployments.png) | ![Builds manual action](img/environments_manual_action_builds.png) | @@ -419,7 +419,7 @@ Behind the scenes: - GitLab Runner picks up the changes and starts running the jobs - The jobs run sequentially as defined in `stages` - First, the tests pass - - Then, the build begins and successfully also passes + - Then, the job begins and successfully also passes - Lastly, the app is deployed to an environment with a name specific to the branch diff --git a/doc/ci/examples/deployment/README.md b/doc/ci/examples/deployment/README.md index 7d91ce6710f..d28aa282825 100644 --- a/doc/ci/examples/deployment/README.md +++ b/doc/ci/examples/deployment/README.md @@ -91,7 +91,7 @@ Secure Variables can added by going to `Project > Variables > Add Variable`. **This feature requires `gitlab-runner` with version equal or greater than 0.4.0.** The variables that are defined in the project settings are sent along with the build script to the runner. The secure variables are stored out of the repository. Never store secrets in your projects' .gitlab-ci.yml. -It is also important that secret's value is hidden in the build log. +It is also important that secret's value is hidden in the job log. You access added variable by prefixing it's name with `$` (on non-Windows runners) or `%` (for Windows Batch runners): 1. `$SECRET_VARIABLE` - use it for non-Windows runners diff --git a/doc/ci/examples/deployment/composer-npm-deploy.md b/doc/ci/examples/deployment/composer-npm-deploy.md index 5334a73e1f5..8b0d8a003fd 100644 --- a/doc/ci/examples/deployment/composer-npm-deploy.md +++ b/doc/ci/examples/deployment/composer-npm-deploy.md @@ -65,7 +65,7 @@ In order, this means that: 1. We check if the `ssh-agent` is available and we install it if it's not; 2. We create the `~/.ssh` folder; 3. We make sure we're running bash; -4. We disable host checking (we don't ask for user accept when we first connect to a server; and since every build will equal a first connect, we kind of need this) +4. We disable host checking (we don't ask for user accept when we first connect to a server; and since every job will equal a first connect, we kind of need this) And this is basically all you need in the `before_script` section. @@ -153,4 +153,4 @@ stage_deploy: - scp -P22 -r build/* server_user@server_host:htdocs/wp-content/themes/_tmp - ssh -p22 server_user@server_host "mv htdocs/wp-content/themes/live htdocs/wp-content/themes/_old && mv htdocs/wp-content/themes/_tmp htdocs/wp-content/themes/live" - ssh -p22 server_user@server_host "rm -rf htdocs/wp-content/themes/_old" -``` \ No newline at end of file +``` diff --git a/doc/ci/examples/php.md b/doc/ci/examples/php.md index 5eeec92d976..f2dd12b67d3 100644 --- a/doc/ci/examples/php.md +++ b/doc/ci/examples/php.md @@ -15,10 +15,10 @@ This will allow us to test PHP projects against different versions of PHP. However, not everything is plug 'n' play, you still need to configure some things manually. -As with every build, you need to create a valid `.gitlab-ci.yml` describing the +As with every job, you need to create a valid `.gitlab-ci.yml` describing the build environment. -Let's first specify the PHP image that will be used for the build process +Let's first specify the PHP image that will be used for the job process (you can read more about what an image means in the Runner's lingo reading about [Using Docker images](../docker/using_docker_images.md#what-is-image)). @@ -58,8 +58,8 @@ docker-php-ext-install pdo_mysql ``` You might wonder what `docker-php-ext-install` is. In short, it is a script -provided by the official php docker image that you can use to easilly install -extensions. For more information read the the documentation at +provided by the official php docker image that you can use to easily install +extensions. For more information read the documentation at . Now that we created the script that contains all prerequisites for our build @@ -142,7 +142,7 @@ Of course, `my_php.ini` must be present in the root directory of your repository ## Test PHP projects using the Shell executor -The shell executor runs your builds in a terminal session on your server. +The shell executor runs your job in a terminal session on your server. Thus, in order to test your projects you first need to make sure that all dependencies are installed. @@ -280,7 +280,7 @@ that runs on [GitLab.com](https://gitlab.com) using our publicly available [shared runners](../runners/README.md). Want to hack on it? Simply fork it, commit and push your changes. Within a few -moments the changes will be picked by a public runner and the build will begin. +moments the changes will be picked by a public runner and the job will begin. [php-hub]: https://hub.docker.com/r/_/php/ [phpenv]: https://github.com/phpenv/phpenv diff --git a/doc/ci/examples/test-scala-application.md b/doc/ci/examples/test-scala-application.md index 85f8849fa99..01c13941c21 100644 --- a/doc/ci/examples/test-scala-application.md +++ b/doc/ci/examples/test-scala-application.md @@ -51,14 +51,14 @@ The `deploy` stage automatically deploys the project to Heroku using dpl. You can use other versions of Scala and SBT by defining them in `build.sbt`. -## Display test coverage in build +## Display test coverage in job Add the `Coverage was \[\d+.\d+\%\]` regular expression in the -**Settings ➔ Edit Project ➔ Test coverage parsing** project setting to +**Settings ➔ CI/CD Pipelines ➔ Coverage report** project setting to retrieve the [test coverage] rate from the build trace and have it -displayed with your builds. +displayed with your jobs. -**Builds** must be enabled for this option to appear. +**Pipelines** must be enabled for this option to appear. ## Heroku application diff --git a/doc/ci/git_submodules.md b/doc/ci/git_submodules.md index 869743ce80a..36c6e153d95 100644 --- a/doc/ci/git_submodules.md +++ b/doc/ci/git_submodules.md @@ -1,14 +1,14 @@ # Using Git submodules with GitLab CI > **Notes:** -- GitLab 8.12 introduced a new [CI build permissions model][newperms] and you +- GitLab 8.12 introduced a new [CI job permissions model][newperms] and you are encouraged to upgrade your GitLab instance if you haven't done already. If you are **not** using GitLab 8.12 or higher, you would need to work your way around submodules in order to access the sources of e.g., `gitlab.com/group/project` with the use of [SSH keys](ssh_keys/README.md). -- With GitLab 8.12 onward, your permissions are used to evaluate what a CI build +- With GitLab 8.12 onward, your permissions are used to evaluate what a CI job can access. More information about how this system works can be found in the - [Build permissions model](../user/permissions.md#builds-permissions). + [Jobs permissions model](../user/permissions.md#jobs-permissions). - The HTTP(S) Git protocol [must be enabled][gitpro] in your GitLab instance. ## Configuring the `.gitmodules` file @@ -27,7 +27,7 @@ Let's consider the following example: If you are using GitLab 8.12+ and your submodule is on the same GitLab server, you must update your `.gitmodules` file to use **relative URLs**. Since Git allows the usage of relative URLs for your `.gitmodules` configuration, -this easily allows you to use HTTP(S) for cloning all your CI builds and SSH +this easily allows you to use HTTP(S) for cloning all your CI jobs and SSH for all your local checkouts. The `.gitmodules` would look like: ```ini @@ -38,7 +38,7 @@ for all your local checkouts. The `.gitmodules` would look like: The above configuration will instruct Git to automatically deduce the URL that should be used when cloning sources. Whether you use HTTP(S) or SSH, Git will use -that same channel and it will allow to make all your CI builds use HTTP(S) +that same channel and it will allow to make all your CI jobs use HTTP(S) (because GitLab CI only uses HTTP(S) for cloning your sources), and all your local clones will continue using SSH. @@ -57,13 +57,13 @@ Once `.gitmodules` is correctly configured, you can move on to ## Using Git submodules in your CI jobs There are a few steps you need to take in order to make submodules work -correctly with your CI builds: +correctly with your CI jobs: 1. First, make sure you have used [relative URLs](#configuring-the-gitmodules-file) for the submodules located in the same GitLab server. 1. Next, if you are using `gitlab-ci-multi-runner` v1.10+, you can set the `GIT_SUBMODULE_STRATEGY` variable to either `normal` or `recursive` to tell - the runner to fetch your submodules before the build: + the runner to fetch your submodules before the job: ```yaml variables: GIT_SUBMODULE_STRATEGY: recursive @@ -87,9 +87,9 @@ The rationale to set the `sync` and `update` in `before_script` is because of the way Git submodules work. On a fresh Runner workspace, Git will set the submodule URL including the token in `.git/config` (or `.git/modules//config`) based on `.gitmodules` and the current -remote URL. On subsequent builds on the same Runner, `.git/config` is cached +remote URL. On subsequent jobs on the same Runner, `.git/config` is cached and already contains a full URL for the submodule, corresponding to the previous -build, and to **a token from a previous build**. `sync` allows to force updating +job, and to **a token from a previous job**. `sync` allows to force updating the full URL. [gitpro]: ../user/admin_area/settings/visibility_and_access_controls.md#enabled-git-access-protocols diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index ab289876252..3134405e10b 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -1,14 +1,14 @@ -# Introduction to pipelines and builds +# Introduction to pipelines and jobs >**Note:** Introduced in GitLab 8.8. ## Pipelines -A pipeline is a group of [builds][] that get executed in [stages][](batches). -All of the builds in a stage are executed in parallel (if there are enough +A pipeline is a group of [jobs][] that get executed in [stages][](batches). +All of the jobs in a stage are executed in parallel (if there are enough concurrent [Runners]), and if they all succeed, the pipeline moves on to the -next stage. If one of the builds fails, the next stage is not (usually) +next stage. If one of the jobs fails, the next stage is not (usually) executed. ![Pipelines example](img/pipelines.png) @@ -35,10 +35,10 @@ Example continuous delivery flow: ![CD Flow](img/pipelines-goal.svg) -## Builds +## Jobs -Builds are individual runs of [jobs]. Not to be confused with a `build` job or -`build` stage. +Jobs can be defined in the [`.gitlab-ci.yml`][jobs-yaml] file. Not to be +confused with a `build` job or `build` stage. ## Defining pipelines @@ -52,11 +52,11 @@ See full [documentation](yaml/README.md#jobs). You can find the current and historical pipeline runs under **Pipelines** for your project. -## Seeing build status +## Seeing job status -Clicking on a pipeline will show the builds that were run for that pipeline. -Clicking on an individual build will show you its build trace, and allow you to -cancel the build, retry it, or erase the build trace. +Clicking on a pipeline will show the jobs that were run for that pipeline. +Clicking on an individual job will show you its job trace, and allow you to +cancel the job, retry it, or erase the job trace. ## How the pipeline duration is calculated @@ -91,11 +91,11 @@ total running time should be: ## Badges -Build status and test coverage report badges are available. You can find their +Job status and test coverage report badges are available. You can find their respective link in the [Pipelines settings] page. -[builds]: #builds -[jobs]: yaml/README.md#jobs +[jobs]: #jobs +[jobs-yaml]: yaml/README.md#jobs [stages]: yaml/README.md#stages [runners]: runners/README.html [pipelines settings]: ../user/project/pipelines/settings.md diff --git a/doc/ci/quick_start/README.md b/doc/ci/quick_start/README.md index 1104edaabe9..2a5401ac13a 100644 --- a/doc/ci/quick_start/README.md +++ b/doc/ci/quick_start/README.md @@ -1,4 +1,4 @@ -# Quick Start +# Getting started with GitLab CI >**Note:** Starting from version 8.0, GitLab [Continuous Integration][ci] (CI) is fully integrated into GitLab itself and is [enabled] by default on all @@ -7,7 +7,7 @@ projects. GitLab offers a [continuous integration][ci] service. If you [add a `.gitlab-ci.yml` file][yaml] to the root directory of your repository, and configure your GitLab project to use a [Runner], then each merge request or -push triggers your CI [pipeline]. +push, triggers your CI [pipeline]. The `.gitlab-ci.yml` file tells the GitLab runner what to do. By default it runs a pipeline with three [stages]: `build`, `test`, and `deploy`. You don't need to @@ -31,13 +31,13 @@ So in brief, the steps needed to have a working CI can be summed up to: From there on, on every push to your Git repository, the Runner will automagically start the pipeline and the pipeline will appear under the -project's `/pipelines` page. +project's **Pipelines** page. --- This guide assumes that you: -- have a working GitLab instance of version 8.0 or higher or are using +- have a working GitLab instance of version 8.0+r or are using [GitLab.com](https://gitlab.com) - have a project in GitLab that you would like to use CI for @@ -54,7 +54,7 @@ The `.gitlab-ci.yml` file is where you configure what CI does with your project. It lives in the root of your repository. On any push to your repository, GitLab will look for the `.gitlab-ci.yml` -file and start builds on _Runners_ according to the contents of the file, +file and start jobs on _Runners_ according to the contents of the file, for that commit. Because `.gitlab-ci.yml` is in the repository and is version controlled, old @@ -63,11 +63,12 @@ have different pipelines and jobs, and you have a single source of truth for CI. You can read more about the reasons why we are using `.gitlab-ci.yml` [in our blog about it][blog-ci]. -**Note:** `.gitlab-ci.yml` is a [YAML](https://en.wikipedia.org/wiki/YAML) file -so you have to pay extra attention to indentation. Always use spaces, not tabs. - ### Creating a simple `.gitlab-ci.yml` file +>**Note:** +`.gitlab-ci.yml` is a [YAML](https://en.wikipedia.org/wiki/YAML) file +so you have to pay extra attention to indentation. Always use spaces, not tabs. + You need to create a file named `.gitlab-ci.yml` in the root directory of your repository. Below is an example for a Ruby on Rails project. @@ -88,7 +89,7 @@ rubocop: - bundle exec rubocop ``` -This is the simplest possible build configuration that will work for most Ruby +This is the simplest possible configuration that will work for most Ruby applications: 1. Define two jobs `rspec` and `rubocop` (the names are arbitrary) with @@ -98,22 +99,22 @@ applications: The `.gitlab-ci.yml` file defines sets of jobs with constraints of how and when they should be run. The jobs are defined as top-level elements with a name (in our case `rspec` and `rubocop`) and always have to contain the `script` keyword. -Jobs are used to create builds, which are then picked by +Jobs are used to create jobs, which are then picked by [Runners](../runners/README.md) and executed within the environment of the Runner. What is important is that each job is run independently from each other. If you want to check whether your `.gitlab-ci.yml` file is valid, there is a Lint tool under the page `/ci/lint` of your GitLab instance. You can also find -a "CI Lint" button to go to this page under **Pipelines > Pipelines** and -**Pipelines > Builds** in your project. +a "CI Lint" button to go to this page under **Pipelines ➔ Pipelines** and +**Pipelines ➔ Jobs** in your project. For more information and a complete `.gitlab-ci.yml` syntax, please read -[the documentation on .gitlab-ci.yml](../yaml/README.md). +[the reference documentation on .gitlab-ci.yml](../yaml/README.md). ### Push `.gitlab-ci.yml` to GitLab -Once you've created `.gitlab-ci.yml`, you should add it to your git repository +Once you've created `.gitlab-ci.yml`, you should add it to your Git repository and push it to GitLab. ```bash @@ -125,28 +126,27 @@ git push origin master Now if you go to the **Pipelines** page you will see that the pipeline is pending. -You can also go to the **Commits** page and notice the little clock icon next +You can also go to the **Commits** page and notice the little pause icon next to the commit SHA. ![New commit pending](img/new_commit.png) -Clicking on the clock icon you will be directed to the builds page for that -specific commit. +Clicking on it you will be directed to the jobs page for that specific commit. -![Single commit builds page](img/single_commit_status_pending.png) +![Single commit jobs page](img/single_commit_status_pending.png) Notice that there are two jobs pending which are named after what we wrote in `.gitlab-ci.yml`. The red triangle indicates that there is no Runner configured -yet for these builds. +yet for these jobs. -The next step is to configure a Runner so that it picks the pending builds. +The next step is to configure a Runner so that it picks the pending jobs. ## Configuring a Runner -In GitLab, Runners run the builds that you define in `.gitlab-ci.yml`. A Runner +In GitLab, Runners run the jobs that you define in `.gitlab-ci.yml`. A Runner can be a virtual machine, a VPS, a bare-metal machine, a docker container or even a cluster of containers. GitLab and the Runners communicate through an API, -so the only requirement is that the Runner's machine has Internet access. +so the only requirement is that the Runner's machine has [Internet] access. A Runner can be specific to a certain project or serve multiple projects in GitLab. If it serves all projects it's called a _Shared Runner_. @@ -155,9 +155,9 @@ Find more information about different Runners in the [Runners](../runners/README.md) documentation. You can find whether any Runners are assigned to your project by going to -**Settings > Runners**. Setting up a Runner is easy and straightforward. The -official Runner supported by GitLab is written in Go and can be found at -. +**Settings ➔ Runners**. Setting up a Runner is easy and straightforward. The +official Runner supported by GitLab is written in Go and its documentation +can be found at . In order to have a functional Runner you need to follow two steps: @@ -167,28 +167,25 @@ In order to have a functional Runner you need to follow two steps: Follow the links above to set up your own Runner or use a Shared Runner as described in the next section. -For other types of unofficial Runners written in other languages, see the -[instructions for the various GitLab Runners](https://about.gitlab.com/gitlab-ci/#gitlab-runner). - Once the Runner has been set up, you should see it on the Runners page of your -project, following **Settings > Runners**. +project, following **Settings ➔ Runners**. ![Activated runners](img/runners_activated.png) ### Shared Runners -If you use [GitLab.com](https://gitlab.com/) you can use **Shared Runners** +If you use [GitLab.com](https://gitlab.com/) you can use the **Shared Runners** provided by GitLab Inc. These are special virtual machines that run on GitLab's infrastructure and can build any project. -To enable **Shared Runners** you have to go to your project's -**Settings > Runners** and click **Enable shared runners**. +To enable the **Shared Runners** you have to go to your project's +**Settings ➔ Runners** and click **Enable shared runners**. [Read more on Shared Runners](../runners/README.md). -## Seeing the status of your pipeline and builds +## Seeing the status of your pipeline and jobs After configuring the Runner successfully, you should see the status of your last commit change from _pending_ to either _running_, _success_ or _failed_. @@ -197,23 +194,23 @@ You can view all pipelines by going to the **Pipelines** page in your project. ![Commit status](img/pipelines_status.png) -Or you can view all builds, by going to the **Pipelines > Builds** page. +Or you can view all jobs, by going to the **Pipelines ➔ Jobs** page. ![Commit status](img/builds_status.png) -By clicking on a Build ID, you will be able to see the log of that build. -This is important to diagnose why a build failed or acted differently than +By clicking on a job's status, you will be able to see the log of that job. +This is important to diagnose why a job failed or acted differently than you expected. ![Build log](img/build_log.png) You are also able to view the status of any commit in the various pages in -GitLab, such as **Commits** and **Merge Requests**. +GitLab, such as **Commits** and **Merge requests**. ## Enabling build emails If you want to receive e-mail notifications about the result status of the -builds, you should explicitly enable the **Builds Emails** service under your +jobs, you should explicitly enable the **Builds Emails** service under your project's settings. For more information read the @@ -224,9 +221,7 @@ For more information read the Visit the [examples README][examples] to see a list of examples using GitLab CI with various languages. -Awesome! You started using CI in GitLab! - -[runner-install]: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/tree/master#install-gitlab-runner +[runner-install]: https://docs.gitlab.com/runner/install/ [blog-ci]: https://about.gitlab.com/2015/05/06/why-were-replacing-gitlab-ci-jobs-with-gitlab-ci-dot-yml/ [examples]: ../examples/README.md [ci]: https://about.gitlab.com/gitlab-ci/ @@ -235,3 +230,4 @@ Awesome! You started using CI in GitLab! [enabled]: ../enable_or_disable_ci.md [stages]: ../yaml/README.md#stages [pipeline]: ../pipelines.md +[internet]: https://about.gitlab.com/images/theinternet.png diff --git a/doc/ci/quick_start/img/build_log.png b/doc/ci/quick_start/img/build_log.png index 87643d62d583efe8417ce826d03eff9d41a09cf1..3a7248ca772700ce04270b7844437de7af6cd9f4 100644 GIT binary patch literal 35261 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 diff --git a/doc/ci/quick_start/img/builds_status.png b/doc/ci/quick_start/img/builds_status.png index d287ae3064f132fa04706f43292e36b50f519632..f829240f3b3329de605e62d6eec76e869a2a79b1 100644 GIT binary patch literal 19127 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 zq$%ba$|VE>b*L%|z*-0{Fsc(|xDElKJyehf000000000000000000000000000000 z00000000000000000000000000002sJs|)95TL;D00000000000+9a!SV?G$uN=t7 P00000NkvXXu0mjfiZVc( literal 24278 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 B*%kl* literal 4772 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 TAa=qM;1i&xqODvFvWfT~4fsYt diff --git a/doc/ci/quick_start/img/pipelines_status.png b/doc/ci/quick_start/img/pipelines_status.png index 53ccc49bd66a383b5c757183014a67b4af2f4acc..06d1559f5d26918aa7b8d1d396b396308a1f3b5f 100644 GIT binary patch literal 22872 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 D%Fvtt literal 25494 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 diff --git a/doc/ci/quick_start/img/runners_activated.png b/doc/ci/quick_start/img/runners_activated.png index 5ce6fe8e17c6b8fdd5828338adc9046f80203f61..cd83c1a7e4c4f8f87f0d054b8605384d99a6fcc8 100644 GIT binary patch literal 18215 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 literal 12337 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 JVi7&R{{dXx+t>gA diff --git a/doc/ci/quick_start/img/single_commit_status_pending.png b/doc/ci/quick_start/img/single_commit_status_pending.png index 91fc9011847ee956fcef91d8f443dcf54800b6ba..ffc7054d3b0bf450921c8f4a44716cb74be3535f 100644 GIT binary patch literal 13631 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 literal 15785 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

X$hPjVl}S5 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 *Runners*. +You can configure a Runner to assign it exclusively to a project. When a +Runner is locked this way, it can no longer be enabled for other projects. +This setting is available on each Runner in *Project Settings* > *Runners*. ### Making an existing Shared Runner Specific If you are an admin on your GitLab instance, -you can make any shared runner a specific runner, _but you can not -make a specific runner a shared runner_. +you can make any shared Runner a specific Runner, _but you can not +make a specific Runner a shared Runner_. -To make a shared runner specific, go to the runner page (`/admin/runners`) -and find your runner. Add any projects on the left to make this runner -run exclusively for these projects, therefore making it a specific runner. +To make a shared Runner specific, go to the Runner page (`/admin/Runners`) +and find your Runner. Add any projects on the left to make this Runner +run exclusively for these projects, therefore making it a specific Runner. -![making a shared runner specific](shared_to_specific_admin.png) +![making a shared Runner specific](shared_to_specific_admin.png) ## Using Shared Runners Effectively -If you are planning to use shared runners, there are several things you +If you are planning to use shared Runners, there are several things you should keep in mind. ### Use Tags -You must setup a runner to be able to run all the different types of jobs +You must setup a Runner to be able to run all the different types of jobs that it may encounter on the projects it's shared over. This would be problematic for large amounts of projects, if it wasn't for tags. By tagging a Runner for the types of jobs it can handle, you can make sure -shared runners will only run the jobs they are equipped to run. +shared Runners will only run the jobs they are equipped to run. -For instance, at GitLab we have runners tagged with "rails" if they contain +For instance, at GitLab we have Runners tagged with "rails" if they contain the appropriate dependencies to run Rails test suites. -### Prevent runner with tags from picking jobs without tags +### Prevent Runner with tags from picking jobs without tags -You can configure a runner to prevent it from picking jobs with tags when -the runner does not have tags assigned. This setting is available on each -runner in *Project Settings* > *Runners*. +You can configure a Runner to prevent it from picking jobs with tags when +the Runner does not have tags assigned. This setting is available on each +Runner in *Project Settings* > *Runners*. ### Be careful with sensitive information -If you can run a build on a runner, you can get access to any code it runs -and get the token of the runner. With shared runners, this means that anyone -that runs jobs on the runner, can access anyone else's code that runs on the runner. +If you can run a job on a Runner, you can get access to any code it runs +and get the token of the Runner. With shared Runners, this means that anyone +that runs jobs on the Runner, can access anyone else's code that runs on the Runner. -In addition, because you can get access to the runner token, it is possible -to create a clone of a runner and submit false builds, for example. +In addition, because you can get access to the Runner token, it is possible +to create a clone of a Runner and submit false jobs, for example. -The above is easily avoided by restricting the usage of shared runners +The above is easily avoided by restricting the usage of shared Runners on large public GitLab instances and controlling access to your GitLab instance. ### Forks Whenever a project is forked, it copies the settings of the jobs that relate -to it. This means that if you have shared runners setup for a project and -someone forks that project, the shared runners will also serve jobs of this +to it. This means that if you have shared Runners setup for a project and +someone forks that project, the shared Runners will also serve jobs of this project. ## Attack vectors in Runners -Mentioned briefly earlier, but the following things of runners can be exploited. -We're always looking for contributions that can mitigate these [Security Considerations](https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/security/index.md). +Mentioned briefly earlier, but the following things of Runners can be exploited. +We're always looking for contributions that can mitigate these +[Security Considerations](https://docs.gitlab.com/runner/security/). diff --git a/doc/ci/services/mysql.md b/doc/ci/services/mysql.md index aaf3aa77837..338368dbbc9 100644 --- a/doc/ci/services/mysql.md +++ b/doc/ci/services/mysql.md @@ -31,7 +31,7 @@ Database: el_duderino ``` If you are wondering why we used `mysql` for the `Host`, read more at -[How is service linked to the build](../docker/using_docker_images.md#how-is-service-linked-to-the-build). +[How is service linked to the job](../docker/using_docker_images.md#how-is-service-linked-to-the-job). You can also use any other docker image available on [Docker Hub][hub-mysql]. For example, to use MySQL 5.5 the service becomes `mysql:5.5`. @@ -112,7 +112,7 @@ convenience that runs on [GitLab.com](https://gitlab.com) using our publicly available [shared runners](../runners/README.md). Want to hack on it? Simply fork it, commit and push your changes. Within a few -moments the changes will be picked by a public runner and the build will begin. +moments the changes will be picked by a public runner and the job will begin. [hub-mysql]: https://hub.docker.com/r/_/mysql/ [mysql-example-repo]: https://gitlab.com/gitlab-examples/mysql diff --git a/doc/ci/services/postgres.md b/doc/ci/services/postgres.md index f787cc0a124..3899b555f32 100644 --- a/doc/ci/services/postgres.md +++ b/doc/ci/services/postgres.md @@ -31,7 +31,7 @@ Database: nice_marmot ``` If you are wondering why we used `postgres` for the `Host`, read more at -[How is service linked to the build](../docker/using_docker_images.md#how-is-service-linked-to-the-build). +[How is service linked to the job](../docker/using_docker_images.md#how-is-service-linked-to-the-job). You can also use any other docker image available on [Docker Hub][hub-pg]. For example, to use PostgreSQL 9.3 the service becomes `postgres:9.3`. @@ -108,7 +108,7 @@ convenience that runs on [GitLab.com](https://gitlab.com) using our publicly available [shared runners](../runners/README.md). Want to hack on it? Simply fork it, commit and push your changes. Within a few -moments the changes will be picked by a public runner and the build will begin. +moments the changes will be picked by a public runner and the job will begin. [hub-pg]: https://hub.docker.com/r/_/postgres/ [postgres-example-repo]: https://gitlab.com/gitlab-examples/postgres diff --git a/doc/ci/services/redis.md b/doc/ci/services/redis.md index 80705024d2f..554c321fd0c 100644 --- a/doc/ci/services/redis.md +++ b/doc/ci/services/redis.md @@ -63,7 +63,7 @@ that runs on [GitLab.com](https://gitlab.com) using our publicly available [shared runners](../runners/README.md). Want to hack on it? Simply fork it, commit and push your changes. Within a few -moments the changes will be picked by a public runner and the build will begin. +moments the changes will be picked by a public runner and the job will begin. [hub-redis]: https://hub.docker.com/r/_/redis/ [redis-example-repo]: https://gitlab.com/gitlab-examples/redis diff --git a/doc/ci/ssh_keys/README.md b/doc/ci/ssh_keys/README.md index b858029d25e..49e7ac38b26 100644 --- a/doc/ci/ssh_keys/README.md +++ b/doc/ci/ssh_keys/README.md @@ -25,7 +25,7 @@ This is the universal solution which works with any type of executor 1. Create a new SSH key pair with [ssh-keygen][] 2. Add the private key as a **Secret Variable** to the project -3. Run the [ssh-agent][] during build to load the private key. +3. Run the [ssh-agent][] during job to load the private key. ## SSH keys when using the Docker executor @@ -77,7 +77,7 @@ SSH key. You can generate the SSH key from the machine that GitLab Runner is installed on, and use that key for all projects that are run on this machine. -First, you need to login to the server that runs your builds. +First, you need to login to the server that runs your jobs. Then from the terminal login as the `gitlab-runner` user and generate the SSH key pair as described in the [SSH keys documentation](../../ssh/README.md). @@ -103,7 +103,7 @@ that runs on [GitLab.com](https://gitlab.com) using our publicly available [shared runners](../runners/README.md). Want to hack on it? Simply fork it, commit and push your changes. Within a few -moments the changes will be picked by a public runner and the build will begin. +moments the changes will be picked by a public runner and the job will begin. [ssh-keygen]: http://linux.die.net/man/1/ssh-keygen [ssh-agent]: http://linux.die.net/man/1/ssh-agent diff --git a/doc/ci/triggers/README.md b/doc/ci/triggers/README.md index efca05af7b8..740edba1f59 100644 --- a/doc/ci/triggers/README.md +++ b/doc/ci/triggers/README.md @@ -1,19 +1,19 @@ -# Triggering Builds through the API - -> [Introduced][ci-229] in GitLab CE 7.14. +# Triggering jobs through the API > **Note**: -GitLab 8.12 has a completely redesigned build permissions system. -Read all about the [new model and its implications](../../user/project/new_ci_build_permissions_model.md#build-triggers). +- [Introduced][ci-229] in GitLab CE 7.14. +- GitLab 8.12 has a completely redesigned job permissions system. Read all + about the [new model and its implications](../../user/project/new_ci_build_permissions_model.md#job-triggers). Triggers can be used to force a rebuild of a specific `ref` (branch or tag) with an API call. ## Add a trigger -You can add a new trigger by going to your project's **Settings > Triggers**. -The **Add trigger** button will create a new token which you can then use to -trigger a rebuild of this particular project. +You can add a new trigger by going to your project's +**Settings ➔ CI/CD Pipelines ➔ Triggers**. The **Add trigger** button will +create a new token which you can then use to trigger a rerun of this +particular project's pipeline. Every new trigger you create, gets assigned a different token which you can then use inside your scripts or `.gitlab-ci.yml`. You also have a nice @@ -27,13 +27,13 @@ You can revoke a trigger any time by going at your project's **Settings > Triggers** and hitting the **Revoke** button. The action is irreversible. -## Trigger a build +## Trigger a job > **Note**: Valid refs are only the branches and tags. If you pass a commit SHA as a ref, -it will not trigger a build. +it will not trigger a job. -To trigger a build you need to send a `POST` request to GitLab's API endpoint: +To trigger a job you need to send a `POST` request to GitLab's API endpoint: ``` POST /projects/:id/trigger/builds @@ -42,31 +42,32 @@ POST /projects/:id/trigger/builds The required parameters are the trigger's `token` and the Git `ref` on which the trigger will be performed. Valid refs are the branch and the tag. The `:id` of a project can be found by [querying the API](../../api/projects.md) -or by visiting the **Triggers** page which provides self-explanatory examples. +or by visiting the **CI/CD Pipelines** settings page which provides +self-explanatory examples. -When a rebuild is triggered, the information is exposed in GitLab's UI under -the **Builds** page and the builds are marked as `triggered`. +When a rerun of a pipeline is triggered, the information is exposed in GitLab's +UI under the **Jobs** page and the jobs are marked as triggered 'by API'. -![Marked rebuilds as triggered on builds page](img/builds_page.png) +![Marked rebuilds as on jobs page](img/builds_page.png) --- -You can see which trigger caused the rebuild by visiting the single build page. -The token of the trigger is exposed in the UI as you can see from the image +You can see which trigger caused the rebuild by visiting the single job page. +A part of the trigger's token is exposed in the UI as you can see from the image below. -![Marked rebuilds as triggered on a single build page](img/trigger_single_build.png) +![Marked rebuilds as triggered on a single job page](img/trigger_single_build.png) --- See the [Examples](#examples) section for more details on how to actually trigger a rebuild. -## Trigger a build from webhook +## Trigger a job from webhook > Introduced in GitLab 8.14. -To trigger a build from webhook of another project you need to add the following +To trigger a job from webhook of another project you need to add the following webhook url for Push and Tag push events: ``` @@ -78,7 +79,7 @@ https://gitlab.example.com/api/v3/projects/:id/ref/:ref/trigger/builds?token=TOK from webhook body that designates the branchref that fired the trigger in the source repository. - `ref` should be url encoded if contains slashes. -## Pass build variables to a trigger +## Pass job variables to a trigger You can pass any number of arbitrary variables in the trigger API call and they will be available in GitLab CI so that they can be used in your `.gitlab-ci.yml` @@ -90,7 +91,7 @@ variables[key]=value This information is also exposed in the UI. -![Build variables in UI](img/trigger_variables.png) +![Job variables in UI](img/trigger_variables.png) --- @@ -116,7 +117,7 @@ curl --request POST \ "https://gitlab.example.com/api/v3/projects/9/trigger/builds?token=TOKEN&ref=master" ``` -### Triggering a build within `.gitlab-ci.yml` +### Triggering a job within `.gitlab-ci.yml` You can also benefit by using triggers in your `.gitlab-ci.yml`. Let's say that you have two projects, A and B, and you want to trigger a rebuild on the `master` @@ -132,7 +133,7 @@ build_docs: - tags ``` -Now, whenever a new tag is pushed on project A, the build will run and the +Now, whenever a new tag is pushed on project A, the job will run and the `build_docs` job will be executed, triggering a rebuild of project B. The `stage: deploy` ensures that this job will run only after all jobs with `stage: test` complete successfully. @@ -189,18 +190,18 @@ curl --request POST \ https://gitlab.example.com/api/v3/projects/9/trigger/builds ``` -### Using webhook to trigger builds +### Using webhook to trigger job -You can add the following webhook to another project in order to trigger a build: +You can add the following webhook to another project in order to trigger a job: ``` https://gitlab.example.com/api/v3/projects/9/ref/master/trigger/builds?token=TOKEN&variables[UPLOAD_TO_S3]=true ``` -### Using cron to trigger nightly builds +### Using cron to trigger nightly jobs -Whether you craft a script or just run cURL directly, you can trigger builds -in conjunction with cron. The example below triggers a build on the `master` +Whether you craft a script or just run cURL directly, you can trigger jobs +in conjunction with cron. The example below triggers a job on the `master` branch of project with ID `9` every night at `00:30`: ```bash diff --git a/doc/ci/triggers/img/builds_page.png b/doc/ci/triggers/img/builds_page.png index fded5839f76b610141de6d395315ae07736f228a..c9cc8f308f427099133e0151f94add125db35461 100644 GIT binary patch literal 20383 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 diff --git a/doc/ci/triggers/img/trigger_single_build.png b/doc/ci/triggers/img/trigger_single_build.png index c4a5550d640461d40ebeac920677e6bc6ff2db66..837bbeffe9f59707ad8902797e35cdecd4f47161 100644 GIT binary patch literal 6585 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 diff --git a/doc/ci/triggers/img/trigger_variables.png b/doc/ci/triggers/img/trigger_variables.png index 65fe1ea9ab618fc0d0fe5be636521d4825d7905b..0c2a761cfa981ab8c04ce06c9aeefc87bc2b4e8c 100644 GIT binary patch delta 3554 zcmY+EcTf`wm&Fy8qWBaLg(pQtK~TU3s2EXHkZwbYbc7H0TRl`?(ELKz5m=h^P4$y=FFMfDON2OeV>bq5%W+1#@_zJ+}@$D zp*>>9dgTl^nA?3a20PTXE!uR-;--Ul+YW2JPr=?A_%${LL0Vcgx3o(`#0}hezqPZ& z-eJYZL|fT{Chfj}tSsV_ijq(>w5{!h#^9CT8w2PH^4ex;O2Ptu!`sF(F5$;EV+oHX z_bCUDBRtcq2s^Y*EUbb+C8o2PEE>LYV8o=*r)!Zv;$n7~BpYkntXkX_o$#w9 zWs=Im+DI3wXO!K$1qWp^J8kt$?3t_YbY^~!8Ydd?^>9{5GSX=32 zGpb;TI`Fb(5r@UB(fjT}e*IxN+FK7+A+0`sCO$QG1;Ok#*H@~SC{D2cMN1n*O5J=d zax`M15lb$>Z`iv=?W_|f=9aPwDr+*L;}FQ{Rl22(JNRo9$UQK>cd2QG#v;_@Bcg|# z`h7n+*t=J;RI$At-7L$=+@dqUX`|nebuIlvxOrk`W(EoKGs7QL)HUHA zHP+_s5E0;lvvO~b^9+J|&g3PHnublN8^?d~TKFf+8sxcAl1pq{z?k>Udw{oL>zj_S zq_sfT0ZlYHIdZybp=)9RUfdtjyUbc34jQIlO@ikVo5nnIlhd-tvVY8Bd#Lg5^xu>b z|B;hQfoIp#Ah37mH2-crWnXqt16Y?}%bjG+^HlTrYZMokVA#>~T)h4H zfhrQ6ac5Brd>SvFo4vC2Y6_!$1ELoM788^l(MD5w?s_(nznodSz(TgfyC43F90@&G z%T_A8AcuQH($I3^mOT9Ik^h<21A&8T_pP=st)|Hxp-$5;6k$hipwjE=?k9Jjxn|Z; zgVkvZ7j7aAeRinYd7%McU441x#&x55@1N#w*XXfHgLU;|*NbneS z$QfSQ3?3PxgQ|v9u0=j0SFX23%pd^Ht)U7SAA3&C>t<-x#fK z>j!%P(o@{K1i9Eyr)vUp=g$|ArExd(hdsg96h|+^h~;Vfx)IyH45|cw>6-(qN{qy9 zt{btV&kRyNuRrp?@iL+{{ACwH-LSQaaS3$%f0I1iBN`%w_N4A9aRR8k(dZ9O9nFq) zWb@-0=@2$J*m0;wZ$QA&N8cIwn8;J!K`fMMw}Ff~lt0Ji0Y7DD$Ta^c+E;xBlL$`* z+;b{u^7-XI;QRQgncfJN7Hm`c>J#_QbaD~2|3VCK?ChOnRVPdrxNLn@MLl$+ z!L&r0^kC&GXQzua%A%gq^R;D&2yNY-(0fQUM$6@R$*Kc*%FPuUj@treJKF<=SwBmZ ze0`Ly6l1d9^z~50)fOFlDf{PPp5p0{i;hWCpK!5~RK8WU6NwK+$)X})ZDd{CDE5{{ zD0hIftafUUn2t;Yv$lg@7{Nd%5m~L*J--F%E1Yq zaQridvz40e_s?+JYLP0l;!3B5$j3JNm+Yj$0 zst>z4>g#IDYmEXI(Crj2^k)_OgU`Htob*-M88uGb34-?M1(7>8<%j|c@J(|@y-~c$ z%}uyCMy|TYkkIGa{5)#v9J*{p^g?1GnVZJ>XloPDdQ!!GY8R>4D{b0XhrcCh#B+YK z*mzm}JWIU;cCVhGvZsc(x7zh?5&KuW|NE>`h5B5IGGHq^iC^uG6fe?wal1x9O=QpB zw3a1u1}c*3@69XD_%z>ADQg;~EPX8VE|^!`L|CXH%=o&6bH9{aa7bmLO|wNmdESMS zZ}V6xeyG)FAgF0Qq4Y7RFS5;Z5Js!^>nXmd{WkoLKmCU?s|I-sJC#6OnI zt@Ca|M_O<*@}rxXN9`WCfPU_7B3xN@ zK_%L*>5^L(ZsiT&{pnN*N{yt~&(KY9_RS4{@qYxu4Hx;OCu}D&m?=-R_hB`Xx*ht5 zDClYyI4O2SSuISW{IXkY^QBw74=D5%7tRdACG2{hk%nWpj_TdB1-tsWKrNZX5o*V6 zA&c%&$JEvtTtNH#c}+h!>FEE@&x&MFeVP4L++-(nRwP5y1^P$~y4a(?`6f+F%xvob zj+&#|!w!lCS~kh-&@HWd!Jjnn86% zOtDD^N`s;x1JBxbXd{`e+oJr&?~g4}Bb^dk1QnKoG%6n$W#ymexIgzd-1}YP=j+Iz zh$mx8j&=S6GoOQ6v@P|np(Ub%;pY;T_cg;|Yz{@GUF*W`=hKri^>c280b&&5nmGj7 zAovCIFnEyMPd%>`%U`p0j+yB@d&2jTgl44Fuy5`oDhb!{(gkXN`>q^W9nGNNa@G|+~X&_Qkf#uLxj#$oD3a}l5jws0Mz=zgxsf8O}U|0O2S}q zYtMK*66lmy!qXVEdulqQBV|p1P1^;}Fz2PZU&VL4@57@eJxjfThJT=fKU!d~Q>GTl zWQzX}#~k2&CfnsvOZx|`)F(@~r3#h4iR2S19z5tL2Cn((Vb0-}(=|-A`WsIr&{=6C zUR4mv%$?jyu=DZo=j;+sf*!9@VFeew)8tj*65Fc% zX3cq_2K7pRsk)I{O{d54jn(6LM)ae|=EXMsWVkv7qCZ^gywH9u5mkUIN*|q9^}%=N zzaD?406bEiWL}00xhw6_M`G80v|eFS_qMykgL@{Do%lBIoZ^^IQEawgx%G#hQR&Ra z{BIYHhnMl>Z%*sn8S-SU#^_dO!f}AEf=G|+)(^m$q2bG59BJ=98v?-8!qpZ^YYzk( zPS=jCN1B<#pRlA z-u|nnu*1rhg;iCw2P!G=YDaj>SWH^2j0bFV$`G{s0*14hk#AX7;%DLClioNu3_}qK z$1i{6uPF9(yRa5}dbV6*G1^pNOy7FgxstPj*j?2!SvtzZ*vM4H=72m9f*($vejX(@ z{HZeNt5@W$2xWU1l-H^5p+(~!S;htU4l-E|6Cx9G2i#GC@^EgHX5>oEOyFJ2o^&pF z;#Tl-p8Xx3%IwJ2#gi(=UHU{X)f!L90DW4}%|k^H<73%Tzw0v(Sq}2c{Ee5>kpEZ~ zXd(^;V*LiITf!xtaRyY6A4KZ(!r_+;d_06}^JHSNLVauV$4t_3_NUVOoT$yYoiIuB ztN9RR$JYkrZ<&_|n?vK(J3@r^D<0Kia^~NbUqj9)`ORl1nM{8e5#qqfXCbdeWZ@xJ zh8mpvwHr&aymMy%3iHU3{?_t%Rg0sLf{kMBpfcMW=%2!QVX(fwv4e?*6ZCH``STv+ zST5#0rGVyIC4g#8CJwvVQkl;Le=cF1jOE* zsWuMR?V=H%Tq}Yr_Ju2^=UyF^0vR4TJ$UcIt0+OWzy8Rz9y*K>YLFJT`>SS5Dz)P0 zS-^qKWJb;#^XY|=(zm*-Z;H1qzj delta 3560 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 NU&lzhO3Ngxn_P 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 Ck!~~q delta 4910 zcmY*ccTm&Y)7P6&ch5<(AE4e%4OKs2bKCsZRK1VRZU zv;ayk0i+~`08u)G5PEf=#5zTygv@<;W!`{ByECI!i_1n&VWSAXRDtSTY%9WFMU zNy#1^qHnL$n}027XzF`D@8B&lCnl$8$w9)6jqQn1D8!>@dZh^+uw4HjZz}lW(>~Ac|!{^U0#Oqhptj-a(NBh@SxFw(b+tWjZ zE6WC28rx;CD}nI?{Ly+H;!8n3l|q{{EQYPEjukBN`YPhwy@Q#bow+lk;~RoF_OA0l zRFKd27cQCA@UloRi-;~3@x|kuVO+ zLp^@|pcs*YrlyutGPCLn(&yFd$^JrmX+V(hJ===jBzFg^COB&)!@BppHtz4`gthsk-2 z6C$*dB{|on@I@}O_Wl2A@`=Yyb4WDzFb{yTUOO! zApZNgb4Sp}Keb79i>X6GbBp8T+LO18qd9j_0Ui5Uy$(O7brk&uMlObwS4pS3oA1&^ z)@0XgE|}K<6-8m;%wUz;LdLzfgzf~se4QPE&h{#0ME77b{A_D=UF0NyfdAg6b8>CNW~MTmz7DCRA@AD;E!n?VJMq^9wh0Z_YuxB)uRCQ~U&LcvC}dbTcn%I#Sdi$wwG5%0 zD^mlp(U=~_DXHz(xz_UYO5=g^(p8dH^+j6LO{b_$r#8HQxnBr*sbMvQsy>1*Dl!9n zz$13;MQ3kjX)x!uOGbDxB7&zGC!XLPh9~^QEPl?)34{5NhNF+(jt*jc;ML;=6*Tez zyhpI6=`7Xuj7N~ReS5NKxIqD0zS=hSlo6NqVDH{(oUbe^VzH^t@hwW`qUZ`7>hNg3 zpqC^g@~>6jXTD2p1*9t8qacFWb35+ap3}gKTE?7moIzSi`kC()tIqc(wL73D>L|!` zx-0S2zP#LPDu%y-Q) zp+-y@TU%Yd$f(1V7ZUs(PPXq$2vkUsf76<4nqD*;16U5g4u<35uT_uVz|O)*fE{Mo zGQH~QfUy}d)N~3Du2mQzdZuAGvNq&P|Dd<#bP!X0v-qwC&jgC_2$PupkBm$ia@=fc!9O>8tUOQ+hmH8j#yjne+Exr-<> z&X8hLpOa_pT21*+CYve!-hg-UTDB^@7_(*4V>alCjQ<4-DTVF5$LPjT9Q+$AO>B7J zC0niDf>3qbxK9vDdjTWCY%h({g7mz?bOj)w4|M1F^Eow}Yno}g5m8ukU$ZM!8F zqsH(cktdtKH4i<_DZKg3_C#1RgzrPtG;y71@JUx}nc`zmgaH6MK$^9CP!%FeU3*CM zGkH8O;qpZ(@jomJ6ZA1m=?q?9^6j|ys{m!&DHEZd!hOM+MB z$J;vvZ>XwFd8&F@c#%Ok{rWvV&1}*V!||hfa$`Cy<#CovByTIc*tq^b4#Ustb*z{- zH=<>huN`y+cCKYT95FV^_@v5D#qPOH6!AEj2@+8ie*xLG!;ya-vq3xHdL?6*$fm-s ze=$p>r(|NR`B0epSc@Wb{l%2;&{?PJx>&pI8?nE4r&lj_V+!7fXf^E93f)cZ_C43I z@BbO-kq7~HVFpYb=o{DDaw?=Z{IrL;RyVKwM6VrZMoQoq(MK#2JAVw~Rz5}PRZm8M5oUL{hT5KM9Q*oMZfBen0M0Giv3u*EEVuYuzBIvL5b@bJHkf>+5a=M5 z{t9MiIIpSl85g**zUo+CB-RD3VZ|wdqY#OAB&-Un72qzt-Ww8<_SDl;IT_tLR+Tk% zzEp`(Yf(G<7AiqLUc;e~q3C>)3jz|<6+1L-)(9~R@s{#Y{f0!ZiSUs1p1PDnN`ptd z)PV)sLY91oj+5nO>{kBQ&T1T=I%4?Dk=UimZDbJTGqJj`ElFg8Z506trdgm12 zGA8eWUdr5${<&cbCCHXGPJ3MlOK*Mh@s_u`vhwIz_jE94LB^}leR9IE2si;_(vvUJ z9fUaUbYA6RH+CR>3OQFMkqP3s-PIe-emYNl&dqk0{;ehA|H6t!NR zpPkdu4697t$9*tT2D7SqwuJ#qHM~N>#MH|MgrwiInpGR8t%C{=AG<%P)9d{%Ozzl` zm8@iIiJri*f2Qz*hB-3Wap0;Fj$w*T&=~Y)6f`03rCs(ToZX~(ki-MWqWUOiup7joaLGBzM(YNAVREB7WM{D!k(^e|VQf8Fy7x@kF&~F=$LH_VO1<>LF>b zU>efwpxgCwb{PW&`t7P0u;9p5?F4zV*kBxkP~%$@h7y$b*4P3%<&R3$3=xiN@Y1y~ zT1`ZDEv}jywJF=ato`v^+@vg}?2()>y%z89bf6xBTK;Fm%HmW)ssB`Jo}){e zntbeF%bylj=)vMUiGxc<&#p>(sWKDjs6(;6P8y`kbuzh)OHZolC<)^Sy`k$HTg}(H z3a?&ynPgtoGv@}xdDHSK+P-(f?{eHYk(4 zNVJTs|K5FRpQyNSZQs8XAjn1Jh0ePo^M8RNna2b}`sa!lmQg!-br(hcIJr%c-Vu@i zjz8_}WuS1GyC^~p$?s9E@R2DvC->Ad@9>d}pA}MY+U&&68|R(Gj&EjYw0=3Y(zx8{ zYW&q-J&iM%_51t*x|Nz#N`Dm90hh)hOkn!*PDv;r^#3>b7IEe^&}D&$r>$^#@CzrF zVy0!Lb)QOJ#76~aYR>k1W5Vwe?-kmzfwfCQ4TQjQ<(H5g3N5j)f&bldDDJ%5EtQ`^ zsl7;&vC&uKNDOi%>x7r$ar3XT$iK40?Z;jg{yeF72YfOrG5avg=e4z^ivsrO{^)ON zqQ7GrA2}X9idxiL+JN>V;q}19OE;Gs;~^5r!cZ z{>+d5{wV}%{e>O4K`B6>LpM~6p9vytE{$LPXuuh3xQgDDpelddEG2<6z=wbRY`?~) zRyR~D_YH3~o*R@YBGs`xfbS6mSWzby!O+8324~vv9I)sbzNt%R`y}2vzRV znxef>)jJh{7UX|tu{%kKeC7TFX3dTtssWNm_2XlsI`45G6w&sGDDB~_$(rhx`DFEyTn z9Z|EP=CX92UzXda$(b7Uo6X6trW{oydby`ktAFof)na^(h1ZhFlf%VTOC5s`+vYw@ zB+!sqkhPD0+ulri2WZW^cN!h4wJA4H=FeECF$~r=w+3MJCbOOH61F^k;JiMiAeW3o z*N#Qe9Qiy%LGQW)EVe5#X)*qLYWzMo6aQEcZ8YXgiLF#kSt-kM}w#m2LU5f29j?z=yRkUY9Ae<{) ze#dO#2y~MBp*FL>MK?)RUn+qq|E-x(V`I6`uY*wmA3MO>R09-NW`5AFxChKW-%p^p zc%-CB765p>_-2NBdC7CqbvIL9*-TEcLVE^Iy;aTV-SG$TI1mCc5q4byVpw%shrYwZ zaX0&%+}V+J0|*YyK;KcuVV3*eS+ViVOC5)Qj{{V->Dd zj(Jl*Omrc$+|~Vw52SR>y6@}>ai6!?SDFJ13w(>~hu923P72oZAzzj-znaVmmV3*S zn{AL1oSKgqot^Jb(XN_9!quA5@BO8gif9I1ApHUQO`2?X*F6!q_~NJ7p_cx@*W*FC!BJY* zKY|*`iHudbupFhRPBf^o%|1K=Hrx+BYw4EQDe87oBxTRhzl3&jhn?4T+alM$LxG)N z-r2a~BYyxNZ=Pm8 zpXLxL=tn$_T8iqQs z+Y}DtIul9BMUe6aw*eR*s!rdwecFpSU)tq^ZFt*shW1=pyit~j`aM4WVBL~9TdKkg z9_Uo(YK57bon`t2)>j$m?KB5jdwFY^$&{MWB8WS+<@X(oXOMzvmeoFrGv|r73sm@Q zW0g?B>(JiMXLPA(px_oqBt>yr3lZ{`Ttu-)Y|dTNb~_pE4q+PqQhHnEplhV_^pbKD zyKJ}H8Xext`z1r>OxGfY=k=#-35}jOBwn g%#e_Lv1{wEbX%o)HA(Ts|CqI*zNsGJ?&FvL2Z)4wVgLXD diff --git a/doc/ci/variables/README.md b/doc/ci/variables/README.md index 49fca884f35..8a638ed3df8 100644 --- a/doc/ci/variables/README.md +++ b/doc/ci/variables/README.md @@ -1,6 +1,6 @@ # Variables -When receiving a build from GitLab CI, the [Runner] prepares the build environment. +When receiving a job from GitLab CI, the [Runner] prepares the build environment. It starts by setting a list of **predefined variables** (environment variables) and a list of **user-defined variables**. @@ -29,22 +29,22 @@ version of Runner required. | Variable | GitLab | Runner | Description | |-------------------------|--------|--------|-------------| -| **CI** | all | 0.4 | Mark that build is executed in CI environment | -| **GITLAB_CI** | all | all | Mark that build is executed in GitLab CI environment | -| **CI_SERVER** | all | all | Mark that build is executed in CI environment | -| **CI_SERVER_NAME** | all | all | The name of CI server that is used to coordinate builds | -| **CI_SERVER_VERSION** | all | all | GitLab version that is used to schedule builds | -| **CI_SERVER_REVISION** | all | all | GitLab revision that is used to schedule builds | -| **CI_BUILD_ID** | all | all | The unique id of the current build that GitLab CI uses internally | +| **CI** | all | 0.4 | Mark that job is executed in CI environment | +| **GITLAB_CI** | all | all | Mark that job is executed in GitLab CI environment | +| **CI_SERVER** | all | all | Mark that job is executed in CI environment | +| **CI_SERVER_NAME** | all | all | The name of CI server that is used to coordinate jobs | +| **CI_SERVER_VERSION** | all | all | GitLab version that is used to schedule jobs | +| **CI_SERVER_REVISION** | all | all | GitLab revision that is used to schedule jobs | +| **CI_BUILD_ID** | all | all | The unique id of the current job that GitLab CI uses internally | | **CI_BUILD_REF** | all | all | The commit revision for which project is built | | **CI_BUILD_TAG** | all | 0.5 | The commit tag name. Present only when building tags. | -| **CI_BUILD_NAME** | all | 0.5 | The name of the build as defined in `.gitlab-ci.yml` | +| **CI_BUILD_NAME** | all | 0.5 | The name of the job as defined in `.gitlab-ci.yml` | | **CI_BUILD_STAGE** | all | 0.5 | The name of the stage as defined in `.gitlab-ci.yml` | | **CI_BUILD_REF_NAME** | all | all | The branch or tag name for which project is built | | **CI_BUILD_REF_SLUG** | 8.15 | all | `$CI_BUILD_REF_NAME` lowercased, shortened to 63 bytes, and with everything except `0-9` and `a-z` replaced with `-`. Use in URLs and domain names. | | **CI_BUILD_REPO** | all | all | The URL to clone the Git repository | -| **CI_BUILD_TRIGGERED** | all | 0.5 | The flag to indicate that build was [triggered] | -| **CI_BUILD_MANUAL** | 8.12 | all | The flag to indicate that build was manually started | +| **CI_BUILD_TRIGGERED** | all | 0.5 | The flag to indicate that job was [triggered] | +| **CI_BUILD_MANUAL** | 8.12 | all | The flag to indicate that job was manually started | | **CI_BUILD_TOKEN** | all | 1.2 | Token used for authenticating with the GitLab Container Registry | | **CI_PIPELINE_ID** | 8.10 | 0.5 | The unique id of the current pipeline that GitLab CI uses internally | | **CI_PROJECT_ID** | all | all | The unique id of the current project that GitLab CI uses internally | @@ -52,8 +52,8 @@ version of Runner required. | **CI_PROJECT_NAMESPACE**| 8.10 | 0.5 | The project namespace (username or groupname) that is currently being built | | **CI_PROJECT_PATH** | 8.10 | 0.5 | The namespace with project name | | **CI_PROJECT_URL** | 8.10 | 0.5 | The HTTP address to access project | -| **CI_PROJECT_DIR** | all | all | The full path where the repository is cloned and where the build is run | -| **CI_ENVIRONMENT_NAME** | 8.15 | all | The name of the environment for this build | +| **CI_PROJECT_DIR** | all | all | The full path where the repository is cloned and where the job is run | +| **CI_ENVIRONMENT_NAME** | 8.15 | all | The name of the environment for this job | | **CI_ENVIRONMENT_SLUG** | 8.15 | all | A simplified version of the environment name, suitable for inclusion in DNS, URLs, Kubernetes labels, etc. | | **CI_REGISTRY** | 8.10 | 0.5 | If the Container Registry is enabled it returns the address of GitLab's Container Registry | | **CI_REGISTRY_IMAGE** | 8.10 | 0.5 | If the Container Registry is enabled for the project it returns the address of the registry tied to the specific project | @@ -61,11 +61,11 @@ version of Runner required. | **CI_RUNNER_DESCRIPTION** | 8.10 | 0.5 | The description of the runner as saved in GitLab | | **CI_RUNNER_TAGS** | 8.10 | 0.5 | The defined runner tags | | **CI_DEBUG_TRACE** | all | 1.7 | Whether [debug tracing](#debug-tracing) is enabled | -| **GET_SOURCES_ATTEMPTS** | 8.15 | 1.9 | Number of attempts to fetch sources running a build | -| **ARTIFACT_DOWNLOAD_ATTEMPTS** | 8.15 | 1.9 | Number of attempts to download artifacts running a build | -| **RESTORE_CACHE_ATTEMPTS** | 8.15 | 1.9 | Number of attempts to restore the cache running a build | -| **GITLAB_USER_ID** | 8.12 | all | The id of the user who started the build | -| **GITLAB_USER_EMAIL** | 8.12 | all | The email of the user who started the build | +| **GET_SOURCES_ATTEMPTS** | 8.15 | 1.9 | Number of attempts to fetch sources running a job | +| **ARTIFACT_DOWNLOAD_ATTEMPTS** | 8.15 | 1.9 | Number of attempts to download artifacts running a job | +| **RESTORE_CACHE_ATTEMPTS** | 8.15 | 1.9 | Number of attempts to restore the cache running a job | +| **GITLAB_USER_ID** | 8.12 | all | The id of the user who started the job | +| **GITLAB_USER_EMAIL** | 8.12 | all | The email of the user who started the job | Example values: @@ -136,7 +136,7 @@ job_name: >**Notes:** - This feature requires GitLab Runner 0.4.0 or higher. - Be aware that secret variables are not masked, and their values can be shown - in the build logs if explicitly asked to do so. If your project is public or + in the job logs if explicitly asked to do so. If your project is public or internal, you can set the pipelines private from your project's Pipelines settings. Follow the discussion in issue [#13784][ce-13784] for masking the secret variables. @@ -150,7 +150,7 @@ storing things like passwords, secret keys and credentials. Secret variables can be added by going to your project's **Settings ➔ Variables ➔ Add variable**. -Once you set them, they will be available for all subsequent builds. +Once you set them, they will be available for all subsequent jobs. ## Deployment variables @@ -160,7 +160,7 @@ This feature requires GitLab CI 8.15 or higher. [Project services](../../user/project/integrations/project_services.md) that are responsible for deployment configuration may define their own variables that are set in the build environment. These variables are only defined for -[deployment builds](../environments.md). Please consult the documentation of +[deployment jobs](../environments.md). Please consult the documentation of the project services that you are using to learn which variables they define. An example project service that defines deployment variables is @@ -173,21 +173,21 @@ An example project service that defines deployment variables is > **WARNING:** Enabling debug tracing can have severe security implications. The output **will** contain the content of all your secret variables and any other secrets! The output **will** be uploaded to the GitLab server and made visible - in build traces! + in job traces! By default, GitLab Runner hides most of the details of what it is doing when -processing a job. This behaviour keeps build traces short, and prevents secrets +processing a job. This behaviour keeps job traces short, and prevents secrets from being leaked into the trace unless your script writes them to the screen. If a job isn't working as expected, this can make the problem difficult to investigate; in these cases, you can enable debug tracing in `.gitlab-ci.yml`. Available on GitLab Runner v1.7+, this feature enables the shell's execution -trace, resulting in a verbose build trace listing all commands that were run, +trace, resulting in a verbose job trace listing all commands that were run, variables that were set, etc. -Before enabling this, you should ensure builds are visible to +Before enabling this, you should ensure jobs are visible to [team members only](../../user/permissions.md#project-features). You should -also [erase](../pipelines.md#seeing-build-status) all generated build traces +also [erase](../pipelines.md#seeing-build-status) all generated job traces before making them visible again. To enable debug traces, set the `CI_DEBUG_TRACE` variable to `true`: @@ -320,7 +320,7 @@ MIIFQzCCBCugAwIBAgIRAL/ElDjuf15xwja1ZnCocWAwDQYJKoZIhvcNAQELBQAw' All variables are set as environment variables in the build environment, and they are accessible with normal methods that are used to access such variables. -In most cases `bash` or `sh` is used to execute the build script. +In most cases `bash` or `sh` is used to execute the job script. To access the variables (predefined and user-defined) in a `bash`/`sh` environment, prefix the variable name with the dollar sign (`$`): @@ -328,12 +328,12 @@ prefix the variable name with the dollar sign (`$`): ``` job_name: script: - - echo $CI_BUILD_ID + - echo $CI_job_ID ``` You can also list all environment variables with the `export` command, but be aware that this will also expose the values of all the secret variables -you set, in the build log: +you set, in the job log: ``` job_name: @@ -344,4 +344,4 @@ job_name: [ce-13784]: https://gitlab.com/gitlab-org/gitlab-ce/issues/13784 [runner]: https://docs.gitlab.com/runner/ [triggered]: ../triggers/README.md -[triggers]: ../triggers/README.md#pass-build-variables-to-a-trigger +[triggers]: ../triggers/README.md#pass-job-variables-to-a-trigger diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index cd492d16747..63be61d1bca 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -1,7 +1,7 @@ -# Configuration of your builds with .gitlab-ci.yml +# Configuration of your jobs with .gitlab-ci.yml This document describes the usage of `.gitlab-ci.yml`, the file that is used by -GitLab Runner to manage your project's builds. +GitLab Runner to manage your project's jobs. If you want a quick introduction to GitLab CI, follow our [quick start guide](../quick_start/README.md). @@ -30,10 +30,9 @@ jobs, where each of the jobs executes a different command. Of course a command can execute code directly (`./configure;make;make install`) or run a script (`test.sh`) in the repository. -Jobs are used to create builds, which are then picked up by -[Runners](../runners/README.md) and executed within the environment of the -Runner. What is important, is that each job is run independently from each -other. +Jobs are picked up by [Runners](../runners/README.md) and executed within the +environment of the Runner. What is important, is that each job is run +independently from each other. The YAML syntax allows for using more complex job specifications than in the above example: @@ -80,30 +79,31 @@ There are a few reserved `keywords` that **cannot** be used as job names: ### image and services This allows to specify a custom Docker image and a list of services that can be -used for time of the build. The configuration of this feature is covered in +used for time of the job. The configuration of this feature is covered in [a separate document](../docker/README.md). ### before_script `before_script` is used to define the command that should be run before all -builds, including deploy builds, but after the restoration of artifacts. This can be an array or a multi-line string. +jobs, including deploy jobs, but after the restoration of artifacts. This can +be an array or a multi-line string. ### after_script > Introduced in GitLab 8.7 and requires Gitlab Runner v1.2 `after_script` is used to define the command that will be run after for all -builds. This has to be an array or a multi-line string. +jobs. This has to be an array or a multi-line string. ### stages -`stages` is used to define build stages that can be used by jobs. +`stages` is used to define stages that can be used by jobs. The specification of `stages` allows for having flexible multi stage pipelines. -The ordering of elements in `stages` defines the ordering of builds' execution: +The ordering of elements in `stages` defines the ordering of jobs' execution: -1. Builds of the same stage are run in parallel. -1. Builds of the next stage are run after the jobs from the previous stage +1. Jobs of the same stage are run in parallel. +1. Jobs of the next stage are run after the jobs from the previous stage complete successfully. Let's consider the following example, which defines 3 stages: @@ -115,7 +115,7 @@ stages: - deploy ``` -1. First all jobs of `build` are executed in parallel. +1. First, all jobs of `build` are executed in parallel. 1. If all jobs of `build` succeed, the `test` jobs are executed in parallel. 1. If all jobs of `test` succeed, the `deploy` jobs are executed in parallel. 1. If all jobs of `deploy` succeed, the commit is marked as `success`. @@ -124,7 +124,7 @@ stages: There are also two edge cases worth mentioning: -1. If no `stages` are defined in `.gitlab-ci.yml`, then by default the `build`, +1. If no `stages` are defined in `.gitlab-ci.yml`, then the `build`, `test` and `deploy` are allowed to be used as job's stage by default. 2. If a job doesn't specify a `stage`, the job is assigned the `test` stage. @@ -137,7 +137,7 @@ Alias for [stages](#stages). > Introduced in GitLab Runner v0.5.0. GitLab CI allows you to add variables to `.gitlab-ci.yml` that are set in the -build environment. The variables are stored in the Git repository and are meant +job environment. The variables are stored in the Git repository and are meant to store non-sensitive project configuration, for example: ```yaml @@ -163,7 +163,7 @@ which can be set in GitLab's UI. > Introduced in GitLab Runner v0.7.0. `cache` is used to specify a list of files and directories which should be -cached between builds. You can only use paths that are within the project +cached between jobs. You can only use paths that are within the project workspace. **By default the caching is enabled per-job and per-branch.** @@ -202,8 +202,8 @@ rspec: - binaries/ ``` -Locally defined cache overwrites globally defined options. This will cache only -`binaries/`: +Locally defined cache overwrites globally defined options. The following `rspec` +job will cache only `binaries/`: ```yaml cache: @@ -281,8 +281,8 @@ cache: ## Jobs `.gitlab-ci.yml` allows you to specify an unlimited number of jobs. Each job -must have a unique name, which is not one of the Keywords mentioned above. -A job is defined by a list of parameters that define the build behavior. +must have a unique name, which is not one of the keywords mentioned above. +A job is defined by a list of parameters that define the job behavior. ```yaml job_name: @@ -302,24 +302,24 @@ job_name: | Keyword | Required | Description | |---------------|----------|-------------| -| script | yes | Defines a shell script which is executed by Runner | -| image | no | Use docker image, covered in [Using Docker Images](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml) | -| services | no | Use docker services, covered in [Using Docker Images](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml) | -| stage | no | Defines a build stage (default: `test`) | -| type | no | Alias for `stage` | -| variables | no | Define build variables on a job level | -| only | no | Defines a list of git refs for which build is created | -| except | no | Defines a list of git refs for which build is not created | -| tags | no | Defines a list of tags which are used to select Runner | -| allow_failure | no | Allow build to fail. Failed build doesn't contribute to commit status | -| when | no | Define when to run build. Can be `on_success`, `on_failure`, `always` or `manual` | -| dependencies | no | Define other builds that a build depends on so that you can pass artifacts between them| -| artifacts | no | Define list of build artifacts | -| cache | no | Define list of files that should be cached between subsequent runs | -| before_script | no | Override a set of commands that are executed before build | -| after_script | no | Override a set of commands that are executed after build | -| environment | no | Defines a name of environment to which deployment is done by this build | -| coverage | no | Define code coverage settings for a given job | +| script | yes | Defines a shell script which is executed by Runner | +| image | no | Use docker image, covered in [Using Docker Images](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml) | +| services | no | Use docker services, covered in [Using Docker Images](../docker/using_docker_images.md#define-image-and-services-from-gitlab-ciyml) | +| stage | no | Defines a job stage (default: `test`) | +| type | no | Alias for `stage` | +| variables | no | Define job variables on a job level | +| only | no | Defines a list of git refs for which job is created | +| except | no | Defines a list of git refs for which job is not created | +| tags | no | Defines a list of tags which are used to select Runner | +| allow_failure | no | Allow job to fail. Failed job doesn't contribute to commit status | +| when | no | Define when to run job. Can be `on_success`, `on_failure`, `always` or `manual` | +| dependencies | no | Define other jobs that a job depends on so that you can pass artifacts between them| +| artifacts | no | Define list of [job artifacts](../../user/project/pipelines/job_artifacts.md) | +| cache | no | Define list of files that should be cached between subsequent runs | +| before_script | no | Override a set of commands that are executed before job | +| after_script | no | Override a set of commands that are executed after job | +| environment | no | Defines a name of environment to which deployment is done by this job | +| coverage | no | Define code coverage settings for a given job | ### script @@ -339,11 +339,15 @@ job: - bundle exec rspec ``` -Sometimes, `script` commands will need to be wrapped in single or double quotes. For example, commands that contain a colon (`:`) need to be wrapped in quotes so that the YAML parser knows to interpret the whole thing as a string rather than a "key: value" pair. Be careful when using special characters (`:`, `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``). +Sometimes, `script` commands will need to be wrapped in single or double quotes. +For example, commands that contain a colon (`:`) need to be wrapped in quotes so +that the YAML parser knows to interpret the whole thing as a string rather than +a "key: value" pair. Be careful when using special characters: +`:`, `{`, `}`, `[`, `]`, `,`, `&`, `*`, `#`, `?`, `|`, `-`, `<`, `>`, `=`, `!`, `%`, `@`, `` ` ``. ### stage -`stage` allows to group build into different stages. Builds of the same `stage` +`stage` allows to group jobs into different stages. Jobs of the same `stage` are executed in `parallel`. For more info about the use of `stage` please check [stages](#stages). @@ -352,10 +356,9 @@ are executed in `parallel`. For more info about the use of `stage` please check `only` and `except` are two parameters that set a refs policy to limit when jobs are built: -1. `only` defines the names of branches and tags for which the job will be - built. +1. `only` defines the names of branches and tags for which the job will run. 2. `except` defines the names of branches and tags for which the job will - **not** be built. + **not** run. There are a few rules that apply to the usage of refs policy: @@ -379,8 +382,8 @@ job: - branches ``` -In this example, `job` will run only for refs that are tagged, or if a build is explicitly requested -via an API trigger. +In this example, `job` will run only for refs that are tagged, or if a build is +explicitly requested via an API trigger. ```yaml job: @@ -404,14 +407,14 @@ job: The above example will run `job` for all branches on `gitlab-org/gitlab-ce`, except master. -### job variables +### Job variables -It is possible to define build variables using a `variables` keyword on a job -level. It works basically the same way as its [global-level equivalent](#variables) -but allows you to define job-specific build variables. +It is possible to define job variables using a `variables` keyword on a job +level. It works basically the same way as its [global-level equivalent](#variables), +but allows you to define job-specific variables. -When the `variables` keyword is used on a job level, it overrides global YAML -build variables and predefined variables. To turn off global defined variables +When the `variables` keyword is used on a job level, it overrides the global YAML +job variables and predefined ones. To turn off global defined variables in your job, define an empty array: ```yaml @@ -419,8 +422,7 @@ job_name: variables: [] ``` -Build variables priority is defined in the -[variables documentation][variables]. +Job variables priority is defined in the [variables documentation][variables]. ### tags @@ -430,7 +432,7 @@ allowed to run this project. During the registration of a Runner, you can specify the Runner's tags, for example `ruby`, `postgres`, `development`. -`tags` allow you to run builds with Runners that have the specified tags +`tags` allow you to run jobs with Runners that have the specified tags assigned to them: ```yaml @@ -445,13 +447,13 @@ has both `ruby` AND `postgres` tags defined. ### allow_failure -`allow_failure` is used when you want to allow a build to fail without impacting -the rest of the CI suite. Failed builds don't contribute to the commit status. +`allow_failure` is used when you want to allow a job to fail without impacting +the rest of the CI suite. Failed jobs don't contribute to the commit status. -When enabled and the build fails, the pipeline will be successful/green for all +When enabled and the job fails, the pipeline will be successful/green for all intents and purposes, but a "CI build passed with warnings" message will be -displayed on the merge request or commit or build page. This is to be used by -builds that are allowed to fail, but where failure indicates some other (manual) +displayed on the merge request or commit or job page. This is to be used by +jobs that are allowed to fail, but where failure indicates some other (manual) steps should be taken elsewhere. In the example below, `job1` and `job2` will run in parallel, but if `job1` @@ -483,12 +485,12 @@ failure. `when` can be set to one of the following values: -1. `on_success` - execute build only when all builds from prior stages +1. `on_success` - execute job only when all jobs from prior stages succeed. This is the default. -1. `on_failure` - execute build only when at least one build from prior stages +1. `on_failure` - execute job only when at least one job from prior stages fails. -1. `always` - execute build regardless of the status of builds from prior stages. -1. `manual` - execute build manually (added in GitLab 8.10). Read about +1. `always` - execute job regardless of the status of jobs from prior stages. +1. `manual` - execute job manually (added in GitLab 8.10). Read about [manual actions](#manual-actions) below. For example: @@ -526,7 +528,7 @@ deploy_job: cleanup_job: stage: cleanup script: - - cleanup after builds + - cleanup after jobs when: always ``` @@ -552,10 +554,11 @@ Read more at the [environments documentation][env-manual]. ### environment -> Introduced in GitLab 8.9. - -> You can read more about environments and find more examples in the -[documentation about environments][environment]. +> +**Notes:** +- Introduced in GitLab 8.9. +- You can read more about environments and find more examples in the + [documentation about environments][environment]. `environment` is used to define that a job deploys to a specific environment. If `environment` is specified and no environment under that name exists, a new @@ -563,7 +566,7 @@ one will be created automatically. In its simplest form, the `environment` keyword can be defined like: -``` +```yaml deploy to production: stage: deploy script: git push production HEAD:master @@ -576,12 +579,12 @@ deployment to the `production` environment. #### environment:name -> Introduced in GitLab 8.11. - ->**Note:** -Before GitLab 8.11, the name of an environment could be defined as a string like -`environment: production`. The recommended way now is to define it under the -`name` keyword. +> +**Notes:** +- Introduced in GitLab 8.11. +- Before GitLab 8.11, the name of an environment could be defined as a string like + `environment: production`. The recommended way now is to define it under the + `name` keyword. The `environment` name can contain: @@ -602,7 +605,7 @@ Instead of defining the name of the environment right after the `environment` keyword, it is also possible to define it as a separate value. For that, use the `name` keyword under `environment`: -``` +```yaml deploy to production: stage: deploy script: git push production HEAD:master @@ -612,11 +615,11 @@ deploy to production: #### environment:url -> Introduced in GitLab 8.11. - ->**Note:** -Before GitLab 8.11, the URL could be added only in GitLab's UI. The -recommended way now is to define it in `.gitlab-ci.yml`. +> +**Notes:** +- Introduced in GitLab 8.11. +- Before GitLab 8.11, the URL could be added only in GitLab's UI. The + recommended way now is to define it in `.gitlab-ci.yml`. This is an optional value that when set, it exposes buttons in various places in GitLab which when clicked take you to the defined URL. @@ -625,7 +628,7 @@ In the example below, if the job finishes successfully, it will create buttons in the merge requests and in the environments/deployments pages which will point to `https://prod.example.com`. -``` +```yaml deploy to production: stage: deploy script: git push production HEAD:master @@ -690,8 +693,10 @@ The `stop_review_app` job is **required** to have the following keywords defined #### dynamic environments -> [Introduced][ce-6323] in GitLab 8.12 and GitLab Runner 1.6. - `$CI_ENVIRONMENT_SLUG` was [introduced][ce-7983] in GitLab 8.15 +> +**Notes:** +- [Introduced][ce-6323] in GitLab 8.12 and GitLab Runner 1.6. +- The `$CI_ENVIRONMENT_SLUG` was [introduced][ce-7983] in GitLab 8.15. `environment` can also represent a configuration hash with `name` and `url`. These parameters can use any of the defined [CI variables](#variables) @@ -699,7 +704,7 @@ These parameters can use any of the defined [CI variables](#variables) For example: -``` +```yaml deploy as review app: stage: deploy script: make deploy @@ -714,28 +719,27 @@ is an [environment variable][variables] set by the Runner. The `$CI_ENVIRONMENT_SLUG` variable is based on the environment name, but suitable for inclusion in URLs. In this case, if the `deploy as review app` job was run in a branch named `pow`, this environment would be accessible with an URL like -`https://review-pow-aaaaaa.example.com/`. +`https://review-pow.example.com/`. This of course implies that the underlying server which hosts the application is properly configured. The common use case is to create dynamic environments for branches and use them as Review Apps. You can see a simple example using Review Apps at -https://gitlab.com/gitlab-examples/review-apps-nginx/. +. ### artifacts ->**Notes:** > -> - Introduced in GitLab Runner v0.7.0 for non-Windows platforms. -> - Windows support was added in GitLab Runner v.1.0.0. -> - Currently not all executors are supported. -> - Build artifacts are only collected for successful builds by default. +**Notes:** +- Introduced in GitLab Runner v0.7.0 for non-Windows platforms. +- Windows support was added in GitLab Runner v.1.0.0. +- Currently not all executors are supported. +- Job artifacts are only collected for successful jobs by default. `artifacts` is used to specify a list of files and directories which should be -attached to the build after success. You can only use paths that are within the -project workspace. To pass artifacts between different builds, see [dependencies](#dependencies). - +attached to the job after success. You can only use paths that are within the +project workspace. To pass artifacts between different jobs, see [dependencies](#dependencies). Below are some examples. Send all files in `binaries` and `.config`: @@ -794,7 +798,7 @@ release-job: - tags ``` -The artifacts will be sent to GitLab after a successful build and will +The artifacts will be sent to GitLab after the job finishes successfully and will be available for download in the GitLab UI. #### artifacts:name @@ -811,7 +815,7 @@ The default name is `artifacts`, which becomes `artifacts.zip` when downloaded. **Example configurations** -To create an archive with a name of the current build: +To create an archive with a name of the current job: ```yaml job: @@ -829,7 +833,7 @@ job: untracked: true ``` -To create an archive with a name of the current build and the current branch or +To create an archive with a name of the current job and the current branch or tag including only the files that are untracked by Git: ```yaml @@ -864,20 +868,20 @@ job: > Introduced in GitLab 8.9 and GitLab Runner v1.3.0. -`artifacts:when` is used to upload artifacts on build failure or despite the +`artifacts:when` is used to upload artifacts on job failure or despite the failure. `artifacts:when` can be set to one of the following values: -1. `on_success` - upload artifacts only when the build succeeds. This is the default. -1. `on_failure` - upload artifacts only when the build fails. -1. `always` - upload artifacts regardless of the build status. +1. `on_success` - upload artifacts only when the job succeeds. This is the default. +1. `on_failure` - upload artifacts only when the job fails. +1. `always` - upload artifacts regardless of the job status. --- **Example configurations** -To upload artifacts only when build fails. +To upload artifacts only when job fails. ```yaml job: @@ -894,13 +898,14 @@ time. By default, artifacts are stored on GitLab forever. `expire_in` allows you to specify how long artifacts should live before they expire, counting from the time they are uploaded and stored on GitLab. -You can use the **Keep** button on the build page to override expiration and +You can use the **Keep** button on the job page to override expiration and keep artifacts forever. After expiry, artifacts are actually deleted hourly by default (via a cron job), but they are not accessible after expiry. The value of `expire_in` is an elapsed time. Examples of parseable values: + - '3 mins 4 sec' - '2 hrs 20 min' - '2h20min' @@ -925,14 +930,14 @@ job: > Introduced in GitLab 8.6 and GitLab Runner v1.1.1. This feature should be used in conjunction with [`artifacts`](#artifacts) and -allows you to define the artifacts to pass between different builds. +allows you to define the artifacts to pass between different jobs. Note that `artifacts` from all previous [stages](#stages) are passed by default. To use this feature, define `dependencies` in context of the job and pass -a list of all previous builds from which the artifacts should be downloaded. -You can only define builds from stages that are executed before the current one. -An error will be shown if you define builds from the current stage or next ones. +a list of all previous jobs from which the artifacts should be downloaded. +You can only define jobs from stages that are executed before the current one. +An error will be shown if you define jobs from the current stage or next ones. Defining an empty array will skip downloading any artifacts for that job. --- @@ -942,7 +947,7 @@ In the following example, we define two jobs with artifacts, `build:osx` and will be downloaded and extracted in the context of the build. The same happens for `test:linux` and artifacts from `build:linux`. -The job `deploy` will download artifacts from all previous builds because of +The job `deploy` will download artifacts from all previous jobs because of the [stage](#stages) precedence: ```yaml @@ -979,7 +984,7 @@ deploy: ### before_script and after_script -It's possible to overwrite globally defined `before_script` and `after_script`: +It's possible to overwrite the globally defined `before_script` and `after_script`: ```yaml before_script: @@ -1027,7 +1032,7 @@ There are three possible values: `clone`, `fetch`, and `none`. `clone` is the slowest option. It clones the repository from scratch for every job, ensuring that the project workspace is always pristine. -``` +```yaml variables: GIT_STRATEGY: clone ``` @@ -1036,7 +1041,7 @@ variables: if it doesn't exist). `git clean` is used to undo any changes made by the last job, and `git fetch` is used to retrieve commits made since the last job ran. -``` +```yaml variables: GIT_STRATEGY: fetch ``` @@ -1047,7 +1052,7 @@ for jobs that operate exclusively on artifacts (e.g., `deploy`). Git repository data may be present, but it is certain to be out of date, so you should only rely on files brought into the project workspace from cache or artifacts. -``` +```yaml variables: GIT_STRATEGY: none ``` @@ -1061,56 +1066,59 @@ submodules are included when fetching the code before a build. Like `GIT_STRATEGY`, it can be set in either the global [`variables`](#variables) section or the [`variables`](#job-variables) section for individual jobs. -There are three posible values: `none`, `normal`, and `recursive`: +There are three possible values: `none`, `normal`, and `recursive`: - `none` means that submodules will not be included when fetching the project code. This is the default, which matches the pre-v1.10 behavior. - `normal` means that only the top-level submodules will be included. It is equivalent to: + ``` - $ git submodule sync - $ git submodule update --init + git submodule sync + git submodule update --init ``` - `recursive` means that all submodules (including submodules of submodules) will be included. It is equivalent to: + ``` - $ git submodule sync --recursive - $ git submodule update --init --recursive + git submodule sync --recursive + git submodule update --init --recursive ``` Note that for this feature to work correctly, the submodules must be configured (in `.gitmodules`) with either: + - the HTTP(S) URL of a publicly-accessible repository, or - a relative path to another repository on the same GitLab server. See the [Git submodules](../git_submodules.md) documentation. -## Build stages attempts +## Job stages attempts > Introduced in GitLab, it requires GitLab Runner v1.9+. -You can set the number for attempts the running build will try to execute each +You can set the number for attempts the running job will try to execute each of the following stages: -| Variable | Description | -|-------------------------|-------------| -| **GET_SOURCES_ATTEMPTS** | Number of attempts to fetch sources running a build | -| **ARTIFACT_DOWNLOAD_ATTEMPTS** | Number of attempts to download artifacts running a build | -| **RESTORE_CACHE_ATTEMPTS** | Number of attempts to restore the cache running a build | +| Variable | Description | +|-------------------------------- |-------------| +| **GET_SOURCES_ATTEMPTS** | Number of attempts to fetch sources running a job | +| **ARTIFACT_DOWNLOAD_ATTEMPTS** | Number of attempts to download artifacts running a job | +| **RESTORE_CACHE_ATTEMPTS** | Number of attempts to restore the cache running a job | The default is one single attempt. Example: -``` +```yaml variables: GET_SOURCES_ATTEMPTS: "3" ``` -You can set them in the global [`variables`](#variables) section or the [`variables`](#job-variables) -section for individual jobs. +You can set them in the global [`variables`](#variables) section or the +[`variables`](#job-variables) section for individual jobs. ## Shallow cloning @@ -1123,21 +1131,22 @@ repositories with a large number of commits or old, large binaries. The value is passed to `git fetch` and `git clone`. >**Note:** -If you use a depth of 1 and have a queue of builds or retry -builds, jobs may fail. +If you use a depth of 1 and have a queue of jobs or retry +jobs, jobs may fail. -Since Git fetching and cloning is based on a ref, such as a branch name, runners -can't clone a specific commit SHA. If there are multiple builds in the queue, or -you are retrying an old build, the commit to be tested needs to be within the -git history that is cloned. Setting too small a value for `GIT_DEPTH` can make +Since Git fetching and cloning is based on a ref, such as a branch name, Runners +can't clone a specific commit SHA. If there are multiple jobs in the queue, or +you are retrying an old job, the commit to be tested needs to be within the +Git history that is cloned. Setting too small a value for `GIT_DEPTH` can make it impossible to run these old commits. You will see `unresolved reference` in -build logs. You should then reconsider changing `GIT_DEPTH` to a higher value. +job logs. You should then reconsider changing `GIT_DEPTH` to a higher value. -Builds that rely on `git describe` may not work correctly when `GIT_DEPTH` is -set since only part of the git history is present. +Jobs that rely on `git describe` may not work correctly when `GIT_DEPTH` is +set since only part of the Git history is present. To fetch or clone only the last 3 commits: -``` + +```yaml variables: GIT_DEPTH: "3" ``` @@ -1174,7 +1183,7 @@ Read more about the various [YAML features](https://learnxinyminutes.com/docs/ya > Introduced in GitLab 8.6 and GitLab Runner v1.1.1. -YAML also has a handy feature called 'anchors', which let you easily duplicate +YAML has a handy feature called 'anchors', which lets you easily duplicate content across your document. Anchors can be used to duplicate/inherit properties, and is a perfect example to be used with [hidden keys](#hidden-keys) to provide templates for your jobs. @@ -1326,17 +1335,17 @@ pages: - master ``` -Read more on [GitLab Pages user documentation](../../pages/README.md). +Read more on [GitLab Pages user documentation](../../user/project/pages/index.md). ## Validate the .gitlab-ci.yml Each instance of GitLab CI has an embedded debug tool called Lint. You can find the link under `/ci/lint` of your gitlab instance. -## Skipping builds +## Skipping jobs If your commit message contains `[ci skip]` or `[skip ci]`, using any -capitalization, the commit will be created but the builds will be skipped. +capitalization, the commit will be created but the jobs will be skipped. ## Examples diff --git a/doc/development/code_review.md b/doc/development/code_review.md index e4a0e0b92bc..819578404b6 100644 --- a/doc/development/code_review.md +++ b/doc/development/code_review.md @@ -69,7 +69,7 @@ experience, refactors the existing code). Then: someone else would be confused by it as well. - After a round of line notes, it can be helpful to post a summary note such as "LGTM :thumbsup:", or "Just a couple things to address." -- Avoid accepting a merge request before the build succeeds. Of course, "Merge +- Avoid accepting a merge request before the job succeeds. Of course, "Merge When Pipeline Succeeds" (MWPS) is fine. - If you set the MR to "Merge When Pipeline Succeeds", you should take over subsequent revisions for anything that would be spotted after that. diff --git a/doc/install/installation.md b/doc/install/installation.md index 355179960b3..0f07085942a 100644 --- a/doc/install/installation.md +++ b/doc/install/installation.md @@ -307,7 +307,7 @@ sudo usermod -aG redis git # now that files in public/uploads are served by gitlab-workhorse sudo chmod 0700 public/uploads - # Change the permissions of the directory where CI build traces are stored + # Change the permissions of the directory where CI job traces are stored sudo chmod -R u+rwX builds/ # Change the permissions of the directory where CI artifacts are stored diff --git a/doc/raketasks/backup_restore.md b/doc/raketasks/backup_restore.md index 0fb69d63dbe..b4e13f5812a 100644 --- a/doc/raketasks/backup_restore.md +++ b/doc/raketasks/backup_restore.md @@ -44,8 +44,8 @@ environment variable `SKIP`. You can skip: - `db` (database) - `uploads` (attachments) - `repositories` (Git repositories data) -- `builds` (CI build output logs) -- `artifacts` (CI build artifacts) +- `builds` (CI job output logs) +- `artifacts` (CI job artifacts) - `lfs` (LFS objects) - `registry` (Container Registry images) diff --git a/doc/university/glossary/README.md b/doc/university/glossary/README.md index 979a1c5d310..ec565c3e7bf 100644 --- a/doc/university/glossary/README.md +++ b/doc/university/glossary/README.md @@ -30,15 +30,15 @@ A version control [system](https://www.jfrog.com/open-source/#os-arti) for non-t ### Artifacts -Objects (usually binary and large) created by a build process. These can include use cases, class diagrams, requirements and design documents. +Objects (usually binary and large) created by a build process. These can include use cases, class diagrams, requirements and design documents. ### Atlassian -A [company](https://www.atlassian.com) that develops software products for developers and project managers including Bitbucket, Jira, Hipchat, Confluence, Bamboo. +A [company](https://www.atlassian.com) that develops software products for developers and project managers including Bitbucket, Jira, Hipchat, Confluence, Bamboo. ### Audit Log -Also called an [audit trail](https://en.wikipedia.org/wiki/Audit_trail), an audit log is a document that records an event in an IT system. +Also called an [audit trail](https://en.wikipedia.org/wiki/Audit_trail), an audit log is a document that records an event in an IT system. ### Auto Defined User Group @@ -55,7 +55,7 @@ Entry level [subscription](https://about.gitlab.com/pricing/) for GitLab EE curr ### Bitbucket -Atlassian's web hosting service for Git and Mercurial Projects. Read about [migrating](https://docs.gitlab.com/ce/workflow/importing/import_projects_from_bitbucket.html) from BitBucket to a GitLab instance. +Atlassian's web hosting service for Git and Mercurial Projects. Read about [migrating](https://docs.gitlab.com/ce/workflow/importing/import_projects_from_bitbucket.html) from BitBucket to a GitLab instance. ### Branch @@ -65,8 +65,8 @@ A branch is a parallel version of a repository. This allows you to work on the r Having your own logo on [your GitLab instance login page](https://docs.gitlab.com/ee/customization/branded_login_page.html) instead of the GitLab logo. -### Build triggers -These protect your code base against breaks, for instance when a team is working on the same project. Learn about [setting up](https://docs.gitlab.com/ce/ci/triggers/README.html) build triggers. +### Job triggers +These protect your code base against breaks, for instance when a team is working on the same project. Learn about [setting up](https://docs.gitlab.com/ce/ci/triggers/README.html) job triggers. ### CEPH @@ -74,7 +74,7 @@ These protect your code base against breaks, for instance when a team is working ### ChatOps -The ability to [initiate an action](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1412) from chat. ChatBots run in your chat application and give you the ability to do "anything" from chat. +The ability to [initiate an action](https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1412) from chat. ChatBots run in your chat application and give you the ability to do "anything" from chat. ### Clone @@ -82,7 +82,7 @@ A [copy](https://git-scm.com/docs/git-clone) of a repository stored on your mach ### Code Review -Examination of a progam's code. The main aim is to maintain high quality standards of code that is being shipped. Merge requests [serve as a code review tool](https://about.gitlab.com/2014/09/29/gitlab-flow/) in GitLab. +Examination of a progam's code. The main aim is to maintain high quality standards of code that is being shipped. Merge requests [serve as a code review tool](https://about.gitlab.com/2014/09/29/gitlab-flow/) in GitLab. ### Code Snippet @@ -140,7 +140,7 @@ A [SSH key](https://docs.gitlab.com/ce/gitlab-basics/create-your-ssh-keys.html)s For us at GitLab, this means a software developer, or someone who makes software. It is also one of the levels of access in our multi-level approval system. -### DevOps +### DevOps The intersection of software engineering, quality assurance, and technology operations. Explore more DevOps topics in the [glossary by XebiaLabs](https://xebialabs.com/glossary/) @@ -160,7 +160,7 @@ A [feature](https://docs.gitlab.com/ce/user/project/container_registry.html) of ### ElasticSearch -Elasticsearch is a flexible, scalable and powerful search service. When [enabled](https://gitlab.com/help/integration/elasticsearch.md), it helps keep GitLab's search fast when dealing with a huge amount of data. +Elasticsearch is a flexible, scalable and powerful search service. When [enabled](https://gitlab.com/help/integration/elasticsearch.md), it helps keep GitLab's search fast when dealing with a huge amount of data. ### Emacs @@ -174,7 +174,7 @@ A code review [tool](https://www.gerritcodereview.com/) built on top of Git. ### Git Attributes -A [git attributes file](https://git-scm.com/docs/gitattributes) is a simple text file that gives attributes to pathnames. +A [git attributes file](https://git-scm.com/docs/gitattributes) is a simple text file that gives attributes to pathnames. ### Git Hooks @@ -209,7 +209,7 @@ Our free SaaS for public and private repositories. Allows you to replicate your GitLab instance to other geographical locations as a read-only fully operational version. It [can be used](https://docs.gitlab.com/ee/gitlab-geo/README.html) for cloning and fetching projects, in addition to reading any data. This will make working with large repositories over large distances much faster. ### GitLab Pages -These allow you to [create websites](https://gitlab.com/help/pages/README.md) for your GitLab projects, groups, or user account. +These allow you to [create websites](https://gitlab.com/help/pages/README.md) for your GitLab projects, groups, or user account. ### Gitolite @@ -253,7 +253,7 @@ A [tool](https://docs.gitlab.com/ee/integration/external-issue-tracker.html) use ### Jenkins -An Open Source CI tool written using the Java programming language. [Jenkins](https://jenkins-ci.org/) does the same job as GitLab CI, Bamboo, and Travis CI. It is extremely popular. +An Open Source CI tool written using the Java programming language. [Jenkins](https://jenkins-ci.org/) does the same job as GitLab CI, Bamboo, and Travis CI. It is extremely popular. ### Jira @@ -289,7 +289,7 @@ Allows you to synchronize the members of a GitLab group with one or more LDAP gr ### Load Balancer -A [device](https://en.wikipedia.org/wiki/Load_balancing_(computing)) that distributes network or application traffic across multiple servers. +A [device](https://en.wikipedia.org/wiki/Load_balancing_(computing)) that distributes network or application traffic across multiple servers. ### Git Large File Storage (LFS) @@ -301,7 +301,7 @@ An operating system like Windows or OS X. It is mostly used by software develope ### Markdown -A lightweight markup language with plain text formatting syntax designed so that it can be converted to HTML and many other formats using a tool by the same name. Markdown is often used to format readme files, for writing messages in online discussion forums, and to create rich text using a plain text editor. Checkout GitLab's [Markdown guide](https://gitlab.com/help/user/markdown.md). +A lightweight markup language with plain text formatting syntax designed so that it can be converted to HTML and many other formats using a tool by the same name. Markdown is often used to format readme files, for writing messages in online discussion forums, and to create rich text using a plain text editor. Checkout GitLab's [Markdown guide](https://gitlab.com/help/user/markdown.md). ### Maria DB @@ -313,11 +313,11 @@ Name of the [default branch](https://git-scm.com/book/en/v1/Git-Branching-What-a ### Mattermost -An open source, self-hosted messaging alternative to Slack. View GitLab's Mattermost [feature](https://gitlab.com/gitlab-org/gitlab-mattermost). +An open source, self-hosted messaging alternative to Slack. View GitLab's Mattermost [feature](https://gitlab.com/gitlab-org/gitlab-mattermost). ### Mercurial -A free distributed version control system similar to and a competitor with Git. +A free distributed version control system similar to and a competitor with Git. ### Merge @@ -325,7 +325,7 @@ Takes changes from one branch, and [applies them](https://git-scm.com/docs/git-m ### Merge Conflict -[Arises](https://about.gitlab.com/2016/09/06/resolving-merge-conflicts-from-the-gitlab-ui/) when a merge can't be performed cleanly between two versions of the same file. +[Arises](https://about.gitlab.com/2016/09/06/resolving-merge-conflicts-from-the-gitlab-ui/) when a merge can't be performed cleanly between two versions of the same file. ### Meteor @@ -345,7 +345,7 @@ A type of software license. It lets people do anything with your code with prope ### Mondo Rescue -A free disaster recovery [software](https://help.ubuntu.com/community/MondoMindi). +A free disaster recovery [software](https://help.ubuntu.com/community/MondoMindi). ### MySQL @@ -361,7 +361,7 @@ A web [server](https://www.nginx.com/resources/wiki/) (pronounced "engine x"). I ### OAuth -An open standard for authorization, commonly used as a way for internet users to log into third party websites using their Microsoft, Google, Facebook or Twitter accounts without exposing their password. GitLab [is](https://docs.gitlab.com/ce/integration/oauth_provider.html) an OAuth2 authentication service provider. +An open standard for authorization, commonly used as a way for internet users to log into third party websites using their Microsoft, Google, Facebook or Twitter accounts without exposing their password. GitLab [is](https://docs.gitlab.com/ce/integration/oauth_provider.html) an OAuth2 authentication service provider. ### Omnibus Packages @@ -371,13 +371,13 @@ A way to [package different services and tools](https://docs.gitlab.com/omnibus/ On your own server. In GitLab, this [refers](https://about.gitlab.com/2015/02/12/why-ship-on-premises-in-the-saas-era/) to the ability to download GitLab EE/GitLab CE and host it on your own server rather than using GitLab.com, which is hosted by GitLab Inc's servers. -### Open Core +### Open Core GitLab's [business model](https://about.gitlab.com/2016/07/20/gitlab-is-open-core-github-is-closed-source/). Coined by Andrew Lampitt in 2008, the [open core model](https://en.wikipedia.org/wiki/Open_core) primarily involves offering a "core" or feature-limited version of a software product as free and open-source software, while offering "commercial" versions or add-ons as proprietary software. ### Open Source Software -Software for which the original source code is freely [available](https://opensource.org/docs/osd) and may be redistributed and modified. GitLab prioritizes open source [stewardship](https://about.gitlab.com/2016/01/11/being-a-good-open-source-steward/). +Software for which the original source code is freely [available](https://opensource.org/docs/osd) and may be redistributed and modified. GitLab prioritizes open source [stewardship](https://about.gitlab.com/2016/01/11/being-a-good-open-source-steward/). ### Owner @@ -405,7 +405,7 @@ GitLab Premium EE [subscription](https://about.gitlab.com/pricing/) that include ### PostgreSQL -An [object-relational](https://en.wikipedia.org/wiki/PostgreSQL) database. Touted as the most advanced open source database, it is one of two database management systems [supported by](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/database.md) GitLab, the other being MySQL. +An [object-relational](https://en.wikipedia.org/wiki/PostgreSQL) database. Touted as the most advanced open source database, it is one of two database management systems [supported by](https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/database.md) GitLab, the other being MySQL. ### Protected Branches @@ -421,7 +421,7 @@ A popular DevOps [automation tool](https://puppet.com/product/how-puppet-works). ### Push -Git [command](https://git-scm.com/docs/git-push) to send commits from the local repository to the remote repository. Read about [advanced push rules](https://gitlab.com/help/pages/README.md) in GitLab. +Git [command](https://git-scm.com/docs/git-push) to send commits from the local repository to the remote repository. Read about [advanced push rules](https://gitlab.com/help/pages/README.md) in GitLab. ### RE Read Only @@ -429,7 +429,7 @@ Permissions to see a file and its contents, but not change it. ### Rebase -In addition to the merge, the [rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) is a main way to integrate changes from one branch into another. +In addition to the merge, the [rebase](https://git-scm.com/book/en/v2/Git-Branching-Rebasing) is a main way to integrate changes from one branch into another. ### (Git) Repository @@ -449,7 +449,7 @@ An open source chat application for teams, RocketChat is very similar to Slack b ### Route Table -A route table contains rules (called routes) that determine where network traffic is directed. Each [subnet in a VPC](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html) must be associated with a route table. +A route table contains rules (called routes) that determine where network traffic is directed. Each [subnet in a VPC](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Route_Tables.html) must be associated with a route table. ### Runners @@ -477,15 +477,15 @@ The board used to track the status and progress of each of the sprint backlog it ### Shell -Terminal on Mac OSX, GitBash on Windows, or Linux Terminal on Linux. You [use git]() and make changes to GitLab projects in your shell. You [use git](https://docs.gitlab.com/ce/gitlab-basics/start-using-git.html) and make changes to GitLab projects in your shell. +Terminal on Mac OSX, GitBash on Windows, or Linux Terminal on Linux. You [use git]() and make changes to GitLab projects in your shell. You [use git](https://docs.gitlab.com/ce/gitlab-basics/start-using-git.html) and make changes to GitLab projects in your shell. ### Single-tenant -The tenant purchases their own copy of the software and the software can be customized to meet the specific and needs of that customer. [GitHost.io](https://about.gitlab.com/handbook/positioning-faq/) is our provider of single-tenant 'managed cloud' GitLab instances. +The tenant purchases their own copy of the software and the software can be customized to meet the specific and needs of that customer. [GitHost.io](https://about.gitlab.com/handbook/positioning-faq/) is our provider of single-tenant 'managed cloud' GitLab instances. ### Slack -Real time messaging app for teams that is used internally by GitLab team members. GitLab users can enable [Slack integration](https://docs.gitlab.com/ce/project_services/slack.html) to trigger push, issue, and merge request events among others. +Real time messaging app for teams that is used internally by GitLab team members. GitLab users can enable [Slack integration](https://docs.gitlab.com/ce/project_services/slack.html) to trigger push, issue, and merge request events among others. ### Slave Servers @@ -529,7 +529,7 @@ A program that allows you to perform superuser/administrator actions on Unix Ope ### Subversion (SVN) -An open source version control system. Read about [migrating from SVN](https://docs.gitlab.com/ce/workflow/importing/migrating_from_svn.html) to GitLab using SubGit. +An open source version control system. Read about [migrating from SVN](https://docs.gitlab.com/ce/workflow/importing/migrating_from_svn.html) to GitLab using SubGit. ### Tag @@ -545,7 +545,7 @@ An open source project management and bug tracking web [application](https://tra ### Untracked files -New files that Git has not [been told](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository) to track previously. +New files that Git has not [been told](https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository) to track previously. ### User @@ -553,11 +553,11 @@ Anyone interacting with the software. ### Version Control Software (VCS) -Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later. VCS [has evolved](https://docs.google.com/presentation/d/16sX7hUrCZyOFbpvnrAFrg6tVO5_yT98IgdAqOmXwBho/edit#slide=id.gd69537a19_0_32) from local version control systems, to centralized version control systems, to the present distributed version control systems like Git, Mercurial, Bazaar, and Darcs. +Version control is a system that records changes to a file or set of files over time so that you can recall specific versions later. VCS [has evolved](https://docs.google.com/presentation/d/16sX7hUrCZyOFbpvnrAFrg6tVO5_yT98IgdAqOmXwBho/edit#slide=id.gd69537a19_0_32) from local version control systems, to centralized version control systems, to the present distributed version control systems like Git, Mercurial, Bazaar, and Darcs. ### Virtual Private Cloud (VPC) -An on demand configurable pool of shared computing resources allocated within a public cloud environment, providing some isolation between the different users using the resources. GitLab users need to create a new Amazon VPC in order to [setup High Availability](https://docs.gitlab.com/ce/university/high-availability/aws/). +An on demand configurable pool of shared computing resources allocated within a public cloud environment, providing some isolation between the different users using the resources. GitLab users need to create a new Amazon VPC in order to [setup High Availability](https://docs.gitlab.com/ce/university/high-availability/aws/). ### Virtual private server (VPS) @@ -565,15 +565,15 @@ A [virtual machine](https://en.wikipedia.org/wiki/Virtual_private_server) sold a ### VM Instance -In object-oriented programming, an [instance](http://stackoverflow.com/questions/20461907/what-is-meaning-of-instance-in-programming) is a specific realization of any object. An object may be varied in a number of ways. Each realized variation of that object is an instance. Therefore, a VM instance is an instance of a virtual machine, which is an emulation of a computer system. +In object-oriented programming, an [instance](http://stackoverflow.com/questions/20461907/what-is-meaning-of-instance-in-programming) is a specific realization of any object. An object may be varied in a number of ways. Each realized variation of that object is an instance. Therefore, a VM instance is an instance of a virtual machine, which is an emulation of a computer system. ### Waterfall -A [model](http://www.umsl.edu/~hugheyd/is6840/waterfall.html) of building software that involves collecting all requirements from the customer, then building and refining all the requirements and finally delivering the complete software to the customer that meets all the requirements they specified. +A [model](http://www.umsl.edu/~hugheyd/is6840/waterfall.html) of building software that involves collecting all requirements from the customer, then building and refining all the requirements and finally delivering the complete software to the customer that meets all the requirements they specified. ### Webhooks -A way for for an app to [provide](https://docs.gitlab.com/ce/user/project/integrations/webhooks.html) other applications with real-time information (e.g., send a message to a slack channel when a commit is pushed.) Read about setting up [custom git hooks](https://gitlab.com/help/administration/custom_hooks.md) for when webhooks are insufficient. +A way for for an app to [provide](https://docs.gitlab.com/ce/user/project/integrations/webhooks.html) other applications with real-time information (e.g., send a message to a slack channel when a commit is pushed.) Read about setting up [custom git hooks](https://gitlab.com/help/administration/custom_hooks.md) for when webhooks are insufficient. ### Wiki @@ -585,5 +585,5 @@ A [website/system](http://www.wiki.com/) that allows for collaborative editing o ### YAML -A human-readable data serialization [language](http://www.yaml.org/about.html) that takes concepts from programming languages such as C, Perl, and Python, and ideas from XML and the data format of electronic mail. +A human-readable data serialization [language](http://www.yaml.org/about.html) that takes concepts from programming languages such as C, Perl, and Python, and ideas from XML and the data format of electronic mail. diff --git a/doc/user/admin_area/settings/continuous_integration.md b/doc/user/admin_area/settings/continuous_integration.md index 34e2e557f89..b8d24cb2d3b 100644 --- a/doc/user/admin_area/settings/continuous_integration.md +++ b/doc/user/admin_area/settings/continuous_integration.md @@ -2,9 +2,9 @@ ## Maximum artifacts size -The maximum size of the [build artifacts][art-yml] can be set in the Admin area +The maximum size of the [job artifacts][art-yml] can be set in the Admin area of your GitLab instance. The value is in MB and the default is 100MB. Note that -this setting is set for each build. +this setting is set for each job. 1. Go to **Admin area > Settings** (`/admin/application_settings`). @@ -17,4 +17,4 @@ this setting is set for each build. 1. Hit **Save** for the changes to take effect. -[art-yml]: ../../../administration/build_artifacts.md +[art-yml]: ../../../administration/job_artifacts.md diff --git a/doc/user/permissions.md b/doc/user/permissions.md index e87cae092a5..b49a244160a 100644 --- a/doc/user/permissions.md +++ b/doc/user/permissions.md @@ -22,9 +22,9 @@ The following table depicts the various user permission levels in a project. | Create confidential issue | ✓ | ✓ | ✓ | ✓ | ✓ | | View confidential issues | (✓) [^1] | ✓ | ✓ | ✓ | ✓ | | Leave comments | ✓ | ✓ | ✓ | ✓ | ✓ | -| See a list of builds | ✓ [^2] | ✓ | ✓ | ✓ | ✓ | -| See a build log | ✓ [^2] | ✓ | ✓ | ✓ | ✓ | -| Download and browse build artifacts | ✓ [^2] | ✓ | ✓ | ✓ | ✓ | +| See a list of jobs | ✓ [^2] | ✓ | ✓ | ✓ | ✓ | +| See a job log | ✓ [^2] | ✓ | ✓ | ✓ | ✓ | +| Download and browse job artifacts | ✓ [^2] | ✓ | ✓ | ✓ | ✓ | | View wiki pages | ✓ | ✓ | ✓ | ✓ | ✓ | | Pull project code | | ✓ | ✓ | ✓ | ✓ | | Download project | | ✓ | ✓ | ✓ | ✓ | @@ -46,7 +46,7 @@ The following table depicts the various user permission levels in a project. | Remove non-protected branches | | | ✓ | ✓ | ✓ | | Add tags | | | ✓ | ✓ | ✓ | | Write a wiki | | | ✓ | ✓ | ✓ | -| Cancel and retry builds | | | ✓ | ✓ | ✓ | +| Cancel and retry jobs | | | ✓ | ✓ | ✓ | | Create or update commit status | | | ✓ | ✓ | ✓ | | Update a container registry | | | ✓ | ✓ | ✓ | | Remove a container registry image | | | ✓ | ✓ | ✓ | @@ -60,7 +60,7 @@ The following table depicts the various user permission levels in a project. | Add deploy keys to project | | | | ✓ | ✓ | | Configure project hooks | | | | ✓ | ✓ | | Manage runners | | | | ✓ | ✓ | -| Manage build triggers | | | | ✓ | ✓ | +| Manage job triggers | | | | ✓ | ✓ | | Manage variables | | | | ✓ | ✓ | | Manage pages | | | | ✓ | ✓ | | Manage pages domains and certificates | | | | ✓ | ✓ | @@ -134,8 +134,8 @@ instance and project. In addition, all admins can use the admin interface under | Action | Guest, Reporter | Developer | Master | Admin | |---------------------------------------|-----------------|-------------|----------|--------| -| See commits and builds | ✓ | ✓ | ✓ | ✓ | -| Retry or cancel build | | ✓ | ✓ | ✓ | +| See commits and jobs | ✓ | ✓ | ✓ | ✓ | +| Retry or cancel job | | ✓ | ✓ | ✓ | | Remove project | | | ✓ | ✓ | | Create project | | | ✓ | ✓ | | Change project configuration | | | ✓ | ✓ | @@ -144,18 +144,18 @@ instance and project. In addition, all admins can use the admin interface under | See events in the system | | | | ✓ | | Admin interface | | | | ✓ | -### Builds permissions +### Jobs permissions >**Note:** -GitLab 8.12 has a completely redesigned build permissions system. +GitLab 8.12 has a completely redesigned job permissions system. Read all about the [new model and its implications][new-mod]. -This table shows granted privileges for builds triggered by specific types of +This table shows granted privileges for jobs triggered by specific types of users: | Action | Guest, Reporter | Developer | Master | Admin | |---------------------------------------------|-----------------|-------------|----------|--------| -| Run CI build | | ✓ | ✓ | ✓ | +| Run CI job | | ✓ | ✓ | ✓ | | Clone source and LFS from current project | | ✓ | ✓ | ✓ | | Clone source and LFS from public projects | | ✓ | ✓ | ✓ | | Clone source and LFS from internal projects | | ✓ [^4] | ✓ [^4] | ✓ | diff --git a/doc/user/project/builds/artifacts.md b/doc/user/project/builds/artifacts.md index 88f1863dddb..514c729b37d 100644 --- a/doc/user/project/builds/artifacts.md +++ b/doc/user/project/builds/artifacts.md @@ -1,136 +1 @@ -# Introduction to build artifacts - ->**Notes:** ->- Since GitLab 8.2 and GitLab Runner 0.7.0, build artifacts that are created by - GitLab Runner are uploaded to GitLab and are downloadable as a single archive - (`tar.gz`) using the GitLab UI. ->- Starting from GitLab 8.4 and GitLab Runner 1.0, the artifacts archive format - changed to `ZIP`, and it is now possible to browse its contents, with the added - ability of downloading the files separately. ->- The artifacts browser will be available only for new artifacts that are sent - to GitLab using GitLab Runner version 1.0 and up. It will not be possible to - browse old artifacts already uploaded to GitLab. ->- This is the user documentation. For the administration guide see - [administration/build_artifacts.md](../../../administration/build_artifacts.md). - -Artifacts is a list of files and directories which are attached to a build -after it completes successfully. This feature is enabled by default in all GitLab installations. - -## Defining artifacts in `.gitlab-ci.yml` - -A simple example of using the artifacts definition in `.gitlab-ci.yml` would be -the following: - -```yaml -pdf: - script: xelatex mycv.tex - artifacts: - paths: - - mycv.pdf -``` - -A job named `pdf` calls the `xelatex` command in order to build a pdf file from -the latex source file `mycv.tex`. We then define the `artifacts` paths which in -turn are defined with the `paths` keyword. All paths to files and directories -are relative to the repository that was cloned during the build. - -For more examples on artifacts, follow the artifacts reference in -[`.gitlab-ci.yml` documentation](../../../ci/yaml/README.md#artifacts). - -## Browsing build artifacts - -When GitLab receives an artifacts archive, an archive metadata file is also -generated. This metadata file describes all the entries that are located in the -artifacts archive itself. The metadata file is in a binary format, with -additional GZIP compression. - -GitLab does not extract the artifacts archive in order to save space, memory -and disk I/O. It instead inspects the metadata file which contains all the -relevant information. This is especially important when there is a lot of -artifacts, or an archive is a very large file. - ---- - -After a build finishes, if you visit the build's specific page, you can see -that there are two buttons. One is for downloading the artifacts archive and -the other for browsing its contents. - -![Build artifacts browser button](img/build_artifacts_browser_button.png) - ---- - -The archive browser shows the name and the actual file size of each file in the -archive. If your artifacts contained directories, then you are also able to -browse inside them. - -Below you can see how browsing looks like. In this case we have browsed inside -the archive and at this point there is one directory and one HTML file. - -![Build artifacts browser](img/build_artifacts_browser.png) - ---- - -## Downloading build artifacts - ->**Note:** -GitLab does not extract the entire artifacts archive to send just a single file -to the user. When clicking on a specific file, [GitLab Workhorse] extracts it -from the archive and the download begins. This implementation saves space, -memory and disk I/O. - -If you need to download the whole archive, there are buttons in various places -inside GitLab that make that possible. - -1. While on the pipelines page, you can see the download icon for each build's - artifacts archive in the right corner: - - ![Build artifacts in Pipelines page](img/build_artifacts_pipelines_page.png) - -1. While on the builds page, you can see the download icon for each build's - artifacts archive in the right corner: - - ![Build artifacts in Builds page](img/build_artifacts_builds_page.png) - -1. While inside a specific build, you are presented with a download button - along with the one that browses the archive: - - ![Build artifacts browser button](img/build_artifacts_browser_button.png) - -1. And finally, when browsing an archive you can see the download button at - the top right corner: - - ![Build artifacts browser](img/build_artifacts_browser.png) - -## Downloading the latest build artifacts - -It is possible to download the latest artifacts of a build via a well known URL -so you can use it for scripting purposes. - -The structure of the URL is the following: - -``` -https://example.com///builds/artifacts//download?job= -``` - -For example, to download the latest artifacts of the job named `rspec 6 20` of -the `master` branch of the `gitlab-ce` project that belongs to the `gitlab-org` -namespace, the URL would be: - -``` -https://gitlab.com/gitlab-org/gitlab-ce/builds/artifacts/master/download?job=rspec+6+20 -``` - -The latest builds are also exposed in the UI in various places. Specifically, -look for the download button in: - -- the main project's page -- the branches page -- the tags page - -If the latest build has failed to upload the artifacts, you can see that -information in the UI. - -![Latest artifacts button](img/build_latest_artifacts_browser.png) - - -[gitlab workhorse]: https://gitlab.com/gitlab-org/gitlab-workhorse "GitLab Workhorse repository" +This document was moved to [pipelines/job_artifacts](../pipelines/job_artifacts.md). diff --git a/doc/user/project/builds/img/build_artifacts_browser.png b/doc/user/project/builds/img/build_artifacts_browser.png deleted file mode 100644 index 686273948d62b37e60dede99c7ad636f1547e08b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3782 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 diff --git a/doc/user/project/builds/img/build_artifacts_browser_button.png b/doc/user/project/builds/img/build_artifacts_browser_button.png deleted file mode 100644 index 33ef7de0415e6c0284ac6cfb2f3f50f9f5bf1cc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4891 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 diff --git a/doc/user/project/builds/img/build_artifacts_builds_page.png b/doc/user/project/builds/img/build_artifacts_builds_page.png deleted file mode 100644 index 8f75602d5920580aa05d02312bd02841400ea2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22022 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

W5 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

D7nH8o`1y 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 diff --git a/doc/user/project/builds/img/build_artifacts_pipelines_page.png b/doc/user/project/builds/img/build_artifacts_pipelines_page.png deleted file mode 100644 index 4bbd00ddaa090ab2004a1455cbd05e3cce7f23c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28339 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 ZT>iTq7>Ou9_)m#VNls0+LfS0!e*pL6!nOba diff --git a/doc/user/project/integrations/webhooks.md b/doc/user/project/integrations/webhooks.md index 55d480bfb72..ed1e867f5fb 100644 --- a/doc/user/project/integrations/webhooks.md +++ b/doc/user/project/integrations/webhooks.md @@ -11,7 +11,7 @@ a new issue is created. You can configure webhooks to listen for specific events like pushes, issues or merge requests. GitLab will send a POST request with data to the webhook URL. -Webhooks can be used to update an external issue tracker, trigger CI builds, +Webhooks can be used to update an external issue tracker, trigger CI jobs, update a backup mirror, or even deploy to your production server. Navigate to the webhooks page by going to the **Integrations** page from your diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md index a27e683143d..abd3740ef20 100644 --- a/doc/user/project/merge_requests/index.md +++ b/doc/user/project/merge_requests/index.md @@ -22,7 +22,7 @@ in a merged merge requests or a commit. ## Merge when pipeline succeeds When reviewing a merge request that looks ready to merge but still has one or -more CI builds running, you can set it to be merged automatically when CI +more CI jobs running, you can set it to be merged automatically when CI pipeline succeeds. This way, you don't have to wait for the pipeline to finish and remember to merge the request manually. diff --git a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md index 75ad18b28cf..c63a408505f 100644 --- a/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md +++ b/doc/user/project/merge_requests/merge_when_pipeline_succeeds.md @@ -1,8 +1,8 @@ # Merge When Pipeline Succeeds When reviewing a merge request that looks ready to merge but still has one or -more CI builds running, you can set it to be merged automatically when the -builds pipeline succeeds. This way, you don't have to wait for the builds to +more CI jobs running, you can set it to be merged automatically when the +jobs pipeline succeeds. This way, you don't have to wait for the jobs to finish and remember to merge the request manually. ![Enable](img/merge_when_build_succeeds_enable.png) @@ -19,10 +19,10 @@ after all. ![Status](img/merge_when_build_succeeds_status.png) When the pipeline succeeds, the merge request will automatically be merged. -When the pipeline fails, the author gets a chance to retry any failed builds, +When the pipeline fails, the author gets a chance to retry any failed jobs, or to push new commits to fix the failure. -When the builds are retried and succeed on the second try, the merge request +When the jobs are retried and succeed on the second try, the merge request will automatically be merged after all. When the merge request is updated with new commits, the automatic merge is automatically canceled to allow the new changes to be reviewed. @@ -30,7 +30,7 @@ changes to be reviewed. ## Only allow merge requests to be merged if the pipeline succeeds > **Note:** -You need to have builds configured to enable this feature. +You need to have jobs configured to enable this feature. You can prevent merge requests from being merged if their pipeline did not succeed. @@ -41,6 +41,6 @@ hit **Save** for the changes to take effect. ![Only allow merge if pipeline succeeds settings](img/merge_when_build_succeeds_only_if_succeeds_settings.png) From now on, every time the pipeline fails you will not be able to merge the -merge request from the UI, until you make all relevant builds pass. +merge request from the UI, until you make all relevant jobs pass. ![Only allow merge if pipeline succeeds message](img/merge_when_build_succeeds_only_if_succeeds_msg.png) diff --git a/doc/user/project/new_ci_build_permissions_model.md b/doc/user/project/new_ci_build_permissions_model.md index 320faff65c5..5f631f63050 100644 --- a/doc/user/project/new_ci_build_permissions_model.md +++ b/doc/user/project/new_ci_build_permissions_model.md @@ -1,55 +1,55 @@ -# New CI build permissions model +# New CI job permissions model > Introduced in GitLab 8.12. -GitLab 8.12 has a completely redesigned [build permissions] system. You can find +GitLab 8.12 has a completely redesigned [job permissions] system. You can find all discussion and all our concerns when choosing the current approach in issue [#18994](https://gitlab.com/gitlab-org/gitlab-ce/issues/18994). --- -Builds permissions should be tightly integrated with the permissions of a user -who is triggering a build. +Jobs permissions should be tightly integrated with the permissions of a user +who is triggering a job. The reasons to do it like that are: - We already have a permissions system in place: group and project membership of users. -- We already fully know who is triggering a build (using `git push`, using the +- We already fully know who is triggering a job (using `git push`, using the web UI, executing triggers). - We already know what user is allowed to do. -- We use the user permissions for builds that are triggered by the user. +- We use the user permissions for jobs that are triggered by the user. - It opens a lot of possibilities to further enforce user permissions, like allowing only specific users to access runners or use secure variables and environments. -- It is simple and convenient that your build can access everything that you +- It is simple and convenient that your job can access everything that you as a user have access to. -- Short living unique tokens are now used, granting access for time of the build +- Short living unique tokens are now used, granting access for time of the job and maximizing security. -With the new behavior, any build that is triggered by the user, is also marked +With the new behavior, any job that is triggered by the user, is also marked with their permissions. When a user does a `git push` or changes files through the web UI, a new pipeline will be usually created. This pipeline will be marked -as created be the pusher (local push or via the UI) and any build created in this +as created be the pusher (local push or via the UI) and any job created in this pipeline will have the permissions of the pusher. This allows us to make it really easy to evaluate the access for all projects that have [Git submodules][gitsub] or are using container images that the pusher -would have access too. **The permission is granted only for time that build is -running. The access is revoked after the build is finished.** +would have access too. **The permission is granted only for time that job is +running. The access is revoked after the job is finished.** ## Types of users It is important to note that we have a few types of users: -- **Administrators**: CI builds created by Administrators will not have access +- **Administrators**: CI jobs created by Administrators will not have access to all GitLab projects, but only to projects and container images of projects that the administrator is a member of.That means that if a project is either public or internal users have access anyway, but if a project is private, the Administrator will have to be a member of it in order to have access to it - via another project's build. + via another project's job. -- **External users**: CI builds created by [external users][ext] will have +- **External users**: CI jobs created by [external users][ext] will have access only to projects to which user has at least reporter access. This rules out accessing all internal projects by default, @@ -57,46 +57,46 @@ This allows us to make the CI and permission system more trustworthy. Let's consider the following scenario: 1. You are an employee of a company. Your company has a number of internal tools - hosted in private repositories and you have multiple CI builds that make use + hosted in private repositories and you have multiple CI jobs that make use of these repositories. -2. You invite a new [external user][ext]. CI builds created by that user do not +2. You invite a new [external user][ext]. CI jobs created by that user do not have access to internal repositories, because the user also doesn't have the access from within GitLab. You as an employee have to grant explicit access for this user. This allows us to prevent from accidental data leakage. -## Build token +## Job token -A unique build token is generated for each build and it allows the user to +A unique job token is generated for each job and it allows the user to access all projects that would be normally accessible to the user creating that -build. +job. We try to make sure that this token doesn't leak by: -1. Securing all API endpoints to not expose the build token. -1. Masking the build token from build logs. -1. Allowing to use the build token **only** when build is running. +1. Securing all API endpoints to not expose the job token. +1. Masking the job token from job logs. +1. Allowing to use the job token **only** when job is running. However, this brings a question about the Runners security. To make sure that this token doesn't leak, you should also make sure that you configure your Runners in the most possible secure way, by avoiding the following: 1. Any usage of Docker's `privileged` mode is risky if the machines are re-used. -1. Using the `shell` executor since builds run on the same machine. +1. Using the `shell` executor since jobs run on the same machine. By using an insecure GitLab Runner configuration, you allow the rogue developers -to steal the tokens of other builds. +to steal the tokens of other jobs. -## Build triggers +## job triggers -[Build triggers][triggers] do not support the new permission model. -They continue to use the old authentication mechanism where the CI build +[job triggers][triggers] do not support the new permission model. +They continue to use the old authentication mechanism where the CI job can access only its own sources. We plan to remove that limitation in one of the upcoming releases. ## Before GitLab 8.12 -In versions before GitLab 8.12, all CI builds would use the CI Runner's token +In versions before GitLab 8.12, all CI jobs would use the CI Runner's token to checkout project sources. The project's Runner's token was a token that you could find under the @@ -105,7 +105,7 @@ project. It could be used for registering new specific Runners assigned to the project and to checkout project sources. It could also be used with the GitLab Container Registry for that project, -allowing pulling and pushing Docker images from within the CI build. +allowing pulling and pushing Docker images from within the CI job. --- @@ -115,7 +115,7 @@ GitLab would create a special checkout URL like: https://gitlab-ci-token:/gitlab.com/gitlab-org/gitlab-ce.git ``` -And then the users could also use it in their CI builds all Docker related +And then the users could also use it in their CI jobs all Docker related commands to interact with GitLab Container Registry. For example: ``` @@ -125,7 +125,7 @@ docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.gitlab.com Using single token had multiple security implications: - The token would be readable to anyone who had developer access to a project - that could run CI builds, allowing the developer to register any specific + that could run CI jobs, allowing the developer to register any specific Runner for that project. - The token would allow to access only the project's sources, forbidding from accessing any other projects. @@ -133,12 +133,12 @@ Using single token had multiple security implications: for registering specific runners and for accessing a project's container registry with read-write permissions. -All the above led to a new permission model for builds that was introduced +All the above led to a new permission model for jobs that was introduced with GitLab 8.12. -## Making use of the new CI build permissions model +## Making use of the new CI job permissions model -With the new build permissions model, there is now an easy way to access all +With the new job permissions model, there is now an easy way to access all dependent source code in a project. That way, we can: 1. Access a project's [Git submodules][gitsub] @@ -151,9 +151,9 @@ the container registry. ### Prerequisites to use the new permissions model -With the new permissions model in place, there may be times that your build will +With the new permissions model in place, there may be times that your job will fail. This is most likely because your project tries to access other project's -sources, and you don't have the appropriate permissions. In the build log look +sources, and you don't have the appropriate permissions. In the job log look for information about 403 or forbidden access messages. In short here's what you need to do should you encounter any issues. @@ -175,7 +175,7 @@ As a user: - Make sure you are a member of the group or project you're trying to have access to. As an Administrator, you can verify that by impersonating the user - and retry the failing build in order to verify that everything is correct. + and retry the failing job in order to verify that everything is correct. ### Git submodules @@ -199,9 +199,9 @@ Container Registries for private projects. to pass a personal access token instead of your password in order to login to GitLab's Container Registry. -Your builds can access all container images that you would normally have access +Your jobs can access all container images that you would normally have access to. The only implication is that you can push to the Container Registry of the -project for which the build is triggered. +project for which the job is triggered. This is how an example usage can look like: @@ -213,7 +213,7 @@ test: - docker run $CI_REGISTRY/group/other-project:latest ``` -[build permissions]: ../permissions.md#builds-permissions +[job permissions]: ../permissions.md#jobs-permissions [comment]: https://gitlab.com/gitlab-org/gitlab-ce/issues/22484#note_16648302 [ext]: ../permissions.md#external-users [gitsub]: ../../ci/git_submodules.md diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md index b814e3fccb2..044c89a03c0 100644 --- a/doc/user/project/pages/index.md +++ b/doc/user/project/pages/index.md @@ -100,7 +100,7 @@ whereas a group's project under `http(s)://groupname.example.io/projectname`. The key thing about GitLab Pages is the `.gitlab-ci.yml` file, something that gives you absolute control over the build process. You can actually watch your -website being built live by following the CI build traces. +website being built live by following the CI job traces. > **Note:** > Before reading this section, make sure you familiarize yourself with GitLab CI @@ -127,7 +127,7 @@ pages: ``` When the Runner reaches to build the `pages` job, it executes whatever is -defined in the `script` parameter and if the build completes with a non-zero +defined in the `script` parameter and if the job completes with a non-zero exit status, it then uploads the `public/` directory to GitLab Pages. The `public/` directory should contain all the static content of your website. @@ -211,11 +211,11 @@ pages: # the build job must be named pages ``` Here, we used the Docker executor and in the first line we specified the base -image against which our builds will run. +image against which our jobs will run. You have to make sure that the generated static files are ultimately placed under the `public` directory, that's why in the `script` section we run the -`jekyll` command that builds the website and puts all content in the `public/` +`jekyll` command that jobs the website and puts all content in the `public/` directory. Depending on the static generator of your choice, this command will differ. Search in the documentation of the static generator you will use if there is an option to explicitly set the output directory. If there is not @@ -403,7 +403,7 @@ don't have to create and edit HTML files manually. For example, Jekyll has the ### Can I download my generated pages? -Sure. All you need to do is download the artifacts archive from the build page. +Sure. All you need to do is download the artifacts archive from the job page. ### Can I use GitLab Pages if my project is private? diff --git a/doc/user/project/pipelines/img/job_artifacts_browser.png b/doc/user/project/pipelines/img/job_artifacts_browser.png new file mode 100644 index 0000000000000000000000000000000000000000..145fe156bbb17cfa267d4f02d905e0bd7d5ba8bc GIT binary patch literal 3771 zcmZWscT^Kd_r-M;KRFf@Q9*DQEGP@85J0LTgpLFOMS4%6EG6_%6odc)k={!nAXPd@ zU8M;`2!xU#H3ULQs39ak_<`ql&VHWn{q^R~Id|r~dH2o?QeRK~+*!V}92^|yG&NKW zI5>Vob8wtEb>`#|GP5cubp$ZvDVkuS65e) zw3WX5L#@lEry2V)@`efu3QJ2%9*JZ72W)FQ$jTnu1{}uR>}kl0voSZuzp?BGb!Jp^cVn@i# z0~be|L-syvn}GNb^nBRe90i646&Pvr$ReNr2kA$Kj$f%LX=C z+vEYSumm@lrM@>-N!{}`G;p%mKV^Pne16pq0x#|*&CJX+&=|Cl z)dk_dq zB<*a`G4$* zgeSEOlPapJX6xc?pb5zK1@hQen_Qx_tZHvVemBO4SYRP9qgauFj6(d~{_z8CvM*$I zBk#w0)$nSbrz4Hv<_7mJZYS16IS(he#}n3DOH!Kr^&cy%<$LP6Mi#V=)AYbOPy~uR zP>4?b0CSC-U)X^L6{B)$M@B~GnET^}QBOhD4$6;HjMX}n!H{m`N?T!?}`{d+K<;^@@|H1|EnMGJ`jCNce=#W>U zcM9{NfG}rbewvgn^tG+i2WjVFX-LdexAFnDRy^WAbwVpN#+HSHb)e*5sZ0lltDC$3 zu^!@(5bm9g2nL?uJB9j9>g=Ehm?sA`DDni&fqHWcf_bDOi?5o=48Fvl!+^4Nq$E{$ zBj5L1@zI~c5qCk?A?8O}$d}~bheS|ABH#qzQ*;jKi0kLDxdE4XGvHG+a2AWI1C1<5 zMTTQ=uZu5zrv4an-B@?vKb+v{UqrIunm`xF>&$q%QFKh!beq>ght09Zw4Jl*epQ~V97#xC<4!YPl4}>o2^=QU|%7FofR>lbrCfsAo_vFq<@}jGc8^X zg1y?evLA4iw3%OwDIZ=;LlH}Uo67u9p6OH?Mv>3YcDj)z z!)DFFmHQ862|)HkC=f}>zLG>rxVpBBm0FfTm1oJpmsf;IH{wDz-xdgt;V3?8ZQ0^{ zqFWj$>e@wATKdP4mtVKl8K1^Cwc@YSRh!einm`_jOq(hv^k|pXn)s7UyTOb zlkHFU{a_%ZCD7T_nL&w8vX86`f01xorKgHjqP+^F8hJ}YV;d5##RAEDdswn}b^W@N z6aZaVUEm)IJSYJ{wj^V?)M(kU4(D(Zu)c1JYh>OdV=OOW(c72DW5q8*F@x`+>R&PO z_5!BqNi0z`h;bi{TOH3zUIk7HXU@y#EiUrg76>a*;dwJLlciz`{8v1bnElsG1Qk3) zP%K?^l;MT9{nL^kb0=O$O(>gPs*hB$yGvK#o4gL92xb9TVcdK3Ik2acX43VpmMMz@ z*Q^w|@y1a^MZLNKJ=63oq96V#(PKiOiC~%l@l2B&-EYn4lF>l3w_4dsn)3|$`X-PW zr1b=Sq%Enld<91eKUU})Amm8i;W;3-i(vDOpdg;9n~vHvoRV;4C#f`2XK7^#U~lauZxe*&LRysCZSW+q@c z1LIu0n2nP29xkdE^(xI~&vl|+@46j2ZD&^^AoxD9p$cKqeTGGLKxr6(GJEQziU&Cj zbC@b`WwBzy^{iq^Ce=7MS>}=^z_fNWz=^1$ZBSsY1h;8z#O*LQRf=U;v56t3k79aG zKJ@ixp}sXDBt&X!l^pM$Tg}wDHL|MGQA9OHFQulQBqcHN$d9UMVx=9UB~aJj_mBBD zKd;i}cfgK@3~hi|kYt=;y(4GIqA5R03vn89w8;HoFa$SbDJ9@4C8^QPMeRA_c z7u;{mv;Q#r2Y`1|R^+^7 z4o@`yqZg~Om4p-dm-c5C%o#zr_fJ6Xukfzo0#{hQZL7XdlYfT9cII7KyP_nZsG=n$ zkWZ~v8j3|!`wV}Ugpo<_%AB*EoW;=P(y|`Xvw%jNYZ>4P9pJaQnV-6%hhz(2N&^Gy z8hO?Ze1}r9l?xT=#TXM<@G{Jhu~x74HHW!*(ql>PZ?y#<}*gskoS^k(*2qf$%cAhT_?%fQ*e&M_>2~= zHsPB}O7j`s_*bA3jqE4F>JV{dLnHestssbD{{G5i*yIlwV~8T~B4UVgV8lw6C4hUw zyJ1c}kG>m=Epj*Zdo81QOV4CICKU$aC~O6zNg`EzA^?HjgVYoQhAYsbp&A(vap3Lv z-x{0YMy}f+|8WMtZj0~M!b`YA|>ta(JTX#!#&uHeE(ozz-Q+r5Y~R4-U^47tl&eraW5GKl~D-mUjv6sw#w2yhNAr zr1_7ZKjO2VleIJ0!^UTqmiNt57pP^J!z`mCqnIxBCOt zI}cIPA8|i=JE0)J@_E!=(v*5;XL3QEYt3u_h&JPT9HF6rZ)8g)({V2oc(|efO#m9A zyZ&+Py>|XPy1a3WhGN&np6?;#=HaX?D7aw<*XK1j;u#R1vlsg9!6r7rMT%cE6eXV0 zsW+vLT87{8zD-NTHxE`$c#r~tisTE%J=}RX;7zeA=#9b*5%T3NLi!Soio85ov|?I} z3utTxjIrD3A)iq(Q@5v;nvWLwn)_$!UHX-W89Gq! zkwZ!6zY66mKsC!r#MGM;dhbR*a)^nHUF}_m{~{DHK&SBcEtM0$fJfg@SIeSJo=M*q RS)k(?O*K8$auusL{|7K#)2}OFZkuJSS?=>JL^xjDb zAV@;MBtXc;@80j6GwzT5W3DmQGv>ot~Z|5Qt~bo-HjcIXXIG zFc?Wm$;8COu&^)?2-MNh!Ozb>Iy#C*qd$E3AR;2d#l>t zR8>{w2fDhtfq{WFH8mzCCcl6G-q_eUKR=I)i#t9({`KpZ zqN3vDqtZZ*@uaA#US65d-K|xAN3MVJ0f`WpdpI=*B z+wAP@ix)3)a&q3jeOp;sxwyD!XJ)br>3S#NlA%` ziFtc_D=RBkRaI3~RG6EaTUl8J1O#+`BF_yjh&r6G&JQ;8X7GvEoo_K85tQ_Sy{EUwdLjIwzjt4zkh%8=8ch&QA0z+$B!Q!92~N z`uqFS)6-Q{RDy$pjg5^xJw0`Fbn^1@^7HeBgoJW)bKkvtXKHF{VPO#y6B8dF9~l{0 zR#x`o#}937?c(C%*49=q7+hFbSY2IRT3RYDF8=D(D+mOVkdRoDA}1#|^+?Eu zgoJijMPBCB`^Eiiyx}V)1}J4gGkw_$HOd#<5){gEb&;PUDI!B2ymFIK&~anL{-u3C zn#p$=D;1%r@g?78^R6IU`V&t9K{orb5s2W)YT1XCm%eh>9@uyuQkxU@3=C(^wDmQx zjj(po@%?);q=V#m763dL6i0m|1AO}@f?x-rYzF?Nxpez&qK7xTCgt1*?W;A8UsE#| z%RzRPOZ3;8w&{ul-naIXNiZVw7nl$!6|X@(81JZK5AWT_HnOE5`{ir2BB~{1%aUxh z9uU;aB@XAF8NPlIdpo-e`Z+{hG5cFtndiYe)3=S!bS(s%=@Mt(4I9r8e5&C4*-TcT z(o9F8=$>nW$hnHP0Btnlp|ZN*U(K8l3KR0%keq_tc#`a*HwLCOfSc70{9ARp`;SDl z=2Pu|Pfy5yI&xYlR-q=vy-z4RLcdVf5}-t2piyISmA|Wwrd)CcW1px2d-NXKx?eo! zKP`A?<`P)%R}E&oce}#YR{h7Ddy0%J1C<~;-Qg}M6JW!yW910++a*TLXxjmFm8S-* zrPpn0B7pXaZtKiL5N1?|Nf@pJ*`DJlU^g>J$5GAunfyXz)^_+-CP>)vb_=H-<&ur3 zJ-L5NVz+3gK&`Nxhu_XsJ1q@M7+!re)|DOIQo|zK(XU0z46mqOQ}Z3(LA-hufZkdKCMLJKI-Qh2LcI zuVcQkVA9B6x`ms%G)W%N{20b+UI9V3@499TY`6iRN!3D0Fpd(ghm%m8LrGz;q zU0J`FS;TZ)MJ3I4$B6F0z?5@)Bp%RnUAa!G#klp~Hfl{JYRW4?{WIe^c{IF6gt^~T zTqB?c_98H zrmukLHx?y7E%SFyk0+AY8?QZWk$vQC=;hm!pr6<8vUnrTW;)pr`Ykf9Z} z`kD2(V<}Py1rsbxk}5wgRqGTn8kCbCWrezk6n=V{(Pe>BKq1pqcUFKOrx_gCTf1Ly zfxdpb_f;zUfc^HRYPlw7$*sYY*xMj0Sb5lFJ@hsGkw<9CO8>1z$vA4p%9$%kG0AFb zK-oPqid^Y3?)4o#f9rT5pwg;BH+dw5BJ8{w+;_gnfYZzZQ=|{FB!PgbMIgD z0l<1^=j>eOxLD_54$b~U5!Bf~h8B#Qe*Zq&5<~GYQcFYc={--((PMyOak9pc9LiW* zWq==`yUR}su)leF1^vk4Z!?4`yB6js8kMvsVU&<`Ov=iWxq;CcTI?Fw*3|tcz}%#k zQCB}p(4zRcQfGiHw!Ng7wg@KAooO4N;$ZY`&Gt&7zK#QM>?%`bt`JJAKTY4g zkSW>)EokUN+Ul~<8TY4)T?9$qtY9nHd*%J(yE)s3_M9p^k$%m>5a0l~m1XmB zNv=gz%TI7;rx%Cs7b^LT*{>J9H}yDK)cyed7QJ`4A4wM%7Zf;YZiS8%@74B#e&syY z+cd(X%_cEU2W;4mOssMT$0YM0j>2$bqRk{j-vZu+r&HdO=9*PAr`m&%61b1I@4H_c z6NP9o1uI*ELH(5Y9D(~5(kEbSy!Z9}L!zQJnW)~ z$6G#8%`LVkocoBL6Jc|biC+ua5yc4w@KPfet@jwavV)`GF_`FKCq(x$*_ph#gR3<%Aky@O0>mk zirAq`lo5!O#U#ejU?$TNztYp}1j)Eb1z_MpECp-DoD; zPlnHpg0{|OAS=h#bS;i0tB4trQ7zoXjq67VSrIkP9ly9q5XkBJix+&T^X0qgv0}sq zg%8f%N~@NS^&5?oE=tJ%lPT&C&U9CUVpTJ_zT&7P+*t^NP7z+-@-r2jdfN=LhhmNxVv;~&!a`-GvlLZNa=5fUIEkJWw%n|WXYw!&&k+N`I(&| z#QGi?FKPW(UF~ml3#*7lIVSOwp^{N_X0>i7 zFC~m4j{DamF)0lLAz0IyMLOJlj^p>UP~zfKn*|LK4nWy~@@`w)8ve@69T(bdWZ1XK zNXyEg5qo7&u!Echq9Z_@*p@*3M9S=iZf8yap%Gp(qnq*2vOKZW>9l{n7E@%J-*Z;s zaG+8Jky721nybb`e>T8!Sf$Z{n^E=RL0ZV1#Y~uoE%09EWGIY*9wy>C95#namxvR7 z_y;I*GR?^`x(!%VQQKh*9v;hdiN1c=SW=I^p#0ZGVUV2pzkeBatL`Q13*L{{*{f7x z;?ot9Q@OqT?xMLI4DLU44dGLFp(4TUq)CQEX25nEebi10C`HrajEK^CzWEcEW|kEj z%a|D0gX!sm`kNypA>t)$*mT%B;^zFk=>u=6#0429g=D(2>Ftti7EvR4m1D7_y{1Zh zzt3!Js2LrUK=!cy2SO7mhXBCrQ7ymE(ryG7sqMWJ{Vw*@lhLbcxpT+oS$**HNKQ6` zl2JVg8Ew-(-=`Bu?b0nC{k=Os*}!JdIsIRi4#~sWy=((^brtbAZ9KFp3{{q#X&fuu zcU2o}m}@8Yl0~A!h(7tLLHekk*n`{!(?6M{>@|5**9ABYTQ5W!G%x#M>J&ER5Tw!p zIff!h%y1|=Hv@-zzf@Gu-~Agy9i3O($64n`hocxBd;Edt8dUe4g>E@u#UmTg*_mJA z(L5E)8%j<8OxhvU+wfaOoa-X>**?;qLBTdc-wtCj1RZ;P1iG)b+csJbSgPfxl?RqD zd*k{>DZ|z`pO!0CT_+!8rx+)lN59s2m11Notc4&A-L|6f1I83ucUlwXQ`G*#(yef& zw%&r|?dcpmhCFLVZdntX!WhT>XG*0~RSsC9@_t03RkfXjsSTIB$jsLoaf&)Qm+ob3IOZw;x1o}viZj0+5MY( zKhPIyD;}W}jW-Xq*c_L@y z?Ayg`0%7P;Ba*HSRy-CH3nzW>2mfZ2^-9d*%OT9CuZ}=JO9=)2y0fR(D=2bn?fK-V_ZCH8|8pkRRZcU9``6qo^_ja|${l zV^7LhJna}>s3D0+ZFKsAh#mQA;0A%?sQaH=D+^?y2U;ta^RI%h8p@nb1&8Lp%|ts3z8*YE~6FE596x|wVBti0mUQ#xxZ%11RJ zk~}f@@2)KHzvsnprq80cxDVHU=DHG1j(+Z44!+taDg}rjd|F6xGL7p6lDX^_<*N7B z1H$gM9JZ>A1%)JJ>FM(bN&AjW6p{-u&bUSNvHGxGS?hh%f*&WiBKV`1rEN;ZNl!po-)m5NmLXxLkutsox=<; zFar#6dEf7TH`coA-uvx8&N^$Kwa@e0PyF^d&wh5Kijp+RL+Xckcz7hTG7@Tdcz1Dl zc=)3C32u9c{P=IL1b8Y68j?3RH!LhHy!j^Q=jWT7n@A+m&CTuf^z`uXkUDMV^6FA9 z8tL!vzp}D&a&qeBdu?d|P9fBw9G|K8o*-P_w6i^ayo z#AIb<&Ckz&`}Qq0HFa`wl9Q9Ova&KUF)=tecwu2-A9EQO7k7Pg6A=+{b#+x=U%#}p zbaZrtLZJcz0`~X!+uGW2INX=ArIC@5yu7@@!NKEW^vul6^768;udk=4r;Loun>TMF zBO{B7iq_WF;^X6Ub8~BJYkPZp-@biYUS6J@oLo~=6CNIpMx#SRLpRa;ySuyn{r#Pt zoh>abA|fKAqoWWA1Plf%Dk}c?@#Em&0D(X>Ha2o|b8l>H6c!dnM@QS*+Gb~GkB^V1 zr>9R%P2DPukB<*|c3DzVA}lO?d~qce+-PNGC0b&mqN38=+zbMNy1KeFG&JUst6#o+ zF*i4tkdTn8bUnjeae(Gov*(PAjQIKaGcz;i=H@Q1uXXEzy1Ke9E-skMv$Vgd|>PH@>+ z`zl&1rrj*L+cK?JpwQep=MaK8n?}F}=6CmxvE#d#{>{_y>PfMH#@LbKn#H3Zb<=Wk za;ovjdf2guU!DEWe%Rq=@&uxC5Z*YpR@AfP?CeZUO+C7V&gpg@RER9)NOjnKhejanaPa9rQ! zRATdybcJ)%I9kB#mtXOSTkapBqQ%Z>v{UwgSIJ?`Vz*I3XI}U5#NI+cf7UkgbPt0X zgCV9@PL44bMvcKGbBAdyv#67Ezut8F_89MiA=9L;ksVC=;PLmmqri$o$NWPgBBHl> z&?p$AG#=hdJXwh^8r}W`yX40 zRse?yurwuRO9H!4gL;V05sH$39%#dA;TU*?3okOjWEhi0?>g%TZauEB09}m2SR(|* zuy{*EN}0H=U1(AQ{#G?F65sHg-p@!}s!*#FTb1ac0`@wqi9W?jjJcqu-jaSNUzp~IZ77>_@3LO>U zdYr~%Gcs(hLBs-z7UUPIpQBqFb#6*V02(u&hHI%+WK9s>!g}BZGQ2+m*3D|d!kPNg zWGm;ZZIHy3eFY-ErhG84DkiJNsllwuep&?1ThXXi>xjN-bnIMeLZ-JVKTvy2B>U5R z^H;Wu02>B3SHr!ZrkghbcW^80DXWt_i1TEt)A<@HyNwW&k@arA|H36EQGb1v=C6-U z%w8Asl;p0c$g;-CagUsDnwLtiEIE~_Lf zi1mE)%%E6YgzacReu5X%bXpNfqy_BjywrPK*DT}8>udZe-#t!el6wSRre6ny zTodk$`_<@Wv20gmp77vori7AXKQ@AW=B-#(qTLcCz`+F4e&;G;#inLC`-?ui zvVRorKjab--F0TL{RHcE-#IdztD0jVjvf%IUUFN1KO(albuo{*7}tBv+&gN0|1>cm_I3wRe}ZwRW&ujW39vZ21-{&i$khb?jilE=l{7U0q+lD%%7!iu#V( zzvQ!>5?tf4B8R2D|HMdsj2p=~a{d&*VE0`nPN;~A!)H_-E-}R7`d$v_?wTyjNf!|El1!TpaL+D@!D+q7-5u5!; zs~;g<`Op1-jVu2ry*e}C;dKFTX%>r**JZT>7A(!Xt+4x-7wL}+p696+m?@WG0+Tk`AQQrz4pkqbMZ90| z^txQxPP-fzFW4LZ+;EKW^~`?R zI1KZRTyOr|RIt^k6J*q>s!yK4bk}u>{#{#MaKamh0m9R-L{>F|qv7LhcqRQn?2WAG zQ!WP_%xWcM32RvPtj5zAIMR?4=F7I}If!E=b%)Cok}}RvSufPBri+|~OG)LsKc|5t zu^{c1e%^7GTavy88XCFQULl2Xui=T;i&*93QD|x^<#j2tK3T5Fx)BHI&2ZZ9zt@@k z%l#^~$T<6CJTW@E^K7l8*;hhXP z$w8uJ{8w^%LnOI4r!dV*;UC-TYEryg!Q1wc6=l>&9F!cl`&4`&^^6IH8<5A!Q&lW^ z8R>@BQYBThk`+Rt;lG)&k@9&e-#r|-T2VKpNVV}frYN3|qG-tl%I0eiqV3(2YQ=X7 z8wp;YY6BJiP)a((O1OkTNT$E<_T4MduV6@~DPakg3P< zB^GCmzEP}H!yj<1G>k{vR)hal8x{W|mSRWl`Y2>+&S*i1iW3@xT=aX=dreTn{1tn3 zc`#ce02L0jf^xi$zR;7R%YSYNzVa|C^s2TL+98e4;8CODej6k00aDvYETka5Rntj* zrJqeJ^7FP>lV%7m*|HHuC?zLE`=g=u3mehi$vmK)W*z=-%b|$vAcV4hy z&Ks-k<$%nEryqatOnHi@&ps5h^O7H_>Z4S7_$18rZi^0k;lh`qTroC1^%~fVH)|L%?Rrike=a7|gQ|q}cWkXpnlAoJl??PqLQy)|wshs8al|kjXvErEa zrFlhX*fCUKC!RA5>a{tOzv&G1^4ksM;NYN;zgYf&>YzNYZ_EaM=uRGM@(2{CcMYti z^B=2#SbK;y=#Sc`|F!hAg2!wvG(J6u9uCXZlK4XNrKS{fLj3n=3?Uqzi1})q4`3E^ zgKZ@kc%WyNjL@wtNnz3OZ!=A`&n(A?>uQ2<+goYD-%uVJZ-BQLj%F+tSL-HzH?aTC zlBe*4@0Y?eqr8nMKB4UBb7Y-#ne<5_jp-@Q2ZCfKPFa1|&l~;}vZ_rB*C~J1^XedY zM-F_l>%f_xyLVVwIr+VD==wilq<~Y87qgC~>t@EZ-P#IQQ!m~2B60xwS=(ROp%%y^ zBO+&8_%^U3Idw6INB&3zXGz=7>A4@G^BIa# zpkKFa!)1|Wvib*YE%#1yq|^A{i1Yj&v@-aN$%Zm;2!p*_ua9YrMMVbKE7(BxF#YSJ zz!mI?+=X7&4-$}4)}61$s-FHgd)u4S=hvEB0p&Gz_D<)6HmGf4$}2^;yU7XsmiRUg%|wE94^*al;GAEWWp9+4(H9ohVV2$x-vB=YVZm1#68A-%j@jK_`e(ktIbwSQQ`>v%k7uk_=o< zhtZ>l5%S^LB;=2#LcW3|(IbUuTbQW`@C$MP5&X4n7~nB^Fb!AOAWI#_BcG$r1~-}{ zY=8JjgZN`Yi2lXv_JNY5d7>_AQ(%{faz;|RL=bLv?85fU;7?y3z%GeWqY!v2mbQM=?JnS~$U*@=y{p>-%O#$xOMDz+U6P>yT>YuR{oVE=e@7w%E0tZ^dE0N4E;hg&S3!u8kFVX!_i5>CND8qNL^(af6|9S$h+#(&+fSvR+vcA4(x?Z`)lU<8n*K49jDkxe|7n{3Y|%W1WF~ddrvJfnl=fN zT-32bthb_x+VsPGerXWufOwf1ltUzQ(nbLl+rfJ1E#yF{k=mHF-vLysww)OQ(HcEx zF?)C9GK~0vs5p?`E3b2IRC3_mADBcus2)+!ZcjA zi){6wGn*rDMN>?+DaDBL`gdQs0>RsvF0}bh_aI0MbmL|Tjt3i^wMXahaEyt+sVZ}qJysOM@QeaXdw1GHSA z215UXtp7#uo`7>Y6NukYihghFCysuAc6?ZmdQ_nkKs)Z6b~Bt6e>?B*HtPQgVAC}J zbt!J?SoI}s$4gt(LYi>6t1zi?!#kF_c8BTluB`{4en>8IKPhc_vsA<~A;gynp`iU< zCVB{b5!Y&4H=JjEVzXI|7@_0L!1p{z0?_{BWl|2}+WtN5S#(gZa7|88hu(47Q(*3r ze-aU)##X}o!r{!zw9T=ef2-gu6i#^uIiGjCgQ3()3~I3x8nW8aqix|SQf9Z~t~ zVP2=YfC%;vLcg?`y{|-i;CeAv#~*yualC~c0%K|}k%8Ce2xxua1IFJI0XMki^}s86 z&(1^4&9wv06K@_4iY;>J|K4u<)wpxGsaAi+>|A@@^Y-0K%}iuXrDqG5=AEMeJ2fLZ zUCqu5q?$py-+NF8ynBYMW}TzL=#j-|nowf_M&xrABJL(J9_635~gLZ+4#W z{Z7yGcswSpm)u8jwxQmPE-bbN`Ife3F)ZU>TQkNUqn;K(VU%fp>!%Yq@b<}NDPkO> zM##5KGlgxRz=dE=#Hwc@gWs$uUQR4<3rimOolW zt#fPTSEi{|H*R7trQN>N3HP)g_Fn|@x1g%b1<20bgPujZyJl(H}__N9aJ z(K;?#n!?AW7s~s*HWUs%3^wtwwBdtuI^4GTCjdUU{$Q({tpyag8EtPlVD~fkrAiFt zh~4^ELy0|Ks?QQ))Tuw5dOj;Wp5G3ceIs@w6U7Dg!XVphpP7b!Yox{PSq~KTwkZ-2 za8(Hvk0a&f2bvF33U~dTOQRZ7!8;KRd;YOr>DV^T+=xu29#!jE0*q?Ew(Z<1B zh%8;PvP~W6T|>Mztjqe{djuDpUnQSeL%lz9FW-%SRue%hG&+frF;!H_;iQ_!dWOlt zDW9-RC+qV^F~X8zo0iJJ1pWn4SB*;Fc&6 zA#d5{h%3M>;G6=3Gx~Lq49CX3SpN9sOD-+qa8oB&f~MCI@_4fU`|EhatYnRZn)NKq z0Z}mU7G#2m+AJO|uFIq{&Q9U(;!l;aruG)=x5-ui` zdAcIyja@K9&~csIx)uT96YWsNyjZ7_1N`RClQ#F5o zCD{oUZGxE!=Ey!<84xTF*c?ZUErxW~VcdQjlU<)B+6BJ#S)q>ffx3MA_Icsyq%9Yo zQvl)RU3zwmm{UY)e=qBPGz!mJ9WRVyltFPGl9fg0p?d|TPpO-f9 zzcs*%hmXvv|K$#%Q?wT~TF8Q%8_Q5_ikHvqRa?_GHD)}1PjN2_$PmuWh-)6YcTW&E ztD*9MxsRf8O|lN<%^T7#9^i=o5TOsK-F5Osi%<$xk=zTq;<6WsZswSY2;LpM{X`Vc z^z>LXdS25#G9*!Q?b@Px*VOn$sASw@@hleS0EVuob#Yk+D$e!FdW=d+s%682?Sz-c zh%BMr%<*{rPGCL?3_4rY58AI`*}|2@dz+mw>z|0&BX>~YxDu9tHqKv8=Nqzt1zs_Y zqzwAKMUApMiewI=YbjeSWwk;3MD`0bFKmZ?@Y09qMBL@)pUkKkEQpol!@YbUOF06_ ztlE7;^;uY~_Q6dUy=MdRBnfExcX;3-+n+}yav_hD4eT^P%NB1JInU1M3R>A>G7O$p zH`o;R?CE$QMv4suU6vN1+HaItIMgqW)}V84AkPb_DwBh}d4ZDy_X*Lww)NF3zp;+{my~;D%P|^wQl)!vuajlyq%L?Ap49SU1qiaxZz10P6T<T0|;teepH`5Gl= zpzB9{OsZkA!w!vvMxr;Poi92CLX>icTZZn|o}hZQ?i2=<&z%GJ;3EnVQvB-X1jqXwFn zq(k!!{C}C)!Up_}GHGOuin$UFhzu5J*jZ8v_&zpi!6i4d38K|fBKFuYL(0-TLR&@9 zy)m$i#*dr0K!k9V86M`v@uX_vaEV&@+e`rysr?xONW{k-t-ndyiLkLgBU6t`aC+J| zkif+?5$=&$3fYr}n%np%Q{7pg$3|OISCfqiOo-fV{`AhhE{<(H>UM8`ODJb_H}nc@ z@ht0FYOfeCb+E7zs)X4mEf;U*6VO?-|Hs8?9@0EaewblsAt$s!CyQqd4Tf52kyn6++j@Ait03f_!QxZRgA8@{j}M>KHMkol;(U+ z$7gm+5D3?l-}D84C8rji4^9v3XU+Rw9B%!2zb@3oz;i&-!640l(Ukb}T1Wb)Z;&Ap z7Hq~aHhWX&h5Vvw=tX;D*c}Elm3-n1HGCX@&-2MMpZmveUJIQzVqhW z8gHGfcb~LuX@OK;qN?3Mv8_2>(mXS-DtWehcv;mEsObl5?CIx$V=i zopzRCCxhk3IGnIm8nHj-Cr${^Qu&)H5!bMUc+$p`5a?;H*PJ>w0sX1HxCpF7Keid? zP?-Nf=-uDD#7etg|4b*;{S8)d+#??TzPY5NWO8$t%Sm|1-{v4cX< z8=ak|V(A`;TwvOiq1J~T(qxqM&LKF@IBNv|8s(LqAMxa2oHlnFaB1}TJ2QQTubEd$oaL-|!q|ZTP}QK^nrF1AYi&bZs|$QBoX74@ zcwCxIfQvldx!e0m##bf#wmB*HO$l{Cd`@E<`pj9p`^jO0NkiapSJ1#4gLO4i)yB3x zFnEr?6R>so8wD_<^uIaangIAJoty@fd0we11z`L~Qn$&@>W@gZb*+W#MnjFQ0j2W=~+Y;J1 z`D|Rou6soBs=!{bn^7d=c01qL8!2jD15buP<;51a?LxnW&~+eF9|=-EcAu*pY(cfe z>JcXT8~;UH6?CuGiC*BfUkEPz#|}_AE2Xn!tlZ_?n_;2{#E=TISb2eL!|KRTD>ZZh zxz#k%Q7ul_o6R+$olpzJS->e_isxbY@NtKDcn`4G6Tah16JGPF7g!P(y~`GZGqN#? z!d)sRP)ML(VM!K&>Qnt1x?n0K8V?&ws15UK7e+oJhm?(IQZ1`gpuDgK)+Rl+JKzy* zLnqnTHs}1`xK^xo_J$pejJ1D-no=^Mn9?3KlAyq1YN5p@p}#-1;aHN%161daGC|4* z;f!>#2i3L?Cf^nep$k*)dN37__RUdjnG2V8CZuhBylKf^?gQLmR}{H!mw^i%NO657 z@YwA~^(x@4ZI8y0C%>DaiMGW^(u#A34F^v{e`?p^`Q;rjKE5R3v3hM_cf8C)lhvLw zbjG_VT+@qFKU@U0#=Ru%1e8I?>#-KAOv)G5OSXx!j_3s<-QoHXFpPThFQW+WwYB1xrAc$T*T*i5swHYy_ZlxYu5YW7$U|C{ ztqs^-%MrZW-uXwh17crUIkIraf`5VCfKj=A1%q0N3@CuyJK!^D^(mE-oUmVfNwlQcmT4gI@1JhdLJr#oIwgvdpNIp+``3fiPj_tyw{v(2GTx?TZa6njWFrg0oDN(^F524+bV1smmbHEKVb2B` zD)#-oGg6RV%dO*~9_7ce;luUWSO(G+a0RO{9daMou59yii`K9gXaZ6Ay=Zr^>xt9D zxl1cX*;E8i(IL^=Vc-Fp;mVrllfbp(jzru=xX^eo^CDW2Bir}KWYP+NjTY%vfeUyh zv+dK?Y4xoY*t)%Ee*MO9VvN$r_;+==ayC*B=!b`e9r)}xgD%b@n|V`Q^Z6dTs@>Yy z8Q$zf63D{jAN6TlQ7h$FMwx99i#;VxuV9O^E?C>u7_O2BX6{qi^5FgHYcwQa=4QmU zL<6&;fAyJM=+Y#Xh&yIG+;2hXyuxhbF17*RD-KsV>yEJ)tCw2`p9ia3MT9zROn5L4 z=N1Xa5DxG?G_woNPnXCWPqjvAh+Z}iL;MM=qz#wg28`hNV zdUr`5I%9=Qo#yUjv4-$<*@O`_A!B&6jp4%-;;a_FV=jlKhAyJECwMESkm`a+{YXj) zf$ih|xB8R$iqet8TFPeWn{~;AOZV#p!l#>6q`nj=M^*9lEVTc0Y8lgb|8s6+q#Hnl zcX{)GGnbZ2^;%6B1pv*AeD863+=zPIBxlhAZVBqAf0jjGuks>I!W}Y@R*uam&0hdO z_ET=XJoM%XE-g;LY57w46$XfQ3V?Qk*Xe2z?N<@#Vb9w&CEa{&$%Ay{Au_A~{Hdm``lj{$3dzvo zY0ZeIo5wtZpQsJWr|&)g4qh3yZQV;2NN#qpOf)##;I-)O{As{4Bad`j9&ejyp*s}2 zoVC37tX_GPf<5Q%HoN#=_v!Mxh*xi!GkcPw4#bq4jqeHkxZwwxr9vo>Cn+PY9oHs_ zPB5dqFQfE>rB%g0l^=f0Uu$|^>qsY1_O2v5OX5RCl`buLAs6e|@=wWUMT@FhsS=sA z*&b323D(?m?YuQI0mAz0bK%lT@p3m>OBmC^fP5!zSPQyH9XOb#EFgMbQg>BR;+6AL z6kb7hc<0;tiw@GC&l_utJzrG;5==d-*@g0B)4?RT(T=l-3sN!baOrE61zPs|8cW(N zLfnzX8jA-X7RS_dtCbfLM(7}iM{M$1k%qLeRn``sBpQ^naRU_7Z_m=PQTuf}{qes0 zK1Zk}O{ky~HB}d3wh-^83(?py$lKY>{{?P^`ynaiU;x#P?`<`Yi2u0%kvQgRh+!uy zF0cmT_329binUX-$@n5T;A+cf+p~-2?bm@CW%ui@S*xd9!eS>2?E#v_MG}l|wG&Gf z;ICu31f^f&lHqk~Q9Rm9RDI!|YbJ3|M*44^C%{ZU`9p*#j{@V^+O8pP@6A(K+OJZ} zwt__up}Kq3t76v3#2xM*KuhiUkB&oTP#~j$wy7yq+USxtM@Ndn^>ntZQ}HER-~sxg z)39}5d%5KgO&vJL=RjEwIJhkV^7ym3e{)IkL=>sMfbXPY{N#p8^)b%`5ldDJwy)DV+{kSAhS$$fgtBkN)l}%a z|MUhumk9lqZ1qd!fyRTlmpar&{2@{VReuWZQ-*$jb&sk@rm;vkDAzEM0|w0>D~<0^jsguonQ-4&U-5*GdT4y0ul=)${QEdWXSL_A zbG(R8NA#U0)#E9q&tA2AJ>9c1m3@zBR8@aOi;D^q?y8;0+Iy>|{(6<>^!31!e|vG> zJNLo9V7|^#-o|5^^e#Z|HcoE31%<_m+Dbg3vz*5o=YJ;+7+4Z_VQ>;XrHH~^kAX_o z!JVM`Vfh@3@IKN2FVy_+w8b?I3cs*}b10Weg{DVjQ_Vz^HjazkLjKNN0DwJ&3TPBDPACeCs%|5D@oyz~>X(}7i!q8S~WY>Q3Xkz=y{l(l3dj0j;&aw8l zD@YiY=Efshlx)JW+ZdDcFHAXk0_;ydm2z{IUvWQ9;@kU-W{chePTrj`{>{!c#V8^H8bmrq zZ$}3l>1=cMK~bR!LPUW|bDd}Cu$mgWtH|Gh0SC~(ftRBovU4P4xx#yN1owpNPFekz zDkTD$i7if~8HC{KDO9pfLX<;2_)IgXS-WtfiOT@9JM8B{>Z30t-{SaX31pmtV9pNx zbHvV`Ph8Q=!`FR3KEg|;3g5YS9Wb8E=J^Hw2cY`zxW-c-DXH( z)9Fg*M>dXUt=f@d458Y$iG9JJbb@MMqfAoOEK4e8z@{5goI;oblwF+;ry>yN;4fM- z_yD)1Y=1#hGRz@3O36q@U`d^|6;>fC>jk9Ix!-wk^h2#S8zHPa&gj$`s~!{z zM6&{}#`2!cPF2MXDy&a0y*+(HTm5WWkU2CGwemX>{T61lF?XhT`vn~br_y*fZ&>-A3zzs3qqySB-KX-Qz%sMICEg+wbOKyVqcAyFMqo%j25wsH zRgBB6#cajyZ(4se5H9z7>zcr^kn_WkArKF!NLJ(Z6f*{zKM|AJ7DlP$Lnubs`Ooj=F)A8)G(VFsw7M(UM+@uGo9jpuxwPZuT?1u~0O2Gpf8fk*<5 z16p*e>Y{42@0&jLAK-|cw8gm^iCg{$bP4)AtSS{Iz&)RP!*tQZGlaJwI?3D+BR0qt zP^ipFf_eQtWumi-x-=o6Te()6=|aeu2!Pqu8;6 zvlD@-0BVz4meZ>Weveq0T5|Td*qb~3gsVjGskWDze7FCj`L>N`-czc$pt zv(Cvl@V*F~O4g=PPm==Y>i8X)qvyXoX)6iKfJPXG$e%=A-#@v@OZ|QOhnP1%Ng=}z zd4lPfOizovSdk(h1Y}z`TP(RgU3iQ$X~w3x(CI&leZ;hj#0G`Tdu{zW*4_JKsxMNE zHsV~Hf@>t-*-%T=ws^10JwrYIkE#D=zIo<9bBI_+ET#W$Grpq~B|h30shy~mr?M-) z`;Lc6cz(_nFC57Jle03OFrA1ZZho%nvz3@ef)*q@1NcYNMlLd}`o6U$elMWd0#Dbb zh%E!pOg7est{dQ6B`#faSZ7B^h954ahl!3q*j0R9ANu(ZOxPfps4bSO_f@v}yw?C_ z09_N*JPMotB<mx|c)5wQ0a4Y;(i+ivfC1z_&%F0xGV2>BHv1{5B&%AEh%2+57Gp z2?o|yW#@{ABb|TN21UH<_p6nW33Qu;#6RbF`)^>c?@?TsmFz;XMzO;&OkIv#yitEj zw(n(WA0g_U0*yObx(e=){2tTJ?`@qOF7xeN%G5m3lh!VBkqn5W_!s9zs%^chVjc_O zd?RVG1&?NwG&@wVUSposP!Z+wuA0hgaRfZ%m!&U}+9ra1d@n+1gdrAy-@MGH<`==E z1YqL{bfrPL*tqu5Q!O4^v<-fB%C|WgAHGoztkT|G7vbgxJd|{6{;6iCVM&zl@uSuLm)c}`$W zcYV41xkJ)IfPq)6h7jPA(!5p4R0Esa(fjFNPEC;PH9gdR!rbA)5-eZg@>g{I;2ZI^ zXt)e9bn|Fax;v0yLxv`XYj+=54*3D-%4@n61E(_zFoD%9-Z*=!|M`8Oz7DXLL=DbyU%y@rq>b9-W;4Ceo%o3A$vyjv{iBbFgonCHNQiCs-NSS`LJA^3i)eal$#5GaJ z>1;;!)qBD`ORj)RdNN*UJDMGz!P2u1t@JkUbfnsELI>YCqF_W^?%oBDj;=T@p8>4T zXF~vn?dAXi==PrEoEasol_W0Nk15bYn%l|onP`#q(?HLh#ZQ{)IIZ81u-$70RfUpQ zxEHEF0pB4`sPAi+lvzVB_Tfp$0_`%KjtsMf!x`T4v|2B4W$8Z4g~XV)_S2Y-qBUxJ z;$f!H7*e6^&qBQ&Id=!8}BAdLO%+rFk-j z|NC`4^(^h%o>hP_Yz`MNRxIRTcMoE-jt0lDm-=`t{}xa-9^;a%8{8*ayBvrF#`z=l zH^~82?}!d_Qg2gg{H<}#tiW1~Pyl(2brNVJ{1_KRqSgR4 zA6weX@1ec_eAOA0jb!SmS8sxBXR{Xqcsk)}3*=UN(2mxVzbrtH^krCakDeS5q*PT* z7I)mtQ=dM&uY*M9>zrmc>s^xG}H%J8qILYkEuSD z#)8?z4CX8U8ga7D)rQcKaSh|G=*f-o zQ@XiRJXt##ux%~H^|&gCsHkwj?L3T?-Wa0^i44KUv!ff`WM%cjCgE`J^Oop|F5tZx ztHE}Z31j2ckoE16pd)0Pw@&0{fGFV7?$P+KJ89X?mE<>poqXqJrH$``$!@55(Gw+c z<0}X?=PNcPxrr>XGurCL%j@&eix)q2Z_n8M|2OB=%X=^75hoYcl()z9@bF|Ml_aXg HOuqd$dyl*4 literal 0 HcmV?d00001 diff --git a/doc/user/project/pipelines/img/job_artifacts_pipelines_page.png b/doc/user/project/pipelines/img/job_artifacts_pipelines_page.png new file mode 100644 index 0000000000000000000000000000000000000000..3ccce4f9bb46d60013472fd5e4172bd192fba719 GIT binary patch literal 16550 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 j3?)O!P%>jEU10RaJ-oUA06fPe^c-S#6Py8dQB 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 literal 6391 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 YgCE|o#nX-d`OqLyQP7YtlzkWSe@9^Apa1{> diff --git a/doc/user/project/pipelines/job_artifacts.md b/doc/user/project/pipelines/job_artifacts.md new file mode 100644 index 00000000000..f85f4bf8e1e --- /dev/null +++ b/doc/user/project/pipelines/job_artifacts.md @@ -0,0 +1,118 @@ +# Introduction to job artifacts + +>**Notes:** +>- Since GitLab 8.2 and GitLab Runner 0.7.0, job artifacts that are created by + GitLab Runner are uploaded to GitLab and are downloadable as a single archive + (`tar.gz`) using the GitLab UI. +>- Starting with GitLab 8.4 and GitLab Runner 1.0, the artifacts archive format + changed to `ZIP`, and it is now possible to browse its contents, with the added + ability of downloading the files separately. +>- Starting with GitLab 8.17, builds are renamed to jobs. +>- The artifacts browser will be available only for new artifacts that are sent + to GitLab using GitLab Runner version 1.0 and up. It will not be possible to + browse old artifacts already uploaded to GitLab. +>- This is the user documentation. For the administration guide see + [administration/job_artifacts.md](../../../administration/job_artifacts.md). + +Artifacts is a list of files and directories which are attached to a job +after it completes successfully. This feature is enabled by default in all +GitLab installations. + +## Defining artifacts in `.gitlab-ci.yml` + +A simple example of using the artifacts definition in `.gitlab-ci.yml` would be +the following: + +```yaml +pdf: + script: xelatex mycv.tex + artifacts: + paths: + - mycv.pdf +``` + +A job named `pdf` calls the `xelatex` command in order to build a pdf file from +the latex source file `mycv.tex`. We then define the `artifacts` paths which in +turn are defined with the `paths` keyword. All paths to files and directories +are relative to the repository that was cloned during the build. + +For more examples on artifacts, follow the artifacts reference in +[`.gitlab-ci.yml` documentation](../../../ci/yaml/README.md#artifacts). + +## Browsing job artifacts + +After a job finishes, if you visit the job's specific page, you can see +that there are two buttons. One is for downloading the artifacts archive and +the other for browsing its contents. + +![Job artifacts browser button](img/job_artifacts_browser_button.png) + +--- + +The archive browser shows the name and the actual file size of each file in the +archive. If your artifacts contained directories, then you are also able to +browse inside them. + +Below you can see how browsing looks like. In this case we have browsed inside +the archive and at this point there is one directory and one HTML file. + +![Job artifacts browser](img/job_artifacts_browser.png) + +--- + +## Downloading job artifacts + +If you need to download the whole archive, there are buttons in various places +inside GitLab that make that possible. + +1. While on the pipelines page, you can see the download icon for each job's + artifacts archive in the right corner: + + ![Job artifacts in Pipelines page](img/job_artifacts_pipelines_page.png) + +1. While on the **Jobs** page, you can see the download icon for each job's + artifacts archive in the right corner: + + ![Job artifacts in Builds page](img/job_artifacts_builds_page.png) + +1. While inside a specific job, you are presented with a download button + along with the one that browses the archive: + + ![Job artifacts browser button](img/job_artifacts_browser_button.png) + +1. And finally, when browsing an archive you can see the download button at + the top right corner: + + ![Job artifacts browser](img/job_artifacts_browser.png) + +## Downloading the latest job artifacts + +It is possible to download the latest artifacts of a job via a well known URL +so you can use it for scripting purposes. + +The structure of the URL is the following: + +``` +https://example.com///builds/artifacts//download?job= +``` + +For example, to download the latest artifacts of the job named `rspec 6 20` of +the `master` branch of the `gitlab-ce` project that belongs to the `gitlab-org` +namespace, the URL would be: + +``` +https://gitlab.com/gitlab-org/gitlab-ce/builds/artifacts/master/download?job=rspec+6+20 +``` + +The latest builds are also exposed in the UI in various places. Specifically, +look for the download button in: + +- the main project's page +- the branches page +- the tags page + +If the latest job has failed to upload the artifacts, you can see that +information in the UI. + +![Latest artifacts button](img/job_latest_artifacts_browser.png) + diff --git a/doc/user/project/pipelines/settings.md b/doc/user/project/pipelines/settings.md index 6cbcf3c400f..80cdb49a1d3 100644 --- a/doc/user/project/pipelines/settings.md +++ b/doc/user/project/pipelines/settings.md @@ -35,7 +35,7 @@ if the job surpasses the threshold, it is marked as failed. ## Test coverage parsing If you use test coverage in your code, GitLab can capture its output in the -build log using a regular expression. In the pipelines settings, search for the +job log using a regular expression. In the pipelines settings, search for the "Test coverage parsing" section. ![Pipelines settings test coverage](img/pipelines_settings_test_coverage.png) @@ -44,7 +44,7 @@ Leave blank if you want to disable it or enter a ruby regular expression. You can use http://rubular.com to test your regex. If the pipeline succeeds, the coverage is shown in the merge request widget and -in the builds table. +in the jobs table. ![MR widget coverage](img/pipelines_test_coverage_mr_widget.png) @@ -62,9 +62,9 @@ pipelines** checkbox and save the changes. ## Badges -In the pipelines settings page you can find build status and test coverage +In the pipelines settings page you can find job status and test coverage badges for your project. The latest successful pipeline will be used to read -the build status and test coverage values. +the job status and test coverage values. Visit the pipelines settings page in your project to see the exact link to your badges, as well as ways to embed the badge image in your HTML or Markdown @@ -72,9 +72,9 @@ pages. ![Pipelines badges](img/pipelines_settings_badges.png) -### Build status badge +### Job status badge -Depending on the status of your build, a badge can have the following values: +Depending on the status of your job, a badge can have the following values: - running - success @@ -82,7 +82,7 @@ Depending on the status of your build, a badge can have the following values: - skipped - unknown -You can access a build status badge image using the following link: +You can access a job status badge image using the following link: ``` https://example.gitlab.com///badges//build.svg @@ -91,7 +91,7 @@ https://example.gitlab.com///badges//build.svg ### Test coverage report badge GitLab makes it possible to define the regular expression for [coverage report], -that each build log will be matched against. This means that each build in the +that each job log will be matched against. This means that each job in the pipeline can have the test coverage percentage value defined. The test coverage badge can be accessed using following link: diff --git a/doc/user/project/slash_commands.md b/doc/user/project/slash_commands.md index 2fddd7c6503..ad5d51d34f2 100644 --- a/doc/user/project/slash_commands.md +++ b/doc/user/project/slash_commands.md @@ -14,7 +14,7 @@ do. |:---------------------------|:-------------| | `/close` | Close the issue or merge request | | `/reopen` | Reopen the issue or merge request | -| `/merge` | Merge (when build succeeds) | +| `/merge` | Merge (when pipeline succeeds) | | `/title ` | Change title | | `/assign @username` | Assign | | `/unassign` | Remove assignee | diff --git a/doc/workflow/shortcuts.md b/doc/workflow/shortcuts.md index 36516883ef6..2a5e622dc7d 100644 --- a/doc/workflow/shortcuts.md +++ b/doc/workflow/shortcuts.md @@ -45,7 +45,7 @@ You can see GitLab's keyboard shortcuts by using 'shift + ?' | g + e | Go to the project's activity feed | | g + f | Go to files | | g + c | Go to commits | -| g + b | Go to builds | +| g + b | Go to jobs | | g + n | Go to network graph | | g + g | Go to graphs | | g + i | Go to issues | @@ -73,4 +73,4 @@ You can see GitLab's keyboard shortcuts by using 'shift + ?' | m | Change milestone | | r | Reply (quoting selected text) | | e | Edit issue/merge request | -| l | Change label | \ No newline at end of file +| l | Change label | diff --git a/doc/workflow/todos.md b/doc/workflow/todos.md index 1a8fc39bb33..99d7c18f072 100644 --- a/doc/workflow/todos.md +++ b/doc/workflow/todos.md @@ -27,8 +27,8 @@ A Todo appears in your Todos dashboard when: - an issue or merge request is assigned to you, - you are `@mentioned` in an issue or merge request, be it the description of the issue/merge request or in a comment, -- build in the CI pipeline running for your merge request failed, but this - build is not allowed to fail. +- a job in the CI pipeline running for your merge request failed, but this + job is not allowed to fail. >**Note:** Commenting on a commit will _not_ trigger a Todo. From 3856a3daa14bdfc2abed28d355a5244e32a81d6a Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Wed, 15 Feb 2017 19:16:12 +0800 Subject: [PATCH 216/313] Add some tests for admin/project runners page --- .../admin/runners_controller_spec.rb | 85 +++++++++++++++++++ .../projects/runners_controller_spec.rb | 75 ++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 spec/controllers/admin/runners_controller_spec.rb create mode 100644 spec/controllers/projects/runners_controller_spec.rb diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb new file mode 100644 index 00000000000..ae55ce87f0b --- /dev/null +++ b/spec/controllers/admin/runners_controller_spec.rb @@ -0,0 +1,85 @@ +require 'spec_helper' + +describe Admin::RunnersController do + let(:runner) { create(:ci_runner) } + + before do + sign_in(create(:admin)) + end + + describe '#index' do + it 'lists all runners' do + get :index + + expect(response).to have_http_status(200) + end + end + + describe '#show' do + it 'shows a particular runner' do + get :show, id: runner.id + + expect(response).to have_http_status(200) + end + + it 'shows 404 for unknown runner' do + get :show, id: 0 + + expect(response).to have_http_status(404) + end + end + + describe '#update' do + it 'updates the runner and ticks the queue' do + old_tick = runner.ensure_runner_queue_value + new_desc = runner.description.swapcase + + post :update, id: runner.id, runner: { description: new_desc } + + runner.reload + + expect(response).to have_http_status(302) + expect(runner.description).to eq(new_desc) + expect(runner.ensure_runner_queue_value).not_to eq(old_tick) + end + end + + describe '#destroy' do + it 'destroys the runner' do + delete :destroy, id: runner.id + + expect(response).to have_http_status(302) + expect(Ci::Runner.find_by(id: runner.id)).to be_nil + end + end + + describe '#resume' do + it 'marks the runner as active and ticks the queue' do + old_tick = runner.ensure_runner_queue_value + runner.update(active: false) + + post :resume, id: runner.id + + runner.reload + + expect(response).to have_http_status(302) + expect(runner.active).to eq(true) + expect(runner.ensure_runner_queue_value).not_to eq(old_tick) + end + end + + describe '#pause' do + it 'marks the runner as inactive and ticks the queue' do + old_tick = runner.ensure_runner_queue_value + runner.update(active: true) + + post :pause, id: runner.id + + runner.reload + + expect(response).to have_http_status(302) + expect(runner.active).to eq(false) + expect(runner.ensure_runner_queue_value).not_to eq(old_tick) + end + end +end diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb new file mode 100644 index 00000000000..6dec12f1815 --- /dev/null +++ b/spec/controllers/projects/runners_controller_spec.rb @@ -0,0 +1,75 @@ +require 'spec_helper' + +describe Projects::RunnersController do + let(:user) { create(:user) } + let(:project) { create(:empty_project) } + let(:runner) { create(:ci_runner) } + + let(:params) do + { + namespace_id: project.namespace, + project_id: project, + id: runner + } + end + + before do + sign_in(user) + project.add_master(user) + project.runners << runner + end + + describe '#update' do + it 'updates the runner and ticks the queue' do + old_tick = runner.ensure_runner_queue_value + new_desc = runner.description.swapcase + + post :update, params.merge(runner: { description: new_desc } ) + + runner.reload + + expect(response).to have_http_status(302) + expect(runner.description).to eq(new_desc) + expect(runner.ensure_runner_queue_value).not_to eq(old_tick) + end + end + + describe '#destroy' do + it 'destroys the runner' do + delete :destroy, params + + expect(response).to have_http_status(302) + expect(Ci::Runner.find_by(id: runner.id)).to be_nil + end + end + + describe '#resume' do + it 'marks the runner as active and ticks the queue' do + old_tick = runner.ensure_runner_queue_value + runner.update(active: false) + + post :resume, params + + runner.reload + + expect(response).to have_http_status(302) + expect(runner.active).to eq(true) + expect(runner.ensure_runner_queue_value).not_to eq(old_tick) + end + end + + describe '#pause' do + it 'marks the runner as inactive and ticks the queue' do + old_tick = runner.ensure_runner_queue_value + runner.update(active: true) + + post :pause, params + + runner.reload + + expect(response).to have_http_status(302) + expect(runner.active).to eq(false) + expect(runner.ensure_runner_queue_value).not_to eq(old_tick) + end + end +end From 8fa175613dad6b6ec70136ee090663d521a498c9 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Wed, 15 Feb 2017 11:37:29 +0000 Subject: [PATCH 217/313] Centers loading icon vertically and horizontally in pipelines table in commit view --- .../javascripts/commit/pipelines/pipelines_table.js.es6 | 4 ++-- changelogs/unreleased/28229-pipelines-loading-icon.yml | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 changelogs/unreleased/28229-pipelines-loading-icon.yml diff --git a/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 b/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 index 5983ad4afc2..5c1a7eb1052 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 +++ b/app/assets/javascripts/commit/pipelines/pipelines_table.js.es6 @@ -81,8 +81,8 @@ require('./pipelines_store'); }, template: ` -

-
+
+
diff --git a/changelogs/unreleased/28229-pipelines-loading-icon.yml b/changelogs/unreleased/28229-pipelines-loading-icon.yml new file mode 100644 index 00000000000..d8f82f658c2 --- /dev/null +++ b/changelogs/unreleased/28229-pipelines-loading-icon.yml @@ -0,0 +1,5 @@ +--- +title: Centers loading icon vertically and horizontally in pipelines table in commit + view +merge_request: +author: From 60288d6c62d7e65ed5a93a72ba047ccaa2daa22b Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Wed, 15 Feb 2017 20:21:51 +0800 Subject: [PATCH 218/313] Use expect { }.to change { } Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8664#note_23427575 --- .../admin/runners_controller_spec.rb | 18 +++++++++--------- .../projects/runners_controller_spec.rb | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb index ae55ce87f0b..b5fe40d0510 100644 --- a/spec/controllers/admin/runners_controller_spec.rb +++ b/spec/controllers/admin/runners_controller_spec.rb @@ -31,16 +31,16 @@ describe Admin::RunnersController do describe '#update' do it 'updates the runner and ticks the queue' do - old_tick = runner.ensure_runner_queue_value new_desc = runner.description.swapcase - post :update, id: runner.id, runner: { description: new_desc } + expect do + post :update, id: runner.id, runner: { description: new_desc } + end.to change { runner.ensure_runner_queue_value } runner.reload expect(response).to have_http_status(302) expect(runner.description).to eq(new_desc) - expect(runner.ensure_runner_queue_value).not_to eq(old_tick) end end @@ -55,31 +55,31 @@ describe Admin::RunnersController do describe '#resume' do it 'marks the runner as active and ticks the queue' do - old_tick = runner.ensure_runner_queue_value runner.update(active: false) - post :resume, id: runner.id + expect do + post :resume, id: runner.id + end.to change { runner.ensure_runner_queue_value } runner.reload expect(response).to have_http_status(302) expect(runner.active).to eq(true) - expect(runner.ensure_runner_queue_value).not_to eq(old_tick) end end describe '#pause' do it 'marks the runner as inactive and ticks the queue' do - old_tick = runner.ensure_runner_queue_value runner.update(active: true) - post :pause, id: runner.id + expect do + post :pause, id: runner.id + end.to change { runner.ensure_runner_queue_value } runner.reload expect(response).to have_http_status(302) expect(runner.active).to eq(false) - expect(runner.ensure_runner_queue_value).not_to eq(old_tick) end end end diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb index 6dec12f1815..0fa249e4405 100644 --- a/spec/controllers/projects/runners_controller_spec.rb +++ b/spec/controllers/projects/runners_controller_spec.rb @@ -21,16 +21,16 @@ describe Projects::RunnersController do describe '#update' do it 'updates the runner and ticks the queue' do - old_tick = runner.ensure_runner_queue_value new_desc = runner.description.swapcase - post :update, params.merge(runner: { description: new_desc } ) + expect do + post :update, params.merge(runner: { description: new_desc } ) + end.to change { runner.ensure_runner_queue_value } runner.reload expect(response).to have_http_status(302) expect(runner.description).to eq(new_desc) - expect(runner.ensure_runner_queue_value).not_to eq(old_tick) end end @@ -45,31 +45,31 @@ describe Projects::RunnersController do describe '#resume' do it 'marks the runner as active and ticks the queue' do - old_tick = runner.ensure_runner_queue_value runner.update(active: false) - post :resume, params + expect do + post :resume, params + end.to change { runner.ensure_runner_queue_value } runner.reload expect(response).to have_http_status(302) expect(runner.active).to eq(true) - expect(runner.ensure_runner_queue_value).not_to eq(old_tick) end end describe '#pause' do it 'marks the runner as inactive and ticks the queue' do - old_tick = runner.ensure_runner_queue_value runner.update(active: true) - post :pause, params + expect do + post :pause, params + end.to change { runner.ensure_runner_queue_value } runner.reload expect(response).to have_http_status(302) expect(runner.active).to eq(false) - expect(runner.ensure_runner_queue_value).not_to eq(old_tick) end end end From 7a8d0aab61fa5d59a4bde5330948f1adcfbb542c Mon Sep 17 00:00:00 2001 From: Mark Fletcher Date: Wed, 15 Feb 2017 18:54:18 +0530 Subject: [PATCH 219/313] Ensure only commit comments relevant to target project are returned --- ...-commit-comments-are-shared-across-projects.yml | 4 ++++ lib/api/commits.rb | 2 +- spec/requests/api/commits_spec.rb | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/27873-when-a-commit-appears-in-several-projects-commit-comments-are-shared-across-projects.yml diff --git a/changelogs/unreleased/27873-when-a-commit-appears-in-several-projects-commit-comments-are-shared-across-projects.yml b/changelogs/unreleased/27873-when-a-commit-appears-in-several-projects-commit-comments-are-shared-across-projects.yml new file mode 100644 index 00000000000..89e2bdc69bc --- /dev/null +++ b/changelogs/unreleased/27873-when-a-commit-appears-in-several-projects-commit-comments-are-shared-across-projects.yml @@ -0,0 +1,4 @@ +--- +title: Only return target project's comments for a commit +merge_request: +author: diff --git a/lib/api/commits.rb b/lib/api/commits.rb index 2fefe760d24..173083d0ade 100644 --- a/lib/api/commits.rb +++ b/lib/api/commits.rb @@ -114,7 +114,7 @@ module API commit = user_project.commit(params[:sha]) not_found! 'Commit' unless commit - notes = Note.where(commit_id: commit.id).order(:created_at) + notes = user_project.notes.where(commit_id: commit.id).order(:created_at) present paginate(notes), with: Entities::CommitNote end diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb index af9028a8978..cb11cf98bf4 100644 --- a/spec/requests/api/commits_spec.rb +++ b/spec/requests/api/commits_spec.rb @@ -464,6 +464,20 @@ describe API::Commits, api: true do expect(response).to have_http_status(401) end end + + context 'when the commit is present on two projects' do + let(:forked_project) { create(:project, :repository, creator: user2, namespace: user2.namespace) } + let!(:forked_project_note) { create(:note_on_commit, author: user2, project: forked_project, commit_id: forked_project.repository.commit.id, note: 'a comment on a commit for fork') } + + it 'returns the comments for the target project' do + get api("/projects/#{forked_project.id}/repository/commits/#{forked_project.repository.commit.id}/comments", user2) + + expect(response).to have_http_status(200) + expect(json_response.length).to eq(1) + expect(json_response.first['note']).to eq('a comment on a commit for fork') + expect(json_response.first['author']['id']).to eq(user2.id) + end + end end describe 'POST :id/repository/commits/:sha/cherry_pick' do From e15032eded3b35097409817ddb1844164173ce1a Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Thu, 16 Feb 2017 01:07:29 +1100 Subject: [PATCH 220/313] override favicon for development to find tabs more easily --- app/assets/images/favicon-purple.ico | Bin 0 -> 5430 bytes app/helpers/page_layout_helper.rb | 4 ++++ app/views/layouts/_head.html.haml | 2 +- spec/helpers/page_layout_helper_spec.rb | 12 ++++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 app/assets/images/favicon-purple.ico diff --git a/app/assets/images/favicon-purple.ico b/app/assets/images/favicon-purple.ico new file mode 100644 index 0000000000000000000000000000000000000000..71acdf670ab48827376ef071657da6d7fa9e306f GIT binary patch literal 5430 zcmcIodr(wm6#w?YvOJeXSeEw!%kGMZW;Rojg5(RI!A6PW$I#@IHPauFDUn(_PGb&PgT@e=*$SnEcetH%cMp5{mTi~DcIM3a&N;vHJKw## z_k8CrV+y8ZVPOoki7itzW?_t(Ob)vi{FUIdfe)5|aQH#>>!VdFwAB-%YTn6>s`iI< zf07dd)p6hCCN$c2TSb({+=PaB@cF`#V+hP{o08Hdlvu>J12#!;{p*zEwj4visDI&5 zuCeN0?wp?5C9JfFUE3|~Z*{7+`7vi#f<)3Gp*u9hZ1j%AF0k%^+`B#NVo2`M5@(6hjPfTpgQu z1#?>`C$~tsSi9Jf`v|bVya#)C)^9m%6VWGeAO^7@Et8UOeKk7%tYp9Bj05hkO1O4s zF6js0lk(x(1jIuAm)Y_4Yi;4h!aT6II^&Rk?`_xKDIa}OKJEjtkW*~cuSpNnq&NLO_eRyxVkFs%>`DenN+mX@) zaS69&LDX*YG8nr_6 z!+wkX8VIh*&uf1_h4y-lwHt zd3)AK-TdhzLg$dbyOc2@i?Pl`#_T%A>Q#)DDJbe#qrL5>LoRnPMk0!iK4SuSHVF2k z$NdRVDYOSB8>{zEG*)RQy^h~!ty4=x6i){MkP_wV+^gnMU z#7`M~YDA3ZKD-bFQ1PKp7_T!^F66H_IBAh(BkPFD00-toZqLV+|7#%p3vXIN*E-zWkhW3 znw~23)W)*`&j?@6k)^IZAjg)$1J)y_FZ+n_SA~5xD)w|wUA%5z&Y`zt=TNyb2Xmcr zW@Kz#xJHSikH^n2y?^>oxk*iwBk7sIu>l0nHxN8;TMxO;VCwtmBaEbBHtEF!`}i?8 z>H1K;e_CG~C`byO(~)QXlg|-WxoRVC=MLxm!kyzd({#Ss8;kP}&)1%3ZeL&uok@G} zQ!-7}FvE^VGg95KLILDEzjL}a`#$#>fbPM4h!IZGn2Q{;?*Z3XYu_+K1=Lo5m>F|| zk4yFokhcZIdEZIjhS`tm@mlJI99}+K@pbAlV~*ML%y)RdWWVZOyQk;z_nvI{4y2iq z-ve@S_W=xg@o>ymv>-V6CXV2wo7UU7eFcACp5%kV_>W=6tn)>V zuZ}Tfn ztfDxtD;626=wA7%E0;u9^E_ljEw^`(@xy{AP@LCepXmP?o;y5bGS5SHPKNutOn^qA zZ8~6WCk*MPgVy#yi1~WmgbUFs18*F%J|G^_@SbCb_nltvIFxgEbzB|cNTZM9{nhUm z#h)e~((e|=d3=}3&k0*hIMV3rZ(YJK8lzuIJf!E2(&bZ}*U@^l@#YbmKv-PIgsY7_ z&R07z(k~7;dioaf8FY@G=ZWLf%}I?^|I8*+qbHoN{?E&kE)m}+Wu|l9@`|QMln}mX zMr4UMytnwe*^y<$w`y9%T5tFvN!pf7xjAST*Fpx+`h)k^P{$x%rTVpg%`U^MN!BS z#m+=gwChB%UL}fU3j7N}>}IUAld(iQW4dO>{DA;2!Sz9#q#oM7Bw2#09;CUn+n>ZP OiaL_NMKKZNFv&ls2@&uB literal 0 HcmV?d00001 diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb index 7d4d049101a..aee8099aeb2 100644 --- a/app/helpers/page_layout_helper.rb +++ b/app/helpers/page_layout_helper.rb @@ -34,6 +34,10 @@ module PageLayoutHelper end end + def favicon + Rails.env.development? ? 'favicon-purple.ico' : 'favicon.ico' + end + def page_image default = image_url('gitlab_logo.png') diff --git a/app/views/layouts/_head.html.haml b/app/views/layouts/_head.html.haml index f2d355587bd..302c1794628 100644 --- a/app/views/layouts/_head.html.haml +++ b/app/views/layouts/_head.html.haml @@ -23,7 +23,7 @@ %title= page_title(site_name) %meta{ name: "description", content: page_description } - = favicon_link_tag 'favicon.ico' + = favicon_link_tag favicon = stylesheet_link_tag "application", media: "all" = stylesheet_link_tag "print", media: "print" diff --git a/spec/helpers/page_layout_helper_spec.rb b/spec/helpers/page_layout_helper_spec.rb index dc07657e101..872679a6ce3 100644 --- a/spec/helpers/page_layout_helper_spec.rb +++ b/spec/helpers/page_layout_helper_spec.rb @@ -40,6 +40,18 @@ describe PageLayoutHelper do end end + describe 'favicon' do + it 'defaults to favicon.ico' do + allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('production')) + expect(helper.favicon).to eq 'favicon.ico' + end + + it 'has purple favicon for development' do + allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('development')) + expect(helper.favicon).to eq 'favicon-purple.ico' + end + end + describe 'page_image' do it 'defaults to the GitLab logo' do expect(helper.page_image).to end_with 'assets/gitlab_logo.png' From 19cb1fcdf364a31077a70d8cf2af09d674f32eaa Mon Sep 17 00:00:00 2001 From: winniehell Date: Sat, 11 Feb 2017 22:22:22 +0100 Subject: [PATCH 221/313] Make Karma output look nicer for CI (!9165) --- .../unreleased/beautiful-karma-output.yml | 4 + config/karma.config.js | 3 +- package.json | 1 + yarn.lock | 195 +++++++++--------- 4 files changed, 108 insertions(+), 95 deletions(-) create mode 100644 changelogs/unreleased/beautiful-karma-output.yml diff --git a/changelogs/unreleased/beautiful-karma-output.yml b/changelogs/unreleased/beautiful-karma-output.yml new file mode 100644 index 00000000000..6ccddebab68 --- /dev/null +++ b/changelogs/unreleased/beautiful-karma-output.yml @@ -0,0 +1,4 @@ +--- +title: Make Karma output look nicer for CI +merge_request: 9165 +author: winniehell diff --git a/config/karma.config.js b/config/karma.config.js index a1fbeab1f46..5b472780aed 100644 --- a/config/karma.config.js +++ b/config/karma.config.js @@ -4,6 +4,7 @@ var ROOT_PATH = path.resolve(__dirname, '..'); // Karma configuration module.exports = function(config) { + var progressReporter = process.env.CI ? 'mocha' : 'progress'; config.set({ basePath: ROOT_PATH, browsers: ['PhantomJS'], @@ -15,7 +16,7 @@ module.exports = function(config) { preprocessors: { 'spec/javascripts/**/*.js?(.es6)': ['webpack', 'sourcemap'], }, - reporters: ['progress', 'coverage-istanbul'], + reporters: [progressReporter, 'coverage-istanbul'], coverageIstanbulReporter: { reports: ['html', 'text-summary'], dir: 'coverage-javascript/', diff --git a/package.json b/package.json index 0500ba9670e..08bde1bc313 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "jquery-ui": "github:jquery/jquery-ui#1.11.4", "jquery-ujs": "1.2.1", "js-cookie": "^2.1.3", + "karma-mocha-reporter": "^2.2.2", "mousetrap": "1.4.6", "pikaday": "^1.5.1", "select2": "3.5.2-browserify", diff --git a/yarn.lock b/yarn.lock index 42cdc8b3fcd..99db6f61bcd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,10 +1,12 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 + + abbrev@1, abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" -accepts@~1.3.3, accepts@1.3.3: +accepts@1.3.3, accepts@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" dependencies: @@ -23,14 +25,14 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn@4.0.4, acorn@^4.0.3, acorn@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.3, acorn@^4.0.4, acorn@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.4.tgz#17a8d6a7a6c4ef538b814ec9abac2779293bf30a" - after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" @@ -178,7 +180,11 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^1.4.0, async@^1.4.2, async@^1.5.2, async@1.x: +async@0.2.x, async@~0.2.6: + version "0.2.10" + resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" + +async@1.x, async@^1.4.0, async@^1.4.2, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -188,10 +194,6 @@ async@^2.1.2, async@^2.1.4: dependencies: lodash "^4.14.0" -async@~0.2.6, async@0.2.x: - version "0.2.10" - resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - async@~0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -995,7 +997,7 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: @@ -1140,14 +1142,6 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@^1.4.6: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - concat-stream@1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611" @@ -1156,6 +1150,14 @@ concat-stream@1.5.0: readable-stream "~2.0.0" typedarray "~0.0.5" +concat-stream@^1.4.6: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + connect-history-api-fallback@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" @@ -1263,16 +1265,16 @@ custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" +d3@3.5.11: + version "3.5.11" + resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.11.tgz#d130750eed0554db70e8432102f920a12407b69c" + d@^0.1.1, d@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" dependencies: es5-ext "~0.10.2" -d3@3.5.11: - version "3.5.11" - resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.11.tgz#d130750eed0554db70e8432102f920a12407b69c" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -1283,28 +1285,28 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@^2.1.1, debug@^2.2.0, debug@2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" - dependencies: - ms "0.7.2" +debug@0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" -debug@~2.2.0, debug@2.2.0: +debug@2.2.0, debug@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" -debug@0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" - debug@2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" dependencies: ms "0.7.2" +debug@2.6.0, debug@^2.1.1, debug@^2.2.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" + dependencies: + ms "0.7.2" + decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1382,7 +1384,7 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" -doctrine@^1.2.2, doctrine@1.5.0: +doctrine@1.5.0, doctrine@^1.2.2: version "1.5.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" dependencies: @@ -1545,7 +1547,7 @@ es6-set@~0.1.3: es6-symbol "3" event-emitter "~0.3.4" -es6-symbol@~3.1, es6-symbol@~3.1.0, es6-symbol@3: +es6-symbol@3, es6-symbol@~3.1, es6-symbol@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" dependencies: @@ -1697,7 +1699,7 @@ espree@^3.4.0: acorn "4.0.4" acorn-jsx "^3.0.0" -esprima@^2.7.1, esprima@2.7.x: +esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -2293,7 +2295,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@2, inherits@2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -2499,14 +2501,14 @@ is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" -isarray@^1.0.0, isarray@~1.0.0, isarray@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + isbinaryfile@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" @@ -2632,7 +2634,7 @@ jquery-ujs@1.2.1: dependencies: jquery ">=1.8.0" -jquery@>=1.8.0, jquery@2.2.1: +jquery@2.2.1, jquery@>=1.8.0: version "2.2.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-2.2.1.tgz#3c3e16854ad3d2ac44ac65021b17426d22ad803f" @@ -2644,7 +2646,7 @@ js-tokens@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" -js-yaml@^3.5.1, js-yaml@^3.7.0, js-yaml@3.x: +js-yaml@3.x, js-yaml@^3.5.1, js-yaml@^3.7.0: version "3.8.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.1.tgz#782ba50200be7b9e5a8537001b7804db3ad02628" dependencies: @@ -2681,7 +2683,7 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@^3.3.2, json3@3.3.2: +json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -2721,6 +2723,12 @@ karma-jasmine@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" +karma-mocha-reporter@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.2.tgz#876de9a287244e54a608591732a98e66611f6abe" + dependencies: + chalk "1.1.3" + karma-phantomjs-launcher@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.2.tgz#19e1041498fd75563ed86730a22c1fe579fa8fb1" @@ -2823,7 +2831,7 @@ loader-runner@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5, loader-utils@0.2.x: +loader-utils@0.2.x, loader-utils@^0.2.11, loader-utils@^0.2.16, loader-utils@^0.2.5: version "0.2.16" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" dependencies: @@ -2985,7 +2993,7 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: dependencies: mime-db "~1.26.0" -mime@^1.3.4, mime@1.3.4: +mime@1.3.4, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" @@ -2993,32 +3001,32 @@ minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, "minimatch@2 || 3": +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" +minimist@0.0.8, minimist@~0.0.1: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1, minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -mkdirp@^0.5.0, mkdirp@^0.5.1, "mkdirp@>=0.5 0", mkdirp@~0.5.0, mkdirp@~0.5.1, mkdirp@0.5.x: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - mkdirp@0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" dependencies: minimist "0.0.8" +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + moment@2.x: version "2.17.1" resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.1.tgz#fed9506063f36b10f066c8b59a144d7faebe1d82" @@ -3130,7 +3138,7 @@ node-zopfli@^2.0.0: nan "^2.0.0" node-pre-gyp "^0.6.4" -nopt@~3.0.6, nopt@3.x: +nopt@3.x, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -3166,14 +3174,14 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" @@ -3199,7 +3207,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.4.0, once@1.x: +once@1.x, once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -3480,22 +3488,18 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" +punycode@^1.2.4, punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + qjobs@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" -qs@~6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" - qs@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.0.tgz#3b7848c03c2dece69a9522b0fae8c4126d745f3b" @@ -3504,6 +3508,10 @@ qs@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" +qs@~6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -3743,11 +3751,11 @@ resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" -resolve@^1.1.6, resolve@1.1.x: +resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" -resolve@^1.2.0: +resolve@^1.1.6, resolve@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" @@ -3764,7 +3772,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4, rimraf@2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -3796,7 +3804,7 @@ select2@3.5.2-browserify: version "3.5.2-browserify" resolved "https://registry.yarnpkg.com/select2/-/select2-3.5.2-browserify.tgz#dc4dafda38d67a734e8a97a46f0d3529ae05391d" -semver@^5.3.0, semver@~5.3.0, "semver@2 || 3 || 4 || 5": +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -3963,7 +3971,7 @@ source-map-support@^0.4.2: dependencies: source-map "^0.5.3" -source-map@^0.1.41, source-map@0.1.x: +source-map@0.1.x, source-map@^0.1.41: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: @@ -4063,10 +4071,6 @@ stream-http@^2.3.1: to-arraybuffer "^1.0.0" xtend "^4.0.0" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -4082,6 +4086,10 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^3.0.0" +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -4292,17 +4300,10 @@ underscore@1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" -url-parse@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - url-parse@1.0.x: version "1.0.5" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" @@ -4310,6 +4311,13 @@ url-parse@1.0.x: querystringify "0.0.x" requires-port "1.0.x" +url-parse@^1.1.1: + version "1.1.7" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.1.7.tgz#025cff999653a459ab34232147d89514cc87d74a" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -4334,7 +4342,7 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util@^0.10.3, util@0.10.3: +util@0.10.3, util@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" dependencies: @@ -4494,6 +4502,10 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -4502,10 +4514,6 @@ wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -4588,4 +4596,3 @@ yauzl@2.4.1: yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - From 23e6cd6f1d9a6379491ba80b90e6003ff0480260 Mon Sep 17 00:00:00 2001 From: Mike Greiling Date: Wed, 15 Feb 2017 08:48:46 -0600 Subject: [PATCH 222/313] only load istanbul plugin in development mode --- config/webpack.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/webpack.config.js b/config/webpack.config.js index 5d5e4bb570a..7782fe393ea 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -54,7 +54,7 @@ var config = { exclude: /(node_modules|vendor\/assets)/, loader: 'babel-loader', options: { - plugins: ['istanbul'], + plugins: IS_PRODUCTION ? [] : ['istanbul'], presets: [ ["es2015", {"modules": false}], 'stage-2' From ba374a5a35b5fbe3c5c2e05b3e8a3a20d40fa331 Mon Sep 17 00:00:00 2001 From: Mark Fletcher Date: Mon, 16 Jan 2017 09:17:02 +0000 Subject: [PATCH 223/313] Specify that only project owners can transfer a project [skip ci] --- .../unreleased/26651-cannot-move-project-into-group.yml | 4 ++++ doc/workflow/groups.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 changelogs/unreleased/26651-cannot-move-project-into-group.yml diff --git a/changelogs/unreleased/26651-cannot-move-project-into-group.yml b/changelogs/unreleased/26651-cannot-move-project-into-group.yml new file mode 100644 index 00000000000..244a19a627d --- /dev/null +++ b/changelogs/unreleased/26651-cannot-move-project-into-group.yml @@ -0,0 +1,4 @@ +--- +title: Specify in the documentation that only projects owners can transfer projects +merge_request: +author: diff --git a/doc/workflow/groups.md b/doc/workflow/groups.md index a693cc3d0fd..6237a5d5e18 100644 --- a/doc/workflow/groups.md +++ b/doc/workflow/groups.md @@ -23,7 +23,7 @@ You can use the 'New project' button to add a project to the new group. ## Transferring an existing project into a group -You can transfer an existing project into a group you own from the project settings page. +You can transfer an existing project into a group you own from the project settings page. The option to transfer a project is only available if you are the Owner of the project. First scroll down to the 'Dangerous settings' and click 'Show them to me'. Now you can pick any of the groups you manage as the new namespace for the group. From 33c8d413d2b42bd7b823228a2739eddcd4dfbe51 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 8 Feb 2017 20:33:29 +0000 Subject: [PATCH 224/313] Merge branch 'asciidoctor-xss-patch' into 'security' Add sanitization filter to asciidocs output to prevent XSS See https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/2057 --- changelogs/unreleased/asciidocs-xss-patch.yml | 4 ++++ lib/gitlab/asciidoc.rb | 3 +++ spec/lib/gitlab/asciidoc_spec.rb | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 changelogs/unreleased/asciidocs-xss-patch.yml diff --git a/changelogs/unreleased/asciidocs-xss-patch.yml b/changelogs/unreleased/asciidocs-xss-patch.yml new file mode 100644 index 00000000000..f70a4b81b82 --- /dev/null +++ b/changelogs/unreleased/asciidocs-xss-patch.yml @@ -0,0 +1,4 @@ +--- +title: Patch Asciidocs rendering to block XSS +merge_request: +author: diff --git a/lib/gitlab/asciidoc.rb b/lib/gitlab/asciidoc.rb index 0618107e2c3..d575367d81a 100644 --- a/lib/gitlab/asciidoc.rb +++ b/lib/gitlab/asciidoc.rb @@ -36,6 +36,9 @@ module Gitlab html = Banzai.post_process(html, context) + filter = Banzai::Filter::SanitizationFilter.new(html) + html = filter.call.to_s + html.html_safe end diff --git a/spec/lib/gitlab/asciidoc_spec.rb b/spec/lib/gitlab/asciidoc_spec.rb index ba199917f5c..bca57105d1d 100644 --- a/spec/lib/gitlab/asciidoc_spec.rb +++ b/spec/lib/gitlab/asciidoc_spec.rb @@ -41,6 +41,29 @@ module Gitlab render(input, context, asciidoc_opts) end end + + context "XSS" do + links = { + 'links' => { + input: 'link:mylink"onmouseover="alert(1)[Click Here]', + output: "
" + }, + 'images' => { + input: 'image:https://localhost.com/image.png[Alt text" onerror="alert(7)]', + output: "
\n

\"Alt

\n
" + }, + 'pre' => { + input: '```mypre">', + output: "
\n
\n
\">
\n
\n
" + } + } + + links.each do |name, data| + it "does not convert dangerous #{name} into HTML" do + expect(render(data[:input], context)).to eql data[:output] + end + end + end end def render(*args) From 7e1f7a02dbe3ebb6688005a4d966670bea12beb1 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 9 Feb 2017 17:30:06 +0000 Subject: [PATCH 225/313] Merge branch 'fix-rdoc-xss' into 'security' Fix XSS in rdoc and other markups See https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/2058 --- changelogs/unreleased/patch-rdoc-xss.yml | 4 ++++ lib/gitlab/other_markup.rb | 3 +++ spec/lib/gitlab/other_markup.rb | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 changelogs/unreleased/patch-rdoc-xss.yml create mode 100644 spec/lib/gitlab/other_markup.rb diff --git a/changelogs/unreleased/patch-rdoc-xss.yml b/changelogs/unreleased/patch-rdoc-xss.yml new file mode 100644 index 00000000000..b428f5435e3 --- /dev/null +++ b/changelogs/unreleased/patch-rdoc-xss.yml @@ -0,0 +1,4 @@ +--- +title: Patch XSS vulnerability in RDOC support +merge_request: +author: diff --git a/lib/gitlab/other_markup.rb b/lib/gitlab/other_markup.rb index 4e2f8ed5587..e67acf28c94 100644 --- a/lib/gitlab/other_markup.rb +++ b/lib/gitlab/other_markup.rb @@ -17,6 +17,9 @@ module Gitlab html = Banzai.post_process(html, context) + filter = Banzai::Filter::SanitizationFilter.new(html) + html = filter.call.to_s + html.html_safe end end diff --git a/spec/lib/gitlab/other_markup.rb b/spec/lib/gitlab/other_markup.rb new file mode 100644 index 00000000000..8f5a353b381 --- /dev/null +++ b/spec/lib/gitlab/other_markup.rb @@ -0,0 +1,22 @@ +require 'spec_helper' + +describe Gitlab::OtherMarkup, lib: true do + context "XSS Checks" do + links = { + 'links' => { + file: 'file.rdoc', + input: 'XSS[JaVaScriPt:alert(1)]', + output: '

XSS

' + } + } + links.each do |name, data| + it "does not convert dangerous #{name} into HTML" do + expect(render(data[:file], data[:input], context)).to eql data[:output] + end + end + end + + def render(*args) + described_class.render(*args) + end +end From dd944bf14f4a0fd555db32d5833325fa459d9565 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Mon, 13 Feb 2017 22:42:46 +0000 Subject: [PATCH 226/313] Merge branch 'svg-xss-fix' into 'security' Fix for XSS vulnerability in SVG attachments See https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/2059 --- app/uploaders/file_uploader.rb | 2 +- app/uploaders/uploader_helper.rb | 9 ++++++++- changelogs/unreleased/fix-xss-svg.yml | 4 ++++ spec/controllers/uploads_controller_spec.rb | 22 +++++++++++++++++++++ spec/factories/notes.rb | 6 +++++- 5 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/fix-xss-svg.yml diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index 47bef7cd1e4..23b7318827c 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -36,7 +36,7 @@ class FileUploader < GitlabUploader escaped_filename = filename.gsub("]", "\\]") markdown = "[#{escaped_filename}](#{self.secure_url})" - markdown.prepend("!") if image_or_video? + markdown.prepend("!") if image_or_video? || dangerous? { alt: filename, diff --git a/app/uploaders/uploader_helper.rb b/app/uploaders/uploader_helper.rb index fbaea2744a3..35fd1ed23f8 100644 --- a/app/uploaders/uploader_helper.rb +++ b/app/uploaders/uploader_helper.rb @@ -1,12 +1,15 @@ # Extra methods for uploader module UploaderHelper - IMAGE_EXT = %w[png jpg jpeg gif bmp tiff svg] + IMAGE_EXT = %w[png jpg jpeg gif bmp tiff] # We recommend using the .mp4 format over .mov. Videos in .mov format can # still be used but you really need to make sure they are served with the # proper MIME type video/mp4 and not video/quicktime or your videos won't play # on IE >= 9. # http://archive.sublimevideo.info/20150912/docs.sublimevideo.net/troubleshooting.html VIDEO_EXT = %w[mp4 m4v mov webm ogv] + # These extension types can contain dangerous code and should only be embedded inline with + # proper filtering. They should always be tagged as "Content-Disposition: attachment", not "inline". + DANGEROUS_EXT = %w[svg] def image? extension_match?(IMAGE_EXT) @@ -20,6 +23,10 @@ module UploaderHelper image? || video? end + def dangerous? + extension_match?(DANGEROUS_EXT) + end + def extension_match?(extensions) return false unless file diff --git a/changelogs/unreleased/fix-xss-svg.yml b/changelogs/unreleased/fix-xss-svg.yml new file mode 100644 index 00000000000..dbb956c3910 --- /dev/null +++ b/changelogs/unreleased/fix-xss-svg.yml @@ -0,0 +1,4 @@ +--- +title: Fix XSS vulnerability in SVG attachments +merge_request: +author: diff --git a/spec/controllers/uploads_controller_spec.rb b/spec/controllers/uploads_controller_spec.rb index 570d9fa43f8..c9584ddf18c 100644 --- a/spec/controllers/uploads_controller_spec.rb +++ b/spec/controllers/uploads_controller_spec.rb @@ -4,6 +4,28 @@ describe UploadsController do let!(:user) { create(:user, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } describe "GET show" do + context 'Content-Disposition security measures' do + let(:project) { create(:empty_project, :public) } + + context 'for PNG files' do + it 'returns Content-Disposition: inline' do + note = create(:note, :with_attachment, project: project) + get :show, model: 'note', mounted_as: 'attachment', id: note.id, filename: 'image.png' + + expect(response['Content-Disposition']).to start_with('inline;') + end + end + + context 'for SVG files' do + it 'returns Content-Disposition: attachment' do + note = create(:note, :with_svg_attachment, project: project) + get :show, model: 'note', mounted_as: 'attachment', id: note.id, filename: 'image.svg' + + expect(response['Content-Disposition']).to start_with('attachment;') + end + end + end + context "when viewing a user avatar" do context "when signed in" do before do diff --git a/spec/factories/notes.rb b/spec/factories/notes.rb index a21da7074f9..5c50cd7f4ad 100644 --- a/spec/factories/notes.rb +++ b/spec/factories/notes.rb @@ -97,7 +97,11 @@ FactoryGirl.define do end trait :with_attachment do - attachment { fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "`/png") } + attachment { fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png") } + end + + trait :with_svg_attachment do + attachment { fixture_file_upload(Rails.root + "spec/fixtures/unsanitized.svg", "image/svg+xml") } end end end From 414d695db74e1a237aac7e0ca6a2543e7be1510e Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Thu, 9 Feb 2017 21:25:30 +0000 Subject: [PATCH 227/313] Merge branch 'fix-github-import-MR-wrong-project' into 'security' Fix labels being applied to wrong merge requests on GitHub import See https://dev.gitlab.org/gitlab/gitlabhq/merge_requests/2064 --- .../unreleased/labels-assigned-to-wrong-project.yml | 4 ++++ lib/gitlab/github_import/importer.rb | 10 +++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 changelogs/unreleased/labels-assigned-to-wrong-project.yml diff --git a/changelogs/unreleased/labels-assigned-to-wrong-project.yml b/changelogs/unreleased/labels-assigned-to-wrong-project.yml new file mode 100644 index 00000000000..0f4a88075a4 --- /dev/null +++ b/changelogs/unreleased/labels-assigned-to-wrong-project.yml @@ -0,0 +1,4 @@ +--- +title: Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. +merge_request: +author: diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb index ec1318ab33c..9a4ffd28438 100644 --- a/lib/gitlab/github_import/importer.rb +++ b/lib/gitlab/github_import/importer.rb @@ -115,7 +115,7 @@ module Gitlab begin issuable = if gh_issue.pull_request? - MergeRequest.find_by_iid(gh_issue.number) + MergeRequest.find_by(target_project_id: project.id, iid: gh_issue.number) else gh_issue.create! end @@ -212,8 +212,12 @@ module Gitlab comment = CommentFormatter.new(project, raw) # GH does not return info about comment's parent, so we guess it by checking its URL! *_, parent, iid = URI(raw.html_url).path.split('/') - issuable_class = parent == 'issues' ? Issue : MergeRequest - issuable = issuable_class.find_by_iid(iid) + if parent == 'issues' + issuable = Issue.find_by(project_id: project.id, iid: iid) + else + issuable = MergeRequest.find_by(target_project_id: project.id, iid: iid) + end + next unless issuable issuable.notes.create!(comment.attributes) From cec1e3ebc8fe03955c3c1c27f10a7d924f2917ed Mon Sep 17 00:00:00 2001 From: James Lopez Date: Wed, 15 Feb 2017 16:45:41 +0100 Subject: [PATCH 228/313] create lighter version of JSON and reuse initial restore in spec to speed up run --- .../gitlab/import_export/project.light.json | 48 +++++ .../project_tree_restorer_spec.rb | 168 ++++++++---------- 2 files changed, 123 insertions(+), 93 deletions(-) create mode 100644 spec/lib/gitlab/import_export/project.light.json diff --git a/spec/lib/gitlab/import_export/project.light.json b/spec/lib/gitlab/import_export/project.light.json new file mode 100644 index 00000000000..a78836c3c34 --- /dev/null +++ b/spec/lib/gitlab/import_export/project.light.json @@ -0,0 +1,48 @@ +{ + "description": "Nisi et repellendus ut enim quo accusamus vel magnam.", + "visibility_level": 10, + "archived": false, + "labels": [ + { + "id": 2, + "title": "test2", + "color": "#428bca", + "project_id": 8, + "created_at": "2016-07-22T08:55:44.161Z", + "updated_at": "2016-07-22T08:55:44.161Z", + "template": false, + "description": "", + "type": "ProjectLabel", + "priorities": [ + ] + }, + { + "id": 3, + "title": "test3", + "color": "#428bca", + "group_id": 8, + "created_at": "2016-07-22T08:55:44.161Z", + "updated_at": "2016-07-22T08:55:44.161Z", + "template": false, + "description": "", + "project_id": null, + "type": "GroupLabel", + "priorities": [ + { + "id": 1, + "project_id": 5, + "label_id": 1, + "priority": 1, + "created_at": "2016-10-18T09:35:43.338Z", + "updated_at": "2016-10-18T09:35:43.338Z" + } + ] + } + ], + "snippets": [ + + ], + "hooks": [ + + ] +} \ No newline at end of file diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index 0af13ba8e47..0eefb450f37 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -3,24 +3,27 @@ include ImportExport::CommonUtil describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do describe 'restore project tree' do - let(:user) { create(:user) } - let(:namespace) { create(:namespace, owner: user) } - let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') } - let!(:project) { create(:empty_project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') } - let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) } - let(:restored_project_json) { project_tree_restorer.restore } + before(:all) do + user = create(:user) + + RSpec::Mocks.with_temporary_scope do + @shared = Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') + allow(@shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/') + project = create(:empty_project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') + project_tree_restorer = described_class.new(user: user, shared: @shared, project: project) + @restored_project_json = project_tree_restorer.restore + end + end before do - allow(shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/') end context 'JSON' do it 'restores models based on JSON' do - expect(restored_project_json).to be true + expect(@restored_project_json).to be true end it 'restore correct project features' do - restored_project_json project = Project.find_by_path('project') expect(project.project_feature.issues_access_level).to eq(ProjectFeature::DISABLED) @@ -31,62 +34,42 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do end it 'has the same label associated to two issues' do - restored_project_json - expect(ProjectLabel.find_by_title('test2').issues.count).to eq(2) end it 'has milestones associated to two separate issues' do - restored_project_json - expect(Milestone.find_by_description('test milestone').issues.count).to eq(2) end it 'creates a valid pipeline note' do - restored_project_json - expect(Ci::Pipeline.first.notes).not_to be_empty end it 'restores pipelines with missing ref' do - restored_project_json - expect(Ci::Pipeline.where(ref: nil)).not_to be_empty end it 'restores the correct event with symbolised data' do - restored_project_json - expect(Event.where.not(data: nil).first.data[:ref]).not_to be_empty end it 'preserves updated_at on issues' do - restored_project_json - issue = Issue.where(description: 'Aliquam enim illo et possimus.').first expect(issue.reload.updated_at.to_s).to eq('2016-06-14 15:02:47 UTC') end it 'contains the merge access levels on a protected branch' do - restored_project_json - expect(ProtectedBranch.first.merge_access_levels).not_to be_empty end it 'contains the push access levels on a protected branch' do - restored_project_json - expect(ProtectedBranch.first.push_access_levels).not_to be_empty end context 'event at forth level of the tree' do let(:event) { Event.where(title: 'test levels').first } - before do - restored_project_json - end - it 'restores the event' do expect(event).not_to be_nil end @@ -99,77 +82,44 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do it 'has the correct data for merge request st_diffs' do # makes sure we are renaming the custom method +utf8_st_diffs+ into +st_diffs+ - expect { restored_project_json }.to change(MergeRequestDiff.where.not(st_diffs: nil), :count).by(9) + expect(MergeRequestDiff.where.not(st_diffs: nil).count).to eq(9) end it 'has labels associated to label links, associated to issues' do - restored_project_json - expect(Label.first.label_links.first.target).not_to be_nil end it 'has project labels' do - restored_project_json - expect(ProjectLabel.count).to eq(2) end it 'has no group labels' do - restored_project_json - expect(GroupLabel.count).to eq(0) end - context 'with group' do - let!(:project) do - create(:empty_project, - :builds_disabled, - :issues_disabled, - name: 'project', - path: 'project', - group: create(:group)) - end - - it 'has group labels' do - restored_project_json - - expect(GroupLabel.count).to eq(1) - end - - it 'has label priorities' do - restored_project_json - - expect(GroupLabel.first.priorities).not_to be_empty - end - end - it 'has a project feature' do - restored_project_json - - expect(project.project_feature).not_to be_nil + expect(Project.first.project_feature).not_to be_nil end it 'restores the correct service' do - restored_project_json - expect(CustomIssueTrackerService.first).not_to be_nil end context 'Merge requests' do before do - restored_project_json + @restored_project_json end it 'always has the new project as a target' do - expect(MergeRequest.find_by_title('MR1').target_project).to eq(project) + expect(MergeRequest.find_by_title('MR1').target_project).to eq(Project.first) end it 'has the same source project as originally if source/target are the same' do - expect(MergeRequest.find_by_title('MR1').source_project).to eq(project) + expect(MergeRequest.find_by_title('MR1').source_project).to eq(Project.first) end it 'has the new project as target if source/target differ' do - expect(MergeRequest.find_by_title('MR2').target_project).to eq(project) + expect(MergeRequest.find_by_title('MR2').target_project).to eq(Project.first) end it 'has no source if source/target differ' do @@ -177,32 +127,7 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do end end - context 'project.json file access check' do - it 'does not read a symlink' do - Dir.mktmpdir do |tmpdir| - setup_symlink(tmpdir, 'project.json') - allow(shared).to receive(:export_path).and_call_original - - restored_project_json - - expect(shared.errors.first).not_to include('test') - end - end - end - - context 'when there is an existing build with build token' do - it 'restores project json correctly' do - create(:ci_build, token: 'abcd') - - expect(restored_project_json).to be true - end - end - context 'tokens are regenerated' do - before do - restored_project_json - end - it 'has a new CI trigger token' do expect(Ci::Trigger.where(token: 'cdbfasdf44a5958c83654733449e585')).to be_empty end @@ -213,4 +138,61 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do end end end + + context 'Light JSON' do + let(:user) { create(:user) } + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') } + let!(:project) { create(:empty_project, :builds_disabled, :issues_disabled, name: 'project', path: 'project') } + let(:project_tree_restorer) { described_class.new(user: user, shared: shared, project: project) } + let(:restored_project_json) { project_tree_restorer.restore } + + before do + allow(ImportExport).to receive(:project_filename).and_return('project.light.json') + allow(shared).to receive(:export_path).and_return('spec/lib/gitlab/import_export/') + end + + context 'project.json file access check' do + it 'does not read a symlink' do + Dir.mktmpdir do |tmpdir| + setup_symlink(tmpdir, 'project.json') + allow(shared).to receive(:export_path).and_call_original + + restored_project_json + + expect(shared.errors.first).not_to include('test') + end + end + end + + context 'when there is an existing build with build token' do + it 'restores project json correctly' do + create(:ci_build, token: 'abcd') + + expect(restored_project_json).to be true + end + end + + context 'with group' do + let!(:project) do + create(:empty_project, + :builds_disabled, + :issues_disabled, + name: 'project', + path: 'project', + group: create(:group)) + end + + before do + restored_project_json + end + + it 'has group labels' do + expect(GroupLabel.count).to eq(1) + end + + it 'has label priorities' do + expect(GroupLabel.first.priorities).not_to be_empty + end + end + end end From ea9e0372a0b85fd24f72ea1f8aefcfe057e431b1 Mon Sep 17 00:00:00 2001 From: Robert Speicher Date: Wed, 15 Feb 2017 10:48:55 -0500 Subject: [PATCH 229/313] Remove changelog entries for 8.16.5 release --- changelogs/unreleased/asciidocs-xss-patch.yml | 4 ---- changelogs/unreleased/fix-xss-svg.yml | 4 ---- changelogs/unreleased/labels-assigned-to-wrong-project.yml | 4 ---- changelogs/unreleased/patch-rdoc-xss.yml | 4 ---- 4 files changed, 16 deletions(-) delete mode 100644 changelogs/unreleased/asciidocs-xss-patch.yml delete mode 100644 changelogs/unreleased/fix-xss-svg.yml delete mode 100644 changelogs/unreleased/labels-assigned-to-wrong-project.yml delete mode 100644 changelogs/unreleased/patch-rdoc-xss.yml diff --git a/changelogs/unreleased/asciidocs-xss-patch.yml b/changelogs/unreleased/asciidocs-xss-patch.yml deleted file mode 100644 index f70a4b81b82..00000000000 --- a/changelogs/unreleased/asciidocs-xss-patch.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Patch Asciidocs rendering to block XSS -merge_request: -author: diff --git a/changelogs/unreleased/fix-xss-svg.yml b/changelogs/unreleased/fix-xss-svg.yml deleted file mode 100644 index dbb956c3910..00000000000 --- a/changelogs/unreleased/fix-xss-svg.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Fix XSS vulnerability in SVG attachments -merge_request: -author: diff --git a/changelogs/unreleased/labels-assigned-to-wrong-project.yml b/changelogs/unreleased/labels-assigned-to-wrong-project.yml deleted file mode 100644 index 0f4a88075a4..00000000000 --- a/changelogs/unreleased/labels-assigned-to-wrong-project.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects. -merge_request: -author: diff --git a/changelogs/unreleased/patch-rdoc-xss.yml b/changelogs/unreleased/patch-rdoc-xss.yml deleted file mode 100644 index b428f5435e3..00000000000 --- a/changelogs/unreleased/patch-rdoc-xss.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: Patch XSS vulnerability in RDOC support -merge_request: -author: From 25fec0f882300ab4f917a71a5650ab0d29c7b939 Mon Sep 17 00:00:00 2001 From: Clement Ho Date: Thu, 9 Feb 2017 16:19:12 -0600 Subject: [PATCH 230/313] Fix regression where cmd-click stopped working for todos and merge request tabs --- .../javascripts/merge_request_tabs.js.es6 | 5 +- app/assets/javascripts/todos.js.es6 | 17 +++-- .../27922-cmd-click-todo-doesn-t-work.yml | 5 ++ spec/javascripts/merge_request_tabs_spec.js | 40 ++++++++++-- spec/javascripts/todos_spec.js | 63 +++++++++++++++++++ 5 files changed, 112 insertions(+), 18 deletions(-) create mode 100644 changelogs/unreleased/27922-cmd-click-todo-doesn-t-work.yml create mode 100644 spec/javascripts/todos_spec.js diff --git a/app/assets/javascripts/merge_request_tabs.js.es6 b/app/assets/javascripts/merge_request_tabs.js.es6 index cc049e00477..5ac3da574b5 100644 --- a/app/assets/javascripts/merge_request_tabs.js.es6 +++ b/app/assets/javascripts/merge_request_tabs.js.es6 @@ -102,9 +102,10 @@ require('./flash'); } clickTab(e) { - if (e.target && gl.utils.isMetaClick(e)) { - const targetLink = e.target.getAttribute('href'); + if (e.currentTarget && gl.utils.isMetaClick(e)) { + const targetLink = e.currentTarget.getAttribute('href'); e.stopImmediatePropagation(); + e.preventDefault(); window.open(targetLink, '_blank'); } } diff --git a/app/assets/javascripts/todos.js.es6 b/app/assets/javascripts/todos.js.es6 index b07e62a8c30..ded683f2ca1 100644 --- a/app/assets/javascripts/todos.js.es6 +++ b/app/assets/javascripts/todos.js.es6 @@ -147,24 +147,21 @@ goToTodoUrl(e) { const todoLink = this.dataset.url; - let targetLink = e.target.getAttribute('href'); - - if (e.target.tagName === 'IMG') { // See if clicked target was Avatar - targetLink = e.target.parentElement.getAttribute('href'); // Parent of Avatar is link - } if (!todoLink) { return; } if (gl.utils.isMetaClick(e)) { + const windowTarget = '_blank'; + const selected = e.target; e.preventDefault(); - // Meta-Click on username leads to different URL than todoLink. - // Turbolinks can resolve that URL, but window.open requires URL manually. - if (targetLink !== todoLink) { - return window.open(targetLink, '_blank'); + + if (selected.tagName === 'IMG') { + const avatarUrl = selected.parentElement.getAttribute('href'); + return window.open(avatarUrl, windowTarget); } else { - return window.open(todoLink, '_blank'); + return window.open(todoLink, windowTarget); } } else { return gl.utils.visitUrl(todoLink); diff --git a/changelogs/unreleased/27922-cmd-click-todo-doesn-t-work.yml b/changelogs/unreleased/27922-cmd-click-todo-doesn-t-work.yml new file mode 100644 index 00000000000..79a54429ee8 --- /dev/null +++ b/changelogs/unreleased/27922-cmd-click-todo-doesn-t-work.yml @@ -0,0 +1,5 @@ +--- +title: Fix regression where cmd-click stopped working for todos and merge request + tabs +merge_request: +author: diff --git a/spec/javascripts/merge_request_tabs_spec.js b/spec/javascripts/merge_request_tabs_spec.js index 3810991f104..5b0c124962c 100644 --- a/spec/javascripts/merge_request_tabs_spec.js +++ b/spec/javascripts/merge_request_tabs_spec.js @@ -62,19 +62,47 @@ require('vendor/jquery.scrollTo'); }); }); describe('#opensInNewTab', function () { - var commitsLink; var tabUrl; + var windowTarget = '_blank'; beforeEach(function () { - commitsLink = '.commits-tab li a'; - tabUrl = $(commitsLink).attr('href'); + loadFixtures('merge_requests/merge_request_with_task_list.html.raw'); + + tabUrl = $('.commits-tab a').attr('href'); spyOn($.fn, 'attr').and.returnValue(tabUrl); }); + + describe('meta click', () => { + beforeEach(function () { + spyOn(gl.utils, 'isMetaClick').and.returnValue(true); + }); + + it('opens page when commits link is clicked', function () { + spyOn(window, 'open').and.callFake(function (url, name) { + expect(url).toEqual(tabUrl); + expect(name).toEqual(windowTarget); + }); + + this.class.bindEvents(); + document.querySelector('.merge-request-tabs .commits-tab a').click(); + }); + + it('opens page when commits badge is clicked', function () { + spyOn(window, 'open').and.callFake(function (url, name) { + expect(url).toEqual(tabUrl); + expect(name).toEqual(windowTarget); + }); + + this.class.bindEvents(); + document.querySelector('.merge-request-tabs .commits-tab a .badge').click(); + }); + }); + it('opens page tab in a new browser tab with Ctrl+Click - Windows/Linux', function () { spyOn(window, 'open').and.callFake(function (url, name) { expect(url).toEqual(tabUrl); - expect(name).toEqual('_blank'); + expect(name).toEqual(windowTarget); }); this.class.clickTab({ @@ -87,7 +115,7 @@ require('vendor/jquery.scrollTo'); it('opens page tab in a new browser tab with Cmd+Click - Mac', function () { spyOn(window, 'open').and.callFake(function (url, name) { expect(url).toEqual(tabUrl); - expect(name).toEqual('_blank'); + expect(name).toEqual(windowTarget); }); this.class.clickTab({ @@ -100,7 +128,7 @@ require('vendor/jquery.scrollTo'); it('opens page tab in a new browser tab with Middle-click - Mac/PC', function () { spyOn(window, 'open').and.callFake(function (url, name) { expect(url).toEqual(tabUrl); - expect(name).toEqual('_blank'); + expect(name).toEqual(windowTarget); }); this.class.clickTab({ diff --git a/spec/javascripts/todos_spec.js b/spec/javascripts/todos_spec.js new file mode 100644 index 00000000000..66e4fbd6304 --- /dev/null +++ b/spec/javascripts/todos_spec.js @@ -0,0 +1,63 @@ +require('~/todos'); +require('~/lib/utils/common_utils'); + +describe('Todos', () => { + preloadFixtures('todos/todos.html.raw'); + let todoItem; + + beforeEach(() => { + loadFixtures('todos/todos.html.raw'); + todoItem = document.querySelector('.todos-list .todo'); + + return new gl.Todos(); + }); + + describe('goToTodoUrl', () => { + it('opens the todo url', (done) => { + const todoLink = todoItem.dataset.url; + + spyOn(gl.utils, 'visitUrl').and.callFake((url) => { + expect(url).toEqual(todoLink); + done(); + }); + + todoItem.click(); + }); + + describe('meta click', () => { + let visitUrlSpy; + + beforeEach(() => { + spyOn(gl.utils, 'isMetaClick').and.returnValue(true); + visitUrlSpy = spyOn(gl.utils, 'visitUrl').and.callFake(() => {}); + }); + + it('opens the todo url in another tab', (done) => { + const todoLink = todoItem.dataset.url; + + spyOn(window, 'open').and.callFake((url, target) => { + expect(todoLink).toEqual(url); + expect(target).toEqual('_blank'); + done(); + }); + + todoItem.click(); + expect(visitUrlSpy).not.toHaveBeenCalled(); + }); + + it('opens the avatar\'s url in another tab when the avatar is clicked', (done) => { + const avatarImage = todoItem.querySelector('img'); + const avatarUrl = avatarImage.parentElement.getAttribute('href'); + + spyOn(window, 'open').and.callFake((url, target) => { + expect(avatarUrl).toEqual(url); + expect(target).toEqual('_blank'); + done(); + }); + + avatarImage.click(); + expect(visitUrlSpy).not.toHaveBeenCalled(); + }); + }); + }); +}); From 79ef221e4e4998809a3fa1ac888c39868baa589e Mon Sep 17 00:00:00 2001 From: Alfredo Sumaran Date: Wed, 15 Feb 2017 12:55:41 -0500 Subject: [PATCH 231/313] Fix Rubocop offense --- spec/views/projects/_home_panel.html.haml_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb index 5af57cdf3b7..f5381a48207 100644 --- a/spec/views/projects/_home_panel.html.haml_spec.rb +++ b/spec/views/projects/_home_panel.html.haml_spec.rb @@ -4,7 +4,7 @@ describe 'projects/_home_panel', :view do let(:project) { create(:empty_project, :public) } let(:notification_settings) do - user.notification_settings_for(project) if user + user&.notification_settings_for(project) end before do From a89e9736266cbf9ccde3a49eccd8ab04f72bf38f Mon Sep 17 00:00:00 2001 From: Semyon Pupkov Date: Sat, 11 Feb 2017 22:30:15 +0500 Subject: [PATCH 232/313] Set `Auto-Submitted: auto-generated` header to emails Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/20305 --- changelogs/unreleased/add-auto-submited-header.yml | 4 ++++ .../initializers/additional_headers_interceptor.rb | 1 + lib/additional_email_headers_interceptor.rb | 8 ++++++++ .../lib/additional_email_headers_interceptor_spec.rb | 12 ++++++++++++ 4 files changed, 25 insertions(+) create mode 100644 changelogs/unreleased/add-auto-submited-header.yml create mode 100644 config/initializers/additional_headers_interceptor.rb create mode 100644 lib/additional_email_headers_interceptor.rb create mode 100644 spec/lib/additional_email_headers_interceptor_spec.rb diff --git a/changelogs/unreleased/add-auto-submited-header.yml b/changelogs/unreleased/add-auto-submited-header.yml new file mode 100644 index 00000000000..93481613b39 --- /dev/null +++ b/changelogs/unreleased/add-auto-submited-header.yml @@ -0,0 +1,4 @@ +--- +title: Set Auto-Submitted header to mails +merge_request: +author: Semyon Pupkov diff --git a/config/initializers/additional_headers_interceptor.rb b/config/initializers/additional_headers_interceptor.rb new file mode 100644 index 00000000000..b9159e7c06c --- /dev/null +++ b/config/initializers/additional_headers_interceptor.rb @@ -0,0 +1 @@ +ActionMailer::Base.register_interceptor(AdditionalEmailHeadersInterceptor) diff --git a/lib/additional_email_headers_interceptor.rb b/lib/additional_email_headers_interceptor.rb new file mode 100644 index 00000000000..2358fa6bbfd --- /dev/null +++ b/lib/additional_email_headers_interceptor.rb @@ -0,0 +1,8 @@ +class AdditionalEmailHeadersInterceptor + def self.delivering_email(message) + message.headers( + 'Auto-Submitted' => 'auto-generated', + 'X-Auto-Response-Suppress' => 'All' + ) + end +end diff --git a/spec/lib/additional_email_headers_interceptor_spec.rb b/spec/lib/additional_email_headers_interceptor_spec.rb new file mode 100644 index 00000000000..580450eef1e --- /dev/null +++ b/spec/lib/additional_email_headers_interceptor_spec.rb @@ -0,0 +1,12 @@ +require 'spec_helper' + +describe AdditionalEmailHeadersInterceptor do + it 'adds Auto-Submitted header' do + mail = ActionMailer::Base.mail(to: 'test@mail.com', from: 'info@mail.com', body: 'hello').deliver + + expect(mail.header['To'].value).to eq('test@mail.com') + expect(mail.header['From'].value).to eq('info@mail.com') + expect(mail.header['Auto-Submitted'].value).to eq('auto-generated') + expect(mail.header['X-Auto-Response-Suppress'].value).to eq('All') + end +end From f2ed14458c539e3c8276799620c4e6a29a500f76 Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Wed, 15 Feb 2017 19:27:40 +0100 Subject: [PATCH 233/313] Fix most of broken docs links [ci skip] --- doc/administration/build_artifacts.md | 2 +- doc/administration/pages/index.md | 8 ++--- doc/administration/pages/source.md | 6 ++-- doc/ci/build_artifacts/README.md | 2 +- doc/ci/pipelines.md | 3 +- doc/ci/runners/README.md | 19 ++++++------ doc/update/7.0-to-7.1.md | 2 ++ doc/update/7.1-to-7.2.md | 2 ++ doc/update/7.10-to-7.11.md | 4 ++- doc/update/7.11-to-7.12.md | 4 ++- doc/update/7.12-to-7.13.md | 4 ++- doc/update/7.13-to-7.14.md | 4 ++- doc/update/7.14-to-8.0.md | 4 ++- doc/update/7.2-to-7.3.md | 2 ++ doc/update/7.3-to-7.4.md | 7 ++--- doc/update/7.4-to-7.5.md | 8 +++-- doc/update/7.5-to-7.6.md | 13 +++++--- doc/update/7.6-to-7.7.md | 15 ++++++--- doc/update/7.7-to-7.8.md | 13 +++++--- doc/update/7.8-to-7.9.md | 13 +++++--- doc/update/7.9-to-7.10.md | 13 +++++--- doc/update/8.0-to-8.1.md | 4 ++- doc/update/8.1-to-8.2.md | 4 ++- doc/update/8.10-to-8.11.md | 4 ++- doc/update/8.11-to-8.12.md | 4 ++- doc/update/8.12-to-8.13.md | 4 ++- doc/update/8.13-to-8.14.md | 4 ++- doc/update/8.14-to-8.15.md | 4 ++- doc/update/8.15-to-8.16.md | 4 ++- doc/update/8.16-to-8.17.md | 4 ++- doc/update/8.2-to-8.3.md | 4 ++- doc/update/8.3-to-8.4.md | 6 ++-- doc/update/8.4-to-8.5.md | 6 ++-- doc/update/8.5-to-8.6.md | 4 ++- doc/update/8.6-to-8.7.md | 4 ++- doc/update/8.7-to-8.8.md | 4 ++- doc/update/8.8-to-8.9.md | 4 ++- doc/update/8.9-to-8.10.md | 4 ++- doc/user/account/security.md | 2 +- doc/user/markdown.md | 31 +++---------------- doc/user/project/merge_requests/index.md | 2 +- doc/user/project/pages/index.md | 24 +++++++------- .../importing/import_projects_from_github.md | 4 +-- 43 files changed, 169 insertions(+), 114 deletions(-) diff --git a/doc/administration/build_artifacts.md b/doc/administration/build_artifacts.md index 5a892a35fcc..623a5321f32 100644 --- a/doc/administration/build_artifacts.md +++ b/doc/administration/build_artifacts.md @@ -1 +1 @@ -This document was moved to [jobs_artifacts](jobs_artifacts.md). +This document was moved to [job_artifacts](job_artifacts.md). diff --git a/doc/administration/pages/index.md b/doc/administration/pages/index.md index c352caf1115..19316458d49 100644 --- a/doc/administration/pages/index.md +++ b/doc/administration/pages/index.md @@ -54,7 +54,7 @@ Before proceeding with the Pages configuration, you will need to: 1. Configure a **wildcard DNS record**. 1. (Optional) Have a **wildcard certificate** for that domain if you decide to serve Pages under HTTPS. -1. (Optional but recommended) Enable [Shared runners](../ci/runners/README.md) +1. (Optional but recommended) Enable [Shared runners](../../ci/runners/README.md) so that your users don't have to bring their own. ### DNS configuration @@ -236,7 +236,7 @@ latest previous version. [8-3-docs]: https://gitlab.com/gitlab-org/gitlab-ee/blob/8-3-stable-ee/doc/pages/administration.md [8-5-docs]: https://gitlab.com/gitlab-org/gitlab-ee/blob/8-5-stable-ee/doc/pages/administration.md [8-17-docs]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-17-stable-ce/doc/administration/pages/index.md -[backup]: ../raketasks/backup_restore.md +[backup]: ../../raketasks/backup_restore.md [ce-14605]: https://gitlab.com/gitlab-org/gitlab-ce/issues/14605 [ee-80]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/80 [ee-173]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/173 @@ -244,6 +244,6 @@ latest previous version. [NGINX configs]: https://gitlab.com/gitlab-org/gitlab-ee/tree/8-5-stable-ee/lib/support/nginx [pages-readme]: https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md [pages-userguide]: ../../user/project/pages/index.md -[reconfigure]: ../administration/restart_gitlab.md#omnibus-gitlab-reconfigure -[restart]: ../administration/restart_gitlab.md#installations-from-source +[reconfigure]: ../restart_gitlab.md#omnibus-gitlab-reconfigure +[restart]: ../restart_gitlab.md#installations-from-source [gitlab-pages]: https://gitlab.com/gitlab-org/gitlab-pages/tree/v0.2.4 diff --git a/doc/administration/pages/source.md b/doc/administration/pages/source.md index d4468b99992..0718c05a6f4 100644 --- a/doc/administration/pages/source.md +++ b/doc/administration/pages/source.md @@ -311,13 +311,13 @@ Pages are part of the [regular backup][backup] so there is nothing to configure. You should strongly consider running GitLab pages under a different hostname than GitLab to prevent XSS attacks. -[backup]: ../raketasks/backup_restore.md +[backup]: ../../raketasks/backup_restore.md [ee-80]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/80 [ee-173]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/173 [gitlab pages daemon]: https://gitlab.com/gitlab-org/gitlab-pages [NGINX configs]: https://gitlab.com/gitlab-org/gitlab-ee/tree/8-5-stable-ee/lib/support/nginx [pages-readme]: https://gitlab.com/gitlab-org/gitlab-pages/blob/master/README.md [pages-userguide]: ../../user/project/pages/index.md -[reconfigure]: ../administration/restart_gitlab.md#omnibus-gitlab-reconfigure -[restart]: ../administration/restart_gitlab.md#installations-from-source +[reconfigure]: ../restart_gitlab.md#omnibus-gitlab-reconfigure +[restart]: ../restart_gitlab.md#installations-from-source [gitlab-pages]: https://gitlab.com/gitlab-org/gitlab-pages/tree/v0.2.4 diff --git a/doc/ci/build_artifacts/README.md b/doc/ci/build_artifacts/README.md index e7692b8b9a2..22b3872025f 100644 --- a/doc/ci/build_artifacts/README.md +++ b/doc/ci/build_artifacts/README.md @@ -1 +1 @@ -This document was moved to [user/project/job_artifacts.md](../../user/project/job_artifacts.md). +This document was moved to [pipelines/job_artifacts.md](../../user/project/pipelines/job_artifacts.md). diff --git a/doc/ci/pipelines.md b/doc/ci/pipelines.md index 3134405e10b..9d294240d9d 100644 --- a/doc/ci/pipelines.md +++ b/doc/ci/pipelines.md @@ -21,7 +21,7 @@ There are three types of pipelines that often use the single shorthand of "pipel 1. **CI Pipeline**: Build and test stages defined in `.gitlab-ci.yml` 2. **Deploy Pipeline**: Deploy stage(s) defined in `.gitlab-ci.yml` The flow of deploying code to servers through various stages: e.g. development to staging to production -3. **Project Pipeline**: Cross-project CI dependencies [triggered via API]((triggers)), particularly for micro-services, but also for complicated build dependencies: e.g. api -> front-end, ce/ee -> omnibus. +3. **Project Pipeline**: Cross-project CI dependencies [triggered via API][triggers], particularly for micro-services, but also for complicated build dependencies: e.g. api -> front-end, ce/ee -> omnibus. ## Development Workflows @@ -99,3 +99,4 @@ respective link in the [Pipelines settings] page. [stages]: yaml/README.md#stages [runners]: runners/README.html [pipelines settings]: ../user/project/pipelines/settings.md +[triggers]: triggers/README.md diff --git a/doc/ci/runners/README.md b/doc/ci/runners/README.md index e15b6891334..1bd1ee93ac5 100644 --- a/doc/ci/runners/README.md +++ b/doc/ci/runners/README.md @@ -8,14 +8,13 @@ A Runner can be specific to a certain project or serve any project in GitLab CI. A Runner that serves all projects is called a shared Runner. Ideally, GitLab Runner should not be installed on the same machine as GitLab. -Read the [requirements documentation](../../install/requirements.md#gitlab-Runner) +Read the [requirements documentation](../../install/requirements.md#gitlab-runner) for more information. ## Shared vs. Specific Runners A Runner that is specific only runs for the specified project. A shared Runner -can run jobs for every project that has enabled the option -`Allow shared Runners`. +can run jobs for every project that has enabled the option **Allow shared Runners**. **Shared Runners** are useful for jobs that have similar requirements, between multiple projects. Rather than having multiple Runners idling for @@ -44,7 +43,7 @@ A fork does copy the CI settings (jobs, allow shared, etc) of the cloned reposit There are several ways to create a Runner. Only after creation, upon registration its status as Shared or Specific is determined. -[See the documentation for](https://gitlab.com/gitlab-org/gitlab-ci-multi-Runner/#installation) +[See the documentation for](https://docs.gitlab.com/runner/install) the different methods of installing a Runner instance. After installing the Runner, you can either register it as `Shared` or as `Specific`. @@ -55,19 +54,19 @@ You can only register a Shared Runner if you have admin access to the GitLab ins You can only register a shared Runner if you are an admin on the linked GitLab instance. -Grab the shared-Runner token on the `admin/Runners` page of your GitLab CI +Grab the shared-Runner token on the `admin/runners` page of your GitLab CI instance. -![shared token](shared_Runner.png) +![shared token](shared_runner.png) Now simply register the Runner as any Runner: ``` -sudo gitlab-ci-multi-Runner register +sudo gitlab-ci-multi-runner register ``` Shared Runners are enabled by default as of GitLab 8.2, but can be disabled with the -`DISABLE SHARED RunnerS` button. Previous versions of GitLab defaulted shared Runners to +`DISABLE SHARED RUNNERS` button. Previous versions of GitLab defaulted shared Runners to disabled. ## Registering a Specific Runner @@ -93,7 +92,7 @@ setup a specific Runner for this project. To register the Runner, run the command below and follow instructions: ``` -sudo gitlab-ci-multi-Runner register +sudo gitlab-ci-multi-runner register ``` ### Lock a specific Runner from being enabled for other projects @@ -108,7 +107,7 @@ If you are an admin on your GitLab instance, you can make any shared Runner a specific Runner, _but you can not make a specific Runner a shared Runner_. -To make a shared Runner specific, go to the Runner page (`/admin/Runners`) +To make a shared Runner specific, go to the Runner page (`/admin/runners`) and find your Runner. Add any projects on the left to make this Runner run exclusively for these projects, therefore making it a specific Runner. diff --git a/doc/update/7.0-to-7.1.md b/doc/update/7.0-to-7.1.md index c717affebd3..2e9457aa142 100644 --- a/doc/update/7.0-to-7.1.md +++ b/doc/update/7.0-to-7.1.md @@ -136,3 +136,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-1-stable/config/gitlab.yml.example diff --git a/doc/update/7.1-to-7.2.md b/doc/update/7.1-to-7.2.md index d01f8528e14..e5045b5570f 100644 --- a/doc/update/7.1-to-7.2.md +++ b/doc/update/7.1-to-7.2.md @@ -135,3 +135,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-2-stable/config/gitlab.yml.example diff --git a/doc/update/7.10-to-7.11.md b/doc/update/7.10-to-7.11.md index 79bc6de1e46..89213ba7178 100644 --- a/doc/update/7.10-to-7.11.md +++ b/doc/update/7.10-to-7.11.md @@ -65,7 +65,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-10-stable:config/gitlab.yml.example origin/7-11-stable:config/gitlab.yml.example @@ -101,3 +101,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-11-stable/config/gitlab.yml.example diff --git a/doc/update/7.11-to-7.12.md b/doc/update/7.11-to-7.12.md index cc14a135926..3865186918c 100644 --- a/doc/update/7.11-to-7.12.md +++ b/doc/update/7.11-to-7.12.md @@ -91,7 +91,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-11-stable:config/gitlab.yml.example origin/7-12-stable:config/gitlab.yml.example @@ -127,3 +127,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-12-stable/config/gitlab.yml.example diff --git a/doc/update/7.12-to-7.13.md b/doc/update/7.12-to-7.13.md index 57ebe3261b6..4c8d8f1f741 100644 --- a/doc/update/7.12-to-7.13.md +++ b/doc/update/7.12-to-7.13.md @@ -91,7 +91,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-12-stable:config/gitlab.yml.example origin/7-13-stable:config/gitlab.yml.example @@ -127,3 +127,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-13-stable/config/gitlab.yml.example diff --git a/doc/update/7.13-to-7.14.md b/doc/update/7.13-to-7.14.md index 6dd9727fb49..934898da5a1 100644 --- a/doc/update/7.13-to-7.14.md +++ b/doc/update/7.13-to-7.14.md @@ -91,7 +91,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-13-stable:config/gitlab.yml.example origin/7-14-stable:config/gitlab.yml.example @@ -127,3 +127,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-14-stable/config/gitlab.yml.example diff --git a/doc/update/7.14-to-8.0.md b/doc/update/7.14-to-8.0.md index 117e2afaaa0..25fa6d93f06 100644 --- a/doc/update/7.14-to-8.0.md +++ b/doc/update/7.14-to-8.0.md @@ -143,7 +143,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/7-14-stable:config/gitlab.yml.example origin/8-0-stable:config/gitlab.yml.example @@ -227,3 +227,5 @@ this is likely due to an outdated Nginx or Apache configuration, or a missing or misconfigured `gitlab-git-http-server` instance. Double-check that you correctly completed [Step 5](#5-install-gitlab-git-http-server) to install the daemon and [Step 8](#new-nginx-configuration) to reconfigure Nginx. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-0-stable/config/gitlab.yml.example diff --git a/doc/update/7.2-to-7.3.md b/doc/update/7.2-to-7.3.md index 0e91e682175..d3391ddd225 100644 --- a/doc/update/7.2-to-7.3.md +++ b/doc/update/7.2-to-7.3.md @@ -143,3 +143,5 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-3-stable/config/gitlab.yml.example diff --git a/doc/update/7.3-to-7.4.md b/doc/update/7.3-to-7.4.md index 4df9127dd5f..6d632dc3c8e 100644 --- a/doc/update/7.3-to-7.4.md +++ b/doc/update/7.3-to-7.4.md @@ -75,7 +75,7 @@ sudo -u git -H editor config/unicorn.rb #### MySQL Databases: Update database.yml config file -* Add `collation: utf8_general_ci` to `config/database.yml` as seen in [config/database.yml.mysql](/config/database.yml.mysql) +* Add `collation: utf8_general_ci` to `config/database.yml` as seen in [config/database.yml.mysql][mysql]: ``` sudo -u git -H editor config/database.yml @@ -192,6 +192,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. - - - +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-4-stable/config/gitlab.yml.example +[mysql]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-4-stable/config/database.yml.mysql diff --git a/doc/update/7.4-to-7.5.md b/doc/update/7.4-to-7.5.md index 673eab3c56e..ec50706d421 100644 --- a/doc/update/7.4-to-7.5.md +++ b/doc/update/7.4-to-7.5.md @@ -73,8 +73,8 @@ git diff origin/7-4-stable:config/gitlab.yml.example origin/7-5-stable:config/gi #### Change Nginx settings -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your setting +* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`][nginx] but with your settings +* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`][nginx-ssl] but with your setting ### 6. Start application @@ -106,3 +106,7 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-5-stable/config/gitlab.yml.example +[nginx]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-5-stable/lib/support/nginx/gitlab +[nginx-ssl]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-5-stable/lib/support/nginx/gitlab-ssl diff --git a/doc/update/7.5-to-7.6.md b/doc/update/7.5-to-7.6.md index 35cd437fdc4..331f5de080e 100644 --- a/doc/update/7.5-to-7.6.md +++ b/doc/update/7.5-to-7.6.md @@ -67,7 +67,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-5-stable:config/gitlab.yml.example origin/7-6-stable:config/gitlab.yml.example @@ -75,12 +75,12 @@ git diff origin/7-5-stable:config/gitlab.yml.example origin/7-6-stable:config/gi #### Change Nginx settings -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your setting +* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`][nginx] but with your settings +* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`][nginx-ssl] but with your setting #### Setup time zone (optional) -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. +Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`][app] (unlikely), unset it. ### 6. Start application @@ -112,3 +112,8 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-6-stable/config/gitlab.yml.example +[app]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-6-stable/config/application.rb +[nginx]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-6-stable/lib/support/nginx/gitlab +[nginx-ssl]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-6-stable/lib/support/nginx/gitlab-ssl diff --git a/doc/update/7.6-to-7.7.md b/doc/update/7.6-to-7.7.md index 910c7dcdd3c..918b10fbd95 100644 --- a/doc/update/7.6-to-7.7.md +++ b/doc/update/7.6-to-7.7.md @@ -67,7 +67,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](/config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-6-stable:config/gitlab.yml.example origin/7-7-stable:config/gitlab.yml.example @@ -75,12 +75,12 @@ git diff origin/7-6-stable:config/gitlab.yml.example origin/7-7-stable:config/gi #### Change Nginx settings -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your setting +* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`][nginx] but with your settings +* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`][nginx-ssl] but with your setting #### Setup time zone (optional) -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. +Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`][app] (unlikely), unset it. ### 6. Start application @@ -101,7 +101,7 @@ 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 +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) @@ -117,3 +117,8 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-7-stable/config/gitlab.yml.example +[app]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-7-stable/config/application.rb +[nginx]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-7-stable/lib/support/nginx/gitlab +[nginx-ssl]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-7-stable/lib/support/nginx/gitlab-ssl diff --git a/doc/update/7.7-to-7.8.md b/doc/update/7.7-to-7.8.md index 46ca163c1bb..84e0464a824 100644 --- a/doc/update/7.7-to-7.8.md +++ b/doc/update/7.7-to-7.8.md @@ -67,7 +67,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-7-stable:config/gitlab.yml.example origin/7-8-stable:config/gitlab.yml.example @@ -75,13 +75,13 @@ git diff origin/7-7-stable:config/gitlab.yml.example origin/7-8-stable:config/gi #### Change Nginx settings -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your settings. +* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`][nginx] but with your settings. +* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`][nginx-ssl] but with your settings. * A new `location /uploads/` section has been added that needs to have the same content as the existing `location @gitlab` section. #### Setup time zone (optional) -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. +Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`][app] (unlikely), unset it. ### 6. Start application @@ -118,3 +118,8 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-8-stable/config/gitlab.yml.example +[app]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-8-stable/config/application.rb +[nginx]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-8-stable/lib/support/nginx/gitlab +[nginx-ssl]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-8-stable/lib/support/nginx/gitlab-ssl diff --git a/doc/update/7.8-to-7.9.md b/doc/update/7.8-to-7.9.md index 6ffa21c6141..b0dc2ba1dbb 100644 --- a/doc/update/7.8-to-7.9.md +++ b/doc/update/7.8-to-7.9.md @@ -69,7 +69,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-8-stable:config/gitlab.yml.example origin/7-9-stable:config/gitlab.yml.example @@ -77,13 +77,13 @@ git diff origin/7-8-stable:config/gitlab.yml.example origin/7-9-stable:config/gi #### Change Nginx settings -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your settings. +* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`][nginx] but with your settings. +* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`][nginx-ssl] but with your settings. * A new `location /uploads/` section has been added that needs to have the same content as the existing `location @gitlab` section. #### Setup time zone (optional) -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. +Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`][app] (unlikely), unset it. ### 6. Start application @@ -120,3 +120,8 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-9-stable/config/gitlab.yml.example +[app]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-9-stable/config/application.rb +[nginx]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-9-stable/lib/support/nginx/gitlab +[nginx-ssl]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-9-stable/lib/support/nginx/gitlab-ssl diff --git a/doc/update/7.9-to-7.10.md b/doc/update/7.9-to-7.10.md index d1179dc2ec7..8f7f84b41ba 100644 --- a/doc/update/7.9-to-7.10.md +++ b/doc/update/7.9-to-7.10.md @@ -65,7 +65,7 @@ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them to your current `gitlab.yml`. +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them to your current `gitlab.yml`. ``` git diff origin/7-9-stable:config/gitlab.yml.example origin/7-10-stable:config/gitlab.yml.example @@ -73,13 +73,13 @@ git diff origin/7-9-stable:config/gitlab.yml.example origin/7-10-stable:config/g #### Change Nginx settings -* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`](/lib/support/nginx/gitlab) but with your settings. -* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`](/lib/support/nginx/gitlab-ssl) but with your settings. +* HTTP setups: Make `/etc/nginx/sites-available/gitlab` the same as [`lib/support/nginx/gitlab`][nginx] but with your settings. +* HTTPS setups: Make `/etc/nginx/sites-available/gitlab-ssl` the same as [`lib/support/nginx/gitlab-ssl`][nginx-ssl] but with your settings. * A new `location /uploads/` section has been added that needs to have the same content as the existing `location @gitlab` section. #### Setup time zone (optional) -Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`](config/application.rb) (unlikely), unset it. +Consider setting the time zone in `gitlab.yml` otherwise GitLab will default to UTC. If you set a time zone previously in [`application.rb`][app] (unlikely), unset it. ### 6. Start application @@ -116,3 +116,8 @@ cd /home/git/gitlab sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup *.tar file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-10-stable/config/gitlab.yml.example +[app]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-10-stable/config/application.rb +[nginx]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-10-stable/lib/support/nginx/gitlab +[nginx-ssl]: https://gitlab.com/gitlab-org/gitlab-ce/blob/7-10-stable/lib/support/nginx/gitlab-ssl diff --git a/doc/update/8.0-to-8.1.md b/doc/update/8.0-to-8.1.md index bfb83cf79b1..6ee0c0656ee 100644 --- a/doc/update/8.0-to-8.1.md +++ b/doc/update/8.0-to-8.1.md @@ -108,7 +108,7 @@ For Ubuntu 16.04.1 LTS: #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-0-stable:config/gitlab.yml.example origin/8-1-stable:config/gitlab.yml.example @@ -173,3 +173,5 @@ If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of ### "You appear to have cloned an empty repository." See the [7.14 to 8.0 update guide](7.14-to-8.0.md#troubleshooting). + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-1-stable/config/gitlab.yml.example diff --git a/doc/update/8.1-to-8.2.md b/doc/update/8.1-to-8.2.md index 7f36ce00e96..4c9ff5c5c0a 100644 --- a/doc/update/8.1-to-8.2.md +++ b/doc/update/8.1-to-8.2.md @@ -125,7 +125,7 @@ For Ubuntu 16.04.1 LTS: #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-1-stable:config/gitlab.yml.example origin/8-2-stable:config/gitlab.yml.example @@ -190,3 +190,5 @@ If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of ### "You appear to have cloned an empty repository." See the [7.14 to 8.0 update guide](7.14-to-8.0.md#troubleshooting). + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-2-stable/config/gitlab.yml.example diff --git a/doc/update/8.10-to-8.11.md b/doc/update/8.10-to-8.11.md index 119c5f475e4..e5e3cd395df 100644 --- a/doc/update/8.10-to-8.11.md +++ b/doc/update/8.10-to-8.11.md @@ -114,7 +114,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-10-stable:config/gitlab.yml.example origin/8-11-stable:config/gitlab.yml.example @@ -195,3 +195,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-11-stable/config/gitlab.yml.example diff --git a/doc/update/8.11-to-8.12.md b/doc/update/8.11-to-8.12.md index cddfa7e3e01..d6b3b0ffa5a 100644 --- a/doc/update/8.11-to-8.12.md +++ b/doc/update/8.11-to-8.12.md @@ -113,7 +113,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-11-stable:config/gitlab.yml.example origin/8-12-stable:config/gitlab.yml.example @@ -203,3 +203,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-12-stable/config/gitlab.yml.example diff --git a/doc/update/8.12-to-8.13.md b/doc/update/8.12-to-8.13.md index 8c0d3f78b55..75956aeb360 100644 --- a/doc/update/8.12-to-8.13.md +++ b/doc/update/8.12-to-8.13.md @@ -113,7 +113,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-12-stable:config/gitlab.yml.example origin/8-13-stable:config/gitlab.yml.example @@ -203,3 +203,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-13-stable/config/gitlab.yml.example diff --git a/doc/update/8.13-to-8.14.md b/doc/update/8.13-to-8.14.md index c64d3407461..327ecb7cdc2 100644 --- a/doc/update/8.13-to-8.14.md +++ b/doc/update/8.13-to-8.14.md @@ -113,7 +113,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-13-stable:config/gitlab.yml.example origin/8-14-stable:config/gitlab.yml.example @@ -203,3 +203,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-14-stable/config/gitlab.yml.example diff --git a/doc/update/8.14-to-8.15.md b/doc/update/8.14-to-8.15.md index b1e3b116548..a68fe3bb605 100644 --- a/doc/update/8.14-to-8.15.md +++ b/doc/update/8.14-to-8.15.md @@ -122,7 +122,7 @@ sudo -u git -H git checkout v4.1.1 #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh cd /home/git/gitlab @@ -235,3 +235,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-15-stable/config/gitlab.yml.example diff --git a/doc/update/8.15-to-8.16.md b/doc/update/8.15-to-8.16.md index 2695a16ac0b..9f8f0f714d4 100644 --- a/doc/update/8.15-to-8.16.md +++ b/doc/update/8.15-to-8.16.md @@ -124,7 +124,7 @@ sudo -u git -H git checkout v4.1.1 #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh cd /home/git/gitlab @@ -237,3 +237,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-16-stable/config/gitlab.yml.example diff --git a/doc/update/8.16-to-8.17.md b/doc/update/8.16-to-8.17.md index 1808232c59a..53c2bc560e8 100644 --- a/doc/update/8.16-to-8.17.md +++ b/doc/update/8.16-to-8.17.md @@ -124,7 +124,7 @@ sudo -u git -H git checkout v4.1.1 #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh cd /home/git/gitlab @@ -237,3 +237,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-17-stable/config/gitlab.yml.example diff --git a/doc/update/8.2-to-8.3.md b/doc/update/8.2-to-8.3.md index dd3fdafd8d1..f28896c2227 100644 --- a/doc/update/8.2-to-8.3.md +++ b/doc/update/8.2-to-8.3.md @@ -114,7 +114,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-2-stable:config/gitlab.yml.example origin/8-3-stable:config/gitlab.yml.example @@ -211,3 +211,5 @@ If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of ### "You appear to have cloned an empty repository." See the [7.14 to 8.0 update guide](7.14-to-8.0.md#troubleshooting). + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-3-stable/config/gitlab.yml.example diff --git a/doc/update/8.3-to-8.4.md b/doc/update/8.3-to-8.4.md index e62d894609a..8b89455ca87 100644 --- a/doc/update/8.3-to-8.4.md +++ b/doc/update/8.3-to-8.4.md @@ -84,7 +84,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-3-stable:config/gitlab.yml.example origin/8-4-stable:config/gitlab.yml.example @@ -98,7 +98,7 @@ We updated the init script for GitLab in order to set a specific PATH for gitlab cd /home/git/gitlab sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab ``` - + For Ubuntu 16.04.1 LTS: sudo systemctl daemon-reload @@ -135,3 +135,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-4-stable/config/gitlab.yml.example diff --git a/doc/update/8.4-to-8.5.md b/doc/update/8.4-to-8.5.md index 678cc69d773..0eedfaee2db 100644 --- a/doc/update/8.4-to-8.5.md +++ b/doc/update/8.4-to-8.5.md @@ -88,7 +88,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-4-stable:config/gitlab.yml.example origin/8-5-stable:config/gitlab.yml.example @@ -119,7 +119,7 @@ via [/etc/default/gitlab]. Ensure you're still up-to-date with the latest init script changes: sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab - + For Ubuntu 16.04.1 LTS: sudo systemctl daemon-reload @@ -156,3 +156,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-5-stable/config/gitlab.yml.example diff --git a/doc/update/8.5-to-8.6.md b/doc/update/8.5-to-8.6.md index a76346516b9..851056161bb 100644 --- a/doc/update/8.5-to-8.6.md +++ b/doc/update/8.5-to-8.6.md @@ -107,7 +107,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-5-stable:config/gitlab.yml.example origin/8-6-stable:config/gitlab.yml.example @@ -175,3 +175,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-6-stable/config/gitlab.yml.example diff --git a/doc/update/8.6-to-8.7.md b/doc/update/8.6-to-8.7.md index 05ef4e61759..34c727260aa 100644 --- a/doc/update/8.6-to-8.7.md +++ b/doc/update/8.6-to-8.7.md @@ -88,7 +88,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-6-stable:config/gitlab.yml.example origin/8-7-stable:config/gitlab.yml.example @@ -164,3 +164,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-7-stable/config/gitlab.yml.example diff --git a/doc/update/8.7-to-8.8.md b/doc/update/8.7-to-8.8.md index 8ce434e5f78..6feeb1919de 100644 --- a/doc/update/8.7-to-8.8.md +++ b/doc/update/8.7-to-8.8.md @@ -88,7 +88,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-7-stable:config/gitlab.yml.example origin/8-8-stable:config/gitlab.yml.example @@ -164,3 +164,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-8-stable/config/gitlab.yml.example diff --git a/doc/update/8.8-to-8.9.md b/doc/update/8.8-to-8.9.md index aa077316bbe..61cdf8854d4 100644 --- a/doc/update/8.8-to-8.9.md +++ b/doc/update/8.8-to-8.9.md @@ -104,7 +104,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-8-stable:config/gitlab.yml.example origin/8-9-stable:config/gitlab.yml.example @@ -193,3 +193,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-9-stable/config/gitlab.yml.example diff --git a/doc/update/8.9-to-8.10.md b/doc/update/8.9-to-8.10.md index bb2c79fbb84..d6b2f11d49a 100644 --- a/doc/update/8.9-to-8.10.md +++ b/doc/update/8.9-to-8.10.md @@ -104,7 +104,7 @@ sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS #### New configuration options for `gitlab.yml` -There are new configuration options available for [`gitlab.yml`](config/gitlab.yml.example). View them with the command below and apply them manually to your current `gitlab.yml`: +There are new configuration options available for [`gitlab.yml`][yaml]. View them with the command below and apply them manually to your current `gitlab.yml`: ```sh git diff origin/8-9-stable:config/gitlab.yml.example origin/8-10-stable:config/gitlab.yml.example @@ -193,3 +193,5 @@ sudo -u git -H bundle exec rake gitlab:backup:restore RAILS_ENV=production ``` If you have more than one backup `*.tar` file(s) please add `BACKUP=timestamp_of_backup` to the command above. + +[yaml]: https://gitlab.com/gitlab-org/gitlab-ce/blob/8-10-stable/config/gitlab.yml.example diff --git a/doc/user/account/security.md b/doc/user/account/security.md index 2459f913583..f4078876fab 100644 --- a/doc/user/account/security.md +++ b/doc/user/account/security.md @@ -1 +1 @@ -This document was moved to [profile](../profile/index.md). +This document was moved to [profile](../profile/account/index.md). diff --git a/doc/user/markdown.md b/doc/user/markdown.md index 699318e2479..c14db17b0e6 100644 --- a/doc/user/markdown.md +++ b/doc/user/markdown.md @@ -524,35 +524,12 @@ There are two ways to create links, inline-style and reference-style. [1]: http://slashdot.org [link text itself]: https://www.reddit.com -[I'm an inline-style link](https://www.google.com) - -[I'm a reference-style link][Arbitrary case-insensitive reference text] - -[I'm a relative reference to a repository file](LICENSE)[^1] - -[I am an absolute reference within the repository](/doc/user/markdown.md) - -[I link to the Milestones page](/../milestones) - -[You can use numbers for reference-style link definitions][1] - -Or leave it empty and use the [link text itself][] - -Some text to show that the reference links can follow later. - -[arbitrary case-insensitive reference text]: https://www.mozilla.org -[1]: http://slashdot.org -[link text itself]: https://www.reddit.com - -**Note** - -Relative links do not allow referencing project files in a wiki page or wiki page in a project file. The reason for this is that, in GitLab, wiki is always a separate git repository. For example: - -`[I'm a reference-style link](style)` - +>**Note:** +Relative links do not allow referencing project files in a wiki page or wiki +page in a project file. The reason for this is that, in GitLab, wiki is always +a separate Git repository. For example, `[I'm a reference-style link](style)` will point the link to `wikis/style` when the link is inside of a wiki markdown file. - ### Images Here's our logo (hover to see the title text): diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md index abd3740ef20..c759b7aaa4a 100644 --- a/doc/user/project/merge_requests/index.md +++ b/doc/user/project/merge_requests/index.md @@ -166,4 +166,4 @@ And to check out a particular merge request: git checkout origin/merge-requests/1 ``` -[protected branches]: protected_branches.md +[protected branches]: ../protected_branches.md diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md index 044c89a03c0..4c4f15aad40 100644 --- a/doc/user/project/pages/index.md +++ b/doc/user/project/pages/index.md @@ -50,13 +50,13 @@ In brief, this is what you need to upload your website in GitLab Pages: (ask your administrator). This is very important, so you should first make sure you get that right. 1. Create a project -1. Push a [`.gitlab-ci.yml` file](../ci/yaml/README.md) in the root directory +1. Push a [`.gitlab-ci.yml` file][yaml] in the root directory of your repository with a specific job named [`pages`][pages] 1. Set up a GitLab Runner to build your website > **Note:** -> If [shared runners](../ci/runners/README.md) are enabled by your GitLab -> administrator, you should be able to use them instead of bringing your own. +If [shared runners](../../../ci/runners/README.md) are enabled by your GitLab +administrator, you should be able to use them instead of bringing your own. ### User or group Pages @@ -89,7 +89,7 @@ GitLab Pages for projects can be created by both user and group accounts. The steps to create a project page for a user or a group are identical: 1. Create a new project -1. Push a [`.gitlab-ci.yml` file](../ci/yaml/README.md) in the root directory +1. Push a [`.gitlab-ci.yml` file][yaml] in the root directory of your repository with a specific job named [`pages`][pages]. 1. Set up a GitLab Runner to build your website @@ -104,8 +104,8 @@ website being built live by following the CI job traces. > **Note:** > Before reading this section, make sure you familiarize yourself with GitLab CI -> and the specific syntax of[`.gitlab-ci.yml`](../ci/yaml/README.md) by -> following our [quick start guide](../ci/quick_start/README.md). +> and the specific syntax of[`.gitlab-ci.yml`][yaml] by +> following our [quick start guide]. To make use of GitLab Pages, the contents of `.gitlab-ci.yml` must follow the rules below: @@ -132,11 +132,11 @@ exit status, it then uploads the `public/` directory to GitLab Pages. The `public/` directory should contain all the static content of your website. Depending on how you plan to publish your website, the steps defined in the -[`script` parameter](../ci/yaml/README.md#script) may differ. +[`script` parameter](../../../ci/yaml/README.md#script) may differ. Be aware that Pages are by default branch/tag agnostic and their deployment relies solely on what you specify in `.gitlab-ci.yml`. If you don't limit the -`pages` job with the [`only` parameter](../ci/yaml/README.md#only-and-except), +`pages` job with the [`only` parameter](../../../ci/yaml/README.md#only-and-except), whenever a new commit is pushed to whatever branch or tag, the Pages will be overwritten. In the example below, we limit the Pages to be deployed whenever a commit is pushed only on the `master` branch: @@ -237,7 +237,7 @@ get you started. Remember that GitLab Pages are by default branch/tag agnostic and their deployment relies solely on what you specify in `.gitlab-ci.yml`. You can limit -the `pages` job with the [`only` parameter](../ci/yaml/README.md#only-and-except), +the `pages` job with the [`only` parameter](../../../ci/yaml/README.md#only-and-except), whenever a new commit is pushed to a branch that will be used specifically for your pages. @@ -426,10 +426,12 @@ For a list of known issues, visit GitLab's [public issue tracker]. [ee-173]: https://gitlab.com/gitlab-org/gitlab-ee/merge_requests/173 [pages-daemon]: https://gitlab.com/gitlab-org/gitlab-pages [gitlab ci]: https://about.gitlab.com/gitlab-ci -[gitlab runner]: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner -[pages]: ../ci/yaml/README.md#pages +[gitlab runner]: https://docs.gitlab.com/runner +[pages]: ../../../ci/yaml/README.md#pages +[yaml]: ../../../ci/yaml/README.md [staticgen]: https://www.staticgen.com/ [pages-jekyll]: https://gitlab.com/pages/jekyll [metarefresh]: https://en.wikipedia.org/wiki/Meta_refresh [public issue tracker]: https://gitlab.com/gitlab-org/gitlab-ee/issues?label_name=Pages [ce-14605]: https://gitlab.com/gitlab-org/gitlab-ce/issues/14605 +[quick start guide]: ../../../ci/quick_start/README.md diff --git a/doc/workflow/importing/import_projects_from_github.md b/doc/workflow/importing/import_projects_from_github.md index cdacef9832f..aece4ab34ba 100644 --- a/doc/workflow/importing/import_projects_from_github.md +++ b/doc/workflow/importing/import_projects_from_github.md @@ -60,8 +60,7 @@ If the [GitHub integration][gh-import] is enabled by your GitLab administrator, you can use it instead of the personal access token. 1. First you may want to connect your GitHub account to GitLab in order for - the username mapping to be correct. Follow the [social sign-in] documentation - on how to do so. + the username mapping to be correct. 1. Once you connect GitHub, click the **List your GitHub repositories** button and you will be redirected to GitHub for permission to access your projects. 1. After accepting, you'll be automatically redirected to the importer. @@ -115,4 +114,3 @@ if you have the privileges to do so. [gh-import]: ../../integration/github.md "GitHub integration" [gh-integration]: #authorize-access-to-your-repositories-using-the-github-integration [gh-token]: #authorize-access-to-your-repositories-using-a-personal-access-token -[social sign-in]: ../../profile/account/social_sign_in.md From a254dcf0edfb6aa4ea93fd0bfdb992565d6e8422 Mon Sep 17 00:00:00 2001 From: "Z.J. van de Weg" Date: Wed, 15 Feb 2017 19:59:30 +0100 Subject: [PATCH 234/313] Add count keys to response JSON --- app/controllers/projects/environments_controller.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 3b7240d8469..fed75396d6e 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -29,9 +29,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController end def folder - @environments = project.environments - .where(environment_type: params[:id]) - .with_state(params[:scope] || :available) + folder_environments = project.environments.where(environment_type: params[:id]) + @environments = folder_environments.with_state(params[:scope] || :available) respond_to do |format| format.html @@ -41,6 +40,8 @@ class Projects::EnvironmentsController < Projects::ApplicationController .new(project: @project, user: @current_user) .with_pagination(request, response) .represent(@environments), + available_count: folder_environments.available.count, + stopped_count: folder_environments.stopped.count } end end From b29f6c5176b699de2f6efb012f9646e0d3243727 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Wed, 15 Feb 2017 16:36:13 +0000 Subject: [PATCH 235/313] Use `page` query parameter instead of `p` to keep consistency with all URLs Fix rubocop error --- .../vue_pipelines_index/pipelines.js.es6 | 4 ++-- .../projects/pipelines/pipelines_spec.rb | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 b/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 index e47dc6935d6..6bc2d6ec312 100644 --- a/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 +++ b/app/assets/javascripts/vue_pipelines_index/pipelines.js.es6 @@ -28,7 +28,7 @@ require('../vue_shared/components/pipelines_table'); }, props: ['scope', 'store', 'svgs'], created() { - const pagenum = gl.utils.getParameterByName('p'); + const pagenum = gl.utils.getParameterByName('page'); const scope = gl.utils.getParameterByName('scope'); if (pagenum) this.pagenum = pagenum; if (scope) this.apiScope = scope; @@ -36,7 +36,7 @@ require('../vue_shared/components/pipelines_table'); }, methods: { change(pagenum, apiScope) { - gl.utils.visitUrl(`?scope=${apiScope}&p=${pagenum}`); + gl.utils.visitUrl(`?scope=${apiScope}&page=${pagenum}`); }, }, template: ` diff --git a/spec/features/projects/pipelines/pipelines_spec.rb b/spec/features/projects/pipelines/pipelines_spec.rb index 6555b2fc6c1..5c896a051a4 100644 --- a/spec/features/projects/pipelines/pipelines_spec.rb +++ b/spec/features/projects/pipelines/pipelines_spec.rb @@ -277,6 +277,28 @@ describe 'Pipelines', :feature, :js do end end end + + context 'with pagination' do + before do + create_list(:ci_empty_pipeline, 40, project: project) + end + + it 'should render pagination' do + visit namespace_project_pipelines_path(project.namespace, project) + wait_for_vue_resource + + expect(page).to have_css('.gl-pagination') + expect(page.find_all('tbody tr').length).to eq(20) + end + + it "should render second page of pipelines" do + visit namespace_project_pipelines_path(project.namespace, project, page: '2') + wait_for_vue_resource + + expect(page).to have_css('.gl-pagination') + expect(page.find_all('tbody tr').length).to eq(20) + end + end end describe 'POST /:project/pipelines' do From a8bc272237590efe43b83d5294f7d572c1b205c0 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 09:21:52 -0600 Subject: [PATCH 236/313] Add dropdown toggle button --- app/views/layouts/header/_default.html.haml | 11 +++ app/views/layouts/nav/_dashboard.html.haml | 79 ++++++++++----------- 2 files changed, 50 insertions(+), 40 deletions(-) diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 59082ce5fd5..14d7a75c34a 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -58,6 +58,17 @@ %h1.title= title + .dropdown + %button.global-dropdown-toggle{ href: '#', 'data-toggle' => 'dropdown' } + %span.sr-only Toggle navigation + = icon('bars') + .dropdown-menu-nav + %ul + - if current_user + = render 'layouts/nav/dashboard' + - else + = render 'layouts/nav/explore' + .header-logo = link_to root_path, class: 'home', title: 'Dashboard', id: 'logo' do = brand_header_logo diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 205d23178d2..efcb60addc0 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,41 +1,40 @@ -.nav-sidebar - %ul.nav - = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: {class: "#{project_tab_class} home"}) do - = link_to dashboard_projects_path, title: 'Projects', class: 'dashboard-shortcuts-projects' do - %span - Projects - = nav_link(path: 'dashboard#activity') do - = link_to activity_dashboard_path, class: 'dashboard-shortcuts-activity', title: 'Activity' do - %span - Activity - - if koding_enabled? - = nav_link(controller: :koding) do - = link_to koding_path, title: 'Koding' do - %span - Koding - = nav_link(controller: [:groups, 'groups/milestones', 'groups/group_members']) do - = link_to dashboard_groups_path, title: 'Groups' do - %span - Groups - = nav_link(controller: 'dashboard/milestones') do - = link_to dashboard_milestones_path, title: 'Milestones' do - %span - Milestones - = nav_link(path: 'dashboard#issues') do - = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues' do - %span - Issues - %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :issues, :opened)) - = nav_link(path: 'dashboard#merge_requests') do - = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'dashboard-shortcuts-merge_requests' do - %span - Merge Requests - %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :merge_requests, :opened)) - = nav_link(controller: 'dashboard/snippets') do - = link_to dashboard_snippets_path, title: 'Snippets' do - %span - Snippets - - = link_to help_path, title: 'About GitLab CE', class: 'about-gitlab' do +%ul.nav + = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: {class: "#{project_tab_class} home"}) do + = link_to dashboard_projects_path, title: 'Projects', class: 'dashboard-shortcuts-projects' do %span - About GitLab CE + Projects + = nav_link(path: 'dashboard#activity') do + = link_to activity_dashboard_path, class: 'dashboard-shortcuts-activity', title: 'Activity' do + %span + Activity + - if koding_enabled? + = nav_link(controller: :koding) do + = link_to koding_path, title: 'Koding' do + %span + Koding + = nav_link(controller: [:groups, 'groups/milestones', 'groups/group_members']) do + = link_to dashboard_groups_path, title: 'Groups' do + %span + Groups + = nav_link(controller: 'dashboard/milestones') do + = link_to dashboard_milestones_path, title: 'Milestones' do + %span + Milestones + = nav_link(path: 'dashboard#issues') do + = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues' do + %span + Issues + %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :issues, :opened)) + = nav_link(path: 'dashboard#merge_requests') do + = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'dashboard-shortcuts-merge_requests' do + %span + Merge Requests + %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :merge_requests, :opened)) + = nav_link(controller: 'dashboard/snippets') do + = link_to dashboard_snippets_path, title: 'Snippets' do + %span + Snippets + + = link_to help_path, title: 'About GitLab CE', class: 'about-gitlab' do + %span + About GitLab CE From 93c57201b224696f8cd11b6fa2cd85e0c49f92be Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 09:28:15 -0600 Subject: [PATCH 237/313] Remove pinned nav functionality and side_navbar_class --- app/helpers/nav_helper.rb | 14 -------------- app/views/layouts/_page.html.haml | 19 +------------------ 2 files changed, 1 insertion(+), 32 deletions(-) diff --git a/app/helpers/nav_helper.rb b/app/helpers/nav_helper.rb index e21178c7377..c1523b4dabf 100644 --- a/app/helpers/nav_helper.rb +++ b/app/helpers/nav_helper.rb @@ -1,10 +1,4 @@ module NavHelper - def page_sidebar_class - if pinned_nav? - "page-sidebar-expanded page-sidebar-pinned" - end - end - def page_gutter_class if current_path?('merge_requests#show') || current_path?('merge_requests#diffs') || @@ -32,10 +26,6 @@ module NavHelper class_name = '' class_name << " with-horizontal-nav" if defined?(nav) && nav - if pinned_nav? - class_name << " header-sidebar-expanded header-sidebar-pinned" - end - class_name end @@ -46,8 +36,4 @@ module NavHelper def nav_control_class "nav-control" if current_user end - - def pinned_nav? - cookies[:pin_nav] == 'true' - end end diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 54d02ee8e4b..5d227d1d52a 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -1,21 +1,4 @@ -.page-with-sidebar{ class: "#{page_sidebar_class} #{page_gutter_class}" } - .sidebar-wrapper.nicescroll - .sidebar-action-buttons - .nav-header-btn.toggle-nav-collapse{ title: "Open/Close" } - %span.sr-only Toggle navigation - = icon('bars') - - %div{ class: "nav-header-btn pin-nav-btn has-tooltip #{'is-active' if pinned_nav?} js-nav-pin", title: pinned_nav? ? "Unpin navigation" : "Pin Navigation", data: { placement: 'right', container: 'body' } } - %span.sr-only Toggle navigation pinning - = icon('fw thumb-tack') - - - if defined?(sidebar) && sidebar - = render "layouts/nav/#{sidebar}" - - elsif current_user - = render 'layouts/nav/dashboard' - - else - = render 'layouts/nav/explore' - +.page-with-sidebar{ class: "#{page_gutter_class}" } - if defined?(nav) && nav .layout-nav .container-fluid From 109953885cdf6686d929623cf8f2fc5b55c90cb4 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 09:48:04 -0600 Subject: [PATCH 238/313] Remove all unnecessary sidebar.js --- app/assets/javascripts/sidebar.js.es6 | 91 --------------------------- 1 file changed, 91 deletions(-) diff --git a/app/assets/javascripts/sidebar.js.es6 b/app/assets/javascripts/sidebar.js.es6 index 33e4b7db681..cd0aa9be6e5 100644 --- a/app/assets/javascripts/sidebar.js.es6 +++ b/app/assets/javascripts/sidebar.js.es6 @@ -2,70 +2,7 @@ /* global Cookies */ (() => { - const pinnedStateCookie = 'pin_nav'; - const sidebarBreakpoint = 1024; - - const pageSelector = '.page-with-sidebar'; - const navbarSelector = '.navbar-gitlab'; - const sidebarWrapperSelector = '.sidebar-wrapper'; - const sidebarContentSelector = '.nav-sidebar'; - - const pinnedToggleSelector = '.js-nav-pin'; - const sidebarToggleSelector = '.toggle-nav-collapse, .side-nav-toggle'; - - const pinnedPageClass = 'page-sidebar-pinned'; - const expandedPageClass = 'page-sidebar-expanded'; - - const pinnedNavbarClass = 'header-sidebar-pinned'; - const expandedNavbarClass = 'header-sidebar-expanded'; - class Sidebar { - constructor() { - if (!Sidebar.singleton) { - Sidebar.singleton = this; - Sidebar.singleton.init(); - } - - return Sidebar.singleton; - } - - init() { - this.isPinned = Cookies.get(pinnedStateCookie) === 'true'; - this.isExpanded = ( - window.innerWidth >= sidebarBreakpoint && - $(pageSelector).hasClass(expandedPageClass) - ); - $(window).on('resize', () => this.setSidebarHeight()); - $(document) - .on('click', sidebarToggleSelector, () => this.toggleSidebar()) - .on('click', pinnedToggleSelector, () => this.togglePinnedState()) - .on('click', 'html, body, a, button', (e) => this.handleClickEvent(e)) - .on('DOMContentLoaded', () => this.renderState()) - .on('scroll', () => this.setSidebarHeight()) - .on('todo:toggle', (e, count) => this.updateTodoCount(count)); - this.renderState(); - this.setSidebarHeight(); - } - - handleClickEvent(e) { - if (this.isExpanded && (!this.isPinned || window.innerWidth < sidebarBreakpoint)) { - const $target = $(e.target); - const targetIsToggle = $target.closest(sidebarToggleSelector).length > 0; - const targetIsSidebar = $target.closest(sidebarWrapperSelector).length > 0; - if (!targetIsToggle && (!targetIsSidebar || $target.closest('a'))) { - this.toggleSidebar(); - } - } - } - - updateTodoCount(count) { - $('.js-todos-count').text(gl.text.addDelimiter(count)); - } - - toggleSidebar() { - this.isExpanded = !this.isExpanded; - this.renderState(); - } setSidebarHeight() { const $navHeight = $('.navbar-gitlab').outerHeight() + $('.layout-nav').outerHeight(); @@ -76,34 +13,6 @@ $('.js-right-sidebar').outerHeight('100%'); } } - - togglePinnedState() { - this.isPinned = !this.isPinned; - if (!this.isPinned) { - this.isExpanded = false; - } - Cookies.set(pinnedStateCookie, this.isPinned ? 'true' : 'false', { expires: 3650 }); - this.renderState(); - } - - renderState() { - $(pageSelector) - .toggleClass(pinnedPageClass, this.isPinned && this.isExpanded) - .toggleClass(expandedPageClass, this.isExpanded); - $(navbarSelector) - .toggleClass(pinnedNavbarClass, this.isPinned && this.isExpanded) - .toggleClass(expandedNavbarClass, this.isExpanded); - - const $pinnedToggle = $(pinnedToggleSelector); - const tooltipText = this.isPinned ? 'Unpin navigation' : 'Pin navigation'; - const tooltipState = $pinnedToggle.attr('aria-describedby') && this.isExpanded ? 'show' : 'hide'; - $pinnedToggle.attr('title', tooltipText).tooltip('fixTitle').tooltip(tooltipState); - - if (this.isExpanded) { - const sidebarContent = $(sidebarContentSelector); - setTimeout(() => { sidebarContent.niceScroll().updateScrollBar(); }, 200); - } - } } window.gl = window.gl || {}; From 4b7f0b327cceedf7b107db5fcfa7af75e4eb9e34 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 09:56:27 -0600 Subject: [PATCH 239/313] Remove all gitlab theme related code --- app/assets/javascripts/application.js | 5 - app/assets/stylesheets/framework.scss | 1 - .../stylesheets/framework/animations.scss | 1 - .../stylesheets/framework/gitlab-theme.scss | 144 ------------------ app/assets/stylesheets/framework/sidebar.scss | 67 -------- .../pages/profiles/preferences.scss | 39 ----- app/helpers/preferences_helper.rb | 4 - app/views/layouts/application.html.haml | 2 +- app/views/layouts/nav/_dashboard.html.haml | 2 +- app/views/layouts/nav/_explore.html.haml | 2 +- app/views/profiles/preferences/show.html.haml | 6 - app/views/profiles/preferences/update.js.erb | 4 - config/initializers/1_settings.rb | 1 - lib/gitlab/themes.rb | 87 ----------- spec/features/profiles/preferences_spec.rb | 29 ---- spec/helpers/preferences_helper_spec.rb | 26 ---- spec/lib/gitlab/themes_spec.rb | 48 ------ 17 files changed, 3 insertions(+), 465 deletions(-) delete mode 100644 app/assets/stylesheets/framework/gitlab-theme.scss delete mode 100644 lib/gitlab/themes.rb delete mode 100644 spec/lib/gitlab/themes_spec.rb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 4b5c9686cab..3c1d65b8e67 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -101,11 +101,6 @@ require('es6-promise').polyfill(); } }); - $('.nav-sidebar').niceScroll({ - cursoropacitymax: '0.4', - cursorcolor: '#FFF', - cursorborder: '1px solid #FFF' - }); $('.js-select-on-focus').on('focusin', function () { return $(this).select().one('mouseup', function (e) { return e.preventDefault(); diff --git a/app/assets/stylesheets/framework.scss b/app/assets/stylesheets/framework.scss index 08f203a1bf6..39cf3b5f8ae 100644 --- a/app/assets/stylesheets/framework.scss +++ b/app/assets/stylesheets/framework.scss @@ -19,7 +19,6 @@ @import "framework/flash.scss"; @import "framework/forms.scss"; @import "framework/gfm.scss"; -@import "framework/gitlab-theme.scss"; @import "framework/header.scss"; @import "framework/highlight.scss"; @import "framework/issue_box.scss"; diff --git a/app/assets/stylesheets/framework/animations.scss b/app/assets/stylesheets/framework/animations.scss index 0ca5a9343f7..49ae84b7a70 100644 --- a/app/assets/stylesheets/framework/animations.scss +++ b/app/assets/stylesheets/framework/animations.scss @@ -140,7 +140,6 @@ a { @include transition(background-color, box-shadow); } -.nav-sidebar a, .dropdown-menu a, .dropdown-menu button, .dropdown-menu-nav a { diff --git a/app/assets/stylesheets/framework/gitlab-theme.scss b/app/assets/stylesheets/framework/gitlab-theme.scss deleted file mode 100644 index d6566dc4ec9..00000000000 --- a/app/assets/stylesheets/framework/gitlab-theme.scss +++ /dev/null @@ -1,144 +0,0 @@ -/** - * Styles the GitLab application with a specific color theme - * - * $color-light - - * $color - - * $color-darker - - * $color-dark - - */ -@mixin gitlab-theme($color-light, $color, $color-darker, $color-dark) { - .page-with-sidebar { - .toggle-nav-collapse, - .pin-nav-btn { - color: $color-light; - - &:hover { - color: $white-light; - } - } - - .sidebar-wrapper { - background: $color-darker; - } - - .sidebar-action-buttons { - color: $color-light; - background-color: lighten($color-darker, 5%); - } - - .nav-sidebar { - li { - a { - color: $color-light; - - &:hover, - &:focus, - &:active { - background: $color-dark; - } - - i { - color: $color-light; - } - - path, - polygon { - fill: $color-light; - } - - .count { - color: $color-light; - background: $color-dark; - } - - svg { - position: relative; - top: 3px; - } - } - - &.separate-item { - border-top: 1px solid $color; - } - - &.active a { - color: $white-light; - background: $color-dark; - - &.no-highlight { - border: none; - } - - i { - color: $white-light; - } - - path, - polygon { - fill: $white-light; - } - } - } - - .about-gitlab { - color: $color-light; - } - } - } -} - -$theme-charcoal-light: #b9bbbe; -$theme-charcoal: #485157; -$theme-charcoal-dark: #3d454d; -$theme-charcoal-darker: #383f45; - -$theme-blue-light: #becde9; -$theme-blue: #2980b9; -$theme-blue-dark: #1970a9; -$theme-blue-darker: #096099; - -$theme-graphite-light: #ccc; -$theme-graphite: #777; -$theme-graphite-dark: #666; -$theme-graphite-darker: #555; - -$theme-black-light: #979797; -$theme-black: #373737; -$theme-black-dark: #272727; -$theme-black-darker: #222; - -$theme-green-light: #adc; -$theme-green: #019875; -$theme-green-dark: #018865; -$theme-green-darker: #017855; - -$theme-violet-light: #98c; -$theme-violet: #548; -$theme-violet-dark: #436; -$theme-violet-darker: #325; - -body { - &.ui_blue { - @include gitlab-theme($theme-blue-light, $theme-blue, $theme-blue-dark, $theme-blue-darker); - } - - &.ui_charcoal { - @include gitlab-theme($theme-charcoal-light, $theme-charcoal, $theme-charcoal-dark, $theme-charcoal-darker); - } - - &.ui_graphite { - @include gitlab-theme($theme-graphite-light, $theme-graphite, $theme-graphite-dark, $theme-graphite-darker); - } - - &.ui_black { - @include gitlab-theme($theme-black-light, $theme-black, $theme-black-dark, $theme-black-darker); - } - - &.ui_green { - @include gitlab-theme($theme-green-light, $theme-green, $theme-green-dark, $theme-green-darker); - } - - &.ui_violet { - @include gitlab-theme($theme-violet-light, $theme-violet, $theme-violet-dark, $theme-violet-darker); - } -} diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index 20bcb1eeb23..390d2589ab2 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -47,73 +47,6 @@ } } -.nav-sidebar { - position: absolute; - top: 50px; - bottom: 0; - width: $sidebar_width; - overflow-y: auto; - overflow-x: hidden; - - &.navbar-collapse { - padding: 0 !important; - } - - li { - &.separate-item { - padding-top: 10px; - margin-top: 10px; - } - - .icon-container { - width: 34px; - display: inline-block; - text-align: center; - } - - a { - padding: 7px $gl-sidebar-padding; - font-size: $gl-font-size; - line-height: 24px; - display: block; - text-decoration: none; - font-weight: normal; - - &:hover, - &:active, - &:focus { - text-decoration: none; - } - - i { - font-size: 16px; - } - - i, - svg { - margin-right: 13px; - } - } - } - - .count { - float: right; - padding: 0 8px; - border-radius: 6px; - } - - .about-gitlab { - padding: 7px $gl-sidebar-padding; - font-size: $gl-font-size; - line-height: 24px; - display: block; - text-decoration: none; - font-weight: normal; - position: absolute; - bottom: 10px; - } -} - .sidebar-action-buttons { width: $sidebar_width; position: absolute; diff --git a/app/assets/stylesheets/pages/profiles/preferences.scss b/app/assets/stylesheets/pages/profiles/preferences.scss index 100ace41f2a..305feaacaa1 100644 --- a/app/assets/stylesheets/pages/profiles/preferences.scss +++ b/app/assets/stylesheets/pages/profiles/preferences.scss @@ -1,42 +1,3 @@ -.application-theme { - label { - margin-right: 20px; - text-align: center; - - .preview { - border-radius: 4px; - - height: 80px; - margin-bottom: 10px; - width: 160px; - - &.ui_blue { - background: $theme-blue; - } - - &.ui_charcoal { - background: $theme-charcoal; - } - - &.ui_graphite { - background: $theme-graphite; - } - - &.ui_black { - background: $theme-black; - } - - &.ui_green { - background: $theme-green; - } - - &.ui_violet { - background: $theme-violet; - } - } - } -} - .syntax-theme { label { margin-right: 20px; diff --git a/app/helpers/preferences_helper.rb b/app/helpers/preferences_helper.rb index dd0a4ea03f0..c3a08d76318 100644 --- a/app/helpers/preferences_helper.rb +++ b/app/helpers/preferences_helper.rb @@ -41,10 +41,6 @@ module PreferencesHelper ] end - def user_application_theme - Gitlab::Themes.for_user(current_user).css_class - end - def user_color_scheme Gitlab::ColorSchemes.for_user(current_user).css_class end diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 248d439cd05..19bd9b6d5c9 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -1,7 +1,7 @@ !!! 5 %html{ lang: "en", class: "#{page_class}" } = render "layouts/head" - %body{ class: "#{user_application_theme}", data: { page: body_data_page, project: "#{@project.path if @project}", group: "#{@group.path if @group}" } } + %body{ data: { page: body_data_page, project: "#{@project.path if @project}", group: "#{@group.path if @group}" } } = Gon::Base.render_data = render "layouts/header/default", title: header_title diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index efcb60addc0..4f2547d0838 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -1,4 +1,4 @@ -%ul.nav +%ul = nav_link(path: ['root#index', 'projects#trending', 'projects#starred', 'dashboard/projects#index'], html_options: {class: "#{project_tab_class} home"}) do = link_to dashboard_projects_path, title: 'Projects', class: 'dashboard-shortcuts-projects' do %span diff --git a/app/views/layouts/nav/_explore.html.haml b/app/views/layouts/nav/_explore.html.haml index e5bda7b3a6f..3a1fcd00e9c 100644 --- a/app/views/layouts/nav/_explore.html.haml +++ b/app/views/layouts/nav/_explore.html.haml @@ -1,4 +1,4 @@ -%ul.nav.nav-sidebar +%ul = nav_link(path: ['dashboard#show', 'root#show', 'projects#trending', 'projects#starred', 'projects#index'], html_options: {class: 'home'}) do = link_to explore_root_path, title: 'Projects' do %span diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index feadd863b00..787339e0fe2 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -7,12 +7,6 @@ Application theme %p This setting allows you to customize the appearance of the site, e.g. the sidebar. - .col-lg-9.application-theme - - Gitlab::Themes.each do |theme| - = label_tag do - .preview{ class: theme.css_class } - = f.radio_button :theme_id, theme.id - = theme.name .col-sm-12 %hr .col-lg-3.profile-settings-sidebar diff --git a/app/views/profiles/preferences/update.js.erb b/app/views/profiles/preferences/update.js.erb index 8966dd3fd86..431ab9d052b 100644 --- a/app/views/profiles/preferences/update.js.erb +++ b/app/views/profiles/preferences/update.js.erb @@ -1,7 +1,3 @@ -// Remove body class for any previous theme, re-add current one -$('body').removeClass('<%= Gitlab::Themes.body_classes %>') -$('body').addClass('<%= user_application_theme %>') - // Toggle container-fluid class if ('<%= current_user.layout %>' === 'fluid') { $('.content-wrapper .container-fluid').removeClass('container-limited') diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index ab59394cb0c..3f716dd8833 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -183,7 +183,6 @@ 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::Themes::APPLICATION_DEFAULT if Settings.gitlab['default_theme'].nil? Settings.gitlab['host'] ||= ENV['GITLAB_HOST'] || 'localhost' Settings.gitlab['ssh_host'] ||= Settings.gitlab.host Settings.gitlab['https'] = false if Settings.gitlab['https'].nil? diff --git a/lib/gitlab/themes.rb b/lib/gitlab/themes.rb deleted file mode 100644 index 19ab76ae80f..00000000000 --- a/lib/gitlab/themes.rb +++ /dev/null @@ -1,87 +0,0 @@ -module Gitlab - # Module containing GitLab's application theme definitions and helper methods - # for accessing them. - module Themes - extend self - - # Theme ID used when no `default_theme` configuration setting is provided. - APPLICATION_DEFAULT = 2 - - # Struct class representing a single Theme - Theme = Struct.new(:id, :name, :css_class) - - # All available Themes - THEMES = [ - Theme.new(1, 'Graphite', 'ui_graphite'), - Theme.new(2, 'Charcoal', 'ui_charcoal'), - Theme.new(3, 'Green', 'ui_green'), - Theme.new(4, 'Black', 'ui_black'), - Theme.new(5, 'Violet', 'ui_violet'), - Theme.new(6, 'Blue', 'ui_blue') - ].freeze - - # Convenience method to get a space-separated String of all the theme - # classes that might be applied to the `body` element - # - # Returns a String - def body_classes - THEMES.collect(&:css_class).uniq.join(' ') - end - - # Get a Theme by its ID - # - # If the ID is invalid, returns the default Theme. - # - # id - Integer ID - # - # Returns a Theme - def by_id(id) - THEMES.detect { |t| t.id == id } || default - end - - # Returns the number of defined Themes - def count - THEMES.size - end - - # Get the default Theme - # - # Returns a Theme - def default - by_id(default_id) - end - - # Iterate through each Theme - # - # Yields the Theme object - def each(&block) - THEMES.each(&block) - end - - # Get the Theme for the specified user, or the default - # - # user - User record - # - # Returns a Theme - def for_user(user) - if user - by_id(user.theme_id) - else - default - end - end - - private - - def default_id - id = Gitlab.config.gitlab.default_theme.to_i - - # Prevent an invalid configuration setting from causing an infinite loop - if id < THEMES.first.id || id > THEMES.last.id - APPLICATION_DEFAULT - else - id - end - end - end -end diff --git a/spec/features/profiles/preferences_spec.rb b/spec/features/profiles/preferences_spec.rb index a6b841c0210..15c8677fcd3 100644 --- a/spec/features/profiles/preferences_spec.rb +++ b/spec/features/profiles/preferences_spec.rb @@ -8,35 +8,6 @@ describe 'Profile > Preferences', feature: true do visit profile_preferences_path end - describe 'User changes their application theme', js: true do - let(:default) { Gitlab::Themes.default } - let(:theme) { Gitlab::Themes.by_id(5) } - - it 'creates a flash message' do - choose "user_theme_id_#{theme.id}" - - expect_preferences_saved_message - end - - it 'updates their preference' do - choose "user_theme_id_#{theme.id}" - - allowing_for_delay do - visit page.current_path - expect(page).to have_checked_field("user_theme_id_#{theme.id}") - end - end - - it 'reflects the changes immediately' do - expect(page).to have_selector("body.#{default.css_class}") - - choose "user_theme_id_#{theme.id}" - - expect(page).not_to have_selector("body.#{default.css_class}") - expect(page).to have_selector("body.#{theme.css_class}") - end - end - describe 'User changes their syntax highlighting theme', js: true do it 'creates a flash message' do choose 'user_color_scheme_id_5' diff --git a/spec/helpers/preferences_helper_spec.rb b/spec/helpers/preferences_helper_spec.rb index 1f02e06e312..f3e79cc7290 100644 --- a/spec/helpers/preferences_helper_spec.rb +++ b/spec/helpers/preferences_helper_spec.rb @@ -26,32 +26,6 @@ describe PreferencesHelper do end end - describe 'user_application_theme' do - context 'with a user' do - it "returns user's theme's css_class" do - stub_user(theme_id: 3) - - expect(helper.user_application_theme).to eq 'ui_green' - end - - it 'returns the default when id is invalid' do - stub_user(theme_id: Gitlab::Themes.count + 5) - - allow(Gitlab.config.gitlab).to receive(:default_theme).and_return(2) - - expect(helper.user_application_theme).to eq 'ui_charcoal' - end - end - - context 'without a user' do - it 'returns the default theme' do - stub_user - - expect(helper.user_application_theme).to eq Gitlab::Themes.default.css_class - end - end - end - describe 'user_color_scheme' do context 'with a user' do it "returns user's scheme's css_class" do diff --git a/spec/lib/gitlab/themes_spec.rb b/spec/lib/gitlab/themes_spec.rb deleted file mode 100644 index 7a140518dd2..00000000000 --- a/spec/lib/gitlab/themes_spec.rb +++ /dev/null @@ -1,48 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Themes, lib: true do - describe '.body_classes' do - it 'returns a space-separated list of class names' do - css = described_class.body_classes - - expect(css).to include('ui_graphite') - expect(css).to include(' ui_charcoal ') - expect(css).to include(' ui_blue') - end - end - - describe '.by_id' do - it 'returns a Theme by its ID' do - expect(described_class.by_id(1).name).to eq 'Graphite' - expect(described_class.by_id(6).name).to eq 'Blue' - end - end - - describe '.default' do - it 'returns the default application theme' do - allow(described_class).to receive(:default_id).and_return(2) - expect(described_class.default.id).to eq 2 - end - - it 'prevents an infinite loop when configuration default is invalid' do - default = described_class::APPLICATION_DEFAULT - themes = described_class::THEMES - - config = double(default_theme: 0).as_null_object - allow(Gitlab).to receive(:config).and_return(config) - expect(described_class.default.id).to eq default - - config = double(default_theme: themes.size + 5).as_null_object - allow(Gitlab).to receive(:config).and_return(config) - expect(described_class.default.id).to eq default - end - end - - describe '.each' do - it 'passes the block to the THEMES Array' do - ids = [] - described_class.each { |theme| ids << theme.id } - expect(ids).not_to be_empty - end - end -end From 572bc7bc3771d76afe5b7524369ed069b66fa1f2 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 10:34:01 -0600 Subject: [PATCH 240/313] Remove global sidebar styles --- .../stylesheets/framework/animations.scss | 2 +- app/assets/stylesheets/framework/header.scss | 2 +- app/assets/stylesheets/framework/sidebar.scss | 118 +----------------- .../stylesheets/framework/variables.scss | 4 +- app/assets/stylesheets/pages/issuable.scss | 4 +- app/assets/stylesheets/print.scss | 1 - 6 files changed, 10 insertions(+), 121 deletions(-) diff --git a/app/assets/stylesheets/framework/animations.scss b/app/assets/stylesheets/framework/animations.scss index 49ae84b7a70..90935b9616b 100644 --- a/app/assets/stylesheets/framework/animations.scss +++ b/app/assets/stylesheets/framework/animations.scss @@ -116,7 +116,7 @@ } .btn, -.side-nav-toggle { +.global-dropdown-toggle { @include transition(background-color, border-color, color, box-shadow); } diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss index 34e010e0e8a..be689bd252b 100644 --- a/app/assets/stylesheets/framework/header.scss +++ b/app/assets/stylesheets/framework/header.scss @@ -101,7 +101,7 @@ header { } } - .side-nav-toggle { + .global-dropdown-toggle { position: absolute; left: -10px; margin: 7px 0; diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index 390d2589ab2..d09b1c9d7f5 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -1,36 +1,3 @@ -.page-with-sidebar { - padding-bottom: 25px; - transition: padding $sidebar-transition-duration; - - &.page-sidebar-pinned { - .sidebar-wrapper { - box-shadow: none; - } - } - - .sidebar-wrapper { - position: fixed; - top: 0; - bottom: 0; - left: 0; - height: 100%; - width: 0; - overflow: hidden; - transition: width $sidebar-transition-duration; - box-shadow: 2px 0 16px 0 $black-transparent; - } -} - -.sidebar-wrapper { - z-index: 1000; - background: $gray-light; - - .nicescroll-rails-hr { - // TODO: Figure out why nicescroll doesn't hide horizontal bar - display: none!important; - } -} - .content-wrapper { width: 100%; transition: padding $sidebar-transition-duration; @@ -47,38 +14,6 @@ } } -.sidebar-action-buttons { - width: $sidebar_width; - position: absolute; - top: 0; - left: 0; - min-height: 50px; - padding: 5px 0; - font-size: 18px; - line-height: 30px; - - .toggle-nav-collapse { - left: 0; - } - - .pin-nav-btn { - right: 0; - display: none; - - @media (min-width: $sidebar-breakpoint) { - display: block; - } - - .fa { - transition: transform .15s; - - .page-sidebar-pinned & { - transform: rotate(90deg); - } - } - } -} - .nav-header-btn { padding: 10px $gl-sidebar-padding; color: inherit; @@ -94,59 +29,16 @@ } } -.page-sidebar-expanded { - .sidebar-wrapper { - width: $sidebar_width; - } -} - -.page-sidebar-pinned { - .content-wrapper, - .layout-nav { - @media (min-width: $sidebar-breakpoint) { - padding-left: $sidebar_width; - } - } - - .merge-request-tabs-holder.affix { - @media (min-width: $sidebar-breakpoint) { - left: $sidebar_width; - } - } - - &.right-sidebar-expanded { - .line-resolve-all-container { - @media (min-width: $sidebar-breakpoint) { - display: none; - } - } - } -} - -header.header-sidebar-pinned { - @media (min-width: $sidebar-breakpoint) { - padding-left: ($sidebar_width + $gl-padding); - - .side-nav-toggle { - display: none; - } - - .header-content { - padding-left: 0; - } - } -} - .right-sidebar-collapsed { padding-right: 0; @media (min-width: $screen-sm-min) { .content-wrapper { - padding-right: $sidebar_collapsed_width; + padding-right: $gutter_collapsed_width; } .merge-request-tabs-holder.affix { - right: $sidebar_collapsed_width; + right: $gutter_collapsed_width; } } @@ -164,7 +56,7 @@ header.header-sidebar-pinned { @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { &:not(.build-sidebar):not(.wiki-sidebar) { - padding-right: $sidebar_collapsed_width; + padding-right: $gutter_collapsed_width; } } @@ -178,12 +70,12 @@ header.header-sidebar-pinned { } &.with-overlay .merge-request-tabs-holder.affix { - right: $sidebar_collapsed_width; + right: $gutter_collapsed_width; } } &.with-overlay { - padding-right: $sidebar_collapsed_width; + padding-right: $gutter_collapsed_width; } } diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index 7809d4866f1..ba0af072716 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -1,8 +1,6 @@ /* * Layout */ -$sidebar_collapsed_width: 62px; -$sidebar_width: 220px; $gutter_collapsed_width: 62px; $gutter_width: 290px; $gutter_inner_width: 250px; @@ -541,4 +539,4 @@ Pipeline Graph */ $stage-hover-bg: #eaf3fc; $stage-hover-border: #d1e7fc; -$action-icon-color: #d6d6d6; \ No newline at end of file +$action-icon-color: #d6d6d6; diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index a53cc27fac9..4426169ef5a 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -253,11 +253,11 @@ display: block; } - width: $sidebar_collapsed_width; + width: $gutter_collapsed_width; padding-top: 0; .block { - width: $sidebar_collapsed_width - 2px; + width: $gutter_collapsed_width - 2px; margin-left: -19px; padding: 15px 0 0; border-bottom: none; diff --git a/app/assets/stylesheets/print.scss b/app/assets/stylesheets/print.scss index 0ff3c3f5472..6cc1cc8e263 100644 --- a/app/assets/stylesheets/print.scss +++ b/app/assets/stylesheets/print.scss @@ -31,7 +31,6 @@ nav.navbar-collapse.collapse, .blob-commit-info, .file-title, .file-holder, -.sidebar-wrapper, .nav, .btn, ul.notes-form, From a1a0a0350747d656281564ae1cee157171668516 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 10:57:15 -0600 Subject: [PATCH 241/313] Remove sidebar toggle button; replace with dropdown --- app/assets/stylesheets/framework/header.scss | 5 +++- app/views/layouts/header/_default.html.haml | 25 ++++++++------------ 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss index be689bd252b..2a6273f1301 100644 --- a/app/assets/stylesheets/framework/header.scss +++ b/app/assets/stylesheets/framework/header.scss @@ -101,9 +101,12 @@ header { } } - .global-dropdown-toggle { + .global-dropdown { position: absolute; left: -10px; + } + + .global-dropdown-toggle { margin: 7px 0; font-size: 18px; padding: 6px 10px; diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index 14d7a75c34a..ea56d92cf34 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -2,9 +2,16 @@ %a.sr-only.gl-accessibility{ href: "#content-body", tabindex: "1" } Skip to content .container-fluid .header-content - %button.side-nav-toggle{ type: 'button', "aria-label" => "Toggle global navigation" } - %span.sr-only Toggle navigation - = icon('bars') + .dropdown.global-dropdown + %button.global-dropdown-toggle{ type: 'button', 'data-toggle' => 'dropdown' } + %span.sr-only Toggle navigation + = icon('bars') + .dropdown-menu-nav + %ul + - if current_user + = render 'layouts/nav/dashboard' + - else + = render 'layouts/nav/explore' %button.navbar-toggle{ type: 'button' } %span.sr-only Toggle navigation = icon('ellipsis-v') @@ -55,20 +62,8 @@ %div = link_to "Sign in", new_session_path(:user, redirect_to_referer: 'yes'), class: 'btn btn-sign-in btn-success' - %h1.title= title - .dropdown - %button.global-dropdown-toggle{ href: '#', 'data-toggle' => 'dropdown' } - %span.sr-only Toggle navigation - = icon('bars') - .dropdown-menu-nav - %ul - - if current_user - = render 'layouts/nav/dashboard' - - else - = render 'layouts/nav/explore' - .header-logo = link_to root_path, class: 'home', title: 'Dashboard', id: 'logo' do = brand_header_logo From b0dff3c83edcc2b48a0457ad93da4e8d4324ed06 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 11:11:31 -0600 Subject: [PATCH 242/313] Fix dropdown alignment --- app/views/layouts/nav/_dashboard.html.haml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/app/views/layouts/nav/_dashboard.html.haml b/app/views/layouts/nav/_dashboard.html.haml index 4f2547d0838..bb611d39be5 100644 --- a/app/views/layouts/nav/_dashboard.html.haml +++ b/app/views/layouts/nav/_dashboard.html.haml @@ -24,17 +24,16 @@ = link_to assigned_issues_dashboard_path, title: 'Issues', class: 'dashboard-shortcuts-issues' do %span Issues - %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :issues, :opened)) + %span.badge= number_with_delimiter(cached_assigned_issuables_count(current_user, :issues, :opened)) = nav_link(path: 'dashboard#merge_requests') do = link_to assigned_mrs_dashboard_path, title: 'Merge Requests', class: 'dashboard-shortcuts-merge_requests' do %span Merge Requests - %span.count= number_with_delimiter(cached_assigned_issuables_count(current_user, :merge_requests, :opened)) + %span.badge= number_with_delimiter(cached_assigned_issuables_count(current_user, :merge_requests, :opened)) = nav_link(controller: 'dashboard/snippets') do = link_to dashboard_snippets_path, title: 'Snippets' do %span Snippets - - = link_to help_path, title: 'About GitLab CE', class: 'about-gitlab' do - %span - About GitLab CE + %li.divider + %li + = link_to "About GitLab CE", help_path, title: 'About GitLab CE', class: 'about-gitlab' From 0667d1aa7f251f5bf11dd121fe2f696107d8103e Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 11:38:53 -0600 Subject: [PATCH 243/313] Drop theme ID from users table --- app/controllers/admin/users_controller.rb | 1 - .../profiles/preferences_controller.rb | 1 - app/models/user.rb | 1 - config/gitlab.yml.example | 8 ----- ...170213172852_remove_theme_id_from_users.rb | 29 +++++++++++++++++++ db/schema.rb | 7 ++--- spec/models/user_spec.rb | 1 - 7 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 db/migrate/20170213172852_remove_theme_id_from_users.rb diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb index 1cd50852e89..7ffde71c3b1 100644 --- a/app/controllers/admin/users_controller.rb +++ b/app/controllers/admin/users_controller.rb @@ -194,7 +194,6 @@ class Admin::UsersController < Admin::ApplicationController :provider, :remember_me, :skype, - :theme_id, :twitter, :username, :website_url diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb index a9a06ecc808..0d891ef4004 100644 --- a/app/controllers/profiles/preferences_controller.rb +++ b/app/controllers/profiles/preferences_controller.rb @@ -34,7 +34,6 @@ class Profiles::PreferencesController < Profiles::ApplicationController :layout, :dashboard, :project_view, - :theme_id ) end end diff --git a/app/models/user.rb b/app/models/user.rb index ad997ce2b13..f614eb66e1f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -21,7 +21,6 @@ class User < ActiveRecord::Base default_value_for :can_create_team, false default_value_for :hide_no_ssh_key, false default_value_for :hide_no_password, false - default_value_for :theme_id, gitlab_config.default_theme attr_encrypted :otp_secret, key: Gitlab::Application.secrets.otp_key_base, diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index cc1af77a1de..560be67a70f 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -76,14 +76,6 @@ production: &base # default_can_create_group: false # default: true # username_changing_enabled: false # default: true - User can change her username/namespace - ## Default theme ID - ## 1 - Graphite - ## 2 - Charcoal - ## 3 - Green - ## 4 - Gray - ## 5 - Violet - ## 6 - Blue - # default_theme: 2 # default: 2 ## Automatic issue closing # If a commit message matches this regular expression, all issues referenced from the matched text will be closed. diff --git a/db/migrate/20170213172852_remove_theme_id_from_users.rb b/db/migrate/20170213172852_remove_theme_id_from_users.rb new file mode 100644 index 00000000000..857f678ad0e --- /dev/null +++ b/db/migrate/20170213172852_remove_theme_id_from_users.rb @@ -0,0 +1,29 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class RemoveThemeIdFromUsers < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + # Set this constant to true if this migration requires downtime. + DOWNTIME = false + + # When a migration requires downtime you **must** uncomment the following + # constant and define a short and easy to understand explanation as to why the + # migration requires downtime. + # DOWNTIME_REASON = '' + + # When using the methods "add_concurrent_index" or "add_column_with_default" + # you must disable the use of transactions as these methods can not run in an + # existing transaction. When using "add_concurrent_index" make sure that this + # method is the _only_ method called in the migration, any other changes + # should go in a separate migration. This ensures that upon failure _only_ the + # index creation fails and can be retried or reverted easily. + # + # To disable transactions uncomment the following line and remove these + # comments: + # disable_ddl_transaction! + + def change + remove_column :users, :theme_id, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 52672406ec6..df065520835 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20170214111112) do +ActiveRecord::Schema.define(version: 20170213172852) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -109,8 +109,8 @@ ActiveRecord::Schema.define(version: 20170214111112) do t.boolean "html_emails_enabled", default: true t.string "plantuml_url" t.boolean "plantuml_enabled" - t.integer "max_pages_size", default: 100, null: false t.integer "terminal_max_session_time", default: 0, null: false + t.integer "max_pages_size", default: 100, null: false end create_table "audit_events", force: :cascade do |t| @@ -1238,7 +1238,6 @@ ActiveRecord::Schema.define(version: 20170214111112) do t.string "linkedin", default: "", null: false t.string "twitter", default: "", null: false t.string "authentication_token" - t.integer "theme_id", default: 1, null: false t.string "bio" t.integer "failed_attempts", default: 0 t.datetime "locked_at" @@ -1351,4 +1350,4 @@ ActiveRecord::Schema.define(version: 20170214111112) do add_foreign_key "timelogs", "merge_requests", name: "fk_timelogs_merge_requests_merge_request_id", on_delete: :cascade add_foreign_key "trending_projects", "projects", on_delete: :cascade add_foreign_key "u2f_registrations", "users" -end \ No newline at end of file +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 89cef7ab978..546efcfce97 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -582,7 +582,6 @@ describe User, models: true do it "applies defaults to user" do expect(user.projects_limit).to eq(Gitlab.config.gitlab.default_projects_limit) expect(user.can_create_group).to eq(Gitlab.config.gitlab.default_can_create_group) - expect(user.theme_id).to eq(Gitlab.config.gitlab.default_theme) expect(user.external).to be_falsey end end From c780ad0e926f15ed47acd744df99f89081c8a340 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 11:50:13 -0600 Subject: [PATCH 244/313] Remove all instances of theme_id; require downtime --- config/gitlab.yml.example | 2 +- .../20170213172852_remove_theme_id_from_users.rb | 2 +- db/schema.rb | 2 +- doc/api/keys.md | 1 - doc/api/session.md | 1 - doc/api/users.md | 5 ----- lib/api/entities.rb | 2 +- .../profiles/preferences_controller_spec.rb | 6 ++---- spec/fixtures/api/schemas/user/login.json | 1 - spec/fixtures/api/schemas/user/public.json | 16 +++++++--------- spec/models/user_spec.rb | 3 +-- spec/support/gitlab_stubs/session.json | 4 ++-- spec/support/gitlab_stubs/user.json | 4 ++-- 13 files changed, 18 insertions(+), 31 deletions(-) diff --git a/config/gitlab.yml.example b/config/gitlab.yml.example index 560be67a70f..a82ff605a70 100644 --- a/config/gitlab.yml.example +++ b/config/gitlab.yml.example @@ -603,4 +603,4 @@ test: admin_group: '' staging: - <<: *base \ No newline at end of file + <<: *base diff --git a/db/migrate/20170213172852_remove_theme_id_from_users.rb b/db/migrate/20170213172852_remove_theme_id_from_users.rb index 857f678ad0e..cd6388ab7d2 100644 --- a/db/migrate/20170213172852_remove_theme_id_from_users.rb +++ b/db/migrate/20170213172852_remove_theme_id_from_users.rb @@ -5,7 +5,7 @@ class RemoveThemeIdFromUsers < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers # Set this constant to true if this migration requires downtime. - DOWNTIME = false + DOWNTIME = true # When a migration requires downtime you **must** uncomment the following # constant and define a short and easy to understand explanation as to why the diff --git a/db/schema.rb b/db/schema.rb index df065520835..32cbefc2566 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -109,8 +109,8 @@ ActiveRecord::Schema.define(version: 20170213172852) do t.boolean "html_emails_enabled", default: true t.string "plantuml_url" t.boolean "plantuml_enabled" - t.integer "terminal_max_session_time", default: 0, null: false t.integer "max_pages_size", default: 100, null: false + t.integer "terminal_max_session_time", default: 0, null: false end create_table "audit_events", force: :cascade do |t| diff --git a/doc/api/keys.md b/doc/api/keys.md index b68f08a007d..3b55c2baf56 100644 --- a/doc/api/keys.md +++ b/doc/api/keys.md @@ -33,7 +33,6 @@ Parameters: "twitter": "", "website_url": "", "email": "john@example.com", - "theme_id": 2, "color_scheme_id": 1, "projects_limit": 10, "current_sign_in_at": null, diff --git a/doc/api/session.md b/doc/api/session.md index f776424023e..d7809716fbe 100644 --- a/doc/api/session.md +++ b/doc/api/session.md @@ -41,7 +41,6 @@ Example response: "twitter": "", "website_url": "", "email": "john@example.com", - "theme_id": 1, "color_scheme_id": 1, "projects_limit": 10, "current_sign_in_at": "2015-07-07T07:10:58.392Z", diff --git a/doc/api/users.md b/doc/api/users.md index ed3469521fc..626f7e63e3e 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -72,7 +72,6 @@ GET /users "organization": "", "last_sign_in_at": "2012-06-01T11:41:01Z", "confirmed_at": "2012-05-23T09:05:22Z", - "theme_id": 1, "color_scheme_id": 2, "projects_limit": 100, "current_sign_in_at": "2012-06-02T06:36:55Z", @@ -105,7 +104,6 @@ GET /users "organization": "", "last_sign_in_at": null, "confirmed_at": "2012-05-30T16:53:06.148Z", - "theme_id": 1, "color_scheme_id": 3, "projects_limit": 100, "current_sign_in_at": "2014-03-19T17:54:13Z", @@ -198,7 +196,6 @@ Parameters: "organization": "", "last_sign_in_at": "2012-06-01T11:41:01Z", "confirmed_at": "2012-05-23T09:05:22Z", - "theme_id": 1, "color_scheme_id": 2, "projects_limit": 100, "current_sign_in_at": "2012-06-02T06:36:55Z", @@ -323,7 +320,6 @@ GET /user "organization": "", "last_sign_in_at": "2012-06-01T11:41:01Z", "confirmed_at": "2012-05-23T09:05:22Z", - "theme_id": 1, "color_scheme_id": 2, "projects_limit": 100, "current_sign_in_at": "2012-06-02T06:36:55Z", @@ -369,7 +365,6 @@ GET /user "organization": "", "last_sign_in_at": "2012-06-01T11:41:01Z", "confirmed_at": "2012-05-23T09:05:22Z", - "theme_id": 1, "color_scheme_id": 2, "projects_limit": 100, "current_sign_in_at": "2012-06-02T06:36:55Z", diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 232f231ddd2..400ee7c92aa 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -26,7 +26,7 @@ module API expose :last_sign_in_at expose :confirmed_at expose :email - expose :theme_id, :color_scheme_id, :projects_limit, :current_sign_in_at + expose :color_scheme_id, :projects_limit, :current_sign_in_at expose :identities, using: Entities::Identity expose :can_create_group?, as: :can_create_group expose :can_create_project?, as: :can_create_project diff --git a/spec/controllers/profiles/preferences_controller_spec.rb b/spec/controllers/profiles/preferences_controller_spec.rb index 8f02003992a..7b3aa0491c7 100644 --- a/spec/controllers/profiles/preferences_controller_spec.rb +++ b/spec/controllers/profiles/preferences_controller_spec.rb @@ -25,8 +25,7 @@ describe Profiles::PreferencesController do def go(params: {}, format: :js) params.reverse_merge!( color_scheme_id: '1', - dashboard: 'stars', - theme_id: '1' + dashboard: 'stars' ) patch :update, user: params, format: format @@ -41,8 +40,7 @@ describe Profiles::PreferencesController do it "changes the user's preferences" do prefs = { color_scheme_id: '1', - dashboard: 'stars', - theme_id: '2' + dashboard: 'stars' }.with_indifferent_access expect(user).to receive(:update_attributes).with(prefs) diff --git a/spec/fixtures/api/schemas/user/login.json b/spec/fixtures/api/schemas/user/login.json index e6c1d9c9d84..6181b3ccc86 100644 --- a/spec/fixtures/api/schemas/user/login.json +++ b/spec/fixtures/api/schemas/user/login.json @@ -19,7 +19,6 @@ "organization", "last_sign_in_at", "confirmed_at", - "theme_id", "color_scheme_id", "projects_limit", "current_sign_in_at", diff --git a/spec/fixtures/api/schemas/user/public.json b/spec/fixtures/api/schemas/user/public.json index dbd5d32e89c..5587cfec61a 100644 --- a/spec/fixtures/api/schemas/user/public.json +++ b/spec/fixtures/api/schemas/user/public.json @@ -19,7 +19,6 @@ "organization", "last_sign_in_at", "confirmed_at", - "theme_id", "color_scheme_id", "projects_limit", "current_sign_in_at", @@ -32,14 +31,14 @@ "properties": { "id": { "type": "integer" }, "username": { "type": "string" }, - "email": { + "email": { "type": "string", "pattern": "^[^@]+@[^@]+$" }, "name": { "type": "string" }, - "state": { + "state": { "type": "string", - "enum": ["active", "blocked"] + "enum": ["active", "blocked"] }, "avatar_url": { "type": "string" }, "web_url": { "type": "string" }, @@ -54,18 +53,17 @@ "organization": { "type": ["string", "null"] }, "last_sign_in_at": { "type": "date" }, "confirmed_at": { "type": ["date", "null"] }, - "theme_id": { "type": "integer" }, "color_scheme_id": { "type": "integer" }, "projects_limit": { "type": "integer" }, "current_sign_in_at": { "type": "date" }, - "identities": { + "identities": { "type": "array", "items": { "type": "object", "properties": { - "provider": { + "provider": { "type": "string", - "enum": ["github", "bitbucket", "google_oauth2"] + "enum": ["github", "bitbucket", "google_oauth2"] }, "extern_uid": { "type": ["number", "string"] } } @@ -74,6 +72,6 @@ "can_create_group": { "type": "boolean" }, "can_create_project": { "type": "boolean" }, "two_factor_enabled": { "type": "boolean" }, - "external": { "type": "boolean" } + "external": { "type": "boolean" } } } diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 546efcfce97..584a4facd94 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -587,12 +587,11 @@ describe User, models: true do end describe 'with default overrides' do - let(:user) { User.new(projects_limit: 123, can_create_group: false, can_create_team: true, theme_id: 1) } + let(:user) { User.new(projects_limit: 123, can_create_group: false, can_create_team: true) } it "applies defaults to user" do expect(user.projects_limit).to eq(123) expect(user.can_create_group).to be_falsey - expect(user.theme_id).to eq(1) end end diff --git a/spec/support/gitlab_stubs/session.json b/spec/support/gitlab_stubs/session.json index ce8dfe5ae75..cd55d63125e 100644 --- a/spec/support/gitlab_stubs/session.json +++ b/spec/support/gitlab_stubs/session.json @@ -7,7 +7,7 @@ "skype":"aertert", "linkedin":"", "twitter":"", - "theme_id":2,"color_scheme_id":2, + "color_scheme_id":2, "state":"active", "created_at":"2012-12-21T13:02:20Z", "extern_uid":null, @@ -17,4 +17,4 @@ "can_create_project":false, "private_token":"Wvjy2Krpb7y8xi93owUz", "access_token":"Wvjy2Krpb7y8xi93owUz" -} \ No newline at end of file +} diff --git a/spec/support/gitlab_stubs/user.json b/spec/support/gitlab_stubs/user.json index ce8dfe5ae75..cd55d63125e 100644 --- a/spec/support/gitlab_stubs/user.json +++ b/spec/support/gitlab_stubs/user.json @@ -7,7 +7,7 @@ "skype":"aertert", "linkedin":"", "twitter":"", - "theme_id":2,"color_scheme_id":2, + "color_scheme_id":2, "state":"active", "created_at":"2012-12-21T13:02:20Z", "extern_uid":null, @@ -17,4 +17,4 @@ "can_create_project":false, "private_token":"Wvjy2Krpb7y8xi93owUz", "access_token":"Wvjy2Krpb7y8xi93owUz" -} \ No newline at end of file +} From 23035d90b708216e75fb993a1e48a0426ddacb89 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 16:16:03 -0600 Subject: [PATCH 245/313] Make active links bold; fix badge styling --- app/assets/stylesheets/framework/header.scss | 42 ++++++++++++++------ app/views/layouts/header/_default.html.haml | 11 +++-- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/app/assets/stylesheets/framework/header.scss b/app/assets/stylesheets/framework/header.scss index 2a6273f1301..044d3517650 100644 --- a/app/assets/stylesheets/framework/header.scss +++ b/app/assets/stylesheets/framework/header.scss @@ -100,24 +100,40 @@ header { } } } + } - .global-dropdown { - position: absolute; - left: -10px; + .global-dropdown { + position: absolute; + left: -10px; + + .badge { + font-size: 11px; } - .global-dropdown-toggle { - margin: 7px 0; - font-size: 18px; - padding: 6px 10px; - border: none; - background-color: $gray-light; - - &:hover { - background-color: $white-normal; - color: $gl-header-nav-hover-color; + li.active { + a { + font-weight: bold; } } + + li:hover { + .badge { + background-color: $white-light; + } + } + } + + .global-dropdown-toggle { + margin: 7px 0; + font-size: 18px; + padding: 6px 10px; + border: none; + background-color: $gray-light; + + &:hover { + background-color: $white-normal; + color: $gl-header-nav-hover-color; + } } .header-content { diff --git a/app/views/layouts/header/_default.html.haml b/app/views/layouts/header/_default.html.haml index ea56d92cf34..ddf50d6667f 100644 --- a/app/views/layouts/header/_default.html.haml +++ b/app/views/layouts/header/_default.html.haml @@ -6,12 +6,11 @@ %button.global-dropdown-toggle{ type: 'button', 'data-toggle' => 'dropdown' } %span.sr-only Toggle navigation = icon('bars') - .dropdown-menu-nav - %ul - - if current_user - = render 'layouts/nav/dashboard' - - else - = render 'layouts/nav/explore' + .dropdown-menu-nav.global-dropdown-menu + - if current_user + = render 'layouts/nav/dashboard' + - else + = render 'layouts/nav/explore' %button.navbar-toggle{ type: 'button' } %span.sr-only Toggle navigation = icon('ellipsis-v') From 2fc559142e00cc15a47c49c190666284221cc9b0 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Mon, 13 Feb 2017 18:37:26 -0600 Subject: [PATCH 246/313] Fix active_tab and issuables_counter specs --- spec/features/dashboard/active_tab_spec.rb | 7 ++++--- spec/features/dashboard/issuables_counter_spec.rb | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/spec/features/dashboard/active_tab_spec.rb b/spec/features/dashboard/active_tab_spec.rb index 7d59fcac517..ae750be4d4a 100644 --- a/spec/features/dashboard/active_tab_spec.rb +++ b/spec/features/dashboard/active_tab_spec.rb @@ -1,14 +1,15 @@ require 'spec_helper' -RSpec.describe 'Dashboard Active Tab', feature: true do +RSpec.describe 'Dashboard Active Tab', js: true, feature: true do before do login_as :user end shared_examples 'page has active tab' do |title| it "#{title} tab" do - expect(page).to have_selector('.nav-sidebar li.active', count: 1) - expect(find('.nav-sidebar li.active')).to have_content(title) + find('.global-dropdown-toggle').trigger('click') + expect(page).to have_selector('.global-dropdown-menu li.active', count: 1) + expect(find('.global-dropdown-menu li.active')).to have_content(title) end end diff --git a/spec/features/dashboard/issuables_counter_spec.rb b/spec/features/dashboard/issuables_counter_spec.rb index 41dcfe439c2..603076d7d37 100644 --- a/spec/features/dashboard/issuables_counter_spec.rb +++ b/spec/features/dashboard/issuables_counter_spec.rb @@ -36,7 +36,8 @@ describe 'Navigation bar counter', feature: true, js: true, caching: true do def expect_counters(issuable_type, count) dashboard_count = find('li.active span.badge') - nav_count = find(".dashboard-shortcuts-#{issuable_type} span.count") + find('.global-dropdown-toggle').click + nav_count = find(".dashboard-shortcuts-#{issuable_type} span.badge") expect(nav_count).to have_content(count) expect(dashboard_count).to have_content(count) From 8c1b41f12b5ec8dd3dd2547d3ad729e71c4ebadd Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Tue, 14 Feb 2017 12:27:47 -0600 Subject: [PATCH 247/313] Move migration to post_migrate; fix shortcuts_spec --- .../20170213172852_remove_theme_id_from_users.rb | 2 +- spec/features/dashboard/shortcuts_spec.rb | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) rename db/{migrate => post_migrate}/20170213172852_remove_theme_id_from_users.rb (98%) diff --git a/db/migrate/20170213172852_remove_theme_id_from_users.rb b/db/post_migrate/20170213172852_remove_theme_id_from_users.rb similarity index 98% rename from db/migrate/20170213172852_remove_theme_id_from_users.rb rename to db/post_migrate/20170213172852_remove_theme_id_from_users.rb index cd6388ab7d2..857f678ad0e 100644 --- a/db/migrate/20170213172852_remove_theme_id_from_users.rb +++ b/db/post_migrate/20170213172852_remove_theme_id_from_users.rb @@ -5,7 +5,7 @@ class RemoveThemeIdFromUsers < ActiveRecord::Migration include Gitlab::Database::MigrationHelpers # Set this constant to true if this migration requires downtime. - DOWNTIME = true + DOWNTIME = false # When a migration requires downtime you **must** uncomment the following # constant and define a short and easy to understand explanation as to why the diff --git a/spec/features/dashboard/shortcuts_spec.rb b/spec/features/dashboard/shortcuts_spec.rb index d9be4e5dbdd..c5a0d1c6d99 100644 --- a/spec/features/dashboard/shortcuts_spec.rb +++ b/spec/features/dashboard/shortcuts_spec.rb @@ -24,6 +24,7 @@ feature 'Dashboard shortcuts', feature: true, js: true do end def ensure_active_main_tab(content) - expect(find('.nav-sidebar li.active')).to have_content(content) + find('.global-dropdown-toggle').trigger('click') + expect(find('.global-dropdown-menu li.active')).to have_content(content) end end From f1710bd131a040ef9104a1ff1a804b35c9568550 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Tue, 14 Feb 2017 17:43:03 -0600 Subject: [PATCH 248/313] Delete sidebar specs and fixtures; update shortcuts_spec to check page title --- spec/features/dashboard/shortcuts_spec.rb | 11 ++- spec/javascripts/dashboard_spec.js.es6 | 37 -------- spec/javascripts/fixtures/dashboard.html.haml | 45 ---------- .../javascripts/project_dashboard_spec.js.es6 | 86 ------------------- 4 files changed, 5 insertions(+), 174 deletions(-) delete mode 100644 spec/javascripts/dashboard_spec.js.es6 delete mode 100644 spec/javascripts/fixtures/dashboard.html.haml delete mode 100644 spec/javascripts/project_dashboard_spec.js.es6 diff --git a/spec/features/dashboard/shortcuts_spec.rb b/spec/features/dashboard/shortcuts_spec.rb index c5a0d1c6d99..62a2c54c94c 100644 --- a/spec/features/dashboard/shortcuts_spec.rb +++ b/spec/features/dashboard/shortcuts_spec.rb @@ -10,21 +10,20 @@ feature 'Dashboard shortcuts', feature: true, js: true do find('body').native.send_key('g') find('body').native.send_key('p') - ensure_active_main_tab('Projects') + check_page_title('Projects') find('body').native.send_key('g') find('body').native.send_key('i') - ensure_active_main_tab('Issues') + check_page_title('Issues') find('body').native.send_key('g') find('body').native.send_key('m') - ensure_active_main_tab('Merge Requests') + check_page_title('Merge Requests') end - def ensure_active_main_tab(content) - find('.global-dropdown-toggle').trigger('click') - expect(find('.global-dropdown-menu li.active')).to have_content(content) + def check_page_title(title) + expect(find('.header-content .title')).to have_content(title) end end diff --git a/spec/javascripts/dashboard_spec.js.es6 b/spec/javascripts/dashboard_spec.js.es6 deleted file mode 100644 index c0bdb89ed63..00000000000 --- a/spec/javascripts/dashboard_spec.js.es6 +++ /dev/null @@ -1,37 +0,0 @@ -/* eslint-disable no-new */ - -require('~/sidebar'); -require('~/lib/utils/text_utility'); - -((global) => { - describe('Dashboard', () => { - const fixtureTemplate = 'static/dashboard.html.raw'; - - function todosCountText() { - return $('.js-todos-count').text(); - } - - function triggerToggle(newCount) { - $(document).trigger('todo:toggle', newCount); - } - - preloadFixtures(fixtureTemplate); - beforeEach(() => { - loadFixtures(fixtureTemplate); - new global.Sidebar(); - }); - - it('should update todos-count after receiving the todo:toggle event', () => { - triggerToggle(5); - expect(todosCountText()).toEqual('5'); - }); - - it('should display todos-count with delimiter', () => { - triggerToggle(1000); - expect(todosCountText()).toEqual('1,000'); - - triggerToggle(1000000); - expect(todosCountText()).toEqual('1,000,000'); - }); - }); -})(window.gl); diff --git a/spec/javascripts/fixtures/dashboard.html.haml b/spec/javascripts/fixtures/dashboard.html.haml deleted file mode 100644 index 32446acfd60..00000000000 --- a/spec/javascripts/fixtures/dashboard.html.haml +++ /dev/null @@ -1,45 +0,0 @@ -%ul.nav.nav-sidebar - %li.home.active - %a.dashboard-shortcuts-projects - %span - Projects - %li - %a - %span - Todos - %span.count.js-todos-count - 1 - %li - %a.dashboard-shortcuts-activity - %span - Activity - %li - %a - %span - Groups - %li - %a - %span - Milestones - %li - %a.dashboard-shortcuts-issues - %span - Issues - %span - 1 - %li - %a.dashboard-shortcuts-merge_requests - %span - Merge Requests - %li - %a - %span - Snippets - %li - %a - %span - Help - %li - %a - %span - Profile Settings diff --git a/spec/javascripts/project_dashboard_spec.js.es6 b/spec/javascripts/project_dashboard_spec.js.es6 deleted file mode 100644 index 24833b4eb57..00000000000 --- a/spec/javascripts/project_dashboard_spec.js.es6 +++ /dev/null @@ -1,86 +0,0 @@ -require('~/sidebar'); - -(() => { - describe('Project dashboard page', () => { - let $pageWithSidebar = null; - let $sidebarToggle = null; - let sidebar = null; - const fixtureTemplate = 'projects/dashboard.html.raw'; - - const assertSidebarStateExpanded = (shouldBeExpanded) => { - expect(sidebar.isExpanded).toBe(shouldBeExpanded); - expect($pageWithSidebar.hasClass('page-sidebar-expanded')).toBe(shouldBeExpanded); - }; - - preloadFixtures(fixtureTemplate); - beforeEach(() => { - loadFixtures(fixtureTemplate); - - $pageWithSidebar = $('.page-with-sidebar'); - $sidebarToggle = $('.toggle-nav-collapse'); - - // otherwise instantiating the Sidebar for the second time - // won't do anything, as the Sidebar is a singleton class - gl.Sidebar.singleton = null; - sidebar = new gl.Sidebar(); - }); - - it('can show the sidebar when the toggler is clicked', () => { - assertSidebarStateExpanded(false); - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - }); - - it('should dismiss the sidebar when clone button clicked', () => { - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - - const cloneButton = $('.project-clone-holder a.clone-dropdown-btn'); - cloneButton.click(); - assertSidebarStateExpanded(false); - }); - - it('should dismiss the sidebar when download button clicked', () => { - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - - const downloadButton = $('.project-action-button .btn:has(i.fa-download)'); - downloadButton.click(); - assertSidebarStateExpanded(false); - }); - - it('should dismiss the sidebar when add button clicked', () => { - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - - const addButton = $('.project-action-button .btn:has(i.fa-plus)'); - addButton.click(); - assertSidebarStateExpanded(false); - }); - - it('should dismiss the sidebar when notification button clicked', () => { - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - - const notifButton = $('.js-notification-toggle-btns .notifications-btn'); - notifButton.click(); - assertSidebarStateExpanded(false); - }); - - it('should dismiss the sidebar when clicking on the body', () => { - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - - $('body').click(); - assertSidebarStateExpanded(false); - }); - - it('should dismiss the sidebar when clicking on the project description header', () => { - $sidebarToggle.click(); - assertSidebarStateExpanded(true); - - $('.project-home-panel').click(); - assertSidebarStateExpanded(false); - }); - }); -})(); From ee63415c741b7c5f061f79212c74564b2ddb01a6 Mon Sep 17 00:00:00 2001 From: Annabel Dunstone Gray Date: Wed, 15 Feb 2017 13:17:14 -0600 Subject: [PATCH 249/313] Delete labels spinach test bc covered by rspec --- features/project/labels.feature | 15 --------------- features/steps/project/labels.rb | 32 -------------------------------- 2 files changed, 47 deletions(-) delete mode 100644 features/project/labels.feature delete mode 100644 features/steps/project/labels.rb diff --git a/features/project/labels.feature b/features/project/labels.feature deleted file mode 100644 index 955bc3d8b1b..00000000000 --- a/features/project/labels.feature +++ /dev/null @@ -1,15 +0,0 @@ -@labels -Feature: Labels - Background: - Given I sign in as a user - And I own project "Shop" - And project "Shop" has labels: "bug", "feature", "enhancement" - When I visit project "Shop" labels page - - @javascript - Scenario: I can subscribe to a label - Then I should see that I am not subscribed to the "bug" label - When I click button "Subscribe" for the "bug" label - Then I should see that I am subscribed to the "bug" label - When I click button "Unsubscribe" for the "bug" label - Then I should see that I am not subscribed to the "bug" label diff --git a/features/steps/project/labels.rb b/features/steps/project/labels.rb deleted file mode 100644 index dbeb07c78db..00000000000 --- a/features/steps/project/labels.rb +++ /dev/null @@ -1,32 +0,0 @@ -class Spinach::Features::Labels < Spinach::FeatureSteps - include SharedAuthentication - include SharedIssuable - include SharedProject - include SharedPaths - - step 'And I visit project "Shop" labels page' do - visit namespace_project_labels_path(project.namespace, project) - end - - step 'I should see that I am subscribed to the "bug" label' do - expect(subscribe_button).to have_content 'Unsubscribe' - end - - step 'I should see that I am not subscribed to the "bug" label' do - expect(subscribe_button).to have_content 'Subscribe' - end - - step 'I click button "Unsubscribe" for the "bug" label' do - subscribe_button.click - end - - step 'I click button "Subscribe" for the "bug" label' do - subscribe_button.click - end - - private - - def subscribe_button - first('.js-subscribe-button', visible: true) - end -end From 7d0bd32ec75615ba75f1f1e15dc229064c4a0ee2 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 15 Feb 2017 20:32:18 +0100 Subject: [PATCH 250/313] Remove legacy GitlabCi module from initializers --- config/initializers/4_ci_app.rb | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 config/initializers/4_ci_app.rb diff --git a/config/initializers/4_ci_app.rb b/config/initializers/4_ci_app.rb deleted file mode 100644 index d252e403102..00000000000 --- a/config/initializers/4_ci_app.rb +++ /dev/null @@ -1,8 +0,0 @@ -module GitlabCi - VERSION = Gitlab::VERSION - REVISION = Gitlab::REVISION - - def self.config - Settings - end -end From 679ce9dbb35021bec3bc048948e471ba3989e518 Mon Sep 17 00:00:00 2001 From: Simon Knox Date: Thu, 16 Feb 2017 06:55:52 +1100 Subject: [PATCH 251/313] dev favicon is blue, not purple --- .../images/{favicon-purple.ico => favicon-blue.ico} | Bin app/helpers/page_layout_helper.rb | 2 +- spec/helpers/page_layout_helper_spec.rb | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) rename app/assets/images/{favicon-purple.ico => favicon-blue.ico} (100%) diff --git a/app/assets/images/favicon-purple.ico b/app/assets/images/favicon-blue.ico similarity index 100% rename from app/assets/images/favicon-purple.ico rename to app/assets/images/favicon-blue.ico diff --git a/app/helpers/page_layout_helper.rb b/app/helpers/page_layout_helper.rb index aee8099aeb2..3286a92a8a7 100644 --- a/app/helpers/page_layout_helper.rb +++ b/app/helpers/page_layout_helper.rb @@ -35,7 +35,7 @@ module PageLayoutHelper end def favicon - Rails.env.development? ? 'favicon-purple.ico' : 'favicon.ico' + Rails.env.development? ? 'favicon-blue.ico' : 'favicon.ico' end def page_image diff --git a/spec/helpers/page_layout_helper_spec.rb b/spec/helpers/page_layout_helper_spec.rb index 872679a6ce3..2cc0b40b2d0 100644 --- a/spec/helpers/page_layout_helper_spec.rb +++ b/spec/helpers/page_layout_helper_spec.rb @@ -46,9 +46,9 @@ describe PageLayoutHelper do expect(helper.favicon).to eq 'favicon.ico' end - it 'has purple favicon for development' do + it 'has blue favicon for development' do allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new('development')) - expect(helper.favicon).to eq 'favicon-purple.ico' + expect(helper.favicon).to eq 'favicon-blue.ico' end end From 7af6982e5fcf2b76906f33d5046dd9b2298ac32c Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Sun, 12 Feb 2017 14:40:11 +0000 Subject: [PATCH 252/313] Extracts table into a reusable component --- .../components/environment.js.es6 | 37 +++------- .../components/environments_table.js.es6 | 74 +++++++++++++++++++ .../folder/environments_folder_bundle.js.es6 | 0 .../folder/environments_folder_view.js.es6 | 0 .../projects/environments/folder.html.haml | 0 5 files changed, 85 insertions(+), 26 deletions(-) create mode 100644 app/assets/javascripts/environments/components/environments_table.js.es6 create mode 100644 app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 create mode 100644 app/assets/javascripts/environments/folder/environments_folder_view.js.es6 create mode 100644 app/views/projects/environments/folder.html.haml diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6 index 6d9599e7645..42f74e114c9 100644 --- a/app/assets/javascripts/environments/components/environment.js.es6 +++ b/app/assets/javascripts/environments/components/environment.js.es6 @@ -4,14 +4,14 @@ const Vue = require('vue'); Vue.use(require('vue-resource')); const EnvironmentsService = require('../services/environments_service'); -const EnvironmentItem = require('./environment_item'); +const EnvironmentTable = require('./environments_table'); const Store = require('../stores/environments_store'); require('../../vue_shared/components/table_pagination'); module.exports = Vue.component('environment-component', { components: { - 'environment-item': EnvironmentItem, + 'environment-table': EnvironmentTable, 'table-pagination': gl.VueGlPagination, }, @@ -209,30 +209,15 @@ module.exports = Vue.component('environment-component', {
- - - - - - - - - - - - - - -
EnvironmentLast deploymentJobCommitUpdated
+ + + ([]), + }, + + canReadEnvironment: { + type: Boolean, + required: false, + default: false, + }, + + canCreateDeployment: { + type: Boolean, + required: false, + default: false, + }, + + commitIconSvg: { + type: String, + required: false, + }, + + playIconSvg: { + type: String, + required: false, + }, + + terminalIconSvg: { + type: String, + required: false, + }, + }, + + template: ` + + + + + + + + + + + + + + +
EnvironmentLast deploymentJobCommitUpdated
+ `, +}); diff --git a/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 b/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 b/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/app/views/projects/environments/folder.html.haml b/app/views/projects/environments/folder.html.haml new file mode 100644 index 00000000000..e69de29bb2d From 26d18387dea786ded85df3a429542c5d1e4f1ac1 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Sun, 12 Feb 2017 14:55:18 +0000 Subject: [PATCH 253/313] First iteration --- .../folder/environments_folder_bundle.js.es6 | 14 ++ .../folder/environments_folder_view.js.es6 | 196 ++++++++++++++++++ .../stores/environments_folder_store.js.es6 | 49 +++++ .../projects/environments/folder.html.haml | 8 + config/webpack.config.js | 1 + 5 files changed, 268 insertions(+) create mode 100644 app/assets/javascripts/environments/stores/environments_folder_store.js.es6 diff --git a/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 b/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 index e69de29bb2d..9cc1c2f4f18 100644 --- a/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 +++ b/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 @@ -0,0 +1,14 @@ +const EnvironmentsFolderComponent = require('./environments_folder_view'); +require('../vue_shared/vue_resource_interceptor'); + +$(() => { + window.gl = window.gl || {}; + + if (gl.EnvironmentsListFolderApp) { + gl.EnvironmentsListFolderApp.$destroy(true); + } + + gl.EnvironmentsListFolderApp = new EnvironmentsFolderComponent({ + el: document.querySelector('#environments-folder-list-view'), + }); +}); diff --git a/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 b/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 index e69de29bb2d..070bc84bbe3 100644 --- a/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 +++ b/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 @@ -0,0 +1,196 @@ +/* eslint-disable no-param-reassign, no-new */ +/* global Flash */ + +const Vue = require('vue'); +Vue.use(require('vue-resource')); +const EnvironmentsService = require('../services/environments_service'); +const EnvironmentTable = require('./environments_table'); +const Store = require('../stores/environments_folder_store'); +require('../../vue_shared/components/table_pagination'); + +module.exports = Vue.component('environment-folder-view', { + + components: { + 'environment-table': EnvironmentTable, + 'table-pagination': gl.VueGlPagination, + }, + + props: { + endpoint: { + type: String, + required: true, + default: '', + }, + + folderName: { + type: String, + required: true, + default: '', + }, + }, + + data() { + const store = new Store(); + + return { + store, + state: store.state, + isLoading: false, + + // Pagination Properties, + paginationInformation: {}, + pageNumber: 1, + }; + }, + + /** + * Fetches all the environments and stores them. + * Toggles loading property. + */ + created() { + const scope = this.$options.getQueryParameter('scope') || this.visibility; + const pageNumber = this.$options.getQueryParameter('page') || this.pageNumber; + + const endpoint = `${this.endpoint}?scope=${scope}&page=${pageNumber}`; + + const service = new EnvironmentsService(endpoint); + + this.isLoading = true; + + return service.all() + .then(resp => ({ + headers: resp.headers, + body: resp.json(), + })) + .then((response) => { + this.store.storeEnvironments(response.body.environments); + this.store.storePagination(response.headers); + }) + .then(() => { + this.isLoading = false; + }) + .catch(() => { + this.isLoading = false; + new Flash('An error occurred while fetching the environments.', 'alert'); + }); + }, + + /** + * Transforms the url parameter into an object and + * returns the one requested. + * + * @param {String} param + * @returns {String} The value of the requested parameter. + */ + getQueryParameter(parameter) { + return window.location.search.substring(1).split('&').reduce((acc, param) => { + const paramSplited = param.split('='); + acc[paramSplited[0]] = paramSplited[1]; + return acc; + }, {})[parameter]; + }, + + methods: { + /** + * Will change the page number and update the URL. + * + * If no search params are present, we'll add param for page + * If param for page is already present, we'll update it + * If there are params but none for page, we'll add it at the end. + * + * @param {Number} pageNumber desired page to go to. + */ + changePage(pageNumber) { + let param; + if (window.location.search.length === 0) { + param = `?page=${pageNumber}`; + } + + if (window.location.search.indexOf('page') !== -1) { + param = window.location.search.replace(/page=\d/g, `page=${pageNumber}`); + } + + if (window.location.search.length && + window.location.search.indexOf('page') === -1) { + param = `${window.location.search}&page=${pageNumber}`; + } + + gl.utils.visitUrl(param); + return param; + }, + }, + + template: ` +
+ + +
+
+ +
+ +
+

+ You don't have any environments right now. +

+

+ Environments are places where code gets deployed, such as staging or production. +
+ + Read more about environments + +

+ + + New Environment + +
+ +
+ + + + + + +
+
+
+ `, +}); diff --git a/app/assets/javascripts/environments/stores/environments_folder_store.js.es6 b/app/assets/javascripts/environments/stores/environments_folder_store.js.es6 new file mode 100644 index 00000000000..005ed52d9a1 --- /dev/null +++ b/app/assets/javascripts/environments/stores/environments_folder_store.js.es6 @@ -0,0 +1,49 @@ +require('~/lib/utils/common_utils'); +/** + * Environments Folder Store. + * + * Stores received environments that belong to a parent store. + */ +class EnvironmentsFolderStore { + constructor() { + this.state = {}; + this.state.environments = []; + this.state.paginationInformation = {}; + + return this; + } + + /** + * + * Stores the received environments. + * + * Each environment has the following schema + * { name: String, size: Number, latest: Object } + * + * + * @param {Array} environments + * @returns {Array} + */ + storeEnvironments(environments = []) { + this.state.environments = environments; + + return environments; + } + + storePagination(pagination = {}) { + const normalizedHeaders = gl.utils.normalizeHeaders(pagination); + const paginationInformation = { + perPage: parseInt(normalizedHeaders['X-PER-PAGE'], 10), + page: parseInt(normalizedHeaders['X-PAGE'], 10), + total: parseInt(normalizedHeaders['X-TOTAL'], 10), + totalPages: parseInt(normalizedHeaders['X-TOTAL-PAGES'], 10), + nextPage: parseInt(normalizedHeaders['X-NEXT-PAGE'], 10), + previousPage: parseInt(normalizedHeaders['X-PREV-PAGE'], 10), + }; + + this.state.paginationInformation = paginationInformation; + return paginationInformation; + } +} + +module.exports = EnvironmentsFolderStore; diff --git a/app/views/projects/environments/folder.html.haml b/app/views/projects/environments/folder.html.haml index e69de29bb2d..452d32fc8b6 100644 --- a/app/views/projects/environments/folder.html.haml +++ b/app/views/projects/environments/folder.html.haml @@ -0,0 +1,8 @@ +- @no_container = true +- page_title "Environments" += render "projects/pipelines/head" + +- content_for :page_specific_javascripts do + = page_specific_javascript_bundle_tag("environments_folder") + +#environments-folder-list-view diff --git a/config/webpack.config.js b/config/webpack.config.js index 00f448c1fbb..7fda5405ea2 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -22,6 +22,7 @@ var config = { commit_pipelines: './commit/pipelines/pipelines_bundle.js', diff_notes: './diff_notes/diff_notes_bundle.js', environments: './environments/environments_bundle.js', + environments_folder: './environments/folder/environments_folder_bundle.js', filtered_search: './filtered_search/filtered_search_bundle.js', graphs: './graphs/graphs_bundle.js', issuable: './issuable/issuable_bundle.js', From 082348491360d51ffaa737e3f266c4d1d6bdd946 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Sun, 12 Feb 2017 16:58:53 +0000 Subject: [PATCH 254/313] Adds url for folder; Creates new subview to show envirnoments that belong to a folder --- .../components/environment_item.js.es6 | 12 ++- .../folder/environments_folder_bundle.js.es6 | 1 - .../folder/environments_folder_view.js.es6 | 86 +++++++++---------- .../stores/environments_folder_store.js.es6 | 49 ----------- .../projects/environments/folder.html.haml | 7 +- 5 files changed, 59 insertions(+), 96 deletions(-) delete mode 100644 app/assets/javascripts/environments/stores/environments_folder_store.js.es6 diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6 index fc45c3c5f53..e40c97130ad 100644 --- a/app/assets/javascripts/environments/components/environment_item.js.es6 +++ b/app/assets/javascripts/environments/components/environment_item.js.es6 @@ -407,6 +407,16 @@ module.exports = Vue.component('environment-item', { return ''; }, + + /** + * Constructs folder URL based on the current location and the folder id. + * + * @return {String} + */ + folderUrl() { + return `${window.location.pathname}/folders/${this.model.latest.id}`; + }, + }, /** @@ -432,7 +442,7 @@ module.exports = Vue.component('environment-item', { :href="environmentPath"> {{model.name}} - + diff --git a/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 b/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 index 9cc1c2f4f18..d2ca465351a 100644 --- a/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 +++ b/app/assets/javascripts/environments/folder/environments_folder_bundle.js.es6 @@ -1,5 +1,4 @@ const EnvironmentsFolderComponent = require('./environments_folder_view'); -require('../vue_shared/vue_resource_interceptor'); $(() => { window.gl = window.gl || {}; diff --git a/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 b/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 index 070bc84bbe3..83643161056 100644 --- a/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 +++ b/app/assets/javascripts/environments/folder/environments_folder_view.js.es6 @@ -4,9 +4,8 @@ const Vue = require('vue'); Vue.use(require('vue-resource')); const EnvironmentsService = require('../services/environments_service'); -const EnvironmentTable = require('./environments_table'); -const Store = require('../stores/environments_folder_store'); -require('../../vue_shared/components/table_pagination'); +const EnvironmentTable = require('../components/environments_table'); +const Store = require('../stores/environments_store'); module.exports = Vue.component('environment-folder-view', { @@ -15,27 +14,25 @@ module.exports = Vue.component('environment-folder-view', { 'table-pagination': gl.VueGlPagination, }, - props: { - endpoint: { - type: String, - required: true, - default: '', - }, - - folderName: { - type: String, - required: true, - default: '', - }, - }, - data() { + const environmentsData = document.querySelector('#environments-folder-list-view').dataset; const store = new Store(); + const endpoint = `${window.location.pathname}.json`; return { store, + endpoint, state: store.state, + visibility: 'available', isLoading: false, + cssContainerClass: environmentsData.cssClass, + canCreateDeployment: environmentsData.canCreateDeployment, + canReadEnvironment: environmentsData.canReadEnvironment, + + // svgs + commitIconSvg: environmentsData.commitIconSvg, + playIconSvg: environmentsData.playIconSvg, + terminalIconSvg: environmentsData.terminalIconSvg, // Pagination Properties, paginationInformation: {}, @@ -43,6 +40,29 @@ module.exports = Vue.component('environment-folder-view', { }; }, + computed: { + scope() { + return this.$options.getQueryParameter('scope'); + }, + + canReadEnvironmentParsed() { + return this.$options.convertPermissionToBoolean(this.canReadEnvironment); + }, + + canCreateDeploymentParsed() { + return this.$options.convertPermissionToBoolean(this.canCreateDeployment); + }, + + stoppedPath() { + return `${window.location.pathname}?scope=stopped`; + }, + + availablePath() { + return window.location.pathname; + }, + + }, + /** * Fetches all the environments and stores them. * Toggles loading property. @@ -123,9 +143,12 @@ module.exports = Vue.component('environment-folder-view', { template: `
@@ -153,26 +171,6 @@ module.exports = Vue.component('environment-folder-view', {
-
-

- You don't have any environments right now. -

-

- Environments are places where code gets deployed, such as staging or production. -
- - Read more about environments - -

- - - New Environment - -
-
diff --git a/app/assets/javascripts/environments/stores/environments_folder_store.js.es6 b/app/assets/javascripts/environments/stores/environments_folder_store.js.es6 deleted file mode 100644 index 005ed52d9a1..00000000000 --- a/app/assets/javascripts/environments/stores/environments_folder_store.js.es6 +++ /dev/null @@ -1,49 +0,0 @@ -require('~/lib/utils/common_utils'); -/** - * Environments Folder Store. - * - * Stores received environments that belong to a parent store. - */ -class EnvironmentsFolderStore { - constructor() { - this.state = {}; - this.state.environments = []; - this.state.paginationInformation = {}; - - return this; - } - - /** - * - * Stores the received environments. - * - * Each environment has the following schema - * { name: String, size: Number, latest: Object } - * - * - * @param {Array} environments - * @returns {Array} - */ - storeEnvironments(environments = []) { - this.state.environments = environments; - - return environments; - } - - storePagination(pagination = {}) { - const normalizedHeaders = gl.utils.normalizeHeaders(pagination); - const paginationInformation = { - perPage: parseInt(normalizedHeaders['X-PER-PAGE'], 10), - page: parseInt(normalizedHeaders['X-PAGE'], 10), - total: parseInt(normalizedHeaders['X-TOTAL'], 10), - totalPages: parseInt(normalizedHeaders['X-TOTAL-PAGES'], 10), - nextPage: parseInt(normalizedHeaders['X-NEXT-PAGE'], 10), - previousPage: parseInt(normalizedHeaders['X-PREV-PAGE'], 10), - }; - - this.state.paginationInformation = paginationInformation; - return paginationInformation; - } -} - -module.exports = EnvironmentsFolderStore; diff --git a/app/views/projects/environments/folder.html.haml b/app/views/projects/environments/folder.html.haml index 452d32fc8b6..d9cb7bc0331 100644 --- a/app/views/projects/environments/folder.html.haml +++ b/app/views/projects/environments/folder.html.haml @@ -5,4 +5,9 @@ - content_for :page_specific_javascripts do = page_specific_javascript_bundle_tag("environments_folder") -#environments-folder-list-view +#environments-folder-list-view{ data: { "can-create-deployment" => can?(current_user, :create_deployment, @project).to_s, + "can-read-environment" => can?(current_user, :read_environment, @project).to_s, + "css-class" => container_class, + "commit-icon-svg" => custom_icon("icon_commit"), + "terminal-icon-svg" => custom_icon("icon_terminal"), + "play-icon-svg" => custom_icon("icon_play") } } From 17897c37f806e593359239ba09667081b88cb24b Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 13 Feb 2017 14:41:50 +0000 Subject: [PATCH 255/313] Fix underline style --- app/assets/stylesheets/pages/environments.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/pages/environments.scss b/app/assets/stylesheets/pages/environments.scss index 606cf501b82..2f4a3c80aeb 100644 --- a/app/assets/stylesheets/pages/environments.scss +++ b/app/assets/stylesheets/pages/environments.scss @@ -122,6 +122,7 @@ .folder-name { cursor: pointer; color: $gl-text-color-secondary; + display: inline-block; } } From 73accafe430f56cd3065774c6118de3db0a45734 Mon Sep 17 00:00:00 2001 From: Filipa Lacerda Date: Mon, 13 Feb 2017 14:49:19 +0000 Subject: [PATCH 256/313] Use common util to get parameter name --- .../components/environment.js.es6 | 24 ++++--------------- .../folder/environments_folder_view.js.es6 | 7 +++--- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/app/assets/javascripts/environments/components/environment.js.es6 b/app/assets/javascripts/environments/components/environment.js.es6 index 42f74e114c9..2cbfbcad023 100644 --- a/app/assets/javascripts/environments/components/environment.js.es6 +++ b/app/assets/javascripts/environments/components/environment.js.es6 @@ -7,6 +7,7 @@ const EnvironmentsService = require('../services/environments_service'); const EnvironmentTable = require('./environments_table'); const Store = require('../stores/environments_store'); require('../../vue_shared/components/table_pagination'); +require('../../lib/utils/common_utils'); module.exports = Vue.component('environment-component', { @@ -45,7 +46,7 @@ module.exports = Vue.component('environment-component', { computed: { scope() { - return this.$options.getQueryParameter('scope'); + return gl.utils.getParameterByName('scope'); }, canReadEnvironmentParsed() { @@ -67,8 +68,8 @@ module.exports = Vue.component('environment-component', { * Toggles loading property. */ created() { - const scope = this.$options.getQueryParameter('scope') || this.visibility; - const pageNumber = this.$options.getQueryParameter('page') || this.pageNumber; + const scope = gl.utils.getParameterByName('scope') || this.visibility; + const pageNumber = gl.utils.getParameterByName('page') || this.pageNumber; const endpoint = `${this.endpoint}?scope=${scope}&page=${pageNumber}`; @@ -96,21 +97,6 @@ module.exports = Vue.component('environment-component', { }); }, - /** - * Transforms the url parameter into an object and - * returns the one requested. - * - * @param {String} param - * @returns {String} The value of the requested parameter. - */ - getQueryParameter(parameter) { - return window.location.search.substring(1).split('&').reduce((acc, param) => { - const paramSplited = param.split('='); - acc[paramSplited[0]] = paramSplited[1]; - return acc; - }, {})[parameter]; - }, - /** * Converts permission provided as strings to booleans. * @param {String} string @@ -158,7 +144,7 @@ module.exports = Vue.component('environment-component', {