Upstream version 8.3.0+dfsg
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJWebPvAAoJEM4fnGdFEsIqdHMP+wU5Lscg/2nWBgPexPTwVYzt 7YugEoRwEmprgdtnxMQVhRGH3eTd347vHWXzUvSXjYIox1X6OBqu5vw0rt5zuV+y iE/tB9go1tBWq72neOc3vHfZiRmlYcg63JrmszLxRCRJZ4iMxJpjw6ArfK4JX50l okUXBP0PUVVLYWv9QO/GFnVAHlZZjJJ9l/bMgjFWi2FP8NKD1Qh6wAEfG28K4nld Y1bDX1T3UAyVv9C4VyMnPBjwgYBeZFH8spalsa68YmFkjc37LMWWXH7EuED4f7yW WanXYl7AHVMDwonAjTaNKAi+TdeE2jeet8bZ1irC9pPqC1F27rhVMbuzXGmwjhpK csK9AWWQ0HDX4+v5BZbpYS5e86KMR7MRWrj1eoQlD4n2UI7C+oBxhqBlRZZXwd3M HedAf50GsEHGmoD3Td+JBZwH1VLyM1eyQm2BzUezuIgA60FybJkQhwh1Fj9B3YoZ R6p409M+sE3g+ZP7Grqj2NYhtxgyF4paY3TTmbY9akwQa++E16UY21VGDn4AsPqH ADqji9jxJBKVgRgJGNFlm/VWOp5+96HJlKcTOP3rjReokVDKC/7g+q13FQv0P1rX i/kShXNU5rGVcUPuf9bTHox9xm/opIU4rfttiPlARsUzqgrpqfM29bj/K0/3X23r X50OrpkZc8PM3O7UWWRv =xK6P -----END PGP SIGNATURE----- Merge tag 'upstream/8.3.0+dfsg' into master-8.3.0 Upstream version 8.3.0+dfsg # gpg: Signature made Wednesday 23 December 2015 02:04:55 AM IST using RSA key ID 4512C22A # gpg: Good signature from "Praveen Arimbrathodiyil (piratepin) <praveen@debian.org>" # gpg: aka "Pirate Praveen (pirates.org.in) <praveen@onenetbeyond.org>" # gpg: aka "Pirate Praveen (piratesin) <me@j4v4m4n.in>" # gpg: aka "Pirate Praveen (PP) <praveen@privacyrequired.com>" # gpg: aka "Praveen Arimbrathodiyil (j4v4m4n) <pravi.a@gmail.com>"
This commit is contained in:
commit
ddef8051c3
1143 changed files with 18024 additions and 13143 deletions
|
@ -8,7 +8,7 @@ before_script:
|
||||||
- touch log/application.log
|
- touch log/application.log
|
||||||
- touch log/test.log
|
- touch log/test.log
|
||||||
- bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}"
|
- bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}"
|
||||||
- bundle exec rake db:create RAILS_ENV=test
|
- bundle exec rake db:reset db:create RAILS_ENV=test
|
||||||
|
|
||||||
spec:feature:
|
spec:feature:
|
||||||
script:
|
script:
|
||||||
|
@ -24,6 +24,27 @@ spec:api:
|
||||||
- ruby
|
- ruby
|
||||||
- mysql
|
- mysql
|
||||||
|
|
||||||
|
spec:models:
|
||||||
|
script:
|
||||||
|
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:models
|
||||||
|
tags:
|
||||||
|
- ruby
|
||||||
|
- mysql
|
||||||
|
|
||||||
|
spec:lib:
|
||||||
|
script:
|
||||||
|
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:lib
|
||||||
|
tags:
|
||||||
|
- ruby
|
||||||
|
- mysql
|
||||||
|
|
||||||
|
spec:services:
|
||||||
|
script:
|
||||||
|
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:services
|
||||||
|
tags:
|
||||||
|
- ruby
|
||||||
|
- mysql
|
||||||
|
|
||||||
spec:benchmark:
|
spec:benchmark:
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test bundle exec rake spec:benchmark
|
- RAILS_ENV=test bundle exec rake spec:benchmark
|
||||||
|
@ -39,9 +60,16 @@ spec:other:
|
||||||
- ruby
|
- ruby
|
||||||
- mysql
|
- mysql
|
||||||
|
|
||||||
spinach:project:
|
spinach:project:half:
|
||||||
script:
|
script:
|
||||||
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project
|
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half
|
||||||
|
tags:
|
||||||
|
- ruby
|
||||||
|
- mysql
|
||||||
|
|
||||||
|
spinach:project:rest:
|
||||||
|
script:
|
||||||
|
- RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest
|
||||||
tags:
|
tags:
|
||||||
- ruby
|
- ruby
|
||||||
- mysql
|
- mysql
|
||||||
|
@ -87,4 +115,12 @@ flay:
|
||||||
tags:
|
tags:
|
||||||
- ruby
|
- ruby
|
||||||
- mysql
|
- mysql
|
||||||
|
|
||||||
|
bundler:audit:
|
||||||
|
script:
|
||||||
|
- "bundle exec bundle-audit update"
|
||||||
|
- "bundle exec bundle-audit check"
|
||||||
|
tags:
|
||||||
|
- ruby
|
||||||
|
- mysql
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
87
.rubocop.yml
87
.rubocop.yml
|
@ -76,7 +76,7 @@ Style/BlockEndNewline:
|
||||||
Description: 'Put end statement of multiline block on its own line.'
|
Description: 'Put end statement of multiline block on its own line.'
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
Style/Blocks:
|
Style/BlockDelimiters:
|
||||||
Description: >-
|
Description: >-
|
||||||
Avoid using {...} for multi-line blocks (multiline chaining is
|
Avoid using {...} for multi-line blocks (multiline chaining is
|
||||||
always ugly).
|
always ugly).
|
||||||
|
@ -232,6 +232,10 @@ Style/EvenOdd:
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/ExtraSpacing:
|
||||||
|
Description: 'Do not use unnecessary spacing.'
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/FileName:
|
Style/FileName:
|
||||||
Description: 'Use snake_case for source file names.'
|
Description: 'Use snake_case for source file names.'
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files'
|
||||||
|
@ -431,6 +435,14 @@ Style/OpMethod:
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/ParallelAssignment:
|
||||||
|
Description: >-
|
||||||
|
Check for simple usages of parallel assignment.
|
||||||
|
It will only warn when the number of variables
|
||||||
|
matches on both sides of the assignment.
|
||||||
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parallel-assignment'
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/ParenthesesAroundCondition:
|
Style/ParenthesesAroundCondition:
|
||||||
Description: >-
|
Description: >-
|
||||||
Don't use parentheses around the condition of an
|
Don't use parentheses around the condition of an
|
||||||
|
@ -669,6 +681,13 @@ Style/TrailingWhitespace:
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-whitespace'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-whitespace'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/TrailingUnderscoreVariable:
|
||||||
|
Description: >-
|
||||||
|
Checks for the usage of unneeded trailing underscores at the
|
||||||
|
end of parallel variable assignment.
|
||||||
|
AllowNamedUnderscoreVariables: true
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Style/TrivialAccessors:
|
Style/TrivialAccessors:
|
||||||
Description: 'Prefer attr_* methods to trivial readers/writers.'
|
Description: 'Prefer attr_* methods to trivial readers/writers.'
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family'
|
||||||
|
@ -690,11 +709,6 @@ Style/UnneededPercentQ:
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Style/UnneededPercentX:
|
|
||||||
Description: 'Checks for %x when `` would do.'
|
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-x'
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Style/VariableInterpolation:
|
Style/VariableInterpolation:
|
||||||
Description: >-
|
Description: >-
|
||||||
Don't interpolate global, instance and class variables
|
Don't interpolate global, instance and class variables
|
||||||
|
@ -735,21 +749,37 @@ Metrics/AbcSize:
|
||||||
Description: >-
|
Description: >-
|
||||||
A calculated magnitude based on number of assignments,
|
A calculated magnitude based on number of assignments,
|
||||||
branches, and conditions.
|
branches, and conditions.
|
||||||
Enabled: false
|
Enabled: true
|
||||||
|
Max: 70
|
||||||
Metrics/BlockNesting:
|
|
||||||
Description: 'Avoid excessive block nesting'
|
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count'
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/ClassLength:
|
|
||||||
Description: 'Avoid classes longer than 100 lines of code.'
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Description: >-
|
Description: >-
|
||||||
A complexity metric that is strongly correlated to the number
|
A complexity metric that is strongly correlated to the number
|
||||||
of test cases needed to validate a method.
|
of test cases needed to validate a method.
|
||||||
|
Enabled: true
|
||||||
|
Max: 17
|
||||||
|
|
||||||
|
Metrics/PerceivedComplexity:
|
||||||
|
Description: >-
|
||||||
|
A complexity metric geared towards measuring complexity for a
|
||||||
|
human reader.
|
||||||
|
Enabled: true
|
||||||
|
Max: 17
|
||||||
|
|
||||||
|
Metrics/ParameterLists:
|
||||||
|
Description: 'Avoid parameter lists longer than three or four parameters.'
|
||||||
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
|
||||||
|
Enabled: true
|
||||||
|
Max: 8
|
||||||
|
|
||||||
|
Metrics/BlockNesting:
|
||||||
|
Description: 'Avoid excessive block nesting'
|
||||||
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#three-is-the-number-thou-shalt-count'
|
||||||
|
Enabled: true
|
||||||
|
Max: 4
|
||||||
|
|
||||||
|
Metrics/ClassLength:
|
||||||
|
Description: 'Avoid classes longer than 100 lines of code.'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Metrics/LineLength:
|
Metrics/LineLength:
|
||||||
|
@ -762,15 +792,8 @@ Metrics/MethodLength:
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Metrics/ParameterLists:
|
Metrics/ModuleLength:
|
||||||
Description: 'Avoid parameter lists longer than three or four parameters.'
|
Description: 'Avoid modules longer than 100 lines of code.'
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#too-many-params'
|
|
||||||
Enabled: false
|
|
||||||
|
|
||||||
Metrics/PerceivedComplexity:
|
|
||||||
Description: >-
|
|
||||||
A complexity metric geared towards measuring complexity for a
|
|
||||||
human reader.
|
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
#################### Lint ################################
|
#################### Lint ################################
|
||||||
|
@ -888,7 +911,7 @@ Lint/RequireParentheses:
|
||||||
Lint/RescueException:
|
Lint/RescueException:
|
||||||
Description: 'Avoid rescuing the Exception class.'
|
Description: 'Avoid rescuing the Exception class.'
|
||||||
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-blind-rescues'
|
StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-blind-rescues'
|
||||||
Enabled: false
|
Enabled: true
|
||||||
|
|
||||||
Lint/ShadowingOuterLocalVariable:
|
Lint/ShadowingOuterLocalVariable:
|
||||||
Description: >-
|
Description: >-
|
||||||
|
@ -956,6 +979,12 @@ Rails/ActionFilter:
|
||||||
Description: 'Enforces consistent use of action filter methods.'
|
Description: 'Enforces consistent use of action filter methods.'
|
||||||
Enabled: true
|
Enabled: true
|
||||||
|
|
||||||
|
Rails/Date:
|
||||||
|
Description: >-
|
||||||
|
Checks the correct usage of date aware methods,
|
||||||
|
such as Date.today, Date.current etc.
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Rails/DefaultScope:
|
Rails/DefaultScope:
|
||||||
Description: 'Checks if the argument passed to default_scope is a block.'
|
Description: 'Checks if the argument passed to default_scope is a block.'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
@ -982,6 +1011,12 @@ Rails/ScopeArgs:
|
||||||
Description: 'Checks the arguments of ActiveRecord scopes.'
|
Description: 'Checks the arguments of ActiveRecord scopes.'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Rails/TimeZone:
|
||||||
|
Description: 'Checks the correct usage of time zone aware methods.'
|
||||||
|
StyleGuide: 'https://github.com/bbatsov/rails-style-guide#time'
|
||||||
|
Reference: 'http://danilenko.org/2012/7/6/rails_timezones'
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
Rails/Validation:
|
Rails/Validation:
|
||||||
Description: 'Use validates :attribute, hash of validations.'
|
Description: 'Use validates :attribute, hash of validations.'
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2.1.6
|
2.1.7
|
||||||
|
|
88
CHANGELOG
88
CHANGELOG
|
@ -1,5 +1,88 @@
|
||||||
Please view this file on the master branch, on stable branches it's out of date.
|
Please view this file on the master branch, on stable branches it's out of date.
|
||||||
|
|
||||||
|
v 8.3.0 (unreleased)
|
||||||
|
- Bump rack-attack to 4.3.1 for security fix (Stan Hu)
|
||||||
|
- API support for starred projects for authorized user (Zeger-Jan van de Weg)
|
||||||
|
- Add open_issues_count to project API (Stan Hu)
|
||||||
|
- Expand character set of usernames created by Omniauth (Corey Hinshaw)
|
||||||
|
- Add button to automatically merge a merge request when the build succeeds (Zeger-Jan van de Weg)
|
||||||
|
- Provide better diagnostic message upon project creation errors (Stan Hu)
|
||||||
|
- Bump devise to 3.5.3 to fix reset token expiring after account creation (Stan Hu)
|
||||||
|
- Remove api credentials from link to build_page
|
||||||
|
- Deprecate GitLabCiService making it to always be inactive
|
||||||
|
- Bump gollum-lib to 4.1.0 (Stan Hu)
|
||||||
|
- Fix broken group avatar upload under "New group" (Stan Hu)
|
||||||
|
- Update project repositorize size and commit count during import:repos task (Stan Hu)
|
||||||
|
- Fix API setting of 'public' attribute to false will make a project private (Stan Hu)
|
||||||
|
- Handle and report SSL errors in Web hook test (Stan Hu)
|
||||||
|
- Bump Redis requirement to 2.8 for Sidekiq 4 (Stan Hu)
|
||||||
|
- Fix: Assignee selector is empty when 'Unassigned' is selected (Jose Corcuera)
|
||||||
|
- Add rake tasks for git repository maintainance (Zeger-Jan van de Weg)
|
||||||
|
- Fix 500 error when update group member permission
|
||||||
|
- Trim leading and trailing whitespace of milestone and issueable titles (Jose Corcuera)
|
||||||
|
- Recognize issue/MR/snippet/commit links as references
|
||||||
|
- Backport JIRA features from EE to CE
|
||||||
|
- Add ignore whitespace change option to commit view
|
||||||
|
- Fire update hook from GitLab
|
||||||
|
- Allow account unlock via email
|
||||||
|
- Style warning about mentioning many people in a comment
|
||||||
|
- Fix: sort milestones by due date once again (Greg Smethells)
|
||||||
|
- Migrate all CI::Services and CI::WebHooks to Services and WebHooks
|
||||||
|
- Don't show project fork event as "imported"
|
||||||
|
- Add API endpoint to fetch merge request commits list
|
||||||
|
- Don't create CI status for refs that doesn't have .gitlab-ci.yml, even if the builds are enabled
|
||||||
|
- Expose events API with comment information and author info
|
||||||
|
- Fix: Ensure "Remove Source Branch" button is not shown when branch is being deleted. #3583
|
||||||
|
- Run custom Git hooks when branch is created or deleted.
|
||||||
|
- Fix bug when simultaneously accepting multiple MRs results in MRs that are of "merged" status, but not merged to the target branch
|
||||||
|
- Add languages page to graphs
|
||||||
|
- Block LDAP user when they are no longer found in the LDAP server
|
||||||
|
- Improve wording on project visibility levels (Zeger-Jan van de Weg)
|
||||||
|
- Fix editing notes on a merge request diff
|
||||||
|
- Automatically select default clone protocol based on user preferences (Eirik Lygre)
|
||||||
|
- Make Network page as sub tab of Commits
|
||||||
|
- Add copy-to-clipboard button for Snippets
|
||||||
|
- Add indication to merge request list item that MR cannot be merged automatically
|
||||||
|
- Default target branch to patch-n when editing file in protected branch
|
||||||
|
- Add Builds tab to merge request detail page
|
||||||
|
- Allow milestones, issues and MRs to be created from dashboard and group indexes
|
||||||
|
- Use new style for wiki
|
||||||
|
- Use new style for milestone detail page
|
||||||
|
- Fix sidebar tooltips when collapsed
|
||||||
|
- Prevent possible XSS attack with award-emoji
|
||||||
|
- Upgraded Sidekiq to 4.x
|
||||||
|
- Accept COPYING,COPYING.lesser, and licence as license file (Zeger-Jan van de Weg)
|
||||||
|
- Fix emoji aliases problem
|
||||||
|
- Fix award-emojis Flash alert's width
|
||||||
|
- Fix deleting notes on a merge request diff
|
||||||
|
- Display referenced merge request statuses in the issue description (Greg Smethells)
|
||||||
|
- Implement new sidebar for issue and merge request pages
|
||||||
|
- Emoji picker improvements
|
||||||
|
- Suppress warning about missing `.gitlab-ci.yml` if builds are disabled
|
||||||
|
- Do not show build status unless builds are enabled and `.gitlab-ci.yml` is present
|
||||||
|
- Persist runners registration token in database
|
||||||
|
- Fix online editor should not remove newlines at the end of the file
|
||||||
|
|
||||||
|
v 8.2.3
|
||||||
|
- Fix application settings cache not expiring after changes (Stan Hu)
|
||||||
|
- Fix Error 500s when creating global milestones with Unicode characters (Stan Hu)
|
||||||
|
- Update documentation for "Guest" permissions
|
||||||
|
- Properly convert Emoji-only comments into Award Emojis
|
||||||
|
- Enable devise paranoid mode to prevent user enumeration attack
|
||||||
|
- Webhook payload has an added, modified and removed properties for each commit
|
||||||
|
- Fix 500 error when creating a merge request that removes a submodule
|
||||||
|
|
||||||
|
v 8.2.2
|
||||||
|
- Fix 404 in redirection after removing a project (Stan Hu)
|
||||||
|
- Ensure cached application settings are refreshed at startup (Stan Hu)
|
||||||
|
- Fix Error 500 when viewing user's personal projects from admin page (Stan Hu)
|
||||||
|
- Fix: Raw private snippets access workflow
|
||||||
|
- Prevent "413 Request entity too large" errors when pushing large files with LFS
|
||||||
|
- Fix: As an admin, cannot add oneself as a member to a group/project
|
||||||
|
- Fix invalid links within projects dashboard header
|
||||||
|
- Make current user the first user in assignee dropdown in issues detail page (Stan Hu)
|
||||||
|
- Fix: duplicate email notifications on issue comments
|
||||||
|
|
||||||
v 8.2.1
|
v 8.2.1
|
||||||
- Forcefully update builds that didn't want to update with state machine
|
- Forcefully update builds that didn't want to update with state machine
|
||||||
- Fix: saving GitLabCiService as Admin Template
|
- Fix: saving GitLabCiService as Admin Template
|
||||||
|
@ -9,7 +92,7 @@ v 8.2.0
|
||||||
- Improved performance of rendering user profile pages and Atom feeds
|
- Improved performance of rendering user profile pages and Atom feeds
|
||||||
- Expose build artifacts path as config option
|
- Expose build artifacts path as config option
|
||||||
- Fix grouping of contributors by email in graph.
|
- Fix grouping of contributors by email in graph.
|
||||||
- Remove CSS property preventing hard tabs from rendering in Chromium 45 (Stan Hu)
|
- Improved performance of finding issues with/without labels
|
||||||
- Fix Drone CI service template not saving properly (Stan Hu)
|
- Fix Drone CI service template not saving properly (Stan Hu)
|
||||||
- Fix avatars not showing in Atom feeds and project issues when Gravatar disabled (Stan Hu)
|
- Fix avatars not showing in Atom feeds and project issues when Gravatar disabled (Stan Hu)
|
||||||
- Added a GitLab specific profiling tool called "Sherlock" (see GitLab CE merge request #1749)
|
- Added a GitLab specific profiling tool called "Sherlock" (see GitLab CE merge request #1749)
|
||||||
|
@ -48,7 +131,6 @@ v 8.2.0
|
||||||
- Add email notification to former assignee upon unassignment (Adam Lieskovský)
|
- Add email notification to former assignee upon unassignment (Adam Lieskovský)
|
||||||
- New design for project graphs page
|
- New design for project graphs page
|
||||||
- Remove deprecated dumped yaml file generated from previous job definitions
|
- Remove deprecated dumped yaml file generated from previous job definitions
|
||||||
- Fix incoming email config defaults
|
|
||||||
- Show specific runners from projects where user is master or owner
|
- Show specific runners from projects where user is master or owner
|
||||||
- MR target branch is now visible on a list view when it is different from project's default one
|
- MR target branch is now visible on a list view when it is different from project's default one
|
||||||
- Improve Continuous Integration graphs page
|
- Improve Continuous Integration graphs page
|
||||||
|
@ -131,7 +213,6 @@ v 8.1.0
|
||||||
- Show CI status on Your projects page and Starred projects page
|
- Show CI status on Your projects page and Starred projects page
|
||||||
- Remove "Continuous Integration" page from dashboard
|
- Remove "Continuous Integration" page from dashboard
|
||||||
- Add notes and SSL verification entries to hook APIs (Ben Boeckel)
|
- Add notes and SSL verification entries to hook APIs (Ben Boeckel)
|
||||||
- Added build artifacts
|
|
||||||
- Fix grammar in admin area "labels" .nothing-here-block when no labels exist.
|
- Fix grammar in admin area "labels" .nothing-here-block when no labels exist.
|
||||||
- Move CI runners page to project settings area
|
- Move CI runners page to project settings area
|
||||||
- Move CI variables page to project settings area
|
- Move CI variables page to project settings area
|
||||||
|
@ -207,7 +288,6 @@ v 8.0.2
|
||||||
- Allow AWS S3 Server-Side Encryption with Amazon S3-Managed Keys for backups (Paul Beattie)
|
- Allow AWS S3 Server-Side Encryption with Amazon S3-Managed Keys for backups (Paul Beattie)
|
||||||
|
|
||||||
v 8.0.1
|
v 8.0.1
|
||||||
- Remove git refs used internally by GitLab from network graph (Stan Hu)
|
|
||||||
- Improve CI migration procedure and documentation
|
- Improve CI migration procedure and documentation
|
||||||
|
|
||||||
v 8.0.0
|
v 8.0.0
|
||||||
|
|
356
CONTRIBUTING.md
356
CONTRIBUTING.md
|
@ -1,105 +1,245 @@
|
||||||
# Contribute to GitLab
|
# Contribute to GitLab
|
||||||
|
|
||||||
Thank you for your interest in contributing to GitLab.
|
Thank you for your interest in contributing to GitLab. This guide details how
|
||||||
This guide details how contribute to GitLab in a way that is efficient for everyone.
|
to contribute to GitLab in a way that is efficient for everyone.
|
||||||
If you have read this guide and want to know how the GitLab core-team operates please see [the GitLab contributing process](PROCESS.md).
|
|
||||||
|
GitLab comes into two flavors, GitLab Community Edition (CE) our free and open
|
||||||
|
source edition, and GitLab Enterprise Edition (EE) which is our commercial
|
||||||
|
edition. Throughout this guide you will see references to CE and EE for
|
||||||
|
abbreviation.
|
||||||
|
|
||||||
|
If you have read this guide and want to know how the GitLab [core-team][]
|
||||||
|
operates please see [the GitLab contributing process](PROCESS.md).
|
||||||
|
|
||||||
## Contributor license agreement
|
## Contributor license agreement
|
||||||
|
|
||||||
By submitting code as an individual you agree to the [individual contributor license agreement](doc/legal/individual_contributor_license_agreement.md). By submitting code as an entity you agree to the [corporate contributor license agreement](doc/legal/corporate_contributor_license_agreement.md).
|
By submitting code as an individual you agree to the
|
||||||
|
[individual contributor license agreement](doc/legal/individual_contributor_license_agreement.md).
|
||||||
|
By submitting code as an entity you agree to the
|
||||||
|
[corporate contributor license agreement](doc/legal/corporate_contributor_license_agreement.md).
|
||||||
|
|
||||||
## Security vulnerability disclosure
|
## Security vulnerability disclosure
|
||||||
|
|
||||||
Please report suspected security vulnerabilities in private to support@gitlab.com, also see the [disclosure section on the GitLab.com website](https://about.gitlab.com/disclosure/). Please do NOT create publicly viewable issues for suspected security vulnerabilities.
|
Please report suspected security vulnerabilities in private to
|
||||||
|
`support@gitlab.com`, also see the
|
||||||
|
[disclosure section on the GitLab.com website](https://about.gitlab.com/disclosure/).
|
||||||
|
Please do **NOT** create publicly viewable issues for suspected security
|
||||||
|
vulnerabilities.
|
||||||
|
|
||||||
## Closing policy for issues and merge requests
|
## Closing policy for issues and merge requests
|
||||||
|
|
||||||
GitLab is a popular open source project and the capacity to deal with issues and merge requests is limited. Out of respect for our volunteers, issues and merge requests not in line with the guidelines listed in this document may be closed without notice.
|
GitLab is a popular open source project and the capacity to deal with issues
|
||||||
|
and merge requests is limited. Out of respect for our volunteers, issues and
|
||||||
|
merge requests not in line with the guidelines listed in this document may be
|
||||||
|
closed without notice.
|
||||||
|
|
||||||
Please treat our volunteers with courtesy and respect, it will go a long way towards getting your issue resolved.
|
Please treat our volunteers with courtesy and respect, it will go a long way
|
||||||
|
towards getting your issue resolved.
|
||||||
|
|
||||||
Issues and merge requests should be in English and contain appropriate language for audiences of all ages.
|
Issues and merge requests should be in English and contain appropriate language
|
||||||
|
for audiences of all ages.
|
||||||
|
|
||||||
## Helping others
|
## Helping others
|
||||||
|
|
||||||
Please help other GitLab users when you can.
|
Please help other GitLab users when you can. The channels people will reach out
|
||||||
The channnels people will reach out on can be found on the [getting help page](https://about.gitlab.com/getting-help/).
|
on can be found on the [getting help page][].
|
||||||
Sign up for the mailinglist, answer GitLab questions on StackOverflow or respond in the irc channel.
|
|
||||||
You can also sign up on [CodeTriage](http://www.codetriage.com/gitlabhq/gitlabhq) to help with one issue every day.
|
Sign up for the mailing list, answer GitLab questions on StackOverflow or
|
||||||
|
respond in the IRC channel. You can also sign up on [CodeTriage][] to help with
|
||||||
|
the remaining issues on the GitHub issue tracker.
|
||||||
|
|
||||||
|
## I want to contribute!
|
||||||
|
|
||||||
|
If you want to contribute to GitLab, but are not sure where to start,
|
||||||
|
look for [issues with the label `up-for-grabs`][up-for-grabs]. These issues
|
||||||
|
will be of reasonable size and challenge, for anyone to start contributing to
|
||||||
|
GitLab.
|
||||||
|
|
||||||
|
This was inspired by [an article by Kent C. Dodds][medium-up-for-grabs].
|
||||||
|
|
||||||
## Issue tracker
|
## Issue tracker
|
||||||
|
|
||||||
To get support for your particular problem please use the [getting help channels](https://about.gitlab.com/getting-help/).
|
To get support for your particular problem please use the
|
||||||
|
[getting help channels](https://about.gitlab.com/getting-help/).
|
||||||
|
|
||||||
The [GitLab CE issue tracker on GitLab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues) is only for obvious errors in the latest [stable or development release of GitLab](MAINTENANCE.md). If something is wrong but it is not a regression compared to older versions of GitLab please do not open an issue but a feature request. When submitting an issue please conform to the issue submission guidelines listed below. Not all issues will be addressed and your issue is more likely to be addressed if you submit a merge request which partially or fully addresses the issue.
|
The [GitLab CE issue tracker on GitLab.com][ce-tracker] is for bugs concerning
|
||||||
|
the latest GitLab release and [feature proposals](#feature-proposals).
|
||||||
|
|
||||||
Do not use the issue tracker for feature requests. We have a specific [feature request forum](http://feedback.gitlab.com) for this purpose. Please keep feature requests as small and simple as possible, complex ones might be edited to make them small and simple.
|
When submitting an issue please conform to the issue submission guidelines
|
||||||
|
listed below. Not all issues will be addressed and your issue is more likely to
|
||||||
|
be addressed if you submit a merge request which partially or fully solves
|
||||||
|
the issue.
|
||||||
|
|
||||||
Please send a merge request with a tested solution or a merge request with a failing test instead of opening an issue if you can. If you're unsure where to post, post to the [mailing list](https://groups.google.com/forum/#!forum/gitlabhq) or [Stack Overflow](https://stackoverflow.com/questions/tagged/gitlab) first. There are a lot of helpful GitLab users there who may be able to help you quickly. If your particular issue turns out to be a bug, it will find its way from there.
|
If you're unsure where to post, post to the [mailing list][google-group] or
|
||||||
|
[Stack Overflow][stackoverflow] first. There are a lot of helpful GitLab users
|
||||||
|
there who may be able to help you quickly. If your particular issue turns out
|
||||||
|
to be a bug, it will find its way from there.
|
||||||
|
|
||||||
|
If it happens that you know the solution to an existing bug, please first
|
||||||
|
open the issue in order to keep track of it and then open the relevant merge
|
||||||
|
request that potentially fixes it.
|
||||||
|
|
||||||
|
### Feature proposals
|
||||||
|
|
||||||
|
To create a feature proposal for CE and CI, open an issue on the
|
||||||
|
[issue tracker of CE][ce-tracker].
|
||||||
|
|
||||||
|
For feature proposals for EE, open an issue on the
|
||||||
|
[issue tracker of EE][ee-tracker].
|
||||||
|
|
||||||
|
In order to help track the feature proposals, we have created a
|
||||||
|
[`feature proposal`][fpl] label. For the time being, users that are not members
|
||||||
|
of the project cannot add labels. You can instead ask one of the [core team][]
|
||||||
|
members to add the label `feature proposal` to the issue.
|
||||||
|
|
||||||
|
Please keep feature proposals as small and simple as possible, complex ones
|
||||||
|
might be edited to make them small and simple.
|
||||||
|
|
||||||
|
For changes in the interface, it can be helpful to create a mockup first.
|
||||||
|
If you want to create something yourself, consider opening an issue first to
|
||||||
|
discuss whether it is interesting to include this in GitLab.
|
||||||
|
|
||||||
### Issue tracker guidelines
|
### Issue tracker guidelines
|
||||||
|
|
||||||
**[Search the issues](https://gitlab.com/gitlab-org/gitlab-ce/issues)** for similar entries before submitting your own, there's a good chance somebody else had the same issue. Show your support with `:+1:` and/or join the discussion. Please submit issues in the following format (as the first post):
|
**[Search the issue tracker][ce-tracker]** for similar entries before
|
||||||
|
submitting your own, there's a good chance somebody else had the same issue or
|
||||||
|
feature proposal. Show your support with an award emoji and/or join the
|
||||||
|
discussion.
|
||||||
|
|
||||||
1. **Summary:** Summarize your issue in one sentence (what goes wrong, what did you expect to happen)
|
Please submit bugs using the following template in the issue description area.
|
||||||
1. **Steps to reproduce:** How can we reproduce the issue
|
The text in the parenthesis is there to help you with what to include. Omit it
|
||||||
1. **Expected behavior:** Describe your issue in detail
|
when submitting the actual issue. You can copy-paste it and then edit as you
|
||||||
1. **Observed behavior**
|
see fit.
|
||||||
1. **Relevant logs and/or screenshots:** Please use code blocks (\`\`\`) to format console output, logs, and code as it's very hard to read otherwise.
|
|
||||||
1. **Output of checks**
|
```
|
||||||
* Results of GitLab [Application Check](doc/install/installation.md#check-application-status) (`sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production SANITIZE=true`); we will only investigate if the tests are passing
|
## Summary
|
||||||
* Version of GitLab you are running; we will only investigate issues in the latest stable and development releases as per the [maintenance policy](MAINTENANCE.md)
|
|
||||||
* Add the last commit SHA-1 of the GitLab version you used to replicate the issue (obtainable from the help page)
|
(Summarize your issue in one sentence - what goes wrong, what did you expect to happen)
|
||||||
* Describe your setup (use relevant parts from `sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production`)
|
|
||||||
1. **Possible fixes**: If you can, link to the line of code that might be responsible for the problem
|
## Steps to reproduce
|
||||||
|
|
||||||
|
(How one can reproduce the issue - this is very important)
|
||||||
|
|
||||||
|
## Expected behavior
|
||||||
|
|
||||||
|
(What you should see instead)
|
||||||
|
|
||||||
|
## Relevant logs and/or screenshots
|
||||||
|
|
||||||
|
(Paste any relevant logs - please use code blocks (```) to format console output,
|
||||||
|
logs, and code as it's very hard to read otherwise.)
|
||||||
|
|
||||||
|
## Output of checks
|
||||||
|
|
||||||
|
### Results of GitLab Application Check
|
||||||
|
|
||||||
|
(For installations with omnibus-gitlab package run and paste the output of:
|
||||||
|
sudo gitlab-rake gitlab:check SANITIZE=true)
|
||||||
|
|
||||||
|
(For installations from source run and paste the output of:
|
||||||
|
sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production SANITIZE=true)
|
||||||
|
|
||||||
|
(we will only investigate if the tests are passing)
|
||||||
|
|
||||||
|
### Results of GitLab Environment Info
|
||||||
|
|
||||||
|
(For installations with omnibus-gitlab package run and paste the output of:
|
||||||
|
sudo gitlab-rake gitlab:env:info)
|
||||||
|
|
||||||
|
(For installations from source run and paste the output of:
|
||||||
|
sudo -u git -H bundle exec rake gitlab:env:info)
|
||||||
|
|
||||||
|
## Possible fixes
|
||||||
|
|
||||||
|
(If you can, link to the line of code that might be responsible for the problem)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
## Merge requests
|
## Merge requests
|
||||||
|
|
||||||
We welcome merge requests with fixes and improvements to GitLab code, tests, and/or documentation. The features we would really like a merge request for are listed with the [status 'accepting merge requests' on our feature request forum](http://feedback.gitlab.com/forums/176466-general/status/796455) but other improvements are also welcome. If you want to add a new feature that is not marked it is best to first create a feedback issue (if there isn't one already) and leave a comment asking for it to be marked accepting merge requests. Please include screenshots or wireframes if the feature will also change the UI.
|
We welcome merge requests with fixes and improvements to GitLab code, tests,
|
||||||
|
and/or documentation. The features we would really like a merge request for are
|
||||||
|
listed with the label [`Accepting Merge Requests` on our issue tracker for CE][accepting-mrs-ce]
|
||||||
|
and [EE][accepting-mrs-ee] but other improvements are also welcome.
|
||||||
|
|
||||||
Merge requests can be filed either at [gitlab.com](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests) or [github.com](https://github.com/gitlabhq/gitlabhq/pulls).
|
If you want to add a new feature that is not labeled it is best to first create
|
||||||
|
a feedback issue (if there isn't one already) and leave a comment asking for it
|
||||||
|
to be marked as `Accepting merge requests`. Please include screenshots or
|
||||||
|
wireframes if the feature will also change the UI.
|
||||||
|
|
||||||
If you are new to GitLab development (or web development in general), search for the label `easyfix` ([gitlab.com](https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=easyfix), [github](https://github.com/gitlabhq/gitlabhq/labels/easyfix)). Those are issues easy to fix, marked by the GitLab core-team. If you are unsure how to proceed but want to help, mention one of the core-team members to give you a hint.
|
Merge requests can be filed either at [GitLab.com][gitlab-mr-tracker] or at
|
||||||
|
[github.com][github-mr-tracker].
|
||||||
|
|
||||||
To start with GitLab download the [GitLab Development Kit](https://gitlab.com/gitlab-org/gitlab-development-kit) and see [Development section](doc/development/README.md) in the help file.
|
If you are new to GitLab development (or web development in general), see the
|
||||||
|
[I want to contribute!](#i-want-to-contribute) section to get you started with
|
||||||
|
some potentially easy issues.
|
||||||
|
|
||||||
|
To start with GitLab development download the [GitLab Development Kit][gdk] and
|
||||||
|
see the [Development section](doc/development/README.md) for some guidelines.
|
||||||
|
|
||||||
### Merge request guidelines
|
### Merge request guidelines
|
||||||
|
|
||||||
If you can, please submit a merge request with the fix or improvements including tests. If you don't know how to fix the issue but can write a test that exposes the issue we will accept that as well. In general bug fixes that include a regression test are merged quickly while new features without proper tests are least likely to receive timely feedback. The workflow to make a merge request is as follows:
|
If you can, please submit a merge request with the fix or improvements
|
||||||
|
including tests. If you don't know how to fix the issue but can write a test
|
||||||
|
that exposes the issue we will accept that as well. In general bug fixes that
|
||||||
|
include a regression test are merged quickly while new features without proper
|
||||||
|
tests are least likely to receive timely feedback. The workflow to make a merge
|
||||||
|
request is as follows:
|
||||||
|
|
||||||
1. Fork the project into your personal space on GitLab.com
|
1. Fork the project into your personal space on GitLab.com
|
||||||
1. Create a feature branch
|
1. Create a feature branch
|
||||||
1. Write [tests](https://gitlab.com/gitlab-org/gitlab-development-kit#running-the-tests) and code
|
1. Write [tests](https://gitlab.com/gitlab-org/gitlab-development-kit#running-the-tests) and code
|
||||||
1. Add your changes to the [CHANGELOG](CHANGELOG)
|
1. Add your changes to the [CHANGELOG](CHANGELOG)
|
||||||
1. If you are changing the README, some documentation or other things which have no effect on the tests, add `[ci skip]` somewhere in the commit message
|
1. If you are changing the README, some documentation or other things which
|
||||||
1. If you have multiple commits please combine them into one commit by [squashing them](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)
|
have no effect on the tests, add `[ci skip]` somewhere in the commit message
|
||||||
1. Push the commit to your fork
|
1. If you have multiple commits please combine them into one commit by
|
||||||
|
[squashing them][git-squash]
|
||||||
|
1. Push the commit(s) to your fork
|
||||||
1. Submit a merge request (MR) to the master branch
|
1. Submit a merge request (MR) to the master branch
|
||||||
1. The MR title should describe the change you want to make
|
1. The MR title should describe the change you want to make
|
||||||
1. The MR description should give a motive for your change and the method you used to achieve it
|
1. The MR description should give a motive for your change and the method you
|
||||||
|
used to achieve it
|
||||||
1. If the MR changes the UI it should include before and after screenshots
|
1. If the MR changes the UI it should include before and after screenshots
|
||||||
1. If the MR changes CSS classes please include the list of affected pages `grep css-class ./app -R`
|
1. If the MR changes CSS classes please include the list of affected pages
|
||||||
1. Link relevant [issues](https://gitlab.com/gitlab-org/gitlab-ce/issues) and/or [feature requests](http://feedback.gitlab.com/) from the merge request description and leave a comment on them with a link back to the MR
|
`grep css-class ./app -R`
|
||||||
1. Be prepared to answer questions and incorporate feedback even if requests for this arrive weeks or months after your MR submission
|
1. Link any relevant [issues][ce-tracker] in the merge request description and
|
||||||
1. If your MR touches code that executes shell commands, make sure it adheres to the [shell command guidelines]( doc/development/shell_commands.md).
|
leave a comment on them with a link back to the MR
|
||||||
1. Also have a look at the [shell command guidelines](doc/development/shell_commands.md) if your code reads or opens files, or handles paths to files on disk.
|
1. Be prepared to answer questions and incorporate feedback even if requests
|
||||||
1. If your code creates new files on disk please read the [shared files guidelines](doc/development/shared_files.md).
|
for this arrive weeks or months after your MR submission
|
||||||
|
1. If your MR touches code that executes shell commands, reads or opens files or
|
||||||
|
handles paths to files on disk, make sure it adheres to the
|
||||||
|
[shell command guidelines](doc/development/shell_commands.md)
|
||||||
|
1. If your code creates new files on disk please read the
|
||||||
|
[shared files guidelines](doc/development/shared_files.md).
|
||||||
|
|
||||||
The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. The best time to submit a MR and get feedback fast.
|
The **official merge window** is in the beginning of the month from the 1st to
|
||||||
Before this time the GitLab B.V. team is still dealing with work that is created by the monthly release such as regressions requiring patch releases.
|
the 7th day of the month. This is the best time to submit an MR and get
|
||||||
After the 7th it is already getting closer to the release date of the next version. This means there is less time to fix the issues created by merging large new features.
|
feedback fast. Before this time the GitLab Inc. team is still dealing with work
|
||||||
|
that is created by the monthly release such as regressions requiring patch
|
||||||
|
releases. After the 7th it is already getting closer to the release date of the
|
||||||
|
next version. This means there is less time to fix the issues created by
|
||||||
|
merging large new features.
|
||||||
|
|
||||||
Please keep the change in a single MR **as small as possible**. If you want to contribute a large feature think very hard what the minimum viable change is. Can you split functionality? Can you only submit the backend/API code? Can you start with a very simple UI? Can you do part of the refactor? The increased reviewability of small MR's that leads to higher code quality is more important to us than having a minimal commit log. The smaller a MR is the more likely it is it will be merged (quickly), after that you can send more MR's to enhance it.
|
Please keep the change in a single MR **as small as possible**. If you want to
|
||||||
|
contribute a large feature think very hard what the minimum viable change is.
|
||||||
|
Can you split the functionality? Can you only submit the backend/API code? Can
|
||||||
|
you start with a very simple UI? Can you do part of the refactor? The increased
|
||||||
|
reviewability of small MRs that leads to higher code quality is more important
|
||||||
|
to us than having a minimal commit log. The smaller an MR is the more likely it
|
||||||
|
is it will be merged (quickly). After that you can send more MRs to enhance it.
|
||||||
|
|
||||||
For examples of feedback on merge requests please look at already [closed merge requests](https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed). If you would like quick feedback on your merge request feel free to mention one of the Merge Marshalls of [the core-team](https://about.gitlab.com/core-team/). Please ensure that your merge request meets the contribution acceptance criteria.
|
For examples of feedback on merge requests please look at already
|
||||||
|
[closed merge requests][]. If you would like quick feedback on your merge
|
||||||
|
request feel free to mention one of the Merge Marshalls of the [core team][].
|
||||||
|
Please ensure that your merge request meets the contribution acceptance criteria.
|
||||||
|
|
||||||
## Definition of done
|
## Definition of done
|
||||||
|
|
||||||
If you contribute to GitLab please know that changes involve more than just code.
|
If you contribute to GitLab please know that changes involve more than just
|
||||||
We have the following [definition of done](http://guide.agilealliance.org/guide/definition-of-done.html).
|
code. We have the following [definition of done][]. Please ensure you support
|
||||||
Please ensure you support the feature you contribute through all of these steps.
|
the feature you contribute through all of these steps.
|
||||||
|
|
||||||
1. Description explaning the relevancy (see following item)
|
1. Description explaining the relevancy (see following item)
|
||||||
1. Working and clean code that is commented where needed
|
1. Working and clean code that is commented where needed
|
||||||
1. Unit and integration tests that pass on the CI server
|
1. Unit and integration tests that pass on the CI server
|
||||||
1. Documented in the /doc directory
|
1. Documented in the /doc directory
|
||||||
|
@ -111,14 +251,16 @@ Please ensure you support the feature you contribute through all of these steps.
|
||||||
1. Community questions answered
|
1. Community questions answered
|
||||||
1. Answers to questions radiated (in docs/wiki/etc.)
|
1. Answers to questions radiated (in docs/wiki/etc.)
|
||||||
|
|
||||||
If you add a dependency in GitLab (such as an operating system package) please consider updating the following and note the applicability of each in your merge request:
|
If you add a dependency in GitLab (such as an operating system package) please
|
||||||
|
consider updating the following and note the applicability of each in your
|
||||||
|
merge request:
|
||||||
|
|
||||||
1. Note the addition in the release blog post (create one if it doesn't exist yet) https://gitlab.com/gitlab-com/www-gitlab-com/merge_requests/
|
1. Note the addition in the release blog post (create one if it doesn't exist yet) https://gitlab.com/gitlab-com/www-gitlab-com/merge_requests/
|
||||||
1. Upgrade guide, for example https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/7.5-to-7.6.md
|
1. Upgrade guide, for example https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/7.5-to-7.6.md
|
||||||
1. Upgrader https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/upgrader.md#2-run-gitlab-upgrade-tool
|
1. Upgrader https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/upgrader.md#2-run-gitlab-upgrade-tool
|
||||||
1. Installation guide https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#1-packages-dependencies
|
1. Installation guide https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md#1-packages-dependencies
|
||||||
1. GitLab Development Kit https://gitlab.com/gitlab-org/gitlab-development-kit
|
1. GitLab Development Kit https://gitlab.com/gitlab-org/gitlab-development-kit
|
||||||
1. Test suite https://gitlab.com/gitlab-org/gitlab-ci/blob/master/doc/examples/configure_a_runner_to_run_the_gitlab_ce_test_suite.md
|
1. Test suite https://gitlab.com/gitlab-org/gitlab-ce/blob/master/scripts/prepare_build.sh
|
||||||
1. Omnibus package creator https://gitlab.com/gitlab-org/omnibus-gitlab
|
1. Omnibus package creator https://gitlab.com/gitlab-org/omnibus-gitlab
|
||||||
|
|
||||||
## Merge request description format
|
## Merge request description format
|
||||||
|
@ -126,59 +268,111 @@ If you add a dependency in GitLab (such as an operating system package) please c
|
||||||
1. What does this MR do?
|
1. What does this MR do?
|
||||||
1. Are there points in the code the reviewer needs to double check?
|
1. Are there points in the code the reviewer needs to double check?
|
||||||
1. Why was this MR needed?
|
1. Why was this MR needed?
|
||||||
1. What are the relevant issue numbers / [Feature requests](http://feedback.gitlab.com/)?
|
1. What are the relevant issue numbers?
|
||||||
1. Screenshots (if relevant)
|
1. Screenshots (if relevant)
|
||||||
|
|
||||||
## Contribution acceptance criteria
|
## Contribution acceptance criteria
|
||||||
|
|
||||||
1. The change is as small as possible (see the above paragraph for details)
|
1. The change is as small as possible (see the above paragraph for details)
|
||||||
1. Include proper tests and make all tests pass (unless it contains a test exposing a bug in existing code)
|
1. Include proper tests and make all tests pass (unless it contains a test
|
||||||
1. All tests have to pass, if you suspect a failing CI build is unrelated to your contribution ask for tests to be restarted. See [the CI setup document](http://doc.gitlab.com/ce/development/ci_setup.html) on who you can ask for test restart.
|
exposing a bug in existing code)
|
||||||
1. Initially contains a single commit (please use `git rebase -i` to squash commits)
|
1. If you suspect a failing CI build is unrelated to your contribution, you may
|
||||||
1. Can merge without problems (if not please merge `master`, never rebase commits pushed to the remote server)
|
try and restart the failing CI job or ask a developer to fix the
|
||||||
|
aforementioned failing test
|
||||||
|
1. Your MR initially contains a single commit (please use `git rebase -i` to
|
||||||
|
squash commits)
|
||||||
|
1. Your changes can merge without problems (if not please merge `master`, never
|
||||||
|
rebase commits pushed to the remote server)
|
||||||
1. Does not break any existing functionality
|
1. Does not break any existing functionality
|
||||||
1. Fixes one specific issue or implements one specific feature (do not combine things, send separate merge requests if needed)
|
1. Fixes one specific issue or implements one specific feature (do not combine
|
||||||
1. Migrations should do only one thing (eg: either create a table, move data to a new table or remove an old table) to aid retrying on failure
|
things, send separate merge requests if needed)
|
||||||
|
1. Migrations should do only one thing (eg: either create a table, move data to
|
||||||
|
a new table or remove an old table) to aid retrying on failure
|
||||||
1. Keeps the GitLab code base clean and well structured
|
1. Keeps the GitLab code base clean and well structured
|
||||||
1. Contains functionality we think other users will benefit from too
|
1. Contains functionality we think other users will benefit from too
|
||||||
1. Doesn't add configuration options since they complicate future changes
|
1. Doesn't add configuration options since they complicate future changes
|
||||||
1. Changes after submitting the merge request should be in separate commits (no squashing). You will be asked to squash when the review is over, before merging.
|
1. Changes after submitting the merge request should be in separate commits
|
||||||
1. It conforms to the following style guides.
|
(no squashing). If necessary, you will be asked to squash when the review is
|
||||||
If your change touches a line that does not follow the style,
|
over, before merging.
|
||||||
modify the entire line to follow it. This prevents linting tools from generating warnings.
|
1. It conforms to the following style guides:
|
||||||
Don't touch neighbouring lines. As an exception, automatic mass refactoring modifications
|
* If your change touches a line that does not follow the style, modify the
|
||||||
may leave style non-compliant.
|
entire line to follow it. This prevents linting tools from generating warnings.
|
||||||
|
* Don't touch neighbouring lines. As an exception, automatic mass
|
||||||
|
refactoring modifications may leave style non-compliant.
|
||||||
|
|
||||||
## Style guides
|
## Style guides
|
||||||
|
|
||||||
1. [Ruby](https://github.com/bbatsov/ruby-style-guide).
|
1. [Ruby](https://github.com/bbatsov/ruby-style-guide).
|
||||||
Important sections include [Source Code Layout](https://github.com/bbatsov/ruby-style-guide#source-code-layout)
|
Important sections include [Source Code Layout][rss-source] and
|
||||||
and [Naming](https://github.com/bbatsov/ruby-style-guide#naming). Use:
|
[Naming][rss-naming]. Use:
|
||||||
- multi-line method chaining style **Option B**: dot `.` on previous line
|
- multi-line method chaining style **Option B**: dot `.` on previous line
|
||||||
- string literal quoting style **Option A**: single quoted by default
|
- string literal quoting style **Option A**: single quoted by default
|
||||||
1. [Rails](https://github.com/bbatsov/rails-style-guide)
|
1. [Rails](https://github.com/bbatsov/rails-style-guide)
|
||||||
1. [Testing](https://github.com/thoughtbot/guides/tree/master/style#testing)
|
1. [Testing](https://github.com/thoughtbot/guides/tree/master/style/testing)
|
||||||
1. [CoffeeScript](https://github.com/thoughtbot/guides/tree/master/style#coffeescript)
|
1. [CoffeeScript](https://github.com/thoughtbot/guides/tree/master/style/coffeescript)
|
||||||
1. [Shell commands](doc/development/shell_commands.md) created by GitLab contributors to enhance security
|
1. [Shell commands](doc/development/shell_commands.md) created by GitLab
|
||||||
|
contributors to enhance security
|
||||||
1. [Markdown](http://www.cirosantilli.com/markdown-styleguide)
|
1. [Markdown](http://www.cirosantilli.com/markdown-styleguide)
|
||||||
1. [Database Migrations](doc/development/migration_style_guide.md)
|
1. [Database Migrations](doc/development/migration_style_guide.md)
|
||||||
1. [Documentation styleguide](doc_styleguide.md)
|
1. [Documentation styleguide](doc_styleguide.md)
|
||||||
1. Interface text should be written subjectively instead of objectively. It should be the gitlab core team addressing a person. It should be written in present time and never use past tense (has been/was). For example instead of "prohibited this user from being saved due to the following errors:" the text should be "sorry, we could not create your account because:". Also these [excellent writing guidelines](https://github.com/NARKOZ/guides#writing).
|
1. Interface text should be written subjectively instead of objectively. It
|
||||||
|
should be the GitLab core team addressing a person. It should be written in
|
||||||
|
present time and never use past tense (has been/was). For example instead
|
||||||
|
of _prohibited this user from being saved due to the following errors:_ the
|
||||||
|
text should be _sorry, we could not create your account because:_
|
||||||
|
|
||||||
This is also the style used by linting tools such as [RuboCop](https://github.com/bbatsov/rubocop), [PullReview](https://www.pullreview.com/) and [Hound CI](https://houndci.com).
|
This is also the style used by linting tools such as
|
||||||
|
[RuboCop](https://github.com/bbatsov/rubocop),
|
||||||
|
[PullReview](https://www.pullreview.com/) and [Hound CI](https://houndci.com).
|
||||||
|
|
||||||
## Code of conduct
|
## Code of conduct
|
||||||
|
|
||||||
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
As contributors and maintainers of this project, we pledge to respect all
|
||||||
|
people who contribute through reporting issues, posting feature requests,
|
||||||
|
updating documentation, submitting pull requests or patches, and other
|
||||||
|
activities.
|
||||||
|
|
||||||
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
|
We are committed to making participation in this project a harassment-free
|
||||||
|
experience for everyone, regardless of level of experience, gender, gender
|
||||||
|
identity and expression, sexual orientation, disability, personal appearance,
|
||||||
|
body size, race, ethnicity, age, or religion.
|
||||||
|
|
||||||
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
Examples of unacceptable behavior by participants include the use of sexual
|
||||||
|
language or imagery, derogatory comments or personal attacks, trolling, public
|
||||||
|
or private harassment, insults, or other unprofessional conduct.
|
||||||
|
|
||||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
Project maintainers have the right and responsibility to remove, edit, or
|
||||||
|
reject comments, commits, code, wiki edits, issues, and other contributions
|
||||||
|
that are not aligned to this Code of Conduct. Project maintainers who do not
|
||||||
|
follow the Code of Conduct may be removed from the project team.
|
||||||
|
|
||||||
This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
|
This code of conduct applies both within project spaces and in public spaces
|
||||||
|
when an individual is representing the project or its community.
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior can be reported by emailing contact@gitlab.com
|
Instances of abusive, harassing, or otherwise unacceptable behavior can be
|
||||||
|
reported by emailing `contact@gitlab.com`.
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.1.0, available at [http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/)
|
This Code of Conduct is adapted from the [Contributor Covenant][], version 1.1.0,
|
||||||
|
available at [http://contributor-covenant.org/version/1/1/0/](http://contributor-covenant.org/version/1/1/0/).
|
||||||
|
|
||||||
|
[core team]: https://about.gitlab.com/core-team/
|
||||||
|
[getting help page]: https://about.gitlab.com/getting-help/
|
||||||
|
[Codetriage]: http://www.codetriage.com/gitlabhq/gitlabhq
|
||||||
|
[up-for-grabs]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=up+for+grabs
|
||||||
|
[medium-up-for-grabs]: https://medium.com/@kentcdodds/first-timers-only-78281ea47455
|
||||||
|
[ce-tracker]: https://gitlab.com/gitlab-org/gitlab-ce/issues
|
||||||
|
[ee-tracker]: https://gitlab.com/gitlab-org/gitlab-ee/issues
|
||||||
|
[google-group]: https://groups.google.com/forum/#!forum/gitlabhq
|
||||||
|
[stackoverflow]: https://stackoverflow.com/questions/tagged/gitlab
|
||||||
|
[fpl]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=feature+proposal
|
||||||
|
[accepting-mrs-ce]: https://gitlab.com/gitlab-org/gitlab-ce/issues?label_name=Accepting+Merge+Requests
|
||||||
|
[accepting-mrs-ee]: https://gitlab.com/gitlab-org/gitlab-ee/issues?label_name=Accepting+Merge+Requests
|
||||||
|
[gitlab-mr-tracker]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests
|
||||||
|
[github-mr-tracker]: https://github.com/gitlabhq/gitlabhq/pulls
|
||||||
|
[gdk]: https://gitlab.com/gitlab-org/gitlab-development-kit
|
||||||
|
[git-squash]: https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits
|
||||||
|
[closed merge requests]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests?assignee_id=&label_name=&milestone_id=&scope=&sort=&state=closed
|
||||||
|
[definition of done]: http://guide.agilealliance.org/guide/definition-of-done.html
|
||||||
|
[Contributor Covenant]: http://contributor-covenant.org
|
||||||
|
[rss-source]: https://github.com/bbatsov/ruby-style-guide/blob/master/README.md#source-code-layout
|
||||||
|
[rss-naming]: https://github.com/bbatsov/ruby-style-guide/blob/master/README.md#naming
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2.6.8
|
2.6.9
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.4.2
|
0.5.1
|
||||||
|
|
53
Gemfile
53
Gemfile
|
@ -1,6 +1,10 @@
|
||||||
source "https://rubygems.org"
|
source "https://rubygems.org"
|
||||||
|
|
||||||
gem 'rails', '4.1.12'
|
gem 'rails', '4.2.4'
|
||||||
|
gem 'rails-deprecated_sanitizer', '~> 1.0.3'
|
||||||
|
|
||||||
|
# Responders respond_to and respond_with
|
||||||
|
gem 'responders', '~> 2.0'
|
||||||
|
|
||||||
# Specify a sprockets version due to security issue
|
# Specify a sprockets version due to security issue
|
||||||
# See https://groups.google.com/forum/#!topic/rubyonrails-security/doAVp0YaTqY
|
# See https://groups.google.com/forum/#!topic/rubyonrails-security/doAVp0YaTqY
|
||||||
|
@ -14,9 +18,9 @@ gem "mysql2", '~> 0.3.16', group: :mysql
|
||||||
gem "pg", '~> 0.18.2', group: :postgres
|
gem "pg", '~> 0.18.2', group: :postgres
|
||||||
|
|
||||||
# Authentication libraries
|
# Authentication libraries
|
||||||
gem 'devise', '~> 3.5.2'
|
gem 'devise', '~> 3.5.3'
|
||||||
gem 'devise-async', '~> 0.9.0'
|
gem 'devise-async', '~> 0.9.0'
|
||||||
gem 'doorkeeper', '~> 2.1.3'
|
gem 'doorkeeper', '~> 2.2.0'
|
||||||
gem 'omniauth', '~> 1.2.2'
|
gem 'omniauth', '~> 1.2.2'
|
||||||
gem 'omniauth-bitbucket', '~> 0.0.2'
|
gem 'omniauth-bitbucket', '~> 0.0.2'
|
||||||
gem 'omniauth-facebook', '~> 3.0.0'
|
gem 'omniauth-facebook', '~> 3.0.0'
|
||||||
|
@ -28,7 +32,7 @@ gem 'omniauth-saml', '~> 1.4.0'
|
||||||
gem 'omniauth-shibboleth', '~> 1.2.0'
|
gem 'omniauth-shibboleth', '~> 1.2.0'
|
||||||
gem 'omniauth-twitter', '~> 1.2.0'
|
gem 'omniauth-twitter', '~> 1.2.0'
|
||||||
gem 'omniauth_crowd'
|
gem 'omniauth_crowd'
|
||||||
gem 'rack-oauth2', '~> 1.0.5'
|
gem 'rack-oauth2', '~> 1.2.1'
|
||||||
|
|
||||||
# Two-factor authentication
|
# Two-factor authentication
|
||||||
gem 'devise-two-factor', '~> 2.0.0'
|
gem 'devise-two-factor', '~> 2.0.0'
|
||||||
|
@ -48,7 +52,7 @@ gem "gitlab_git", '~> 7.2.20'
|
||||||
gem 'gitlab_omniauth-ldap', '~> 1.2.1', require: "omniauth-ldap"
|
gem 'gitlab_omniauth-ldap', '~> 1.2.1', require: "omniauth-ldap"
|
||||||
|
|
||||||
# Git Wiki
|
# Git Wiki
|
||||||
gem 'gollum-lib', '~> 4.0.2'
|
gem 'gollum-lib', '~> 4.1.0'
|
||||||
|
|
||||||
# Language detection
|
# Language detection
|
||||||
gem "github-linguist", "~> 4.7.0", require: "linguist"
|
gem "github-linguist", "~> 4.7.0", require: "linguist"
|
||||||
|
@ -62,9 +66,6 @@ gem 'rack-cors', '~> 0.4.0', require: 'rack/cors'
|
||||||
# based on human-friendly examples
|
# based on human-friendly examples
|
||||||
gem "stamp", '~> 0.6.0'
|
gem "stamp", '~> 0.6.0'
|
||||||
|
|
||||||
# Enumeration fields
|
|
||||||
gem 'enumerize', '~> 0.7.0'
|
|
||||||
|
|
||||||
# Pagination
|
# Pagination
|
||||||
gem "kaminari", "~> 0.16.3"
|
gem "kaminari", "~> 0.16.3"
|
||||||
|
|
||||||
|
@ -95,9 +96,13 @@ gem 'redcarpet', '~> 3.3.3'
|
||||||
gem 'RedCloth', '~> 4.2.9'
|
gem 'RedCloth', '~> 4.2.9'
|
||||||
gem 'rdoc', '~>3.6'
|
gem 'rdoc', '~>3.6'
|
||||||
gem 'org-ruby', '~> 0.9.12'
|
gem 'org-ruby', '~> 0.9.12'
|
||||||
gem 'creole', '~>0.3.6'
|
gem 'creole', '~> 0.5.0'
|
||||||
gem 'wikicloth', '0.8.1'
|
gem 'wikicloth', '0.8.1'
|
||||||
gem 'asciidoctor', '~> 1.5.2'
|
gem 'asciidoctor', '~> 1.5.2'
|
||||||
|
gem 'rouge', '~> 1.10.1'
|
||||||
|
|
||||||
|
# See https://groups.google.com/forum/#!topic/ruby-security-ann/aSbgDiwb24s
|
||||||
|
gem 'nokogiri', '1.6.7.1'
|
||||||
|
|
||||||
# Diffs
|
# Diffs
|
||||||
gem 'diffy', '~> 3.0.3'
|
gem 'diffy', '~> 3.0.3'
|
||||||
|
@ -118,15 +123,15 @@ gem 'acts-as-taggable-on', '~> 3.4'
|
||||||
|
|
||||||
# Background jobs
|
# Background jobs
|
||||||
gem 'sinatra', '~> 1.4.4', require: nil
|
gem 'sinatra', '~> 1.4.4', require: nil
|
||||||
gem 'sidekiq', '3.3.0'
|
gem 'sidekiq', '~> 4.0'
|
||||||
gem 'sidetiq', '~> 0.6.3'
|
gem 'sidekiq-cron', '~> 0.4.0'
|
||||||
|
gem 'redis-namespace'
|
||||||
|
|
||||||
# HTTP requests
|
# HTTP requests
|
||||||
gem "httparty", '~> 0.13.3'
|
gem "httparty", '~> 0.13.3'
|
||||||
|
|
||||||
# Colored output to console
|
# Colored output to console
|
||||||
gem "colored", '~> 1.2'
|
gem "colorize", '~> 0.7.0'
|
||||||
gem "colorize", '~> 0.5.8'
|
|
||||||
|
|
||||||
# GitLab settings
|
# GitLab settings
|
||||||
gem 'settingslogic', '~> 2.0.9'
|
gem 'settingslogic', '~> 2.0.9'
|
||||||
|
@ -154,7 +159,7 @@ gem "gemnasium-gitlab-service", "~> 0.2"
|
||||||
gem "slack-notifier", "~> 1.2.0"
|
gem "slack-notifier", "~> 1.2.0"
|
||||||
|
|
||||||
# Asana integration
|
# Asana integration
|
||||||
gem 'asana', '~> 0.0.6'
|
gem 'asana', '~> 0.4.0'
|
||||||
|
|
||||||
# FogBugz integration
|
# FogBugz integration
|
||||||
gem 'ruby-fogbugz', '~> 0.2.1'
|
gem 'ruby-fogbugz', '~> 0.2.1'
|
||||||
|
@ -170,9 +175,10 @@ gem "underscore-rails", "~> 1.4.4"
|
||||||
|
|
||||||
# Sanitize user input
|
# Sanitize user input
|
||||||
gem "sanitize", '~> 2.0'
|
gem "sanitize", '~> 2.0'
|
||||||
|
gem 'babosa', '~> 1.0.2'
|
||||||
|
|
||||||
# Protect against bruteforcing
|
# Protect against bruteforcing
|
||||||
gem "rack-attack", '~> 4.3.0'
|
gem "rack-attack", '~> 4.3.1'
|
||||||
|
|
||||||
# Ace editor
|
# Ace editor
|
||||||
gem 'ace-rails-ap', '~> 2.0.1'
|
gem 'ace-rails-ap', '~> 2.0.1'
|
||||||
|
@ -187,13 +193,13 @@ gem "sass-rails", '~> 4.0.5'
|
||||||
gem "coffee-rails", '~> 4.1.0'
|
gem "coffee-rails", '~> 4.1.0'
|
||||||
gem "uglifier", '~> 2.7.2'
|
gem "uglifier", '~> 2.7.2'
|
||||||
gem 'turbolinks', '~> 2.5.0'
|
gem 'turbolinks', '~> 2.5.0'
|
||||||
gem 'jquery-turbolinks', '~> 2.0.1'
|
gem 'jquery-turbolinks', '~> 2.1.0'
|
||||||
|
|
||||||
gem 'addressable', '~> 2.3.8'
|
gem 'addressable', '~> 2.3.8'
|
||||||
gem 'bootstrap-sass', '~> 3.0'
|
gem 'bootstrap-sass', '~> 3.0'
|
||||||
gem 'font-awesome-rails', '~> 4.2'
|
gem 'font-awesome-rails', '~> 4.2'
|
||||||
gem 'gitlab_emoji', '~> 0.1'
|
gem 'gitlab_emoji', '~> 0.2.0'
|
||||||
gem 'gon', '~> 5.0.0'
|
gem 'gon', '~> 6.0.1'
|
||||||
gem 'jquery-atwho-rails', '~> 1.3.2'
|
gem 'jquery-atwho-rails', '~> 1.3.2'
|
||||||
gem 'jquery-rails', '~> 3.1.3'
|
gem 'jquery-rails', '~> 3.1.3'
|
||||||
gem 'jquery-scrollto-rails', '~> 1.4.3'
|
gem 'jquery-scrollto-rails', '~> 1.4.3'
|
||||||
|
@ -203,6 +209,7 @@ gem 'raphael-rails', '~> 2.1.2'
|
||||||
gem 'request_store', '~> 1.2.0'
|
gem 'request_store', '~> 1.2.0'
|
||||||
gem 'select2-rails', '~> 3.5.9'
|
gem 'select2-rails', '~> 3.5.9'
|
||||||
gem 'virtus', '~> 1.0.1'
|
gem 'virtus', '~> 1.0.1'
|
||||||
|
gem 'net-ssh', '~> 3.0.1'
|
||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem "foreman"
|
gem "foreman"
|
||||||
|
@ -211,9 +218,10 @@ group :development do
|
||||||
gem "annotate", "~> 2.6.0"
|
gem "annotate", "~> 2.6.0"
|
||||||
gem "letter_opener", '~> 1.1.2'
|
gem "letter_opener", '~> 1.1.2'
|
||||||
gem 'quiet_assets', '~> 1.0.2'
|
gem 'quiet_assets', '~> 1.0.2'
|
||||||
gem 'rerun', '~> 0.10.0'
|
gem 'rerun', '~> 0.11.0'
|
||||||
gem 'bullet', require: false
|
gem 'bullet', require: false
|
||||||
gem 'rblineprof', platform: :mri, require: false
|
gem 'rblineprof', platform: :mri, require: false
|
||||||
|
gem 'web-console', '~> 2.0'
|
||||||
|
|
||||||
# Better errors handler
|
# Better errors handler
|
||||||
gem 'better_errors', '~> 1.0.1'
|
gem 'better_errors', '~> 1.0.1'
|
||||||
|
@ -246,7 +254,7 @@ group :development, :test do
|
||||||
|
|
||||||
gem 'capybara', '~> 2.4.0'
|
gem 'capybara', '~> 2.4.0'
|
||||||
gem 'capybara-screenshot', '~> 1.0.0'
|
gem 'capybara-screenshot', '~> 1.0.0'
|
||||||
gem 'poltergeist', '~> 1.6.0'
|
gem 'poltergeist', '~> 1.8.1'
|
||||||
|
|
||||||
gem 'teaspoon', '~> 1.0.0'
|
gem 'teaspoon', '~> 1.0.0'
|
||||||
gem 'teaspoon-jasmine', '~> 2.2.0'
|
gem 'teaspoon-jasmine', '~> 2.2.0'
|
||||||
|
@ -256,11 +264,12 @@ group :development, :test do
|
||||||
gem 'spring-commands-spinach', '~> 1.0.0'
|
gem 'spring-commands-spinach', '~> 1.0.0'
|
||||||
gem 'spring-commands-teaspoon', '~> 0.0.2'
|
gem 'spring-commands-teaspoon', '~> 0.0.2'
|
||||||
|
|
||||||
gem 'rubocop', '~> 0.28.0', require: false
|
gem 'rubocop', '~> 0.35.0', require: false
|
||||||
gem 'coveralls', '~> 0.8.2', require: false
|
gem 'coveralls', '~> 0.8.2', require: false
|
||||||
gem 'simplecov', '~> 0.10.0', require: false
|
gem 'simplecov', '~> 0.10.0', require: false
|
||||||
gem 'flog', require: false
|
gem 'flog', require: false
|
||||||
gem 'flay', require: false
|
gem 'flay', require: false
|
||||||
|
gem 'bundler-audit', require: false
|
||||||
|
|
||||||
gem 'benchmark-ips', require: false
|
gem 'benchmark-ips', require: false
|
||||||
end
|
end
|
||||||
|
@ -269,7 +278,7 @@ group :test do
|
||||||
gem 'shoulda-matchers', '~> 2.8.0', require: false
|
gem 'shoulda-matchers', '~> 2.8.0', require: false
|
||||||
gem 'email_spec', '~> 1.6.0'
|
gem 'email_spec', '~> 1.6.0'
|
||||||
gem 'webmock', '~> 1.21.0'
|
gem 'webmock', '~> 1.21.0'
|
||||||
gem 'test_after_commit', '~> 0.2.2'
|
gem 'test_after_commit', '~> 0.4.2'
|
||||||
gem 'sham_rack'
|
gem 'sham_rack'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
365
Gemfile.lock
365
Gemfile.lock
|
@ -1,63 +1,71 @@
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
CFPropertyList (2.3.1)
|
CFPropertyList (2.3.2)
|
||||||
RedCloth (4.2.9)
|
RedCloth (4.2.9)
|
||||||
ace-rails-ap (2.0.1)
|
ace-rails-ap (2.0.1)
|
||||||
actionmailer (4.1.12)
|
actionmailer (4.2.4)
|
||||||
actionpack (= 4.1.12)
|
actionpack (= 4.2.4)
|
||||||
actionview (= 4.1.12)
|
actionview (= 4.2.4)
|
||||||
|
activejob (= 4.2.4)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
actionpack (4.1.12)
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||||
actionview (= 4.1.12)
|
actionpack (4.2.4)
|
||||||
activesupport (= 4.1.12)
|
actionview (= 4.2.4)
|
||||||
rack (~> 1.5.2)
|
activesupport (= 4.2.4)
|
||||||
|
rack (~> 1.6)
|
||||||
rack-test (~> 0.6.2)
|
rack-test (~> 0.6.2)
|
||||||
actionview (4.1.12)
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||||
activesupport (= 4.1.12)
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||||
|
actionview (4.2.4)
|
||||||
|
activesupport (= 4.2.4)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubis (~> 2.7.0)
|
erubis (~> 2.7.0)
|
||||||
activemodel (4.1.12)
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
||||||
activesupport (= 4.1.12)
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
||||||
|
activejob (4.2.4)
|
||||||
|
activesupport (= 4.2.4)
|
||||||
|
globalid (>= 0.3.0)
|
||||||
|
activemodel (4.2.4)
|
||||||
|
activesupport (= 4.2.4)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
activerecord (4.1.12)
|
activerecord (4.2.4)
|
||||||
activemodel (= 4.1.12)
|
activemodel (= 4.2.4)
|
||||||
activesupport (= 4.1.12)
|
activesupport (= 4.2.4)
|
||||||
arel (~> 5.0.0)
|
arel (~> 6.0)
|
||||||
activerecord-deprecated_finders (1.0.4)
|
activerecord-deprecated_finders (1.0.4)
|
||||||
activerecord-session_store (0.1.1)
|
activerecord-session_store (0.1.2)
|
||||||
actionpack (>= 4.0.0, < 5)
|
actionpack (>= 4.0.0, < 5)
|
||||||
activerecord (>= 4.0.0, < 5)
|
activerecord (>= 4.0.0, < 5)
|
||||||
railties (>= 4.0.0, < 5)
|
railties (>= 4.0.0, < 5)
|
||||||
activeresource (4.0.0)
|
activesupport (4.2.4)
|
||||||
activemodel (~> 4.0)
|
i18n (~> 0.7)
|
||||||
activesupport (~> 4.0)
|
|
||||||
rails-observers (~> 0.1.1)
|
|
||||||
activesupport (4.1.12)
|
|
||||||
i18n (~> 0.6, >= 0.6.9)
|
|
||||||
json (~> 1.7, >= 1.7.7)
|
json (~> 1.7, >= 1.7.7)
|
||||||
minitest (~> 5.1)
|
minitest (~> 5.1)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.3, >= 0.3.4)
|
||||||
tzinfo (~> 1.1)
|
tzinfo (~> 1.1)
|
||||||
acts-as-taggable-on (3.5.0)
|
acts-as-taggable-on (3.5.0)
|
||||||
activerecord (>= 3.2, < 5)
|
activerecord (>= 3.2, < 5)
|
||||||
addressable (2.3.8)
|
addressable (2.3.8)
|
||||||
after_commit_queue (1.1.0)
|
after_commit_queue (1.3.0)
|
||||||
rails (>= 3.0)
|
activerecord (>= 3.0)
|
||||||
annotate (2.6.10)
|
annotate (2.6.10)
|
||||||
activerecord (>= 3.2, <= 4.3)
|
activerecord (>= 3.2, <= 4.3)
|
||||||
rake (~> 10.4)
|
rake (~> 10.4)
|
||||||
arel (5.0.1.20140414130214)
|
arel (6.0.3)
|
||||||
asana (0.0.6)
|
asana (0.4.0)
|
||||||
activeresource (>= 3.2.3)
|
faraday (~> 0.9)
|
||||||
asciidoctor (1.5.2)
|
faraday_middleware (~> 0.9)
|
||||||
|
faraday_middleware-multi_json (~> 0.0)
|
||||||
|
oauth2 (~> 1.0)
|
||||||
|
asciidoctor (1.5.3)
|
||||||
ast (2.1.0)
|
ast (2.1.0)
|
||||||
astrolabe (1.3.1)
|
astrolabe (1.3.1)
|
||||||
parser (~> 2.2)
|
parser (~> 2.2)
|
||||||
attr_encrypted (1.3.4)
|
attr_encrypted (1.3.4)
|
||||||
encryptor (>= 1.3.0)
|
encryptor (>= 1.3.0)
|
||||||
attr_required (1.0.0)
|
attr_required (1.0.0)
|
||||||
autoprefixer-rails (5.2.1.2)
|
autoprefixer-rails (6.1.1)
|
||||||
execjs
|
execjs
|
||||||
json
|
json
|
||||||
awesome_print (1.2.0)
|
awesome_print (1.2.0)
|
||||||
|
@ -65,6 +73,7 @@ GEM
|
||||||
descendants_tracker (~> 0.0.4)
|
descendants_tracker (~> 0.0.4)
|
||||||
ice_nine (~> 0.11.0)
|
ice_nine (~> 0.11.0)
|
||||||
thread_safe (~> 0.3, >= 0.3.1)
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
|
babosa (1.0.2)
|
||||||
bcrypt (3.1.10)
|
bcrypt (3.1.10)
|
||||||
benchmark-ips (2.3.0)
|
benchmark-ips (2.3.0)
|
||||||
better_errors (1.0.1)
|
better_errors (1.0.1)
|
||||||
|
@ -85,12 +94,15 @@ GEM
|
||||||
ruby_parser (~> 3.5.0)
|
ruby_parser (~> 3.5.0)
|
||||||
sass (~> 3.0)
|
sass (~> 3.0)
|
||||||
terminal-table (~> 1.4)
|
terminal-table (~> 1.4)
|
||||||
browser (1.0.0)
|
browser (1.0.1)
|
||||||
builder (3.2.2)
|
builder (3.2.2)
|
||||||
bullet (4.14.9)
|
bullet (4.14.10)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
uniform_notifier (~> 1.9.0)
|
uniform_notifier (~> 1.9.0)
|
||||||
byebug (6.0.2)
|
bundler-audit (0.4.0)
|
||||||
|
bundler (~> 1.2)
|
||||||
|
thor (~> 0.18)
|
||||||
|
byebug (8.2.0)
|
||||||
cal-heatmap-rails (0.0.1)
|
cal-heatmap-rails (0.0.1)
|
||||||
capybara (2.4.4)
|
capybara (2.4.4)
|
||||||
mime-types (>= 1.16)
|
mime-types (>= 1.16)
|
||||||
|
@ -105,10 +117,8 @@ GEM
|
||||||
activemodel (>= 3.2.0)
|
activemodel (>= 3.2.0)
|
||||||
activesupport (>= 3.2.0)
|
activesupport (>= 3.2.0)
|
||||||
json (>= 1.7)
|
json (>= 1.7)
|
||||||
celluloid (0.16.0)
|
|
||||||
timers (~> 4.0.0)
|
|
||||||
charlock_holmes (0.7.3)
|
charlock_holmes (0.7.3)
|
||||||
chunky_png (1.3.4)
|
chunky_png (1.3.5)
|
||||||
cliver (0.3.2)
|
cliver (0.3.2)
|
||||||
coderay (1.1.0)
|
coderay (1.1.0)
|
||||||
coercible (1.0.0)
|
coercible (1.0.0)
|
||||||
|
@ -119,19 +129,20 @@ GEM
|
||||||
coffee-script (2.4.1)
|
coffee-script (2.4.1)
|
||||||
coffee-script-source
|
coffee-script-source
|
||||||
execjs
|
execjs
|
||||||
coffee-script-source (1.9.1.1)
|
coffee-script-source (1.10.0)
|
||||||
colored (1.2)
|
colorize (0.7.7)
|
||||||
colorize (0.5.8)
|
concurrent-ruby (1.0.0)
|
||||||
connection_pool (2.2.0)
|
connection_pool (2.2.0)
|
||||||
coveralls (0.8.2)
|
coveralls (0.8.9)
|
||||||
json (~> 1.8)
|
json (~> 1.8)
|
||||||
rest-client (>= 1.6.8, < 2)
|
rest-client (>= 1.6.8, < 2)
|
||||||
simplecov (~> 0.10.0)
|
simplecov (~> 0.10.0)
|
||||||
term-ansicolor (~> 1.3)
|
term-ansicolor (~> 1.3)
|
||||||
thor (~> 0.19.1)
|
thor (~> 0.19.1)
|
||||||
|
tins (~> 1.6.0)
|
||||||
crack (0.4.2)
|
crack (0.4.2)
|
||||||
safe_yaml (~> 1.0.0)
|
safe_yaml (~> 1.0.0)
|
||||||
creole (0.3.8)
|
creole (0.5.0)
|
||||||
d3_rails (3.5.6)
|
d3_rails (3.5.6)
|
||||||
railties (>= 3.1.0)
|
railties (>= 3.1.0)
|
||||||
daemons (1.2.3)
|
daemons (1.2.3)
|
||||||
|
@ -142,7 +153,7 @@ GEM
|
||||||
activerecord (>= 3.2.0, < 5.0)
|
activerecord (>= 3.2.0, < 5.0)
|
||||||
descendants_tracker (0.0.4)
|
descendants_tracker (0.0.4)
|
||||||
thread_safe (~> 0.3, >= 0.3.1)
|
thread_safe (~> 0.3, >= 0.3.1)
|
||||||
devise (3.5.2)
|
devise (3.5.3)
|
||||||
bcrypt (~> 3.0)
|
bcrypt (~> 3.0)
|
||||||
orm_adapter (~> 0.1)
|
orm_adapter (~> 0.1)
|
||||||
railties (>= 3.2.6, < 5)
|
railties (>= 3.2.6, < 5)
|
||||||
|
@ -151,7 +162,7 @@ GEM
|
||||||
warden (~> 1.2.3)
|
warden (~> 1.2.3)
|
||||||
devise-async (0.9.0)
|
devise-async (0.9.0)
|
||||||
devise (~> 3.2)
|
devise (~> 3.2)
|
||||||
devise-two-factor (2.0.0)
|
devise-two-factor (2.0.1)
|
||||||
activesupport
|
activesupport
|
||||||
attr_encrypted (~> 1.3.2)
|
attr_encrypted (~> 1.3.2)
|
||||||
devise (~> 3.5.0)
|
devise (~> 3.5.0)
|
||||||
|
@ -160,19 +171,17 @@ GEM
|
||||||
diff-lcs (1.2.5)
|
diff-lcs (1.2.5)
|
||||||
diffy (3.0.7)
|
diffy (3.0.7)
|
||||||
docile (1.1.5)
|
docile (1.1.5)
|
||||||
domain_name (0.5.24)
|
domain_name (0.5.25)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
doorkeeper (2.1.4)
|
doorkeeper (2.2.2)
|
||||||
railties (>= 3.2)
|
railties (>= 3.2)
|
||||||
dropzonejs-rails (0.7.1)
|
dropzonejs-rails (0.7.2)
|
||||||
rails (> 3.1)
|
rails (> 3.1)
|
||||||
email_reply_parser (0.5.8)
|
email_reply_parser (0.5.8)
|
||||||
email_spec (1.6.0)
|
email_spec (1.6.0)
|
||||||
launchy (~> 2.1)
|
launchy (~> 2.1)
|
||||||
mail (~> 2.2)
|
mail (~> 2.2)
|
||||||
encryptor (1.3.0)
|
encryptor (1.3.0)
|
||||||
enumerize (0.7.0)
|
|
||||||
activesupport (>= 3.2)
|
|
||||||
equalizer (0.0.11)
|
equalizer (0.0.11)
|
||||||
erubis (2.7.0)
|
erubis (2.7.0)
|
||||||
escape_utils (1.1.0)
|
escape_utils (1.1.0)
|
||||||
|
@ -189,6 +198,9 @@ GEM
|
||||||
multipart-post (>= 1.2, < 3)
|
multipart-post (>= 1.2, < 3)
|
||||||
faraday_middleware (0.10.0)
|
faraday_middleware (0.10.0)
|
||||||
faraday (>= 0.7.4, < 0.10)
|
faraday (>= 0.7.4, < 0.10)
|
||||||
|
faraday_middleware-multi_json (0.0.6)
|
||||||
|
faraday_middleware
|
||||||
|
multi_json
|
||||||
fastercsv (1.5.5)
|
fastercsv (1.5.5)
|
||||||
ffaker (2.0.0)
|
ffaker (2.0.0)
|
||||||
ffi (1.9.10)
|
ffi (1.9.10)
|
||||||
|
@ -200,7 +212,7 @@ GEM
|
||||||
flog (4.3.2)
|
flog (4.3.2)
|
||||||
ruby_parser (~> 3.1, > 3.1.0)
|
ruby_parser (~> 3.1, > 3.1.0)
|
||||||
sexp_processor (~> 4.4)
|
sexp_processor (~> 4.4)
|
||||||
flowdock (0.7.0)
|
flowdock (0.7.1)
|
||||||
httparty (~> 0.7)
|
httparty (~> 0.7)
|
||||||
multi_json
|
multi_json
|
||||||
fog (1.25.0)
|
fog (1.25.0)
|
||||||
|
@ -222,13 +234,10 @@ GEM
|
||||||
fog-core (~> 1.22)
|
fog-core (~> 1.22)
|
||||||
fog-json
|
fog-json
|
||||||
inflecto (~> 0.0.2)
|
inflecto (~> 0.0.2)
|
||||||
fog-core (1.32.1)
|
fog-core (1.35.0)
|
||||||
builder
|
builder
|
||||||
excon (~> 0.45)
|
excon (~> 0.45)
|
||||||
formatador (~> 0.2)
|
formatador (~> 0.2)
|
||||||
mime-types
|
|
||||||
net-scp (~> 1.1)
|
|
||||||
net-ssh (>= 2.1.3)
|
|
||||||
fog-json (1.0.2)
|
fog-json (1.0.2)
|
||||||
fog-core (~> 1.0)
|
fog-core (~> 1.0)
|
||||||
multi_json (~> 1.10)
|
multi_json (~> 1.10)
|
||||||
|
@ -240,10 +249,10 @@ GEM
|
||||||
fog-core (>= 1.21.0)
|
fog-core (>= 1.21.0)
|
||||||
fog-json
|
fog-json
|
||||||
fog-xml (>= 0.0.1)
|
fog-xml (>= 0.0.1)
|
||||||
fog-sakuracloud (1.0.1)
|
fog-sakuracloud (1.4.0)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-softlayer (0.4.7)
|
fog-softlayer (1.0.2)
|
||||||
fog-core
|
fog-core
|
||||||
fog-json
|
fog-json
|
||||||
fog-terremark (0.1.0)
|
fog-terremark (0.1.0)
|
||||||
|
@ -258,7 +267,7 @@ GEM
|
||||||
fog-xml (0.1.2)
|
fog-xml (0.1.2)
|
||||||
fog-core
|
fog-core
|
||||||
nokogiri (~> 1.5, >= 1.5.11)
|
nokogiri (~> 1.5, >= 1.5.11)
|
||||||
font-awesome-rails (4.4.0.0)
|
font-awesome-rails (4.5.0.0)
|
||||||
railties (>= 3.2, < 5.0)
|
railties (>= 3.2, < 5.0)
|
||||||
foreman (0.78.0)
|
foreman (0.78.0)
|
||||||
thor (~> 0.19.1)
|
thor (~> 0.19.1)
|
||||||
|
@ -268,11 +277,11 @@ GEM
|
||||||
ruby-progressbar (~> 1.4)
|
ruby-progressbar (~> 1.4)
|
||||||
gemnasium-gitlab-service (0.2.6)
|
gemnasium-gitlab-service (0.2.6)
|
||||||
rugged (~> 0.21)
|
rugged (~> 0.21)
|
||||||
gemojione (2.0.1)
|
gemojione (2.1.0)
|
||||||
json
|
json
|
||||||
get_process_mem (0.2.0)
|
get_process_mem (0.2.0)
|
||||||
gherkin-ruby (0.3.2)
|
gherkin-ruby (0.3.2)
|
||||||
github-linguist (4.7.0)
|
github-linguist (4.7.2)
|
||||||
charlock_holmes (~> 0.7.3)
|
charlock_holmes (~> 0.7.3)
|
||||||
escape_utils (~> 1.1.0)
|
escape_utils (~> 1.1.0)
|
||||||
mime-types (>= 1.19)
|
mime-types (>= 1.19)
|
||||||
|
@ -287,9 +296,9 @@ GEM
|
||||||
diff-lcs (~> 1.1)
|
diff-lcs (~> 1.1)
|
||||||
mime-types (~> 1.15)
|
mime-types (~> 1.15)
|
||||||
posix-spawn (~> 0.3)
|
posix-spawn (~> 0.3)
|
||||||
gitlab_emoji (0.1.1)
|
gitlab_emoji (0.2.0)
|
||||||
gemojione (~> 2.0)
|
gemojione (~> 2.1)
|
||||||
gitlab_git (7.2.20)
|
gitlab_git (7.2.21)
|
||||||
activesupport (~> 4.0)
|
activesupport (~> 4.0)
|
||||||
charlock_holmes (~> 0.7.3)
|
charlock_holmes (~> 0.7.3)
|
||||||
github-linguist (~> 4.7.0)
|
github-linguist (~> 4.7.0)
|
||||||
|
@ -300,18 +309,22 @@ GEM
|
||||||
omniauth (~> 1.0)
|
omniauth (~> 1.0)
|
||||||
pyu-ruby-sasl (~> 0.0.3.1)
|
pyu-ruby-sasl (~> 0.0.3.1)
|
||||||
rubyntlm (~> 0.3)
|
rubyntlm (~> 0.3)
|
||||||
|
globalid (0.3.6)
|
||||||
|
activesupport (>= 4.1.0)
|
||||||
gollum-grit_adapter (1.0.0)
|
gollum-grit_adapter (1.0.0)
|
||||||
gitlab-grit (~> 2.7, >= 2.7.1)
|
gitlab-grit (~> 2.7, >= 2.7.1)
|
||||||
gollum-lib (4.0.3)
|
gollum-lib (4.1.0)
|
||||||
github-markup (~> 1.3.3)
|
github-markup (~> 1.3.3)
|
||||||
gollum-grit_adapter (~> 1.0)
|
gollum-grit_adapter (~> 1.0)
|
||||||
nokogiri (~> 1.6.4)
|
nokogiri (~> 1.6.4)
|
||||||
rouge (~> 1.10.1)
|
rouge (~> 1.9)
|
||||||
sanitize (~> 2.1.0)
|
sanitize (~> 2.1.0)
|
||||||
stringex (~> 2.5.1)
|
stringex (~> 2.5.1)
|
||||||
gon (5.0.4)
|
gon (6.0.1)
|
||||||
actionpack (>= 2.3.0)
|
actionpack (>= 3.0)
|
||||||
json
|
json
|
||||||
|
multi_json
|
||||||
|
request_store (>= 1.0)
|
||||||
grape (0.13.0)
|
grape (0.13.0)
|
||||||
activesupport
|
activesupport
|
||||||
builder
|
builder
|
||||||
|
@ -333,13 +346,12 @@ GEM
|
||||||
haml (>= 4.0.6, < 5.0)
|
haml (>= 4.0.6, < 5.0)
|
||||||
html2haml (>= 1.0.1)
|
html2haml (>= 1.0.1)
|
||||||
railties (>= 4.0.1)
|
railties (>= 4.0.1)
|
||||||
hashie (3.4.2)
|
hashie (3.4.3)
|
||||||
highline (1.6.21)
|
highline (1.6.21)
|
||||||
hike (1.2.3)
|
hike (1.2.3)
|
||||||
hipchat (1.5.2)
|
hipchat (1.5.2)
|
||||||
httparty
|
httparty
|
||||||
mimemagic
|
mimemagic
|
||||||
hitimes (1.2.3)
|
|
||||||
html-pipeline (1.11.0)
|
html-pipeline (1.11.0)
|
||||||
activesupport (>= 2)
|
activesupport (>= 2)
|
||||||
nokogiri (~> 1.4)
|
nokogiri (~> 1.4)
|
||||||
|
@ -351,40 +363,40 @@ GEM
|
||||||
http-cookie (1.0.2)
|
http-cookie (1.0.2)
|
||||||
domain_name (~> 0.5)
|
domain_name (~> 0.5)
|
||||||
http_parser.rb (0.5.3)
|
http_parser.rb (0.5.3)
|
||||||
httparty (0.13.5)
|
httparty (0.13.7)
|
||||||
json (~> 1.8)
|
json (~> 1.8)
|
||||||
multi_xml (>= 0.5.2)
|
multi_xml (>= 0.5.2)
|
||||||
httpclient (2.6.0.1)
|
httpclient (2.7.0.1)
|
||||||
i18n (0.7.0)
|
i18n (0.7.0)
|
||||||
ice_cube (0.11.1)
|
|
||||||
ice_nine (0.11.1)
|
ice_nine (0.11.1)
|
||||||
inflecto (0.0.2)
|
inflecto (0.0.2)
|
||||||
ipaddress (0.8.0)
|
ipaddress (0.8.0)
|
||||||
jquery-atwho-rails (1.3.2)
|
jquery-atwho-rails (1.3.2)
|
||||||
jquery-rails (3.1.3)
|
jquery-rails (3.1.4)
|
||||||
railties (>= 3.0, < 5.0)
|
railties (>= 3.0, < 5.0)
|
||||||
thor (>= 0.14, < 2.0)
|
thor (>= 0.14, < 2.0)
|
||||||
jquery-scrollto-rails (1.4.3)
|
jquery-scrollto-rails (1.4.3)
|
||||||
railties (> 3.1, < 5.0)
|
railties (> 3.1, < 5.0)
|
||||||
jquery-turbolinks (2.0.2)
|
jquery-turbolinks (2.1.0)
|
||||||
railties (>= 3.1.0)
|
railties (>= 3.1.0)
|
||||||
turbolinks
|
turbolinks
|
||||||
jquery-ui-rails (4.2.1)
|
jquery-ui-rails (4.2.1)
|
||||||
railties (>= 3.2.16)
|
railties (>= 3.2.16)
|
||||||
json (1.8.3)
|
json (1.8.3)
|
||||||
jwt (1.5.1)
|
jwt (1.5.2)
|
||||||
kaminari (0.16.3)
|
kaminari (0.16.3)
|
||||||
actionpack (>= 3.0.0)
|
actionpack (>= 3.0.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
kgio (2.9.3)
|
kgio (2.10.0)
|
||||||
launchy (2.4.3)
|
launchy (2.4.3)
|
||||||
addressable (~> 2.3)
|
addressable (~> 2.3)
|
||||||
letter_opener (1.1.2)
|
letter_opener (1.1.2)
|
||||||
launchy (~> 2.2)
|
launchy (~> 2.2)
|
||||||
listen (2.10.1)
|
listen (3.0.5)
|
||||||
celluloid (~> 0.16.0)
|
|
||||||
rb-fsevent (>= 0.9.3)
|
rb-fsevent (>= 0.9.3)
|
||||||
rb-inotify (>= 0.9)
|
rb-inotify (>= 0.9)
|
||||||
|
loofah (2.0.3)
|
||||||
|
nokogiri (>= 1.5.9)
|
||||||
macaddr (1.7.1)
|
macaddr (1.7.1)
|
||||||
systemu (~> 2.6.2)
|
systemu (~> 2.6.2)
|
||||||
mail (2.6.3)
|
mail (2.6.3)
|
||||||
|
@ -393,7 +405,7 @@ GEM
|
||||||
method_source (0.8.2)
|
method_source (0.8.2)
|
||||||
mime-types (1.25.1)
|
mime-types (1.25.1)
|
||||||
mimemagic (0.3.0)
|
mimemagic (0.3.0)
|
||||||
mini_portile (0.6.2)
|
mini_portile2 (2.0.0)
|
||||||
minitest (5.7.0)
|
minitest (5.7.0)
|
||||||
mousetrap-rails (1.4.6)
|
mousetrap-rails (1.4.6)
|
||||||
multi_json (1.11.2)
|
multi_json (1.11.2)
|
||||||
|
@ -401,17 +413,15 @@ GEM
|
||||||
multipart-post (2.0.0)
|
multipart-post (2.0.0)
|
||||||
mysql2 (0.3.20)
|
mysql2 (0.3.20)
|
||||||
nested_form (0.3.2)
|
nested_form (0.3.2)
|
||||||
net-ldap (0.11)
|
net-ldap (0.12.1)
|
||||||
net-scp (1.2.1)
|
net-ssh (3.0.1)
|
||||||
net-ssh (>= 2.6.5)
|
netrc (0.11.0)
|
||||||
net-ssh (2.9.2)
|
|
||||||
netrc (0.10.3)
|
|
||||||
newrelic-grape (2.0.0)
|
newrelic-grape (2.0.0)
|
||||||
grape
|
grape
|
||||||
newrelic_rpm
|
newrelic_rpm
|
||||||
newrelic_rpm (3.9.4.245)
|
newrelic_rpm (3.9.4.245)
|
||||||
nokogiri (1.6.6.2)
|
nokogiri (1.6.7.1)
|
||||||
mini_portile (~> 0.6.0)
|
mini_portile2 (~> 2.0.0.rc2)
|
||||||
nprogress-rails (0.1.6.7)
|
nprogress-rails (0.1.6.7)
|
||||||
oauth (0.4.7)
|
oauth (0.4.7)
|
||||||
oauth2 (1.0.0)
|
oauth2 (1.0.0)
|
||||||
|
@ -434,12 +444,15 @@ GEM
|
||||||
omniauth-github (1.1.2)
|
omniauth-github (1.1.2)
|
||||||
omniauth (~> 1.0)
|
omniauth (~> 1.0)
|
||||||
omniauth-oauth2 (~> 1.1)
|
omniauth-oauth2 (~> 1.1)
|
||||||
omniauth-gitlab (1.0.0)
|
omniauth-gitlab (1.0.1)
|
||||||
omniauth (~> 1.0)
|
omniauth (~> 1.0)
|
||||||
omniauth-oauth2 (~> 1.0)
|
omniauth-oauth2 (~> 1.0)
|
||||||
omniauth-google-oauth2 (0.2.6)
|
omniauth-google-oauth2 (0.2.10)
|
||||||
omniauth (> 1.0)
|
addressable (~> 2.3)
|
||||||
omniauth-oauth2 (~> 1.1)
|
jwt (~> 1.0)
|
||||||
|
multi_json (~> 1.3)
|
||||||
|
omniauth (>= 1.1.1)
|
||||||
|
omniauth-oauth2 (~> 1.3.1)
|
||||||
omniauth-kerberos (0.3.0)
|
omniauth-kerberos (0.3.0)
|
||||||
omniauth-multipassword
|
omniauth-multipassword
|
||||||
timfel-krb5-auth (~> 0.8)
|
timfel-krb5-auth (~> 0.8)
|
||||||
|
@ -463,26 +476,26 @@ GEM
|
||||||
activesupport
|
activesupport
|
||||||
nokogiri (>= 1.4.4)
|
nokogiri (>= 1.4.4)
|
||||||
omniauth (~> 1.0)
|
omniauth (~> 1.0)
|
||||||
opennebula (4.12.1)
|
opennebula (4.14.2)
|
||||||
json
|
json
|
||||||
nokogiri
|
nokogiri
|
||||||
rbvmomi
|
rbvmomi
|
||||||
org-ruby (0.9.12)
|
org-ruby (0.9.12)
|
||||||
rubypants (~> 0.2)
|
rubypants (~> 0.2)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
paranoia (2.1.3)
|
paranoia (2.1.4)
|
||||||
activerecord (~> 4.0)
|
activerecord (~> 4.0)
|
||||||
parser (2.2.2.6)
|
parser (2.2.3.0)
|
||||||
ast (>= 1.1, < 3.0)
|
ast (>= 1.1, < 3.0)
|
||||||
pg (0.18.2)
|
pg (0.18.4)
|
||||||
poltergeist (1.6.0)
|
poltergeist (1.8.1)
|
||||||
capybara (~> 2.1)
|
capybara (~> 2.1)
|
||||||
cliver (~> 0.3.1)
|
cliver (~> 0.3.1)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
websocket-driver (>= 0.2.0)
|
websocket-driver (>= 0.2.0)
|
||||||
posix-spawn (0.3.11)
|
posix-spawn (0.3.11)
|
||||||
powerpack (0.0.9)
|
powerpack (0.1.1)
|
||||||
pry (0.10.1)
|
pry (0.10.3)
|
||||||
coderay (~> 1.1.0)
|
coderay (~> 1.1.0)
|
||||||
method_source (~> 0.8.1)
|
method_source (~> 0.8.1)
|
||||||
slop (~> 3.4)
|
slop (~> 3.4)
|
||||||
|
@ -491,15 +504,15 @@ GEM
|
||||||
pyu-ruby-sasl (0.0.3.3)
|
pyu-ruby-sasl (0.0.3.3)
|
||||||
quiet_assets (1.0.3)
|
quiet_assets (1.0.3)
|
||||||
railties (>= 3.1, < 5.0)
|
railties (>= 3.1, < 5.0)
|
||||||
rack (1.5.5)
|
rack (1.6.4)
|
||||||
rack-accept (0.4.5)
|
rack-accept (0.4.5)
|
||||||
rack (>= 0.4)
|
rack (>= 0.4)
|
||||||
rack-attack (4.3.0)
|
rack-attack (4.3.1)
|
||||||
rack
|
rack
|
||||||
rack-cors (0.4.0)
|
rack-cors (0.4.0)
|
||||||
rack-mount (0.8.3)
|
rack-mount (0.8.3)
|
||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
rack-oauth2 (1.0.10)
|
rack-oauth2 (1.2.1)
|
||||||
activesupport (>= 2.3)
|
activesupport (>= 2.3)
|
||||||
attr_required (>= 0.0.5)
|
attr_required (>= 0.0.5)
|
||||||
httpclient (>= 2.4)
|
httpclient (>= 2.4)
|
||||||
|
@ -509,28 +522,35 @@ GEM
|
||||||
rack
|
rack
|
||||||
rack-test (0.6.3)
|
rack-test (0.6.3)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
rails (4.1.12)
|
rails (4.2.4)
|
||||||
actionmailer (= 4.1.12)
|
actionmailer (= 4.2.4)
|
||||||
actionpack (= 4.1.12)
|
actionpack (= 4.2.4)
|
||||||
actionview (= 4.1.12)
|
actionview (= 4.2.4)
|
||||||
activemodel (= 4.1.12)
|
activejob (= 4.2.4)
|
||||||
activerecord (= 4.1.12)
|
activemodel (= 4.2.4)
|
||||||
activesupport (= 4.1.12)
|
activerecord (= 4.2.4)
|
||||||
|
activesupport (= 4.2.4)
|
||||||
bundler (>= 1.3.0, < 2.0)
|
bundler (>= 1.3.0, < 2.0)
|
||||||
railties (= 4.1.12)
|
railties (= 4.2.4)
|
||||||
sprockets-rails (~> 2.0)
|
sprockets-rails
|
||||||
rails-observers (0.1.2)
|
rails-deprecated_sanitizer (1.0.3)
|
||||||
activemodel (~> 4.0)
|
activesupport (>= 4.2.0.alpha)
|
||||||
railties (4.1.12)
|
rails-dom-testing (1.0.7)
|
||||||
actionpack (= 4.1.12)
|
activesupport (>= 4.2.0.beta, < 5.0)
|
||||||
activesupport (= 4.1.12)
|
nokogiri (~> 1.6.0)
|
||||||
|
rails-deprecated_sanitizer (>= 1.0.1)
|
||||||
|
rails-html-sanitizer (1.0.2)
|
||||||
|
loofah (~> 2.0)
|
||||||
|
railties (4.2.4)
|
||||||
|
actionpack (= 4.2.4)
|
||||||
|
activesupport (= 4.2.4)
|
||||||
rake (>= 0.8.7)
|
rake (>= 0.8.7)
|
||||||
thor (>= 0.18.1, < 2.0)
|
thor (>= 0.18.1, < 2.0)
|
||||||
rainbow (2.0.0)
|
rainbow (2.0.0)
|
||||||
raindrops (0.15.0)
|
raindrops (0.15.0)
|
||||||
rake (10.4.2)
|
rake (10.4.2)
|
||||||
raphael-rails (2.1.2)
|
raphael-rails (2.1.2)
|
||||||
rb-fsevent (0.9.5)
|
rb-fsevent (0.9.6)
|
||||||
rb-inotify (0.9.5)
|
rb-inotify (0.9.5)
|
||||||
ffi (>= 0.5.0)
|
ffi (>= 0.5.0)
|
||||||
rblineprof (0.3.6)
|
rblineprof (0.3.6)
|
||||||
|
@ -542,13 +562,13 @@ GEM
|
||||||
rdoc (3.12.2)
|
rdoc (3.12.2)
|
||||||
json (~> 1.4)
|
json (~> 1.4)
|
||||||
redcarpet (3.3.3)
|
redcarpet (3.3.3)
|
||||||
redis (3.2.1)
|
redis (3.2.2)
|
||||||
redis-actionpack (4.0.0)
|
redis-actionpack (4.0.1)
|
||||||
actionpack (~> 4)
|
actionpack (~> 4)
|
||||||
redis-rack (~> 1.5.0)
|
redis-rack (~> 1.5.0)
|
||||||
redis-store (~> 1.1.0)
|
redis-store (~> 1.1.0)
|
||||||
redis-activesupport (4.1.1)
|
redis-activesupport (4.1.5)
|
||||||
activesupport (~> 4)
|
activesupport (>= 3, < 5)
|
||||||
redis-store (~> 1.1.0)
|
redis-store (~> 1.1.0)
|
||||||
redis-namespace (1.5.2)
|
redis-namespace (1.5.2)
|
||||||
redis (~> 3.0, >= 3.0.4)
|
redis (~> 3.0, >= 3.0.4)
|
||||||
|
@ -559,13 +579,13 @@ GEM
|
||||||
redis-actionpack (~> 4)
|
redis-actionpack (~> 4)
|
||||||
redis-activesupport (~> 4)
|
redis-activesupport (~> 4)
|
||||||
redis-store (~> 1.1.0)
|
redis-store (~> 1.1.0)
|
||||||
redis-store (1.1.6)
|
redis-store (1.1.7)
|
||||||
redis (>= 2.2)
|
redis (>= 2.2)
|
||||||
request_store (1.2.0)
|
request_store (1.2.1)
|
||||||
rerun (0.10.0)
|
rerun (0.11.0)
|
||||||
listen (~> 2.7, >= 2.7.3)
|
listen (~> 3.0)
|
||||||
responders (1.1.2)
|
responders (2.1.0)
|
||||||
railties (>= 3.2, < 4.2)
|
railties (>= 4.2.0, < 5)
|
||||||
rest-client (1.8.0)
|
rest-client (1.8.0)
|
||||||
http-cookie (>= 1.0.2, < 2.0)
|
http-cookie (>= 1.0.2, < 2.0)
|
||||||
mime-types (>= 1.16, < 3.0)
|
mime-types (>= 1.16, < 3.0)
|
||||||
|
@ -598,12 +618,13 @@ GEM
|
||||||
rspec-mocks (~> 3.3.0)
|
rspec-mocks (~> 3.3.0)
|
||||||
rspec-support (~> 3.3.0)
|
rspec-support (~> 3.3.0)
|
||||||
rspec-support (3.3.0)
|
rspec-support (3.3.0)
|
||||||
rubocop (0.28.0)
|
rubocop (0.35.1)
|
||||||
astrolabe (~> 1.3)
|
astrolabe (~> 1.3)
|
||||||
parser (>= 2.2.0.pre.7, < 3.0)
|
parser (>= 2.2.3.0, < 3.0)
|
||||||
powerpack (~> 0.0.6)
|
powerpack (~> 0.1)
|
||||||
rainbow (>= 1.99.1, < 3.0)
|
rainbow (>= 1.99.1, < 3.0)
|
||||||
ruby-progressbar (~> 1.4)
|
ruby-progressbar (~> 1.7)
|
||||||
|
tins (<= 1.6.0)
|
||||||
ruby-fogbugz (0.2.1)
|
ruby-fogbugz (0.2.1)
|
||||||
crack (~> 0.4)
|
crack (~> 0.4)
|
||||||
ruby-progressbar (1.7.5)
|
ruby-progressbar (1.7.5)
|
||||||
|
@ -617,6 +638,7 @@ GEM
|
||||||
sexp_processor (~> 4.1)
|
sexp_processor (~> 4.1)
|
||||||
rubyntlm (0.5.2)
|
rubyntlm (0.5.2)
|
||||||
rubypants (0.2.0)
|
rubypants (0.2.0)
|
||||||
|
rufus-scheduler (3.1.10)
|
||||||
rugged (0.23.3)
|
rugged (0.23.3)
|
||||||
safe_yaml (1.0.4)
|
safe_yaml (1.0.4)
|
||||||
sanitize (2.1.0)
|
sanitize (2.1.0)
|
||||||
|
@ -644,16 +666,15 @@ GEM
|
||||||
rack
|
rack
|
||||||
shoulda-matchers (2.8.0)
|
shoulda-matchers (2.8.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
sidekiq (3.3.0)
|
sidekiq (4.0.1)
|
||||||
celluloid (>= 0.16.0)
|
concurrent-ruby (~> 1.0)
|
||||||
connection_pool (>= 2.0.0)
|
connection_pool (~> 2.2, >= 2.2.0)
|
||||||
json
|
json (~> 1.0)
|
||||||
redis (>= 3.0.6)
|
redis (~> 3.2, >= 3.2.1)
|
||||||
redis-namespace (>= 1.3.1)
|
sidekiq-cron (0.4.0)
|
||||||
sidetiq (0.6.3)
|
redis-namespace (>= 1.5.2)
|
||||||
celluloid (>= 0.14.1)
|
rufus-scheduler (>= 2.0.24)
|
||||||
ice_cube (= 0.11.1)
|
sidekiq (>= 4.0.0)
|
||||||
sidekiq (>= 3.0.0)
|
|
||||||
simple_oauth (0.1.9)
|
simple_oauth (0.1.9)
|
||||||
simplecov (0.10.0)
|
simplecov (0.10.0)
|
||||||
docile (~> 1.1.0)
|
docile (~> 1.1.0)
|
||||||
|
@ -687,7 +708,7 @@ GEM
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
rack (~> 1.0)
|
rack (~> 1.0)
|
||||||
tilt (~> 1.1, != 1.3.0)
|
tilt (~> 1.1, != 1.3.0)
|
||||||
sprockets-rails (2.3.2)
|
sprockets-rails (2.3.3)
|
||||||
actionpack (>= 3.0)
|
actionpack (>= 3.0)
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
sprockets (>= 2.8, < 4.0)
|
sprockets (>= 2.8, < 4.0)
|
||||||
|
@ -710,17 +731,15 @@ GEM
|
||||||
term-ansicolor (1.3.2)
|
term-ansicolor (1.3.2)
|
||||||
tins (~> 1.0)
|
tins (~> 1.0)
|
||||||
terminal-table (1.5.2)
|
terminal-table (1.5.2)
|
||||||
test_after_commit (0.2.7)
|
test_after_commit (0.4.2)
|
||||||
activerecord (>= 3.2)
|
activerecord (>= 3.2)
|
||||||
thin (1.6.3)
|
thin (1.6.4)
|
||||||
daemons (~> 1.0, >= 1.0.9)
|
daemons (~> 1.0, >= 1.0.9)
|
||||||
eventmachine (~> 1.0)
|
eventmachine (~> 1.0, >= 1.0.4)
|
||||||
rack (~> 1.0)
|
rack (~> 1.0)
|
||||||
thor (0.19.1)
|
thor (0.19.1)
|
||||||
thread_safe (0.3.5)
|
thread_safe (0.3.5)
|
||||||
tilt (1.4.1)
|
tilt (1.4.1)
|
||||||
timers (4.0.4)
|
|
||||||
hitimes
|
|
||||||
timfel-krb5-auth (0.8.3)
|
timfel-krb5-auth (0.8.3)
|
||||||
tinder (1.10.1)
|
tinder (1.10.1)
|
||||||
eventmachine (~> 1.0)
|
eventmachine (~> 1.0)
|
||||||
|
@ -752,9 +771,9 @@ GEM
|
||||||
kgio (~> 2.6)
|
kgio (~> 2.6)
|
||||||
rack
|
rack
|
||||||
raindrops (~> 0.7)
|
raindrops (~> 0.7)
|
||||||
unicorn-worker-killer (0.4.3)
|
unicorn-worker-killer (0.4.4)
|
||||||
get_process_mem (~> 0)
|
get_process_mem (~> 0)
|
||||||
unicorn (~> 4)
|
unicorn (>= 4, < 6)
|
||||||
uniform_notifier (1.9.0)
|
uniform_notifier (1.9.0)
|
||||||
uuid (2.3.8)
|
uuid (2.3.8)
|
||||||
macaddr (~> 1.0)
|
macaddr (~> 1.0)
|
||||||
|
@ -766,10 +785,15 @@ GEM
|
||||||
equalizer (~> 0.0, >= 0.0.9)
|
equalizer (~> 0.0, >= 0.0.9)
|
||||||
warden (1.2.3)
|
warden (1.2.3)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
|
web-console (2.2.1)
|
||||||
|
activemodel (>= 4.0)
|
||||||
|
binding_of_caller (>= 0.7.2)
|
||||||
|
railties (>= 4.0)
|
||||||
|
sprockets-rails (>= 2.0, < 4.0)
|
||||||
webmock (1.21.0)
|
webmock (1.21.0)
|
||||||
addressable (>= 2.3.6)
|
addressable (>= 2.3.6)
|
||||||
crack (>= 0.3.2)
|
crack (>= 0.3.2)
|
||||||
websocket-driver (0.6.2)
|
websocket-driver (0.6.3)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.2)
|
websocket-extensions (0.1.2)
|
||||||
wikicloth (0.8.1)
|
wikicloth (0.8.1)
|
||||||
|
@ -791,10 +815,11 @@ DEPENDENCIES
|
||||||
addressable (~> 2.3.8)
|
addressable (~> 2.3.8)
|
||||||
after_commit_queue
|
after_commit_queue
|
||||||
annotate (~> 2.6.0)
|
annotate (~> 2.6.0)
|
||||||
asana (~> 0.0.6)
|
asana (~> 0.4.0)
|
||||||
asciidoctor (~> 1.5.2)
|
asciidoctor (~> 1.5.2)
|
||||||
attr_encrypted (~> 1.3.4)
|
attr_encrypted (~> 1.3.4)
|
||||||
awesome_print (~> 1.2.0)
|
awesome_print (~> 1.2.0)
|
||||||
|
babosa (~> 1.0.2)
|
||||||
benchmark-ips
|
benchmark-ips
|
||||||
better_errors (~> 1.0.1)
|
better_errors (~> 1.0.1)
|
||||||
binding_of_caller (~> 0.7.2)
|
binding_of_caller (~> 0.7.2)
|
||||||
|
@ -802,6 +827,7 @@ DEPENDENCIES
|
||||||
brakeman (= 3.0.1)
|
brakeman (= 3.0.1)
|
||||||
browser (~> 1.0.0)
|
browser (~> 1.0.0)
|
||||||
bullet
|
bullet
|
||||||
|
bundler-audit
|
||||||
byebug
|
byebug
|
||||||
cal-heatmap-rails (~> 0.0.1)
|
cal-heatmap-rails (~> 0.0.1)
|
||||||
capybara (~> 2.4.0)
|
capybara (~> 2.4.0)
|
||||||
|
@ -809,22 +835,20 @@ DEPENDENCIES
|
||||||
carrierwave (~> 0.9.0)
|
carrierwave (~> 0.9.0)
|
||||||
charlock_holmes (~> 0.7.3)
|
charlock_holmes (~> 0.7.3)
|
||||||
coffee-rails (~> 4.1.0)
|
coffee-rails (~> 4.1.0)
|
||||||
colored (~> 1.2)
|
colorize (~> 0.7.0)
|
||||||
colorize (~> 0.5.8)
|
|
||||||
coveralls (~> 0.8.2)
|
coveralls (~> 0.8.2)
|
||||||
creole (~> 0.3.6)
|
creole (~> 0.5.0)
|
||||||
d3_rails (~> 3.5.5)
|
d3_rails (~> 3.5.5)
|
||||||
database_cleaner (~> 1.4.0)
|
database_cleaner (~> 1.4.0)
|
||||||
default_value_for (~> 3.0.0)
|
default_value_for (~> 3.0.0)
|
||||||
devise (~> 3.5.2)
|
devise (~> 3.5.3)
|
||||||
devise-async (~> 0.9.0)
|
devise-async (~> 0.9.0)
|
||||||
devise-two-factor (~> 2.0.0)
|
devise-two-factor (~> 2.0.0)
|
||||||
diffy (~> 3.0.3)
|
diffy (~> 3.0.3)
|
||||||
doorkeeper (~> 2.1.3)
|
doorkeeper (~> 2.2.0)
|
||||||
dropzonejs-rails (~> 0.7.1)
|
dropzonejs-rails (~> 0.7.1)
|
||||||
email_reply_parser (~> 0.5.8)
|
email_reply_parser (~> 0.5.8)
|
||||||
email_spec (~> 1.6.0)
|
email_spec (~> 1.6.0)
|
||||||
enumerize (~> 0.7.0)
|
|
||||||
factory_girl_rails (~> 4.3.0)
|
factory_girl_rails (~> 4.3.0)
|
||||||
ffaker (~> 2.0.0)
|
ffaker (~> 2.0.0)
|
||||||
flay
|
flay
|
||||||
|
@ -837,12 +861,12 @@ DEPENDENCIES
|
||||||
github-linguist (~> 4.7.0)
|
github-linguist (~> 4.7.0)
|
||||||
github-markup (~> 1.3.1)
|
github-markup (~> 1.3.1)
|
||||||
gitlab-flowdock-git-hook (~> 1.0.1)
|
gitlab-flowdock-git-hook (~> 1.0.1)
|
||||||
gitlab_emoji (~> 0.1)
|
gitlab_emoji (~> 0.2.0)
|
||||||
gitlab_git (~> 7.2.20)
|
gitlab_git (~> 7.2.20)
|
||||||
gitlab_meta (= 7.0)
|
gitlab_meta (= 7.0)
|
||||||
gitlab_omniauth-ldap (~> 1.2.1)
|
gitlab_omniauth-ldap (~> 1.2.1)
|
||||||
gollum-lib (~> 4.0.2)
|
gollum-lib (~> 4.1.0)
|
||||||
gon (~> 5.0.0)
|
gon (~> 6.0.1)
|
||||||
grape (~> 0.13.0)
|
grape (~> 0.13.0)
|
||||||
grape-entity (~> 0.4.2)
|
grape-entity (~> 0.4.2)
|
||||||
haml-rails (~> 0.9.0)
|
haml-rails (~> 0.9.0)
|
||||||
|
@ -852,7 +876,7 @@ DEPENDENCIES
|
||||||
jquery-atwho-rails (~> 1.3.2)
|
jquery-atwho-rails (~> 1.3.2)
|
||||||
jquery-rails (~> 3.1.3)
|
jquery-rails (~> 3.1.3)
|
||||||
jquery-scrollto-rails (~> 1.4.3)
|
jquery-scrollto-rails (~> 1.4.3)
|
||||||
jquery-turbolinks (~> 2.0.1)
|
jquery-turbolinks (~> 2.1.0)
|
||||||
jquery-ui-rails (~> 4.2.1)
|
jquery-ui-rails (~> 4.2.1)
|
||||||
kaminari (~> 0.16.3)
|
kaminari (~> 0.16.3)
|
||||||
letter_opener (~> 1.1.2)
|
letter_opener (~> 1.1.2)
|
||||||
|
@ -861,8 +885,10 @@ DEPENDENCIES
|
||||||
mousetrap-rails (~> 1.4.6)
|
mousetrap-rails (~> 1.4.6)
|
||||||
mysql2 (~> 0.3.16)
|
mysql2 (~> 0.3.16)
|
||||||
nested_form (~> 0.3.2)
|
nested_form (~> 0.3.2)
|
||||||
|
net-ssh (~> 3.0.1)
|
||||||
newrelic-grape
|
newrelic-grape
|
||||||
newrelic_rpm (~> 3.9.4.245)
|
newrelic_rpm (~> 3.9.4.245)
|
||||||
|
nokogiri (= 1.6.7.1)
|
||||||
nprogress-rails (~> 0.1.6.7)
|
nprogress-rails (~> 0.1.6.7)
|
||||||
oauth2 (~> 1.0.0)
|
oauth2 (~> 1.0.0)
|
||||||
octokit (~> 3.7.0)
|
octokit (~> 3.7.0)
|
||||||
|
@ -880,23 +906,27 @@ DEPENDENCIES
|
||||||
org-ruby (~> 0.9.12)
|
org-ruby (~> 0.9.12)
|
||||||
paranoia (~> 2.0)
|
paranoia (~> 2.0)
|
||||||
pg (~> 0.18.2)
|
pg (~> 0.18.2)
|
||||||
poltergeist (~> 1.6.0)
|
poltergeist (~> 1.8.1)
|
||||||
pry-rails
|
pry-rails
|
||||||
quiet_assets (~> 1.0.2)
|
quiet_assets (~> 1.0.2)
|
||||||
rack-attack (~> 4.3.0)
|
rack-attack (~> 4.3.1)
|
||||||
rack-cors (~> 0.4.0)
|
rack-cors (~> 0.4.0)
|
||||||
rack-oauth2 (~> 1.0.5)
|
rack-oauth2 (~> 1.2.1)
|
||||||
rails (= 4.1.12)
|
rails (= 4.2.4)
|
||||||
|
rails-deprecated_sanitizer (~> 1.0.3)
|
||||||
raphael-rails (~> 2.1.2)
|
raphael-rails (~> 2.1.2)
|
||||||
rblineprof
|
rblineprof
|
||||||
rdoc (~> 3.6)
|
rdoc (~> 3.6)
|
||||||
redcarpet (~> 3.3.3)
|
redcarpet (~> 3.3.3)
|
||||||
|
redis-namespace
|
||||||
redis-rails (~> 4.0.0)
|
redis-rails (~> 4.0.0)
|
||||||
request_store (~> 1.2.0)
|
request_store (~> 1.2.0)
|
||||||
rerun (~> 0.10.0)
|
rerun (~> 0.11.0)
|
||||||
|
responders (~> 2.0)
|
||||||
|
rouge (~> 1.10.1)
|
||||||
rqrcode-rails3 (~> 0.1.7)
|
rqrcode-rails3 (~> 0.1.7)
|
||||||
rspec-rails (~> 3.3.0)
|
rspec-rails (~> 3.3.0)
|
||||||
rubocop (~> 0.28.0)
|
rubocop (~> 0.35.0)
|
||||||
ruby-fogbugz (~> 0.2.1)
|
ruby-fogbugz (~> 0.2.1)
|
||||||
sanitize (~> 2.0)
|
sanitize (~> 2.0)
|
||||||
sass-rails (~> 4.0.5)
|
sass-rails (~> 4.0.5)
|
||||||
|
@ -906,8 +936,8 @@ DEPENDENCIES
|
||||||
settingslogic (~> 2.0.9)
|
settingslogic (~> 2.0.9)
|
||||||
sham_rack
|
sham_rack
|
||||||
shoulda-matchers (~> 2.8.0)
|
shoulda-matchers (~> 2.8.0)
|
||||||
sidekiq (= 3.3.0)
|
sidekiq (~> 4.0)
|
||||||
sidetiq (~> 0.6.3)
|
sidekiq-cron (~> 0.4.0)
|
||||||
simplecov (~> 0.10.0)
|
simplecov (~> 0.10.0)
|
||||||
sinatra (~> 1.4.4)
|
sinatra (~> 1.4.4)
|
||||||
six (~> 0.2.0)
|
six (~> 0.2.0)
|
||||||
|
@ -923,7 +953,7 @@ DEPENDENCIES
|
||||||
task_list (~> 1.0.2)
|
task_list (~> 1.0.2)
|
||||||
teaspoon (~> 1.0.0)
|
teaspoon (~> 1.0.0)
|
||||||
teaspoon-jasmine (~> 2.2.0)
|
teaspoon-jasmine (~> 2.2.0)
|
||||||
test_after_commit (~> 0.2.2)
|
test_after_commit (~> 0.4.2)
|
||||||
thin (~> 1.6.1)
|
thin (~> 1.6.1)
|
||||||
tinder (~> 1.10.0)
|
tinder (~> 1.10.0)
|
||||||
turbolinks (~> 2.5.0)
|
turbolinks (~> 2.5.0)
|
||||||
|
@ -934,6 +964,7 @@ DEPENDENCIES
|
||||||
unicorn-worker-killer (~> 0.4.2)
|
unicorn-worker-killer (~> 0.4.2)
|
||||||
version_sorter (~> 2.0.0)
|
version_sorter (~> 2.0.0)
|
||||||
virtus (~> 1.0.1)
|
virtus (~> 1.0.1)
|
||||||
|
web-console (~> 2.0)
|
||||||
webmock (~> 1.21.0)
|
webmock (~> 1.21.0)
|
||||||
wikicloth (= 0.8.1)
|
wikicloth (= 0.8.1)
|
||||||
|
|
||||||
|
|
26
PROCESS.md
26
PROCESS.md
|
@ -8,7 +8,7 @@ Below we describe the contributing process to GitLab for two reasons. So that co
|
||||||
|
|
||||||
### Issue team
|
### Issue team
|
||||||
- Looks for issues without [workflow labels](#how-we-handle-issues) and triages issue
|
- Looks for issues without [workflow labels](#how-we-handle-issues) and triages issue
|
||||||
- Closes invalid issues with a comment (duplicates, [feature requests](#feature-requests), [fixed in newer version](#issue-fixed-in-newer-version), [issue report for old version](#issue-report-for-old-version), not a problem in GitLab, etc.)
|
- Closes invalid issues with a comment (duplicates, [fixed in newer version](#issue-fixed-in-newer-version), [issue report for old version](#issue-report-for-old-version), not a problem in GitLab, etc.)
|
||||||
- Asks for feedback from issue reporter ([invalid issue reports](#improperly-formatted-issue), [format code](#code-format), etc.)
|
- Asks for feedback from issue reporter ([invalid issue reports](#improperly-formatted-issue), [format code](#code-format), etc.)
|
||||||
- Monitors all issues for feedback (but especially ones commented on since automatically watching them)
|
- Monitors all issues for feedback (but especially ones commented on since automatically watching them)
|
||||||
- Closes issues with no feedback from the reporter for two weeks
|
- Closes issues with no feedback from the reporter for two weeks
|
||||||
|
@ -34,13 +34,21 @@ The most important thing is making sure valid issues receive feedback from the d
|
||||||
|
|
||||||
## Workflow labels
|
## Workflow labels
|
||||||
|
|
||||||
Workflow labels are purposely not very detailed since that would be hard to keep updated as you would need to re-evaluate them after every comment. We optionally use functional labels on demand when want to group related issues to get an overview (for example all issues related to RVM, to tackle them in one go) and to add details to the issue.
|
Workflow labels are purposely not very detailed since that would be hard to keep updated as you would need to re-evaluate them after every comment. We optionally use functional labels on demand when want to group related issues to get an overview (for example all issues related to RVM, to tackle them in one go) and to add details to the issue.
|
||||||
|
|
||||||
- *Awaiting feedback*: Feedback pending from the reporter
|
- *Awaiting feedback*: Feedback pending from the reporter
|
||||||
- *Awaiting confirmation of fix*: The issue should already be solved in **master** (generally you can avoid this workflow item and just close the issue right away)
|
- *Awaiting confirmation of fix*: The issue should already be solved in **master** (generally you can avoid this workflow item and just close the issue right away)
|
||||||
- *Attached MR*: There is a MR attached and the discussion should happen there
|
- *Attached MR*: There is a MR attached and the discussion should happen there
|
||||||
- We need to let issues stay in sync with the MR's. We can do this with a "Closing #XXXX" or "Fixes #XXXX" comment in the MR. We can't close the issue when there is a merge request because sometimes a MR is not good and we just close the MR, then the issue must stay.
|
- We need to let issues stay in sync with the MR's. We can do this with a "Closing #XXXX" or "Fixes #XXXX" comment in the MR. We can't close the issue when there is a merge request because sometimes a MR is not good and we just close the MR, then the issue must stay.
|
||||||
- *Awaiting developer action/feedback*: Issue needs to be fixed or clarified by a developer
|
- *Developer*: needs help from a developer
|
||||||
|
- *UX* needs needs help from a UX designer
|
||||||
|
- *Frontend* needs help from a Front-end engineer
|
||||||
|
- *Graphics* needs help from a Graphics designer
|
||||||
|
- *up-for-grabs* is an issue suitable for first-time contributors, of reasonable difficulty and size. Not exclusive with other labels.
|
||||||
|
- *feature proposal* is a proposal for a new feature for GitLab. People are encouraged to vote
|
||||||
|
in support or comment for further detail. Do not use `feature request`.
|
||||||
|
|
||||||
|
Example workflow: when a UX designer provided a design but it needs frontend work they remove the UX label and add the frontend label.
|
||||||
|
|
||||||
## Functional labels
|
## Functional labels
|
||||||
|
|
||||||
|
@ -56,7 +64,6 @@ If an issue is complex and needs the attention of a specific person, assignment
|
||||||
- Bright orange `#eb6420`: workflow labels for core team members (attached MR, awaiting developer action/feedback)
|
- Bright orange `#eb6420`: workflow labels for core team members (attached MR, awaiting developer action/feedback)
|
||||||
- Light blue `#82C5FF`: functional labels
|
- Light blue `#82C5FF`: functional labels
|
||||||
- Green labels `#009800`: issues that can generally be ignored. For example, issues given the following labels normally can be closed immediately:
|
- Green labels `#009800`: issues that can generally be ignored. For example, issues given the following labels normally can be closed immediately:
|
||||||
- Feature request (see copy & paste response: [Feature requests](#feature-requests))
|
|
||||||
- Support (see copy & paste response: [Support requests and configuration questions](#support-requests-and-configuration-questions)
|
- Support (see copy & paste response: [Support requests and configuration questions](#support-requests-and-configuration-questions)
|
||||||
|
|
||||||
## Be kind
|
## Be kind
|
||||||
|
@ -69,10 +76,6 @@ Be kind to people trying to contribute. Be aware that people may be a non-native
|
||||||
|
|
||||||
Thanks for the issue report. Please reformat your issue to conform to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
|
Thanks for the issue report. Please reformat your issue to conform to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
|
||||||
|
|
||||||
### Feature requests
|
|
||||||
|
|
||||||
Thank you for your interest in improving GitLab. We don't use the issue tracker for feature requests. Things that are wrong but are not a regression compared to older versions of GitLab are considered feature requests and not issues. Please use the \[feature request forum\]\(http://feedback.gitlab.com/) for this purpose or create a merge request implementing this feature. Have a look at the \[contribution guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md) for more information.
|
|
||||||
|
|
||||||
### Issue report for old version
|
### Issue report for old version
|
||||||
|
|
||||||
Thanks for the issue report but we only support issues for the latest stable version of GitLab. I'm closing this issue but if you still experience this problem in the latest stable version, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
|
Thanks for the issue report but we only support issues for the latest stable version of GitLab. I'm closing this issue but if you still experience this problem in the latest stable version, please open a new issue (but also reference the old issue(s)). Make sure to also include the necessary debugging information conforming to the issue tracker guidelines found in our \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines).
|
||||||
|
@ -107,7 +110,12 @@ This merge request has been closed because a request for more information has no
|
||||||
|
|
||||||
### Accepting merge requests
|
### Accepting merge requests
|
||||||
|
|
||||||
Is there a request on [the feature request forum](http://feedback.gitlab.com/forums/176466-general) that is similar to this? If so, can you make a comment with a link to it? Please be aware that new functionality that is not marked [accepting merge/pull requests](http://feedback.gitlab.com/forums/176466-general/status/796455) on the forum might not make it into GitLab. You might be asked to make changes and even after implementing them your feature might still be declined. If you want to reduce the chance of this happening please have a discussion in the forum first.
|
Is there an issue on the [issue tracker](https://gitlab.com/gitlab-org/gitlab-ce/issues)
|
||||||
|
that is similar to this?
|
||||||
|
Could you please link it here?
|
||||||
|
Please be aware that new functionality that is not marked
|
||||||
|
[accepting merge requests](https://gitlab.com/gitlab-org/gitlab-ce/issues?milestone_id=&scope=all&sort=created_desc&state=opened&utf8=%E2%9C%93&assignee_id=&author_id=&milestone_title=&label_name=Accepting+Merge+Requests)
|
||||||
|
might not make it into GitLab.
|
||||||
|
|
||||||
### Only accepting merge requests with green tests
|
### Only accepting merge requests with green tests
|
||||||
|
|
||||||
|
|
6
Procfile
6
Procfile
|
@ -1,3 +1,7 @@
|
||||||
|
# For DEVELOPMENT only. Production uses Runit in
|
||||||
|
# https://gitlab.com/gitlab-org/omnibus-gitlab or the init scripts in
|
||||||
|
# lib/support/init.d, which call scripts in bin/ .
|
||||||
|
#
|
||||||
web: bundle exec unicorn_rails -p ${PORT:="3000"} -E ${RAILS_ENV:="development"} -c ${UNICORN_CONFIG:="config/unicorn.rb"}
|
web: bundle exec unicorn_rails -p ${PORT:="3000"} -E ${RAILS_ENV:="development"} -c ${UNICORN_CONFIG:="config/unicorn.rb"}
|
||||||
worker: bundle exec sidekiq -q post_receive -q mailer -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q incoming_email -q runner -q common -q default
|
worker: bundle exec sidekiq -q post_receive -q mailers -q archive_repo -q system_hook -q project_web_hook -q gitlab_shell -q incoming_email -q runner -q common -q default
|
||||||
# mail_room: bundle exec mail_room -q -c config/mail_room.yml
|
# mail_room: bundle exec mail_room -q -c config/mail_room.yml
|
||||||
|
|
|
@ -27,8 +27,6 @@ There are two editions of GitLab:
|
||||||
- GitLab Community Edition (CE) is available freely under the MIT Expat license.
|
- 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/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/).
|
||||||
|
|
||||||
Included with the GitLab Omnibus Packages is [GitLab CI](https://about.gitlab.com/gitlab-ci/) that can easily build, test and deploy code.
|
|
||||||
|
|
||||||
## Website
|
## Website
|
||||||
|
|
||||||
On [about.gitlab.com](https://about.gitlab.com/) you can find more information about:
|
On [about.gitlab.com](https://about.gitlab.com/) you can find more information about:
|
||||||
|
@ -71,7 +69,7 @@ GitLab is a Ruby on Rails application that runs on the following software:
|
||||||
- Ubuntu/Debian/CentOS/RHEL
|
- Ubuntu/Debian/CentOS/RHEL
|
||||||
- Ruby (MRI) 2.1
|
- Ruby (MRI) 2.1
|
||||||
- Git 1.7.10+
|
- Git 1.7.10+
|
||||||
- Redis 2.4+
|
- Redis 2.8+
|
||||||
- MySQL or PostgreSQL
|
- MySQL or PostgreSQL
|
||||||
|
|
||||||
For more information please see the [architecture documentation](http://doc.gitlab.com/ce/development/architecture.html).
|
For more information please see the [architecture documentation](http://doc.gitlab.com/ce/development/architecture.html).
|
||||||
|
@ -82,7 +80,7 @@ There are a lot of [third-party applications integrating with GitLab](https://ab
|
||||||
|
|
||||||
## GitLab release cycle
|
## GitLab release cycle
|
||||||
|
|
||||||
Since 2011 a minor or major version of GitLab is released on the 22nd of every month. Patch and security releases are published when needed. New features are detailed on the [blog](https://about.gitlab.com/blog/) and in the [changelog](CHANGELOG). For more information about the release process see the [release documentation](https://gitlab.com/gitlab-org/gitlab-ce/tree/master/doc/release). Features that will likely be in the next releases can be found on the [feature request forum](http://feedback.gitlab.com/forums/176466-general) with the status [started](http://feedback.gitlab.com/forums/176466-general/status/796456) and [completed](http://feedback.gitlab.com/forums/176466-general/status/796457).
|
For more information about the release process see the [release documentation](http://doc.gitlab.com/ce/release/).
|
||||||
|
|
||||||
## Upgrading
|
## Upgrading
|
||||||
|
|
||||||
|
|
2
VERSION
2
VERSION
|
@ -1 +1 @@
|
||||||
8.2.1
|
8.3.0
|
Binary file not shown.
Before Width: | Height: | Size: 726 B After Width: | Height: | Size: 1.1 KiB |
|
@ -2,6 +2,8 @@
|
||||||
groups_path: "/api/:version/groups.json"
|
groups_path: "/api/:version/groups.json"
|
||||||
group_path: "/api/:version/groups/:id.json"
|
group_path: "/api/:version/groups/:id.json"
|
||||||
namespaces_path: "/api/:version/namespaces.json"
|
namespaces_path: "/api/:version/namespaces.json"
|
||||||
|
group_projects_path: "/api/:version/groups/:id/projects.json"
|
||||||
|
projects_path: "/api/:version/projects.json"
|
||||||
|
|
||||||
group: (group_id, callback) ->
|
group: (group_id, callback) ->
|
||||||
url = Api.buildUrl(Api.group_path)
|
url = Api.buildUrl(Api.group_path)
|
||||||
|
@ -44,6 +46,35 @@
|
||||||
).done (namespaces) ->
|
).done (namespaces) ->
|
||||||
callback(namespaces)
|
callback(namespaces)
|
||||||
|
|
||||||
|
# Return projects list. Filtered by query
|
||||||
|
projects: (query, callback) ->
|
||||||
|
url = Api.buildUrl(Api.projects_path)
|
||||||
|
|
||||||
|
$.ajax(
|
||||||
|
url: url
|
||||||
|
data:
|
||||||
|
private_token: gon.api_token
|
||||||
|
search: query
|
||||||
|
per_page: 20
|
||||||
|
dataType: "json"
|
||||||
|
).done (projects) ->
|
||||||
|
callback(projects)
|
||||||
|
|
||||||
|
# Return group projects list. Filtered by query
|
||||||
|
groupProjects: (group_id, query, callback) ->
|
||||||
|
url = Api.buildUrl(Api.group_projects_path)
|
||||||
|
url = url.replace(':id', group_id)
|
||||||
|
|
||||||
|
$.ajax(
|
||||||
|
url: url
|
||||||
|
data:
|
||||||
|
private_token: gon.api_token
|
||||||
|
search: query
|
||||||
|
per_page: 20
|
||||||
|
dataType: "json"
|
||||||
|
).done (projects) ->
|
||||||
|
callback(projects)
|
||||||
|
|
||||||
buildUrl: (url) ->
|
buildUrl: (url) ->
|
||||||
url = gon.relative_url_root + url if gon.relative_url_root?
|
url = gon.relative_url_root + url if gon.relative_url_root?
|
||||||
return url.replace(':version', gon.api_version)
|
return url.replace(':version', gon.api_version)
|
||||||
|
|
|
@ -135,17 +135,25 @@ $ ->
|
||||||
), 1
|
), 1
|
||||||
|
|
||||||
# Initialize tooltips
|
# Initialize tooltips
|
||||||
$('body').tooltip({
|
$('body').tooltip(
|
||||||
selector: '.has_tooltip, [data-toggle="tooltip"], .page-sidebar-collapsed .nav-sidebar a'
|
selector: '.has_tooltip, [data-toggle="tooltip"]'
|
||||||
placement: (_, el) ->
|
placement: (_, el) ->
|
||||||
$el = $(el)
|
$el = $(el)
|
||||||
if $el.attr('id') == 'js-shortcuts-home'
|
$el.data('placement') || 'bottom'
|
||||||
# Place the logo tooltip on the right when collapsed, bottom when expanded
|
)
|
||||||
$el.parents('header').hasClass('header-collapsed') and 'right' or 'bottom'
|
|
||||||
else
|
$('.header-logo .home').tooltip(
|
||||||
# Otherwise use the data-placement attribute, or 'bottom' if undefined
|
placement: (_, el) ->
|
||||||
$el.data('placement') or 'bottom'
|
$el = $(el)
|
||||||
})
|
if $('.page-with-sidebar').hasClass('page-sidebar-collapsed') then 'right' else 'bottom'
|
||||||
|
container: 'body'
|
||||||
|
)
|
||||||
|
|
||||||
|
$('.page-with-sidebar').tooltip(
|
||||||
|
selector: '.sidebar-collapsed .nav-sidebar a, .sidebar-collapsed a.sidebar-user'
|
||||||
|
placement: 'right'
|
||||||
|
container: 'body'
|
||||||
|
)
|
||||||
|
|
||||||
# Form submitter
|
# Form submitter
|
||||||
$('.trigger-submit').on 'change', ->
|
$('.trigger-submit').on 'change', ->
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
class @AwardsHandler
|
class @AwardsHandler
|
||||||
constructor: (@post_emoji_url, @noteable_type, @noteable_id) ->
|
constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) ->
|
||||||
|
|
||||||
addAward: (emoji) ->
|
addAward: (emoji) ->
|
||||||
|
emoji = @normilizeEmojiName(emoji)
|
||||||
@postEmoji emoji, =>
|
@postEmoji emoji, =>
|
||||||
@addAwardToEmojiBar(emoji)
|
@addAwardToEmojiBar(emoji)
|
||||||
|
|
||||||
addAwardToEmojiBar: (emoji, custom_path = '') ->
|
addAwardToEmojiBar: (emoji, custom_path = '') ->
|
||||||
|
emoji = @normilizeEmojiName(emoji)
|
||||||
if @exist(emoji)
|
if @exist(emoji)
|
||||||
if @isActive(emoji)
|
if @isActive(emoji)
|
||||||
@decrementCounter(emoji)
|
@decrementCounter(emoji)
|
||||||
|
@ -88,4 +90,12 @@ class @AwardsHandler
|
||||||
callback.call()
|
callback.call()
|
||||||
|
|
||||||
findEmojiIcon: (emoji) ->
|
findEmojiIcon: (emoji) ->
|
||||||
$(".icon[data-emoji='" + emoji + "']")
|
$(".icon[data-emoji='" + emoji + "']")
|
||||||
|
|
||||||
|
scrollToAwards: ->
|
||||||
|
$('body, html').animate({
|
||||||
|
scrollTop: $('.awards').offset().top - 80
|
||||||
|
}, 200)
|
||||||
|
|
||||||
|
normilizeEmojiName: (emoji) ->
|
||||||
|
@aliases[emoji] || emoji
|
||||||
|
|
|
@ -1,32 +1,37 @@
|
||||||
#= require clipboard
|
#= require clipboard
|
||||||
|
|
||||||
|
genericSuccess = (e) ->
|
||||||
|
showTooltip(e.trigger, 'Copied!')
|
||||||
|
|
||||||
|
# Clear the selection and blur the trigger so it loses its border
|
||||||
|
e.clearSelection()
|
||||||
|
$(e.trigger).blur()
|
||||||
|
|
||||||
|
# Safari doesn't support `execCommand`, so instead we inform the user to
|
||||||
|
# copy manually.
|
||||||
|
#
|
||||||
|
# See http://clipboardjs.com/#browser-support
|
||||||
|
genericError = (e) ->
|
||||||
|
if /Mac/i.test(navigator.userAgent)
|
||||||
|
key = '⌘' # Command
|
||||||
|
else
|
||||||
|
key = 'Ctrl'
|
||||||
|
|
||||||
|
showTooltip(e.trigger, "Press #{key}-C to copy")
|
||||||
|
|
||||||
|
showTooltip = (target, title) ->
|
||||||
|
$(target).
|
||||||
|
tooltip(
|
||||||
|
container: 'body'
|
||||||
|
html: 'true'
|
||||||
|
placement: 'auto bottom'
|
||||||
|
title: title
|
||||||
|
trigger: 'manual'
|
||||||
|
).
|
||||||
|
tooltip('show').
|
||||||
|
one('mouseleave', -> $(this).tooltip('hide'))
|
||||||
|
|
||||||
$ ->
|
$ ->
|
||||||
clipboard = new Clipboard '.js-clipboard-trigger',
|
clipboard = new Clipboard '[data-clipboard-target], [data-clipboard-text]'
|
||||||
text: (trigger) ->
|
clipboard.on 'success', genericSuccess
|
||||||
$target = $(trigger.nextElementSibling || trigger.previousElementSibling)
|
clipboard.on 'error', genericError
|
||||||
$target.data('clipboard-text') || $target.text().trim()
|
|
||||||
|
|
||||||
clipboard.on 'success', (e) ->
|
|
||||||
$(e.trigger).
|
|
||||||
tooltip(trigger: 'manual', placement: 'auto bottom', title: 'Copied!').
|
|
||||||
tooltip('show').
|
|
||||||
one('mouseleave', -> $(this).tooltip('hide'))
|
|
||||||
|
|
||||||
# Clear the selection and blur the trigger so it loses its border
|
|
||||||
e.clearSelection()
|
|
||||||
$(e.trigger).blur()
|
|
||||||
|
|
||||||
# Safari doesn't support `execCommand`, so instead we inform the user to
|
|
||||||
# copy manually.
|
|
||||||
#
|
|
||||||
# See http://clipboardjs.com/#browser-support
|
|
||||||
clipboard.on 'error', (e) ->
|
|
||||||
if /Mac/i.test(navigator.userAgent)
|
|
||||||
title = "Press ⌘-C to copy"
|
|
||||||
else
|
|
||||||
title = "Press Ctrl-C to copy"
|
|
||||||
|
|
||||||
$(e.trigger).
|
|
||||||
tooltip(trigger: 'manual', placement: 'auto bottom', html: true, title: title).
|
|
||||||
tooltip('show').
|
|
||||||
one('mouseleave', -> $(this).tooltip('hide'))
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ class Dispatcher
|
||||||
when 'projects:project_members:index'
|
when 'projects:project_members:index'
|
||||||
new ProjectMembers()
|
new ProjectMembers()
|
||||||
new UsersSelect()
|
new UsersSelect()
|
||||||
when 'groups:new', 'groups:edit', 'admin:groups:edit'
|
when 'groups:new', 'groups:edit', 'admin:groups:edit', 'admin:groups:new'
|
||||||
new GroupAvatar()
|
new GroupAvatar()
|
||||||
when 'projects:tree:show'
|
when 'projects:tree:show'
|
||||||
new TreeView()
|
new TreeView()
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#= require markdown_preview
|
||||||
|
|
||||||
class @DropzoneInput
|
class @DropzoneInput
|
||||||
constructor: (form) ->
|
constructor: (form) ->
|
||||||
Dropzone.autoDiscover = false
|
Dropzone.autoDiscover = false
|
||||||
|
@ -11,17 +13,14 @@ class @DropzoneInput
|
||||||
uploadProgress = $("<div class=\"div-dropzone-progress\"></div>")
|
uploadProgress = $("<div class=\"div-dropzone-progress\"></div>")
|
||||||
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
btnAlert = "<button type=\"button\"" + alertAttr + ">×</button>"
|
||||||
project_uploads_path = window.project_uploads_path or null
|
project_uploads_path = window.project_uploads_path or null
|
||||||
markdown_preview_path = window.markdown_preview_path or null
|
|
||||||
max_file_size = gon.max_file_size or 10
|
max_file_size = gon.max_file_size or 10
|
||||||
|
|
||||||
form_textarea = $(form).find("textarea.markdown-area")
|
form_textarea = $(form).find("textarea.markdown-area")
|
||||||
form_textarea.wrap "<div class=\"div-dropzone\"></div>"
|
form_textarea.wrap "<div class=\"div-dropzone\"></div>"
|
||||||
form_textarea.on 'paste', (event) =>
|
form_textarea.on 'paste', (event) =>
|
||||||
handlePaste(event)
|
handlePaste(event)
|
||||||
form_textarea.on "input", ->
|
|
||||||
hideReferencedUsers()
|
$(form).setupMarkdownPreview()
|
||||||
form_textarea.on "blur", ->
|
|
||||||
renderMarkdown()
|
|
||||||
|
|
||||||
form_dropzone = $(form).find('.div-dropzone')
|
form_dropzone = $(form).find('.div-dropzone')
|
||||||
form_dropzone.parent().addClass "div-dropzone-wrapper"
|
form_dropzone.parent().addClass "div-dropzone-wrapper"
|
||||||
|
@ -34,42 +33,6 @@ class @DropzoneInput
|
||||||
"opacity": 0
|
"opacity": 0
|
||||||
"display": "none"
|
"display": "none"
|
||||||
|
|
||||||
# Preview button
|
|
||||||
$(document).off "click", ".js-md-preview-button"
|
|
||||||
$(document).on "click", ".js-md-preview-button", (e) ->
|
|
||||||
###
|
|
||||||
Shows the Markdown preview.
|
|
||||||
|
|
||||||
Lets the server render GFM into Html and displays it.
|
|
||||||
###
|
|
||||||
e.preventDefault()
|
|
||||||
form = $(this).closest("form")
|
|
||||||
# toggle tabs
|
|
||||||
form.find(".js-md-write-button").parent().removeClass "active"
|
|
||||||
form.find(".js-md-preview-button").parent().addClass "active"
|
|
||||||
|
|
||||||
# toggle content
|
|
||||||
form.find(".md-write-holder").hide()
|
|
||||||
form.find(".md-preview-holder").show()
|
|
||||||
|
|
||||||
renderMarkdown()
|
|
||||||
|
|
||||||
# Write button
|
|
||||||
$(document).off "click", ".js-md-write-button"
|
|
||||||
$(document).on "click", ".js-md-write-button", (e) ->
|
|
||||||
###
|
|
||||||
Shows the Markdown textarea.
|
|
||||||
###
|
|
||||||
e.preventDefault()
|
|
||||||
form = $(this).closest("form")
|
|
||||||
# toggle tabs
|
|
||||||
form.find(".js-md-write-button").parent().addClass "active"
|
|
||||||
form.find(".js-md-preview-button").parent().removeClass "active"
|
|
||||||
|
|
||||||
# toggle content
|
|
||||||
form.find(".md-write-holder").show()
|
|
||||||
form.find(".md-preview-holder").hide()
|
|
||||||
|
|
||||||
dropzone = form_dropzone.dropzone(
|
dropzone = form_dropzone.dropzone(
|
||||||
url: project_uploads_path
|
url: project_uploads_path
|
||||||
dictDefaultMessage: ""
|
dictDefaultMessage: ""
|
||||||
|
@ -136,41 +99,6 @@ class @DropzoneInput
|
||||||
|
|
||||||
child = $(dropzone[0]).children("textarea")
|
child = $(dropzone[0]).children("textarea")
|
||||||
|
|
||||||
hideReferencedUsers = ->
|
|
||||||
referencedUsers = form.find(".referenced-users")
|
|
||||||
referencedUsers.hide()
|
|
||||||
|
|
||||||
renderReferencedUsers = (users) ->
|
|
||||||
referencedUsers = form.find(".referenced-users")
|
|
||||||
|
|
||||||
if referencedUsers.length
|
|
||||||
if users.length >= 10
|
|
||||||
referencedUsers.show()
|
|
||||||
referencedUsers.find(".js-referenced-users-count").text users.length
|
|
||||||
else
|
|
||||||
referencedUsers.hide()
|
|
||||||
|
|
||||||
renderMarkdown = ->
|
|
||||||
preview = form.find(".js-md-preview")
|
|
||||||
mdText = form.find(".markdown-area").val()
|
|
||||||
if mdText.trim().length is 0
|
|
||||||
preview.text "Nothing to preview."
|
|
||||||
hideReferencedUsers()
|
|
||||||
else
|
|
||||||
preview.text "Loading..."
|
|
||||||
$.ajax(
|
|
||||||
type: "POST",
|
|
||||||
url: markdown_preview_path,
|
|
||||||
data: {
|
|
||||||
text: mdText
|
|
||||||
},
|
|
||||||
dataType: "json"
|
|
||||||
).success (data) ->
|
|
||||||
preview.html data.body
|
|
||||||
preview.syntaxHighlight()
|
|
||||||
|
|
||||||
renderReferencedUsers data.references.users
|
|
||||||
|
|
||||||
formatLink = (link) ->
|
formatLink = (link) ->
|
||||||
text = "[#{link.alt}](#{link.url})"
|
text = "[#{link.alt}](#{link.url})"
|
||||||
text = "!#{text}" if link.is_image
|
text = "!#{text}" if link.is_image
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
class @Flash
|
class @Flash
|
||||||
constructor: (message, type)->
|
constructor: (message, type)->
|
||||||
flash = $(".flash-container")
|
@flash = $(".flash-container")
|
||||||
flash.html("")
|
@flash.html("")
|
||||||
|
|
||||||
$('<div/>',
|
innerDiv = $('<div/>',
|
||||||
class: "flash-#{type}",
|
class: "flash-#{type}",
|
||||||
text: message
|
text: message
|
||||||
).appendTo(".flash-container")
|
)
|
||||||
|
innerDiv.appendTo(".flash-container")
|
||||||
|
|
||||||
flash.click -> $(@).fadeOut()
|
@flash.click -> $(@).fadeOut()
|
||||||
flash.show()
|
@flash.show()
|
||||||
|
|
||||||
|
pinTo: (selector) ->
|
||||||
|
@flash.detach().appendTo(selector)
|
||||||
|
|
|
@ -5,9 +5,9 @@ class @IssuableContext
|
||||||
new UsersSelect()
|
new UsersSelect()
|
||||||
$('select.select2').select2({width: 'resolve', dropdownAutoWidth: true})
|
$('select.select2').select2({width: 'resolve', dropdownAutoWidth: true})
|
||||||
|
|
||||||
$(".context .inline-update").on "change", "select", ->
|
$(".issuable-sidebar .inline-update").on "change", "select", ->
|
||||||
$(this).submit()
|
$(this).submit()
|
||||||
$(".context .inline-update").on "change", ".js-assignee", ->
|
$(".issuable-sidebar .inline-update").on "change", ".js-assignee", ->
|
||||||
$(this).submit()
|
$(this).submit()
|
||||||
|
|
||||||
$('.issuable-details').waitForImages ->
|
$('.issuable-details').waitForImages ->
|
||||||
|
@ -21,3 +21,9 @@ class @IssuableContext
|
||||||
@top = ($('.issuable-affix').offset().top - 70)
|
@top = ($('.issuable-affix').offset().top - 70)
|
||||||
bottom: ->
|
bottom: ->
|
||||||
@bottom = $('.footer').outerHeight(true)
|
@bottom = $('.footer').outerHeight(true)
|
||||||
|
|
||||||
|
$(".edit-link").click (e) ->
|
||||||
|
block = $(@).parents('.block')
|
||||||
|
block.find('.selectbox').show()
|
||||||
|
block.find('.value').hide()
|
||||||
|
block.find('.js-select2').select2("open")
|
||||||
|
|
|
@ -10,12 +10,12 @@ class @Issue
|
||||||
@initTaskList()
|
@initTaskList()
|
||||||
|
|
||||||
initTaskList: ->
|
initTaskList: ->
|
||||||
$('.issue-details .js-task-list-container').taskList('enable')
|
$('.detail-page-description .js-task-list-container').taskList('enable')
|
||||||
$(document).on 'tasklist:changed', '.issue-details .js-task-list-container', @updateTaskList
|
$(document).on 'tasklist:changed', '.detail-page-description .js-task-list-container', @updateTaskList
|
||||||
|
|
||||||
disableTaskList: ->
|
disableTaskList: ->
|
||||||
$('.issue-details .js-task-list-container').taskList('disable')
|
$('.detail-page-description .js-task-list-container').taskList('disable')
|
||||||
$(document).off 'tasklist:changed', '.issue-details .js-task-list-container'
|
$(document).off 'tasklist:changed', '.detail-page-description .js-task-list-container'
|
||||||
|
|
||||||
# TODO (rspeicher): Make the issue description inline-editable like a note so
|
# TODO (rspeicher): Make the issue description inline-editable like a note so
|
||||||
# that we can re-use its form here
|
# that we can re-use its form here
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
$('#filter_issue_search').val($('#issue_search').val())
|
$('#filter_issue_search').val($('#issue_search').val())
|
||||||
|
|
||||||
initSelects: ->
|
initSelects: ->
|
||||||
$("select#update_status").select2(width: 'resolve', dropdownAutoWidth: true)
|
$("select#update_state_event").select2(width: 'resolve', dropdownAutoWidth: true)
|
||||||
$("select#update_assignee_id").select2(width: 'resolve', dropdownAutoWidth: true)
|
$("select#update_assignee_id").select2(width: 'resolve', dropdownAutoWidth: true)
|
||||||
$("select#update_milestone_id").select2(width: 'resolve', dropdownAutoWidth: true)
|
$("select#update_milestone_id").select2(width: 'resolve', dropdownAutoWidth: true)
|
||||||
$("select#label_name").select2(width: 'resolve', dropdownAutoWidth: true)
|
$("select#label_name").select2(width: 'resolve', dropdownAutoWidth: true)
|
||||||
|
|
87
app/assets/javascripts/markdown_preview.js.coffee
Normal file
87
app/assets/javascripts/markdown_preview.js.coffee
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
# MarkdownPreview
|
||||||
|
#
|
||||||
|
# Handles toggling the "Write" and "Preview" tab clicks, rendering the preview,
|
||||||
|
# and showing a warning when more than `x` users are referenced.
|
||||||
|
#
|
||||||
|
class @MarkdownPreview
|
||||||
|
# Minimum number of users referenced before triggering a warning
|
||||||
|
referenceThreshold: 10
|
||||||
|
|
||||||
|
showPreview: (form) ->
|
||||||
|
preview = form.find('.js-md-preview')
|
||||||
|
mdText = form.find('textarea.markdown-area').val()
|
||||||
|
|
||||||
|
if mdText.trim().length == 0
|
||||||
|
preview.text('Nothing to preview.')
|
||||||
|
@hideReferencedUsers(form)
|
||||||
|
else
|
||||||
|
preview.text('Loading...')
|
||||||
|
@renderMarkdown mdText, (response) =>
|
||||||
|
preview.html(response.body)
|
||||||
|
preview.syntaxHighlight()
|
||||||
|
@renderReferencedUsers(response.references.users, form)
|
||||||
|
|
||||||
|
renderMarkdown: (text, success) ->
|
||||||
|
return unless window.markdown_preview_path
|
||||||
|
|
||||||
|
$.ajax
|
||||||
|
type: 'POST'
|
||||||
|
url: window.markdown_preview_path
|
||||||
|
data: { text: text }
|
||||||
|
dataType: 'json'
|
||||||
|
success: success
|
||||||
|
|
||||||
|
hideReferencedUsers: (form) ->
|
||||||
|
referencedUsers = form.find('.referenced-users')
|
||||||
|
referencedUsers.hide()
|
||||||
|
|
||||||
|
renderReferencedUsers: (users, form) ->
|
||||||
|
referencedUsers = form.find('.referenced-users')
|
||||||
|
|
||||||
|
if referencedUsers.length
|
||||||
|
if users.length >= @referenceThreshold
|
||||||
|
referencedUsers.show()
|
||||||
|
referencedUsers.find('.js-referenced-users-count').text(users.length)
|
||||||
|
else
|
||||||
|
referencedUsers.hide()
|
||||||
|
|
||||||
|
markdownPreview = new MarkdownPreview()
|
||||||
|
|
||||||
|
previewButtonSelector = '.js-md-preview-button'
|
||||||
|
writeButtonSelector = '.js-md-write-button'
|
||||||
|
|
||||||
|
$.fn.setupMarkdownPreview = ->
|
||||||
|
$form = $(this)
|
||||||
|
|
||||||
|
form_textarea = $form.find('textarea.markdown-area')
|
||||||
|
|
||||||
|
form_textarea.on 'input', -> markdownPreview.hideReferencedUsers($form)
|
||||||
|
form_textarea.on 'blur', -> markdownPreview.showPreview($form)
|
||||||
|
|
||||||
|
$(document).on 'click', previewButtonSelector, (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
$form = $(this).closest('form')
|
||||||
|
|
||||||
|
# toggle tabs
|
||||||
|
$form.find(writeButtonSelector).parent().removeClass('active')
|
||||||
|
$form.find(previewButtonSelector).parent().addClass('active')
|
||||||
|
|
||||||
|
# toggle content
|
||||||
|
$form.find('.md-write-holder').hide()
|
||||||
|
$form.find('.md-preview-holder').show()
|
||||||
|
|
||||||
|
markdownPreview.showPreview($form)
|
||||||
|
|
||||||
|
$(document).on 'click', writeButtonSelector, (e) ->
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
$form = $(this).closest('form')
|
||||||
|
|
||||||
|
# toggle tabs
|
||||||
|
$form.find(writeButtonSelector).parent().addClass('active')
|
||||||
|
$form.find(previewButtonSelector).parent().removeClass('active')
|
||||||
|
|
||||||
|
# toggle content
|
||||||
|
$form.find('.md-write-holder').show()
|
||||||
|
$form.find('.md-preview-holder').hide()
|
|
@ -40,12 +40,12 @@ class @MergeRequest
|
||||||
this.$('.all-commits').removeClass 'hide'
|
this.$('.all-commits').removeClass 'hide'
|
||||||
|
|
||||||
initTaskList: ->
|
initTaskList: ->
|
||||||
$('.merge-request-details .js-task-list-container').taskList('enable')
|
$('.detail-page-description .js-task-list-container').taskList('enable')
|
||||||
$(document).on 'tasklist:changed', '.merge-request-details .js-task-list-container', @updateTaskList
|
$(document).on 'tasklist:changed', '.detail-page-description .js-task-list-container', @updateTaskList
|
||||||
|
|
||||||
disableTaskList: ->
|
disableTaskList: ->
|
||||||
$('.merge-request-details .js-task-list-container').taskList('disable')
|
$('.detail-page-description .js-task-list-container').taskList('disable')
|
||||||
$(document).off 'tasklist:changed', '.merge-request-details .js-task-list-container'
|
$(document).off 'tasklist:changed', '.detail-page-description .js-task-list-container'
|
||||||
|
|
||||||
# TODO (rspeicher): Make the merge request description inline-editable like a
|
# TODO (rspeicher): Make the merge request description inline-editable like a
|
||||||
# note so that we can re-use its form here
|
# note so that we can re-use its form here
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
#
|
#
|
||||||
class @MergeRequestTabs
|
class @MergeRequestTabs
|
||||||
diffsLoaded: false
|
diffsLoaded: false
|
||||||
|
buildsLoaded: false
|
||||||
commitsLoaded: false
|
commitsLoaded: false
|
||||||
|
|
||||||
constructor: (@opts = {}) ->
|
constructor: (@opts = {}) ->
|
||||||
|
@ -54,6 +55,12 @@ class @MergeRequestTabs
|
||||||
|
|
||||||
bindEvents: ->
|
bindEvents: ->
|
||||||
$(document).on 'shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', @tabShown
|
$(document).on 'shown.bs.tab', '.merge-request-tabs a[data-toggle="tab"]', @tabShown
|
||||||
|
$(document).on 'click', '.js-show-tab', @showTab
|
||||||
|
|
||||||
|
showTab: (event) =>
|
||||||
|
event.preventDefault()
|
||||||
|
|
||||||
|
@activateTab $(event.target).data('action')
|
||||||
|
|
||||||
tabShown: (event) =>
|
tabShown: (event) =>
|
||||||
$target = $(event.target)
|
$target = $(event.target)
|
||||||
|
@ -63,12 +70,14 @@ class @MergeRequestTabs
|
||||||
@loadCommits($target.attr('href'))
|
@loadCommits($target.attr('href'))
|
||||||
else if action == 'diffs'
|
else if action == 'diffs'
|
||||||
@loadDiff($target.attr('href'))
|
@loadDiff($target.attr('href'))
|
||||||
|
else if action == 'builds'
|
||||||
|
@loadBuilds($target.attr('href'))
|
||||||
|
|
||||||
@setCurrentAction(action)
|
@setCurrentAction(action)
|
||||||
|
|
||||||
scrollToElement: (container) ->
|
scrollToElement: (container) ->
|
||||||
if window.location.hash
|
if window.location.hash
|
||||||
$el = $("#{container} #{window.location.hash}")
|
$el = $("div#{container} #{window.location.hash}")
|
||||||
$('body').scrollTo($el.offset().top) if $el.length
|
$('body').scrollTo($el.offset().top) if $el.length
|
||||||
|
|
||||||
# Activate a tab based on the current action
|
# Activate a tab based on the current action
|
||||||
|
@ -101,7 +110,7 @@ class @MergeRequestTabs
|
||||||
action = 'notes' if action == 'show'
|
action = 'notes' if action == 'show'
|
||||||
|
|
||||||
# Remove a trailing '/commits' or '/diffs'
|
# Remove a trailing '/commits' or '/diffs'
|
||||||
new_state = @_location.pathname.replace(/\/(commits|diffs)(\.html)?\/?$/, '')
|
new_state = @_location.pathname.replace(/\/(commits|diffs|builds)(\.html)?\/?$/, '')
|
||||||
|
|
||||||
# Append the new action if we're on a tab other than 'notes'
|
# Append the new action if we're on a tab other than 'notes'
|
||||||
unless action == 'notes'
|
unless action == 'notes'
|
||||||
|
@ -124,7 +133,7 @@ class @MergeRequestTabs
|
||||||
@_get
|
@_get
|
||||||
url: "#{source}.json"
|
url: "#{source}.json"
|
||||||
success: (data) =>
|
success: (data) =>
|
||||||
document.getElementById('commits').innerHTML = data.html
|
document.querySelector("div#commits").innerHTML = data.html
|
||||||
$('.js-timeago').timeago()
|
$('.js-timeago').timeago()
|
||||||
@commitsLoaded = true
|
@commitsLoaded = true
|
||||||
@scrollToElement("#commits")
|
@scrollToElement("#commits")
|
||||||
|
@ -135,10 +144,22 @@ class @MergeRequestTabs
|
||||||
@_get
|
@_get
|
||||||
url: "#{source}.json" + @_location.search
|
url: "#{source}.json" + @_location.search
|
||||||
success: (data) =>
|
success: (data) =>
|
||||||
document.getElementById('diffs').innerHTML = data.html
|
document.querySelector("div#diffs").innerHTML = data.html
|
||||||
|
$('div#diffs .js-syntax-highlight').syntaxHighlight()
|
||||||
@diffsLoaded = true
|
@diffsLoaded = true
|
||||||
@scrollToElement("#diffs")
|
@scrollToElement("#diffs")
|
||||||
|
|
||||||
|
loadBuilds: (source) ->
|
||||||
|
return if @buildsLoaded
|
||||||
|
|
||||||
|
@_get
|
||||||
|
url: "#{source}.json"
|
||||||
|
success: (data) =>
|
||||||
|
document.querySelector("div#builds").innerHTML = data.html
|
||||||
|
$('.js-timeago').timeago()
|
||||||
|
@buildsLoaded = true
|
||||||
|
@scrollToElement("#builds")
|
||||||
|
|
||||||
# Show or hide the loading spinner
|
# Show or hide the loading spinner
|
||||||
#
|
#
|
||||||
# status - Boolean, true to show, false to hide
|
# status - Boolean, true to show, false to hide
|
||||||
|
|
|
@ -10,17 +10,20 @@ class @MergeRequestWidget
|
||||||
constructor: (@opts) ->
|
constructor: (@opts) ->
|
||||||
modal = $('#modal_merge_info').modal(show: false)
|
modal = $('#modal_merge_info').modal(show: false)
|
||||||
|
|
||||||
mergeInProgress: ->
|
mergeInProgress: (deleteSourceBranch = false)->
|
||||||
$.ajax
|
$.ajax
|
||||||
type: 'GET'
|
type: 'GET'
|
||||||
url: $('.merge-request').data('url')
|
url: $('.merge-request').data('url')
|
||||||
success: (data) =>
|
success: (data) =>
|
||||||
if data.state == "merged"
|
if data.state == "merged"
|
||||||
location.reload()
|
urlSuffix = if deleteSourceBranch then '?delete_source=true' else ''
|
||||||
|
|
||||||
|
window.location.href = window.location.href + urlSuffix
|
||||||
else if data.merge_error
|
else if data.merge_error
|
||||||
$('.mr-widget-body').html("<h4>" + data.merge_error + "</h4>")
|
$('.mr-widget-body').html("<h4>" + data.merge_error + "</h4>")
|
||||||
else
|
else
|
||||||
setTimeout(merge_request_widget.mergeInProgress, 2000)
|
callback = -> merge_request_widget.mergeInProgress(deleteSourceBranch)
|
||||||
|
setTimeout(callback, 2000)
|
||||||
dataType: 'json'
|
dataType: 'json'
|
||||||
|
|
||||||
getMergeStatus: ->
|
getMergeStatus: ->
|
||||||
|
|
|
@ -3,7 +3,7 @@ class @NewCommitForm
|
||||||
@newBranch = form.find('.js-new-branch')
|
@newBranch = form.find('.js-new-branch')
|
||||||
@originalBranch = form.find('.js-original-branch')
|
@originalBranch = form.find('.js-original-branch')
|
||||||
@createMergeRequest = form.find('.js-create-merge-request')
|
@createMergeRequest = form.find('.js-create-merge-request')
|
||||||
@createMergeRequestFormGroup = form.find('.js-create-merge-request-form-group')
|
@createMergeRequestContainer = form.find('.js-create-merge-request-container')
|
||||||
|
|
||||||
@renderDestination()
|
@renderDestination()
|
||||||
@newBranch.keyup @renderDestination
|
@newBranch.keyup @renderDestination
|
||||||
|
@ -12,10 +12,10 @@ class @NewCommitForm
|
||||||
different = @newBranch.val() != @originalBranch.val()
|
different = @newBranch.val() != @originalBranch.val()
|
||||||
|
|
||||||
if different
|
if different
|
||||||
@createMergeRequestFormGroup.show()
|
@createMergeRequestContainer.show()
|
||||||
@createMergeRequest.prop('checked', true) unless @wasDifferent
|
@createMergeRequest.prop('checked', true) unless @wasDifferent
|
||||||
else
|
else
|
||||||
@createMergeRequestFormGroup.hide()
|
@createMergeRequestContainer.hide()
|
||||||
@createMergeRequest.prop('checked', false)
|
@createMergeRequest.prop('checked', false)
|
||||||
|
|
||||||
@wasDifferent = different
|
@wasDifferent = different
|
||||||
|
|
|
@ -111,6 +111,12 @@ class @Notes
|
||||||
Note: for rendering inline notes use renderDiscussionNote
|
Note: for rendering inline notes use renderDiscussionNote
|
||||||
###
|
###
|
||||||
renderNote: (note) ->
|
renderNote: (note) ->
|
||||||
|
unless note.valid
|
||||||
|
if note.award
|
||||||
|
flash = new Flash('You have already used this award emoji!', 'alert')
|
||||||
|
flash.pinTo('.header-content')
|
||||||
|
return
|
||||||
|
|
||||||
# render note if it not present in loaded list
|
# render note if it not present in loaded list
|
||||||
# or skip if rendered
|
# or skip if rendered
|
||||||
if @isNewNote(note) && !note.award
|
if @isNewNote(note) && !note.award
|
||||||
|
@ -122,6 +128,7 @@ class @Notes
|
||||||
|
|
||||||
if note.award
|
if note.award
|
||||||
awards_handler.addAwardToEmojiBar(note.note, note.emoji_path)
|
awards_handler.addAwardToEmojiBar(note.note, note.emoji_path)
|
||||||
|
awards_handler.scrollToAwards()
|
||||||
|
|
||||||
###
|
###
|
||||||
Check if note does not exists on page
|
Check if note does not exists on page
|
||||||
|
@ -141,6 +148,8 @@ class @Notes
|
||||||
@note_ids.push(note.id)
|
@note_ids.push(note.id)
|
||||||
form = $("form[rel='" + note.discussion_id + "']")
|
form = $("form[rel='" + note.discussion_id + "']")
|
||||||
row = form.closest("tr")
|
row = form.closest("tr")
|
||||||
|
note_html = $(note.html)
|
||||||
|
note_html.syntaxHighlight()
|
||||||
|
|
||||||
# is this the first note of discussion?
|
# is this the first note of discussion?
|
||||||
if row.is(".js-temp-notes-holder")
|
if row.is(".js-temp-notes-holder")
|
||||||
|
@ -151,14 +160,16 @@ class @Notes
|
||||||
row.next().find(".note").remove()
|
row.next().find(".note").remove()
|
||||||
|
|
||||||
# Add note to 'Changes' page discussions
|
# Add note to 'Changes' page discussions
|
||||||
$(".notes[rel='" + note.discussion_id + "']").append note.html
|
$(".notes[rel='" + note.discussion_id + "']").append note_html
|
||||||
|
|
||||||
# Init discussion on 'Discussion' page if it is merge request page
|
# Init discussion on 'Discussion' page if it is merge request page
|
||||||
if $('body').attr('data-page').indexOf('projects:merge_request') == 0
|
if $('body').attr('data-page').indexOf('projects:merge_request') == 0
|
||||||
$('ul.main-notes-list').append(note.discussion_with_diff_html)
|
discussion_html = $(note.discussion_with_diff_html)
|
||||||
|
discussion_html.syntaxHighlight()
|
||||||
|
$('ul.main-notes-list').append(discussion_html)
|
||||||
else
|
else
|
||||||
# append new note to all matching discussions
|
# append new note to all matching discussions
|
||||||
$(".notes[rel='" + note.discussion_id + "']").append note.html
|
$(".notes[rel='" + note.discussion_id + "']").append note_html
|
||||||
|
|
||||||
# cleanup after successfully creating a diff/discussion note
|
# cleanup after successfully creating a diff/discussion note
|
||||||
@removeDiscussionNoteForm(form)
|
@removeDiscussionNoteForm(form)
|
||||||
|
@ -279,7 +290,7 @@ class @Notes
|
||||||
$html.find('.js-task-list-container').taskList('enable')
|
$html.find('.js-task-list-container').taskList('enable')
|
||||||
|
|
||||||
# Find the note's `li` element by ID and replace it with the updated HTML
|
# Find the note's `li` element by ID and replace it with the updated HTML
|
||||||
$note_li = $("#note_#{note.id}")
|
$note_li = $('.note-row-' + note.id)
|
||||||
$note_li.replaceWith($html)
|
$note_li.replaceWith($html)
|
||||||
|
|
||||||
###
|
###
|
||||||
|
@ -339,18 +350,26 @@ class @Notes
|
||||||
###
|
###
|
||||||
removeNote: ->
|
removeNote: ->
|
||||||
note = $(this).closest(".note")
|
note = $(this).closest(".note")
|
||||||
notes = note.closest(".notes")
|
note_id = note.attr('id')
|
||||||
|
|
||||||
# check if this is the last note for this line
|
$('.note[id="' + note_id + '"]').each ->
|
||||||
if notes.find(".note").length is 1
|
note = $(this)
|
||||||
|
notes = note.closest(".notes")
|
||||||
|
count = notes.closest(".notes_holder").find(".discussion-notes-count")
|
||||||
|
|
||||||
# for discussions
|
# check if this is the last note for this line
|
||||||
notes.closest(".discussion").remove()
|
if notes.find(".note").length is 1
|
||||||
|
|
||||||
# for diff lines
|
# for discussions
|
||||||
notes.closest("tr").remove()
|
notes.closest(".discussion").remove()
|
||||||
|
|
||||||
note.remove()
|
# for diff lines
|
||||||
|
notes.closest("tr").remove()
|
||||||
|
else
|
||||||
|
# update notes count
|
||||||
|
count.get(0).lastChild.nodeValue = " #{notes.children().length - 1}"
|
||||||
|
|
||||||
|
note.remove()
|
||||||
|
|
||||||
###
|
###
|
||||||
Called in response to clicking the delete attachment link
|
Called in response to clicking the delete attachment link
|
||||||
|
@ -362,8 +381,8 @@ class @Notes
|
||||||
note = $(this).closest(".note")
|
note = $(this).closest(".note")
|
||||||
note.find(".note-attachment").remove()
|
note.find(".note-attachment").remove()
|
||||||
note.find(".note-body > .note-text").show()
|
note.find(".note-body > .note-text").show()
|
||||||
note.find(".js-note-attachment-delete").hide()
|
note.find(".note-header").show()
|
||||||
note.find(".note-edit-form").hide()
|
note.find(".current-note-edit-form").remove()
|
||||||
|
|
||||||
###
|
###
|
||||||
Called when clicking on the "reply" button for a diff line.
|
Called when clicking on the "reply" button for a diff line.
|
||||||
|
|
|
@ -1,13 +1,22 @@
|
||||||
class @Project
|
class @Project
|
||||||
constructor: ->
|
constructor: ->
|
||||||
# Git clone panel switcher
|
# Git protocol switcher
|
||||||
cloneHolder = $('.git-clone-holder')
|
$('.js-protocol-switch').click ->
|
||||||
if cloneHolder.length
|
return if $(@).hasClass('active')
|
||||||
$('a, button', cloneHolder).click ->
|
|
||||||
$('a, button', cloneHolder).removeClass 'active'
|
|
||||||
$(@).addClass 'active'
|
# Remove the active class for all buttons (ssh, http, kerberos if shown)
|
||||||
$('#project_clone', cloneHolder).val $(@).data 'clone'
|
$('.active').not($(@)).removeClass('active');
|
||||||
$(".clone").text("").append $(@).data 'clone'
|
# Add the active class for the clicked button
|
||||||
|
$(@).toggleClass('active')
|
||||||
|
|
||||||
|
url = $(@).data('clone')
|
||||||
|
|
||||||
|
# Update the input field
|
||||||
|
$('#project_clone').val(url)
|
||||||
|
|
||||||
|
# Update the command line instructions
|
||||||
|
$('.clone').text(url)
|
||||||
|
|
||||||
# Ref switcher
|
# Ref switcher
|
||||||
$('.project-refs-select').on 'change', ->
|
$('.project-refs-select').on 'change', ->
|
||||||
|
@ -39,4 +48,4 @@ class @Project
|
||||||
when 4 then label = ' On Mention '
|
when 4 then label = ' On Mention '
|
||||||
$('#notifications-button').empty().append("<i class='fa fa-bell'></i>" + label + "<i class='fa fa-angle-down'></i>")
|
$('#notifications-button').empty().append("<i class='fa fa-bell'></i>" + label + "<i class='fa fa-angle-down'></i>")
|
||||||
$(@).parents('ul').find('li.active').removeClass 'active'
|
$(@).parents('ul').find('li.active').removeClass 'active'
|
||||||
$(@).parent().addClass 'active'
|
$(@).parent().addClass 'active'
|
||||||
|
|
39
app/assets/javascripts/project_select.js.coffee
Normal file
39
app/assets/javascripts/project_select.js.coffee
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
class @ProjectSelect
|
||||||
|
constructor: ->
|
||||||
|
$('.ajax-project-select').each (i, select) ->
|
||||||
|
@groupId = $(select).data('group-id')
|
||||||
|
@includeGroups = $(select).data('include-groups')
|
||||||
|
|
||||||
|
placeholder = "Search for project"
|
||||||
|
placeholder += " or group" if @includeGroups
|
||||||
|
|
||||||
|
$(select).select2
|
||||||
|
placeholder: placeholder
|
||||||
|
minimumInputLength: 0
|
||||||
|
query: (query) =>
|
||||||
|
finalCallback = (projects) ->
|
||||||
|
data = { results: projects }
|
||||||
|
query.callback(data)
|
||||||
|
|
||||||
|
if @includeGroups
|
||||||
|
projectsCallback = (projects) ->
|
||||||
|
groupsCallback = (groups) ->
|
||||||
|
data = groups.concat(projects)
|
||||||
|
finalCallback(data)
|
||||||
|
|
||||||
|
Api.groups query.term, false, groupsCallback
|
||||||
|
else
|
||||||
|
projectsCallback = finalCallback
|
||||||
|
|
||||||
|
if @groupId
|
||||||
|
Api.groupProjects @groupId, query.term, projectsCallback
|
||||||
|
else
|
||||||
|
Api.projects query.term, projectsCallback
|
||||||
|
|
||||||
|
id: (project) ->
|
||||||
|
project.web_url
|
||||||
|
|
||||||
|
text: (project) ->
|
||||||
|
project.name_with_namespace || project.name
|
||||||
|
|
||||||
|
dropdownCssClass: "ajax-project-dropdown"
|
|
@ -5,6 +5,7 @@ $(document).on("click", '.toggle-nav-collapse', (e) ->
|
||||||
|
|
||||||
$('.page-with-sidebar').toggleClass("#{collapsed} #{expanded}")
|
$('.page-with-sidebar').toggleClass("#{collapsed} #{expanded}")
|
||||||
$('header').toggleClass("header-collapsed header-expanded")
|
$('header').toggleClass("header-collapsed header-expanded")
|
||||||
|
$('.sidebar-wrapper').toggleClass("sidebar-collapsed sidebar-expanded")
|
||||||
$('.toggle-nav-collapse i').toggleClass("fa-angle-right fa-angle-left")
|
$('.toggle-nav-collapse i').toggleClass("fa-angle-right fa-angle-left")
|
||||||
$.cookie("collapsed_nav", $('.page-with-sidebar').hasClass(collapsed), { path: '/' })
|
$.cookie("collapsed_nav", $('.page-with-sidebar').hasClass(collapsed), { path: '/' })
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,3 +2,9 @@ class @User
|
||||||
constructor: ->
|
constructor: ->
|
||||||
$('.profile-groups-avatars').tooltip("placement": "top")
|
$('.profile-groups-avatars').tooltip("placement": "top")
|
||||||
new ProjectsList()
|
new ProjectsList()
|
||||||
|
|
||||||
|
$('.hide-project-limit-message').on 'click', (e) ->
|
||||||
|
path = '/'
|
||||||
|
$.cookie('hide_project_limit_message', 'false', { path: path })
|
||||||
|
$(@).parents('.project-limit-message').remove()
|
||||||
|
e.preventDefault()
|
||||||
|
|
|
@ -32,17 +32,15 @@ class @UsersSelect
|
||||||
if showNullUser
|
if showNullUser
|
||||||
nullUser = {
|
nullUser = {
|
||||||
name: 'Unassigned',
|
name: 'Unassigned',
|
||||||
avatar: null,
|
|
||||||
username: 'none',
|
|
||||||
id: 0
|
id: 0
|
||||||
}
|
}
|
||||||
data.results.unshift(nullUser)
|
data.results.unshift(nullUser)
|
||||||
|
|
||||||
if showAnyUser
|
if showAnyUser
|
||||||
|
name = showAnyUser
|
||||||
|
name = 'Any User' if name == true
|
||||||
anyUser = {
|
anyUser = {
|
||||||
name: 'Any',
|
name: name,
|
||||||
avatar: null,
|
|
||||||
username: 'none',
|
|
||||||
id: null
|
id: null
|
||||||
}
|
}
|
||||||
data.results.unshift(anyUser)
|
data.results.unshift(anyUser)
|
||||||
|
@ -50,7 +48,6 @@ class @UsersSelect
|
||||||
if showEmailUser && data.results.length == 0 && query.term.match(/^[^@]+@[^@]+$/)
|
if showEmailUser && data.results.length == 0 && query.term.match(/^[^@]+@[^@]+$/)
|
||||||
emailUser = {
|
emailUser = {
|
||||||
name: "Invite \"#{query.term}\"",
|
name: "Invite \"#{query.term}\"",
|
||||||
avatar: null,
|
|
||||||
username: query.term,
|
username: query.term,
|
||||||
id: query.term
|
id: query.term
|
||||||
}
|
}
|
||||||
|
@ -58,11 +55,8 @@ class @UsersSelect
|
||||||
|
|
||||||
query.callback(data)
|
query.callback(data)
|
||||||
|
|
||||||
initSelection: (element, callback) =>
|
initSelection: (args...) =>
|
||||||
id = $(element).val()
|
@initSelection(args...)
|
||||||
if id != "" && id != "0"
|
|
||||||
@user(id, callback)
|
|
||||||
|
|
||||||
formatResult: (args...) =>
|
formatResult: (args...) =>
|
||||||
@formatResult(args...)
|
@formatResult(args...)
|
||||||
formatSelection: (args...) =>
|
formatSelection: (args...) =>
|
||||||
|
@ -71,16 +65,24 @@ class @UsersSelect
|
||||||
escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
|
escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
|
||||||
m
|
m
|
||||||
|
|
||||||
|
initSelection: (element, callback) ->
|
||||||
|
id = $(element).val()
|
||||||
|
if id == "0"
|
||||||
|
nullUser = { name: 'Unassigned' }
|
||||||
|
callback(nullUser)
|
||||||
|
else if id != ""
|
||||||
|
@user(id, callback)
|
||||||
|
|
||||||
formatResult: (user) ->
|
formatResult: (user) ->
|
||||||
if user.avatar_url
|
if user.avatar_url
|
||||||
avatar = user.avatar_url
|
avatar = user.avatar_url
|
||||||
else
|
else
|
||||||
avatar = gon.default_avatar_url
|
avatar = gon.default_avatar_url
|
||||||
|
|
||||||
"<div class='user-result'>
|
"<div class='user-result #{'no-username' unless user.username}'>
|
||||||
<div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
|
<div class='user-image'><img class='avatar s24' src='#{avatar}'></div>
|
||||||
<div class='user-name'>#{user.name}</div>
|
<div class='user-name'>#{user.name}</div>
|
||||||
<div class='user-username'>#{user.username}</div>
|
<div class='user-username'>#{user.username || ""}</div>
|
||||||
</div>"
|
</div>"
|
||||||
|
|
||||||
formatSelection: (user) ->
|
formatSelection: (user) ->
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
@import "framework/fonts";
|
@import "framework/fonts";
|
||||||
@import "framework/variables";
|
@import "framework/variables";
|
||||||
@import "framework/mixins";
|
@import "framework/mixins";
|
||||||
@import "framework/layout";
|
|
||||||
@import 'framework/tw_bootstrap_variables';
|
@import 'framework/tw_bootstrap_variables';
|
||||||
@import 'framework/tw_bootstrap';
|
@import 'framework/tw_bootstrap';
|
||||||
|
@import "framework/layout";
|
||||||
|
|
||||||
@import "framework/avatar.scss";
|
@import "framework/avatar.scss";
|
||||||
@import "framework/blocks.scss";
|
@import "framework/blocks.scss";
|
||||||
|
@ -25,6 +25,7 @@
|
||||||
@import "framework/markdown_area.scss";
|
@import "framework/markdown_area.scss";
|
||||||
@import "framework/mobile.scss";
|
@import "framework/mobile.scss";
|
||||||
@import "framework/pagination.scss";
|
@import "framework/pagination.scss";
|
||||||
|
@import "framework/panels.scss";
|
||||||
@import "framework/selects.scss";
|
@import "framework/selects.scss";
|
||||||
@import "framework/sidebar.scss";
|
@import "framework/sidebar.scss";
|
||||||
@import "framework/tables.scss";
|
@import "framework/tables.scss";
|
||||||
|
|
|
@ -68,6 +68,10 @@
|
||||||
.oneline {
|
.oneline {
|
||||||
line-height: 42px;
|
line-height: 42px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
> p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.cover-block {
|
.cover-block {
|
||||||
|
@ -112,5 +116,14 @@
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
right: 10px;
|
right: 10px;
|
||||||
|
|
||||||
|
&.left {
|
||||||
|
left: 10px;
|
||||||
|
right: auto;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.block-connector {
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
|
|
@ -7,8 +7,8 @@
|
||||||
|
|
||||||
/* Common styles for all types */
|
/* Common styles for all types */
|
||||||
.bs-callout {
|
.bs-callout {
|
||||||
margin: 20px 0;
|
margin: $gl-padding 0;
|
||||||
padding: 20px;
|
padding: $gl-padding;
|
||||||
border-left: 3px solid $border-color;
|
border-left: 3px solid $border-color;
|
||||||
color: $text-color;
|
color: $text-color;
|
||||||
background: $background-color;
|
background: $background-color;
|
||||||
|
@ -42,4 +42,3 @@
|
||||||
border-color: #5cA64d;
|
border-color: #5cA64d;
|
||||||
color: #3c763d;
|
color: #3c763d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
/** COMMON CLASSES **/
|
/** COMMON CLASSES **/
|
||||||
.prepend-top-10 { margin-top:10px }
|
.prepend-top-10 { margin-top:10px }
|
||||||
.prepend-top-default { margin-top: $gl-padding; }
|
.prepend-top-default { margin-top: $gl-padding !important; }
|
||||||
.prepend-top-20 { margin-top:20px }
|
.prepend-top-20 { margin-top:20px }
|
||||||
.prepend-left-10 { margin-left:10px }
|
.prepend-left-10 { margin-left:10px }
|
||||||
.prepend-left-20 { margin-left:20px }
|
.prepend-left-20 { margin-left:20px }
|
||||||
|
@ -52,6 +52,10 @@ pre {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
margin: $gl-padding 0;
|
||||||
|
}
|
||||||
|
|
||||||
.dropdown-menu > li > a {
|
.dropdown-menu > li > a {
|
||||||
text-shadow: none;
|
text-shadow: none;
|
||||||
}
|
}
|
||||||
|
@ -64,7 +68,7 @@ pre {
|
||||||
.dropdown-menu > li > a:hover,
|
.dropdown-menu > li > a:hover,
|
||||||
.dropdown-menu > li > a:focus {
|
.dropdown-menu > li > a:focus {
|
||||||
background: $gl-primary;
|
background: $gl-primary;
|
||||||
color: #FFF
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
.str-truncated {
|
.str-truncated {
|
||||||
|
@ -329,7 +333,7 @@ table {
|
||||||
}
|
}
|
||||||
|
|
||||||
.well {
|
.well {
|
||||||
margin-bottom: 0;
|
margin-bottom: $gl-padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search_box {
|
.search_box {
|
||||||
|
@ -337,10 +341,6 @@ table {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.task-status {
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#nprogress .spinner {
|
#nprogress .spinner {
|
||||||
top: 15px !important;
|
top: 15px !important;
|
||||||
right: 10px !important;
|
right: 10px !important;
|
||||||
|
@ -379,9 +379,8 @@ table {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
margin-bottom: $gl-padding;
|
margin-bottom: $gl-padding;
|
||||||
height: 56px;
|
height: auto;
|
||||||
margin-top: -$gl-padding;
|
margin-top: -$gl-padding;
|
||||||
padding-top: $gl-padding;
|
|
||||||
|
|
||||||
&.no-bottom {
|
&.no-bottom {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
@ -390,6 +389,23 @@ table {
|
||||||
&.no-top {
|
&.no-top {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
li a {
|
||||||
|
display: inline-block;
|
||||||
|
padding-top: $gl-padding;
|
||||||
|
padding-bottom: 11px;
|
||||||
|
margin-bottom: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.bottom-border {
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
height: 57px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.wide {
|
||||||
|
margin-left: -$gl-padding;
|
||||||
|
margin-right: -$gl-padding;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-middle-menu {
|
.center-middle-menu {
|
||||||
|
@ -433,3 +449,26 @@ table {
|
||||||
.space-right {
|
.space-right {
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.alert, .progress {
|
||||||
|
margin-bottom: $gl-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new-project-item-select-holder {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.new-project-item-select {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 250px !important;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-separator {
|
||||||
|
margin-left: -$gl-padding;
|
||||||
|
margin-right: -$gl-padding;
|
||||||
|
border-top: 1px solid $border-color;
|
||||||
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
border: none;
|
border: none;
|
||||||
border-top: 1px solid #E7E9EE;
|
border-top: 1px solid #E7E9EE;
|
||||||
border-bottom: 1px solid #E7E9EE;
|
border-bottom: 1px solid #E7E9EE;
|
||||||
margin-bottom: 1em;
|
|
||||||
|
|
||||||
&.readme-holder {
|
&.readme-holder {
|
||||||
border-bottom: 0;
|
border-bottom: 0;
|
||||||
|
@ -22,10 +21,9 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
background: $background-color;
|
background: $background-color;
|
||||||
border-bottom: 1px solid $border-color;
|
border-bottom: 1px solid $border-color;
|
||||||
text-shadow: 0 1px 1px #fff;
|
|
||||||
margin: 0;
|
margin: 0;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
padding: 10px 15px;
|
padding: 10px $gl-padding;
|
||||||
|
|
||||||
.file-actions {
|
.file-actions {
|
||||||
float: right;
|
float: right;
|
||||||
|
@ -171,4 +169,3 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,9 +22,10 @@ input[type='text'].danger {
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-actions {
|
.form-actions {
|
||||||
padding: 17px 20px 18px;
|
margin: -$gl-padding;
|
||||||
margin-top: 18px;
|
margin-top: 0;
|
||||||
margin-bottom: 18px;
|
margin-bottom: -$gl-padding;
|
||||||
|
padding: $gl-padding;
|
||||||
background-color: $background-color;
|
background-color: $background-color;
|
||||||
border-top: 1px solid $border-color;
|
border-top: 1px solid $border-color;
|
||||||
}
|
}
|
||||||
|
@ -73,6 +74,8 @@ label {
|
||||||
|
|
||||||
.form-control {
|
.form-control {
|
||||||
@include box-shadow(none);
|
@include box-shadow(none);
|
||||||
|
height: 42px;
|
||||||
|
padding: 8px $gl-padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wiki-content {
|
.wiki-content {
|
||||||
|
@ -88,7 +91,19 @@ label {
|
||||||
}
|
}
|
||||||
|
|
||||||
.input-group {
|
.input-group {
|
||||||
|
.select2-container {
|
||||||
|
display: table-cell;
|
||||||
|
width: 200px !important;
|
||||||
|
}
|
||||||
.input-group-addon {
|
.input-group-addon {
|
||||||
background-color: #f7f8fa;
|
background-color: #f7f8fa;
|
||||||
}
|
}
|
||||||
|
.input-group-addon:not(:first-child):not(:last-child) {
|
||||||
|
border-left: 0;
|
||||||
|
border-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.help-block {
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,15 +6,17 @@ header {
|
||||||
transition-duration: .3s;
|
transition-duration: .3s;
|
||||||
|
|
||||||
&.navbar-empty {
|
&.navbar-empty {
|
||||||
|
height: 58px;
|
||||||
background: #FFF;
|
background: #FFF;
|
||||||
border-bottom: 1px solid #EEE;
|
border-bottom: 1px solid #EEE;
|
||||||
|
|
||||||
.center-logo {
|
.center-logo {
|
||||||
margin: 8px 0;
|
margin: 11px 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
img {
|
#tanuki-logo, img {
|
||||||
height: 32px;
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,31 +4,32 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
.issue-box {
|
.status-box {
|
||||||
@include border-radius(2px);
|
@include border-radius(2px);
|
||||||
|
|
||||||
display: inline-block;
|
display: block;
|
||||||
padding: 10px $gl-padding;
|
float: left;
|
||||||
|
padding: 0 $gl-padding;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
font-size: $gl-font-size;
|
font-size: $gl-font-size;
|
||||||
|
|
||||||
&.issue-box-closed {
|
&.status-box-closed {
|
||||||
background-color: $gl-danger;
|
background-color: $gl-danger;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.issue-box-merged {
|
&.status-box-merged {
|
||||||
background-color: $gl-primary;
|
background-color: $gl-primary;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.issue-box-open {
|
&.status-box-open {
|
||||||
background-color: #019875;
|
background-color: #019875;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.issue-box-expired {
|
&.status-box-expired {
|
||||||
background: #cea61b;
|
background: #cea61b;
|
||||||
color: #FFF;
|
color: #FFF;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,13 @@ html {
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
|
|
||||||
&.touch .tooltip { display: none !important; }
|
&.touch .tooltip { display: none !important; }
|
||||||
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
padding-top: $header-height;
|
background-color: #EAEBEC !important;
|
||||||
|
|
||||||
|
&.navless {
|
||||||
|
background-color: white !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,7 +22,8 @@ html {
|
||||||
}
|
}
|
||||||
|
|
||||||
.navless-container {
|
.navless-container {
|
||||||
margin-top: 30px;
|
margin-top: $header-height;
|
||||||
|
padding-top: $gl-padding * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container-limited {
|
.container-limited {
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
|
|
||||||
li {
|
> li {
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
min-height: 20px;
|
min-height: 20px;
|
||||||
border-bottom: 1px solid #eee;
|
border-bottom: 1px solid #eee;
|
||||||
|
@ -72,13 +72,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ol, ul {
|
|
||||||
&.styled {
|
|
||||||
li {
|
|
||||||
padding: 2px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** light list with border-bottom between li **/
|
/** light list with border-bottom between li **/
|
||||||
ul.bordered-list {
|
ul.bordered-list {
|
||||||
|
@ -95,8 +88,14 @@ ul.bordered-list {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
li.task-list-item {
|
ul.task-list {
|
||||||
list-style-type: none;
|
li.task-list-item {
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul:not(.task-list) {
|
||||||
|
padding-left: 1.3em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ul.content-list {
|
ul.content-list {
|
||||||
|
@ -127,3 +126,36 @@ ul.content-list {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.panel > .content-list {
|
||||||
|
li {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ul.controls {
|
||||||
|
padding-top: 1px;
|
||||||
|
float: right;
|
||||||
|
list-style: none;
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
padding: 10px 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
> li {
|
||||||
|
float: left;
|
||||||
|
margin-right: 10px;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.author_link {
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
.avatar-inline {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -73,11 +73,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.referenced-users {
|
.referenced-users {
|
||||||
padding: 10px 0;
|
color: #4c4e54;
|
||||||
color: #999;
|
padding-top: 10px;
|
||||||
margin-left: 10px;
|
|
||||||
margin-top: 1px;
|
|
||||||
margin-right: 130px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.md-preview-holder {
|
.md-preview-holder {
|
||||||
|
@ -90,7 +87,7 @@
|
||||||
|
|
||||||
.new_note,
|
.new_note,
|
||||||
.edit_note,
|
.edit_note,
|
||||||
.issuable-description,
|
.detail-page-description,
|
||||||
.milestone-description,
|
.milestone-description,
|
||||||
.wiki-content,
|
.wiki-content,
|
||||||
.merge-request-form {
|
.merge-request-form {
|
||||||
|
|
|
@ -82,9 +82,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.center-top-menu {
|
.center-top-menu {
|
||||||
height: 45px;
|
|
||||||
margin-bottom: 30px;
|
|
||||||
|
|
||||||
li a {
|
li a {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
padding: 19px 10px;
|
padding: 19px 10px;
|
||||||
|
|
|
@ -32,3 +32,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.panel > .gl-pagination {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
20
app/assets/stylesheets/framework/panels.scss
Normal file
20
app/assets/stylesheets/framework/panels.scss
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
.panel {
|
||||||
|
margin-bottom: $gl-padding;
|
||||||
|
|
||||||
|
.panel-heading {
|
||||||
|
padding: 7px $gl-padding;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-body {
|
||||||
|
padding: $gl-padding;
|
||||||
|
|
||||||
|
.form-actions {
|
||||||
|
margin: -$gl-padding;
|
||||||
|
margin-top: $gl-padding;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.container-blank .panel .panel-heading {
|
||||||
|
line-height: 42px !important;
|
||||||
|
}
|
|
@ -15,6 +15,16 @@
|
||||||
border-left: none;
|
border-left: none;
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.select2-chosen {
|
||||||
|
color: $gl-text-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.select2-default {
|
||||||
|
.select2-chosen {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,6 +33,7 @@
|
||||||
border: 1px solid #e7e9ed;
|
border: 1px solid #e7e9ed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.select2-drop {
|
.select2-drop {
|
||||||
@include box-shadow(rgba(76, 86, 103, 0.247059) 0px 0px 1px 0px, rgba(31, 37, 50, 0.317647) 0px 2px 18px 0px);
|
@include box-shadow(rgba(76, 86, 103, 0.247059) 0px 0px 1px 0px, rgba(31, 37, 50, 0.317647) 0px 2px 18px 0px);
|
||||||
@include border-radius (0px);
|
@include border-radius (0px);
|
||||||
|
@ -48,17 +59,38 @@
|
||||||
color: #313236;
|
color: #313236;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.select2-container-multi {
|
||||||
|
.select2-choices {
|
||||||
|
@include border-radius(2px);
|
||||||
|
border-color: $input-border;
|
||||||
|
background: white;
|
||||||
|
padding-left: $gl-padding / 2;
|
||||||
|
|
||||||
.select2-container-multi .select2-choices {
|
.select2-search-field input {
|
||||||
@include border-radius(2px);
|
padding: $gl-padding / 2;
|
||||||
border-color: #CCC;
|
font-size: 13px;
|
||||||
}
|
height: auto;
|
||||||
|
font-family: inherit;
|
||||||
|
font-size: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
.select2-container-multi .select2-choices .select2-search-field input {
|
.select2-search-choice {
|
||||||
padding: 8px 14px;
|
margin: 8px 0 0 8px;
|
||||||
font-size: 13px;
|
background: white;
|
||||||
line-height: 18px;
|
box-shadow: none;
|
||||||
height: auto;
|
border-color: $input-border;
|
||||||
|
color: $gl-text-color;
|
||||||
|
line-height: 15px;
|
||||||
|
|
||||||
|
.select2-search-choice-close {
|
||||||
|
top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.select2-search-choice-focus {
|
||||||
|
border-color: $gl-text-color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.select2-drop-active {
|
.select2-drop-active {
|
||||||
|
@ -123,10 +155,16 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-result {
|
.user-result {
|
||||||
|
min-height: 24px;
|
||||||
|
|
||||||
.user-image {
|
.user-image {
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
.user-name {
|
|
||||||
|
&.no-username {
|
||||||
|
.user-name {
|
||||||
|
line-height: 24px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,4 +181,4 @@
|
||||||
|
|
||||||
.ajax-users-dropdown {
|
.ajax-users-dropdown {
|
||||||
min-width: 250px !important;
|
min-width: 250px !important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
.page-with-sidebar {
|
.page-with-sidebar {
|
||||||
|
padding-top: $header-height;
|
||||||
|
transition-duration: .3s;
|
||||||
|
|
||||||
.sidebar-wrapper {
|
.sidebar-wrapper {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
@ -14,19 +17,15 @@
|
||||||
.sidebar-wrapper {
|
.sidebar-wrapper {
|
||||||
z-index: 99;
|
z-index: 99;
|
||||||
background: $background-color;
|
background: $background-color;
|
||||||
transition-duration: .3s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.content-wrapper {
|
.content-wrapper {
|
||||||
min-height: 100vh;
|
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
background: #EAEBEC;
|
|
||||||
|
|
||||||
.container-fluid {
|
.container-fluid {
|
||||||
background: #FFF;
|
background: #FFF;
|
||||||
padding: $gl-padding;
|
padding: $gl-padding;
|
||||||
min-height: 90vh;
|
|
||||||
|
|
||||||
&.container-blank {
|
&.container-blank {
|
||||||
background: none;
|
background: none;
|
||||||
|
@ -36,6 +35,83 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sidebar-wrapper {
|
||||||
|
.header-logo {
|
||||||
|
border-bottom: 1px solid transparent;
|
||||||
|
float: left;
|
||||||
|
height: $header-height;
|
||||||
|
width: $sidebar_width;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 999;
|
||||||
|
overflow: hidden;
|
||||||
|
transition-duration: .3s;
|
||||||
|
|
||||||
|
a {
|
||||||
|
float: left;
|
||||||
|
height: $header-height;
|
||||||
|
width: 100%;
|
||||||
|
padding: 11px 0 11px 22px;
|
||||||
|
overflow: hidden;
|
||||||
|
outline: none;
|
||||||
|
transition-duration: .3s;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tanuki-logo, img {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gitlab-text-container {
|
||||||
|
width: 230px;
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
width: 158px;
|
||||||
|
float: left;
|
||||||
|
margin: 0;
|
||||||
|
margin-left: 14px;
|
||||||
|
font-size: 19px;
|
||||||
|
line-height: 41px;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #EEE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar-user {
|
||||||
|
padding: 9px 22px;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 40px;
|
||||||
|
width: $sidebar_width;
|
||||||
|
overflow: hidden;
|
||||||
|
transition-duration: .3s;
|
||||||
|
|
||||||
|
.username {
|
||||||
|
margin-left: 10px;
|
||||||
|
width: $sidebar_width - 2 * 10px;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 34px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.tanuki-shape {
|
||||||
|
transition: all 0.8s;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
fill: rgb(255, 255, 255);
|
||||||
|
transition: all 0.1s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.nav-sidebar {
|
.nav-sidebar {
|
||||||
margin-top: 14 + $header-height;
|
margin-top: 14 + $header-height;
|
||||||
margin-bottom: 100px;
|
margin-bottom: 100px;
|
||||||
|
@ -62,7 +138,7 @@
|
||||||
color: $gray;
|
color: $gray;
|
||||||
display: block;
|
display: block;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
padding-left: 22px;
|
padding-left: 23px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
outline: none;
|
outline: none;
|
||||||
|
|
||||||
|
@ -86,6 +162,10 @@
|
||||||
padding: 0px 8px;
|
padding: 0px 8px;
|
||||||
@include border-radius(6px);
|
@include border-radius(6px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.back-link i {
|
||||||
|
transition-duration: .3s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,7 +181,6 @@
|
||||||
|
|
||||||
@mixin expanded-sidebar {
|
@mixin expanded-sidebar {
|
||||||
padding-left: $sidebar_width;
|
padding-left: $sidebar_width;
|
||||||
transition-duration: .3s;
|
|
||||||
|
|
||||||
.sidebar-wrapper {
|
.sidebar-wrapper {
|
||||||
width: $sidebar_width;
|
width: $sidebar_width;
|
||||||
|
@ -115,16 +194,15 @@
|
||||||
|
|
||||||
&.back-link {
|
&.back-link {
|
||||||
i {
|
i {
|
||||||
visibility: hidden;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@mixin folded-sidebar {
|
@mixin collapsed-sidebar {
|
||||||
padding-left: 60px;
|
padding-left: $sidebar_collapsed_width;
|
||||||
transition-duration: .3s;
|
|
||||||
|
|
||||||
.sidebar-wrapper {
|
.sidebar-wrapper {
|
||||||
width: $sidebar_collapsed_width;
|
width: $sidebar_collapsed_width;
|
||||||
|
@ -133,7 +211,7 @@
|
||||||
width: $sidebar_collapsed_width;
|
width: $sidebar_collapsed_width;
|
||||||
|
|
||||||
a {
|
a {
|
||||||
padding-left: 12px;
|
padding-left: ($sidebar_collapsed_width - 36) / 2;
|
||||||
|
|
||||||
.gitlab-text-container {
|
.gitlab-text-container {
|
||||||
display: none;
|
display: none;
|
||||||
|
@ -144,9 +222,13 @@
|
||||||
.nav-sidebar {
|
.nav-sidebar {
|
||||||
width: $sidebar_collapsed_width;
|
width: $sidebar_collapsed_width;
|
||||||
|
|
||||||
li a {
|
li {
|
||||||
span {
|
width: auto;
|
||||||
display: none;
|
|
||||||
|
a {
|
||||||
|
span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -156,7 +238,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar-user {
|
.sidebar-user {
|
||||||
padding-left: 12px;
|
padding-left: ($sidebar_collapsed_width - 36) / 2;
|
||||||
width: $sidebar_collapsed_width;
|
width: $sidebar_collapsed_width;
|
||||||
|
|
||||||
.username {
|
.username {
|
||||||
|
@ -187,11 +269,11 @@
|
||||||
|
|
||||||
@media (max-width: $screen-md-max) {
|
@media (max-width: $screen-md-max) {
|
||||||
.page-sidebar-collapsed {
|
.page-sidebar-collapsed {
|
||||||
@include folded-sidebar;
|
@include collapsed-sidebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-sidebar-expanded {
|
.page-sidebar-expanded {
|
||||||
@include folded-sidebar;
|
@include collapsed-sidebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
.collapse-nav {
|
.collapse-nav {
|
||||||
|
@ -201,83 +283,10 @@
|
||||||
|
|
||||||
@media(min-width: $screen-md-max) {
|
@media(min-width: $screen-md-max) {
|
||||||
.page-sidebar-collapsed {
|
.page-sidebar-collapsed {
|
||||||
@include folded-sidebar;
|
@include collapsed-sidebar;
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-sidebar-expanded {
|
.page-sidebar-expanded {
|
||||||
@include expanded-sidebar;
|
@include expanded-sidebar;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.sidebar-user {
|
|
||||||
padding: 9px 22px;
|
|
||||||
position: fixed;
|
|
||||||
bottom: 40px;
|
|
||||||
width: $sidebar_width;
|
|
||||||
overflow: hidden;
|
|
||||||
transition-duration: .3s;
|
|
||||||
|
|
||||||
.username {
|
|
||||||
margin-left: 10px;
|
|
||||||
width: $sidebar_width - 2 * 10px;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 34px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.sidebar-wrapper {
|
|
||||||
.header-logo {
|
|
||||||
border-bottom: 1px solid transparent;
|
|
||||||
float: left;
|
|
||||||
height: $header-height;
|
|
||||||
width: $sidebar_width;
|
|
||||||
overflow: hidden;
|
|
||||||
transition-duration: .3s;
|
|
||||||
|
|
||||||
a {
|
|
||||||
float: left;
|
|
||||||
height: $header-height;
|
|
||||||
width: 100%;
|
|
||||||
padding: 10px 22px;
|
|
||||||
overflow: hidden;
|
|
||||||
outline: none;
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 36px;
|
|
||||||
height: 36px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#tanuki-logo, img {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.gitlab-text-container {
|
|
||||||
width: 230px;
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
width: 158px;
|
|
||||||
float: left;
|
|
||||||
margin: 0;
|
|
||||||
margin-left: 14px;
|
|
||||||
font-size: 19px;
|
|
||||||
line-height: 41px;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background-color: #EEE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.tanuki-shape {
|
|
||||||
transition: all 0.8s;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
fill: rgb(255, 255, 255);
|
|
||||||
transition: all 0.1s;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
table {
|
table {
|
||||||
&.table {
|
&.table {
|
||||||
|
margin-bottom: $gl-padding;
|
||||||
|
|
||||||
.dropdown-menu a {
|
.dropdown-menu a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,8 +10,7 @@
|
||||||
margin-left: -$gl-padding;
|
margin-left: -$gl-padding;
|
||||||
margin-right: -$gl-padding;
|
margin-right: -$gl-padding;
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
border-bottom: 1px solid #ECEEF1;
|
border-bottom: 1px solid $border-white-light;
|
||||||
border-right: 1px solid #ECEEF1;
|
|
||||||
|
|
||||||
&:target {
|
&:target {
|
||||||
background: $hover;
|
background: $hover;
|
||||||
|
|
|
@ -181,6 +181,10 @@ body {
|
||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
font-size: 1.25em;
|
font-size: 1.25em;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.page-title-empty {
|
.page-title-empty {
|
||||||
|
@ -216,6 +220,7 @@ pre {
|
||||||
|
|
||||||
.monospace {
|
.monospace {
|
||||||
font-family: $monospace_font;
|
font-family: $monospace_font;
|
||||||
|
font-size: 90%;
|
||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
|
@ -256,3 +261,9 @@ textarea.js-gfm-input {
|
||||||
.strikethrough {
|
.strikethrough {
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4 {
|
||||||
|
small {
|
||||||
|
color: $gl-gray;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ $border-color: #dce0e6;
|
||||||
$table-border-color: #eef0f2;
|
$table-border-color: #eef0f2;
|
||||||
$background-color: #F7F8FA;
|
$background-color: #F7F8FA;
|
||||||
$header-height: 58px;
|
$header-height: 58px;
|
||||||
$fixed-layout-width: 1200px;
|
$fixed-layout-width: 1280px;
|
||||||
$gl-gray: #7f8fa4;
|
$gl-gray: #7f8fa4;
|
||||||
$gl-padding: 16px;
|
$gl-padding: 16px;
|
||||||
$gl-avatar-size: 46px;
|
$gl-avatar-size: 46px;
|
||||||
|
|
86
app/assets/stylesheets/pages/awards.scss
Normal file
86
app/assets/stylesheets/pages/awards.scss
Normal file
|
@ -0,0 +1,86 @@
|
||||||
|
.awards {
|
||||||
|
@include clearfix;
|
||||||
|
line-height: 34px;
|
||||||
|
|
||||||
|
.award {
|
||||||
|
@include border-radius(5px);
|
||||||
|
|
||||||
|
border: 1px solid;
|
||||||
|
padding: 0px 10px;
|
||||||
|
float: left;
|
||||||
|
margin-right: 5px;
|
||||||
|
border-color: $border-color;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #dce0e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.active {
|
||||||
|
border-color: $border-gray-light;
|
||||||
|
background-color: $gray-light;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #dce0e5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.counter {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
float: left;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.counter {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.awards-controls {
|
||||||
|
margin-left: 10px;
|
||||||
|
float: left;
|
||||||
|
|
||||||
|
.add-award {
|
||||||
|
font-size: 24px;
|
||||||
|
color: $gl-gray;
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:link {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.awards-menu {
|
||||||
|
padding: $gl-padding;
|
||||||
|
min-width: 214px;
|
||||||
|
|
||||||
|
> li {
|
||||||
|
cursor: pointer;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
text-align: center;
|
||||||
|
@include border-radius(5px);
|
||||||
|
|
||||||
|
img {
|
||||||
|
margin-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.awards-menu{
|
||||||
|
li {
|
||||||
|
float: left;
|
||||||
|
margin: 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
.autoscroll-container {
|
.autoscroll-container {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 10px;
|
bottom: 20px;
|
||||||
right: 20px;
|
right: 20px;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
a {
|
a {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,9 +67,4 @@
|
||||||
color: #3084bb !important;
|
color: #3084bb !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.build-top-menu {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 2px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,6 @@
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.commit-title{
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.commit-author, .commit-committer{
|
.commit-author, .commit-committer{
|
||||||
display: block;
|
display: block;
|
||||||
color: #999;
|
color: #999;
|
||||||
|
@ -41,6 +37,8 @@
|
||||||
.commit-box {
|
.commit-box {
|
||||||
.commit-title {
|
.commit-title {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
font-size: 23px;
|
||||||
|
color: #313236;
|
||||||
}
|
}
|
||||||
|
|
||||||
.commit-description {
|
.commit-description {
|
||||||
|
@ -108,16 +106,3 @@
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.commit-ci-menu {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
list-style: none;
|
|
||||||
margin-top: 5px;
|
|
||||||
height: 56px;
|
|
||||||
margin: -16px;
|
|
||||||
padding: 16px;
|
|
||||||
text-align: center;
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-bottom: 2px;
|
|
||||||
}
|
|
||||||
|
|
33
app/assets/stylesheets/pages/detail_page.scss
Normal file
33
app/assets/stylesheets/pages/detail_page.scss
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
.detail-page-header {
|
||||||
|
margin: -$gl-padding;
|
||||||
|
padding: 7px $gl-padding;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
border-bottom: 1px solid $border-color;
|
||||||
|
color: #5c5d5e;
|
||||||
|
font-size: 16px;
|
||||||
|
line-height: 42px;
|
||||||
|
|
||||||
|
.author {
|
||||||
|
color: #5c5d5e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.identifier {
|
||||||
|
color: #5c5d5e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-page-description {
|
||||||
|
.title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 23px;
|
||||||
|
color: #313236;
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
margin-top: 6px;
|
||||||
|
|
||||||
|
p:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,48 +19,38 @@
|
||||||
color: #B94A48;
|
color: #B94A48;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.commit-button-annotation {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 0;
|
|
||||||
padding: 2px;
|
|
||||||
|
|
||||||
> * {
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message {
|
|
||||||
display: inline-block;
|
|
||||||
margin: 5px 8px 0 8px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.file-title {
|
.file-title {
|
||||||
@extend .monospace;
|
@extend .monospace;
|
||||||
|
|
||||||
|
line-height: 42px;
|
||||||
|
padding-top: 7px;
|
||||||
|
padding-bottom: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editor-ref {
|
.editor-ref {
|
||||||
background: $background-color;
|
background: $background-color;
|
||||||
padding: 11px 15px;
|
padding-right: $gl-padding;
|
||||||
border-right: 1px solid $border-color;
|
border-right: 1px solid $border-color;
|
||||||
display: inline-block;
|
display: block;
|
||||||
margin: -5px -5px;
|
float: left;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.editor-file-name {
|
.editor-file-name {
|
||||||
.new-file-name {
|
@extend .monospace;
|
||||||
display: inline-block;
|
|
||||||
width: 450px;
|
float: left;
|
||||||
}
|
margin-right: 10px;
|
||||||
|
|
||||||
.form-control {
|
|
||||||
margin-top: -3px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-actions {
|
.new-file-name {
|
||||||
margin: -$gl-padding;
|
display: inline-block;
|
||||||
margin-top: 0;
|
width: 450px;
|
||||||
padding: $gl-padding
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.select2 {
|
||||||
|
float: right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,3 @@
|
||||||
.new-group-member-holder {
|
|
||||||
margin-top: 50px;
|
|
||||||
padding-top: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.member-search-form {
|
.member-search-form {
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
@ -15,4 +10,4 @@
|
||||||
.form-control {
|
.form-control {
|
||||||
height: 42px;
|
height: 42px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,20 +24,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.issuable-context-title {
|
|
||||||
margin-bottom: 5px;
|
|
||||||
|
|
||||||
.avatar {
|
|
||||||
margin-left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
label {
|
|
||||||
color: $gl-gray;
|
|
||||||
font-weight: normal;
|
|
||||||
margin-right: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.project-issuable-filter {
|
.project-issuable-filter {
|
||||||
.controls {
|
.controls {
|
||||||
float: right;
|
float: right;
|
||||||
|
@ -50,33 +36,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.issuable-details {
|
.issuable-details {
|
||||||
.page-title {
|
section {
|
||||||
margin-top: -15px;
|
border-right: 1px solid $border-white-light;
|
||||||
padding: 10px 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
color: #5c5d5e;
|
|
||||||
font-size: 16px;
|
|
||||||
|
|
||||||
.author {
|
.issuable-discussion {
|
||||||
color: #5c5d5e;
|
margin-right: 1px;
|
||||||
}
|
|
||||||
|
|
||||||
.issue-id {
|
|
||||||
color: #5c5d5e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.issue-title {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 23px;
|
|
||||||
color: #313236;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
|
||||||
margin-top: 6px;
|
|
||||||
|
|
||||||
p:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,83 +53,65 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.cross-project-reference {
|
.issuable-show-labels {
|
||||||
text-align: center;
|
a {
|
||||||
width: 100%;
|
margin-right: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
.slead {
|
display: inline-block;
|
||||||
padding: 5px;
|
.color-label {
|
||||||
}
|
padding: 6px 10px;
|
||||||
|
}
|
||||||
span, button {
|
|
||||||
background-color: $background-color;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.awards {
|
.issuable-sidebar {
|
||||||
@include clearfix;
|
.block {
|
||||||
line-height: 34px;
|
@include clearfix;
|
||||||
margin: 2px 0;
|
padding: $gl-padding 0;
|
||||||
|
border-bottom: 1px solid #F0F0F0;
|
||||||
|
|
||||||
.award {
|
&:last-child {
|
||||||
@include border-radius(5px);
|
border: none;
|
||||||
|
|
||||||
border: 1px solid;
|
|
||||||
padding: 0px 10px;
|
|
||||||
float: left;
|
|
||||||
margin: 0 5px;
|
|
||||||
border-color: $border-color;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
&.active {
|
|
||||||
border-color: $border-gray-light;
|
|
||||||
background-color: $gray-light;
|
|
||||||
|
|
||||||
.counter {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
float: left;
|
|
||||||
margin-right: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.counter {
|
|
||||||
float: left;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.awards-controls {
|
.title {
|
||||||
margin-left: 10px;
|
color: $gl-text-color;
|
||||||
float: left;
|
margin-bottom: 8px;
|
||||||
|
|
||||||
.add-award {
|
.avatar {
|
||||||
font-size: 24px;
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
font-weight: normal;
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-link {
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
position: relative;
|
|
||||||
top: 2px;
|
|
||||||
|
|
||||||
&:hover,
|
|
||||||
&:link {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.awards-menu {
|
|
||||||
padding: $gl-padding;
|
|
||||||
min-width: 214px;
|
|
||||||
|
|
||||||
> li {
|
|
||||||
margin: 5px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.awards-menu{
|
.cross-project-reference {
|
||||||
li {
|
font-weight: bold;
|
||||||
float: left;
|
color: $gl-link-color;
|
||||||
margin: 3px;
|
|
||||||
|
button {
|
||||||
|
float: right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.selectbox {
|
||||||
|
display: none
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-clipboard {
|
||||||
|
color: $gl-gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.participants .avatar {
|
||||||
|
margin-top: 6px;
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,21 +56,30 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.issue-show-labels {
|
|
||||||
a {
|
|
||||||
margin-right: 5px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
display: inline-block;
|
|
||||||
.color-label {
|
|
||||||
padding: 6px 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
form.edit-issue {
|
form.edit-issue {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.merge-requests-title {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.merge-request-id {
|
||||||
|
display: inline-block;
|
||||||
|
width: 3em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.merge-request-info {
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.merge-request-status {
|
||||||
|
color: $gl-gray;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
.merge-request,
|
.merge-request,
|
||||||
.issue {
|
.issue {
|
||||||
&.today {
|
&.today {
|
||||||
|
@ -132,11 +141,6 @@ form.edit-issue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.issue-closed-by-widget {
|
|
||||||
padding: 16px 0;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.issue-form .select2-container {
|
.issue-form .select2-container {
|
||||||
width: 250px !important;
|
width: 250px !important;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
h1:first-child {
|
h1:first-child {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin-bottom: 30px;
|
margin-bottom: 30px;
|
||||||
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
*/
|
*/
|
||||||
.mr-state-widget {
|
.mr-state-widget {
|
||||||
background: #F7F8FA;
|
background: #F7F8FA;
|
||||||
margin-bottom: 20px;
|
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
border: 1px solid #dce0e6;
|
border: 1px solid #dce0e6;
|
||||||
@include border-radius(2px);
|
@include border-radius(2px);
|
||||||
|
@ -19,6 +18,7 @@
|
||||||
.accept-merge-holder {
|
.accept-merge-holder {
|
||||||
.accept-action {
|
.accept-action {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
|
|
||||||
.accept_merge_request {
|
.accept_merge_request {
|
||||||
&.ci-pending,
|
&.ci-pending,
|
||||||
|
@ -37,14 +37,15 @@
|
||||||
|
|
||||||
.accept-control {
|
.accept-control {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
float: left;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
padding-top: 12px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
|
||||||
&.right {
|
&.right {
|
||||||
float: right;
|
float: right;
|
||||||
padding-top: 12px;
|
|
||||||
a {
|
a {
|
||||||
color: $gl-gray;
|
color: $gl-gray;
|
||||||
}
|
}
|
||||||
|
@ -82,12 +83,16 @@
|
||||||
&.ci-error {
|
&.ci-error {
|
||||||
color: $gl-danger;
|
color: $gl-danger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.monospace {
|
||||||
|
color: inherit;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.mr-widget-body,
|
.mr-widget-body,
|
||||||
.ci_widget,
|
.ci_widget,
|
||||||
.mr-widget-footer {
|
.mr-widget-footer {
|
||||||
padding: 15px;
|
padding: $gl-padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
.normal {
|
.normal {
|
||||||
|
@ -116,28 +121,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.merge-request .merge-request-tabs {
|
|
||||||
@include nav-menu;
|
|
||||||
margin: -$gl-padding;
|
|
||||||
padding: $gl-padding;
|
|
||||||
text-align: center;
|
|
||||||
margin-bottom: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mobile
|
|
||||||
@media (max-width: 480px) {
|
|
||||||
.merge-request .merge-request-tabs {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
|
|
||||||
li {
|
|
||||||
a {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.mr_source_commit,
|
.mr_source_commit,
|
||||||
.mr_target_commit {
|
.mr_target_commit {
|
||||||
.commit {
|
.commit {
|
||||||
|
@ -155,7 +138,7 @@
|
||||||
font-family: $monospace_font;
|
font-family: $monospace_font;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: 14px;
|
font-size: 90%;
|
||||||
margin: 0 3px;
|
margin: 0 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -192,27 +175,12 @@
|
||||||
line-height: 1.1;
|
line-height: 1.1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.merge-request-form-info {
|
|
||||||
padding-top: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
// hide mr close link for inline diff comment form
|
// hide mr close link for inline diff comment form
|
||||||
.diff-file .close-mr-link,
|
.diff-file .close-mr-link,
|
||||||
.diff-file .reopen-mr-link {
|
.diff-file .reopen-mr-link {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.merge-request-show-labels {
|
|
||||||
a {
|
|
||||||
margin-right: 5px;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
display: inline-block;
|
|
||||||
.color-label {
|
|
||||||
padding: 6px 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.merge-request-form .select2-container {
|
.merge-request-form .select2-container {
|
||||||
width: 250px !important;
|
width: 250px !important;
|
||||||
}
|
}
|
||||||
|
@ -223,7 +191,7 @@
|
||||||
.btn-clipboard {
|
.btn-clipboard {
|
||||||
@extend .pull-right;
|
@extend .pull-right;
|
||||||
|
|
||||||
margin-right: 18px;
|
margin-right: 20px;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
}
|
}
|
||||||
.reply-btn {
|
.reply-btn {
|
||||||
@extend .btn-primary;
|
@extend .btn-primary;
|
||||||
|
margin: 10px $gl-padding;
|
||||||
}
|
}
|
||||||
.diff-file .diff-content {
|
.diff-file .diff-content {
|
||||||
tr.line_holder:hover {
|
tr.line_holder:hover {
|
||||||
|
@ -38,9 +39,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.new_note, .edit_note {
|
.new_note, .edit_note {
|
||||||
.buttons {
|
.note-form-actions {
|
||||||
margin-top: 8px;
|
margin-top: $gl-padding;
|
||||||
margin-bottom: 3px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.note-preview-holder {
|
.note-preview-holder {
|
||||||
|
@ -79,8 +79,7 @@
|
||||||
padding: $gl-padding;
|
padding: $gl-padding;
|
||||||
margin-left: -$gl-padding;
|
margin-left: -$gl-padding;
|
||||||
margin-right: -$gl-padding;
|
margin-right: -$gl-padding;
|
||||||
border-right: 1px solid #ECEEF1;
|
border-top: 1px solid $border-color;
|
||||||
border-top: 1px solid #ECEEF1;
|
|
||||||
margin-bottom: -$gl-padding;
|
margin-bottom: -$gl-padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,7 +149,6 @@
|
||||||
|
|
||||||
.discussion-reply-holder {
|
.discussion-reply-holder {
|
||||||
background: $background-color;
|
background: $background-color;
|
||||||
padding: 10px 15px;
|
|
||||||
border-top: 1px solid $border-color;
|
border-top: 1px solid $border-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,13 +109,9 @@ ul.notes {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reduce left padding of first task list ul element
|
ul.task-list {
|
||||||
ul.task-list:first-child {
|
ul:not(.task-list) {
|
||||||
padding-left: 10px;
|
padding-left: 1.3em;
|
||||||
|
|
||||||
// sub-tasks should be padded normally
|
|
||||||
ul {
|
|
||||||
padding-left: 20px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,12 +5,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-build-token {
|
|
||||||
float: left;
|
|
||||||
padding: 6px 20px;
|
|
||||||
margin-right: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.profile-avatar-form-option {
|
.profile-avatar-form-option {
|
||||||
hr {
|
hr {
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.no-ssh-key-message {
|
.no-ssh-key-message, .project-limit-message {
|
||||||
background-color: #f28d35;
|
background-color: #f28d35;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
@ -18,10 +18,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-edit-content {
|
|
||||||
padding: 7px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.project-name-holder {
|
.project-name-holder {
|
||||||
.help-inline {
|
.help-inline {
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
|
@ -30,12 +26,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-home-panel {
|
.project-home-panel {
|
||||||
text-align: center;
|
|
||||||
background: #f7f8fa;
|
|
||||||
margin: -$gl-padding;
|
|
||||||
padding: $gl-padding;
|
|
||||||
padding: 44px 0 17px 0;
|
|
||||||
|
|
||||||
.project-identicon-holder {
|
.project-identicon-holder {
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
@ -90,7 +80,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.visibility-level-label {
|
.visibility-level-label {
|
||||||
|
@extend .btn;
|
||||||
|
@extend .btn-gray;
|
||||||
|
|
||||||
color: $gray;
|
color: $gray;
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
i {
|
i {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
@ -100,7 +95,6 @@
|
||||||
display: inline-table;
|
display: inline-table;
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 17px;
|
top: 17px;
|
||||||
margin-bottom: 44px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-repo-buttons {
|
.project-repo-buttons {
|
||||||
|
@ -178,6 +172,11 @@
|
||||||
&:active {
|
&:active {
|
||||||
outline: none;
|
outline: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.btn-clipboard {
|
||||||
|
padding-left: 15px;
|
||||||
|
padding-right: 15px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.active {
|
.active {
|
||||||
|
@ -366,7 +365,7 @@ table.table.protected-branches-list tr.no-border {
|
||||||
|
|
||||||
.project-stats {
|
.project-stats {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 15px;
|
margin-top: $gl-padding;
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
padding-bottom: 4px;
|
padding-bottom: 4px;
|
||||||
|
@ -552,4 +551,4 @@ pre.light-well {
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,56 +27,28 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.snippet-holder {
|
.snippet-holder {
|
||||||
.snippet-details {
|
margin-bottom: -$gl-padding;
|
||||||
.page-title {
|
|
||||||
margin-top: -15px;
|
|
||||||
padding: 10px 0;
|
|
||||||
margin-bottom: 0;
|
|
||||||
color: #5c5d5e;
|
|
||||||
font-size: 16px;
|
|
||||||
|
|
||||||
.author {
|
|
||||||
color: #5c5d5e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.snippet-id {
|
|
||||||
color: #5c5d5e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.snippet-title {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 23px;
|
|
||||||
color: #313236;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $screen-md-max) {
|
|
||||||
.new-snippet-link {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: $screen-sm-max) {
|
|
||||||
.creator,
|
|
||||||
.page-title .btn-close {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.file-holder {
|
.file-holder {
|
||||||
border-top: 0;
|
border-top: 0;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
.file-actions {
|
||||||
|
.btn-clipboard {
|
||||||
|
@extend .btn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.snippet-box {
|
.snippet-box {
|
||||||
@include border-radius(2px);
|
@include border-radius(2px);
|
||||||
|
|
||||||
display: inline-block;
|
display: block;
|
||||||
padding: 10px $gl-padding;
|
float: left;
|
||||||
|
padding: 0 $gl-padding;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
font-size: $gl-font-size;
|
font-size: $gl-font-size;
|
||||||
border: 1px solid;
|
border: 1px solid;
|
||||||
|
line-height: 40px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,3 +35,20 @@
|
||||||
border-color: $gl-warning;
|
border-color: $gl-warning;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ci-status-icon-success {
|
||||||
|
@extend .cgreen;
|
||||||
|
}
|
||||||
|
.ci-status-icon-failed {
|
||||||
|
@extend .cred;
|
||||||
|
}
|
||||||
|
.ci-status-icon-running,
|
||||||
|
.ci-status-icon-pending {
|
||||||
|
// These are standard text color
|
||||||
|
}
|
||||||
|
.ci-status-icon-canceled,
|
||||||
|
.ci-status-icon-disabled,
|
||||||
|
.ci-status-icon-not-found,
|
||||||
|
.ci-status-icon-skipped {
|
||||||
|
@extend .cgray;
|
||||||
|
}
|
||||||
|
|
|
@ -1,9 +1,6 @@
|
||||||
.gitlab-ui-dev-kit {
|
.gitlab-ui-dev-kit {
|
||||||
> h2 {
|
> h2 {
|
||||||
font-size: 27px;
|
margin: 35px 0 20px;
|
||||||
border-bottom: 1px solid #CCC;
|
|
||||||
color: #666;
|
|
||||||
margin: 30px 0;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,3 +4,8 @@
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
padding-right: 7px;
|
padding-right: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wiki-last-edit-by {
|
||||||
|
font-size: 80%;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ class AbuseReportsController < ApplicationController
|
||||||
|
|
||||||
if @abuse_report.save
|
if @abuse_report.save
|
||||||
if current_application_settings.admin_notification_email.present?
|
if current_application_settings.admin_notification_email.present?
|
||||||
AbuseReportMailer.delay.notify(@abuse_report.id)
|
AbuseReportMailer.notify(@abuse_report.id).deliver_later
|
||||||
end
|
end
|
||||||
|
|
||||||
message = "Thank you for your report. A GitLab administrator will look into it shortly."
|
message = "Thank you for your report. A GitLab administrator will look into it shortly."
|
||||||
|
|
|
@ -13,6 +13,12 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def reset_runners_token
|
||||||
|
@application_setting.reset_runners_registration_token!
|
||||||
|
flash[:notice] = 'New runners registration token has been generated!'
|
||||||
|
redirect_to admin_runners_path
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_application_setting
|
def set_application_setting
|
||||||
|
|
23
app/controllers/admin/builds_controller.rb
Normal file
23
app/controllers/admin/builds_controller.rb
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
class Admin::BuildsController < Admin::ApplicationController
|
||||||
|
def index
|
||||||
|
@scope = params[:scope]
|
||||||
|
@all_builds = Ci::Build
|
||||||
|
@builds = @all_builds.order('created_at DESC')
|
||||||
|
@builds =
|
||||||
|
case @scope
|
||||||
|
when 'all'
|
||||||
|
@builds
|
||||||
|
when 'finished'
|
||||||
|
@builds.finished
|
||||||
|
else
|
||||||
|
@builds.running_or_pending.reverse_order
|
||||||
|
end
|
||||||
|
@builds = @builds.page(params[:page]).per(30)
|
||||||
|
end
|
||||||
|
|
||||||
|
def cancel_all
|
||||||
|
Ci::Build.running_or_pending.each(&:cancel)
|
||||||
|
|
||||||
|
redirect_to admin_builds_path
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,6 +1,21 @@
|
||||||
class Admin::IdentitiesController < Admin::ApplicationController
|
class Admin::IdentitiesController < Admin::ApplicationController
|
||||||
before_action :user
|
before_action :user
|
||||||
before_action :identity, except: :index
|
before_action :identity, except: [:index, :new, :create]
|
||||||
|
|
||||||
|
def new
|
||||||
|
@identity = Identity.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@identity = Identity.new(identity_params)
|
||||||
|
@identity.user_id = user.id
|
||||||
|
|
||||||
|
if @identity.save
|
||||||
|
redirect_to admin_user_identities_path(@user), notice: 'User identity was successfully created.'
|
||||||
|
else
|
||||||
|
render :new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@identities = @user.identities
|
@identities = @user.identities
|
||||||
|
|
|
@ -5,14 +5,20 @@ class Admin::ImpersonationController < Admin::ApplicationController
|
||||||
before_action :authorize_impersonator!
|
before_action :authorize_impersonator!
|
||||||
|
|
||||||
def create
|
def create
|
||||||
session[:impersonator_id] = current_user.username
|
if @user.blocked?
|
||||||
session[:impersonator_return_to] = request.env['HTTP_REFERER']
|
flash[:alert] = "You cannot impersonate a blocked user"
|
||||||
|
|
||||||
warden.set_user(user, scope: 'user')
|
redirect_to admin_user_path(@user)
|
||||||
|
else
|
||||||
|
session[:impersonator_id] = current_user.username
|
||||||
|
session[:impersonator_return_to] = admin_user_path(@user)
|
||||||
|
|
||||||
flash[:alert] = "You are impersonating #{user.username}."
|
warden.set_user(user, scope: 'user')
|
||||||
|
|
||||||
redirect_to root_path
|
flash[:alert] = "You are impersonating #{user.username}."
|
||||||
|
|
||||||
|
redirect_to root_path
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def destroy
|
def destroy
|
||||||
|
|
35
app/controllers/admin/runner_projects_controller.rb
Normal file
35
app/controllers/admin/runner_projects_controller.rb
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
class Admin::RunnerProjectsController < Admin::ApplicationController
|
||||||
|
before_action :project, only: [:create]
|
||||||
|
|
||||||
|
def index
|
||||||
|
@runner_projects = project.runner_projects.all
|
||||||
|
@runner_project = project.runner_projects.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@runner = Ci::Runner.find(params[:runner_project][:runner_id])
|
||||||
|
|
||||||
|
if @runner.assign_to(@project, current_user)
|
||||||
|
redirect_to admin_runner_path(@runner)
|
||||||
|
else
|
||||||
|
redirect_to admin_runner_path(@runner), alert: 'Failed adding runner to project'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
rp = Ci::RunnerProject.find(params[:id])
|
||||||
|
runner = rp.runner
|
||||||
|
rp.destroy
|
||||||
|
|
||||||
|
redirect_to admin_runner_path(runner)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def project
|
||||||
|
@project = Project.find_with_namespace(
|
||||||
|
[params[:namespace_id], '/', params[:project_id]].join('')
|
||||||
|
)
|
||||||
|
@project || render_404
|
||||||
|
end
|
||||||
|
end
|
63
app/controllers/admin/runners_controller.rb
Normal file
63
app/controllers/admin/runners_controller.rb
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
class Admin::RunnersController < Admin::ApplicationController
|
||||||
|
before_action :runner, except: :index
|
||||||
|
|
||||||
|
def index
|
||||||
|
@runners = Ci::Runner.order('id DESC')
|
||||||
|
@runners = @runners.search(params[:search]) if params[:search].present?
|
||||||
|
@runners = @runners.page(params[:page]).per(30)
|
||||||
|
@active_runners_cnt = Ci::Runner.online.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@builds = @runner.builds.order('id DESC').first(30)
|
||||||
|
@projects =
|
||||||
|
if params[:search].present?
|
||||||
|
::Project.search(params[:search])
|
||||||
|
else
|
||||||
|
Project.all
|
||||||
|
end
|
||||||
|
@projects = @projects.where.not(id: @runner.projects.select(:id)) if @runner.projects.any?
|
||||||
|
@projects = @projects.page(params[:page]).per(30)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@runner.update_attributes(runner_params)
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.js
|
||||||
|
format.html { redirect_to admin_runner_path(@runner) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
@runner.destroy
|
||||||
|
|
||||||
|
redirect_to admin_runners_path
|
||||||
|
end
|
||||||
|
|
||||||
|
def resume
|
||||||
|
if @runner.update_attributes(active: true)
|
||||||
|
redirect_to admin_runners_path, notice: 'Runner was successfully updated.'
|
||||||
|
else
|
||||||
|
redirect_to admin_runners_path, alert: 'Runner was not updated.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def pause
|
||||||
|
if @runner.update_attributes(active: false)
|
||||||
|
redirect_to admin_runners_path, notice: 'Runner was successfully updated.'
|
||||||
|
else
|
||||||
|
redirect_to admin_runners_path, alert: 'Runner was not updated.'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def runner
|
||||||
|
@runner ||= Ci::Runner.find(params[:id])
|
||||||
|
end
|
||||||
|
|
||||||
|
def runner_params
|
||||||
|
params.require(:runner).permit(:token, :description, :tag_list, :active)
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,41 +1,15 @@
|
||||||
class AutocompleteController < ApplicationController
|
class AutocompleteController < ApplicationController
|
||||||
skip_before_action :authenticate_user!, only: [:users]
|
skip_before_action :authenticate_user!, only: [:users]
|
||||||
|
before_action :find_users, only: [:users]
|
||||||
|
|
||||||
def users
|
def users
|
||||||
begin
|
|
||||||
@users =
|
|
||||||
if params[:project_id].present?
|
|
||||||
project = Project.find(params[:project_id])
|
|
||||||
|
|
||||||
if can?(current_user, :read_project, project)
|
|
||||||
project.team.users
|
|
||||||
end
|
|
||||||
elsif params[:group_id]
|
|
||||||
group = Group.find(params[:group_id])
|
|
||||||
|
|
||||||
if can?(current_user, :read_group, group)
|
|
||||||
group.users
|
|
||||||
end
|
|
||||||
elsif current_user
|
|
||||||
User.all
|
|
||||||
end
|
|
||||||
rescue ActiveRecord::RecordNotFound
|
|
||||||
if current_user
|
|
||||||
return render json: {}, status: 404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if @users.nil? && current_user.nil?
|
|
||||||
authenticate_user!
|
|
||||||
end
|
|
||||||
|
|
||||||
@users ||= User.none
|
@users ||= User.none
|
||||||
@users = @users.search(params[:search]) if params[:search].present?
|
@users = @users.search(params[:search]) if params[:search].present?
|
||||||
@users = @users.active
|
@users = @users.active
|
||||||
@users = @users.reorder(:name)
|
@users = @users.reorder(:name)
|
||||||
@users = @users.page(params[:page]).per(PER_PAGE)
|
@users = @users.page(params[:page]).per(PER_PAGE)
|
||||||
|
|
||||||
unless params[:search].present?
|
if params[:search].blank?
|
||||||
# Include current user if available to filter by "Me"
|
# Include current user if available to filter by "Me"
|
||||||
if params[:current_user] && current_user
|
if params[:current_user] && current_user
|
||||||
@users = [*@users, current_user].uniq
|
@users = [*@users, current_user].uniq
|
||||||
|
@ -49,4 +23,25 @@ class AutocompleteController < ApplicationController
|
||||||
@user = User.find(params[:id])
|
@user = User.find(params[:id])
|
||||||
render json: @user, only: [:name, :username, :id], methods: [:avatar_url]
|
render json: @user, only: [:name, :username, :id], methods: [:avatar_url]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def find_users
|
||||||
|
@users =
|
||||||
|
if params[:project_id].present?
|
||||||
|
project = Project.find(params[:project_id])
|
||||||
|
return render_404 unless can?(current_user, :read_project, project)
|
||||||
|
|
||||||
|
project.team.users
|
||||||
|
elsif params[:group_id].present?
|
||||||
|
group = Group.find(params[:group_id])
|
||||||
|
return render_404 unless can?(current_user, :read_group, group)
|
||||||
|
|
||||||
|
group.users
|
||||||
|
elsif current_user
|
||||||
|
User.all
|
||||||
|
else
|
||||||
|
User.none
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
module Ci
|
|
||||||
module Admin
|
|
||||||
class ApplicationController < Ci::ApplicationController
|
|
||||||
before_action :authenticate_user!
|
|
||||||
before_action :authenticate_admin!
|
|
||||||
|
|
||||||
layout "ci/admin"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,31 +0,0 @@
|
||||||
module Ci
|
|
||||||
class Admin::ApplicationSettingsController < Ci::Admin::ApplicationController
|
|
||||||
before_action :set_application_setting
|
|
||||||
|
|
||||||
def show
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
|
||||||
if @application_setting.update_attributes(application_setting_params)
|
|
||||||
redirect_to ci_admin_application_settings_path,
|
|
||||||
notice: 'Application settings saved successfully'
|
|
||||||
else
|
|
||||||
render :show
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def set_application_setting
|
|
||||||
@application_setting = Ci::ApplicationSetting.current
|
|
||||||
@application_setting ||= Ci::ApplicationSetting.create_from_defaults
|
|
||||||
end
|
|
||||||
|
|
||||||
def application_setting_params
|
|
||||||
params.require(:application_setting).permit(
|
|
||||||
:all_broken_builds,
|
|
||||||
:add_pusher,
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,18 +0,0 @@
|
||||||
module Ci
|
|
||||||
class Admin::BuildsController < Ci::Admin::ApplicationController
|
|
||||||
def index
|
|
||||||
@scope = params[:scope]
|
|
||||||
@builds = Ci::Build.order('created_at DESC').page(params[:page]).per(30)
|
|
||||||
|
|
||||||
@builds =
|
|
||||||
case @scope
|
|
||||||
when "pending"
|
|
||||||
@builds.pending
|
|
||||||
when "running"
|
|
||||||
@builds.running
|
|
||||||
else
|
|
||||||
@builds
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,9 +0,0 @@
|
||||||
module Ci
|
|
||||||
class Admin::EventsController < Ci::Admin::ApplicationController
|
|
||||||
EVENTS_PER_PAGE = 50
|
|
||||||
|
|
||||||
def index
|
|
||||||
@events = Ci::Event.admin.order('created_at DESC').page(params[:page]).per(EVENTS_PER_PAGE)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,19 +0,0 @@
|
||||||
module Ci
|
|
||||||
class Admin::ProjectsController < Ci::Admin::ApplicationController
|
|
||||||
def index
|
|
||||||
@projects = Ci::Project.ordered_by_last_commit_date.page(params[:page]).per(30)
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
|
||||||
project.destroy
|
|
||||||
|
|
||||||
redirect_to ci_projects_url
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def project
|
|
||||||
@project ||= Ci::Project.find(params[:id])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,34 +0,0 @@
|
||||||
module Ci
|
|
||||||
class Admin::RunnerProjectsController < Ci::Admin::ApplicationController
|
|
||||||
layout 'ci/project'
|
|
||||||
|
|
||||||
def index
|
|
||||||
@runner_projects = project.runner_projects.all
|
|
||||||
@runner_project = project.runner_projects.new
|
|
||||||
end
|
|
||||||
|
|
||||||
def create
|
|
||||||
@runner = Ci::Runner.find(params[:runner_project][:runner_id])
|
|
||||||
|
|
||||||
if @runner.assign_to(project, current_user)
|
|
||||||
redirect_to ci_admin_runner_path(@runner)
|
|
||||||
else
|
|
||||||
redirect_to ci_admin_runner_path(@runner), alert: 'Failed adding runner to project'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
|
||||||
rp = Ci::RunnerProject.find(params[:id])
|
|
||||||
runner = rp.runner
|
|
||||||
rp.destroy
|
|
||||||
|
|
||||||
redirect_to ci_admin_runner_path(runner)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def project
|
|
||||||
@project ||= Ci::Project.find(params[:project_id])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,73 +0,0 @@
|
||||||
module Ci
|
|
||||||
class Admin::RunnersController < Ci::Admin::ApplicationController
|
|
||||||
before_action :runner, except: :index
|
|
||||||
|
|
||||||
def index
|
|
||||||
@runners = Ci::Runner.order('id DESC')
|
|
||||||
@runners = @runners.search(params[:search]) if params[:search].present?
|
|
||||||
@runners = @runners.page(params[:page]).per(30)
|
|
||||||
@active_runners_cnt = Ci::Runner.online.count
|
|
||||||
end
|
|
||||||
|
|
||||||
def show
|
|
||||||
@builds = @runner.builds.order('id DESC').first(30)
|
|
||||||
@projects = Ci::Project.all
|
|
||||||
if params[:search].present?
|
|
||||||
@gl_projects = ::Project.search(params[:search])
|
|
||||||
@projects = @projects.where(gitlab_id: @gl_projects.select(:id))
|
|
||||||
end
|
|
||||||
@projects = @projects.where("ci_projects.id NOT IN (?)", @runner.projects.pluck(:id)) if @runner.projects.any?
|
|
||||||
@projects = @projects.joins(:gl_project)
|
|
||||||
@projects = @projects.page(params[:page]).per(30)
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
|
||||||
@runner.update_attributes(runner_params)
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.js
|
|
||||||
format.html { redirect_to ci_admin_runner_path(@runner) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
|
||||||
@runner.destroy
|
|
||||||
|
|
||||||
redirect_to ci_admin_runners_path
|
|
||||||
end
|
|
||||||
|
|
||||||
def resume
|
|
||||||
if @runner.update_attributes(active: true)
|
|
||||||
redirect_to ci_admin_runners_path, notice: 'Runner was successfully updated.'
|
|
||||||
else
|
|
||||||
redirect_to ci_admin_runners_path, alert: 'Runner was not updated.'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def pause
|
|
||||||
if @runner.update_attributes(active: false)
|
|
||||||
redirect_to ci_admin_runners_path, notice: 'Runner was successfully updated.'
|
|
||||||
else
|
|
||||||
redirect_to ci_admin_runners_path, alert: 'Runner was not updated.'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def assign_all
|
|
||||||
Ci::Project.unassigned(@runner).all.each do |project|
|
|
||||||
@runner.assign_to(project, current_user)
|
|
||||||
end
|
|
||||||
|
|
||||||
redirect_to ci_admin_runner_path(@runner), notice: "Runner was assigned to all projects"
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def runner
|
|
||||||
@runner ||= Ci::Runner.find(params[:id])
|
|
||||||
end
|
|
||||||
|
|
||||||
def runner_params
|
|
||||||
params.require(:runner).permit(:token, :description, :tag_list, :active)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -4,24 +4,16 @@ module Ci
|
||||||
"app/helpers/ci"
|
"app/helpers/ci"
|
||||||
end
|
end
|
||||||
|
|
||||||
helper_method :gl_project
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def authenticate_token!
|
|
||||||
unless project.valid_token?(params[:token])
|
|
||||||
return head(403)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def authorize_access_project!
|
def authorize_access_project!
|
||||||
unless can?(current_user, :read_project, gl_project)
|
unless can?(current_user, :read_project, project)
|
||||||
return page_404
|
return page_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def authorize_manage_builds!
|
def authorize_manage_builds!
|
||||||
unless can?(current_user, :manage_builds, gl_project)
|
unless can?(current_user, :manage_builds, project)
|
||||||
return page_404
|
return page_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -31,7 +23,7 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
def authorize_manage_project!
|
def authorize_manage_project!
|
||||||
unless can?(current_user, :admin_project, gl_project)
|
unless can?(current_user, :admin_project, project)
|
||||||
return page_404
|
return page_404
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -58,9 +50,5 @@ module Ci
|
||||||
count: count
|
count: count
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def gl_project
|
|
||||||
::Project.find(@project.gitlab_id)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module Ci
|
module Ci
|
||||||
class LintsController < Ci::ApplicationController
|
class LintsController < ApplicationController
|
||||||
before_action :authenticate_user!
|
before_action :authenticate_user!
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|
|
@ -3,13 +3,12 @@ module Ci
|
||||||
before_action :project, except: [:index]
|
before_action :project, except: [:index]
|
||||||
before_action :authenticate_user!, except: [:index, :build, :badge]
|
before_action :authenticate_user!, except: [:index, :build, :badge]
|
||||||
before_action :authorize_access_project!, except: [:index, :badge]
|
before_action :authorize_access_project!, except: [:index, :badge]
|
||||||
before_action :authorize_manage_project!, only: [:toggle_shared_runners, :dumped_yaml]
|
|
||||||
before_action :no_cache, only: [:badge]
|
before_action :no_cache, only: [:badge]
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
|
|
||||||
def show
|
def show
|
||||||
# Temporary compatibility with CI badges pointing to CI project page
|
# Temporary compatibility with CI badges pointing to CI project page
|
||||||
redirect_to namespace_project_path(project.gl_project.namespace, project.gl_project)
|
redirect_to namespace_project_path(project.namespace, project)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Project status badge
|
# Project status badge
|
||||||
|
@ -20,16 +19,10 @@ module Ci
|
||||||
send_file image.path, filename: image.name, disposition: 'inline', type:"image/svg+xml"
|
send_file image.path, filename: image.name, disposition: 'inline', type:"image/svg+xml"
|
||||||
end
|
end
|
||||||
|
|
||||||
def toggle_shared_runners
|
|
||||||
project.toggle!(:shared_runners_enabled)
|
|
||||||
|
|
||||||
redirect_to namespace_project_runners_path(project.gl_project.namespace, project.gl_project)
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def project
|
def project
|
||||||
@project ||= Ci::Project.find(params[:id])
|
@project ||= Project.find_by(ci_id: params[:id].to_i)
|
||||||
end
|
end
|
||||||
|
|
||||||
def no_cache
|
def no_cache
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
module Ci
|
|
||||||
class RunnerProjectsController < Ci::ApplicationController
|
|
||||||
before_action :authenticate_user!
|
|
||||||
before_action :project
|
|
||||||
before_action :authorize_manage_project!
|
|
||||||
|
|
||||||
def create
|
|
||||||
@runner = Ci::Runner.find(params[:runner_project][:runner_id])
|
|
||||||
|
|
||||||
return head(403) unless current_user.ci_authorized_runners.include?(@runner)
|
|
||||||
|
|
||||||
path = runners_path(@project.gl_project)
|
|
||||||
|
|
||||||
if @runner.assign_to(project, current_user)
|
|
||||||
redirect_to path
|
|
||||||
else
|
|
||||||
redirect_to path, alert: 'Failed adding runner to project'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
|
||||||
runner_project = project.runner_projects.find(params[:id])
|
|
||||||
runner_project.destroy
|
|
||||||
|
|
||||||
redirect_to runners_path(@project.gl_project)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def project
|
|
||||||
@project ||= Ci::Project.find(params[:project_id])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -2,8 +2,10 @@ module GlobalMilestones
|
||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
def milestones
|
def milestones
|
||||||
|
epoch = DateTime.parse('1970-01-01')
|
||||||
@milestones = MilestonesFinder.new.execute(@projects, params)
|
@milestones = MilestonesFinder.new.execute(@projects, params)
|
||||||
@milestones = GlobalMilestone.build_collection(@milestones)
|
@milestones = GlobalMilestone.build_collection(@milestones)
|
||||||
|
@milestones = @milestones.sort_by { |x| x.due_date.nil? ? epoch : x.due_date }
|
||||||
@milestones = Kaminari.paginate_array(@milestones).page(params[:page]).per(ApplicationController::PER_PAGE)
|
@milestones = Kaminari.paginate_array(@milestones).page(params[:page]).per(ApplicationController::PER_PAGE)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
14
app/controllers/concerns/issues_action.rb
Normal file
14
app/controllers/concerns/issues_action.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
module IssuesAction
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
def issues
|
||||||
|
@issues = get_issues_collection
|
||||||
|
@issues = @issues.page(params[:page]).per(ApplicationController::PER_PAGE)
|
||||||
|
@issues = @issues.preload(:author, :project)
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.atom { render layout: false }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
9
app/controllers/concerns/merge_requests_action.rb
Normal file
9
app/controllers/concerns/merge_requests_action.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module MergeRequestsAction
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
def merge_requests
|
||||||
|
@merge_requests = get_merge_requests_collection
|
||||||
|
@merge_requests = @merge_requests.page(params[:page]).per(ApplicationController::PER_PAGE)
|
||||||
|
@merge_requests = @merge_requests.preload(:author, :target_project)
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,6 +1,7 @@
|
||||||
class Dashboard::SnippetsController < Dashboard::ApplicationController
|
class Dashboard::SnippetsController < Dashboard::ApplicationController
|
||||||
def index
|
def index
|
||||||
@snippets = SnippetsFinder.new.execute(current_user,
|
@snippets = SnippetsFinder.new.execute(
|
||||||
|
current_user,
|
||||||
filter: :by_user,
|
filter: :by_user,
|
||||||
user: current_user,
|
user: current_user,
|
||||||
scope: params[:scope]
|
scope: params[:scope]
|
||||||
|
|
|
@ -1,26 +1,12 @@
|
||||||
class DashboardController < Dashboard::ApplicationController
|
class DashboardController < Dashboard::ApplicationController
|
||||||
|
include IssuesAction
|
||||||
|
include MergeRequestsAction
|
||||||
|
|
||||||
before_action :event_filter, only: :activity
|
before_action :event_filter, only: :activity
|
||||||
before_action :projects, only: [:issues, :merge_requests]
|
before_action :projects, only: [:issues, :merge_requests]
|
||||||
|
|
||||||
respond_to :html
|
respond_to :html
|
||||||
|
|
||||||
def merge_requests
|
|
||||||
@merge_requests = get_merge_requests_collection
|
|
||||||
@merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE)
|
|
||||||
@merge_requests = @merge_requests.preload(:author, :target_project)
|
|
||||||
end
|
|
||||||
|
|
||||||
def issues
|
|
||||||
@issues = get_issues_collection
|
|
||||||
@issues = @issues.page(params[:page]).per(PER_PAGE)
|
|
||||||
@issues = @issues.preload(:author, :project)
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.html
|
|
||||||
format.atom { render layout: false }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def activity
|
def activity
|
||||||
@last_push = current_user.recent_push
|
@last_push = current_user.recent_push
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ class Groups::MilestonesController < Groups::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def milestone_path(title)
|
def milestone_path(title)
|
||||||
group_milestone_path(@group, title.parameterize, title: title)
|
group_milestone_path(@group, title.to_slug.to_s, title: title)
|
||||||
end
|
end
|
||||||
|
|
||||||
def projects
|
def projects
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
class GroupsController < Groups::ApplicationController
|
class GroupsController < Groups::ApplicationController
|
||||||
|
include IssuesAction
|
||||||
|
include MergeRequestsAction
|
||||||
|
|
||||||
skip_before_action :authenticate_user!, only: [:show, :issues, :merge_requests]
|
skip_before_action :authenticate_user!, only: [:show, :issues, :merge_requests]
|
||||||
respond_to :html
|
respond_to :html
|
||||||
before_action :group, except: [:new, :create]
|
before_action :group, except: [:new, :create]
|
||||||
|
@ -53,23 +56,6 @@ class GroupsController < Groups::ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def merge_requests
|
|
||||||
@merge_requests = get_merge_requests_collection
|
|
||||||
@merge_requests = @merge_requests.page(params[:page]).per(PER_PAGE)
|
|
||||||
@merge_requests = @merge_requests.preload(:author, :target_project)
|
|
||||||
end
|
|
||||||
|
|
||||||
def issues
|
|
||||||
@issues = get_issues_collection
|
|
||||||
@issues = @issues.page(params[:page]).per(PER_PAGE)
|
|
||||||
@issues = @issues.preload(:author, :project)
|
|
||||||
|
|
||||||
respond_to do |format|
|
|
||||||
format.html
|
|
||||||
format.atom { render layout: false }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def edit
|
def edit
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,9 @@ class PasswordsController < Devise::PasswordsController
|
||||||
def throttle_reset
|
def throttle_reset
|
||||||
return unless resource && resource.recently_sent_password_reset?
|
return unless resource && resource.recently_sent_password_reset?
|
||||||
|
|
||||||
redirect_to new_password_path(resource_name),
|
# Throttle reset attempts, but return a normal message to
|
||||||
alert: I18n.t('devise.passwords.recently_reset')
|
# avoid user enumeration attack.
|
||||||
|
redirect_to new_user_session_path,
|
||||||
|
notice: I18n.t('devise.passwords.send_paranoid_instructions')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue