Commit 2f1b9d78 authored by GitLab Bot's avatar GitLab Bot
Browse files

Add latest changes from gitlab-org/gitlab@master

parent e8927150386f
import { createDateTimeFormat } from '../../locale';
let dateTimeFormats;
export const initDateFormats = () => {
const dayFormat = createDateTimeFormat({ month: 'short', day: 'numeric' });
const monthFormat = createDateTimeFormat({ month: 'long' });
const yearFormat = createDateTimeFormat({ year: 'numeric' });
dateTimeFormats = {
dayFormat,
monthFormat,
yearFormat,
};
};
initDateFormats();
/**
Formats a localized date in way that it can be used for d3.js axis.tickFormat().
That is, it displays
- 4-digit for first of January
- full month name for first of every month
- day and abbreviated month otherwise
see also https://github.com/d3/d3-3.x-api-reference/blob/master/SVG-Axes.md#tickFormat
*/
export const dateTickFormat = date => {
if (date.getDate() !== 1) {
return dateTimeFormats.dayFormat.format(date);
}
if (date.getMonth() > 0) {
return dateTimeFormats.monthFormat.format(date);
}
return dateTimeFormats.yearFormat.format(date);
};
......@@ -35,3 +35,5 @@ def execute_note_hooks
end
end
end
Notes::PostProcessService.prepend_if_ee('EE::Notes::PostProcessService')
......@@ -4,7 +4,7 @@
.btn-group.mobile-git-clone.js-mobile-git-clone.btn-block
= clipboard_button(button_text: default_clone_label, text: default_url_to_repo(project), hide_button_icon: true, class: "btn-primary flex-fill bold justify-content-center input-group-text clone-dropdown-btn js-clone-dropdown-label")
%button.btn.btn-primary.dropdown-toggle.js-dropdown-toggle{ type: "button", data: { toggle: "dropdown" } }
%button.btn.btn-primary.dropdown-toggle.js-dropdown-toggle.flex-grow-0.d-flex-center{ type: "button", data: { toggle: "dropdown" } }
= sprite_icon("arrow-down", css_class: "dropdown-btn-icon icon")
%ul.dropdown-menu.dropdown-menu-selectable.dropdown-menu-right.clone-options-dropdown{ data: { dropdown: true } }
- if ssh_enabled?
......
---
title: Fix project clone dropdown button width
merge_request: 19551
author: George Tsiolis
type: fixed
---
title: Fix any approver project rule records
merge_request: 18265
author:
type: changed
# frozen_string_literal: true
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class FixAnyApproverRuleForProjects < ActiveRecord::Migration[5.2]
DOWNTIME = false
BATCH_SIZE = 1000
disable_ddl_transaction!
class ApprovalProjectRule < ActiveRecord::Base
NON_EXISTENT_RULE_TYPE = 4
ANY_APPROVER_RULE_TYPE = 3
include EachBatch
self.table_name = 'approval_project_rules'
scope :any_approver, -> { where(rule_type: ANY_APPROVER_RULE_TYPE) }
scope :non_existent_rule_type, -> { where(rule_type: NON_EXISTENT_RULE_TYPE) }
end
def up
return unless Gitlab.ee?
# Remove approval project rule with rule type 4 if the project has a rule with rule_type 3
#
# Currently, there is no projects on gitlab.com which have both rules with 3 and 4 rule type
# There's a code-level validation for a rule, which doesn't allow to create rules with the same names
#
# But in order to avoid failing the update query due to uniqueness constraint
# Let's run the delete query to be sure
project_ids = FixAnyApproverRuleForProjects::ApprovalProjectRule.any_approver.select(:project_id)
FixAnyApproverRuleForProjects::ApprovalProjectRule
.non_existent_rule_type
.where(project_id: project_ids)
.delete_all
# Set approval project rule types to 3
# Currently there are 18_445 records to be updated
FixAnyApproverRuleForProjects::ApprovalProjectRule.non_existent_rule_type.each_batch(of: BATCH_SIZE) do |rules|
rules.update_all(rule_type: FixAnyApproverRuleForProjects::ApprovalProjectRule::ANY_APPROVER_RULE_TYPE)
end
end
def down
# The migration doesn't leave the database in an inconsistent state
# And can be run multiple times
end
end
......@@ -240,6 +240,47 @@ end
```
## Descriptions
All fields and arguments
[must have descriptions](https://gitlab.com/gitlab-org/gitlab/merge_requests/16438).
A description of a field or argument is given using the `description:`
keyword. For example:
```ruby
field :id, GraphQL::ID_TYPE, description: 'ID of the resource'
```
Descriptions of fields and arguments are viewable to users through:
- The [GraphiQL explorer](../api/graphql/#graphiql).
- The [static GraphQL API reference](../api/graphql/#reference).
### Description styleguide
To ensure consistency, the following should be followed whenever adding or updating
descriptions:
- Mention the name of the resource in the description. Example:
`'Labels of the issue'` (issue being the resource).
- Use `"{x} of the {y}"` where possible. Example: `'Title of the issue'`.
Do not start descriptions with `The`.
- Descriptions of `GraphQL::BOOLEAN_TYPE` fields should answer the question: "What does
this field do?". Example: `'Indicates project has a Git repository'`.
- Always include the word `"timestamp"` when describing an argument or
field of type `Types::TimeType`. This lets the reader know that the
format of the property will be `Time`, rather than just `Date`.
- No `.` at end of strings.
Example:
```ruby
field :id, GraphQL::ID_TYPE, description: 'ID of the Issue'
field :confidential, GraphQL::BOOLEAN_TYPE, description: 'Indicates the issue is confidential'
field :closed_at, Types::TimeType, description: 'Timestamp of when the issue was closed'
```
## Authorization
Authorizations can be applied to both types and fields using the same
......
......@@ -13,7 +13,7 @@ If you want to install on RHEL/CentOS, we recommend using the
[Omnibus packages](https://about.gitlab.com/install/).
This guide is long because it covers many cases and includes all commands you
need, this is [one of the few installation scripts that actually works out of the box](https://twitter.com/robinvdvleuten/status/424163226532986880).
need, this is [one of the few installation scripts that actually work out of the box](https://twitter.com/robinvdvleuten/status/424163226532986880).
The following steps have been known to work. **Use caution when you deviate**
from this guide. Make sure you don't violate any assumptions GitLab makes about
its environment. For example, many people run into permission problems because
......@@ -35,7 +35,7 @@ After this termination runit will detect Sidekiq is not running and will start i
Since installations from source don't use runit for process supervision, Sidekiq
can't be terminated and its memory usage will grow over time.
## Select version to install
## Select a version to install
Make sure you view [this installation guide](https://gitlab.com/gitlab-org/gitlab/blob/master/doc/install/installation.md) from the branch (version) of GitLab you would like to install (e.g., `11-7-stable`).
You can select the branch in the version dropdown in the top left corner of GitLab (below the menu bar).
......@@ -56,7 +56,7 @@ of this page:
| |-- repositories
```
- `/home/git/.ssh` - Contains OpenSSH settings. Specifically the `authorized_keys`
- `/home/git/.ssh` - Contains OpenSSH settings. Specifically, the `authorized_keys`
file managed by GitLab Shell.
- `/home/git/gitlab` - GitLab core software.
- `/home/git/gitlab-shell` - Core add-on component of GitLab. Maintains SSH
......@@ -315,7 +315,7 @@ use of extensions and concurrent index removal, you need at least PostgreSQL 9.2
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
```
1. Create the GitLab production database and grant all privileges on database:
1. Create the GitLab production database and grant all privileges on the database:
```sh
sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
......@@ -397,7 +397,7 @@ sudo usermod -aG redis git
## 8. GitLab
```sh
# We'll install GitLab into home directory of the user "git"
# We'll install GitLab into the home directory of the user "git"
cd /home/git
```
......@@ -424,7 +424,7 @@ cd /home/git/gitlab
# Copy the example GitLab config
sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
# Update GitLab config file, follow the directions at top of file
# Update GitLab config file, follow the directions at top of the file
sudo -u git -H editor config/gitlab.yml
# Copy the example secrets file
......@@ -465,7 +465,7 @@ nproc
# Enable cluster mode if you expect to have a high load instance
# Set the number of workers to at least the number of cores
# Ex. change amount of workers to 3 for 2GB RAM server
# Ex. change the amount of workers to 3 for 2GB RAM server
sudo -u git -H editor config/unicorn.rb
# Copy the example Rack attack config
......@@ -670,7 +670,7 @@ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production
# or you can skip the question by adding force=yes
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production force=yes
# When done you see 'Administrator account created:'
# When done, you see 'Administrator account created:'
```
NOTE: **Note:**
......@@ -684,7 +684,7 @@ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PA
The `secrets.yml` file stores encryption keys for sessions and secure variables.
Backup `secrets.yml` someplace safe, but don't store it in the same place as your database backups.
Otherwise your secrets are exposed if one of your backups is compromised.
Otherwise, your secrets are exposed if one of your backups is compromised.
### Install Init Script
......@@ -835,7 +835,7 @@ initial administrator account. Enter your desired password and you'll be
redirected back to the login screen.
The default account's username is **root**. Provide the password you created
earlier and login. After login you can change the username if you wish.
earlier and login. After login, you can change the username if you wish.
**Enjoy!**
......@@ -905,7 +905,7 @@ for the changes to take effect.
### Custom Redis Connection
If you'd like to connect to a Redis server on a non-standard port or on a different host, you can configure its connection string via the `config/resque.yml` file.
If you'd like to connect to a Redis server on a non-standard port or a different host, you can configure its connection string via the `config/resque.yml` file.
```
# example
......@@ -921,7 +921,7 @@ production:
url: unix:/path/to/redis/socket
```
Also you can use environment variables in the `config/resque.yml` file:
Also, you can use environment variables in the `config/resque.yml` file:
```
# example
......
......@@ -15848,6 +15848,9 @@ msgstr ""
msgid "Something went wrong while closing the %{issuable}. Please try again later"
msgstr ""
msgid "Something went wrong while deleting the package."
msgstr ""
msgid "Something went wrong while deleting the source branch. Please try again."
msgstr ""
......@@ -15878,6 +15881,12 @@ msgstr ""
msgid "Something went wrong while fetching the environments for this merge request. Please try again."
msgstr ""
msgid "Something went wrong while fetching the package."
msgstr ""
msgid "Something went wrong while fetching the packages list."
msgstr ""
msgid "Something went wrong while fetching the projects."
msgstr ""
......@@ -20993,6 +21002,9 @@ msgstr ""
msgid "started"
msgstr ""
msgid "started a discussion on %{design_link}"
msgstr ""
msgid "started on %{milestone_start_date}"
msgstr ""
......
......@@ -2,7 +2,6 @@ source 'https://rubygems.org'
gem 'gitlab-qa'
gem 'activesupport', '5.2.3' # This should stay in sync with the root's Gemfile
gem 'pry-byebug', '~> 3.5.1', platform: :mri
gem 'capybara', '~> 2.16.1'
gem 'capybara-screenshot', '~> 1.0.18'
gem 'rake', '~> 12.3.0'
......@@ -15,3 +14,9 @@ gem 'rspec_junit_formatter', '~> 0.4.1'
gem 'faker', '~> 1.6', '>= 1.6.6'
gem 'knapsack', '~> 1.17'
gem 'parallel_tests', '~> 2.29'
group :test do
gem 'pry-byebug', '~> 3.5.1', platform: :mri
gem "ruby-debug-ide", "~> 0.7.0"
gem "debase", "~> 0.2.4.1"
end
......@@ -29,6 +29,9 @@ GEM
ffi (~> 1.0, >= 1.0.11)
coderay (1.1.2)
concurrent-ruby (1.1.5)
debase (0.2.4.1)
debase-ruby_core_source (>= 0.10.2)
debase-ruby_core_source (0.10.6)
diff-lcs (1.3)
domain_name (0.5.20170404)
unf (>= 0.0.5, < 1.0.0)
......@@ -67,7 +70,7 @@ GEM
rack (2.0.6)
rack-test (0.8.2)
rack (>= 1.0, < 3)
rake (12.3.0)
rake (12.3.3)
rest-client (2.0.2)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
......@@ -89,6 +92,8 @@ GEM
rspec-support (3.7.0)
rspec_junit_formatter (0.4.1)
rspec-core (>= 2, < 4, != 2.12.0)
ruby-debug-ide (0.7.0)
rake (>= 0.8.1)
rubyzip (1.2.2)
selenium-webdriver (3.141.0)
childprocess (~> 0.5)
......@@ -110,6 +115,7 @@ DEPENDENCIES
airborne (~> 0.2.13)
capybara (~> 2.16.1)
capybara-screenshot (~> 1.0.18)
debase (~> 0.2.4.1)
faker (~> 1.6, >= 1.6.6)
gitlab-qa
knapsack (~> 1.17)
......@@ -120,6 +126,7 @@ DEPENDENCIES
rspec (~> 3.7)
rspec-retry (~> 0.6.1)
rspec_junit_formatter (~> 0.4.1)
ruby-debug-ide (~> 0.7.0)
selenium-webdriver (~> 3.12)
BUNDLED WITH
......
......@@ -42,7 +42,7 @@ module QA
Page::Project::Issue::Show.perform do |show|
show.select_all_activities_filter
show.comment('cc-ing you here @eve')
show.comment("cc-ing you here @#{user.username}")
expect do
expect(show).to have_content("cc-ing you here")
......
import { dateTickFormat, initDateFormats } from '~/lib/utils/tick_formats';
import { setLanguage } from '../../helpers/locale_helper';
describe('tick formats', () => {
describe('dateTickFormat', () => {
beforeAll(() => {
setLanguage('de');
initDateFormats();
});
afterAll(() => {
setLanguage(null);
});
it('returns year for first of January', () => {
const tick = dateTickFormat(new Date('2001-01-01'));
expect(tick).toBe('2001');
});
it('returns month for first of February', () => {
const tick = dateTickFormat(new Date('2001-02-01'));
expect(tick).toBe('Februar');
});
it('returns day and month for second of February', () => {
const tick = dateTickFormat(new Date('2001-02-02'));
expect(tick).toBe('2. Feb.');
});
it('ignores time', () => {
const tick = dateTickFormat(new Date('2001-02-02 12:34:56'));
expect(tick).toBe('2. Feb.');
});
});
});
......@@ -7,16 +7,17 @@
let(:note) { create(:note) }
it "calls NotificationService#new_note" do
expect_any_instance_of(NotificationService).to receive(:new_note).with(note)
expect_next_instance_of(NotificationService) do |service|
expect(service).to receive(:new_note).with(note)
end
described_class.new.perform(note.id)
end
it "calls Notes::PostProcessService#execute" do
notes_post_process_service = double(Notes::PostProcessService)
allow(Notes::PostProcessService).to receive(:new).with(note) { notes_post_process_service }
expect(notes_post_process_service).to receive(:execute)
expect_next_instance_of(Notes::PostProcessService) do |service|
expect(service).to receive(:execute)
end
described_class.new.perform(note.id)
end
......@@ -36,14 +37,14 @@
expect { described_class.new.perform(unexistent_note_id) }.not_to raise_error
end
it "does not call NotificationService#new_note" do
expect_any_instance_of(NotificationService).not_to receive(:new_note)
it "does not call NotificationService" do
expect(NotificationService).not_to receive(:new)
described_class.new.perform(unexistent_note_id)
end
it "does not call Notes::PostProcessService#execute" do
expect_any_instance_of(Notes::PostProcessService).not_to receive(:execute)
it "does not call Notes::PostProcessService" do
expect(Notes::PostProcessService).not_to receive(:new)
described_class.new.perform(unexistent_note_id)
end
......
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