Commit 3555035c authored by GitLab Bot's avatar GitLab Bot

Merge remote-tracking branch 'upstream/master' into ce-to-ee-2018-06-12

# Conflicts:
#	Gemfile.rails5.lock
#	doc/ci/variables/README.md
#	locale/gitlab.pot

[ci skip]
parents 13a8ad60 10a190db
...@@ -550,6 +550,7 @@ setup-test-env: ...@@ -550,6 +550,7 @@ setup-test-env:
script: script:
- bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init' - bundle exec ruby -Ispec -e 'require "spec_helper" ; TestEnv.init'
- scripts/gitaly-test-build # Do not use 'bundle exec' here - scripts/gitaly-test-build # Do not use 'bundle exec' here
- BUNDLE_GEMFILE=Gemfile.rails5 bundle install $BUNDLE_INSTALL_FLAGS
artifacts: artifacts:
expire_in: 7d expire_in: 7d
paths: paths:
...@@ -743,6 +744,12 @@ downtime_check: ...@@ -743,6 +744,12 @@ downtime_check:
- /(^docs[\/-].*|.*-docs$)/ - /(^docs[\/-].*|.*-docs$)/
- /(^qa[\/-].*|.*-qa$)/ - /(^qa[\/-].*|.*-qa$)/
rails5_gemfile_lock_check:
<<: *dedicated-no-docs-no-db-pull-cache-job
<<: *except-docs-and-qa
script:
- scripts/rails5-gemfile-lock-check
ee_compat_check: ee_compat_check:
<<: *rake-exec <<: *rake-exec
except: except:
......
...@@ -320,7 +320,7 @@ GEM ...@@ -320,7 +320,7 @@ GEM
flowdock (~> 0.7) flowdock (~> 0.7)
gitlab-grit (>= 2.4.1) gitlab-grit (>= 2.4.1)
multi_json multi_json
gitlab-gollum-lib (4.2.7.2) gitlab-gollum-lib (4.2.7.4)
gemojione (~> 3.2) gemojione (~> 3.2)
github-markup (~> 1.6) github-markup (~> 1.6)
gollum-grit_adapter (~> 1.0) gollum-grit_adapter (~> 1.0)
...@@ -328,7 +328,7 @@ GEM ...@@ -328,7 +328,7 @@ GEM
rouge (~> 3.1) rouge (~> 3.1)
sanitize (~> 2.1) sanitize (~> 2.1)
stringex (~> 2.6) stringex (~> 2.6)
gitlab-gollum-rugged_adapter (0.4.4) gitlab-gollum-rugged_adapter (0.4.4.1)
mime-types (>= 1.15) mime-types (>= 1.15)
rugged (~> 0.25) rugged (~> 0.25)
gitlab-grit (2.8.2) gitlab-grit (2.8.2)
......
...@@ -339,8 +339,12 @@ GEM ...@@ -339,8 +339,12 @@ GEM
diff-lcs (~> 1.1) diff-lcs (~> 1.1)
mime-types (>= 1.16) mime-types (>= 1.16)
posix-spawn (~> 0.3) posix-spawn (~> 0.3)
<<<<<<< HEAD
gitlab-license (1.0.0) gitlab-license (1.0.0)
gitlab-markup (1.6.3) gitlab-markup (1.6.3)
=======
gitlab-markup (1.6.4)
>>>>>>> upstream/master
gitlab-styles (2.3.2) gitlab-styles (2.3.2)
rubocop (~> 0.51) rubocop (~> 0.51)
rubocop-gitlab-security (~> 0.1.0) rubocop-gitlab-security (~> 0.1.0)
...@@ -780,36 +784,36 @@ GEM ...@@ -780,36 +784,36 @@ GEM
chunky_png chunky_png
rqrcode-rails3 (0.1.7) rqrcode-rails3 (0.1.7)
rqrcode (>= 0.4.2) rqrcode (>= 0.4.2)
rspec (3.6.0) rspec (3.7.0)
rspec-core (~> 3.6.0) rspec-core (~> 3.7.0)
rspec-expectations (~> 3.6.0) rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.6.0) rspec-mocks (~> 3.7.0)
rspec-core (3.6.0) rspec-core (3.7.1)
rspec-support (~> 3.6.0) rspec-support (~> 3.7.0)
rspec-expectations (3.6.0) rspec-expectations (3.7.0)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.6.0) rspec-support (~> 3.7.0)
rspec-mocks (3.6.0) rspec-mocks (3.7.0)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
rspec-support (~> 3.6.0) rspec-support (~> 3.7.0)
rspec-parameterized (0.4.0) rspec-parameterized (0.4.0)
binding_of_caller binding_of_caller
parser parser
proc_to_ast proc_to_ast
rspec (>= 2.13, < 4) rspec (>= 2.13, < 4)
unparser unparser
rspec-rails (3.6.0) rspec-rails (3.7.2)
actionpack (>= 3.0) actionpack (>= 3.0)
activesupport (>= 3.0) activesupport (>= 3.0)
railties (>= 3.0) railties (>= 3.0)
rspec-core (~> 3.6.0) rspec-core (~> 3.7.0)
rspec-expectations (~> 3.6.0) rspec-expectations (~> 3.7.0)
rspec-mocks (~> 3.6.0) rspec-mocks (~> 3.7.0)
rspec-support (~> 3.6.0) rspec-support (~> 3.7.0)
rspec-retry (0.4.5) rspec-retry (0.4.5)
rspec-core rspec-core
rspec-set (0.1.3) rspec-set (0.1.3)
rspec-support (3.6.0) rspec-support (3.7.1)
rspec_profiling (0.0.5) rspec_profiling (0.0.5)
activerecord activerecord
pg pg
...@@ -1088,8 +1092,12 @@ DEPENDENCIES ...@@ -1088,8 +1092,12 @@ DEPENDENCIES
gitlab-flowdock-git-hook (~> 1.0.1) gitlab-flowdock-git-hook (~> 1.0.1)
gitlab-gollum-lib (~> 4.2) gitlab-gollum-lib (~> 4.2)
gitlab-gollum-rugged_adapter (~> 0.4.4) gitlab-gollum-rugged_adapter (~> 0.4.4)
<<<<<<< HEAD
gitlab-license (~> 1.0) gitlab-license (~> 1.0)
gitlab-markup (~> 1.6.2) gitlab-markup (~> 1.6.2)
=======
gitlab-markup (~> 1.6.4)
>>>>>>> upstream/master
gitlab-styles (~> 2.3) gitlab-styles (~> 2.3)
gitlab_omniauth-ldap (~> 2.0.4) gitlab_omniauth-ldap (~> 2.0.4)
gon (~> 6.2) gon (~> 6.2)
...@@ -1189,7 +1197,7 @@ DEPENDENCIES ...@@ -1189,7 +1197,7 @@ DEPENDENCIES
rouge (~> 3.1) rouge (~> 3.1)
rqrcode-rails3 (~> 0.1.7) rqrcode-rails3 (~> 0.1.7)
rspec-parameterized rspec-parameterized
rspec-rails (~> 3.6.0) rspec-rails (~> 3.7.0)
rspec-retry (~> 0.4.5) rspec-retry (~> 0.4.5)
rspec-set (~> 0.1.3) rspec-set (~> 0.1.3)
rspec_profiling (~> 0.0.5) rspec_profiling (~> 0.0.5)
......
...@@ -193,11 +193,7 @@ next patch release. ...@@ -193,11 +193,7 @@ next patch release.
If a merge request is to be picked into more than one release it will need one If a merge request is to be picked into more than one release it will need one
`Pick into X.Y` label per release where the merge request should be back-ported `Pick into X.Y` label per release where the merge request should be back-ported
to. to. For example:
For example, if the current patch release is `10.1.1` and a regression fix needs
to be backported down to the `9.5` release, you will need to assign it the
`10.1` milestone and the following labels:
- `Pick into 10.1` - `Pick into 10.1`
- `Pick into 10.0` - `Pick into 10.0`
......
...@@ -122,6 +122,7 @@ export default { ...@@ -122,6 +122,7 @@ export default {
@scroll="scrollBuildLog" @scroll="scrollBuildLog"
> >
<code <code
v-show="!detailJob.isLoading"
class="bash" class="bash"
v-html="jobOutput" v-html="jobOutput"
> >
......
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
v-model="formState.description" v-model="formState.description"
ref="textarea" ref="textarea"
slot="textarea" slot="textarea"
placeholder="Write a comment or drag your files here..." placeholder="Write a comment or drag your files here"
@keydown.meta.enter="updateIssuable" @keydown.meta.enter="updateIssuable"
@keydown.ctrl.enter="updateIssuable"> @keydown.ctrl.enter="updateIssuable">
</textarea> </textarea>
......
...@@ -361,7 +361,7 @@ js-gfm-input js-autosize markdown-area js-vue-textarea" ...@@ -361,7 +361,7 @@ js-gfm-input js-autosize markdown-area js-vue-textarea"
ref="textarea" ref="textarea"
slot="textarea" slot="textarea"
:disabled="isSubmitting" :disabled="isSubmitting"
placeholder="Write a comment or drag your files here..." placeholder="Write a comment or drag your files here"
@keydown.up="editCurrentUserLastNote()" @keydown.up="editCurrentUserLastNote()"
@keydown.meta.enter="handleSave()" @keydown.meta.enter="handleSave()"
@keydown.ctrl.enter="handleSave()"> @keydown.ctrl.enter="handleSave()">
......
...@@ -173,7 +173,7 @@ js-autosize markdown-area js-vue-issue-note-form js-vue-textarea" ...@@ -173,7 +173,7 @@ js-autosize markdown-area js-vue-issue-note-form js-vue-textarea"
v-model="updatedNoteBody" v-model="updatedNoteBody"
ref="textarea" ref="textarea"
slot="textarea" slot="textarea"
placeholder="Write a comment or drag your files here..." placeholder="Write a comment or drag your files here"
@keydown.meta.enter="handleUpdate()" @keydown.meta.enter="handleUpdate()"
@keydown.ctrl.enter="handleUpdate()" @keydown.ctrl.enter="handleUpdate()"
@keydown.up="editMyLastNote()" @keydown.up="editMyLastNote()"
......
<script> <script>
import { n__ } from '~/locale'; import { n__ } from '~/locale';
import { stripHtml } from '~/lib/utils/text_utility';
import statusIcon from '../mr_widget_status_icon.vue'; import statusIcon from '../mr_widget_status_icon.vue';
import eventHub from '../../event_hub'; import eventHub from '../../event_hub';
...@@ -27,6 +28,9 @@ export default { ...@@ -27,6 +28,9 @@ export default {
}, },
computed: { computed: {
mergeError() {
return this.mr.mergeError ? stripHtml(this.mr.mergeError, ' ').trim() : '';
},
timerText() { timerText() {
return n__( return n__(
'Refreshing in a second to show the updated status...', 'Refreshing in a second to show the updated status...',
...@@ -83,9 +87,9 @@ export default { ...@@ -83,9 +87,9 @@ export default {
<span class="bold"> <span class="bold">
<span <span
class="has-error-message" class="has-error-message"
v-if="mr.mergeError" v-if="mergeError"
> >
{{ mr.mergeError }}. {{ mergeError }}.
</span> </span>
<span v-else> <span v-else>
{{ s__("mrWidget|Merge failed.") }} {{ s__("mrWidget|Merge failed.") }}
......
...@@ -1129,7 +1129,7 @@ ...@@ -1129,7 +1129,7 @@
.ide-context-header { .ide-context-header {
.avatar { .avatar {
flex: 0 0 40px; flex: 0 0 38px;
} }
.ide-merge-requests-dropdown.dropdown-menu { .ide-merge-requests-dropdown.dropdown-menu {
......
...@@ -2154,10 +2154,14 @@ class Project < ActiveRecord::Base ...@@ -2154,10 +2154,14 @@ class Project < ActiveRecord::Base
check_access = -> do check_access = -> do
next false if empty_repo? next false if empty_repo?
merge_request = source_of_merge_requests.opened merge_requests = source_of_merge_requests.opened
.where(allow_collaboration: true) .where(allow_collaboration: true)
.find_by(source_branch: branch_name)
merge_request&.can_be_merged_by?(user) if branch_name
merge_requests.find_by(source_branch: branch_name)&.can_be_merged_by?(user)
else
merge_requests.any? { |merge_request| merge_request.can_be_merged_by?(user) }
end
end end
if RequestStore.active? if RequestStore.active?
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
= form_for(@release, method: :put, url: project_tag_release_path(@project, @tag.name), html: { class: 'common-note-form release-form js-quick-submit' }) do |f| = form_for(@release, method: :put, url: project_tag_release_path(@project, @tag.name), html: { class: 'common-note-form release-form js-quick-submit' }) do |f|
= render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do = render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do
= render 'projects/zen', f: f, attr: :description, classes: 'note-textarea', placeholder: "Write your release notes or drag files here..." = render 'projects/zen', f: f, attr: :description, classes: 'note-textarea', placeholder: "Write your release notes or drag files here"
= render 'shared/notes/hints' = render 'shared/notes/hints'
.error-alert .error-alert
.prepend-top-default .prepend-top-default
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
= label_tag :release_description, s_('TagsPage|Release notes'), class: 'col-form-label col-sm-2' = label_tag :release_description, s_('TagsPage|Release notes'), class: 'col-form-label col-sm-2'
.col-sm-10 .col-sm-10
= render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do = render layout: 'projects/md_preview', locals: { url: preview_markdown_path(@project), referenced_users: true } do
= render 'projects/zen', attr: :release_description, classes: 'note-textarea', placeholder: s_('TagsPage|Write your release notes or drag files here...'), current_text: @release_description = render 'projects/zen', attr: :release_description, classes: 'note-textarea', placeholder: s_('TagsPage|Write your release notes or drag files here'), current_text: @release_description
= render 'shared/notes/hints' = render 'shared/notes/hints'
.form-text.text-muted .form-text.text-muted
= s_('TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page.') = s_('TagsPage|Optionally, add release notes to the tag. They will be stored in the GitLab database and displayed on the tags page.')
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
.col-sm-12= f.label :content, class: 'control-label-full-width' .col-sm-12= f.label :content, class: 'control-label-full-width'
.col-sm-12 .col-sm-12
= render layout: 'projects/md_preview', locals: { url: project_wiki_preview_markdown_path(@project, @page.slug) } do = render layout: 'projects/md_preview', locals: { url: project_wiki_preview_markdown_path(@project, @page.slug) } do
= render 'projects/zen', f: f, attr: :content, classes: 'note-textarea', placeholder: s_("WikiPage|Write your content or drag files here...") = render 'projects/zen', f: f, attr: :content, classes: 'note-textarea', placeholder: s_("WikiPage|Write your content or drag files here")
= render 'shared/notes/hints' = render 'shared/notes/hints'
.clearfix .clearfix
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
= render layout: 'projects/md_preview', locals: { url: preview_url, referenced_users: true } do = render layout: 'projects/md_preview', locals: { url: preview_url, referenced_users: true } do
= render 'projects/zen', f: form, attr: :description, = render 'projects/zen', f: form, attr: :description,
classes: 'note-textarea qa-issuable-form-description', classes: 'note-textarea qa-issuable-form-description',
placeholder: "Write a comment or drag your files here...", placeholder: "Write a comment or drag your files here",
supports_quick_actions: supports_quick_actions supports_quick_actions: supports_quick_actions
= render 'shared/notes/hints', supports_quick_actions: supports_quick_actions = render 'shared/notes/hints', supports_quick_actions: supports_quick_actions
.clearfix .clearfix
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
= hidden_field_tag :target_id, '', class: 'js-form-target-id' = hidden_field_tag :target_id, '', class: 'js-form-target-id'
= hidden_field_tag :target_type, '', class: 'js-form-target-type' = hidden_field_tag :target_type, '', class: 'js-form-target-type'
= render layout: 'projects/md_preview', locals: { url: preview_markdown_path(project), referenced_users: true } do = render layout: 'projects/md_preview', locals: { url: preview_markdown_path(project), referenced_users: true } do
= render 'projects/zen', attr: 'note[note]', classes: 'note-textarea js-note-text js-task-list-field', placeholder: "Write a comment or drag your files here..." = render 'projects/zen', attr: 'note[note]', classes: 'note-textarea js-note-text js-task-list-field', placeholder: "Write a comment or drag your files here"
= render 'shared/notes/hints' = render 'shared/notes/hints'
.note-form-actions.clearfix .note-form-actions.clearfix
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
= render 'projects/zen', f: f, = render 'projects/zen', f: f,
attr: :note, attr: :note,
classes: 'note-textarea js-note-text', classes: 'note-textarea js-note-text',
placeholder: "Write a comment or drag your files here...", placeholder: "Write a comment or drag your files here",
supports_quick_actions: supports_quick_actions, supports_quick_actions: supports_quick_actions,
supports_autocomplete: supports_autocomplete supports_autocomplete: supports_autocomplete
= render 'shared/notes/hints', supports_quick_actions: supports_quick_actions = render 'shared/notes/hints', supports_quick_actions: supports_quick_actions
......
...@@ -23,10 +23,11 @@ class RepositoryForkWorker ...@@ -23,10 +23,11 @@ class RepositoryForkWorker
source_repository_storage_path, source_disk_path = *args source_repository_storage_path, source_disk_path = *args
source_repository_storage_name = Gitlab.config.repositories.storages.find do |_, info| source_repository_storage_name = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab.config.repositories.storages.find do |_, info|
info.legacy_disk_path == source_repository_storage_path info.legacy_disk_path == source_repository_storage_path
end&.first || raise("no shard found for path '#{source_repository_storage_path}'") end&.first || raise("no shard found for path '#{source_repository_storage_path}'")
end
fork_repository(target_project, source_repository_storage_name, source_disk_path) fork_repository(target_project, source_repository_storage_name, source_disk_path)
end end
end end
......
---
title: Add CI job to check Gemfile.rails5.lock
merge_request: 19605
author: "@blackst0ne"
type: other
---
title: Fix bug where maintainer would not be allowed to push to forks with merge requests
that have `Allow maintainer edits` enabled.
merge_request: 18968
author:
type: fixed
---
title: Add Gitlab::SQL:CTE for easily building CTE statements
merge_request:
author:
type: added
---
title: mergeError message has been binded using v-html directive
merge_request: 19058
author: Murat Dogan
type: fixed
---
title: Fixed bug that allowed to remove other wiki pages if the title had wildcard characters
merge_request:
author:
type: fixed
---
title: Move Gitaly branch/tag/ref RPC's to opt-out
merge_request: 19644
author:
type: other
---
title: Ensure MR diffs always exist in the PR importer
merge_request:
author:
type: fixed
...@@ -6,7 +6,7 @@ scope(controller: :wikis) do ...@@ -6,7 +6,7 @@ scope(controller: :wikis) do
post '/', to: 'wikis#create' post '/', to: 'wikis#create'
end end
scope(path: 'wikis/*id', as: :wiki, format: false) do scope(path: 'wikis/*id', as: :wiki, format: false, defaults: { format: :html }) do
get :edit get :edit
get :history get :history
post :preview_markdown post :preview_markdown
......
...@@ -100,14 +100,14 @@ As it's pointed out before, you will need public access to this machine that ...@@ -100,14 +100,14 @@ As it's pointed out before, you will need public access to this machine that
you've installed Koding and GitLab on. Better to use a domain but a static IP you've installed Koding and GitLab on. Better to use a domain but a static IP
is also fine. is also fine.
For IP based installation you can use [xip.io](https://xip.io) service which is For IP based installation you can use [nip.io](https://nip.io) service which is
free and provides DNS resolution to IP based requests like following; free and provides DNS resolution to IP based requests like following;
- 127.0.0.1.xip.io -> resolves to 127.0.0.1 - 127.0.0.1.nip.io -> resolves to 127.0.0.1
- foo.bar.baz.127.0.0.1.xip.io -> resolves to 127.0.0.1 - foo.bar.baz.127.0.0.1.nip.io -> resolves to 127.0.0.1
- and so on... - and so on...
As Koding needs subdomains for team names; `foo.127.0.0.1.xip.io` requests for As Koding needs subdomains for team names; `foo.127.0.0.1.nip.io` requests for
a running koding instance on `127.0.0.1` server will be handled as `foo` team a running koding instance on `127.0.0.1` server will be handled as `foo` team
requests. requests.
...@@ -127,8 +127,8 @@ your Koding installation. Team called `gitlab` has integration on Koding out ...@@ -127,8 +127,8 @@ your Koding installation. Team called `gitlab` has integration on Koding out
of the box, so if you didn't change anything your team on Koding should be of the box, so if you didn't change anything your team on Koding should be
`gitlab`. `gitlab`.
So, if your Koding is running on `http://1.2.3.4.xip.io:8090` your URL needs So, if your Koding is running on `http://1.2.3.4.nip.io:8090` your URL needs
to be `http://gitlab.1.2.3.4.xip.io:8090`. You need to provide the same host to be `http://gitlab.1.2.3.4.nip.io:8090`. You need to provide the same host
with your Koding installation here. with your Koding installation here.
...@@ -192,7 +192,7 @@ cd koding ...@@ -192,7 +192,7 @@ cd koding
docker-compose run \ docker-compose run \
--service-ports backend \ --service-ports backend \
/opt/koding/scripts/bootstrap-container build \ /opt/koding/scripts/bootstrap-container build \
--host=**YOUR_IP**.xip.io \ --host=**YOUR_IP**.nip.io \
--gitlabHost=**GITLAB_IP** \ --gitlabHost=**GITLAB_IP** \
--gitlabPort=**GITLAB_PORT** \ --gitlabPort=**GITLAB_PORT** \
--gitlabToken=**SECRET_TOKEN** \ --gitlabToken=**SECRET_TOKEN** \
...@@ -224,7 +224,7 @@ cd koding ...@@ -224,7 +224,7 @@ cd koding
docker-compose run \ docker-compose run \
--service-ports backend \ --service-ports backend \
/opt/koding/scripts/bootstrap-container build \ /opt/koding/scripts/bootstrap-container build \
--host=**YOUR_IP**.xip.io \ --host=**YOUR_IP**.nip.io \
``` ```
#### Enable Single Sign On #### Enable Single Sign On
...@@ -233,7 +233,7 @@ Once you restarted your Koding and logged in with your username and password ...@@ -233,7 +233,7 @@ Once you restarted your Koding and logged in with your username and password
you need to activate oauth authentication for your user. To do that you need to activate oauth authentication for your user. To do that
- Navigate to Dashboard on Koding from; - Navigate to Dashboard on Koding from;
`http://gitlab.**YOUR_IP**.xip.io:8090/Home/my-account` `http://gitlab.**YOUR_IP**.nip.io:8090/Home/my-account`
- Scroll down to Integrations section - Scroll down to Integrations section
- Click on toggle to turn On integration in GitLab integration section - Click on toggle to turn On integration in GitLab integration section
......
...@@ -65,7 +65,11 @@ future GitLab releases.** ...@@ -65,7 +65,11 @@ future GitLab releases.**
| **CI_JOB_MANUAL** | 8.12 | all | The flag to indicate that job was manually started | | **CI_JOB_MANUAL** | 8.12 | all | The flag to indicate that job was manually started |
| **CI_JOB_NAME** | 9.0 | 0.5 | The name of the job as defined in `.gitlab-ci.yml` | | **CI_JOB_NAME** | 9.0 | 0.5 | The name of the job as defined in `.gitlab-ci.yml` |
| **CI_JOB_STAGE** | 9.0 | 0.5 | The name of the stage as defined in `.gitlab-ci.yml` | | **CI_JOB_STAGE** | 9.0 | 0.5 | The name of the stage as defined in `.gitlab-ci.yml` |
<<<<<<< HEAD
| **CI_JOB_TOKEN** | 9.0 | 1.2 | Token used for authenticating with the GitLab Container Registry. Also used to authenticate with multi-project pipelines when [triggers][trigger-job-token] are involved. | | **CI_JOB_TOKEN** | 9.0 | 1.2 | Token used for authenticating with the GitLab Container Registry. Also used to authenticate with multi-project pipelines when [triggers][trigger-job-token] are involved. |
=======
| **CI_JOB_TOKEN** | 9.0 | 1.2 | Token used for authenticating with the GitLab Container Registry |
>>>>>>> upstream/master
| **CI_JOB_URL** | 11.0 | 0.5 | Job details URL | | **CI_JOB_URL** | 11.0 | 0.5 | Job details URL |
| **CI_REPOSITORY_URL** | 9.0 | all | The URL to clone the Git repository | | **CI_REPOSITORY_URL** | 9.0 | all | The URL to clone the Git repository |
| **CI_RUNNER_DESCRIPTION** | 8.10 | 0.5 | The description of the runner as saved in GitLab | | **CI_RUNNER_DESCRIPTION** | 8.10 | 0.5 | The description of the runner as saved in GitLab |
......
...@@ -32,7 +32,7 @@ description: 'Learn how to contribute to GitLab.' ...@@ -32,7 +32,7 @@ description: 'Learn how to contribute to GitLab.'
- [GitLab utilities](utilities.md) - [GitLab utilities](utilities.md)
- [API styleguide](api_styleguide.md) Use this styleguide if you are - [API styleguide](api_styleguide.md) Use this styleguide if you are
contributing to the API. contributing to the API.
- [GrapQL API styleguide](api_graphql_styleguide.md) Use this - [GraphQL API styleguide](api_graphql_styleguide.md) Use this
styleguide if you are contribution to the [GraphQL API](../api/graphql/index.md) styleguide if you are contribution to the [GraphQL API](../api/graphql/index.md)
- [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers - [Sidekiq guidelines](sidekiq_style_guide.md) for working with Sidekiq workers
- [Working with Gitaly](gitaly.md) - [Working with Gitaly](gitaly.md)
......
...@@ -233,7 +233,7 @@ This makes use of [`Intl.DateTimeFormat`]. ...@@ -233,7 +233,7 @@ This makes use of [`Intl.DateTimeFormat`].
Please never split a sentence as that would assume the sentence grammar and Please never split a sentence as that would assume the sentence grammar and
structure is the same in all languages. structure is the same in all languages.
For instance, the following For instance, the following:
```js ```js
{{ s__("mrWidget|Set by") }} {{ s__("mrWidget|Set by") }}
...@@ -247,6 +247,27 @@ should be externalized as follows: ...@@ -247,6 +247,27 @@ should be externalized as follows:
{{ sprintf(s__("mrWidget|Set by %{author} to be merged automatically when the pipeline succeeds"), { author: author.name }) }} {{ sprintf(s__("mrWidget|Set by %{author} to be merged automatically when the pipeline succeeds"), { author: author.name }) }}
``` ```
#### Avoid splitting sentences when adding links
This also applies when using links in between translated sentences, otherwise these texts are not translatable in certain languages.
Instead of:
```haml
- zones_link = link_to(s_('ClusterIntegration|zones'), 'https://cloud.google.com/compute/docs/regions-zones/regions-zones', target: '_blank', rel: 'noopener noreferrer')
= s_('ClusterIntegration|Learn more about %{zones_link}').html_safe % { zones_link: zones_link }
```
Set the link starting and ending HTML fragments as variables like so:
```haml
- zones_link_url = 'https://cloud.google.com/compute/docs/regions-zones/regions-zones'
- zones_link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: zones_link_url }
= s_('ClusterIntegration|Learn more about %{zones_link_start}zones%{zones_link_end}').html_safe % { zones_link_start: zones_link_start, zones_link_end: '</a>'.html_safe }
```
The reasoning behind this is that in some languages words change depending on context. For example in Japanese は is added to the subject of a sentence and を to the object. This is impossible to translate correctly if we extract individual words from the sentence.
When in doubt, try to follow the best practices described in this [Mozilla When in doubt, try to follow the best practices described in this [Mozilla
Developer documentation][mdn]. Developer documentation][mdn].
......
...@@ -7,17 +7,19 @@ In Git, when you copy a project you say you "clone" it. To work on a git project ...@@ -7,17 +7,19 @@ In Git, when you copy a project you say you "clone" it. To work on a git project
When you are on your Dashboard, click on the project that you'd like to clone. When you are on your Dashboard, click on the project that you'd like to clone.
To work in the project, you can copy a link to the Git repository through a SSH To work in the project, you can copy a link to the Git repository through a SSH
or a HTTPS protocol. SSH is easier to use after it's been or a HTTPS protocol. SSH is easier to use after it's been
[setup](create-your-ssh-keys.md). While you are at the **Project** tab, select [set up](create-your-ssh-keys.md). While you are at the **Project** tab, select
HTTPS or SSH from the dropdown menu and copy the link using the 'Copy to clipboard' HTTPS or SSH from the dropdown menu and copy the link using the _Copy URL to clipboard_
button (you'll have to paste it on your shell in the next step). button (you'll have to paste it on your shell in the next step).
![Copy the HTTPS or SSH](img/project_clone_url.png) ![Copy the HTTPS or SSH](img/project_clone_url.png)
## On the command line ## On the command line
This section has examples of some basic shell commands that you might find useful. For more information, search the web for _bash commands_.
### Clone your project ### Clone your project
Go to your computer's shell and type the following command: Go to your computer's shell and type the following command with your SSH or HTTPS URL:
``` ```
git clone PASTE HTTPS OR SSH HERE git clone PASTE HTTPS OR SSH HERE
...@@ -25,33 +27,45 @@ git clone PASTE HTTPS OR SSH HERE ...@@ -25,33 +27,45 @@ git clone PASTE HTTPS OR SSH HERE
A clone of the project will be created in your computer. A clone of the project will be created in your computer.
>**Note:** If you clone your project via an URL that contains special characters, make sure that they are URL-encoded. >**Note:** If you clone your project via a URL that contains special characters, make sure that characters are URL-encoded.
### Go into a project, directory or file to work in it ### Go into a project directory to work in it
``` ```
cd NAME-OF-PROJECT-OR-FILE cd NAME-OF-PROJECT
``` ```
### Go back one directory or file ### Go back one directory
``` ```
cd ../ cd ..
``` ```
### View what’s in the directory that you are in ### List what’s in the current directory
``` ```
ls ls
``` ```
### Create a directory ### List what’s in the current directory that starts with `a`
```
ls a*
```
### List what’s in the current directory that ends with `.md`
```
ls *.md
```
### Create a new directory
``` ```
mkdir NAME-OF-YOUR-DIRECTORY mkdir NAME-OF-YOUR-DIRECTORY
``` ```
### Create a README.md or file in directory ### Create a README.md file in the current directory
``` ```
touch README.md touch README.md
...@@ -62,6 +76,12 @@ nano README.md ...@@ -62,6 +76,12 @@ nano README.md
#### Press: enter #### Press: enter
``` ```
### Show the contents of the README.md file
```
cat README.md
```
### Remove a file ### Remove a file
``` ```
...@@ -74,12 +94,18 @@ rm NAME-OF-FILE ...@@ -74,12 +94,18 @@ rm NAME-OF-FILE
rm -r NAME-OF-DIRECTORY rm -r NAME-OF-DIRECTORY
``` ```
### View history in the command line ### View command history
``` ```
history history
``` ```
### Execute command 123 from history
```
!123
```
### Carry out commands for which the account you are using lacks authority ### Carry out commands for which the account you are using lacks authority
You will be asked for an administrator’s password. You will be asked for an administrator’s password.
...@@ -88,8 +114,14 @@ You will be asked for an administrator’s password. ...@@ -88,8 +114,14 @@ You will be asked for an administrator’s password.
sudo sudo
``` ```
### Tell where you are ### Show which directory I am in
``` ```
pwd pwd
``` ```
### Clear the shell window
```
clear
```
...@@ -120,7 +120,7 @@ gitlabConfigStorageSize: 1Gi ...@@ -120,7 +120,7 @@ gitlabConfigStorageSize: 1Gi
Ingress routing and SSL are automatically configured within this Chart. An NGINX ingress is provisioned and configured, and will route traffic to any service. SSL certificates are automatically created and configured by [kube-lego](https://github.com/kubernetes/charts/tree/master/stable/kube-lego). Ingress routing and SSL are automatically configured within this Chart. An NGINX ingress is provisioned and configured, and will route traffic to any service. SSL certificates are automatically created and configured by [kube-lego](https://github.com/kubernetes/charts/tree/master/stable/kube-lego).
> **Note:** > **Note:**
Let's Encrypt limits a single TLD to five certificate requests within a single week. This means that common DNS wildcard services like [xip.io](http://xip.io) and [nip.io](http://nip.io) are unlikely to work. Let's Encrypt limits a single TLD to five certificate requests within a single week. This means that common DNS wildcard services like [nip.io](http://nip.io) and [nip.io](http://nip.io) are unlikely to work.
## Installing GitLab using the Helm Chart ## Installing GitLab using the Helm Chart
> **Note:** > **Note:**
......
...@@ -307,10 +307,10 @@ hostname** and use greater values for the volume sizes. If you don't provide a ...@@ -307,10 +307,10 @@ hostname** and use greater values for the volume sizes. If you don't provide a
password for PostgreSQL, it will be created automatically. password for PostgreSQL, it will be created automatically.
>**Note:** >**Note:**
The `gitlab.apps.10.2.2.2.xip.io` hostname that is used by default will The `gitlab.apps.10.2.2.2.nip.io` hostname that is used by default will
resolve to the host with IP `10.2.2.2` which is the IP our VM uses. It is a resolve to the host with IP `10.2.2.2` which is the IP our VM uses. It is a
trick to have distinct FQDNs pointing to services that are on our local network. trick to have distinct FQDNs pointing to services that are on our local network.
Read more on how this works in <http://xip.io>. Read more on how this works in <http://nip.io>.
Now that we configured this, let's see how to manage and scale GitLab. Now that we configured this, let's see how to manage and scale GitLab.
...@@ -347,7 +347,7 @@ Navigate back to the **Overview** and hopefully all pods will be up and running. ...@@ -347,7 +347,7 @@ Navigate back to the **Overview** and hopefully all pods will be up and running.
![GitLab running](img/gitlab-running.png) ![GitLab running](img/gitlab-running.png)
Congratulations! You can now navigate to your new shinny GitLab instance by Congratulations! You can now navigate to your new shinny GitLab instance by
visiting <http://gitlab.apps.10.2.2.2.xip.io> where you will be asked to visiting <http://gitlab.apps.10.2.2.2.nip.io> where you will be asked to
change the root user password. Login using `root` as username and providing the change the root user password. Login using `root` as username and providing the
password you just set, and start using GitLab! password you just set, and start using GitLab!
......
...@@ -135,9 +135,9 @@ and `1.2.3.4` is the IP address of your load balancer; generally NGINX ...@@ -135,9 +135,9 @@ and `1.2.3.4` is the IP address of your load balancer; generally NGINX
([see requirements](#requirements)). How to set up the DNS record is beyond ([see requirements](#requirements)). How to set up the DNS record is beyond
the scope of this document; you should check with your DNS provider. the scope of this document; you should check with your DNS provider.
Alternatively you can use free public services like [xip.io](http://xip.io) or Alternatively you can use free public services like [nip.io](http://nip.io) or
[nip.io](http://nip.io) which provide automatic wildcard DNS without any [nip.io](http://nip.io) which provide automatic wildcard DNS without any
configuration. Just set the Auto DevOps base domain to `1.2.3.4.xip.io` or configuration. Just set the Auto DevOps base domain to `1.2.3.4.nip.io` or
`1.2.3.4.nip.io`. `1.2.3.4.nip.io`.
Once set up, all requests will hit the load balancer, which in turn will route Once set up, all requests will hit the load balancer, which in turn will route
......
...@@ -41,20 +41,20 @@ new Kubernetes cluster that will be hosted on GKE to your project: ...@@ -41,20 +41,20 @@ new Kubernetes cluster that will be hosted on GKE to your project:
1. Navigate to your project's **Operations > Kubernetes** page. 1. Navigate to your project's **Operations > Kubernetes** page.
1. Click on **Add Kubernetes cluster**. 1. Click on **Add Kubernetes cluster**.
1. Click on **Create with GKE**. 1. Click on **Create with Google Kubernetes Engine**.
1. Connect your Google account if you haven't done already by clicking the 1. Connect your Google account if you haven't done already by clicking the
**Sign in with Google** button. **Sign in with Google** button.
1. Fill in the requested values: 1. Fill in the requested values:
- **Cluster name** (required) - The name you wish to give the cluster. - **Kubernetes cluster name** - The name you wish to give the cluster.
- **GCP project ID** (required) - The ID of the project you created in your GCP - **Environment scope** - The [associated environment](#setting-the-environment-scope) to this cluster.
- **Google Cloud Platform project** - The project you created in your GCP
console that will host the Kubernetes cluster. This must **not** be confused console that will host the Kubernetes cluster. This must **not** be confused
with the project name. Learn more about [Google Cloud Platform projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects). with the project ID. Learn more about [Google Cloud Platform projects](https://cloud.google.com/resource-manager/docs/creating-managing-projects).
- **Zone** - The [zone](https://cloud.google.com/compute/docs/regions-zones/) - **Zone** - The [zone](https://cloud.google.com/compute/docs/regions-zones/)
under which the cluster will be created. under which the cluster will be created.
- **Number of nodes** - The number of nodes you wish the cluster to have. - **Number of nodes** - The number of nodes you wish the cluster to have.
- **Machine type** - The [machine type](https://cloud.google.com/compute/docs/machine-types) - **Machine type** - The [machine type](https://cloud.google.com/compute/docs/machine-types)
of the Virtual Machine instance that the cluster will be based on. of the Virtual Machine instance that the cluster will be based on.
- **Environment scope** - The [associated environment](#setting-the-environment-scope) to this cluster.
1. Finally, click the **Create Kubernetes cluster** button. 1. Finally, click the **Create Kubernetes cluster** button.
After a few moments, your cluster should be created. If something goes wrong, After a few moments, your cluster should be created. If something goes wrong,
......
...@@ -53,25 +53,12 @@ module Gitlab ...@@ -53,25 +53,12 @@ module Gitlab
# Import project via git clone --bare # Import project via git clone --bare
# URL must be publicly cloneable # URL must be publicly cloneable
def import_project(source, timeout) def import_project(source, timeout)
Gitlab::GitalyClient.migrate(:import_repository, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled
gitaly_import_repository(source)
else
git_import_repository(source, timeout) git_import_repository(source, timeout)
end end
end
end
def fork_repository(new_shard_name, new_repository_relative_path) def fork_repository(new_shard_name, new_repository_relative_path)
Gitlab::GitalyClient.migrate(:fork_repository,
status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled
gitaly_fork_repository(new_shard_name, new_repository_relative_path)
else
git_fork_repository(new_shard_name, new_repository_relative_path) git_fork_repository(new_shard_name, new_repository_relative_path)
end end
end
end
def fetch_remote(name, timeout, force:, tags:, ssh_key: nil, known_hosts: nil, prune: true) def fetch_remote(name, timeout, force:, tags:, ssh_key: nil, known_hosts: nil, prune: true)
logger.info "Fetching remote #{name} for repository #{repository_absolute_path}." logger.info "Fetching remote #{name} for repository #{repository_absolute_path}."
...@@ -242,16 +229,6 @@ module Gitlab ...@@ -242,16 +229,6 @@ module Gitlab
true true
end end
def gitaly_import_repository(source)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil)
Gitlab::GitalyClient::RepositoryService.new(raw_repository).import_repository(source)
true
rescue GRPC::BadStatus => e
@output << e.message
false
end
def git_fork_repository(new_shard_name, new_repository_relative_path) def git_fork_repository(new_shard_name, new_repository_relative_path)
from_path = repository_absolute_path from_path = repository_absolute_path
new_shard_path = Gitlab.config.repositories.storages.fetch(new_shard_name).legacy_disk_path new_shard_path = Gitlab.config.repositories.storages.fetch(new_shard_name).legacy_disk_path
...@@ -271,16 +248,6 @@ module Gitlab ...@@ -271,16 +248,6 @@ module Gitlab
run(cmd, nil) && Gitlab::Git::Repository.create_hooks(to_path, global_hooks_path) run(cmd, nil) && Gitlab::Git::Repository.create_hooks(to_path, global_hooks_path)
end end
def gitaly_fork_repository(new_shard_name, new_repository_relative_path)
target_repository = Gitlab::Git::Repository.new(new_shard_name, new_repository_relative_path, nil)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil)
Gitlab::GitalyClient::RepositoryService.new(target_repository).fork_repository(raw_repository)
rescue GRPC::BadStatus => e
logger.error "fork-repository failed: #{e.message}"
false
end
end end
end end
end end
...@@ -120,7 +120,7 @@ module Gitlab ...@@ -120,7 +120,7 @@ module Gitlab
# Default branch in the repository # Default branch in the repository
def root_ref def root_ref
@root_ref ||= gitaly_migrate(:root_ref) do |is_enabled| @root_ref ||= gitaly_migrate(:root_ref, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_client.default_branch_name gitaly_ref_client.default_branch_name
else else
...@@ -152,7 +152,7 @@ module Gitlab ...@@ -152,7 +152,7 @@ module Gitlab
# Returns an Array of branch names # Returns an Array of branch names
# sorted by name ASC # sorted by name ASC
def branch_names def branch_names
gitaly_migrate(:branch_names) do |is_enabled| gitaly_migrate(:branch_names, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_client.branch_names gitaly_ref_client.branch_names
else else
...@@ -163,7 +163,7 @@ module Gitlab ...@@ -163,7 +163,7 @@ module Gitlab
# Returns an Array of Branches # Returns an Array of Branches
def branches def branches
gitaly_migrate(:branches) do |is_enabled| gitaly_migrate(:branches, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_client.branches gitaly_ref_client.branches
else else
...@@ -200,7 +200,7 @@ module Gitlab ...@@ -200,7 +200,7 @@ module Gitlab
end end
def local_branches(sort_by: nil) def local_branches(sort_by: nil)
gitaly_migrate(:local_branches) do |is_enabled| gitaly_migrate(:local_branches, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_client.local_branches(sort_by: sort_by) gitaly_ref_client.local_branches(sort_by: sort_by)
else else
...@@ -270,7 +270,7 @@ module Gitlab ...@@ -270,7 +270,7 @@ module Gitlab
# Returns an Array of tag names # Returns an Array of tag names
def tag_names def tag_names
gitaly_migrate(:tag_names) do |is_enabled| gitaly_migrate(:tag_names, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_client.tag_names gitaly_ref_client.tag_names
else else
...@@ -283,7 +283,7 @@ module Gitlab ...@@ -283,7 +283,7 @@ module Gitlab
# #
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/390 # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/390
def tags def tags
gitaly_migrate(:tags) do |is_enabled| gitaly_migrate(:tags, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
tags_from_gitaly tags_from_gitaly
else else
...@@ -310,7 +310,7 @@ module Gitlab ...@@ -310,7 +310,7 @@ module Gitlab
# #
# name - The name of the tag as a String. # name - The name of the tag as a String.
def tag_exists?(name) def tag_exists?(name)
gitaly_migrate(:ref_exists_tags) do |is_enabled| gitaly_migrate(:ref_exists_tags, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_exists?("refs/tags/#{name}") gitaly_ref_exists?("refs/tags/#{name}")
else else
...@@ -323,7 +323,7 @@ module Gitlab ...@@ -323,7 +323,7 @@ module Gitlab
# #
# name - The name of the branch as a String. # name - The name of the branch as a String.
def branch_exists?(name) def branch_exists?(name)
gitaly_migrate(:ref_exists_branches) do |is_enabled| gitaly_migrate(:ref_exists_branches, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled if is_enabled
gitaly_ref_exists?("refs/heads/#{name}") gitaly_ref_exists?("refs/heads/#{name}")
else else
......
...@@ -104,7 +104,8 @@ module Gitlab ...@@ -104,7 +104,8 @@ module Gitlab
# first save the diff, then populate it. # first save the diff, then populate it.
diff = diff =
if already_exists if already_exists
merge_request.merge_request_diffs.take merge_request.merge_request_diffs.take ||
merge_request.merge_request_diffs.build
else else
merge_request.merge_request_diffs.build merge_request.merge_request_diffs.build
end end
......
...@@ -24,8 +24,10 @@ module Gitlab ...@@ -24,8 +24,10 @@ module Gitlab
address = val['gitaly_address'] address = val['gitaly_address']
end end
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
storages << { name: key, path: val.legacy_disk_path } storages << { name: key, path: val.legacy_disk_path }
end end
end
if Rails.env.test? if Rails.env.test?
storages << { name: 'test_second_storage', path: Rails.root.join('tmp', 'tests', 'second_storage').to_s } storages << { name: 'test_second_storage', path: Rails.root.join('tmp', 'tests', 'second_storage').to_s }
......
...@@ -106,10 +106,17 @@ module Gitlab ...@@ -106,10 +106,17 @@ module Gitlab
raise Error.new("don't use disk paths with import_repository: #{url.inspect}") raise Error.new("don't use disk paths with import_repository: #{url.inspect}")
end end
relative_path = "#{name}.git"
cmd = gitaly_migrate(:import_repository, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled
GitalyGitlabProjects.new(storage, relative_path)
else
# The timeout ensures the subprocess won't hang forever # The timeout ensures the subprocess won't hang forever
cmd = gitlab_projects(storage, "#{name}.git") gitlab_projects(storage, relative_path)
success = cmd.import_project(url, git_timeout) end
end
success = cmd.import_project(url, git_timeout)
raise Error, cmd.output unless success raise Error, cmd.output unless success
success success
...@@ -165,8 +172,16 @@ module Gitlab ...@@ -165,8 +172,16 @@ module Gitlab
# #
# Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/817 # Gitaly migration: https://gitlab.com/gitlab-org/gitaly/issues/817
def fork_repository(forked_from_storage, forked_from_disk_path, forked_to_storage, forked_to_disk_path) def fork_repository(forked_from_storage, forked_from_disk_path, forked_to_storage, forked_to_disk_path)
gitlab_projects(forked_from_storage, "#{forked_from_disk_path}.git") forked_from_relative_path = "#{forked_from_disk_path}.git"
.fork_repository(forked_to_storage, "#{forked_to_disk_path}.git") fork_args = [forked_to_storage, "#{forked_to_disk_path}.git"]
gitaly_migrate(:fork_repository, status: Gitlab::GitalyClient::MigrationStatus::OPT_OUT) do |is_enabled|
if is_enabled
GitalyGitlabProjects.new(forked_from_storage, forked_from_relative_path).fork_repository(*fork_args)
else
gitlab_projects(forked_from_storage, forked_from_relative_path).fork_repository(*fork_args)
end
end
end end
# Removes a repository from file system, using rm_diretory which is an alias # Removes a repository from file system, using rm_diretory which is an alias
...@@ -452,5 +467,39 @@ module Gitlab ...@@ -452,5 +467,39 @@ module Gitlab
# need to do the same here... # need to do the same here...
raise Error, e raise Error, e
end end
class GitalyGitlabProjects
attr_reader :shard_name, :repository_relative_path, :output
def initialize(shard_name, repository_relative_path)
@shard_name = shard_name
@repository_relative_path = repository_relative_path
@output = ''
end
def import_project(source, _timeout)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil)
Gitlab::GitalyClient::RepositoryService.new(raw_repository).import_repository(source)
true
rescue GRPC::BadStatus => e
@output = e.message
false
end
def fork_repository(new_shard_name, new_repository_relative_path)
target_repository = Gitlab::Git::Repository.new(new_shard_name, new_repository_relative_path, nil)
raw_repository = Gitlab::Git::Repository.new(shard_name, repository_relative_path, nil)
Gitlab::GitalyClient::RepositoryService.new(target_repository).fork_repository(raw_repository)
rescue GRPC::BadStatus => e
logger.error "fork-repository failed: #{e.message}"
false
end
def logger
Rails.logger
end
end
end end
end end
module Gitlab
module SQL
# Class for easily building CTE statements.
#
# Example:
#
# cte = CTE.new(:my_cte_name)
# ns = Arel::Table.new(:namespaces)
#
# cte << Namespace.
# where(ns[:parent_id].eq(some_namespace_id))
#
# Namespace
# with(cte.to_arel).
# from(cte.alias_to(ns))
class CTE
attr_reader :table, :query
# name - The name of the CTE as a String or Symbol.
def initialize(name, query)
@table = Arel::Table.new(name)
@query = query
end
# Returns the Arel relation for this CTE.
def to_arel
sql = Arel::Nodes::SqlLiteral.new("(#{query.to_sql})")
Arel::Nodes::As.new(table, sql)
end
# Returns an "AS" statement that aliases the CTE name as the given table
# name. This allows one to trick ActiveRecord into thinking it's selecting
# from an actual table, when in reality it's selecting from a CTE.
#
# alias_table - The Arel table to use as the alias.
def alias_to(alias_table)
Arel::Nodes::As.new(table, alias_table)
end
# Applies the CTE to the given relation, returning a new one that will
# query from it.
def apply_to(relation)
relation.except(:where)
.with(to_arel)
.from(alias_to(relation.model.arel_table))
end
end
end
end
...@@ -140,8 +140,10 @@ module Gitlab ...@@ -140,8 +140,10 @@ module Gitlab
end end
def repository_storage_paths_args def repository_storage_paths_args
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab.config.repositories.storages.values.map { |rs| rs.legacy_disk_path } Gitlab.config.repositories.storages.values.map { |rs| rs.legacy_disk_path }
end end
end
def user_home def user_home
Rails.env.test? ? Rails.root.join('tmp/tests') : Gitlab.config.gitlab.user_home Rails.env.test? ? Rails.root.join('tmp/tests') : Gitlab.config.gitlab.user_home
......
...@@ -4,6 +4,7 @@ module SystemCheck ...@@ -4,6 +4,7 @@ module SystemCheck
set_name 'Orphaned namespaces:' set_name 'Orphaned namespaces:'
def multi_check def multi_check
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab.config.repositories.storages.each do |storage_name, repository_storage| Gitlab.config.repositories.storages.each do |storage_name, repository_storage|
$stdout.puts $stdout.puts
$stdout.puts "* Storage: #{storage_name} (#{repository_storage.legacy_disk_path})".color(:yellow) $stdout.puts "* Storage: #{storage_name} (#{repository_storage.legacy_disk_path})".color(:yellow)
...@@ -12,6 +13,7 @@ module SystemCheck ...@@ -12,6 +13,7 @@ module SystemCheck
orphans = (toplevel_namespace_dirs - existing_namespaces) orphans = (toplevel_namespace_dirs - existing_namespaces)
print_orphans(orphans, storage_name) print_orphans(orphans, storage_name)
end end
end
clear_namespaces! # releases memory when check finishes clear_namespaces! # releases memory when check finishes
end end
......
...@@ -47,11 +47,13 @@ namespace :gitlab do ...@@ -47,11 +47,13 @@ namespace :gitlab do
start_checking "GitLab Shell" start_checking "GitLab Shell"
check_gitlab_shell check_gitlab_shell
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
check_repo_base_exists check_repo_base_exists
check_repo_base_is_not_symlink check_repo_base_is_not_symlink
check_repo_base_user_and_group check_repo_base_user_and_group
check_repo_base_permissions check_repo_base_permissions
check_repos_hooks_directory_is_link check_repos_hooks_directory_is_link
end
check_gitlab_shell_self_test check_gitlab_shell_self_test
finished_checking "GitLab Shell" finished_checking "GitLab Shell"
......
...@@ -82,9 +82,11 @@ namespace :gitlab do ...@@ -82,9 +82,11 @@ namespace :gitlab do
puts "GitLab Shell".color(:yellow) puts "GitLab Shell".color(:yellow)
puts "Version:\t#{gitlab_shell_version || "unknown".color(:red)}" puts "Version:\t#{gitlab_shell_version || "unknown".color(:red)}"
puts "Repository storage paths:" puts "Repository storage paths:"
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab.config.repositories.storages.each do |name, repository_storage| Gitlab.config.repositories.storages.each do |name, repository_storage|
puts "- #{name}: \t#{repository_storage.legacy_disk_path}" puts "- #{name}: \t#{repository_storage.legacy_disk_path}"
end end
end
puts "Hooks:\t\t#{Gitlab.config.gitlab_shell.hooks_path}" puts "Hooks:\t\t#{Gitlab.config.gitlab_shell.hooks_path}"
puts "Git:\t\t#{Gitlab.config.git.bin_path}" puts "Git:\t\t#{Gitlab.config.git.bin_path}"
end end
......
...@@ -8,8 +8,13 @@ msgid "" ...@@ -8,8 +8,13 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gitlab 1.0.0\n" "Project-Id-Version: gitlab 1.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
<<<<<<< HEAD
"POT-Creation-Date: 2018-06-08 18:27+0200\n" "POT-Creation-Date: 2018-06-08 18:27+0200\n"
"PO-Revision-Date: 2018-06-08 18:27+0200\n" "PO-Revision-Date: 2018-06-08 18:27+0200\n"
=======
"POT-Creation-Date: 2018-06-11 09:18+0200\n"
"PO-Revision-Date: 2018-06-11 09:18+0200\n"
>>>>>>> upstream/master
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
...@@ -5108,7 +5113,7 @@ msgstr "" ...@@ -5108,7 +5113,7 @@ msgstr ""
msgid "TagsPage|Use git tag command to add a new one:" msgid "TagsPage|Use git tag command to add a new one:"
msgstr "" msgstr ""
msgid "TagsPage|Write your release notes or drag files here..." msgid "TagsPage|Write your release notes or drag files here"
msgstr "" msgstr ""
msgid "TagsPage|protected" msgid "TagsPage|protected"
...@@ -5931,7 +5936,7 @@ msgstr "" ...@@ -5931,7 +5936,7 @@ msgstr ""
msgid "WikiPage|Page slug" msgid "WikiPage|Page slug"
msgstr "" msgstr ""
msgid "WikiPage|Write your content or drag files here..." msgid "WikiPage|Write your content or drag files here"
msgstr "" msgstr ""
msgid "Wiki|Create Page" msgid "Wiki|Create Page"
......
require 'pathname'
module QA module QA
module Factory module Factory
module Repository module Repository
......
...@@ -46,6 +46,18 @@ module QA ...@@ -46,6 +46,18 @@ module QA
def sandbox_name def sandbox_name
ENV['GITLAB_SANDBOX_NAME'] ENV['GITLAB_SANDBOX_NAME']
end end
def gcloud_account_key
ENV.fetch("GCLOUD_ACCOUNT_KEY")
end
def gcloud_account_email
ENV.fetch("GCLOUD_ACCOUNT_EMAIL")
end
def gcloud_zone
ENV.fetch('GCLOUD_ZONE')
end
end end
end end
end end
...@@ -20,9 +20,11 @@ module QA ...@@ -20,9 +20,11 @@ module QA
gcloud container clusters gcloud container clusters
create #{cluster_name} create #{cluster_name}
--enable-legacy-authorization --enable-legacy-authorization
--zone us-central1-a --zone #{Runtime::Env.gcloud_zone}
&& gcloud container clusters && gcloud container clusters
get-credentials #{cluster_name} get-credentials
--zone #{Runtime::Env.gcloud_zone}
#{cluster_name}
CMD CMD
@api_url = `kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}'` @api_url = `kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}'`
...@@ -32,7 +34,12 @@ module QA ...@@ -32,7 +34,12 @@ module QA
end end
def remove! def remove!
shell("gcloud container clusters delete #{cluster_name} --quiet --async") shell <<~CMD.tr("\n", ' ')
gcloud container clusters delete
--zone #{Runtime::Env.gcloud_zone}
#{cluster_name}
--quiet --async
CMD
end end
private private
...@@ -54,9 +61,9 @@ module QA ...@@ -54,9 +61,9 @@ module QA
def attempt_login_with_env_vars def attempt_login_with_env_vars
puts "No gcloud account. Attempting to login from env vars GCLOUD_ACCOUNT_EMAIL and GCLOUD_ACCOUNT_KEY." puts "No gcloud account. Attempting to login from env vars GCLOUD_ACCOUNT_EMAIL and GCLOUD_ACCOUNT_KEY."
gcloud_account_key = Tempfile.new('gcloud-account-key') gcloud_account_key = Tempfile.new('gcloud-account-key')
gcloud_account_key.write(ENV.fetch("GCLOUD_ACCOUNT_KEY")) gcloud_account_key.write(Runtime::Env.gcloud_account_key)
gcloud_account_key.close gcloud_account_key.close
gcloud_account_email = ENV.fetch("GCLOUD_ACCOUNT_EMAIL") gcloud_account_email = Runtime::Env.gcloud_account_email
shell("gcloud auth activate-service-account #{gcloud_account_email} --key-file #{gcloud_account_key.path}") shell("gcloud auth activate-service-account #{gcloud_account_email} --key-file #{gcloud_account_key.path}")
ensure ensure
gcloud_account_key && gcloud_account_key.unlink gcloud_account_key && gcloud_account_key.unlink
......
require 'pathname'
module QA module QA
feature 'Auto Devops', :kubernetes do feature 'Auto Devops', :kubernetes do
after do after do
......
#!/usr/bin/env bash
echo -e "=> Checking if Gemfile.rails5.lock is up-to-date...\\n"
cp Gemfile.rails5.lock Gemfile.rails5.lock.orig
BUNDLE_GEMFILE=Gemfile.rails5 bundle install "$BUNDLE_INSTALL_FLAGS"
diff -u Gemfile.rails5.lock.orig Gemfile.rails5.lock >/dev/null 2>&1
if [ $? == 1 ]
then
diff -u Gemfile.rails5.lock.orig Gemfile.rails5.lock
echo -e "\\n✖ ERROR: Gemfile.rails5.lock is not up-to-date!
Please run 'BUNDLE_GEMFILE=Gemfile.rails5 bundle install'\\n" >&2
exit 1
fi
echo "✔ Gemfile.rails5.lock is up-to-date"
exit 0
...@@ -189,11 +189,6 @@ FactoryBot.define do ...@@ -189,11 +189,6 @@ FactoryBot.define do
trait :empty_repo do trait :empty_repo do
after(:create) do |project| after(:create) do |project|
raise "Failed to create repository!" unless project.create_repository raise "Failed to create repository!" unless project.create_repository
# We delete hooks so that gitlab-shell will not try to authenticate with
# an API that isn't running
project.gitlab_shell.rm_directory(project.repository_storage,
File.join("#{project.disk_path}.git", 'hooks'))
end end
end end
...@@ -219,13 +214,6 @@ FactoryBot.define do ...@@ -219,13 +214,6 @@ FactoryBot.define do
trait :wiki_repo do trait :wiki_repo do
after(:create) do |project| after(:create) do |project|
raise 'Failed to create wiki repository!' unless project.create_wiki raise 'Failed to create wiki repository!' unless project.create_wiki
# We delete hooks so that gitlab-shell will not try to authenticate with
# an API that isn't running
project.gitlab_shell.rm_directory(
project.repository_storage,
File.join("#{project.wiki.repository.disk_path}.git", "hooks")
)
end end
end end
......
...@@ -62,6 +62,11 @@ describe('IDE jobs detail view', () => { ...@@ -62,6 +62,11 @@ describe('IDE jobs detail view', () => {
expect(vm.$el.querySelector('.build-loader-animation').style.display).toBe(''); expect(vm.$el.querySelector('.build-loader-animation').style.display).toBe('');
}); });
it('hides output when loading', () => {
expect(vm.$el.querySelector('.bash')).not.toBe(null);
expect(vm.$el.querySelector('.bash').style.display).toBe('none');
});
it('hide loading icon when isLoading is false', done => { it('hide loading icon when isLoading is false', done => {
vm.$store.state.pipelines.detailJob.isLoading = false; vm.$store.state.pipelines.detailJob.isLoading = false;
......
...@@ -84,7 +84,7 @@ describe('issue_comment_form component', () => { ...@@ -84,7 +84,7 @@ describe('issue_comment_form component', () => {
it('should render textarea with placeholder', () => { it('should render textarea with placeholder', () => {
expect( expect(
vm.$el.querySelector('.js-main-target-form textarea').getAttribute('placeholder'), vm.$el.querySelector('.js-main-target-form textarea').getAttribute('placeholder'),
).toEqual('Write a comment or drag your files here...'); ).toEqual('Write a comment or drag your files here');
}); });
it('should make textarea disabled while requesting', (done) => { it('should make textarea disabled while requesting', (done) => {
......
...@@ -106,7 +106,7 @@ describe('note_app', () => { ...@@ -106,7 +106,7 @@ describe('note_app', () => {
expect(vm.$el.querySelector('.js-main-target-form').tagName).toEqual('FORM'); expect(vm.$el.querySelector('.js-main-target-form').tagName).toEqual('FORM');
expect( expect(
vm.$el.querySelector('.js-main-target-form textarea').getAttribute('placeholder'), vm.$el.querySelector('.js-main-target-form textarea').getAttribute('placeholder'),
).toEqual('Write a comment or drag your files here...'); ).toEqual('Write a comment or drag your files here');
}); });
it('should render form comment button as disabled', () => { it('should render form comment button as disabled', () => {
...@@ -129,7 +129,7 @@ describe('note_app', () => { ...@@ -129,7 +129,7 @@ describe('note_app', () => {
expect(vm.$el.querySelector('.js-main-target-form').tagName).toEqual('FORM'); expect(vm.$el.querySelector('.js-main-target-form').tagName).toEqual('FORM');
expect( expect(
vm.$el.querySelector('.js-main-target-form textarea').getAttribute('placeholder'), vm.$el.querySelector('.js-main-target-form textarea').getAttribute('placeholder'),
).toEqual('Write a comment or drag your files here...'); ).toEqual('Write a comment or drag your files here');
}); });
}); });
......
...@@ -49,7 +49,7 @@ describe('issue_note_form component', () => { ...@@ -49,7 +49,7 @@ describe('issue_note_form component', () => {
it('should render text area with placeholder', () => { it('should render text area with placeholder', () => {
expect( expect(
vm.$el.querySelector('textarea').getAttribute('placeholder'), vm.$el.querySelector('textarea').getAttribute('placeholder'),
).toEqual('Write a comment or drag your files here...'); ).toEqual('Write a comment or drag your files here');
}); });
it('should link to markdown docs', () => { it('should link to markdown docs', () => {
......
...@@ -6,6 +6,7 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper'; ...@@ -6,6 +6,7 @@ import mountComponent from 'spec/helpers/vue_mount_component_helper';
describe('MRWidgetFailedToMerge', () => { describe('MRWidgetFailedToMerge', () => {
const dummyIntervalId = 1337; const dummyIntervalId = 1337;
let Component; let Component;
let mr;
let vm; let vm;
beforeEach(() => { beforeEach(() => {
...@@ -13,10 +14,11 @@ describe('MRWidgetFailedToMerge', () => { ...@@ -13,10 +14,11 @@ describe('MRWidgetFailedToMerge', () => {
spyOn(eventHub, '$emit'); spyOn(eventHub, '$emit');
spyOn(window, 'setInterval').and.returnValue(dummyIntervalId); spyOn(window, 'setInterval').and.returnValue(dummyIntervalId);
spyOn(window, 'clearInterval').and.stub(); spyOn(window, 'clearInterval').and.stub();
mr = {
mergeError: 'Merge error happened',
};
vm = mountComponent(Component, { vm = mountComponent(Component, {
mr: { mr,
mergeError: 'Merge error happened.',
},
}); });
}); });
...@@ -44,6 +46,19 @@ describe('MRWidgetFailedToMerge', () => { ...@@ -44,6 +46,19 @@ describe('MRWidgetFailedToMerge', () => {
expect(vm.timerText).toEqual('Refreshing in a second to show the updated status...'); expect(vm.timerText).toEqual('Refreshing in a second to show the updated status...');
}); });
}); });
describe('mergeError', () => {
it('removes forced line breaks', done => {
mr.mergeError = 'contains<br />line breaks<br />';
Vue.nextTick()
.then(() => {
expect(vm.mergeError).toBe('contains line breaks');
})
.then(done)
.catch(done.fail);
});
});
}); });
describe('created', () => { describe('created', () => {
...@@ -103,7 +118,7 @@ describe('MRWidgetFailedToMerge', () => { ...@@ -103,7 +118,7 @@ describe('MRWidgetFailedToMerge', () => {
it('renders given error', () => { it('renders given error', () => {
expect(vm.$el.querySelector('.has-error-message').textContent.trim()).toEqual( expect(vm.$el.querySelector('.has-error-message').textContent.trim()).toEqual(
'Merge error happened..', 'Merge error happened.',
); );
}); });
......
...@@ -79,7 +79,9 @@ describe Gitlab::Diff::File do ...@@ -79,7 +79,9 @@ describe Gitlab::Diff::File do
let(:diffs) { commit.diffs } let(:diffs) { commit.diffs }
before do before do
info_dir_path = File.join(project.repository.path_to_repo, 'info') info_dir_path = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
File.join(project.repository.path_to_repo, 'info')
end
FileUtils.mkdir(info_dir_path) unless File.exist?(info_dir_path) FileUtils.mkdir(info_dir_path) unless File.exist?(info_dir_path)
File.write(File.join(info_dir_path, 'attributes'), "*.md -diff\n") File.write(File.join(info_dir_path, 'attributes'), "*.md -diff\n")
......
...@@ -149,7 +149,9 @@ describe Gitlab::Git::Blob, seed_helper: true do ...@@ -149,7 +149,9 @@ describe Gitlab::Git::Blob, seed_helper: true do
it 'limits the size of a large file' do it 'limits the size of a large file' do
blob_size = Gitlab::Git::Blob::MAX_DATA_DISPLAY_SIZE + 1 blob_size = Gitlab::Git::Blob::MAX_DATA_DISPLAY_SIZE + 1
buffer = Array.new(blob_size, 0) buffer = Array.new(blob_size, 0)
rugged_blob = Rugged::Blob.from_buffer(repository.rugged, buffer.join('')) rugged_blob = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Rugged::Blob.from_buffer(repository.rugged, buffer.join(''))
end
blob = Gitlab::Git::Blob.raw(repository, rugged_blob) blob = Gitlab::Git::Blob.raw(repository, rugged_blob)
expect(blob.size).to eq(blob_size) expect(blob.size).to eq(blob_size)
...@@ -164,7 +166,9 @@ describe Gitlab::Git::Blob, seed_helper: true do ...@@ -164,7 +166,9 @@ describe Gitlab::Git::Blob, seed_helper: true do
context 'when sha references a tree' do context 'when sha references a tree' do
it 'returns nil' do it 'returns nil' do
tree = repository.rugged.rev_parse('master^{tree}') tree = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
repository.rugged.rev_parse('master^{tree}')
end
blob = Gitlab::Git::Blob.raw(repository, tree.oid) blob = Gitlab::Git::Blob.raw(repository, tree.oid)
...@@ -278,7 +282,11 @@ describe Gitlab::Git::Blob, seed_helper: true do ...@@ -278,7 +282,11 @@ describe Gitlab::Git::Blob, seed_helper: true do
end end
describe '.batch_lfs_pointers' do describe '.batch_lfs_pointers' do
let(:tree_object) { repository.rugged.rev_parse('master^{tree}') } let(:tree_object) do
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
repository.rugged.rev_parse('master^{tree}')
end
end
let(:non_lfs_blob) do let(:non_lfs_blob) do
Gitlab::Git::Blob.find( Gitlab::Git::Blob.find(
......
...@@ -69,7 +69,9 @@ describe Gitlab::Git::Branch, seed_helper: true do ...@@ -69,7 +69,9 @@ describe Gitlab::Git::Branch, seed_helper: true do
Gitlab::Git.committer_hash(email: user.email, name: user.name) Gitlab::Git.committer_hash(email: user.email, name: user.name)
end end
let(:params) do let(:params) do
parents = [repository.rugged.head.target] parents = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
[repository.rugged.head.target]
end
tree = parents.first.tree tree = parents.first.tree
{ {
......
...@@ -4,12 +4,15 @@ describe Gitlab::Git::Commit, seed_helper: true do ...@@ -4,12 +4,15 @@ describe Gitlab::Git::Commit, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '') }
let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) } let(:commit) { described_class.find(repository, SeedRepo::Commit::ID) }
let(:rugged_commit) do let(:rugged_commit) do
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
repository.rugged.lookup(SeedRepo::Commit::ID) repository.rugged.lookup(SeedRepo::Commit::ID)
end end
end
describe "Commit info" do describe "Commit info" do
before do before do
repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
end
@committer = { @committer = {
email: 'mike@smith.com', email: 'mike@smith.com',
...@@ -58,7 +61,9 @@ describe Gitlab::Git::Commit, seed_helper: true do ...@@ -58,7 +61,9 @@ describe Gitlab::Git::Commit, seed_helper: true do
after do after do
# Erase the new commit so other tests get the original repo # Erase the new commit so other tests get the original repo
repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged repo = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab::Git::Repository.new('default', TEST_REPO_PATH, '').rugged
end
repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID) repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
end end
end end
...@@ -115,7 +120,9 @@ describe Gitlab::Git::Commit, seed_helper: true do ...@@ -115,7 +120,9 @@ describe Gitlab::Git::Commit, seed_helper: true do
describe '.find' do describe '.find' do
it "should return first head commit if without params" do it "should return first head commit if without params" do
expect(described_class.last(repository).id).to eq( expect(described_class.last(repository).id).to eq(
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
repository.rugged.head.target.oid repository.rugged.head.target.oid
end
) )
end end
......
...@@ -27,9 +27,11 @@ EOT ...@@ -27,9 +27,11 @@ EOT
too_large: false too_large: false
} }
@rugged_diff = repository.rugged.diff("5937ac0a7beb003549fc5fd26fc247adbce4a52e^", "5937ac0a7beb003549fc5fd26fc247adbce4a52e", paths: @rugged_diff = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
repository.rugged.diff("5937ac0a7beb003549fc5fd26fc247adbce4a52e^", "5937ac0a7beb003549fc5fd26fc247adbce4a52e", paths:
[".gitmodules"]).patches.first [".gitmodules"]).patches.first
end end
end
describe '.new' do describe '.new' do
context 'using a Hash' do context 'using a Hash' do
......
...@@ -5,6 +5,13 @@ describe Gitlab::Git::GitlabProjects do ...@@ -5,6 +5,13 @@ describe Gitlab::Git::GitlabProjects do
TestEnv.clean_test_path TestEnv.clean_test_path
end end
around do |example|
# TODO move this spec to gitaly-ruby. GitlabProjects is not used in gitlab-ce
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
example.run
end
end
let(:project) { create(:project, :repository) } let(:project) { create(:project, :repository) }
if $VERBOSE if $VERBOSE
...@@ -190,11 +197,6 @@ describe Gitlab::Git::GitlabProjects do ...@@ -190,11 +197,6 @@ describe Gitlab::Git::GitlabProjects do
end end
end end
context 'when Gitaly import_repository feature is enabled' do
it_behaves_like 'importing repository'
end
context 'when Gitaly import_repository feature is disabled', :disable_gitaly do
describe 'logging' do describe 'logging' do
it 'imports a repo' do it 'imports a repo' do
message = "Importing project from <#{import_url}> to <#{tmp_repo_path}>." message = "Importing project from <#{import_url}> to <#{tmp_repo_path}>."
...@@ -220,7 +222,6 @@ describe Gitlab::Git::GitlabProjects do ...@@ -220,7 +222,6 @@ describe Gitlab::Git::GitlabProjects do
it_behaves_like 'importing repository' it_behaves_like 'importing repository'
end end
end
describe '#fork_repository' do describe '#fork_repository' do
let(:dest_repos) { TestEnv::REPOS_STORAGE } let(:dest_repos) { TestEnv::REPOS_STORAGE }
...@@ -232,9 +233,6 @@ describe Gitlab::Git::GitlabProjects do ...@@ -232,9 +233,6 @@ describe Gitlab::Git::GitlabProjects do
before do before do
FileUtils.mkdir_p(dest_repos_path) FileUtils.mkdir_p(dest_repos_path)
# Undo spec_helper stub that deletes hooks
allow_any_instance_of(described_class).to receive(:fork_repository).and_call_original
end end
after do after do
...@@ -258,11 +256,6 @@ describe Gitlab::Git::GitlabProjects do ...@@ -258,11 +256,6 @@ describe Gitlab::Git::GitlabProjects do
end end
end end
context 'when Gitaly fork_repository feature is enabled' do
it_behaves_like 'forking a repository'
end
context 'when Gitaly fork_repository feature is disabled', :disable_gitaly do
it_behaves_like 'forking a repository' it_behaves_like 'forking a repository'
# We seem to be stuck to having only one working Gitaly storage in tests, changing # We seem to be stuck to having only one working Gitaly storage in tests, changing
...@@ -306,7 +299,6 @@ describe Gitlab::Git::GitlabProjects do ...@@ -306,7 +299,6 @@ describe Gitlab::Git::GitlabProjects do
end end
end end
end end
end
def build_gitlab_projects(*args) def build_gitlab_projects(*args)
described_class.new( described_class.new(
......
...@@ -8,6 +8,13 @@ describe Gitlab::Git::Hook do ...@@ -8,6 +8,13 @@ describe Gitlab::Git::Hook do
allow_any_instance_of(described_class).to receive(:trigger).and_call_original allow_any_instance_of(described_class).to receive(:trigger).and_call_original
end end
around do |example|
# TODO move hook tests to gitaly-ruby. Hook will disappear from gitlab-ce
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
example.run
end
end
describe "#trigger" do describe "#trigger" do
set(:project) { create(:project, :repository) } set(:project) { create(:project, :repository) }
let(:repository) { project.repository.raw_repository } let(:repository) { project.repository.raw_repository }
......
...@@ -8,6 +8,13 @@ describe Gitlab::Git::Index, seed_helper: true do ...@@ -8,6 +8,13 @@ describe Gitlab::Git::Index, seed_helper: true do
index.read_tree(repository.lookup('master').tree) index.read_tree(repository.lookup('master').tree)
end end
around do |example|
# TODO move these specs to gitaly-ruby. The Index class will disappear from gitlab-ce
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
example.run
end
end
describe '#create' do describe '#create' do
let(:options) do let(:options) do
{ {
......
...@@ -25,6 +25,22 @@ describe Gitlab::Git::Wiki do ...@@ -25,6 +25,22 @@ describe Gitlab::Git::Wiki do
end end
end end
describe '#delete_page', :skip_gitaly_mock do
after do
destroy_page('page1')
end
it 'only removes the page with the same path' do
create_page('page1', 'content')
create_page('*', 'content')
subject.delete_page('*', commit_details('whatever'))
expect(subject.pages.count).to eq 1
expect(subject.pages.first.title).to eq 'page1'
end
end
def create_page(name, content) def create_page(name, content)
subject.write_page(name, :markdown, content, commit_details(name)) subject.write_page(name, :markdown, content, commit_details(name))
end end
......
...@@ -276,5 +276,17 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi ...@@ -276,5 +276,17 @@ describe Gitlab::GithubImport::Importer::PullRequestImporter, :clean_gitlab_redi
expect(diff.merge_request_diff_commits.exists?).to eq(true) expect(diff.merge_request_diff_commits.exists?).to eq(true)
end end
context 'when the merge request exists' do
it 'creates the merge request diffs if they do not yet exist' do
mr, _ = importer.create_merge_request
mr.merge_request_diffs.delete_all
importer.insert_git_data(mr, true)
expect(mr.merge_request_diffs.exists?).to eq(true)
end
end
end end
end end
...@@ -19,8 +19,10 @@ describe Gitlab::ImportExport::MergeRequestParser do ...@@ -19,8 +19,10 @@ describe Gitlab::ImportExport::MergeRequestParser do
end end
after do after do
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
FileUtils.rm_rf(project.repository.path_to_repo) FileUtils.rm_rf(project.repository.path_to_repo)
end end
end
it 'has a source branch' do it 'has a source branch' do
expect(project.repository.branch_exists?(parsed_merge_request.source_branch)).to be true expect(project.repository.branch_exists?(parsed_merge_request.source_branch)).to be true
......
...@@ -498,6 +498,23 @@ describe Gitlab::Shell do ...@@ -498,6 +498,23 @@ describe Gitlab::Shell do
) )
end end
context 'with gitaly' do
it 'returns true when the command succeeds' do
expect_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive(:fork_repository)
.with(repository.raw_repository) { :gitaly_response_object }
is_expected.to be_truthy
end
it 'return false when the command fails' do
expect_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive(:fork_repository)
.with(repository.raw_repository) { raise GRPC::BadStatus, 'bla' }
is_expected.to be_falsy
end
end
context 'without gitaly', :disable_gitaly do
it 'returns true when the command succeeds' do it 'returns true when the command succeeds' do
expect(gitlab_projects).to receive(:fork_repository).with('nfs-file05', 'fork/path.git') { true } expect(gitlab_projects).to receive(:fork_repository).with('nfs-file05', 'fork/path.git') { true }
...@@ -510,6 +527,7 @@ describe Gitlab::Shell do ...@@ -510,6 +527,7 @@ describe Gitlab::Shell do
is_expected.to be_falsy is_expected.to be_falsy
end end
end end
end
shared_examples 'fetch_remote' do |gitaly_on| shared_examples 'fetch_remote' do |gitaly_on|
def fetch_remote(ssh_auth = nil, prune = true) def fetch_remote(ssh_auth = nil, prune = true)
...@@ -662,6 +680,27 @@ describe Gitlab::Shell do ...@@ -662,6 +680,27 @@ describe Gitlab::Shell do
describe '#import_repository' do describe '#import_repository' do
let(:import_url) { 'https://gitlab.com/gitlab-org/gitlab-ce.git' } let(:import_url) { 'https://gitlab.com/gitlab-org/gitlab-ce.git' }
context 'with gitaly' do
it 'returns true when the command succeeds' do
expect_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive(:import_repository).with(import_url)
result = gitlab_shell.import_repository(project.repository_storage, project.disk_path, import_url)
expect(result).to be_truthy
end
it 'raises an exception when the command fails' do
expect_any_instance_of(Gitlab::GitalyClient::RepositoryService).to receive(:import_repository)
.with(import_url) { raise GRPC::BadStatus, 'bla' }
expect_any_instance_of(Gitlab::Shell::GitalyGitlabProjects).to receive(:output) { 'error'}
expect do
gitlab_shell.import_repository(project.repository_storage, project.disk_path, import_url)
end.to raise_error(Gitlab::Shell::Error, "error")
end
end
context 'without gitaly', :disable_gitaly do
it 'returns true when the command succeeds' do it 'returns true when the command succeeds' do
expect(gitlab_projects).to receive(:import_project).with(import_url, timeout) { true } expect(gitlab_projects).to receive(:import_project).with(import_url, timeout) { true }
...@@ -680,6 +719,7 @@ describe Gitlab::Shell do ...@@ -680,6 +719,7 @@ describe Gitlab::Shell do
end end
end end
end end
end
describe 'namespace actions' do describe 'namespace actions' do
subject { described_class.new } subject { described_class.new }
......
require 'spec_helper'
describe Gitlab::SQL::CTE, :postgresql do
describe '#to_arel' do
it 'generates an Arel relation for the CTE body' do
relation = User.where(id: 1)
cte = described_class.new(:cte_name, relation)
sql = cte.to_arel.to_sql
name = ActiveRecord::Base.connection.quote_table_name(:cte_name)
sql1 = ActiveRecord::Base.connection.unprepared_statement do
relation.except(:order).to_sql
end
expect(sql).to eq("#{name} AS (#{sql1})")
end
end
describe '#alias_to' do
it 'returns an alias for the CTE' do
cte = described_class.new(:cte_name, nil)
table = Arel::Table.new(:kittens)
source_name = ActiveRecord::Base.connection.quote_table_name(:cte_name)
alias_name = ActiveRecord::Base.connection.quote_table_name(:kittens)
expect(cte.alias_to(table).to_sql).to eq("#{source_name} AS #{alias_name}")
end
end
describe '#apply_to' do
it 'applies a CTE to an ActiveRecord::Relation' do
user = create(:user)
cte = described_class.new(:cte_name, User.where(id: user.id))
relation = cte.apply_to(User.all)
expect(relation.to_sql).to match(/WITH .+cte_name/)
expect(relation.to_a).to eq(User.where(id: user.id).to_a)
end
end
end
...@@ -4049,6 +4049,11 @@ describe Project do ...@@ -4049,6 +4049,11 @@ describe Project do
.to be_truthy .to be_truthy
end end
it 'allows access when there are merge requests open but no branch name is given' do
expect(project.branch_allows_collaboration?(user, nil))
.to be_truthy
end
it 'does not allow guest users access' do it 'does not allow guest users access' do
guest = create(:user) guest = create(:user)
target_project.add_guest(guest) target_project.add_guest(guest)
......
require "spec_helper" require "spec_helper"
describe 'Git HTTP requests' do describe 'Git HTTP requests' do
include ProjectForksHelper
include TermsHelper include TermsHelper
include GitHttpHelpers include GitHttpHelpers
include WorkhorseHelpers include WorkhorseHelpers
...@@ -305,6 +306,22 @@ describe 'Git HTTP requests' do ...@@ -305,6 +306,22 @@ describe 'Git HTTP requests' do
expect(response.body).to eq(change_access_error(:push_code)) expect(response.body).to eq(change_access_error(:push_code))
end end
end end
context 'when merge requests are open that allow maintainer access' do
let(:canonical_project) { create(:project, :public, :repository) }
let(:project) { fork_project(canonical_project, nil, repository: true) }
before do
canonical_project.add_master(user)
create(:merge_request,
source_project: project,
target_project: canonical_project,
source_branch: 'fixes',
allow_collaboration: true)
end
it_behaves_like 'pushes are allowed'
end
end end
end end
......
...@@ -36,33 +36,36 @@ describe 'project routing' do ...@@ -36,33 +36,36 @@ describe 'project routing' do
shared_examples 'RESTful project resources' do shared_examples 'RESTful project resources' do
let(:actions) { [:index, :create, :new, :edit, :show, :update, :destroy] } let(:actions) { [:index, :create, :new, :edit, :show, :update, :destroy] }
let(:controller_path) { controller } let(:controller_path) { controller }
let(:id) { { id: '1' } }
let(:format) { {} } # response format, e.g. { format: :html }
let(:params) { { namespace_id: 'gitlab', project_id: 'gitlabhq' } }
it 'to #index' do it 'to #index' do
expect(get("/gitlab/gitlabhq/#{controller_path}")).to route_to("projects/#{controller}#index", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:index) expect(get("/gitlab/gitlabhq/#{controller_path}")).to route_to("projects/#{controller}#index", params) if actions.include?(:index)
end end
it 'to #create' do it 'to #create' do
expect(post("/gitlab/gitlabhq/#{controller_path}")).to route_to("projects/#{controller}#create", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:create) expect(post("/gitlab/gitlabhq/#{controller_path}")).to route_to("projects/#{controller}#create", params) if actions.include?(:create)
end end
it 'to #new' do it 'to #new' do
expect(get("/gitlab/gitlabhq/#{controller_path}/new")).to route_to("projects/#{controller}#new", namespace_id: 'gitlab', project_id: 'gitlabhq') if actions.include?(:new) expect(get("/gitlab/gitlabhq/#{controller_path}/new")).to route_to("projects/#{controller}#new", params) if actions.include?(:new)
end end
it 'to #edit' do it 'to #edit' do
expect(get("/gitlab/gitlabhq/#{controller_path}/1/edit")).to route_to("projects/#{controller}#edit", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:edit) expect(get("/gitlab/gitlabhq/#{controller_path}/1/edit")).to route_to("projects/#{controller}#edit", params.merge(**id, **format)) if actions.include?(:edit)
end end
it 'to #show' do it 'to #show' do
expect(get("/gitlab/gitlabhq/#{controller_path}/1")).to route_to("projects/#{controller}#show", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:show) expect(get("/gitlab/gitlabhq/#{controller_path}/1")).to route_to("projects/#{controller}#show", params.merge(**id, **format)) if actions.include?(:show)
end end
it 'to #update' do it 'to #update' do
expect(put("/gitlab/gitlabhq/#{controller_path}/1")).to route_to("projects/#{controller}#update", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:update) expect(put("/gitlab/gitlabhq/#{controller_path}/1")).to route_to("projects/#{controller}#update", params.merge(id)) if actions.include?(:update)
end end
it 'to #destroy' do it 'to #destroy' do
expect(delete("/gitlab/gitlabhq/#{controller_path}/1")).to route_to("projects/#{controller}#destroy", namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') if actions.include?(:destroy) expect(delete("/gitlab/gitlabhq/#{controller_path}/1")).to route_to("projects/#{controller}#destroy", params.merge(**id, **format)) if actions.include?(:destroy)
end end
end end
...@@ -150,12 +153,13 @@ describe 'project routing' do ...@@ -150,12 +153,13 @@ describe 'project routing' do
end end
it 'to #history' do it 'to #history' do
expect(get('/gitlab/gitlabhq/wikis/1/history')).to route_to('projects/wikis#history', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') expect(get('/gitlab/gitlabhq/wikis/1/history')).to route_to('projects/wikis#history', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1', format: :html)
end end
it_behaves_like 'RESTful project resources' do it_behaves_like 'RESTful project resources' do
let(:actions) { [:create, :edit, :show, :destroy] } let(:actions) { [:create, :edit, :show, :destroy] }
let(:controller) { 'wikis' } let(:controller) { 'wikis' }
let(:format) { { format: :html } }
end end
end end
......
...@@ -118,7 +118,9 @@ describe GitTagPushService do ...@@ -118,7 +118,9 @@ describe GitTagPushService do
before do before do
# Create the lightweight tag # Create the lightweight tag
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.raw_repository.rugged.tags.create(tag_name, newrev) project.repository.raw_repository.rugged.tags.create(tag_name, newrev)
end
# Clear tag list cache # Clear tag list cache
project.repository.expire_tags_cache project.repository.expire_tags_cache
......
...@@ -63,7 +63,9 @@ describe MergeRequests::SquashService do ...@@ -63,7 +63,9 @@ describe MergeRequests::SquashService do
end end
it 'has the same diff as the merge request, but a different SHA' do it 'has the same diff as the merge request, but a different SHA' do
rugged = project.repository.rugged rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.rugged
end
mr_diff = rugged.diff(merge_request.diff_base_sha, merge_request.diff_head_sha) mr_diff = rugged.diff(merge_request.diff_base_sha, merge_request.diff_head_sha)
squash_diff = rugged.diff(merge_request.diff_start_sha, squash_sha) squash_diff = rugged.diff(merge_request.diff_start_sha, squash_sha)
......
...@@ -32,7 +32,7 @@ describe Projects::AfterImportService do ...@@ -32,7 +32,7 @@ describe Projects::AfterImportService do
end end
it 'removes refs/pull/**/*' do it 'removes refs/pull/**/*' do
expect(repository.rugged.references.map(&:name)) expect(rugged.references.map(&:name))
.not_to include(%r{\Arefs/pull/}) .not_to include(%r{\Arefs/pull/})
end end
end end
...@@ -46,10 +46,14 @@ describe Projects::AfterImportService do ...@@ -46,10 +46,14 @@ describe Projects::AfterImportService do
end end
it "does not remove refs/#{name}/tmp" do it "does not remove refs/#{name}/tmp" do
expect(repository.rugged.references.map(&:name)) expect(rugged.references.map(&:name))
.to include("refs/#{name}/tmp") .to include("refs/#{name}/tmp")
end end
end end
end end
def rugged
Gitlab::GitalyClient::StorageSettings.allow_disk_access { repository.rugged }
end
end end
end end
...@@ -5,7 +5,11 @@ describe Projects::DestroyService do ...@@ -5,7 +5,11 @@ describe Projects::DestroyService do
let!(:user) { create(:user) } let!(:user) { create(:user) }
let!(:project) { create(:project, :repository, namespace: user.namespace) } let!(:project) { create(:project, :repository, namespace: user.namespace) }
let!(:path) { project.repository.path_to_repo } let!(:path) do
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.path_to_repo
end
end
let!(:remove_path) { path.sub(/\.git\Z/, "+#{project.id}+deleted.git") } let!(:remove_path) { path.sub(/\.git\Z/, "+#{project.id}+deleted.git") }
let!(:async) { false } # execute or async_execute let!(:async) { false } # execute or async_execute
......
...@@ -37,7 +37,11 @@ describe Projects::HashedStorage::MigrateRepositoryService do ...@@ -37,7 +37,11 @@ describe Projects::HashedStorage::MigrateRepositoryService do
it 'writes project full path to .git/config' do it 'writes project full path to .git/config' do
service.execute service.execute
expect(project.repository.rugged.config['gitlab.fullpath']).to eq project.full_path rugged_config = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.rugged.config['gitlab.fullpath']
end
expect(rugged_config).to eq project.full_path
end end
end end
......
...@@ -126,19 +126,6 @@ RSpec.configure do |config| ...@@ -126,19 +126,6 @@ RSpec.configure do |config|
end end
config.before(:example) do config.before(:example) do
# Skip pre-receive hook check so we can use the web editor and merge.
allow_any_instance_of(Gitlab::Git::Hook).to receive(:trigger).and_return([true, nil])
allow_any_instance_of(Gitlab::Git::GitlabProjects).to receive(:fork_repository).and_wrap_original do |m, *args|
m.call(*args)
shard_name, repository_relative_path = args
# We can't leave the hooks in place after a fork, as those would fail in tests
# The "internal" API is not available
Gitlab::Shell.new.rm_directory(shard_name,
File.join(repository_relative_path, 'hooks'))
end
# Enable all features by default for testing # Enable all features by default for testing
allow(Feature).to receive(:enabled?) { true } allow(Feature).to receive(:enabled?) { true }
end end
......
...@@ -135,6 +135,16 @@ module TestEnv ...@@ -135,6 +135,16 @@ module TestEnv
install_dir: Gitlab.config.gitlab_shell.path, install_dir: Gitlab.config.gitlab_shell.path,
version: Gitlab::Shell.version_required, version: Gitlab::Shell.version_required,
task: 'gitlab:shell:install') task: 'gitlab:shell:install')
create_fake_git_hooks
end
def create_fake_git_hooks
# gitlab-shell hooks don't work in our test environment because they try to make internal API calls
hooks_dir = File.join(Gitlab.config.gitlab_shell.path, 'hooks')
%w[pre-receive post-receive update].each do |hook|
File.open(File.join(hooks_dir, hook), 'w', 0755) { |f| f.puts '#!/bin/sh' }
end
end end
def setup_gitaly def setup_gitaly
......
...@@ -134,8 +134,10 @@ describe 'gitlab:gitaly namespace rake task' do ...@@ -134,8 +134,10 @@ describe 'gitlab:gitaly namespace rake task' do
parsed_output = TomlRB.parse(expected_output) parsed_output = TomlRB.parse(expected_output)
config.each do |name, params| config.each do |name, params|
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
expect(parsed_output['storage']).to include({ 'name' => name, 'path' => params.legacy_disk_path }) expect(parsed_output['storage']).to include({ 'name' => name, 'path' => params.legacy_disk_path })
end end
end end
end end
end
end end
...@@ -7,11 +7,17 @@ describe 'gitlab:shell rake tasks' do ...@@ -7,11 +7,17 @@ describe 'gitlab:shell rake tasks' do
stub_warn_user_is_not_gitlab stub_warn_user_is_not_gitlab
end end
after do
TestEnv.create_fake_git_hooks
end
describe 'install task' do describe 'install task' do
it 'invokes create_hooks task' do it 'invokes create_hooks task' do
expect(Rake::Task['gitlab:shell:create_hooks']).to receive(:invoke) expect(Rake::Task['gitlab:shell:create_hooks']).to receive(:invoke)
storages = Gitlab.config.repositories.storages.values.map(&:legacy_disk_path) storages = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Gitlab.config.repositories.storages.values.map(&:legacy_disk_path)
end
expect(Kernel).to receive(:system).with('bin/install', *storages).and_call_original expect(Kernel).to receive(:system).with('bin/install', *storages).and_call_original
expect(Kernel).to receive(:system).with('bin/compile').and_call_original expect(Kernel).to receive(:system).with('bin/compile').and_call_original
......
...@@ -218,7 +218,9 @@ describe GitGarbageCollectWorker do ...@@ -218,7 +218,9 @@ describe GitGarbageCollectWorker do
# Create a new commit on a random new branch # Create a new commit on a random new branch
def create_objects(project) def create_objects(project)
rugged = project.repository.rugged rugged = Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.rugged
end
old_commit = rugged.branches.first.target old_commit = rugged.branches.first.target
new_commit_sha = Rugged::Commit.create( new_commit_sha = Rugged::Commit.create(
rugged, rugged,
...@@ -237,8 +239,10 @@ describe GitGarbageCollectWorker do ...@@ -237,8 +239,10 @@ describe GitGarbageCollectWorker do
end end
def packs(project) def packs(project)
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
Dir["#{project.repository.path_to_repo}/objects/pack/*.pack"] Dir["#{project.repository.path_to_repo}/objects/pack/*.pack"]
end end
end
def packed_refs(project) def packed_refs(project)
path = "#{project.repository.path_to_repo}/packed-refs" path = "#{project.repository.path_to_repo}/packed-refs"
......
...@@ -2,7 +2,11 @@ require 'spec_helper' ...@@ -2,7 +2,11 @@ require 'spec_helper'
describe ProjectDestroyWorker do describe ProjectDestroyWorker do
let(:project) { create(:project, :repository, pending_delete: true) } let(:project) { create(:project, :repository, pending_delete: true) }
let(:path) { project.repository.path_to_repo } let(:path) do
Gitlab::GitalyClient::StorageSettings.allow_disk_access do
project.repository.path_to_repo
end
end
subject { described_class.new } subject { described_class.new }
......
...@@ -94,6 +94,9 @@ describe RepositoryForkWorker do ...@@ -94,6 +94,9 @@ describe RepositoryForkWorker do
it_behaves_like 'RepositoryForkWorker performing' it_behaves_like 'RepositoryForkWorker performing'
it 'logs a message about forking with old-style arguments' do it 'logs a message about forking with old-style arguments' do
allow(subject).to receive(:gitlab_shell).and_return(shell)
expect(shell).to receive(:fork_repository) { true }
allow(Rails.logger).to receive(:info).with(anything) # To compensate for other logs allow(Rails.logger).to receive(:info).with(anything) # To compensate for other logs
expect(Rails.logger).to receive(:info).with("Project #{fork_project.id} is being forked using old-style arguments.") expect(Rails.logger).to receive(:info).with("Project #{fork_project.id} is being forked using old-style arguments.")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment