Merge remote-tracking branch 'upstream/master' into 27762-add-default-artifacts-expiration
* upstream/master: (247 commits) Switched CONTRIBUTING.md style guide recommendation for method chaining Fix new offenses Stylistic tweaks Fix OAuth/SAML user blocking behavior Revert "Enable Style/DotPosition" Revert "Prefer leading style for Style/DotPosition" Revert "Enable Style/BarePercentLiterals" Manually correct autocorrect Move up delegate calls Exclude migrations from Style/MutableConstant ActiveSupport delegation is preferred over Forwardable Update haml_lint to work with newest rubocop Add explanations to cops Update rubocop and rubocop-rspec and regenerate .rubocop_todo.yml Update rubocop and rubocop-rspec and regenerate .rubocop_todo.yml Order cops alphabetically Don’t exclude some file in lib from rubocop Fix new offenses Enable Rails/Delegate Enable Style/WordArray ...
This commit is contained in:
commit
83418ad846
|
@ -51,3 +51,4 @@ eslint-report.html
|
|||
/builds/*
|
||||
/shared/*
|
||||
/.gitlab_workhorse_secret
|
||||
/webpack-report/
|
||||
|
|
|
@ -240,6 +240,25 @@ rake db:seed_fu:
|
|||
paths:
|
||||
- log/development.log
|
||||
|
||||
rake gitlab:assets:compile:
|
||||
stage: test
|
||||
<<: *dedicated-runner
|
||||
dependencies: []
|
||||
variables:
|
||||
NODE_ENV: "production"
|
||||
RAILS_ENV: "production"
|
||||
SETUP_DB: "false"
|
||||
USE_DB: "false"
|
||||
SKIP_STORAGE_VALIDATION: "true"
|
||||
WEBPACK_REPORT: "true"
|
||||
script:
|
||||
- bundle exec rake yarn:install gitlab:assets:compile
|
||||
artifacts:
|
||||
name: webpack-report
|
||||
expire_in: 31d
|
||||
paths:
|
||||
- webpack-report/
|
||||
|
||||
rake karma:
|
||||
cache:
|
||||
paths:
|
||||
|
@ -281,7 +300,7 @@ bundler:audit:
|
|||
- master@gitlab/gitlabhq
|
||||
- master@gitlab/gitlab-ee
|
||||
script:
|
||||
- "bundle exec bundle-audit check --update --ignore OSVDB-115941"
|
||||
- "bundle exec bundle-audit check --update --ignore OSVDB-115941 CVE-2016-6316 CVE-2016-6317"
|
||||
|
||||
migration paths:
|
||||
stage: test
|
||||
|
@ -388,6 +407,7 @@ pages:
|
|||
dependencies:
|
||||
- coverage
|
||||
- rake karma
|
||||
- rake gitlab:assets:compile
|
||||
- lint:javascript:report
|
||||
script:
|
||||
- mv public/ .public/
|
||||
|
@ -395,6 +415,7 @@ pages:
|
|||
- mv coverage/ public/coverage-ruby/ || true
|
||||
- mv coverage-javascript/ public/coverage-javascript/ || true
|
||||
- mv eslint-report.html public/ || true
|
||||
- mv webpack-report/ public/webpack-report/ || true
|
||||
artifacts:
|
||||
paths:
|
||||
- public
|
||||
|
|
277
.rubocop.yml
277
.rubocop.yml
|
@ -22,15 +22,12 @@ AllCops:
|
|||
- 'db/fixtures/**/*'
|
||||
- 'tmp/**/*'
|
||||
- 'bin/**/*'
|
||||
- 'lib/backup/**/*'
|
||||
- 'lib/ci/backup/**/*'
|
||||
- 'lib/tasks/**/*'
|
||||
- 'lib/ci/migrate/**/*'
|
||||
- 'lib/email_validator.rb'
|
||||
- 'lib/gitlab/upgrader.rb'
|
||||
- 'lib/gitlab/seeder.rb'
|
||||
- 'generator_templates/**/*'
|
||||
|
||||
# Gems in consecutive lines should be alphabetically sorted
|
||||
Bundler/OrderedGems:
|
||||
Enabled: false
|
||||
|
||||
# Style #######################################################################
|
||||
|
||||
# Check indentation of private/protected visibility modifiers.
|
||||
|
@ -54,6 +51,16 @@ Style/AlignArray:
|
|||
Style/AlignHash:
|
||||
Enabled: true
|
||||
|
||||
# Here we check if the parameters on a multi-line method call or
|
||||
# definition are aligned.
|
||||
Style/AlignParameters:
|
||||
Enabled: false
|
||||
|
||||
# Whether `and` and `or` are banned only in conditionals (conditionals)
|
||||
# or completely (always).
|
||||
Style/AndOr:
|
||||
Enabled: true
|
||||
|
||||
# Use `Array#join` instead of `Array#*`.
|
||||
Style/ArrayJoin:
|
||||
Enabled: true
|
||||
|
@ -78,15 +85,24 @@ Style/BeginBlock:
|
|||
Style/BlockComments:
|
||||
Enabled: true
|
||||
|
||||
# Put end statement of multiline block on its own line.
|
||||
Style/BlockEndNewline:
|
||||
Enabled: true
|
||||
|
||||
# Avoid using {...} for multi-line blocks (multiline chaining is # always
|
||||
# ugly). Prefer {...} over do...end for single-line blocks.
|
||||
Style/BlockDelimiters:
|
||||
Enabled: true
|
||||
|
||||
# Put end statement of multiline block on its own line.
|
||||
Style/BlockEndNewline:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for braces around the last parameter in a method call
|
||||
# if the last parameter is a hash.
|
||||
Style/BracesAroundHashParameters:
|
||||
Enabled: false
|
||||
|
||||
# This cop checks for uses of the case equality operator(===).
|
||||
Style/CaseEquality:
|
||||
Enabled: false
|
||||
|
||||
# Indentation of when in a case/when/[else/]end.
|
||||
Style/CaseIndentation:
|
||||
Enabled: true
|
||||
|
@ -105,7 +121,7 @@ Style/ClassAndModuleChildren:
|
|||
|
||||
# Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.
|
||||
Style/ClassCheck:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
|
||||
# Use self when defining module/class methods.
|
||||
Style/ClassMethods:
|
||||
|
@ -115,10 +131,26 @@ Style/ClassMethods:
|
|||
Style/ClassVars:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for methods invoked via the :: operator instead
|
||||
# of the . operator (like FileUtils::rmdir instead of FileUtils.rmdir).
|
||||
Style/ColonMethodCall:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks that comment annotation keywords are written according
|
||||
# to guidelines.
|
||||
Style/CommentAnnotation:
|
||||
Enabled: false
|
||||
|
||||
# Indentation of comments.
|
||||
Style/CommentIndentation:
|
||||
Enabled: true
|
||||
|
||||
# Check for `if` and `case` statements where each branch is used for
|
||||
# assignment to the same variable when using the return of the
|
||||
# condition can be used instead.
|
||||
Style/ConditionalAssignment:
|
||||
Enabled: true
|
||||
|
||||
# Constants should use SCREAMING_SNAKE_CASE.
|
||||
Style/ConstantName:
|
||||
Enabled: true
|
||||
|
@ -131,13 +163,19 @@ Style/DefWithParentheses:
|
|||
Style/Documentation:
|
||||
Enabled: false
|
||||
|
||||
# This cop checks for uses of double negation (!!) to convert something
|
||||
# to a boolean value. As this is both cryptic and usually redundant, it
|
||||
# should be avoided.
|
||||
Style/DoubleNegation:
|
||||
Enabled: false
|
||||
|
||||
# Align elses and elsifs correctly.
|
||||
Style/ElseAlignment:
|
||||
Enabled: true
|
||||
|
||||
# Use empty lines between defs.
|
||||
Style/EmptyLineBetweenDefs:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
|
||||
# Don't use several empty lines in a row.
|
||||
Style/EmptyLines:
|
||||
|
@ -155,14 +193,14 @@ Style/EmptyLinesAroundBlockBody:
|
|||
Style/EmptyLinesAroundClassBody:
|
||||
Enabled: true
|
||||
|
||||
# Keeps track of empty lines around module bodies.
|
||||
Style/EmptyLinesAroundModuleBody:
|
||||
Enabled: true
|
||||
|
||||
# Keeps track of empty lines around method bodies.
|
||||
Style/EmptyLinesAroundMethodBody:
|
||||
Enabled: true
|
||||
|
||||
# Keeps track of empty lines around module bodies.
|
||||
Style/EmptyLinesAroundModuleBody:
|
||||
Enabled: true
|
||||
|
||||
# Avoid the use of END blocks.
|
||||
Style/EndBlock:
|
||||
Enabled: true
|
||||
|
@ -195,24 +233,28 @@ Style/For:
|
|||
# Checks if there is a magic comment to enforce string literals
|
||||
Style/FrozenStringLiteralComment:
|
||||
Enabled: false
|
||||
|
||||
# Do not introduce global variables.
|
||||
Style/GlobalVars:
|
||||
Enabled: true
|
||||
Exclude:
|
||||
- 'lib/backup/**/*'
|
||||
- 'lib/tasks/**/*'
|
||||
|
||||
# Prefer Ruby 1.9 hash syntax `{ a: 1, b: 2 }`
|
||||
# over 1.8 syntax `{ :a => 1, :b => 2 }`.
|
||||
Style/HashSyntax:
|
||||
Enabled: true
|
||||
|
||||
# Do not use if x; .... Use the ternary operator instead.
|
||||
Style/IfWithSemicolon:
|
||||
Enabled: true
|
||||
|
||||
# Checks that conditional statements do not have an identical line at the
|
||||
# end of each branch, which can validly be moved out of the conditional.
|
||||
Style/IdenticalConditionalBranches:
|
||||
Enabled: true
|
||||
|
||||
# Do not use if x; .... Use the ternary operator instead.
|
||||
Style/IfWithSemicolon:
|
||||
Enabled: true
|
||||
|
||||
# Checks the indentation of the first line of the right-hand-side of a
|
||||
# multi-line assignment.
|
||||
Style/IndentAssignment:
|
||||
|
@ -253,7 +295,7 @@ Style/ModuleFunction:
|
|||
# Checks that the closing brace in an array literal is either on the same line
|
||||
# as the last array element, or a new line.
|
||||
Style/MultilineArrayBraceLayout:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
EnforcedStyle: symmetrical
|
||||
|
||||
# Avoid multi-line chains of blocks.
|
||||
|
@ -267,7 +309,7 @@ Style/MultilineBlockLayout:
|
|||
# Checks that the closing brace in a hash literal is either on the same line as
|
||||
# the last hash element, or a new line.
|
||||
Style/MultilineHashBraceLayout:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
EnforcedStyle: symmetrical
|
||||
|
||||
# Do not use then for multi-line if/unless.
|
||||
|
@ -299,6 +341,14 @@ Style/MultilineOperationIndentation:
|
|||
Style/MultilineTernaryOperator:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks whether some constant value isn't a
|
||||
# mutable literal (e.g. array or hash).
|
||||
Style/MutableConstant:
|
||||
Enabled: true
|
||||
Exclude:
|
||||
- 'db/migrate/**/*'
|
||||
- 'db/post_migrate/**/*'
|
||||
|
||||
# Favor unless over if for negative conditions (or control flow or).
|
||||
Style/NegatedIf:
|
||||
Enabled: true
|
||||
|
@ -401,6 +451,10 @@ Style/SpaceBeforeComment:
|
|||
Style/SpaceBeforeSemicolon:
|
||||
Enabled: true
|
||||
|
||||
# Checks for spaces inside square brackets.
|
||||
Style/SpaceInsideBrackets:
|
||||
Enabled: true
|
||||
|
||||
# Use spaces inside hash literal braces - or don't.
|
||||
Style/SpaceInsideHashLiteralBraces:
|
||||
Enabled: true
|
||||
|
@ -437,6 +491,10 @@ Style/Tab:
|
|||
Style/TrailingBlankLines:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for trailing comma in array and hash literals.
|
||||
Style/TrailingCommaInLiteral:
|
||||
Enabled: false
|
||||
|
||||
# Checks for %W when interpolation is not needed.
|
||||
Style/UnneededCapitalW:
|
||||
Enabled: true
|
||||
|
@ -472,7 +530,7 @@ Style/WhileUntilModifier:
|
|||
|
||||
# Use %w or %W for arrays of words.
|
||||
Style/WordArray:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
|
||||
# Metrics #####################################################################
|
||||
|
||||
|
@ -482,6 +540,10 @@ Metrics/AbcSize:
|
|||
Enabled: true
|
||||
Max: 60
|
||||
|
||||
# This cop checks if the length of a block exceeds some maximum value.
|
||||
Metrics/BlockLength:
|
||||
Enabled: false
|
||||
|
||||
# Avoid excessive block nesting.
|
||||
Metrics/BlockNesting:
|
||||
Enabled: true
|
||||
|
@ -521,20 +583,21 @@ Metrics/PerceivedComplexity:
|
|||
|
||||
# Lint ########################################################################
|
||||
|
||||
# Checks for useless access modifiers.
|
||||
Lint/UselessAccessModifier:
|
||||
Enabled: true
|
||||
|
||||
# Checks for attempts to use `private` or `protected` to set the visibility
|
||||
# of a class method, which does not work.
|
||||
Lint/IneffectiveAccessModifier:
|
||||
Enabled: false
|
||||
|
||||
# Checks for ambiguous operators in the first argument of a method invocation
|
||||
# without parentheses.
|
||||
Lint/AmbiguousOperator:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for ambiguous regexp literals in the first argument of
|
||||
# a method invocation without parentheses.
|
||||
Lint/AmbiguousRegexpLiteral:
|
||||
Enabled: false
|
||||
|
||||
# This cop checks for assignments in the conditions of
|
||||
# if/while/until.
|
||||
Lint/AssignmentInCondition:
|
||||
Enabled: false
|
||||
|
||||
# Align block ends correctly.
|
||||
Lint/BlockAlignment:
|
||||
Enabled: true
|
||||
|
@ -588,10 +651,6 @@ Lint/EndInMethod:
|
|||
Lint/EnsureReturn:
|
||||
Enabled: true
|
||||
|
||||
# The use of eval represents a serious security risk.
|
||||
Lint/Eval:
|
||||
Enabled: true
|
||||
|
||||
# Catches floating-point literals too large or small for Ruby to represent.
|
||||
Lint/FloatOutOfRange:
|
||||
Enabled: true
|
||||
|
@ -600,11 +659,20 @@ Lint/FloatOutOfRange:
|
|||
Lint/FormatParameterMismatch:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for *rescue* blocks with no body.
|
||||
Lint/HandleExceptions:
|
||||
Enabled: false
|
||||
|
||||
# Checks for adjacent string literals on the same line, which could better be
|
||||
# represented as a single string literal.
|
||||
Lint/ImplicitStringConcatenation:
|
||||
Enabled: true
|
||||
|
||||
# Checks for attempts to use `private` or `protected` to set the visibility
|
||||
# of a class method, which does not work.
|
||||
Lint/IneffectiveAccessModifier:
|
||||
Enabled: false
|
||||
|
||||
# Checks for invalid character literals with a non-escaped whitespace
|
||||
# character.
|
||||
Lint/InvalidCharacterLiteral:
|
||||
|
@ -618,6 +686,10 @@ Lint/LiteralInCondition:
|
|||
Lint/LiteralInInterpolation:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for uses of *begin...end while/until something*.
|
||||
Lint/Loop:
|
||||
Enabled: false
|
||||
|
||||
# Do not use nested method definitions.
|
||||
Lint/NestedMethodDefinition:
|
||||
Enabled: true
|
||||
|
@ -647,6 +719,11 @@ Lint/RescueException:
|
|||
Lint/ShadowedException:
|
||||
Enabled: false
|
||||
|
||||
# This cop looks for use of the same name as outer local variables
|
||||
# for block arguments or block local variables.
|
||||
Lint/ShadowingOuterLocalVariable:
|
||||
Enabled: false
|
||||
|
||||
# Checks for Object#to_s usage in string interpolation.
|
||||
Lint/StringConversionInInterpolation:
|
||||
Enabled: true
|
||||
|
@ -655,16 +732,36 @@ Lint/StringConversionInInterpolation:
|
|||
Lint/UnderscorePrefixedVariableName:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for using Fixnum or Bignum constant
|
||||
Lint/UnifiedInteger:
|
||||
Enabled: true
|
||||
|
||||
# Checks for rubocop:disable comments that can be removed.
|
||||
# Note: this cop is not disabled when disabling all cops.
|
||||
# It must be explicitly disabled.
|
||||
Lint/UnneededDisable:
|
||||
Enabled: false
|
||||
|
||||
# This cop checks for unneeded usages of splat expansion
|
||||
Lint/UnneededSplatExpansion:
|
||||
Enabled: false
|
||||
|
||||
# Unreachable code.
|
||||
Lint/UnreachableCode:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for unused block arguments.
|
||||
Lint/UnusedBlockArgument:
|
||||
Enabled: false
|
||||
|
||||
# This cop checks for unused method arguments.
|
||||
Lint/UnusedMethodArgument:
|
||||
Enabled: false
|
||||
|
||||
# Checks for useless access modifiers.
|
||||
Lint/UselessAccessModifier:
|
||||
Enabled: true
|
||||
|
||||
# Checks for useless assignment to a local variable.
|
||||
Lint/UselessAssignment:
|
||||
Enabled: true
|
||||
|
@ -704,6 +801,22 @@ Performance/LstripRstrip:
|
|||
Performance/RangeInclude:
|
||||
Enabled: true
|
||||
|
||||
# This cop identifies the use of a `&block` parameter and `block.call`
|
||||
# where `yield` would do just as well.
|
||||
Performance/RedundantBlockCall:
|
||||
Enabled: true
|
||||
|
||||
# This cop identifies use of `Regexp#match` or `String#match in a context
|
||||
# where the integral return value of `=~` would do just as well.
|
||||
Performance/RedundantMatch:
|
||||
Enabled: true
|
||||
|
||||
# This cop identifies places where `Hash#merge!` can be replaced by
|
||||
# `Hash#[]=`.
|
||||
Performance/RedundantMerge:
|
||||
Enabled: true
|
||||
MaxKeyValuePairs: 1
|
||||
|
||||
# Use `sort` instead of `sort_by { |x| x }`.
|
||||
Performance/RedundantSortBy:
|
||||
Enabled: true
|
||||
|
@ -723,6 +836,17 @@ Performance/StringReplacement:
|
|||
Performance/TimesMap:
|
||||
Enabled: true
|
||||
|
||||
# Security ####################################################################
|
||||
|
||||
# This cop checks for the use of JSON class methods which have potential
|
||||
# security issues.
|
||||
Security/JSONLoad:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for the use of *Kernel#eval*.
|
||||
Security/Eval:
|
||||
Enabled: true
|
||||
|
||||
# Rails #######################################################################
|
||||
|
||||
# Enables Rails cops.
|
||||
|
@ -741,8 +865,19 @@ Rails/Date:
|
|||
|
||||
# Prefer delegate method for delegations.
|
||||
Rails/Delegate:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks dynamic `find_by_*` methods.
|
||||
Rails/DynamicFindBy:
|
||||
Enabled: false
|
||||
|
||||
# This cop enforces that 'exit' calls are not used within a rails app.
|
||||
Rails/Exit:
|
||||
Enabled: true
|
||||
Exclude:
|
||||
- lib/gitlab/upgrader.rb
|
||||
- 'lib/backup/**/*'
|
||||
|
||||
# Prefer `find_by` over `where.first`.
|
||||
Rails/FindBy:
|
||||
Enabled: true
|
||||
|
@ -755,9 +890,25 @@ Rails/FindEach:
|
|||
Rails/HasAndBelongsToMany:
|
||||
Enabled: true
|
||||
|
||||
# This cop is used to identify usages of http methods like `get`, `post`,
|
||||
# `put`, `patch` without the usage of keyword arguments in your tests and
|
||||
# change them to use keyword args.
|
||||
Rails/HttpPositionalArguments:
|
||||
Enabled: false
|
||||
|
||||
# Checks for calls to puts, print, etc.
|
||||
Rails/Output:
|
||||
Enabled: true
|
||||
Exclude:
|
||||
- lib/gitlab/seeder.rb
|
||||
- lib/gitlab/upgrader.rb
|
||||
- 'lib/backup/**/*'
|
||||
- 'lib/tasks/**/*'
|
||||
|
||||
# This cop checks for the use of output safety calls like html_safe and
|
||||
# raw.
|
||||
Rails/OutputSafety:
|
||||
Enabled: false
|
||||
|
||||
# Checks for incorrect grammar when using methods like `3.day.ago`.
|
||||
Rails/PluralizationGrammar:
|
||||
|
@ -771,6 +922,14 @@ Rails/ReadWriteAttribute:
|
|||
Rails/ScopeArgs:
|
||||
Enabled: true
|
||||
|
||||
# This cop checks for the use of Time methods without zone.
|
||||
Rails/TimeZone:
|
||||
Enabled: false
|
||||
|
||||
# This cop checks for the use of old-style attribute validation macros.
|
||||
Rails/Validation:
|
||||
Enabled: true
|
||||
|
||||
# RSpec #######################################################################
|
||||
|
||||
# Check that instances are not being stubbed globally.
|
||||
|
@ -779,7 +938,7 @@ RSpec/AnyInstance:
|
|||
|
||||
# Check for expectations where `be(...)` can replace `eql(...)`.
|
||||
RSpec/BeEql:
|
||||
Enabled: false
|
||||
Enabled: true
|
||||
|
||||
# Check that the first argument to the top level describe is the tested class or
|
||||
# module.
|
||||
|
@ -828,21 +987,51 @@ RSpec/Focus:
|
|||
RSpec/InstanceVariable:
|
||||
Enabled: false
|
||||
|
||||
# Checks for `subject` definitions that come after `let` definitions.
|
||||
RSpec/LeadingSubject:
|
||||
Enabled: false
|
||||
|
||||
# Checks unreferenced `let!` calls being used for test setup.
|
||||
RSpec/LetSetup:
|
||||
Enabled: false
|
||||
|
||||
# Check that chains of messages are not being stubbed.
|
||||
RSpec/MessageChain:
|
||||
Enabled: false
|
||||
|
||||
# Checks that message expectations are set using spies.
|
||||
RSpec/MessageSpies:
|
||||
Enabled: false
|
||||
|
||||
# Checks for multiple top-level describes.
|
||||
RSpec/MultipleDescribes:
|
||||
Enabled: false
|
||||
|
||||
# Checks if examples contain too many `expect` calls.
|
||||
RSpec/MultipleExpectations:
|
||||
Enabled: false
|
||||
|
||||
# Checks for explicitly referenced test subjects.
|
||||
RSpec/NamedSubject:
|
||||
Enabled: false
|
||||
|
||||
# Checks for nested example groups.
|
||||
RSpec/NestedGroups:
|
||||
Enabled: false
|
||||
|
||||
# Enforces the usage of the same method on all negative message expectations.
|
||||
RSpec/NotToNot:
|
||||
EnforcedStyle: not_to
|
||||
Enabled: true
|
||||
|
||||
# Check for repeated description strings in example groups.
|
||||
RSpec/RepeatedDescription:
|
||||
Enabled: false
|
||||
|
||||
# Checks for stubbed test subjects.
|
||||
RSpec/SubjectStub:
|
||||
Enabled: false
|
||||
|
||||
# Prefer using verifying doubles over normal doubles.
|
||||
RSpec/VerifiedDoubles:
|
||||
Enabled: false
|
||||
|
||||
# Custom ######################################################################
|
||||
|
||||
# Disallow the `git` and `github` arguments in the Gemfile.
|
||||
GemFetcher:
|
||||
Enabled: true
|
||||
|
|
|
@ -1,79 +1,13 @@
|
|||
# This configuration was generated by
|
||||
# `rubocop --auto-gen-config --exclude-limit 0`
|
||||
# on 2017-01-11 09:38:25 +0000 using RuboCop version 0.46.0.
|
||||
# on 2017-02-22 13:02:35 -0600 using RuboCop version 0.47.1.
|
||||
# The point is for the user to remove these configuration records
|
||||
# one by one as the offenses are removed from the code base.
|
||||
# Note that changes in the inspected code, or installation of new
|
||||
# versions of RuboCop, may require this file to be generated again.
|
||||
|
||||
# Offense count: 27
|
||||
# Configuration parameters: Include.
|
||||
# Include: **/Gemfile, **/gems.rb
|
||||
Bundler/OrderedGems:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 175
|
||||
Lint/AmbiguousRegexpLiteral:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 53
|
||||
# Configuration parameters: AllowSafeAssignment.
|
||||
Lint/AssignmentInCondition:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 20
|
||||
Lint/HandleExceptions:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 1
|
||||
Lint/Loop:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 27
|
||||
Lint/ShadowingOuterLocalVariable:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 10
|
||||
# Cop supports --auto-correct.
|
||||
Lint/UnifiedInteger:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 21
|
||||
# Cop supports --auto-correct.
|
||||
Lint/UnneededSplatExpansion:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 82
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: IgnoreEmptyBlocks, AllowUnusedKeywordArguments.
|
||||
Lint/UnusedBlockArgument:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 173
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
|
||||
Lint/UnusedMethodArgument:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 93
|
||||
# Configuration parameters: CountComments.
|
||||
Metrics/BlockLength:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 3
|
||||
# Cop supports --auto-correct.
|
||||
Performance/RedundantBlockCall:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 5
|
||||
# Cop supports --auto-correct.
|
||||
Performance/RedundantMatch:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 32
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: MaxKeyValuePairs.
|
||||
Performance/RedundantMerge:
|
||||
# Offense count: 51
|
||||
RSpec/BeforeAfterAll:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 15
|
||||
|
@ -81,7 +15,11 @@ Performance/RedundantMerge:
|
|||
RSpec/EmptyExampleGroup:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 58
|
||||
# Offense count: 1
|
||||
RSpec/ExpectOutput:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 63
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: implicit, each, example
|
||||
RSpec/HookArgument:
|
||||
|
@ -93,154 +31,59 @@ RSpec/HookArgument:
|
|||
RSpec/ImplicitExpect:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 237
|
||||
RSpec/LeadingSubject:
|
||||
# Offense count: 36
|
||||
RSpec/RepeatedExample:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 253
|
||||
RSpec/LetSetup:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 13
|
||||
RSpec/MessageChain:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 479
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: have_received, receive
|
||||
RSpec/MessageSpies:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 3036
|
||||
RSpec/MultipleExpectations:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 2133
|
||||
RSpec/NamedSubject:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 1974
|
||||
# Configuration parameters: MaxNesting.
|
||||
RSpec/NestedGroups:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 32
|
||||
RSpec/RepeatedDescription:
|
||||
# Offense count: 34
|
||||
RSpec/ScatteredSetup:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 1
|
||||
RSpec/SingleArgumentMessageChain:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 133
|
||||
RSpec/SubjectStub:
|
||||
# Offense count: 163
|
||||
Rails/FilePath:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 104
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: Whitelist.
|
||||
# Whitelist: find_by_sql
|
||||
Rails/DynamicFindBy:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 932
|
||||
# Cop supports --auto-correct.
|
||||
# Offense count: 2
|
||||
# Configuration parameters: Include.
|
||||
# Include: spec/**/*, test/**/*
|
||||
Rails/HttpPositionalArguments:
|
||||
# Include: db/migrate/*.rb
|
||||
Rails/ReversibleMigration:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 278
|
||||
# Configuration parameters: Blacklist.
|
||||
# Blacklist: decrement!, decrement_counter, increment!, increment_counter, toggle!, touch, update_all, update_attribute, update_column, update_columns, update_counters
|
||||
Rails/SkipsModelValidations:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 7
|
||||
# Cop supports --auto-correct.
|
||||
Security/YAMLLoad:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 55
|
||||
Rails/OutputSafety:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 182
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: strict, flexible
|
||||
Rails/TimeZone:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 15
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: Include.
|
||||
# Include: app/models/**/*.rb
|
||||
Rails/Validation:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 8
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AutoCorrect.
|
||||
Security/JSONLoad:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 346
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
|
||||
# SupportedStyles: with_first_parameter, with_fixed_indentation
|
||||
Style/AlignParameters:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 27
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: always, conditionals
|
||||
Style/AndOr:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 54
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: percent_q, bare_percent
|
||||
Style/BarePercentLiterals:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 358
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: braces, no_braces, context_dependent
|
||||
Style/BracesAroundHashParameters:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 6
|
||||
Style/CaseEquality:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 37
|
||||
# Cop supports --auto-correct.
|
||||
Style/ColonMethodCall:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 4
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: Keywords.
|
||||
# Keywords: TODO, FIXME, OPTIMIZE, HACK, REVIEW
|
||||
Style/CommentAnnotation:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 29
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, SingleLineConditionsOnly.
|
||||
# SupportedStyles: assign_to_condition, assign_inside_condition
|
||||
Style/ConditionalAssignment:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 1210
|
||||
# Offense count: 1304
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: leading, trailing
|
||||
Style/DotPosition:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 18
|
||||
Style/DoubleNegation:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 7
|
||||
# Offense count: 6
|
||||
# Cop supports --auto-correct.
|
||||
Style/EachWithObject:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 24
|
||||
# Offense count: 25
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: empty, nil, both
|
||||
|
@ -252,14 +95,14 @@ Style/EmptyElse:
|
|||
Style/EmptyLiteral:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 57
|
||||
# Offense count: 56
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: compact, expanded
|
||||
Style/EmptyMethod:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 147
|
||||
# Offense count: 184
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment.
|
||||
Style/ExtraSpacing:
|
||||
|
@ -271,50 +114,50 @@ Style/ExtraSpacing:
|
|||
Style/FormatString:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 238
|
||||
# Offense count: 268
|
||||
# Configuration parameters: MinBodyLength.
|
||||
Style/GuardClause:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 11
|
||||
# Offense count: 14
|
||||
Style/IfInsideElse:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 173
|
||||
# Offense count: 179
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: MaxLineLength.
|
||||
Style/IfUnlessModifier:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 55
|
||||
# Offense count: 57
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
|
||||
# SupportedStyles: special_inside_parentheses, consistent, align_brackets
|
||||
Style/IndentArray:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 101
|
||||
# Offense count: 120
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
|
||||
# SupportedStyles: special_inside_parentheses, consistent, align_braces
|
||||
Style/IndentHash:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 41
|
||||
# Offense count: 45
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: line_count_dependent, lambda, literal
|
||||
Style/Lambda:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 5
|
||||
# Offense count: 7
|
||||
# Cop supports --auto-correct.
|
||||
Style/LineEndConcatenation:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 19
|
||||
# Offense count: 22
|
||||
# Cop supports --auto-correct.
|
||||
Style/MethodCallParentheses:
|
||||
Style/MethodCallWithoutArgsParentheses:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 9
|
||||
|
@ -326,61 +169,49 @@ Style/MethodMissing:
|
|||
Style/MultilineIfModifier:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 179
|
||||
# Cop supports --auto-correct.
|
||||
Style/MutableConstant:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 8
|
||||
# Offense count: 22
|
||||
# Cop supports --auto-correct.
|
||||
Style/NestedParenthesizedCalls:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 13
|
||||
# Offense count: 17
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, MinBodyLength, SupportedStyles.
|
||||
# SupportedStyles: skip_modifier_ifs, always
|
||||
Style/Next:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 19
|
||||
# Offense count: 31
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedOctalStyle, SupportedOctalStyles.
|
||||
# SupportedOctalStyles: zero_with_o, zero_only
|
||||
Style/NumericLiteralPrefix:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 19
|
||||
# Offense count: 77
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AutoCorrect, EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: predicate, comparison
|
||||
Style/NumericPredicate:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 34
|
||||
# Offense count: 36
|
||||
# Cop supports --auto-correct.
|
||||
Style/ParallelAssignment:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 417
|
||||
# Offense count: 477
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: PreferredDelimiters.
|
||||
Style/PercentLiteralDelimiters:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 10
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: lower_case_q, upper_case_q
|
||||
Style/PercentQLiterals:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 13
|
||||
# Offense count: 14
|
||||
# Cop supports --auto-correct.
|
||||
Style/PerlBackrefs:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 64
|
||||
# Offense count: 72
|
||||
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
|
||||
# NamePrefix: is_, has_, have_
|
||||
# NamePrefixBlacklist: is_, has_, have_
|
||||
|
@ -388,7 +219,7 @@ Style/PerlBackrefs:
|
|||
Style/PredicateName:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 33
|
||||
# Offense count: 39
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: short, verbose
|
||||
|
@ -400,7 +231,7 @@ Style/PreferredHashMethods:
|
|||
Style/Proc:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 50
|
||||
# Offense count: 62
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: compact, exploded
|
||||
|
@ -412,30 +243,30 @@ Style/RaiseArgs:
|
|||
Style/RedundantBegin:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 29
|
||||
# Offense count: 32
|
||||
# Cop supports --auto-correct.
|
||||
Style/RedundantFreeze:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 11
|
||||
# Offense count: 15
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowMultipleReturnValues.
|
||||
Style/RedundantReturn:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 359
|
||||
# Offense count: 365
|
||||
# Cop supports --auto-correct.
|
||||
Style/RedundantSelf:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 105
|
||||
# Offense count: 108
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
|
||||
# SupportedStyles: slashes, percent_r, mixed
|
||||
Style/RegexpLiteral:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 19
|
||||
# Offense count: 22
|
||||
# Cop supports --auto-correct.
|
||||
Style/RescueModifier:
|
||||
Enabled: false
|
||||
|
@ -445,19 +276,13 @@ Style/RescueModifier:
|
|||
Style/SelfAssignment:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 2
|
||||
# Configuration parameters: Methods.
|
||||
# Methods: {"reduce"=>["acc", "elem"]}, {"inject"=>["acc", "elem"]}
|
||||
Style/SingleLineBlockParams:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 50
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowIfMethodIsEmpty.
|
||||
Style/SingleLineMethods:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 138
|
||||
# Offense count: 155
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: space, no_space
|
||||
|
@ -470,26 +295,22 @@ Style/SpaceBeforeBlockBraces:
|
|||
Style/SpaceBeforeFirstArg:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 37
|
||||
# Offense count: 38
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: require_no_space, require_space
|
||||
Style/SpaceInLambdaLiteral:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 174
|
||||
# Offense count: 203
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles, EnforcedStyleForEmptyBraces, SupportedStylesForEmptyBraces, SpaceBeforeBlockParameters.
|
||||
# SupportedStyles: space, no_space
|
||||
# SupportedStylesForEmptyBraces: space, no_space
|
||||
Style/SpaceInsideBlockBraces:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 115
|
||||
# Cop supports --auto-correct.
|
||||
Style/SpaceInsideBrackets:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 77
|
||||
# Offense count: 91
|
||||
# Cop supports --auto-correct.
|
||||
Style/SpaceInsideParens:
|
||||
Enabled: false
|
||||
|
@ -499,21 +320,21 @@ Style/SpaceInsideParens:
|
|||
Style/SpaceInsidePercentLiteralDelimiters:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 53
|
||||
# Offense count: 55
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: SupportedStyles.
|
||||
# SupportedStyles: use_perl_names, use_english_names
|
||||
Style/SpecialGlobalVars:
|
||||
EnforcedStyle: use_perl_names
|
||||
|
||||
# Offense count: 25
|
||||
# Offense count: 40
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
||||
# SupportedStyles: single_quotes, double_quotes
|
||||
Style/StringLiteralsInInterpolation:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 54
|
||||
# Offense count: 57
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: IgnoredMethods.
|
||||
# IgnoredMethods: respond_to, define_method
|
||||
|
@ -527,27 +348,20 @@ Style/SymbolProc:
|
|||
Style/TernaryParentheses:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 36
|
||||
# Offense count: 43
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStyles.
|
||||
# SupportedStyles: comma, consistent_comma, no_comma
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStylesForMultiline.
|
||||
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
||||
Style/TrailingCommaInArguments:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 150
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: EnforcedStyleForMultiline, SupportedStyles.
|
||||
# SupportedStyles: comma, consistent_comma, no_comma
|
||||
Style/TrailingCommaInLiteral:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 7
|
||||
# Offense count: 13
|
||||
# Cop supports --auto-correct.
|
||||
# Configuration parameters: AllowNamedUnderscoreVariables.
|
||||
Style/TrailingUnderscoreVariable:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 67
|
||||
# Offense count: 70
|
||||
# Cop supports --auto-correct.
|
||||
Style/TrailingWhitespace:
|
||||
Enabled: false
|
||||
|
@ -559,12 +373,12 @@ Style/TrailingWhitespace:
|
|||
Style/TrivialAccessors:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 2
|
||||
# Offense count: 6
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnlessElse:
|
||||
Enabled: false
|
||||
|
||||
# Offense count: 17
|
||||
# Offense count: 22
|
||||
# Cop supports --auto-correct.
|
||||
Style/UnneededInterpolation:
|
||||
Enabled: false
|
||||
|
|
180
CHANGELOG.md
180
CHANGELOG.md
|
@ -2,6 +2,186 @@
|
|||
documentation](doc/development/changelog.md) for instructions on adding your own
|
||||
entry.
|
||||
|
||||
## 8.17.0 (2017-02-22)
|
||||
|
||||
- API: Fix file downloading. !0 (8267)
|
||||
- Changed composer installer script in the CI PHP example doc. !4342 (Jeffrey Cafferata)
|
||||
- Display fullscreen button on small screens. !5302 (winniehell)
|
||||
- Add system hook for when a project is updated (other than rename/transfer). !5711 (Tommy Beadle)
|
||||
- Fix notifications when set at group level. !6813 (Alexandre Maia)
|
||||
- Project labels can now be promoted to group labels. !7242 (Olaf Tomalka)
|
||||
- use webpack to bundle frontend assets and use karma for frontend testing. !7288
|
||||
- Adds back ability to stop all environments. !7379
|
||||
- Added labels empty state. !7443
|
||||
- Add ability to define a coverage regex in the .gitlab-ci.yml. !7447 (Leandro Camargo)
|
||||
- Disable automatic login after clicking email confirmation links. !7472
|
||||
- Search feature: redirects to commit page if query is commit sha and only commit found. !8028 (YarNayar)
|
||||
- Create a TODO for user who set auto-merge when a build fails, merge conflict occurs. !8056 (twonegatives)
|
||||
- Don't group issues by project on group-level and dashboard issue indexes. !8111 (Bernardo Castro)
|
||||
- Mark MR as WIP when pushing WIP commits. !8124 (Jurre Stender @jurre)
|
||||
- Flag multiple empty lines in eslint, fix offenses. !8137
|
||||
- Add sorting pipeline for a commit. !8319 (Takuya Noguchi)
|
||||
- Adds service trigger events to api. !8324
|
||||
- Update pipeline and commit links when CI status is updated. !8351
|
||||
- Hide version check image if there is no internet connection. !8355 (Ken Ding)
|
||||
- Prevent removal of input fields if it is the parent dropdown element. !8397
|
||||
- Introduce maximum session time for terminal websocket connection. !8413
|
||||
- Allow creating protected branches when user can merge to such branch. !8458
|
||||
- Refactor MergeRequests::BuildService. !8462 (Rydkin Maxim)
|
||||
- Added GitLab Pages to CE. !8463
|
||||
- Support notes when a project is not specified (personal snippet notes). !8468
|
||||
- Use warning icon in mini-graph if stage passed conditionally. !8503
|
||||
- Don’t count tasks that are not defined as list items correctly. !8526
|
||||
- Reformat messages ChatOps. !8528
|
||||
- Copy commit SHA to clipboard. !8547
|
||||
- Improve button accessibility on pipelines page. !8561
|
||||
- Display project ID in project settings. !8572 (winniehell)
|
||||
- PlantUML support for Markdown. !8588 (Horacio Sanson)
|
||||
- Fix reply by email without sub-addressing for some clients from Microsoft and Apple. !8620
|
||||
- Fix nested tasks in ordered list. !8626
|
||||
- Fix Sort by Recent Sign-in in Admin Area. !8637 (Poornima M)
|
||||
- Avoid repeated dashes in $CI_ENVIRONMENT_SLUG. !8638
|
||||
- Only show Merge Request button when user can create a MR. !8639
|
||||
- Prevent copying of line numbers in parallel diff view. !8706
|
||||
- Improve build policy and access abilities. !8711
|
||||
- API: Remove /projects/:id/keys/.. endpoints. !8716 (Robert Schilling)
|
||||
- API: Remove deprecated 'expires_at' from project snippets. !8723 (Robert Schilling)
|
||||
- Add `copy` backup strategy to combat file changed errors. !8728
|
||||
- adds avatar for discussion note. !8734
|
||||
- Add link verification to badge partial in order to render a badge without a link. !8740
|
||||
- Reduce hits to LDAP on Git HTTP auth by reordering auth mechanisms. !8752
|
||||
- prevent diff unfolding link from appearing when there are no more lines to show. !8761
|
||||
- Redesign searchbar in admin project list. !8776
|
||||
- Rename Builds to Pipelines, CI/CD Pipelines, or Jobs everywhere. !8787
|
||||
- dismiss sidebar on repo buttons click. !8798 (Adam Pahlevi)
|
||||
- fixed small mini pipeline graph line glitch. !8804
|
||||
- Make all system notes lowercase. !8807
|
||||
- Support unauthenticated LFS object downloads for public projects. !8824 (Ben Boeckel)
|
||||
- Add read-only full_path and full_name attributes to Group API. !8827
|
||||
- allow relative url change without recompiling frontend assets. !8831
|
||||
- Use vue.js Pipelines table in commit and merge request view. !8844
|
||||
- Use reCaptcha when an issue is identified as a spam. !8846
|
||||
- resolve deprecation warnings. !8855 (Adam Pahlevi)
|
||||
- Cop for gem fetched from a git source. !8856 (Adam Pahlevi)
|
||||
- Remove flash warning from login page. !8864 (Gerald J. Padilla)
|
||||
- Adds documentation for how to use Vue.js. !8866
|
||||
- Add 'View on [env]' link to blobs and individual files in diffs. !8867
|
||||
- Replace word user with member. !8872
|
||||
- Change the reply shortcut to focus the field even without a selection. !8873 (Brian Hall)
|
||||
- Unify MR diff file button style. !8874
|
||||
- Unify projects search by removing /projects/:search endpoint. !8877
|
||||
- Fix disable storing of sensitive information when importing a new repo. !8885 (Bernard Pietraga)
|
||||
- Fix pipeline graph vertical spacing in Firefox and Safari. !8886
|
||||
- Fix filtered search user autocomplete for gitlab instances that are hosted on a subdirectory. !8891
|
||||
- Fix Ctrl+Click support for Todos and Merge Request page tabs. !8898
|
||||
- Fix wrong call to ProjectCacheWorker.perform. !8910
|
||||
- Don't perform Devise trackable updates on blocked User records. !8915
|
||||
- Add ability to export project inherited group members to Import/Export. !8923
|
||||
- replace `find_with_namespace` with `find_by_full_path`. !8949 (Adam Pahlevi)
|
||||
- Fixes flickering of avatar border in mention dropdown. !8950
|
||||
- Remove unnecessary queries for .atom and .json in Dashboard::ProjectsController#index. !8956
|
||||
- Fix deleting projects with pipelines and builds. !8960
|
||||
- Fix broken anchor links when special characters are used. !8961 (Andrey Krivko)
|
||||
- Ensure autogenerated title does not cause failing spec. !8963 (brian m. carlson)
|
||||
- Update doc for enabling or disabling GitLab CI. !8965 (Takuya Noguchi)
|
||||
- Remove deprecated MR and Issue endpoints and preserve V3 namespace. !8967
|
||||
- Fixed "substract" typo on /help/user/project/slash_commands. !8976 (Jason Aquino)
|
||||
- Preserve backward compatibility CI/CD and disallow setting `coverage` regexp in global context. !8981
|
||||
- use babel to transpile all non-vendor javascript assets regardless of file extension. !8988
|
||||
- Fix MR widget url. !8989
|
||||
- Fixes hover cursor on pipeline pagenation. !9003
|
||||
- Layer award emoji dropdown over the right sidebar. !9004
|
||||
- Do not display deploy keys in user's own ssh keys list. !9024
|
||||
- upgrade babel 5.8.x to babel 6.22.x. !9072
|
||||
- upgrade to webpack v2.2. !9078
|
||||
- Trigger autocomplete after selecting a slash command. !9117
|
||||
- Add space between text and loading icon in Megre Request Widget. !9119
|
||||
- Fix job to pipeline renaming. !9147
|
||||
- Replace static fixture for merge_request_tabs_spec.js. !9172 (winniehell)
|
||||
- Replace static fixture for right_sidebar_spec.js. !9211 (winniehell)
|
||||
- Show merge errors in merge request widget. !9229
|
||||
- Increase process_commit queue weight from 2 to 3. !9326 (blackst0ne)
|
||||
- Don't require lib/gitlab/request_profiler/middleware.rb in config/initializers/request_profiler.rb.
|
||||
- Force new password after password reset via API. (George Andrinopoulos)
|
||||
- Allows to search within project by commit hash. (YarNayar)
|
||||
- Show organisation membership and delete comment on smaller viewports, plus change comment author name to username.
|
||||
- Remove turbolinks.
|
||||
- Convert pipeline action icons to svg to have them propperly positioned.
|
||||
- Remove rogue scrollbars for issue comments with inline elements.
|
||||
- Align Segoe UI label text.
|
||||
- Color + and - signs in diffs to increase code legibility.
|
||||
- Fix tab index order on branch commits list page. (Ryan Harris)
|
||||
- Add hover style to copy icon on commit page header. (Ryan Harris)
|
||||
- Remove hover animation from row elements.
|
||||
- Improve pipeline status icon linking in widgets.
|
||||
- Fix commit title bar and repository view copy clipboard button order on last commit in repository view.
|
||||
- Fix mini-pipeline stage tooltip text wrapping.
|
||||
- Updated builds info link on the project settings page. (Ryan Harris)
|
||||
- 27240 Make progress bars consistent.
|
||||
- Only render hr when user can't archive project.
|
||||
- 27352-search-label-filter-header.
|
||||
- Include :author, :project, and :target in Event.with_associations.
|
||||
- Don't instantiate AR objects in Event.in_projects.
|
||||
- Don't capitalize environment name in show page.
|
||||
- Update and pin the `jwt` gem to ~> 1.5.6.
|
||||
- Edited the column header for the environments list from created to updated and added created to environments detail page colum header titles.
|
||||
- Give ci status text on pipeline graph a better font-weight.
|
||||
- Add default labels to bulk assign dropdowns.
|
||||
- Only return target project's comments for a commit.
|
||||
- Fixes Pipelines table is not showing branch name for commit.
|
||||
- Fix regression where cmd-click stopped working for todos and merge request tabs.
|
||||
- Fix stray pipelines API request when showing MR.
|
||||
- Fix Merge request pipelines displays JSON.
|
||||
- Fix current build arrow indicator.
|
||||
- Fix contribution activity alignment.
|
||||
- Show Pipeline(not Job) in MR desktop notification.
|
||||
- Fix tooltips in mini pipeline graph.
|
||||
- Display loading indicator when filtering ref switcher dropdown.
|
||||
- Show pipeline graph in MR widget if there are any stages.
|
||||
- Fix icon colors in merge request widget mini graph.
|
||||
- Improve blockquote formatting in notification emails.
|
||||
- Adds container to tooltip in order to make it work with overflow:hidden in parent element.
|
||||
- Restore pagination to admin abuse reports.
|
||||
- Ensure export files are removed after a namespace is deleted.
|
||||
- Add `y` keyboard shortcut to move to file permalink.
|
||||
- Adds /target_branch slash command functionality for merge requests. (YarNayar)
|
||||
- Patch Asciidocs rendering to block XSS.
|
||||
- contribution calendar scrolls from right to left.
|
||||
- Copying a rendered issue/comment will paste into GFM textareas as actual GFM.
|
||||
- Don't delete assigned MRs/issues when user is deleted.
|
||||
- Remove new branch button for confidential issues.
|
||||
- Don't allow project guests to subscribe to merge requests through the API. (Robert Schilling)
|
||||
- Don't connect in Gitlab::Database.adapter_name.
|
||||
- Prevent users from creating notes on resources they can't access.
|
||||
- Ignore encrypted attributes in Import/Export.
|
||||
- Change rspec test to guarantee window is resized before visiting page.
|
||||
- Prevent users from deleting system deploy keys via the project deploy key API.
|
||||
- Fix XSS vulnerability in SVG attachments.
|
||||
- Make MR-review-discussions more reliable.
|
||||
- fix incorrect sidekiq concurrency count in admin background page. (wendy0402)
|
||||
- Make notification_service spec DRYer by making test reusable. (YarNayar)
|
||||
- Redirect http://someproject.git to http://someproject. (blackst0ne)
|
||||
- Fixed group label links in issue/merge request sidebar.
|
||||
- Improve gl.utils.handleLocationHash tests.
|
||||
- Fixed Issuable sidebar not closing on smaller/mobile sized screens.
|
||||
- Resets assignee dropdown when sidebar is open.
|
||||
- Disallow system notes for closed issuables.
|
||||
- Fix timezone on issue boards due date.
|
||||
- Remove unused js response from refs controller.
|
||||
- Prevent the GitHub importer from assigning labels and comments to merge requests or issues belonging to other projects.
|
||||
- Fixed merge requests tab extra margin when fixed to window.
|
||||
- Patch XSS vulnerability in RDOC support.
|
||||
- Refresh authorizations when transferring projects.
|
||||
- Remove issue and MR counts from labels index.
|
||||
- Don't use backup Active Record connections for Sidekiq.
|
||||
- Add index to ci_trigger_requests for commit_id.
|
||||
- Add indices to improve loading of labels page.
|
||||
- Reduced query count for snippet search.
|
||||
- Update GitLab Pages to v0.3.1.
|
||||
- Upgrade omniauth gem to 1.3.2.
|
||||
- Remove deprecated GitlabCiService.
|
||||
- Requeue pending deletion projects.
|
||||
|
||||
## 8.16.6 (2017-02-17)
|
||||
|
||||
- API: Fix file downloading. !0 (8267)
|
||||
|
|
|
@ -426,7 +426,7 @@ merge request:
|
|||
1. [Ruby](https://github.com/bbatsov/ruby-style-guide).
|
||||
Important sections include [Source Code Layout][rss-source] and
|
||||
[Naming][rss-naming]. Use:
|
||||
- multi-line method chaining style **Option B**: dot `.` on previous line
|
||||
- multi-line method chaining style **Option A**: dot `.` on the second line
|
||||
- string literal quoting style **Option A**: single quoted by default
|
||||
1. [Rails](https://github.com/bbatsov/rails-style-guide)
|
||||
1. [Newlines styleguide][newlines-styleguide]
|
||||
|
|
|
@ -1 +1 @@
|
|||
0.3.1
|
||||
0.3.2
|
||||
|
|
12
Gemfile
12
Gemfile
|
@ -1,6 +1,6 @@
|
|||
source 'https://rubygems.org'
|
||||
|
||||
gem 'rails', '4.2.7.1'
|
||||
gem 'rails', '4.2.8'
|
||||
gem 'rails-deprecated_sanitizer', '~> 1.0.3'
|
||||
|
||||
# Responders respond_to and respond_with
|
||||
|
@ -201,7 +201,7 @@ gem 'babosa', '~> 1.0.2'
|
|||
gem 'loofah', '~> 2.0.3'
|
||||
|
||||
# Working with license
|
||||
gem 'licensee', '~> 8.0.0'
|
||||
gem 'licensee', '~> 8.7.0'
|
||||
|
||||
# Protect against bruteforcing
|
||||
gem 'rack-attack', '~> 4.4.1'
|
||||
|
@ -301,10 +301,10 @@ group :development, :test do
|
|||
gem 'spring-commands-rspec', '~> 1.0.4'
|
||||
gem 'spring-commands-spinach', '~> 1.1.0'
|
||||
|
||||
gem 'rubocop', '~> 0.46.0', require: false
|
||||
gem 'rubocop-rspec', '~> 1.9.1', require: false
|
||||
gem 'rubocop', '~> 0.47.1', require: false
|
||||
gem 'rubocop-rspec', '~> 1.12.0', require: false
|
||||
gem 'scss_lint', '~> 0.47.0', require: false
|
||||
gem 'haml_lint', '~> 0.18.2', require: false
|
||||
gem 'haml_lint', '~> 0.21.0', require: false
|
||||
gem 'simplecov', '0.12.0', require: false
|
||||
gem 'flay', '~> 2.6.1', require: false
|
||||
gem 'bundler-audit', '~> 0.5.0', require: false
|
||||
|
@ -333,7 +333,7 @@ gem 'newrelic_rpm', '~> 3.16'
|
|||
|
||||
gem 'octokit', '~> 4.6.2'
|
||||
|
||||
gem 'mail_room', '~> 0.9.0'
|
||||
gem 'mail_room', '~> 0.9.1'
|
||||
|
||||
gem 'email_reply_trimmer', '~> 0.1'
|
||||
gem 'html2text'
|
||||
|
|
121
Gemfile.lock
121
Gemfile.lock
|
@ -3,40 +3,39 @@ GEM
|
|||
specs:
|
||||
RedCloth (4.3.2)
|
||||
ace-rails-ap (4.1.0)
|
||||
actionmailer (4.2.7.1)
|
||||
actionpack (= 4.2.7.1)
|
||||
actionview (= 4.2.7.1)
|
||||
activejob (= 4.2.7.1)
|
||||
actionmailer (4.2.8)
|
||||
actionpack (= 4.2.8)
|
||||
actionview (= 4.2.8)
|
||||
activejob (= 4.2.8)
|
||||
mail (~> 2.5, >= 2.5.4)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
actionpack (4.2.7.1)
|
||||
actionview (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
actionpack (4.2.8)
|
||||
actionview (= 4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
rack (~> 1.6)
|
||||
rack-test (~> 0.6.2)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
actionview (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
actionview (4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
builder (~> 3.1)
|
||||
erubis (~> 2.7.0)
|
||||
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||
activejob (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
||||
activejob (4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
globalid (>= 0.3.0)
|
||||
activemodel (4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
activemodel (4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
builder (~> 3.1)
|
||||
activerecord (4.2.7.1)
|
||||
activemodel (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
activerecord (4.2.8)
|
||||
activemodel (= 4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
arel (~> 6.0)
|
||||
activerecord_sane_schema_dumper (0.2)
|
||||
rails (>= 4, < 5)
|
||||
activesupport (4.2.7.1)
|
||||
activesupport (4.2.8)
|
||||
i18n (~> 0.7)
|
||||
json (~> 1.7, >= 1.7.7)
|
||||
minitest (~> 5.1)
|
||||
thread_safe (~> 0.3, >= 0.3.4)
|
||||
tzinfo (~> 1.1)
|
||||
|
@ -47,7 +46,7 @@ GEM
|
|||
activerecord (>= 3.0)
|
||||
akismet (2.0.0)
|
||||
allocations (1.0.5)
|
||||
arel (6.0.3)
|
||||
arel (6.0.4)
|
||||
asana (0.4.0)
|
||||
faraday (~> 0.9)
|
||||
faraday_middleware (~> 0.9)
|
||||
|
@ -86,7 +85,7 @@ GEM
|
|||
sass (>= 3.3.4)
|
||||
brakeman (3.4.1)
|
||||
browser (2.2.0)
|
||||
builder (3.2.2)
|
||||
builder (3.2.3)
|
||||
bullet (5.2.0)
|
||||
activesupport (>= 3.0.0)
|
||||
uniform_notifier (~> 1.10.0)
|
||||
|
@ -127,7 +126,7 @@ GEM
|
|||
execjs
|
||||
coffee-script-source (1.10.0)
|
||||
colorize (0.7.7)
|
||||
concurrent-ruby (1.0.2)
|
||||
concurrent-ruby (1.0.4)
|
||||
connection_pool (2.2.1)
|
||||
crack (0.4.3)
|
||||
safe_yaml (~> 1.0.0)
|
||||
|
@ -320,10 +319,10 @@ GEM
|
|||
multi_json (>= 1.3.2)
|
||||
haml (4.0.7)
|
||||
tilt
|
||||
haml_lint (0.18.2)
|
||||
haml_lint (0.21.0)
|
||||
haml (~> 4.0)
|
||||
rake (>= 10, < 12)
|
||||
rubocop (>= 0.36.0)
|
||||
rake (>= 10, < 13)
|
||||
rubocop (>= 0.47.0)
|
||||
sysexits (~> 1.1)
|
||||
hamlit (2.6.1)
|
||||
temple (~> 0.7.6)
|
||||
|
@ -354,7 +353,7 @@ GEM
|
|||
json (~> 1.8)
|
||||
multi_xml (>= 0.5.2)
|
||||
httpclient (2.8.2)
|
||||
i18n (0.7.0)
|
||||
i18n (0.8.0)
|
||||
ice_nine (0.11.1)
|
||||
influxdb (0.2.3)
|
||||
cause
|
||||
|
@ -370,7 +369,7 @@ GEM
|
|||
thor (>= 0.14, < 2.0)
|
||||
jquery-ui-rails (5.0.5)
|
||||
railties (>= 3.2.16)
|
||||
json (1.8.3)
|
||||
json (1.8.6)
|
||||
json-schema (2.6.2)
|
||||
addressable (~> 2.3.8)
|
||||
jwt (1.5.6)
|
||||
|
@ -399,8 +398,8 @@ GEM
|
|||
rubyzip
|
||||
thor
|
||||
xml-simple
|
||||
licensee (8.0.0)
|
||||
rugged (>= 0.24b)
|
||||
licensee (8.7.0)
|
||||
rugged (~> 0.24)
|
||||
little-plugger (1.1.4)
|
||||
logging (2.1.0)
|
||||
little-plugger (~> 1.1)
|
||||
|
@ -409,7 +408,7 @@ GEM
|
|||
nokogiri (>= 1.5.9)
|
||||
mail (2.6.4)
|
||||
mime-types (>= 1.16, < 4)
|
||||
mail_room (0.9.0)
|
||||
mail_room (0.9.1)
|
||||
memoist (0.15.0)
|
||||
method_source (0.8.2)
|
||||
mime-types (2.99.3)
|
||||
|
@ -429,9 +428,8 @@ GEM
|
|||
net-ssh (3.0.1)
|
||||
netrc (0.11.0)
|
||||
newrelic_rpm (3.16.0.318)
|
||||
nokogiri (1.6.8)
|
||||
nokogiri (1.6.8.1)
|
||||
mini_portile2 (~> 2.1.0)
|
||||
pkg-config (~> 1.1.7)
|
||||
numerizer (0.1.1)
|
||||
oauth (0.5.1)
|
||||
oauth2 (1.2.0)
|
||||
|
@ -503,10 +501,9 @@ GEM
|
|||
os (0.9.6)
|
||||
paranoia (2.2.0)
|
||||
activerecord (>= 4.0, < 5.1)
|
||||
parser (2.3.1.4)
|
||||
parser (2.4.0.0)
|
||||
ast (~> 2.2)
|
||||
pg (0.18.4)
|
||||
pkg-config (1.1.7)
|
||||
poltergeist (1.9.0)
|
||||
capybara (~> 2.1)
|
||||
cliver (~> 0.3.1)
|
||||
|
@ -548,28 +545,28 @@ GEM
|
|||
rack
|
||||
rack-test (0.6.3)
|
||||
rack (>= 1.0)
|
||||
rails (4.2.7.1)
|
||||
actionmailer (= 4.2.7.1)
|
||||
actionpack (= 4.2.7.1)
|
||||
actionview (= 4.2.7.1)
|
||||
activejob (= 4.2.7.1)
|
||||
activemodel (= 4.2.7.1)
|
||||
activerecord (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
rails (4.2.8)
|
||||
actionmailer (= 4.2.8)
|
||||
actionpack (= 4.2.8)
|
||||
actionview (= 4.2.8)
|
||||
activejob (= 4.2.8)
|
||||
activemodel (= 4.2.8)
|
||||
activerecord (= 4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
bundler (>= 1.3.0, < 2.0)
|
||||
railties (= 4.2.7.1)
|
||||
railties (= 4.2.8)
|
||||
sprockets-rails
|
||||
rails-deprecated_sanitizer (1.0.3)
|
||||
activesupport (>= 4.2.0.alpha)
|
||||
rails-dom-testing (1.0.7)
|
||||
rails-dom-testing (1.0.8)
|
||||
activesupport (>= 4.2.0.beta, < 5.0)
|
||||
nokogiri (~> 1.6.0)
|
||||
nokogiri (~> 1.6)
|
||||
rails-deprecated_sanitizer (>= 1.0.1)
|
||||
rails-html-sanitizer (1.0.3)
|
||||
loofah (~> 2.0)
|
||||
railties (4.2.7.1)
|
||||
actionpack (= 4.2.7.1)
|
||||
activesupport (= 4.2.7.1)
|
||||
railties (4.2.8)
|
||||
actionpack (= 4.2.8)
|
||||
activesupport (= 4.2.8)
|
||||
rake (>= 0.8.7)
|
||||
thor (>= 0.18.1, < 2.0)
|
||||
rainbow (2.1.0)
|
||||
|
@ -645,13 +642,13 @@ GEM
|
|||
pg
|
||||
rails
|
||||
sqlite3
|
||||
rubocop (0.46.0)
|
||||
parser (>= 2.3.1.1, < 3.0)
|
||||
rubocop (0.47.1)
|
||||
parser (>= 2.3.3.1, < 3.0)
|
||||
powerpack (~> 0.1)
|
||||
rainbow (>= 1.99.1, < 3.0)
|
||||
ruby-progressbar (~> 1.7)
|
||||
unicode-display_width (~> 1.0, >= 1.0.1)
|
||||
rubocop-rspec (1.9.1)
|
||||
rubocop-rspec (1.12.0)
|
||||
rubocop (>= 0.42.0)
|
||||
ruby-fogbugz (0.2.1)
|
||||
crack (~> 0.4)
|
||||
|
@ -733,10 +730,10 @@ GEM
|
|||
spring (>= 0.9.1)
|
||||
spring-commands-spinach (1.1.0)
|
||||
spring (>= 0.9.1)
|
||||
sprockets (3.7.0)
|
||||
sprockets (3.7.1)
|
||||
concurrent-ruby (~> 1.0)
|
||||
rack (> 1, < 3)
|
||||
sprockets-rails (3.1.1)
|
||||
sprockets-rails (3.2.0)
|
||||
actionpack (>= 4.0)
|
||||
activesupport (>= 4.0)
|
||||
sprockets (>= 3.0.0)
|
||||
|
@ -760,9 +757,9 @@ GEM
|
|||
daemons (~> 1.0, >= 1.0.9)
|
||||
eventmachine (~> 1.0, >= 1.0.4)
|
||||
rack (>= 1, < 3)
|
||||
thor (0.19.1)
|
||||
thor (0.19.4)
|
||||
thread_safe (0.3.5)
|
||||
tilt (2.0.5)
|
||||
tilt (2.0.6)
|
||||
timecop (0.8.1)
|
||||
timfel-krb5-auth (0.8.3)
|
||||
tool (0.2.3)
|
||||
|
@ -779,7 +776,7 @@ GEM
|
|||
unf (0.1.4)
|
||||
unf_ext
|
||||
unf_ext (0.0.7.2)
|
||||
unicode-display_width (1.1.1)
|
||||
unicode-display_width (1.1.3)
|
||||
unicorn (5.1.0)
|
||||
kgio (~> 2.6)
|
||||
raindrops (~> 0.7)
|
||||
|
@ -891,7 +888,7 @@ DEPENDENCIES
|
|||
google-api-client (~> 0.8.6)
|
||||
grape (~> 0.18.0)
|
||||
grape-entity (~> 0.6.0)
|
||||
haml_lint (~> 0.18.2)
|
||||
haml_lint (~> 0.21.0)
|
||||
hamlit (~> 2.6.1)
|
||||
health_check (~> 2.2.0)
|
||||
hipchat (~> 1.5.0)
|
||||
|
@ -910,9 +907,9 @@ DEPENDENCIES
|
|||
kubeclient (~> 2.2.0)
|
||||
letter_opener_web (~> 1.3.0)
|
||||
license_finder (~> 2.1.0)
|
||||
licensee (~> 8.0.0)
|
||||
licensee (~> 8.7.0)
|
||||
loofah (~> 2.0.3)
|
||||
mail_room (~> 0.9.0)
|
||||
mail_room (~> 0.9.1)
|
||||
method_source (~> 0.8)
|
||||
minitest (~> 5.7.0)
|
||||
mousetrap-rails (~> 1.4.6)
|
||||
|
@ -949,7 +946,7 @@ DEPENDENCIES
|
|||
rack-cors (~> 0.4.0)
|
||||
rack-oauth2 (~> 1.2.1)
|
||||
rack-proxy (~> 0.6.0)
|
||||
rails (= 4.2.7.1)
|
||||
rails (= 4.2.8)
|
||||
rails-deprecated_sanitizer (~> 1.0.3)
|
||||
rainbow (~> 2.1.0)
|
||||
rblineprof (~> 0.3.6)
|
||||
|
@ -966,8 +963,8 @@ DEPENDENCIES
|
|||
rspec-rails (~> 3.5.0)
|
||||
rspec-retry (~> 0.4.5)
|
||||
rspec_profiling (~> 0.0.5)
|
||||
rubocop (~> 0.46.0)
|
||||
rubocop-rspec (~> 1.9.1)
|
||||
rubocop (~> 0.47.1)
|
||||
rubocop-rspec (~> 1.12.0)
|
||||
ruby-fogbugz (~> 0.2.1)
|
||||
ruby-prof (~> 0.16.2)
|
||||
rugged (~> 0.24.0)
|
||||
|
|
|
@ -29,7 +29,7 @@ We're hiring developers, support people, and production engineers all the time,
|
|||
There are two editions of GitLab:
|
||||
|
||||
- GitLab Community Edition (CE) is available freely under the MIT Expat license.
|
||||
- GitLab Enterprise Edition (EE) includes [extra features](https://about.gitlab.com/features/#compare) that are more useful for organizations with more than 100 users. To use EE and get official support please [become a subscriber](https://about.gitlab.com/pricing/).
|
||||
- GitLab Enterprise Edition (EE) includes [extra features](https://about.gitlab.com/products/#compare-options) that are more useful for organizations with more than 100 users. To use EE and get official support please [become a subscriber](https://about.gitlab.com/products/).
|
||||
|
||||
## Website
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
<svg width="12" height="15" viewBox="0 0 12 15" xmlns="http://www.w3.org/2000/svg"><path d="M10.267 11.028V5.167c-.028-.728-.318-1.372-.878-1.923-.56-.55-1.194-.85-1.922-.877h-.934V.5l-2.8 2.8 2.8 2.8V4.233h.934a.976.976 0 0 1 .644.29.88.88 0 0 1 .289.644v5.861a1.86 1.86 0 0 0 .933 3.472 1.86 1.86 0 0 0 .934-3.472zM3.733 3.3a1.86 1.86 0 0 0-1.866-1.867 1.86 1.86 0 0 0-.934 3.472v6.123a1.86 1.86 0 0 0 .933 3.472 1.86 1.86 0 0 0 .934-3.472V4.905c.55-.317.933-.914.933-1.605z" fill-rule="nonzero"/></svg>
|
After Width: | Height: | Size: 506 B |
Binary file not shown.
After Width: | Height: | Size: 3.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 3.0 KiB |
|
@ -0,0 +1,35 @@
|
|||
class AjaxLoadingSpinner {
|
||||
static init() {
|
||||
const $elements = $('.js-ajax-loading-spinner');
|
||||
|
||||
$elements.on('ajax:beforeSend', AjaxLoadingSpinner.ajaxBeforeSend);
|
||||
$elements.on('ajax:complete', AjaxLoadingSpinner.ajaxComplete);
|
||||
}
|
||||
|
||||
static ajaxBeforeSend(e) {
|
||||
e.target.setAttribute('disabled', '');
|
||||
const iconElement = e.target.querySelector('i');
|
||||
// get first fa- icon
|
||||
const originalIcon = iconElement.className.match(/(fa-)([^\s]+)/g).first();
|
||||
iconElement.dataset.icon = originalIcon;
|
||||
AjaxLoadingSpinner.toggleLoadingIcon(iconElement);
|
||||
$(e.target).off('ajax:beforeSend', AjaxLoadingSpinner.ajaxBeforeSend);
|
||||
}
|
||||
|
||||
static ajaxComplete(e) {
|
||||
e.target.removeAttribute('disabled');
|
||||
const iconElement = e.target.querySelector('i');
|
||||
AjaxLoadingSpinner.toggleLoadingIcon(iconElement);
|
||||
$(e.target).off('ajax:complete', AjaxLoadingSpinner.ajaxComplete);
|
||||
}
|
||||
|
||||
static toggleLoadingIcon(iconElement) {
|
||||
const classList = iconElement.classList;
|
||||
classList.toggle(iconElement.dataset.icon);
|
||||
classList.toggle('fa-spinner');
|
||||
classList.toggle('fa-spin');
|
||||
}
|
||||
}
|
||||
|
||||
window.gl = window.gl || {};
|
||||
gl.AjaxLoadingSpinner = AjaxLoadingSpinner;
|
|
@ -1,16 +1,20 @@
|
|||
/* eslint-disable one-var, quote-props, comma-dangle, space-before-function-paren, import/newline-after-import, no-multi-spaces, max-len */
|
||||
/* eslint-disable one-var, quote-props, comma-dangle, space-before-function-paren */
|
||||
/* global Vue */
|
||||
/* global BoardService */
|
||||
|
||||
function requireAll(context) { return context.keys().map(context); }
|
||||
|
||||
window.Vue = require('vue');
|
||||
window.Vue.use(require('vue-resource'));
|
||||
requireAll(require.context('./models', true, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./stores', true, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./services', true, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./mixins', true, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./filters', true, /^\.\/.*\.(js|es6)$/));
|
||||
require('./models/issue');
|
||||
require('./models/label');
|
||||
require('./models/list');
|
||||
require('./models/milestone');
|
||||
require('./models/user');
|
||||
require('./stores/boards_store');
|
||||
require('./stores/modal_store');
|
||||
require('./services/board_service');
|
||||
require('./mixins/modal_mixins');
|
||||
require('./mixins/sortable_default_options');
|
||||
require('./filters/due_date_filters');
|
||||
require('./components/board');
|
||||
require('./components/board_sidebar');
|
||||
require('./components/new_list_dropdown');
|
||||
|
@ -93,17 +97,53 @@ $(() => {
|
|||
modal: ModalStore.store,
|
||||
store: Store.state,
|
||||
},
|
||||
watch: {
|
||||
disabled() {
|
||||
this.updateTooltip();
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
disabled() {
|
||||
return !this.store.lists.filter(list => list.type !== 'blank' && list.type !== 'done').length;
|
||||
},
|
||||
tooltipTitle() {
|
||||
if (this.disabled) {
|
||||
return 'Please add a list to your board first';
|
||||
}
|
||||
|
||||
return '';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
updateTooltip() {
|
||||
const $tooltip = $(this.$el);
|
||||
|
||||
this.$nextTick(() => {
|
||||
if (this.disabled) {
|
||||
$tooltip.tooltip();
|
||||
} else {
|
||||
$tooltip.tooltip('destroy');
|
||||
}
|
||||
});
|
||||
},
|
||||
openModal() {
|
||||
if (!this.disabled) {
|
||||
this.toggleModal(true);
|
||||
}
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.updateTooltip();
|
||||
},
|
||||
template: `
|
||||
<button
|
||||
class="btn btn-create pull-right prepend-left-10 has-tooltip"
|
||||
class="btn btn-create pull-right prepend-left-10"
|
||||
type="button"
|
||||
:disabled="disabled"
|
||||
@click="toggleModal(true)">
|
||||
data-placement="bottom"
|
||||
:class="{ 'disabled': disabled }"
|
||||
:title="tooltipTitle"
|
||||
:aria-disabled="disabled"
|
||||
@click="openModal">
|
||||
Add issues
|
||||
</button>
|
||||
`,
|
||||
|
|
|
@ -107,9 +107,9 @@
|
|||
if (typeof label.message === 'string') {
|
||||
errors = label.message;
|
||||
} else {
|
||||
errors = label.message.map(function (value, key) {
|
||||
return key + " " + value[0];
|
||||
}).join("<br/>");
|
||||
errors = Object.keys(label.message).map(key =>
|
||||
`${gl.text.humanize(key)} ${label.message[key].join(', ')}`
|
||||
).join("<br/>");
|
||||
}
|
||||
|
||||
this.$newLabelError
|
||||
|
|
|
@ -4,10 +4,20 @@
|
|||
|
||||
window.Vue = require('vue');
|
||||
window.Cookies = require('js-cookie');
|
||||
|
||||
function requireAll(context) { return context.keys().map(context); }
|
||||
requireAll(require.context('./svg', false, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('.', true, /^\.\/(?!cycle_analytics_bundle).*\.(js|es6)$/));
|
||||
require('./svg/icon_branch');
|
||||
require('./svg/icon_build_status');
|
||||
require('./svg/icon_commit');
|
||||
require('./components/stage_code_component');
|
||||
require('./components/stage_issue_component');
|
||||
require('./components/stage_plan_component');
|
||||
require('./components/stage_production_component');
|
||||
require('./components/stage_review_component');
|
||||
require('./components/stage_staging_component');
|
||||
require('./components/stage_test_component');
|
||||
require('./components/total_time_component');
|
||||
require('./cycle_analytics_service');
|
||||
require('./cycle_analytics_store');
|
||||
require('./default_event_objects');
|
||||
|
||||
$(() => {
|
||||
const OVERVIEW_DIALOG_COOKIE = 'cycle_analytics_help_dismissed';
|
||||
|
|
|
@ -1,14 +1,18 @@
|
|||
/* eslint-disable func-names, comma-dangle, new-cap, no-new, import/newline-after-import, no-multi-spaces, max-len */
|
||||
/* eslint-disable func-names, comma-dangle, new-cap, no-new, max-len */
|
||||
/* global Vue */
|
||||
/* global ResolveCount */
|
||||
|
||||
function requireAll(context) { return context.keys().map(context); }
|
||||
const Vue = require('vue');
|
||||
requireAll(require.context('./models', false, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./stores', false, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./services', false, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./mixins', false, /^\.\/.*\.(js|es6)$/));
|
||||
requireAll(require.context('./components', false, /^\.\/.*\.(js|es6)$/));
|
||||
require('./models/discussion');
|
||||
require('./models/note');
|
||||
require('./stores/comments');
|
||||
require('./services/resolve');
|
||||
require('./mixins/discussion');
|
||||
require('./components/comment_resolve_btn');
|
||||
require('./components/jump_to_discussion');
|
||||
require('./components/resolve_btn');
|
||||
require('./components/resolve_count');
|
||||
require('./components/resolve_discussion_btn');
|
||||
|
||||
$(() => {
|
||||
const projectPath = document.querySelector('.merge-request').dataset.projectPath;
|
||||
|
|
|
@ -74,7 +74,7 @@ const ShortcutsBlob = require('./shortcuts_blob');
|
|||
case 'projects:merge_requests:index':
|
||||
case 'projects:issues:index':
|
||||
if (gl.FilteredSearchManager) {
|
||||
new gl.FilteredSearchManager();
|
||||
new gl.FilteredSearchManager(page === 'projects:issues:index' ? 'issues' : 'merge_requests');
|
||||
}
|
||||
Issuable.init();
|
||||
new gl.IssuableBulkActions({
|
||||
|
@ -108,6 +108,9 @@ const ShortcutsBlob = require('./shortcuts_blob');
|
|||
case 'projects:compare:show':
|
||||
new gl.Diff();
|
||||
break;
|
||||
case 'projects:branches:index':
|
||||
gl.AjaxLoadingSpinner.init();
|
||||
break;
|
||||
case 'projects:issues:new':
|
||||
case 'projects:issues:edit':
|
||||
shortcut_handler = new ShortcutsNavigation();
|
||||
|
|
|
@ -126,13 +126,14 @@ require('./preview_markdown');
|
|||
};
|
||||
pasteText = function(text) {
|
||||
var afterSelection, beforeSelection, caretEnd, caretStart, textEnd;
|
||||
var formattedText = text + "\n\n";
|
||||
caretStart = $(child)[0].selectionStart;
|
||||
caretEnd = $(child)[0].selectionEnd;
|
||||
textEnd = $(child).val().length;
|
||||
beforeSelection = $(child).val().substring(0, caretStart);
|
||||
afterSelection = $(child).val().substring(caretEnd, textEnd);
|
||||
$(child).val(beforeSelection + text + afterSelection);
|
||||
child.get(0).setSelectionRange(caretStart + text.length, caretEnd + text.length);
|
||||
$(child).val(beforeSelection + formattedText + afterSelection);
|
||||
child.get(0).setSelectionRange(caretStart + formattedText.length, caretEnd + formattedText.length);
|
||||
return form_textarea.trigger("input");
|
||||
};
|
||||
getFilename = function(e) {
|
||||
|
|
|
@ -15,29 +15,29 @@ module.exports = Vue.component('actions-component', {
|
|||
},
|
||||
|
||||
template: `
|
||||
<div class="inline">
|
||||
<div class="dropdown">
|
||||
<a class="dropdown-new btn btn-default" data-toggle="dropdown">
|
||||
<div class="btn-group" role="group">
|
||||
<button class="dropdown btn btn-default dropdown-new" data-toggle="dropdown">
|
||||
<span>
|
||||
<span class="js-dropdown-play-icon-container" v-html="playIconSvg"></span>
|
||||
<i class="fa fa-caret-down"></i>
|
||||
</a>
|
||||
</span>
|
||||
|
||||
<ul class="dropdown-menu dropdown-menu-align-right">
|
||||
<li v-for="action in actions">
|
||||
<a :href="action.play_path"
|
||||
data-method="post"
|
||||
rel="nofollow"
|
||||
class="js-manual-action-link">
|
||||
<ul class="dropdown-menu dropdown-menu-align-right">
|
||||
<li v-for="action in actions">
|
||||
<a :href="action.play_path"
|
||||
data-method="post"
|
||||
rel="nofollow"
|
||||
class="js-manual-action-link">
|
||||
|
||||
<span class="js-action-play-icon-container" v-html="playIconSvg"></span>
|
||||
<span class="js-action-play-icon-container" v-html="playIconSvg"></span>
|
||||
|
||||
<span>
|
||||
{{action.name}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<span>
|
||||
{{action.name}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</button>
|
||||
</div>
|
||||
`,
|
||||
});
|
||||
|
|
|
@ -505,39 +505,26 @@ module.exports = Vue.component('environment-item', {
|
|||
|
||||
<td class="hidden-xs">
|
||||
<div v-if="!model.isFolder">
|
||||
<div v-if="hasManualActions && canCreateDeployment"
|
||||
class="inline js-manual-actions-container">
|
||||
<actions-component
|
||||
<div class="btn-group" role="group">
|
||||
<actions-component v-if="hasManualActions && canCreateDeployment"
|
||||
:play-icon-svg="playIconSvg"
|
||||
:actions="manualActions">
|
||||
</actions-component>
|
||||
</div>
|
||||
|
||||
<div v-if="externalURL && canReadEnvironment"
|
||||
class="inline js-external-url-container">
|
||||
<external-url-component
|
||||
<external-url-component v-if="externalURL && canReadEnvironment"
|
||||
:external-url="externalURL">
|
||||
</external-url-component>
|
||||
</div>
|
||||
|
||||
<div v-if="hasStopAction && canCreateDeployment"
|
||||
class="inline js-stop-component-container">
|
||||
<stop-component
|
||||
<stop-component v-if="hasStopAction && canCreateDeployment"
|
||||
:stop-url="model.stop_path">
|
||||
</stop-component>
|
||||
</div>
|
||||
|
||||
<div v-if="model && model.terminal_path"
|
||||
class="inline js-terminal-button-container">
|
||||
<terminal-button-component
|
||||
<terminal-button-component v-if="model && model.terminal_path"
|
||||
:terminal-icon-svg="terminalIconSvg"
|
||||
:terminal-path="model.terminal_path">
|
||||
</terminal-button-component>
|
||||
</div>
|
||||
|
||||
<div v-if="canRetry && canCreateDeployment"
|
||||
class="inline js-rollback-component-container">
|
||||
<rollback-component
|
||||
<rollback-component v-if="canRetry && canCreateDeployment"
|
||||
:is-last-deployment="isLastDeployment"
|
||||
:retry-url="retryUrl">
|
||||
</rollback-component>
|
||||
|
|
|
@ -37,23 +37,18 @@ require('./filtered_search_dropdown');
|
|||
}
|
||||
|
||||
renderContent() {
|
||||
const dropdownData = [{
|
||||
icon: 'fa-pencil',
|
||||
hint: 'author:',
|
||||
tag: '<@author>',
|
||||
}, {
|
||||
icon: 'fa-user',
|
||||
hint: 'assignee:',
|
||||
tag: '<@assignee>',
|
||||
}, {
|
||||
icon: 'fa-clock-o',
|
||||
hint: 'milestone:',
|
||||
tag: '<%milestone>',
|
||||
}, {
|
||||
icon: 'fa-tag',
|
||||
hint: 'label:',
|
||||
tag: '<~label>',
|
||||
}];
|
||||
const dropdownData = [];
|
||||
|
||||
[].forEach.call(this.input.parentElement.querySelectorAll('.dropdown-menu'), (dropdownMenu) => {
|
||||
const { icon, hint, tag } = dropdownMenu.dataset;
|
||||
if (icon && hint && tag) {
|
||||
dropdownData.push({
|
||||
icon: `fa-${icon}`,
|
||||
hint,
|
||||
tag: `<${tag}>`,
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
this.droplab.changeHookList(this.hookId, this.dropdown, [droplabFilter], this.config);
|
||||
this.droplab.setData(this.hookId, dropdownData);
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
function requireAll(context) { return context.keys().map(context); }
|
||||
|
||||
requireAll(require.context('./', true, /^\.\/(?!filtered_search_bundle).*\.(js|es6)$/));
|
||||
require('./dropdown_hint');
|
||||
require('./dropdown_non_user');
|
||||
require('./dropdown_user');
|
||||
require('./dropdown_utils');
|
||||
require('./filtered_search_dropdown_manager');
|
||||
require('./filtered_search_dropdown');
|
||||
require('./filtered_search_manager');
|
||||
require('./filtered_search_token_keys');
|
||||
require('./filtered_search_tokenizer');
|
||||
|
|
|
@ -52,8 +52,9 @@
|
|||
}
|
||||
|
||||
renderContent(forceShowList = false) {
|
||||
if (forceShowList && this.getCurrentHook().list.hidden) {
|
||||
this.getCurrentHook().list.show();
|
||||
const currentHook = this.getCurrentHook();
|
||||
if (forceShowList && currentHook && currentHook.list.hidden) {
|
||||
currentHook.list.show();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -92,18 +93,24 @@
|
|||
}
|
||||
|
||||
hideDropdown() {
|
||||
this.getCurrentHook().list.hide();
|
||||
const currentHook = this.getCurrentHook();
|
||||
if (currentHook) {
|
||||
currentHook.list.hide();
|
||||
}
|
||||
}
|
||||
|
||||
resetFilters() {
|
||||
const hook = this.getCurrentHook();
|
||||
const data = hook.list.data;
|
||||
const results = data.map((o) => {
|
||||
const updated = o;
|
||||
updated.droplab_hidden = false;
|
||||
return updated;
|
||||
});
|
||||
hook.list.render(results);
|
||||
|
||||
if (hook) {
|
||||
const data = hook.list.data;
|
||||
const results = data.map((o) => {
|
||||
const updated = o;
|
||||
updated.droplab_hidden = false;
|
||||
return updated;
|
||||
});
|
||||
hook.list.render(results);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,10 +2,12 @@
|
|||
|
||||
(() => {
|
||||
class FilteredSearchDropdownManager {
|
||||
constructor(baseEndpoint = '') {
|
||||
constructor(baseEndpoint = '', page) {
|
||||
this.baseEndpoint = baseEndpoint.replace(/\/$/, '');
|
||||
this.tokenizer = gl.FilteredSearchTokenizer;
|
||||
this.filteredSearchTokenKeys = gl.FilteredSearchTokenKeys;
|
||||
this.filteredSearchInput = document.querySelector('.filtered-search');
|
||||
this.page = page;
|
||||
|
||||
this.setupMapping();
|
||||
|
||||
|
@ -150,7 +152,7 @@
|
|||
this.droplab = new DropLab();
|
||||
}
|
||||
|
||||
const match = gl.FilteredSearchTokenKeys.searchByKey(dropdownName.toLowerCase());
|
||||
const match = this.filteredSearchTokenKeys.searchByKey(dropdownName.toLowerCase());
|
||||
const shouldOpenFilterDropdown = match && this.currentDropdown !== match.key
|
||||
&& this.mapping[match.key];
|
||||
const shouldOpenHintDropdown = !match && this.currentDropdown !== 'hint';
|
||||
|
|
|
@ -1,12 +1,13 @@
|
|||
(() => {
|
||||
class FilteredSearchManager {
|
||||
constructor() {
|
||||
constructor(page) {
|
||||
this.filteredSearchInput = document.querySelector('.filtered-search');
|
||||
this.clearSearchButton = document.querySelector('.clear-search');
|
||||
this.filteredSearchTokenKeys = gl.FilteredSearchTokenKeys;
|
||||
|
||||
if (this.filteredSearchInput) {
|
||||
this.tokenizer = gl.FilteredSearchTokenizer;
|
||||
this.dropdownManager = new gl.FilteredSearchDropdownManager(this.filteredSearchInput.getAttribute('data-base-endpoint') || '');
|
||||
this.dropdownManager = new gl.FilteredSearchDropdownManager(this.filteredSearchInput.getAttribute('data-base-endpoint') || '', page);
|
||||
|
||||
this.bindEvents();
|
||||
this.loadSearchParamsFromURL();
|
||||
|
@ -117,8 +118,8 @@
|
|||
const keyParam = decodeURIComponent(split[0]);
|
||||
const value = split[1];
|
||||
|
||||
// Check if it matches edge conditions listed in gl.FilteredSearchTokenKeys
|
||||
const condition = gl.FilteredSearchTokenKeys.searchByConditionUrl(p);
|
||||
// Check if it matches edge conditions listed in this.filteredSearchTokenKeys
|
||||
const condition = this.filteredSearchTokenKeys.searchByConditionUrl(p);
|
||||
|
||||
if (condition) {
|
||||
inputValues.push(`${condition.tokenKey}:${condition.value}`);
|
||||
|
@ -126,7 +127,7 @@
|
|||
// Sanitize value since URL converts spaces into +
|
||||
// Replace before decode so that we know what was originally + versus the encoded +
|
||||
const sanitizedValue = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : value;
|
||||
const match = gl.FilteredSearchTokenKeys.searchByKeyParam(keyParam);
|
||||
const match = this.filteredSearchTokenKeys.searchByKeyParam(keyParam);
|
||||
|
||||
if (match) {
|
||||
const indexOf = keyParam.indexOf('_');
|
||||
|
@ -171,9 +172,9 @@
|
|||
paths.push(`state=${currentState}`);
|
||||
|
||||
tokens.forEach((token) => {
|
||||
const condition = gl.FilteredSearchTokenKeys
|
||||
const condition = this.filteredSearchTokenKeys
|
||||
.searchByConditionKeyValue(token.key, token.value.toLowerCase());
|
||||
const { param } = gl.FilteredSearchTokenKeys.searchByKey(token.key) || {};
|
||||
const { param } = this.filteredSearchTokenKeys.searchByKey(token.key) || {};
|
||||
const keyParam = param ? `${token.key}_${param}` : token.key;
|
||||
let tokenPath = '';
|
||||
|
||||
|
|
|
@ -47,9 +47,10 @@
|
|||
}
|
||||
// Only filter asynchronously only if option remote is set
|
||||
if (this.options.remote) {
|
||||
$inputContainer.parent().addClass('is-loading');
|
||||
clearTimeout(timeout);
|
||||
return timeout = setTimeout(function() {
|
||||
$inputContainer.parent().addClass('is-loading');
|
||||
|
||||
return this.options.query(this.input.val(), function(data) {
|
||||
$inputContainer.parent().removeClass('is-loading');
|
||||
return this.options.callback(data);
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
// require everything else in this directory
|
||||
function requireAll(context) { return context.keys().map(context); }
|
||||
requireAll(require.context('.', false, /^\.\/(?!graphs_bundle).*\.(js|es6)$/));
|
||||
require('./stat_graph_contributors_graph');
|
||||
require('./stat_graph_contributors_util');
|
||||
require('./stat_graph_contributors');
|
||||
require('./stat_graph');
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
(function() {
|
||||
$(document).on('todo:toggle', function(e, count) {
|
||||
var $todoPendingCount = $('.todos-pending-count');
|
||||
$todoPendingCount.text(gl.text.addDelimiter(count));
|
||||
$todoPendingCount.text(gl.text.highCountTrim(count));
|
||||
$todoPendingCount.toggleClass('hidden', count === 0);
|
||||
});
|
||||
})();
|
||||
|
|
|
@ -14,6 +14,9 @@ require('vendor/latinise');
|
|||
gl.text.addDelimiter = function(text) {
|
||||
return text ? text.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",") : text;
|
||||
};
|
||||
gl.text.highCountTrim = function(count) {
|
||||
return count > 99 ? '99+' : count;
|
||||
};
|
||||
gl.text.randomString = function() {
|
||||
return Math.random().toString(36).substring(7);
|
||||
};
|
||||
|
|
|
@ -2,9 +2,8 @@
|
|||
/* global Network */
|
||||
/* global ShortcutsNetwork */
|
||||
|
||||
// require everything else in this directory
|
||||
function requireAll(context) { return context.keys().map(context); }
|
||||
requireAll(require.context('.', false, /^\.\/(?!network_bundle).*\.(js|es6)$/));
|
||||
require('./branch_graph');
|
||||
require('./network');
|
||||
|
||||
(function() {
|
||||
$(function() {
|
||||
|
|
|
@ -169,10 +169,10 @@
|
|||
url: issuesPath + "/?author_username=" + userName
|
||||
}, 'separator', {
|
||||
text: 'Merge requests assigned to me',
|
||||
url: mrPath + "/?assignee_id=" + userId
|
||||
url: mrPath + "/?assignee_username=" + userName
|
||||
}, {
|
||||
text: "Merge requests I've created",
|
||||
url: mrPath + "/?author_id=" + userId
|
||||
url: mrPath + "/?author_username=" + userName
|
||||
}
|
||||
];
|
||||
if (!name) {
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
(() => {
|
||||
class VersionCheckImage {
|
||||
static bindErrorEvent(imageElement) {
|
||||
imageElement.off('error').on('error', () => imageElement.hide());
|
||||
}
|
||||
class VersionCheckImage {
|
||||
static bindErrorEvent(imageElement) {
|
||||
imageElement.off('error').on('error', () => imageElement.hide());
|
||||
}
|
||||
}
|
||||
|
||||
window.gl = window.gl || {};
|
||||
gl.VersionCheckImage = VersionCheckImage;
|
||||
})();
|
||||
window.gl = window.gl || {};
|
||||
gl.VersionCheckImage = VersionCheckImage;
|
||||
|
||||
module.exports = VersionCheckImage;
|
||||
|
|
|
@ -23,7 +23,7 @@ const CommitPipelinesStoreWithTimeAgo = require('../commit/pipelines/pipelines_s
|
|||
apiScope: 'all',
|
||||
pageInfo: {},
|
||||
pagenum: 1,
|
||||
count: { all: 0, running_or_pending: 0 },
|
||||
count: {},
|
||||
pageRequest: false,
|
||||
};
|
||||
},
|
||||
|
|
|
@ -148,11 +148,16 @@ header {
|
|||
}
|
||||
|
||||
.header-logo {
|
||||
display: inline-block;
|
||||
margin: 0 8px 0 3px;
|
||||
position: relative;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 7px;
|
||||
transition-duration: .3s;
|
||||
z-index: 999;
|
||||
|
||||
#logo {
|
||||
position: relative;
|
||||
left: -50%;
|
||||
}
|
||||
|
||||
svg,
|
||||
img {
|
||||
|
@ -162,6 +167,15 @@ header {
|
|||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
right: 20px;
|
||||
left: auto;
|
||||
|
||||
#logo {
|
||||
left: auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.title {
|
||||
|
@ -169,7 +183,7 @@ header {
|
|||
padding-right: 20px;
|
||||
margin: 0;
|
||||
font-size: 18px;
|
||||
max-width: 450px;
|
||||
max-width: 385px;
|
||||
display: inline-block;
|
||||
line-height: $header-height;
|
||||
font-weight: normal;
|
||||
|
@ -179,6 +193,10 @@ header {
|
|||
vertical-align: top;
|
||||
white-space: nowrap;
|
||||
|
||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
@media (max-width: $screen-xs-max) {
|
||||
max-width: 190px;
|
||||
}
|
||||
|
|
|
@ -96,16 +96,6 @@ ul.unstyled-list > li {
|
|||
border-bottom: none;
|
||||
}
|
||||
|
||||
ul.task-list {
|
||||
li.task-list-item {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
ul:not(.task-list) {
|
||||
padding-left: 1.3em;
|
||||
}
|
||||
}
|
||||
|
||||
// Generic content list
|
||||
ul.content-list {
|
||||
@include basic-list;
|
||||
|
|
|
@ -76,6 +76,13 @@
|
|||
#{$property}: $value;
|
||||
}
|
||||
|
||||
/* http://phrappe.com/css/conditional-css-for-webkit-based-browsers/ */
|
||||
@mixin on-webkit-only {
|
||||
@media screen and (-webkit-min-device-pixel-ratio:0) {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
||||
@mixin keyframes($animation-name) {
|
||||
@-webkit-keyframes #{$animation-name} {
|
||||
@content;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
@mixin fade($gradient-direction, $gradient-color) {
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
z-index: 1;
|
||||
z-index: 2;
|
||||
position: absolute;
|
||||
bottom: 12px;
|
||||
width: 43px;
|
||||
|
@ -18,7 +18,7 @@
|
|||
|
||||
.fa {
|
||||
position: relative;
|
||||
top: 6px;
|
||||
top: 5px;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
@ -79,6 +79,7 @@
|
|||
}
|
||||
|
||||
&.sub-nav {
|
||||
text-align: center;
|
||||
background-color: $gray-normal;
|
||||
|
||||
.container-fluid {
|
||||
|
@ -286,6 +287,7 @@
|
|||
background: $gray-light;
|
||||
border-bottom: 1px solid $border-color;
|
||||
transition: padding $sidebar-transition-duration;
|
||||
text-align: center;
|
||||
|
||||
.container-fluid {
|
||||
position: relative;
|
||||
|
@ -351,7 +353,7 @@
|
|||
right: -5px;
|
||||
|
||||
.fa {
|
||||
right: -28px;
|
||||
right: -7px;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -381,7 +383,7 @@
|
|||
left: 0;
|
||||
|
||||
.fa {
|
||||
left: -4px;
|
||||
left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@
|
|||
padding-right: 0;
|
||||
|
||||
@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
|
||||
&:not(.build-sidebar):not(.wiki-sidebar) {
|
||||
.content-wrapper {
|
||||
padding-right: $gutter_collapsed_width;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -134,7 +134,7 @@
|
|||
ul,
|
||||
ol {
|
||||
padding: 0;
|
||||
margin: 3px 0 3px 28px !important;
|
||||
margin: 3px 0 !important;
|
||||
}
|
||||
|
||||
ul:dir(rtl),
|
||||
|
@ -144,6 +144,29 @@
|
|||
|
||||
li {
|
||||
line-height: 1.6em;
|
||||
margin-left: 25px;
|
||||
padding-left: 3px;
|
||||
|
||||
/* Normalize the bullet position on webkit. */
|
||||
@include on-webkit-only {
|
||||
margin-left: 28px;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
ul.task-list {
|
||||
li.task-list-item {
|
||||
list-style-type: none;
|
||||
position: relative;
|
||||
padding-left: 28px;
|
||||
margin-left: 0 !important;
|
||||
|
||||
input.task-list-item-checkbox {
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
top: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
a[href*="/uploads/"],
|
||||
|
|
|
@ -35,7 +35,6 @@
|
|||
display: table-cell;
|
||||
}
|
||||
|
||||
.environments-name,
|
||||
.environments-commit,
|
||||
.environments-actions {
|
||||
width: 20%;
|
||||
|
@ -45,6 +44,7 @@
|
|||
width: 10%;
|
||||
}
|
||||
|
||||
.environments-name,
|
||||
.environments-deploy,
|
||||
.environments-build {
|
||||
width: 15%;
|
||||
|
@ -62,6 +62,22 @@
|
|||
}
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
|
||||
> a {
|
||||
color: $gl-text-color-secondary;
|
||||
}
|
||||
|
||||
svg path {
|
||||
fill: $gl-text-color-secondary;
|
||||
}
|
||||
|
||||
.dropdown {
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.commit-title {
|
||||
margin: 0;
|
||||
}
|
||||
|
|
|
@ -10,6 +10,11 @@
|
|||
.issue-labels {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.icon-merge-request-unmerged {
|
||||
height: 13px;
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -652,23 +652,29 @@ pre.light-well {
|
|||
}
|
||||
}
|
||||
|
||||
.container-fluid.project-stats-container {
|
||||
@media (max-width: $screen-xs-max) {
|
||||
padding: 12px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.project-last-commit {
|
||||
background-color: $gray-light;
|
||||
padding: 12px $gl-padding;
|
||||
border: 1px solid $border-color;
|
||||
|
||||
@media (min-width: $screen-sm-min) {
|
||||
margin-top: $gl-padding;
|
||||
}
|
||||
|
||||
@media (min-width: $screen-sm-min) {
|
||||
border-radius: $border-radius-base;
|
||||
&.container-fluid {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
background-color: $gray-light;
|
||||
border: 1px solid $border-color;
|
||||
border-right-width: 0;
|
||||
border-left-width: 0;
|
||||
|
||||
@media (min-width: $screen-sm-min) {
|
||||
border-right-width: 1px;
|
||||
border-left-width: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
&.container-limited {
|
||||
@media (min-width: 1281px) {
|
||||
border-radius: $border-radius-base;
|
||||
}
|
||||
}
|
||||
|
||||
.ci-status {
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
.navbar-nav {
|
||||
li {
|
||||
.badge.todos-pending-count {
|
||||
position: inherit;
|
||||
top: -6px;
|
||||
margin-top: -5px;
|
||||
font-weight: normal;
|
||||
background: $todo-alert-blue;
|
||||
|
@ -43,6 +45,12 @@
|
|||
}
|
||||
}
|
||||
|
||||
.todo-avatar,
|
||||
.todo-actions {
|
||||
-webkit-flex: 0 0 auto;
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
.todo-actions {
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
|
@ -55,8 +63,9 @@
|
|||
}
|
||||
|
||||
.todo-item {
|
||||
-webkit-flex: auto;
|
||||
flex: auto;
|
||||
-webkit-flex: 0 1 100%;
|
||||
flex: 0 1 100%;
|
||||
min-width: 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,8 +83,29 @@
|
|||
|
||||
.todo-item {
|
||||
.todo-title {
|
||||
@include str-truncated(calc(100% - 174px));
|
||||
overflow: visible;
|
||||
display: flex;
|
||||
|
||||
& > .title-item {
|
||||
-webkit-flex: 0 0 auto;
|
||||
flex: 0 0 auto;
|
||||
margin: 0 2px;
|
||||
|
||||
&:first-child {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.todo-label {
|
||||
-webkit-flex: 0 1 auto;
|
||||
flex: 0 1 auto;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.status-box {
|
||||
|
@ -154,10 +184,12 @@
|
|||
|
||||
.todo-item {
|
||||
.todo-title {
|
||||
white-space: normal;
|
||||
overflow: visible;
|
||||
max-width: 100%;
|
||||
flex-flow: row wrap;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.todo-label {
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
||||
|
||||
.todo-body {
|
||||
|
|
|
@ -3,7 +3,7 @@ class Admin::SystemInfoController < Admin::ApplicationController
|
|||
'nobrowse',
|
||||
'read-only',
|
||||
'ro'
|
||||
]
|
||||
].freeze
|
||||
|
||||
EXCLUDED_MOUNT_TYPES = [
|
||||
'autofs',
|
||||
|
@ -27,7 +27,7 @@ class Admin::SystemInfoController < Admin::ApplicationController
|
|||
'tmpfs',
|
||||
'tracefs',
|
||||
'vfat'
|
||||
]
|
||||
].freeze
|
||||
|
||||
def show
|
||||
@cpus = Vmstat.cpu rescue nil
|
||||
|
|
|
@ -74,7 +74,7 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def authenticate_user!(*args)
|
||||
if redirect_to_home_page_url?
|
||||
redirect_to current_application_settings.home_page_url and return
|
||||
return redirect_to current_application_settings.home_page_url
|
||||
end
|
||||
|
||||
super(*args)
|
||||
|
@ -131,7 +131,7 @@ class ApplicationController < ActionController::Base
|
|||
headers['X-UA-Compatible'] = 'IE=edge'
|
||||
headers['X-Content-Type-Options'] = 'nosniff'
|
||||
# Enabling HSTS for non-standard ports would send clients to the wrong port
|
||||
if Gitlab.config.gitlab.https and Gitlab.config.gitlab.port == 443
|
||||
if Gitlab.config.gitlab.https && Gitlab.config.gitlab.port == 443
|
||||
headers['Strict-Transport-Security'] = 'max-age=31536000'
|
||||
end
|
||||
end
|
||||
|
@ -152,7 +152,7 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def check_password_expiration
|
||||
if current_user && current_user.password_expires_at && current_user.password_expires_at < Time.now && !current_user.ldap_user?
|
||||
redirect_to new_profile_password_path and return
|
||||
return redirect_to new_profile_password_path
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -181,7 +181,7 @@ class ApplicationController < ActionController::Base
|
|||
end
|
||||
|
||||
def gitlab_ldap_access(&block)
|
||||
Gitlab::LDAP::Access.open { |access| block.call(access) }
|
||||
Gitlab::LDAP::Access.open { |access| yield(access) }
|
||||
end
|
||||
|
||||
# JSON for infinite scroll via Pager object
|
||||
|
@ -218,7 +218,7 @@ class ApplicationController < ActionController::Base
|
|||
|
||||
def require_email
|
||||
if current_user && current_user.temp_oauth_email? && session[:impersonator_id].nil?
|
||||
redirect_to profile_path, notice: 'Please complete your profile with email address' and return
|
||||
return redirect_to profile_path, notice: 'Please complete your profile with email address'
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -101,13 +101,14 @@ module CreatesCommit
|
|||
|
||||
# TODO: We should really clean this up
|
||||
def set_commit_variables
|
||||
if can?(current_user, :push_code, @project)
|
||||
# Edit file in this project
|
||||
@mr_source_project = @project
|
||||
else
|
||||
# Merge request from fork to this project
|
||||
@mr_source_project = current_user.fork_of(@project)
|
||||
end
|
||||
@mr_source_project =
|
||||
if can?(current_user, :push_code, @project)
|
||||
# Edit file in this project
|
||||
@project
|
||||
else
|
||||
# Merge request from fork to this project
|
||||
current_user.fork_of(@project)
|
||||
end
|
||||
|
||||
# Merge request to this project
|
||||
@mr_target_project = @project
|
||||
|
|
|
@ -9,24 +9,32 @@ module IssuableCollections
|
|||
|
||||
private
|
||||
|
||||
def issuable_meta_data(issuable_collection)
|
||||
def issuable_meta_data(issuable_collection, collection_type)
|
||||
# map has to be used here since using pluck or select will
|
||||
# throw an error when ordering issuables by priority which inserts
|
||||
# a new order into the collection.
|
||||
# We cannot use reorder to not mess up the paginated collection.
|
||||
issuable_ids = issuable_collection.map(&:id)
|
||||
issuable_note_count = Note.count_for_collection(issuable_ids, @collection_type)
|
||||
issuable_ids = issuable_collection.map(&:id)
|
||||
issuable_note_count = Note.count_for_collection(issuable_ids, @collection_type)
|
||||
issuable_votes_count = AwardEmoji.votes_for_collection(issuable_ids, @collection_type)
|
||||
issuable_merge_requests_count =
|
||||
if collection_type == 'Issue'
|
||||
MergeRequestsClosingIssues.count_for_collection(issuable_ids)
|
||||
else
|
||||
[]
|
||||
end
|
||||
|
||||
issuable_ids.each_with_object({}) do |id, issuable_meta|
|
||||
downvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.downvote? }
|
||||
upvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.upvote? }
|
||||
notes = issuable_note_count.find { |notes| notes.noteable_id == id }
|
||||
upvotes = issuable_votes_count.find { |votes| votes.awardable_id == id && votes.upvote? }
|
||||
notes = issuable_note_count.find { |notes| notes.noteable_id == id }
|
||||
merge_requests = issuable_merge_requests_count.find { |mr| mr.first == id }
|
||||
|
||||
issuable_meta[id] = Issuable::IssuableMeta.new(
|
||||
upvotes.try(:count).to_i,
|
||||
downvotes.try(:count).to_i,
|
||||
notes.try(:count).to_i
|
||||
notes.try(:count).to_i,
|
||||
merge_requests.try(:last).to_i
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -10,7 +10,7 @@ module IssuesAction
|
|||
.page(params[:page])
|
||||
|
||||
@collection_type = "Issue"
|
||||
@issuable_meta_data = issuable_meta_data(@issues)
|
||||
@issuable_meta_data = issuable_meta_data(@issues, @collection_type)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
|
|
|
@ -9,7 +9,7 @@ module MergeRequestsAction
|
|||
.page(params[:page])
|
||||
|
||||
@collection_type = "MergeRequest"
|
||||
@issuable_meta_data = issuable_meta_data(@merge_requests)
|
||||
@issuable_meta_data = issuable_meta_data(@merge_requests, @collection_type)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -59,10 +59,10 @@ module ServiceParams
|
|||
:user_key,
|
||||
:username,
|
||||
:webhook
|
||||
]
|
||||
].freeze
|
||||
|
||||
# Parameters to ignore if no value is specified
|
||||
FILTER_BLANK_PARAMS = [:password]
|
||||
FILTER_BLANK_PARAMS = [:password].freeze
|
||||
|
||||
def service_params
|
||||
dynamic_params = @service.event_channel_names + @service.event_names
|
||||
|
|
|
@ -17,13 +17,31 @@ module SpammableActions
|
|||
|
||||
private
|
||||
|
||||
def recaptcha_params
|
||||
return {} unless params[:recaptcha_verification] && Gitlab::Recaptcha.load_configurations! && verify_recaptcha
|
||||
def recaptcha_check_with_fallback(&fallback)
|
||||
if spammable.valid?
|
||||
redirect_to spammable
|
||||
elsif render_recaptcha?
|
||||
if params[:recaptcha_verification]
|
||||
flash[:alert] = 'There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.'
|
||||
end
|
||||
|
||||
{
|
||||
recaptcha_verified: true,
|
||||
spam_log_id: params[:spam_log_id]
|
||||
}
|
||||
render :verify
|
||||
else
|
||||
yield
|
||||
end
|
||||
end
|
||||
|
||||
def spammable_params
|
||||
default_params = { request: request }
|
||||
|
||||
recaptcha_check = params[:recaptcha_verification] &&
|
||||
Gitlab::Recaptcha.load_configurations! &&
|
||||
verify_recaptcha
|
||||
|
||||
return default_params unless recaptcha_check
|
||||
|
||||
{ recaptcha_verified: true,
|
||||
spam_log_id: params[:spam_log_id] }.merge(default_params)
|
||||
end
|
||||
|
||||
def spammable
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
class Dashboard::TodosController < Dashboard::ApplicationController
|
||||
include ActionView::Helpers::NumberHelper
|
||||
|
||||
before_action :find_todos, only: [:index, :destroy_all]
|
||||
|
||||
def index
|
||||
|
@ -35,6 +37,11 @@ class Dashboard::TodosController < Dashboard::ApplicationController
|
|||
render json: todos_counts
|
||||
end
|
||||
|
||||
# Used in TodosHelper also
|
||||
def self.todos_count_format(count)
|
||||
count >= 100 ? '99+' : count
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_todos
|
||||
|
@ -43,8 +50,8 @@ class Dashboard::TodosController < Dashboard::ApplicationController
|
|||
|
||||
def todos_counts
|
||||
{
|
||||
count: current_user.todos_pending_count,
|
||||
done_count: current_user.todos_done_count
|
||||
count: number_with_delimiter(current_user.todos_pending_count),
|
||||
done_count: number_with_delimiter(current_user.todos_done_count)
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -29,7 +29,7 @@ class Import::FogbugzController < Import::BaseController
|
|||
unless user_map.is_a?(Hash) && user_map.all? { |k, v| !v[:name].blank? }
|
||||
flash.now[:alert] = 'All users must have a name.'
|
||||
|
||||
render 'new_user_map' and return
|
||||
return render 'new_user_map'
|
||||
end
|
||||
|
||||
session[:fogbugz_user_map] = user_map
|
||||
|
|
|
@ -44,13 +44,13 @@ class Import::GoogleCodeController < Import::BaseController
|
|||
rescue
|
||||
flash.now[:alert] = "The entered user map is not a valid JSON user map."
|
||||
|
||||
render "new_user_map" and return
|
||||
return render "new_user_map"
|
||||
end
|
||||
|
||||
unless user_map.is_a?(Hash) && user_map.all? { |k, v| k.is_a?(String) && v.is_a?(String) }
|
||||
flash.now[:alert] = "The entered user map is not a valid JSON user map."
|
||||
|
||||
render "new_user_map" and return
|
||||
return render "new_user_map"
|
||||
end
|
||||
|
||||
# This is the default, so let's not save it into the database.
|
||||
|
|
|
@ -42,9 +42,7 @@ class InvitesController < ApplicationController
|
|||
@token = params[:id]
|
||||
@member = Member.find_by_invite_token(@token)
|
||||
|
||||
unless @member
|
||||
render_404 and return
|
||||
end
|
||||
return render_404 unless @member
|
||||
|
||||
@member
|
||||
end
|
||||
|
|
|
@ -5,7 +5,7 @@ class JwtController < ApplicationController
|
|||
|
||||
SERVICES = {
|
||||
Auth::ContainerRegistryAuthenticationService::AUDIENCE => Auth::ContainerRegistryAuthenticationService,
|
||||
}
|
||||
}.freeze
|
||||
|
||||
def auth
|
||||
service = SERVICES[params[:service]]
|
||||
|
@ -39,7 +39,8 @@ class JwtController < ApplicationController
|
|||
message: "HTTP Basic: Access denied\n" \
|
||||
"You have 2FA enabled, please use a personal access token for Git over HTTP.\n" \
|
||||
"You can generate one at #{profile_personal_access_tokens_url}" }
|
||||
] }, status: 401
|
||||
]
|
||||
}, status: 401
|
||||
end
|
||||
|
||||
def render_unauthorized
|
||||
|
@ -47,7 +48,8 @@ class JwtController < ApplicationController
|
|||
errors: [
|
||||
{ code: 'UNAUTHORIZED',
|
||||
message: 'HTTP Basic: Access denied' }
|
||||
] }, status: 401
|
||||
]
|
||||
}, status: 401
|
||||
end
|
||||
|
||||
def auth_params
|
||||
|
|
|
@ -122,7 +122,7 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|||
else
|
||||
error_message = @user.errors.full_messages.to_sentence
|
||||
|
||||
redirect_to omniauth_error_path(oauth['provider'], error: error_message) and return
|
||||
return redirect_to omniauth_error_path(oauth['provider'], error: error_message)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -45,13 +45,13 @@ class Profiles::KeysController < Profiles::ApplicationController
|
|||
if user.present?
|
||||
render text: user.all_ssh_keys.join("\n"), content_type: "text/plain"
|
||||
else
|
||||
render_404 and return
|
||||
return render_404
|
||||
end
|
||||
rescue => e
|
||||
render text: e.message
|
||||
end
|
||||
else
|
||||
render_404 and return
|
||||
return render_404
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController
|
|||
|
||||
def build_qr_code
|
||||
uri = current_user.otp_provisioning_uri(account_string, issuer: issuer_host)
|
||||
RQRCode::render_qrcode(uri, :svg, level: :m, unit: 3)
|
||||
RQRCode.render_qrcode(uri, :svg, level: :m, unit: 3)
|
||||
end
|
||||
|
||||
def account_string
|
||||
|
|
|
@ -95,7 +95,7 @@ class Projects::BlobController < Projects::ApplicationController
|
|||
else
|
||||
if tree = @repository.tree(@commit.id, @path)
|
||||
if tree.entries.any?
|
||||
redirect_to namespace_project_tree_path(@project.namespace, @project, File.join(@ref, @path)) and return
|
||||
return redirect_to namespace_project_tree_path(@project.namespace, @project, File.join(@ref, @path))
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
class Projects::BranchesController < Projects::ApplicationController
|
||||
include ActionView::Helpers::SanitizeHelper
|
||||
include SortingHelper
|
||||
|
||||
# Authorize
|
||||
before_action :require_non_empty_project
|
||||
before_action :require_non_empty_project, except: :create
|
||||
before_action :authorize_download_code!
|
||||
before_action :authorize_push_code!, only: [:new, :create, :destroy, :destroy_all_merged]
|
||||
|
||||
|
@ -32,6 +33,8 @@ class Projects::BranchesController < Projects::ApplicationController
|
|||
branch_name = sanitize(strip_tags(params[:branch_name]))
|
||||
branch_name = Addressable::URI.unescape(branch_name)
|
||||
|
||||
redirect_to_autodeploy = project.empty_repo? && project.deployment_services.present?
|
||||
|
||||
result = CreateBranchService.new(project, current_user).
|
||||
execute(branch_name, ref)
|
||||
|
||||
|
@ -42,8 +45,15 @@ class Projects::BranchesController < Projects::ApplicationController
|
|||
|
||||
if result[:status] == :success
|
||||
@branch = result[:branch]
|
||||
redirect_to namespace_project_tree_path(@project.namespace, @project,
|
||||
@branch.name)
|
||||
|
||||
if redirect_to_autodeploy
|
||||
redirect_to(
|
||||
url_to_autodeploy_setup(project, branch_name),
|
||||
notice: view_context.autodeploy_flash_notice(branch_name))
|
||||
else
|
||||
redirect_to namespace_project_tree_path(@project.namespace, @project,
|
||||
@branch.name)
|
||||
end
|
||||
else
|
||||
@error = result[:message]
|
||||
render action: 'new'
|
||||
|
@ -76,7 +86,19 @@ class Projects::BranchesController < Projects::ApplicationController
|
|||
ref_escaped = sanitize(strip_tags(params[:ref]))
|
||||
Addressable::URI.unescape(ref_escaped)
|
||||
else
|
||||
@project.default_branch
|
||||
@project.default_branch || 'master'
|
||||
end
|
||||
end
|
||||
|
||||
def url_to_autodeploy_setup(project, branch_name)
|
||||
namespace_project_new_blob_path(
|
||||
project.namespace,
|
||||
project,
|
||||
branch_name,
|
||||
file_name: '.gitlab-ci.yml',
|
||||
commit_message: 'Set up auto deploy',
|
||||
target_branch: branch_name,
|
||||
context: 'autodeploy'
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -76,11 +76,12 @@ class Projects::GitHttpClientController < Projects::ApplicationController
|
|||
return @project if defined?(@project)
|
||||
|
||||
project_id, _ = project_id_with_suffix
|
||||
if project_id.blank?
|
||||
@project = nil
|
||||
else
|
||||
@project = Project.find_by_full_path("#{params[:namespace_id]}/#{project_id}")
|
||||
end
|
||||
@project =
|
||||
if project_id.blank?
|
||||
nil
|
||||
else
|
||||
Project.find_by_full_path("#{params[:namespace_id]}/#{project_id}")
|
||||
end
|
||||
end
|
||||
|
||||
# This method returns two values so that we can parse
|
||||
|
|
|
@ -26,7 +26,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
@collection_type = "Issue"
|
||||
@issues = issues_collection
|
||||
@issues = @issues.page(params[:page])
|
||||
@issuable_meta_data = issuable_meta_data(@issues)
|
||||
@issuable_meta_data = issuable_meta_data(@issues, @collection_type)
|
||||
|
||||
if @issues.out_of_range? && @issues.total_pages != 0
|
||||
return redirect_to url_for(params.merge(page: @issues.total_pages))
|
||||
|
@ -94,15 +94,15 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
extra_params = { request: request,
|
||||
merge_request_for_resolving_discussions: merge_request_for_resolving_discussions }
|
||||
extra_params.merge!(recaptcha_params)
|
||||
create_params = issue_params
|
||||
.merge(merge_request_for_resolving_discussions: merge_request_for_resolving_discussions)
|
||||
.merge(spammable_params)
|
||||
|
||||
@issue = Issues::CreateService.new(project, current_user, issue_params.merge(extra_params)).execute
|
||||
@issue = Issues::CreateService.new(project, current_user, create_params).execute
|
||||
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
html_response_create
|
||||
recaptcha_check_with_fallback { render :new }
|
||||
end
|
||||
format.js do
|
||||
@link = @issue.attachment.url.to_js
|
||||
|
@ -111,7 +111,9 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def update
|
||||
@issue = Issues::UpdateService.new(project, current_user, issue_params).execute(issue)
|
||||
update_params = issue_params.merge(spammable_params)
|
||||
|
||||
@issue = Issues::UpdateService.new(project, current_user, update_params).execute(issue)
|
||||
|
||||
if params[:move_to_project_id].to_i > 0
|
||||
new_project = Project.find(params[:move_to_project_id])
|
||||
|
@ -123,11 +125,7 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
if @issue.valid?
|
||||
redirect_to issue_path(@issue)
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
recaptcha_check_with_fallback { render :edit }
|
||||
end
|
||||
|
||||
format.json do
|
||||
|
@ -179,20 +177,6 @@ class Projects::IssuesController < Projects::ApplicationController
|
|||
|
||||
protected
|
||||
|
||||
def html_response_create
|
||||
if @issue.valid?
|
||||
redirect_to issue_path(@issue)
|
||||
elsif render_recaptcha?
|
||||
if params[:recaptcha_verification]
|
||||
flash[:alert] = 'There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.'
|
||||
end
|
||||
|
||||
render :verify
|
||||
else
|
||||
render :new
|
||||
end
|
||||
end
|
||||
|
||||
def issue
|
||||
# The Sortable default scope causes performance issues when used with find_by
|
||||
@noteable = @issue ||= @project.issues.where(iid: params[:id]).reorder(nil).take || redirect_old
|
||||
|
|
|
@ -39,7 +39,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
|||
@collection_type = "MergeRequest"
|
||||
@merge_requests = merge_requests_collection
|
||||
@merge_requests = @merge_requests.page(params[:page])
|
||||
@issuable_meta_data = issuable_meta_data(@merge_requests)
|
||||
@issuable_meta_data = issuable_meta_data(@merge_requests, @collection_type)
|
||||
|
||||
if @merge_requests.out_of_range? && @merge_requests.total_pages != 0
|
||||
return redirect_to url_for(params.merge(page: @merge_requests.total_pages))
|
||||
|
@ -50,6 +50,17 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
|||
@labels = LabelsFinder.new(current_user, labels_params).execute
|
||||
end
|
||||
|
||||
@users = []
|
||||
if params[:assignee_id].present?
|
||||
assignee = User.find_by_id(params[:assignee_id])
|
||||
@users.push(assignee) if assignee
|
||||
end
|
||||
|
||||
if params[:author_id].present?
|
||||
author = User.find_by_id(params[:author_id])
|
||||
@users.push(author) if author
|
||||
end
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.json do
|
||||
|
@ -370,14 +381,15 @@ class Projects::MergeRequestsController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def merge_widget_refresh
|
||||
if merge_request.merge_when_build_succeeds
|
||||
@status = :merge_when_build_succeeds
|
||||
else
|
||||
# Only MRs that can be merged end in this action
|
||||
# MR can be already picked up for merge / merged already or can be waiting for worker to be picked up
|
||||
# in last case it does not have any special status. Possible error is handled inside widget js function
|
||||
@status = :success
|
||||
end
|
||||
@status =
|
||||
if merge_request.merge_when_build_succeeds
|
||||
:merge_when_build_succeeds
|
||||
else
|
||||
# Only MRs that can be merged end in this action
|
||||
# MR can be already picked up for merge / merged already or can be waiting for worker to be picked up
|
||||
# in last case it does not have any special status. Possible error is handled inside widget js function
|
||||
:success
|
||||
end
|
||||
|
||||
render 'merge'
|
||||
end
|
||||
|
|
|
@ -13,9 +13,15 @@ class Projects::PipelinesController < Projects::ApplicationController
|
|||
.page(params[:page])
|
||||
.per(30)
|
||||
|
||||
@running_or_pending_count = PipelinesFinder
|
||||
@running_count = PipelinesFinder
|
||||
.new(project).execute(scope: 'running').count
|
||||
|
||||
@pending_count = PipelinesFinder
|
||||
.new(project).execute(scope: 'pending').count
|
||||
|
||||
@finished_count = PipelinesFinder
|
||||
.new(project).execute(scope: 'finished').count
|
||||
|
||||
@pipelines_count = PipelinesFinder
|
||||
.new(project).execute.count
|
||||
|
||||
|
@ -29,7 +35,9 @@ class Projects::PipelinesController < Projects::ApplicationController
|
|||
.represent(@pipelines),
|
||||
count: {
|
||||
all: @pipelines_count,
|
||||
running_or_pending: @running_or_pending_count
|
||||
running: @running_count,
|
||||
pending: @pending_count,
|
||||
finished: @finished_count,
|
||||
}
|
||||
}
|
||||
end
|
||||
|
|
|
@ -38,24 +38,19 @@ class Projects::SnippetsController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
create_params = snippet_params.merge(request: request)
|
||||
create_params = snippet_params.merge(spammable_params)
|
||||
|
||||
@snippet = CreateSnippetService.new(@project, current_user, create_params).execute
|
||||
|
||||
if @snippet.valid?
|
||||
respond_with(@snippet,
|
||||
location: namespace_project_snippet_path(@project.namespace,
|
||||
@project, @snippet))
|
||||
else
|
||||
render :new
|
||||
end
|
||||
recaptcha_check_with_fallback { render :new }
|
||||
end
|
||||
|
||||
def update
|
||||
UpdateSnippetService.new(project, current_user, @snippet,
|
||||
snippet_params).execute
|
||||
respond_with(@snippet,
|
||||
location: namespace_project_snippet_path(@project.namespace,
|
||||
@project, @snippet))
|
||||
update_params = snippet_params.merge(spammable_params)
|
||||
|
||||
UpdateSnippetService.new(project, current_user, @snippet, update_params).execute
|
||||
|
||||
recaptcha_check_with_fallback { render :edit }
|
||||
end
|
||||
|
||||
def show
|
||||
|
|
|
@ -15,10 +15,10 @@ class Projects::TreeController < Projects::ApplicationController
|
|||
|
||||
if tree.entries.empty?
|
||||
if @repository.blob_at(@commit.id, @path)
|
||||
redirect_to(
|
||||
return redirect_to(
|
||||
namespace_project_blob_path(@project.namespace, @project,
|
||||
File.join(@ref, @path))
|
||||
) and return
|
||||
)
|
||||
elsif @path.present?
|
||||
return render_404
|
||||
end
|
||||
|
|
|
@ -15,11 +15,12 @@ class SessionsController < Devise::SessionsController
|
|||
|
||||
def new
|
||||
set_minimum_password_length
|
||||
if Gitlab.config.ldap.enabled
|
||||
@ldap_servers = Gitlab::LDAP::Config.servers
|
||||
else
|
||||
@ldap_servers = []
|
||||
end
|
||||
@ldap_servers =
|
||||
if Gitlab.config.ldap.enabled
|
||||
Gitlab::LDAP::Config.servers
|
||||
else
|
||||
[]
|
||||
end
|
||||
|
||||
super
|
||||
end
|
||||
|
|
|
@ -23,13 +23,14 @@ class SnippetsController < ApplicationController
|
|||
if params[:username].present?
|
||||
@user = User.find_by(username: params[:username])
|
||||
|
||||
render_404 and return unless @user
|
||||
return render_404 unless @user
|
||||
|
||||
@snippets = SnippetsFinder.new.execute(current_user, {
|
||||
filter: :by_user,
|
||||
user: @user,
|
||||
scope: params[:scope] }).
|
||||
page(params[:page])
|
||||
scope: params[:scope]
|
||||
})
|
||||
.page(params[:page])
|
||||
|
||||
render 'index'
|
||||
else
|
||||
|
@ -42,16 +43,19 @@ class SnippetsController < ApplicationController
|
|||
end
|
||||
|
||||
def create
|
||||
create_params = snippet_params.merge(request: request)
|
||||
create_params = snippet_params.merge(spammable_params)
|
||||
|
||||
@snippet = CreateSnippetService.new(nil, current_user, create_params).execute
|
||||
|
||||
respond_with @snippet.becomes(Snippet)
|
||||
recaptcha_check_with_fallback { render :new }
|
||||
end
|
||||
|
||||
def update
|
||||
UpdateSnippetService.new(nil, current_user, @snippet,
|
||||
snippet_params).execute
|
||||
respond_with @snippet.becomes(Snippet)
|
||||
update_params = snippet_params.merge(spammable_params)
|
||||
|
||||
UpdateSnippetService.new(nil, current_user, @snippet, update_params).execute
|
||||
|
||||
recaptcha_check_with_fallback { render :edit }
|
||||
end
|
||||
|
||||
def show
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
# iids: integer[]
|
||||
#
|
||||
class IssuableFinder
|
||||
NONE = '0'
|
||||
NONE = '0'.freeze
|
||||
|
||||
attr_accessor :current_user, :params
|
||||
|
||||
|
|
|
@ -28,11 +28,12 @@ class NotesFinder
|
|||
private
|
||||
|
||||
def init_collection
|
||||
if @params[:target_id]
|
||||
@notes = on_target(@params[:target_type], @params[:target_id])
|
||||
else
|
||||
@notes = notes_of_any_type
|
||||
end
|
||||
@notes =
|
||||
if @params[:target_id]
|
||||
on_target(@params[:target_type], @params[:target_id])
|
||||
else
|
||||
notes_of_any_type
|
||||
end
|
||||
end
|
||||
|
||||
def notes_of_any_type
|
||||
|
|
|
@ -10,7 +10,11 @@ class PipelinesFinder
|
|||
scoped_pipelines =
|
||||
case scope
|
||||
when 'running'
|
||||
pipelines.running_or_pending
|
||||
pipelines.running
|
||||
when 'pending'
|
||||
pipelines.pending
|
||||
when 'finished'
|
||||
pipelines.finished
|
||||
when 'branches'
|
||||
from_ids(ids_for_ref(branches))
|
||||
when 'tags'
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#
|
||||
|
||||
class TodosFinder
|
||||
NONE = '0'
|
||||
NONE = '0'.freeze
|
||||
|
||||
attr_accessor :current_user, :params
|
||||
|
||||
|
@ -99,7 +99,7 @@ class TodosFinder
|
|||
end
|
||||
|
||||
def type?
|
||||
type.present? && ['Issue', 'MergeRequest'].include?(type)
|
||||
type.present? && %w(Issue MergeRequest).include?(type)
|
||||
end
|
||||
|
||||
def type
|
||||
|
|
|
@ -69,11 +69,12 @@ module ApplicationHelper
|
|||
end
|
||||
|
||||
def avatar_icon(user_or_email = nil, size = nil, scale = 2)
|
||||
if user_or_email.is_a?(User)
|
||||
user = user_or_email
|
||||
else
|
||||
user = User.find_by_any_email(user_or_email.try(:downcase))
|
||||
end
|
||||
user =
|
||||
if user_or_email.is_a?(User)
|
||||
user_or_email
|
||||
else
|
||||
User.find_by_any_email(user_or_email.try(:downcase))
|
||||
end
|
||||
|
||||
if user
|
||||
user.avatar_url(size) || default_avatar
|
||||
|
|
|
@ -1,28 +1,15 @@
|
|||
module ApplicationSettingsHelper
|
||||
def gravatar_enabled?
|
||||
current_application_settings.gravatar_enabled?
|
||||
end
|
||||
|
||||
def signup_enabled?
|
||||
current_application_settings.signup_enabled?
|
||||
end
|
||||
|
||||
def signin_enabled?
|
||||
current_application_settings.signin_enabled?
|
||||
end
|
||||
delegate :gravatar_enabled?,
|
||||
:signup_enabled?,
|
||||
:signin_enabled?,
|
||||
:akismet_enabled?,
|
||||
:koding_enabled?,
|
||||
to: :current_application_settings
|
||||
|
||||
def user_oauth_applications?
|
||||
current_application_settings.user_oauth_applications
|
||||
end
|
||||
|
||||
def askimet_enabled?
|
||||
current_application_settings.akismet_enabled?
|
||||
end
|
||||
|
||||
def koding_enabled?
|
||||
current_application_settings.koding_enabled?
|
||||
end
|
||||
|
||||
def allowed_protocols_present?
|
||||
current_application_settings.enabled_git_access_protocol.present?
|
||||
end
|
||||
|
|
|
@ -153,16 +153,17 @@ module BlobHelper
|
|||
# Because we are opionated we set the cache headers ourselves.
|
||||
response.cache_control[:public] = @project.public?
|
||||
|
||||
if @ref && @commit && @ref == @commit.id
|
||||
# This is a link to a commit by its commit SHA. That means that the blob
|
||||
# is immutable. The only reason to invalidate the cache is if the commit
|
||||
# was deleted or if the user lost access to the repository.
|
||||
response.cache_control[:max_age] = Blob::CACHE_TIME_IMMUTABLE
|
||||
else
|
||||
# A branch or tag points at this blob. That means that the expected blob
|
||||
# value may change over time.
|
||||
response.cache_control[:max_age] = Blob::CACHE_TIME
|
||||
end
|
||||
response.cache_control[:max_age] =
|
||||
if @ref && @commit && @ref == @commit.id
|
||||
# This is a link to a commit by its commit SHA. That means that the blob
|
||||
# is immutable. The only reason to invalidate the cache is if the commit
|
||||
# was deleted or if the user lost access to the repository.
|
||||
Blob::CACHE_TIME_IMMUTABLE
|
||||
else
|
||||
# A branch or tag points at this blob. That means that the expected blob
|
||||
# value may change over time.
|
||||
Blob::CACHE_TIME
|
||||
end
|
||||
|
||||
response.etag = @blob.id
|
||||
!stale
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
module EmailsHelper
|
||||
include AppearancesHelper
|
||||
|
||||
# Google Actions
|
||||
# https://developers.google.com/gmail/markup/reference/go-to-action
|
||||
def email_action(url)
|
||||
|
@ -22,7 +24,7 @@ module EmailsHelper
|
|||
|
||||
def action_title(url)
|
||||
return unless url
|
||||
["merge_requests", "issues", "commit"].each do |action|
|
||||
%w(merge_requests issues commit).each do |action|
|
||||
if url.split("/").include?(action)
|
||||
return "View #{action.humanize.singularize}"
|
||||
end
|
||||
|
@ -49,4 +51,19 @@ module EmailsHelper
|
|||
msg = "This link is valid for #{password_reset_token_valid_time}. "
|
||||
msg << "After it expires, you can #{link_tag}."
|
||||
end
|
||||
|
||||
def header_logo
|
||||
if brand_item && brand_item.header_logo?
|
||||
image_tag(
|
||||
brand_item.header_logo,
|
||||
style: 'height: 50px'
|
||||
)
|
||||
else
|
||||
image_tag(
|
||||
image_url('mailers/gitlab_header_logo.gif'),
|
||||
size: "55x50",
|
||||
alt: "GitLab"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -23,7 +23,7 @@ module IssuablesHelper
|
|||
def issuable_json_path(issuable)
|
||||
project = issuable.project
|
||||
|
||||
if issuable.kind_of?(MergeRequest)
|
||||
if issuable.is_a?(MergeRequest)
|
||||
namespace_project_merge_request_path(project.namespace, project, issuable.iid, :json)
|
||||
else
|
||||
namespace_project_issue_path(project.namespace, project, issuable.iid, :json)
|
||||
|
@ -198,7 +198,7 @@ module IssuablesHelper
|
|||
@counts[issuable_type][state]
|
||||
end
|
||||
|
||||
IRRELEVANT_PARAMS_FOR_CACHE_KEY = %i[utf8 sort page]
|
||||
IRRELEVANT_PARAMS_FOR_CACHE_KEY = %i[utf8 sort page].freeze
|
||||
private_constant :IRRELEVANT_PARAMS_FOR_CACHE_KEY
|
||||
|
||||
def issuables_state_counter_cache_key(issuable_type, state)
|
||||
|
|
|
@ -2,6 +2,7 @@ module JavascriptHelper
|
|||
def page_specific_javascript_tag(js)
|
||||
javascript_include_tag asset_path(js)
|
||||
end
|
||||
|
||||
def page_specific_javascript_bundle_tag(js)
|
||||
javascript_include_tag(*webpack_asset_paths(js))
|
||||
end
|
||||
|
|
|
@ -1,4 +1,8 @@
|
|||
module NamespacesHelper
|
||||
def namespace_id_from(params)
|
||||
params.dig(:project, :namespace_id) || params[:namespace_id]
|
||||
end
|
||||
|
||||
def namespaces_options(selected = :current_user, display_path: false, extra_group: nil)
|
||||
groups = current_user.owned_groups + current_user.masters_groups
|
||||
|
||||
|
@ -29,7 +33,7 @@ module NamespacesHelper
|
|||
end
|
||||
|
||||
def namespace_icon(namespace, size = 40)
|
||||
if namespace.kind_of?(Group)
|
||||
if namespace.is_a?(Group)
|
||||
group_icon(namespace)
|
||||
else
|
||||
avatar_icon(namespace.owner.email, size)
|
||||
|
|
|
@ -150,6 +150,15 @@ module ProjectsHelper
|
|||
).html_safe
|
||||
end
|
||||
|
||||
def link_to_autodeploy_doc
|
||||
link_to 'About auto deploy', help_page_path('ci/autodeploy/index'), target: '_blank'
|
||||
end
|
||||
|
||||
def autodeploy_flash_notice(branch_name)
|
||||
"Branch <strong>#{truncate(sanitize(branch_name))}</strong> was created. To set up auto deploy, \
|
||||
choose a GitLab CI Yaml template and commit your changes. #{link_to_autodeploy_doc}".html_safe
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def repo_children_classes(field)
|
||||
|
|
|
@ -30,7 +30,7 @@ module SortingHelper
|
|||
}
|
||||
|
||||
if current_controller?('admin/projects')
|
||||
options.merge!(sort_value_largest_repo => sort_title_largest_repo)
|
||||
options[sort_value_largest_repo] = sort_title_largest_repo
|
||||
end
|
||||
|
||||
options
|
||||
|
|
|
@ -37,8 +37,8 @@ module SubmoduleHelper
|
|||
end
|
||||
|
||||
def self_url?(url, namespace, project)
|
||||
return true if url == [ Gitlab.config.gitlab.url, '/', namespace, '/',
|
||||
project, '.git' ].join('')
|
||||
return true if url == [Gitlab.config.gitlab.url, '/', namespace, '/',
|
||||
project, '.git'].join('')
|
||||
url == gitlab_shell.url_to_repo([namespace, '/', project].join(''))
|
||||
end
|
||||
|
||||
|
@ -48,8 +48,8 @@ module SubmoduleHelper
|
|||
end
|
||||
|
||||
def standard_links(host, namespace, project, commit)
|
||||
base = [ 'https://', host, '/', namespace, '/', project ].join('')
|
||||
[base, [ base, '/tree/', commit ].join('')]
|
||||
base = ['https://', host, '/', namespace, '/', project].join('')
|
||||
[base, [base, '/tree/', commit].join('')]
|
||||
end
|
||||
|
||||
def relative_self_links(url, commit)
|
||||
|
|
|
@ -99,7 +99,7 @@ module TabHelper
|
|||
return 'active'
|
||||
end
|
||||
|
||||
if ['services', 'hooks', 'deploy_keys', 'protected_branches'].include? controller.controller_name
|
||||
if %w(services hooks deploy_keys protected_branches).include? controller.controller_name
|
||||
"active"
|
||||
end
|
||||
end
|
||||
|
|
|
@ -3,6 +3,10 @@ module TodosHelper
|
|||
@todos_pending_count ||= current_user.todos_pending_count
|
||||
end
|
||||
|
||||
def todos_count_format(count)
|
||||
count > 99 ? '99+' : count
|
||||
end
|
||||
|
||||
def todos_done_count
|
||||
@todos_done_count ||= current_user.todos_done_count
|
||||
end
|
||||
|
@ -146,6 +150,6 @@ module TodosHelper
|
|||
private
|
||||
|
||||
def show_todo_state?(todo)
|
||||
(todo.target.is_a?(MergeRequest) || todo.target.is_a?(Issue)) && ['closed', 'merged'].include?(todo.target.state)
|
||||
(todo.target.is_a?(MergeRequest) || todo.target.is_a?(Issue)) && %w(closed merged).include?(todo.target.state)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -89,13 +89,9 @@ module VisibilityLevelHelper
|
|||
current_application_settings.restricted_visibility_levels || []
|
||||
end
|
||||
|
||||
def default_project_visibility
|
||||
current_application_settings.default_project_visibility
|
||||
end
|
||||
|
||||
def default_group_visibility
|
||||
current_application_settings.default_group_visibility
|
||||
end
|
||||
delegate :default_project_visibility,
|
||||
:default_group_visibility,
|
||||
to: :current_application_settings
|
||||
|
||||
def skip_level?(form_model, level)
|
||||
form_model.is_a?(Project) && !form_model.visibility_level_allowed?(level)
|
||||
|
|
|
@ -22,8 +22,8 @@ module Emails
|
|||
mail(bcc: recipients,
|
||||
subject: pipeline_subject(status),
|
||||
skip_premailer: true) do |format|
|
||||
format.html { render layout: false }
|
||||
format.text
|
||||
format.html { render layout: 'mailer' }
|
||||
format.text { render layout: 'mailer' }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,10 +1,11 @@
|
|||
class RepositoryCheckMailer < BaseMailer
|
||||
def notify(failed_count)
|
||||
if failed_count == 1
|
||||
@message = "One project failed its last repository check"
|
||||
else
|
||||
@message = "#{failed_count} projects failed their last repository check"
|
||||
end
|
||||
@message =
|
||||
if failed_count == 1
|
||||
"One project failed its last repository check"
|
||||
else
|
||||
"#{failed_count} projects failed their last repository check"
|
||||
end
|
||||
|
||||
mail(
|
||||
to: User.admins.pluck(:email),
|
||||
|
|
|
@ -5,7 +5,7 @@ class ApplicationSetting < ActiveRecord::Base
|
|||
add_authentication_token_field :runners_registration_token
|
||||
add_authentication_token_field :health_check_access_token
|
||||
|
||||
CACHE_KEY = 'application_setting.last'
|
||||
CACHE_KEY = 'application_setting.last'.freeze
|
||||
DOMAIN_LIST_SEPARATOR = %r{\s*[,;]\s* # comma or semicolon, optionally surrounded by whitespace
|
||||
| # or
|
||||
\s # any whitespace character
|
||||
|
|
|
@ -22,8 +22,10 @@ module Ci
|
|||
serialize :options
|
||||
serialize :yaml_variables, Gitlab::Serializer::Ci::Variables
|
||||
|
||||
delegate :name, to: :project, prefix: true
|
||||
|
||||
validates :coverage, numericality: true, allow_blank: true
|
||||
validates_presence_of :ref
|
||||
validates :ref, presence: true
|
||||
|
||||
scope :unstarted, ->() { where(runner_id: nil) }
|
||||
scope :ignore_failures, ->() { where(allow_failure: false) }
|
||||
|
@ -233,10 +235,6 @@ module Ci
|
|||
gl_project_id
|
||||
end
|
||||
|
||||
def project_name
|
||||
project.name
|
||||
end
|
||||
|
||||
def repo_url
|
||||
auth = "gitlab-ci-token:#{ensure_token!}@"
|
||||
project.http_url_to_repo.sub(/^https?:\/\//) do |prefix|
|
||||
|
@ -257,7 +255,7 @@ module Ci
|
|||
return unless regex
|
||||
|
||||
matches = text.scan(Regexp.new(regex)).last
|
||||
matches = matches.last if matches.kind_of?(Array)
|
||||
matches = matches.last if matches.is_a?(Array)
|
||||
coverage = matches.gsub(/\d+(\.\d+)?/).first
|
||||
|
||||
if coverage.present?
|
||||
|
|
|
@ -14,9 +14,11 @@ module Ci
|
|||
has_many :builds, foreign_key: :commit_id
|
||||
has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id
|
||||
|
||||
validates_presence_of :sha, unless: :importing?
|
||||
validates_presence_of :ref, unless: :importing?
|
||||
validates_presence_of :status, unless: :importing?
|
||||
delegate :id, to: :project, prefix: true
|
||||
|
||||
validates :sha, presence: { unless: :importing? }
|
||||
validates :ref, presence: { unless: :importing? }
|
||||
validates :status, presence: { unless: :importing? }
|
||||
validate :valid_commit_sha, unless: :importing?
|
||||
|
||||
after_create :keep_around_commits, unless: :importing?
|
||||
|
@ -93,8 +95,11 @@ module Ci
|
|||
.select("max(#{quoted_table_name}.id)")
|
||||
.group(:ref, :sha)
|
||||
|
||||
relation = ref ? where(ref: ref) : self
|
||||
relation.where(id: max_id)
|
||||
if ref
|
||||
where(ref: ref, id: max_id.where(ref: ref))
|
||||
else
|
||||
where(id: max_id)
|
||||
end
|
||||
end
|
||||
|
||||
def self.latest_status(ref = nil)
|
||||
|
@ -150,10 +155,6 @@ module Ci
|
|||
builds.latest.with_artifacts_not_expired.includes(project: [:namespace])
|
||||
end
|
||||
|
||||
def project_id
|
||||
project.id
|
||||
end
|
||||
|
||||
# For now the only user who participates is the user who triggered
|
||||
def participants(_current_user = nil)
|
||||
Array(user)
|
||||
|
|
|
@ -4,8 +4,8 @@ module Ci
|
|||
|
||||
RUNNER_QUEUE_EXPIRY_TIME = 60.minutes
|
||||
LAST_CONTACT_TIME = 1.hour.ago
|
||||
AVAILABLE_SCOPES = %w[specific shared active paused online]
|
||||
FORM_EDITABLE = %i[description tag_list active run_untagged locked]
|
||||
AVAILABLE_SCOPES = %w[specific shared active paused online].freeze
|
||||
FORM_EDITABLE = %i[description tag_list active run_untagged locked].freeze
|
||||
|
||||
has_many :builds
|
||||
has_many :runner_projects, dependent: :destroy
|
||||
|
|
|
@ -5,6 +5,6 @@ module Ci
|
|||
belongs_to :runner
|
||||
belongs_to :project, foreign_key: :gl_project_id
|
||||
|
||||
validates_uniqueness_of :runner_id, scope: :gl_project_id
|
||||
validates :runner_id, uniqueness: { scope: :gl_project_id }
|
||||
end
|
||||
end
|
||||
|
|
|
@ -7,8 +7,8 @@ module Ci
|
|||
belongs_to :project, foreign_key: :gl_project_id
|
||||
has_many :trigger_requests, dependent: :destroy
|
||||
|
||||
validates_presence_of :token
|
||||
validates_uniqueness_of :token
|
||||
validates :token, presence: true
|
||||
validates :token, uniqueness: true
|
||||
|
||||
before_validation :set_default_values
|
||||
|
||||
|
|
|
@ -22,12 +22,12 @@ class Commit
|
|||
DIFF_HARD_LIMIT_LINES = 50000
|
||||
|
||||
# The SHA can be between 7 and 40 hex characters.
|
||||
COMMIT_SHA_PATTERN = '\h{7,40}'
|
||||
COMMIT_SHA_PATTERN = '\h{7,40}'.freeze
|
||||
|
||||
class << self
|
||||
def decorate(commits, project)
|
||||
commits.map do |commit|
|
||||
if commit.kind_of?(Commit)
|
||||
if commit.is_a?(Commit)
|
||||
commit
|
||||
else
|
||||
self.new(commit, project)
|
||||
|
@ -105,7 +105,7 @@ class Commit
|
|||
end
|
||||
|
||||
def diff_line_count
|
||||
@diff_line_count ||= Commit::diff_line_count(raw_diffs)
|
||||
@diff_line_count ||= Commit.diff_line_count(raw_diffs)
|
||||
@diff_line_count
|
||||
end
|
||||
|
||||
|
@ -122,11 +122,12 @@ class Commit
|
|||
def full_title
|
||||
return @full_title if @full_title
|
||||
|
||||
if safe_message.blank?
|
||||
@full_title = no_commit_message
|
||||
else
|
||||
@full_title = safe_message.split("\n", 2).first
|
||||
end
|
||||
@full_title =
|
||||
if safe_message.blank?
|
||||
no_commit_message
|
||||
else
|
||||
safe_message.split("\n", 2).first
|
||||
end
|
||||
end
|
||||
|
||||
# Returns the commits description
|
||||
|
|
|
@ -10,10 +10,11 @@ class CommitStatus < ActiveRecord::Base
|
|||
belongs_to :user
|
||||
|
||||
delegate :commit, to: :pipeline
|
||||
delegate :sha, :short_sha, to: :pipeline
|
||||
|
||||
validates :pipeline, presence: true, unless: :importing?
|
||||
|
||||
validates_presence_of :name
|
||||
validates :name, presence: true
|
||||
|
||||
alias_attribute :author, :user
|
||||
|
||||
|
@ -102,8 +103,6 @@ class CommitStatus < ActiveRecord::Base
|
|||
end
|
||||
end
|
||||
|
||||
delegate :sha, :short_sha, to: :pipeline
|
||||
|
||||
def before_sha
|
||||
pipeline.before_sha || Gitlab::Git::BLANK_SHA
|
||||
end
|
||||
|
|
|
@ -11,14 +11,15 @@ module CacheMarkdownField
|
|||
# Knows about the relationship between markdown and html field names, and
|
||||
# stores the rendering contexts for the latter
|
||||
class FieldData
|
||||
extend Forwardable
|
||||
|
||||
def initialize
|
||||
@data = {}
|
||||
end
|
||||
|
||||
def_delegators :@data, :[], :[]=
|
||||
def_delegator :@data, :keys, :markdown_fields
|
||||
delegate :[], :[]=, to: :@data
|
||||
|
||||
def markdown_fields
|
||||
@data.keys
|
||||
end
|
||||
|
||||
def html_field(markdown_field)
|
||||
"#{markdown_field}_html"
|
||||
|
@ -45,7 +46,7 @@ module CacheMarkdownField
|
|||
Project
|
||||
Release
|
||||
Snippet
|
||||
]
|
||||
].freeze
|
||||
|
||||
def self.caching_classes
|
||||
CACHING_CLASSES.map(&:constantize)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue