diff --git a/app/graphql/types/issue_type.rb b/app/graphql/types/issue_type.rb index 432f3e1255f..4965601fe65 100644 --- a/app/graphql/types/issue_type.rb +++ b/app/graphql/types/issue_type.rb @@ -49,7 +49,6 @@ module Types field :web_url, GraphQL::STRING_TYPE, null: false # rubocop:disable Graphql/Descriptions field :relative_position, GraphQL::INT_TYPE, null: true # rubocop:disable Graphql/Descriptions - field :epic, ::Types::EpicType, null: true, description: 'The epic to which issue belongs' field :participants, Types::UserType.connection_type, null: true, complexity: 5, description: 'List of participants for the issue' field :time_estimate, GraphQL::INT_TYPE, null: false, description: 'The time estimate on the issue' field :total_time_spent, GraphQL::INT_TYPE, null: false, description: 'Total time reported as spent on the issue' diff --git a/app/models/user.rb b/app/models/user.rb index f5fbc912cc8..ad56d7a32c5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -444,6 +444,7 @@ class User < ApplicationRecord # # Returns an ActiveRecord::Relation. def search(query) + query = query&.delete_prefix('@') return none if query.blank? query = query.downcase diff --git a/changelogs/unreleased/allow-username-search-to-work-with-at-sign.yml b/changelogs/unreleased/allow-username-search-to-work-with-at-sign.yml new file mode 100644 index 00000000000..fa6d679f7a2 --- /dev/null +++ b/changelogs/unreleased/allow-username-search-to-work-with-at-sign.yml @@ -0,0 +1,5 @@ +--- +title: Allow users to be searched with a @ prefix +merge_request: 17742 +author: +type: added diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index f45f23131c1..95b57421a6f 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -707,6 +707,7 @@ Available rule clauses include: (similar to [`only:variables`](#onlyvariablesexceptvariables)). - [`changes`](#ruleschanges) (same as [`only:changes`](#onlychangesexceptchanges)). +- [`exists`](#rulesexists) For example, using `if`. This configuration specifies that `job` should be built and run for every pipeline on merge requests targeting `master`, regardless of @@ -779,9 +780,42 @@ In this example, a job either set to: - Run manually if `Dockerfile` has changed OR `$VAR == "string value"`. - `when:on_success` by the last rule, where no earlier clauses evaluate to true. +#### `rules:exists` + +`exists` accepts an array of paths and will match if any of these paths exist +as files in the repository. + +For example: + +```yaml +job: + script: docker build -t my-image:$CI_COMMIT_REF_SLUG . + rules: + - exists: + - Dockerfile +``` + +You can also use glob patterns to match multiple files in any directory within +the repository. + +For example: + +```yaml +job: + script: bundle exec rspec + rules: + - exists: + - spec/**.rb +``` + +NOTE: **Note:** +For performance reasons, using `exists` with patterns is limited to 10000 +checks. After the 10000th check, rules with patterned globs will always match. + #### Complex rule clauses -To conjoin `if` and `changes` clauses with an AND, use them in the same rule. +To conjoin `if`, `changes`, and `exists` clauses with an AND, use them in the +same rule. In the following example: @@ -805,6 +839,7 @@ The only clauses currently available are: - `if` - `changes` +- `exists` Keywords such as `branches` or `refs` that are currently available for `only`/`except` are not yet available in `rules` as they are being individually diff --git a/spec/graphql/types/issue_type_spec.rb b/spec/graphql/types/issue_type_spec.rb index 1621319e618..59c42aa446d 100644 --- a/spec/graphql/types/issue_type_spec.rb +++ b/spec/graphql/types/issue_type_spec.rb @@ -10,7 +10,7 @@ describe GitlabSchema.types['Issue'] do it { expect(described_class.interfaces).to include(Types::Notes::NoteableType.to_graphql) } it 'has specific fields' do - fields = %i[iid title description state reference author assignees participants labels epic milestone due_date + fields = %i[iid title description state reference author assignees participants labels milestone due_date confidential discussion_locked upvotes downvotes user_notes_count web_path web_url relative_position time_estimate total_time_spent closed_at created_at updated_at task_completion_status] diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index a26b2979855..25e17f3bec4 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1427,10 +1427,18 @@ describe User do expect(described_class.search(user.username)).to eq([user, user2]) end + it 'returns users with a matching username starting with a @' do + expect(described_class.search("@#{user.username}")).to eq([user, user2]) + end + it 'returns users with a partially matching username' do expect(described_class.search(user.username[0..2])).to eq([user, user2]) end + it 'returns users with a partially matching username starting with @' do + expect(described_class.search("@#{user.username[0..2]}")).to eq([user, user2]) + end + it 'returns users with a matching username regardless of the casing' do expect(described_class.search(user2.username.upcase)).to eq([user2]) end