From 886c2c3fe47d69634fc970065d3a3f2f32830f7f Mon Sep 17 00:00:00 2001 From: Praveen Arimbrathodiyil Date: Thu, 2 Jun 2016 11:05:42 +0530 Subject: [PATCH] Imported Upstream version 8.8.2+dfsg --- .csscomb.json | 20 + .gitignore | 1 + .gitlab-ci.yml | 164 +- .rubocop.yml | 2076 +-- .scss-lint.yml | 264 + CHANGELOG | 520 +- CONTRIBUTING.md | 134 +- GITLAB_SHELL_VERSION | 2 +- GITLAB_WORKHORSE_VERSION | 2 +- Gemfile | 83 +- Gemfile.lock | 359 +- PROCESS.md | 131 +- README.md | 12 +- VERSION | 2 +- app/assets/images/ci/arch.jpg | Bin 25222 -> 0 bytes app/assets/images/ci/favicon.ico | Bin 5430 -> 0 bytes app/assets/images/ci/loader.gif | Bin 4405 -> 0 bytes app/assets/images/ci/no_avatar.png | Bin 1337 -> 0 bytes app/assets/images/ci/rails.png | Bin 6646 -> 0 bytes app/assets/images/ci/service_sample.png | Bin 76024 -> 0 bytes app/assets/javascripts/activities.js.coffee | 18 +- app/assets/javascripts/api.js.coffee | 54 +- app/assets/javascripts/application.js.coffee | 85 +- app/assets/javascripts/aside.js.coffee | 1 - app/assets/javascripts/autosave.js.coffee | 6 +- app/assets/javascripts/awards_handler.coffee | 181 +- .../behaviors/quick_submit.js.coffee | 55 +- .../behaviors/requires_input.js.coffee | 16 +- .../blob/blob_gitignore_selector.js.coffee | 58 + .../blob/blob_license_selector.js.coffee | 30 + .../javascripts/blob/edit_blob.js.coffee | 68 +- .../javascripts/blob/new_blob.js.coffee | 20 - app/assets/javascripts/breakpoints.coffee | 37 + .../javascripts/ci/application.js.coffee | 28 - app/assets/javascripts/ci/build.coffee | 37 +- app/assets/javascripts/commits.js.coffee | 2 +- app/assets/javascripts/compare.js.coffee | 67 + app/assets/javascripts/dashboard.js.coffee | 31 - app/assets/javascripts/dispatcher.js.coffee | 46 +- .../javascripts/dropzone_input.js.coffee | 10 +- .../javascripts/due_date_select.js.coffee | 81 + .../javascripts/gfm_auto_complete.js.coffee | 84 +- app/assets/javascripts/gl_crop.js.coffee | 152 + app/assets/javascripts/gl_dropdown.js.coffee | 550 + app/assets/javascripts/gl_form.js.coffee | 51 + .../javascripts/importer_status.js.coffee | 37 +- app/assets/javascripts/issuable.js.coffee | 84 + .../javascripts/issuable_context.js.coffee | 59 +- .../javascripts/issuable_form.js.coffee | 52 +- app/assets/javascripts/issue.js.coffee | 61 +- .../javascripts/issue_status_select.js.coffee | 11 + app/assets/javascripts/issues.js.coffee | 42 +- .../javascripts/labels_select.js.coffee | 301 + app/assets/javascripts/lib/animate.js.coffee | 39 + .../lib/datetime_utility.js.coffee | 17 + app/assets/javascripts/lib/notify.js.coffee | 35 + .../javascripts/lib/type_utility.js.coffee | 9 + .../javascripts/lib/url_utility.js.coffee | 43 + app/assets/javascripts/logo.js.coffee | 2 +- .../javascripts/markdown_preview.js.coffee | 46 +- .../javascripts/merge_request.js.coffee | 16 - .../javascripts/merge_request_tabs.js.coffee | 73 +- .../merge_request_widget.js.coffee | 105 +- .../javascripts/merge_requests.js.coffee | 35 - app/assets/javascripts/milestone.js.coffee | 7 +- .../javascripts/milestone_select.js.coffee | 130 + app/assets/javascripts/notes.js.coffee | 244 +- app/assets/javascripts/pager.js.coffee | 3 +- app/assets/javascripts/profile.js.coffee | 76 +- app/assets/javascripts/project.js.coffee | 18 +- app/assets/javascripts/project_new.js.coffee | 13 + .../javascripts/project_select.js.coffee | 32 + .../javascripts/projects_list.js.coffee | 59 +- .../javascripts/right_sidebar.js.coffee | 87 + app/assets/javascripts/search.js.coffee | 75 + .../javascripts/search_autocomplete.js.coffee | 303 +- app/assets/javascripts/shortcuts.js.coffee | 56 +- .../javascripts/shortcuts_issuable.coffee | 24 +- .../javascripts/shortcuts_navigation.coffee | 1 + app/assets/javascripts/sidebar.js.coffee | 19 +- .../stat_graph_contributors_util.js.coffee | 2 +- app/assets/javascripts/subscription.js.coffee | 34 +- app/assets/javascripts/todos.js.coffee | 110 + app/assets/javascripts/user.js.coffee | 11 +- app/assets/javascripts/user_tabs.js.coffee | 153 + app/assets/javascripts/users_select.js.coffee | 205 +- app/assets/javascripts/zen_mode.js.coffee | 2 +- app/assets/stylesheets/application.scss | 7 +- app/assets/stylesheets/behaviors.scss | 4 +- app/assets/stylesheets/framework.scss | 4 + .../stylesheets/framework/animations.scss | 72 + app/assets/stylesheets/framework/avatar.scss | 3 +- app/assets/stylesheets/framework/blocks.scss | 76 +- app/assets/stylesheets/framework/buttons.scss | 99 +- .../stylesheets/framework/calendar.scss | 18 +- app/assets/stylesheets/framework/callout.scss | 2 +- app/assets/stylesheets/framework/common.scss | 80 +- .../stylesheets/framework/dropdowns.scss | 523 + app/assets/stylesheets/framework/files.scss | 38 +- app/assets/stylesheets/framework/filters.scss | 25 +- app/assets/stylesheets/framework/fonts.scss | 4 + app/assets/stylesheets/framework/forms.scss | 62 +- app/assets/stylesheets/framework/gfm.scss | 18 - .../stylesheets/framework/gitlab-theme.scss | 41 +- app/assets/stylesheets/framework/header.scss | 131 +- .../stylesheets/framework/highlight.scss | 8 +- .../stylesheets/framework/issue_box.scss | 20 +- app/assets/stylesheets/framework/jquery.scss | 18 +- app/assets/stylesheets/framework/layout.scss | 2 +- app/assets/stylesheets/framework/lists.scss | 26 +- .../stylesheets/framework/markdown_area.scss | 57 +- app/assets/stylesheets/framework/mixins.scss | 10 +- app/assets/stylesheets/framework/mobile.scss | 19 +- app/assets/stylesheets/framework/modal.scss | 22 + app/assets/stylesheets/framework/nav.scss | 162 +- .../stylesheets/framework/progress.scss | 5 + app/assets/stylesheets/framework/selects.scss | 159 +- app/assets/stylesheets/framework/sidebar.scss | 204 +- app/assets/stylesheets/framework/tables.scss | 4 +- .../stylesheets/framework/timeline.scss | 9 +- .../stylesheets/framework/tw_bootstrap.scss | 15 +- .../framework/tw_bootstrap_variables.scss | 12 +- .../stylesheets/framework/typography.scss | 78 +- .../stylesheets/framework/variables.scss | 247 +- app/assets/stylesheets/framework/zen.scss | 109 +- app/assets/stylesheets/highlight/dark.scss | 24 +- app/assets/stylesheets/highlight/monokai.scss | 10 +- .../stylesheets/highlight/solarized_dark.scss | 8 +- .../highlight/solarized_light.scss | 12 +- app/assets/stylesheets/highlight/white.scss | 112 +- .../mailers/repository_push_email.scss | 43 + app/assets/stylesheets/notify.scss | 24 + app/assets/stylesheets/pages/admin.scss | 6 +- app/assets/stylesheets/pages/appearances.scss | 2 +- app/assets/stylesheets/pages/awards.scss | 234 +- app/assets/stylesheets/pages/builds.scss | 34 +- app/assets/stylesheets/pages/ci_projects.scss | 2 +- app/assets/stylesheets/pages/commit.scss | 39 +- app/assets/stylesheets/pages/commits.scss | 25 +- .../stylesheets/pages/confirmation.scss | 18 + app/assets/stylesheets/pages/dashboard.scss | 6 +- app/assets/stylesheets/pages/detail_page.scss | 23 +- app/assets/stylesheets/pages/diff.scss | 128 +- app/assets/stylesheets/pages/editor.scss | 34 +- app/assets/stylesheets/pages/emojis.scss | 164 +- app/assets/stylesheets/pages/events.scss | 28 +- app/assets/stylesheets/pages/graph.scss | 7 +- app/assets/stylesheets/pages/help.scss | 14 - app/assets/stylesheets/pages/import.scss | 23 +- app/assets/stylesheets/pages/issuable.scss | 260 +- app/assets/stylesheets/pages/issues.scss | 59 +- app/assets/stylesheets/pages/labels.scss | 119 + app/assets/stylesheets/pages/lint.scss | 4 +- app/assets/stylesheets/pages/login.scss | 18 +- .../stylesheets/pages/merge_requests.scss | 135 +- app/assets/stylesheets/pages/milestone.scss | 20 +- app/assets/stylesheets/pages/note_form.scss | 143 +- app/assets/stylesheets/pages/notes.scss | 272 +- .../stylesheets/pages/notifications.scss | 18 +- app/assets/stylesheets/pages/pipelines.scss | 4 + app/assets/stylesheets/pages/profile.scss | 180 +- app/assets/stylesheets/pages/projects.scss | 160 +- app/assets/stylesheets/pages/runners.scss | 2 +- app/assets/stylesheets/pages/search.scss | 231 +- app/assets/stylesheets/pages/settings.scss | 14 + app/assets/stylesheets/pages/sherlock.scss | 4 +- app/assets/stylesheets/pages/snippets.scss | 34 +- app/assets/stylesheets/pages/stat_graph.scss | 2 +- app/assets/stylesheets/pages/status.scss | 94 +- app/assets/stylesheets/pages/todos.scss | 65 +- app/assets/stylesheets/pages/tree.scss | 6 +- app/assets/stylesheets/pages/ui_dev_kit.scss | 11 + app/assets/stylesheets/pages/xterm.scss | 62 +- app/assets/stylesheets/print.scss | 44 +- .../admin/abuse_reports_controller.rb | 4 +- .../admin/application_controller.rb | 8 +- .../admin/application_settings_controller.rb | 30 +- .../admin/broadcast_messages_controller.rb | 2 +- app/controllers/admin/groups_controller.rb | 10 +- .../admin/health_check_controller.rb | 5 + app/controllers/admin/hooks_controller.rb | 8 +- .../admin/impersonation_controller.rb | 38 - .../admin/impersonations_controller.rb | 26 + app/controllers/admin/keys_controller.rb | 2 +- app/controllers/admin/labels_controller.rb | 2 +- app/controllers/admin/projects_controller.rb | 21 +- app/controllers/admin/runners_controller.rb | 37 +- app/controllers/admin/spam_logs_controller.rb | 2 +- app/controllers/admin/users_controller.rb | 27 +- app/controllers/application_controller.rb | 110 +- app/controllers/autocomplete_controller.rb | 11 +- app/controllers/ci/projects_controller.rb | 10 +- app/controllers/concerns/continue_params.rb | 13 + app/controllers/concerns/creates_commit.rb | 2 +- app/controllers/concerns/filter_projects.rb | 17 + app/controllers/concerns/global_milestones.rb | 1 - app/controllers/concerns/issuable_actions.rb | 23 + app/controllers/concerns/issues_action.rb | 4 +- .../concerns/merge_requests_action.rb | 4 +- .../concerns/toggle_subscription_action.rb | 17 + app/controllers/confirmations_controller.rb | 9 + .../dashboard/application_controller.rb | 6 + .../dashboard/groups_controller.rb | 2 +- .../dashboard/labels_controller.rb | 9 + .../dashboard/milestones_controller.rb | 15 +- .../dashboard/projects_controller.rb | 26 +- .../dashboard/snippets_controller.rb | 2 +- app/controllers/dashboard/todos_controller.rb | 23 +- app/controllers/dashboard_controller.rb | 6 +- app/controllers/emojis_controller.rb | 6 + app/controllers/explore/groups_controller.rb | 4 +- .../explore/projects_controller.rb | 17 +- .../explore/snippets_controller.rb | 2 +- .../groups/application_controller.rb | 27 +- app/controllers/groups/avatars_controller.rb | 2 + .../groups/group_members_controller.rb | 5 +- .../groups/milestones_controller.rb | 47 +- .../notification_settings_controller.rb | 16 + app/controllers/groups_controller.rb | 51 +- app/controllers/health_check_controller.rb | 22 + app/controllers/help_controller.rb | 1 + app/controllers/jwt_controller.rb | 87 + app/controllers/namespaces_controller.rb | 2 +- .../oauth/applications_controller.rb | 26 +- .../oauth/authorizations_controller.rb | 1 + .../omniauth_callbacks_controller.rb | 28 +- app/controllers/passwords_controller.rb | 8 + app/controllers/profiles/emails_controller.rb | 2 +- app/controllers/profiles/keys_controller.rb | 9 +- .../profiles/notifications_controller.rb | 37 +- app/controllers/profiles_controller.rb | 27 +- .../projects/application_controller.rb | 79 +- .../projects/avatars_controller.rb | 9 +- app/controllers/projects/badges_controller.rb | 25 +- app/controllers/projects/blob_controller.rb | 2 +- .../projects/branches_controller.rb | 25 +- app/controllers/projects/builds_controller.rb | 18 +- app/controllers/projects/commit_controller.rb | 62 +- .../projects/commits_controller.rb | 2 +- .../projects/compare_controller.rb | 15 +- .../projects/container_registry_controller.rb | 34 + .../projects/deploy_keys_controller.rb | 31 +- app/controllers/projects/forks_controller.rb | 35 +- app/controllers/projects/graphs_controller.rb | 4 +- .../projects/group_links_controller.rb | 25 + app/controllers/projects/hooks_controller.rb | 20 +- .../projects/imports_controller.rb | 13 +- app/controllers/projects/issues_controller.rb | 98 +- app/controllers/projects/labels_controller.rb | 18 +- .../projects/merge_requests_controller.rb | 77 +- .../projects/milestones_controller.rb | 15 +- app/controllers/projects/notes_controller.rb | 13 +- .../notification_settings_controller.rb | 16 + .../projects/pipelines_controller.rb | 59 + .../projects/project_members_controller.rb | 18 +- .../projects/protected_branches_controller.rb | 2 +- app/controllers/projects/raw_controller.rb | 15 +- app/controllers/projects/refs_controller.rb | 8 +- .../projects/repositories_controller.rb | 3 +- .../projects/runners_controller.rb | 4 +- .../projects/services_controller.rb | 2 +- .../projects/snippets_controller.rb | 8 +- app/controllers/projects/tags_controller.rb | 2 +- .../projects/uploads_controller.rb | 6 +- .../projects/variables_controller.rb | 30 +- app/controllers/projects/wikis_controller.rb | 37 +- app/controllers/projects_controller.rb | 58 +- app/controllers/registrations_controller.rb | 13 +- app/controllers/root_controller.rb | 4 + app/controllers/search_controller.rb | 8 +- app/controllers/sessions_controller.rb | 33 +- app/controllers/snippets_controller.rb | 4 +- app/controllers/users_controller.rb | 107 +- app/finders/contributed_projects_finder.rb | 24 +- app/finders/group_projects_finder.rb | 42 + app/finders/groups_finder.rb | 18 + app/finders/issuable_finder.rb | 71 +- app/finders/issues_finder.rb | 6 + app/finders/joined_groups_finder.rb | 24 + app/finders/notes_finder.rb | 2 +- app/finders/personal_projects_finder.rb | 28 +- app/finders/pipelines_finder.rb | 38 + app/finders/projects_finder.rb | 72 +- app/finders/snippets_finder.rb | 8 +- app/finders/todos_finder.rb | 2 +- app/finders/union_finder.rb | 11 + app/helpers/application_helper.rb | 33 +- app/helpers/application_settings_helper.rb | 22 +- app/helpers/auth_helper.rb | 10 + app/helpers/blob_helper.rb | 80 +- app/helpers/button_helper.rb | 30 +- app/helpers/ci_badge_helper.rb | 13 - app/helpers/ci_status_helper.rb | 44 +- app/helpers/commits_helper.rb | 50 +- app/helpers/diff_helper.rb | 102 +- app/helpers/dropdowns_helper.rb | 101 + app/helpers/emails_helper.rb | 6 - app/helpers/events_helper.rb | 80 +- app/helpers/explore_helper.rb | 12 +- app/helpers/form_helper.rb | 18 + app/helpers/gitlab_markdown_helper.rb | 25 +- app/helpers/gitlab_routing_helper.rb | 8 + app/helpers/groups_helper.rb | 4 + app/helpers/icons_helper.rb | 11 +- app/helpers/import_helper.rb | 18 + app/helpers/issuables_helper.rb | 69 +- app/helpers/issues_helper.rb | 111 +- app/helpers/labels_helper.rb | 47 +- app/helpers/milestones_helper.rb | 49 +- app/helpers/namespaces_helper.rb | 12 +- app/helpers/nav_helper.rb | 21 +- app/helpers/notes_helper.rb | 40 +- app/helpers/notifications_helper.rb | 68 +- app/helpers/page_layout_helper.rb | 8 + app/helpers/preferences_helper.rb | 4 +- app/helpers/projects_helper.rb | 129 +- app/helpers/search_helper.rb | 69 +- app/helpers/selects_helper.rb | 21 +- app/helpers/snippets_helper.rb | 10 - app/helpers/sorting_helper.rb | 28 + app/helpers/tab_helper.rb | 8 + app/helpers/todos_helper.rb | 17 +- app/helpers/tree_helper.rb | 2 +- app/helpers/visibility_level_helper.rb | 37 +- app/mailers/emails/issues.rb | 34 +- app/mailers/emails/merge_requests.rb | 49 +- app/mailers/emails/notes.rb | 10 +- app/mailers/emails/profile.rb | 5 +- app/mailers/emails/projects.rb | 8 +- app/mailers/notify.rb | 6 + app/mailers/repository_check_mailer.rb | 14 + app/models/ability.rb | 202 +- app/models/abuse_report.rb | 16 +- app/models/application_setting.rb | 71 +- app/models/audit_event.rb | 14 - app/models/blob.rb | 45 + app/models/broadcast_message.rb | 14 - app/models/ci/build.rb | 149 +- app/models/ci/commit.rb | 196 +- app/models/ci/runner.rb | 57 +- app/models/ci/runner_project.rb | 12 - app/models/ci/trigger.rb | 13 - app/models/ci/trigger_request.rb | 12 - app/models/ci/variable.rb | 14 - app/models/commit.rb | 45 +- app/models/commit_range.rb | 4 +- app/models/commit_status.rb | 135 +- app/models/concerns/internal_id.rb | 9 +- app/models/concerns/issuable.rb | 73 +- app/models/concerns/mentionable.rb | 4 +- app/models/concerns/milestoneish.rb | 29 + app/models/concerns/notifiable.rb | 15 - app/models/concerns/statuseable.rb | 81 + app/models/concerns/subscribable.rb | 50 + app/models/deploy_key.rb | 15 - app/models/deploy_keys_project.rb | 11 - app/models/diff_line.rb | 3 - app/models/email.rb | 11 - app/models/event.rb | 57 +- app/models/external_issue.rb | 8 +- app/models/forked_project_link.rb | 11 - app/models/generic_commit_status.rb | 34 - app/models/global_label.rb | 7 +- app/models/global_milestone.rb | 56 +- app/models/group.rb | 49 +- app/models/hooks/project_hook.rb | 23 +- app/models/hooks/service_hook.rb | 20 - app/models/hooks/system_hook.rb | 23 +- app/models/hooks/web_hook.rb | 48 +- app/models/identity.rb | 12 - app/models/issue.rb | 117 +- app/models/key.rb | 18 +- app/models/label.rb | 83 +- app/models/label_link.rb | 12 - app/models/legacy_diff_note.rb | 157 + app/models/lfs_object.rb | 12 - app/models/lfs_objects_project.rb | 11 - app/models/member.rb | 31 +- app/models/members/group_member.rb | 20 - app/models/members/project_member.rb | 20 - app/models/merge_request.rb | 167 +- app/models/merge_request_diff.rb | 125 +- app/models/milestone.rb | 136 +- app/models/namespace.rb | 35 +- app/models/note.rb | 278 +- app/models/notification.rb | 77 - app/models/notification_setting.rb | 28 + app/models/oauth_access_token.rb | 4 + app/models/personal_snippet.rb | 17 - app/models/project.rb | 367 +- app/models/project_group_link.rb | 36 + app/models/project_import_data.rb | 24 +- app/models/project_services/asana_service.rb | 21 - .../project_services/assembla_service.rb | 21 - app/models/project_services/bamboo_service.rb | 41 +- .../project_services/buildkite_service.rb | 25 +- .../project_services/builds_email_service.rb | 40 +- .../project_services/campfire_service.rb | 21 - app/models/project_services/ci_service.rb | 23 +- .../custom_issue_tracker_service.rb | 21 - .../project_services/drone_ci_service.rb | 21 - .../emails_on_push_service.rb | 21 - .../project_services/external_wiki_service.rb | 23 +- .../project_services/flowdock_service.rb | 21 - .../project_services/gemnasium_service.rb | 21 - .../project_services/gitlab_ci_service.rb | 21 - .../gitlab_issue_tracker_service.rb | 23 +- .../project_services/hipchat_service.rb | 25 +- app/models/project_services/irker_service.rb | 21 - .../project_services/issue_tracker_service.rb | 23 +- app/models/project_services/jira_service.rb | 31 +- .../pivotaltracker_service.rb | 21 - .../project_services/pushover_service.rb | 21 - .../project_services/redmine_service.rb | 21 - app/models/project_services/slack_service.rb | 28 +- .../slack_service/issue_message.rb | 21 +- .../slack_service/merge_message.rb | 2 +- .../slack_service/note_message.rb | 2 +- .../slack_service/wiki_page_message.rb | 53 + .../project_services/teamcity_service.rb | 54 +- app/models/project_snippet.rb | 21 +- app/models/project_team.rb | 52 +- app/models/project_wiki.rb | 24 +- app/models/protected_branch.rb | 12 - app/models/release.rb | 12 - app/models/repository.rb | 413 +- app/models/security_event.rb | 14 - app/models/sent_notification.rb | 14 - app/models/service.rb | 25 +- app/models/snippet.rb | 55 +- app/models/subscription.rb | 15 +- app/models/todo.rb | 53 +- app/models/user.rb | 143 +- app/models/users_star_project.rb | 11 - app/models/wiki_page.rb | 6 +- app/services/archive_repository_service.rb | 23 - ...ntainer_registry_authentication_service.rb | 81 + app/services/base_service.rb | 7 +- app/services/ci/create_builds_service.rb | 27 +- app/services/ci/create_pipeline_service.rb | 50 + .../ci/create_trigger_request_service.rb | 4 +- app/services/ci/image_for_build_service.rb | 11 +- app/services/commits/change_service.rb | 47 + app/services/commits/cherry_pick_service.rb | 19 + app/services/commits/revert_service.rb | 57 +- app/services/compare_service.rb | 12 +- app/services/create_branch_service.rb | 5 - app/services/create_commit_builds_service.rb | 24 +- app/services/create_snippet_service.rb | 3 +- app/services/create_tag_service.rb | 44 +- app/services/delete_user_service.rb | 26 +- app/services/destroy_group_service.rb | 4 +- app/services/git_push_service.rb | 57 +- app/services/git_tag_push_service.rb | 32 +- app/services/groups/base_service.rb | 9 + app/services/groups/create_service.rb | 21 + app/services/groups/update_service.rb | 20 + app/services/issuable_base_service.rb | 45 +- app/services/issues/base_service.rb | 2 +- app/services/issues/close_service.rb | 6 +- app/services/issues/create_service.rb | 2 +- app/services/issues/move_service.rb | 112 + app/services/issues/update_service.rb | 19 +- .../add_todo_when_build_fails_service.rb | 17 + app/services/merge_requests/base_service.rb | 41 +- app/services/merge_requests/build_service.rb | 64 +- app/services/merge_requests/create_service.rb | 7 +- app/services/merge_requests/merge_service.rb | 8 +- .../merge_when_build_succeeds_service.rb | 23 +- .../merge_requests/post_merge_service.rb | 4 +- .../merge_requests/refresh_service.rb | 7 + app/services/merge_requests/update_service.rb | 15 +- app/services/milestones/create_service.rb | 2 +- app/services/notes/create_service.rb | 11 + app/services/notes/delete_service.rb | 8 + app/services/notification_service.rb | 146 +- app/services/projects/autocomplete_service.rb | 8 +- app/services/projects/create_service.rb | 29 +- app/services/projects/destroy_service.rb | 22 +- app/services/projects/housekeeping_service.rb | 35 +- app/services/projects/import_service.rb | 2 + app/services/projects/participants_service.rb | 43 +- app/services/projects/transfer_service.rb | 12 +- app/services/projects/unlink_fork_service.rb | 19 + app/services/projects/update_service.rb | 29 +- app/services/search/global_service.rb | 3 +- app/services/search/project_service.rb | 3 +- app/services/search/snippet_service.rb | 5 +- app/services/system_hooks_service.rb | 36 +- app/services/system_note_service.rb | 79 +- app/services/todo_service.rb | 119 +- app/services/update_snippet_service.rb | 1 - app/services/wiki_pages/base_service.rb | 27 + app/services/wiki_pages/create_service.rb | 14 + app/services/wiki_pages/update_service.rb | 11 + app/uploaders/file_uploader.rb | 17 +- app/validators/url_validator.rb | 3 + app/views/abuse_reports/new.html.haml | 10 +- app/views/admin/appearances/_form.html.haml | 5 +- .../application_settings/_form.html.haml | 66 +- .../admin/applications/_delete_form.html.haml | 2 +- app/views/admin/applications/_form.html.haml | 7 +- .../admin/broadcast_messages/_form.html.haml | 10 +- app/views/admin/builds/_build.html.haml | 43 +- app/views/admin/builds/index.html.haml | 5 +- app/views/admin/dashboard/index.html.haml | 2 +- app/views/admin/deploy_keys/index.html.haml | 2 +- app/views/admin/deploy_keys/new.html.haml | 6 +- app/views/admin/groups/_form.html.haml | 7 +- app/views/admin/groups/_group.html.haml | 28 + app/views/admin/groups/index.html.haml | 42 +- app/views/admin/groups/show.html.haml | 21 + app/views/admin/health_check/show.html.haml | 49 + app/views/admin/hooks/index.html.haml | 52 +- app/views/admin/identities/_form.html.haml | 6 +- app/views/admin/labels/_form.html.haml | 8 +- app/views/admin/labels/_label.html.haml | 2 +- app/views/admin/labels/index.html.haml | 12 +- app/views/admin/logs/show.html.haml | 5 +- app/views/admin/projects/index.html.haml | 10 +- app/views/admin/projects/show.html.haml | 38 +- app/views/admin/runners/_runner.html.haml | 12 +- app/views/admin/runners/index.html.haml | 2 +- app/views/admin/runners/show.html.haml | 24 +- app/views/admin/users/_form.html.haml | 20 +- app/views/admin/users/index.html.haml | 12 +- app/views/admin/users/keys.html.haml | 2 +- app/views/admin/users/show.html.haml | 4 + app/views/ci/commits/_commit.html.haml | 32 - app/views/ci/projects/index.html.haml | 20 - app/views/dashboard/_projects_head.html.haml | 4 +- app/views/dashboard/issues.html.haml | 2 + .../dashboard/milestones/_issue.html.haml | 10 - .../dashboard/milestones/_issues.html.haml | 6 - .../milestones/_merge_request.html.haml | 10 - .../milestones/_merge_requests.html.haml | 6 - .../dashboard/milestones/_milestone.html.haml | 31 +- app/views/dashboard/milestones/show.html.haml | 106 +- .../dashboard/projects/_projects.html.haml | 7 +- .../_zero_authorized_projects.html.haml | 8 +- app/views/dashboard/todos/_todo.html.haml | 27 +- app/views/dashboard/todos/index.html.haml | 21 +- .../devise/confirmations/almost_there.haml | 10 + .../devise/sessions/_new_crowd.html.haml | 2 +- app/views/devise/sessions/new.html.haml | 2 +- .../devise/sessions/two_factor.html.haml | 4 +- .../devise/shared/_omniauth_box.html.haml | 2 +- app/views/devise/shared/_signup_box.html.haml | 11 +- .../applications/_delete_form.html.haml | 8 +- .../doorkeeper/applications/_form.html.haml | 37 +- .../doorkeeper/applications/index.html.haml | 97 +- .../doorkeeper/applications/new.html.haml | 2 +- .../doorkeeper/authorizations/error.html.haml | 2 +- .../doorkeeper/authorizations/show.html.haml | 2 +- app/views/emojis/index.html.haml | 11 + app/views/events/_commit.html.haml | 2 +- app/views/events/_event.html.haml | 11 +- app/views/events/_event_last_push.html.haml | 4 +- app/views/events/event/_common.html.haml | 2 +- .../events/event/_created_project.html.haml | 18 - app/views/events/event/_push.html.haml | 2 +- app/views/explore/groups/index.html.haml | 2 +- .../explore/projects/_dropdown.html.haml | 20 - app/views/explore/projects/_filter.html.haml | 73 +- .../explore/projects/_projects.html.haml | 7 +- app/views/explore/projects/index.html.haml | 4 +- app/views/explore/snippets/index.html.haml | 2 +- app/views/groups/_activities.html.haml | 12 + app/views/groups/_projects.html.haml | 13 +- app/views/groups/_shared_projects.html.haml | 1 + app/views/groups/activity.html.haml | 8 + app/views/groups/edit.html.haml | 18 +- .../groups/group_members/index.html.haml | 1 - app/views/groups/issues.atom.builder | 8 +- app/views/groups/issues.html.haml | 5 +- app/views/groups/merge_requests.html.haml | 3 +- app/views/groups/milestones/_issue.html.haml | 10 - app/views/groups/milestones/_issues.html.haml | 6 - .../milestones/_merge_request.html.haml | 10 - .../milestones/_merge_requests.html.haml | 6 - .../groups/milestones/_milestone.html.haml | 34 +- app/views/groups/milestones/index.html.haml | 3 +- app/views/groups/milestones/new.html.haml | 14 +- app/views/groups/milestones/show.html.haml | 114 +- app/views/groups/new.html.haml | 7 +- app/views/groups/projects.html.haml | 1 - app/views/groups/show.html.haml | 82 +- app/views/help/_shortcuts.html.haml | 30 +- app/views/help/ui.html.haml | 451 +- app/views/import/base/create.js.haml | 4 +- app/views/import/bitbucket/status.html.haml | 20 +- app/views/import/fogbugz/status.html.haml | 15 +- app/views/import/github/status.html.haml | 19 +- app/views/import/gitlab/status.html.haml | 15 +- app/views/import/gitorious/status.html.haml | 15 +- app/views/import/google_code/status.html.haml | 19 +- app/views/layouts/_head.html.haml | 1 + app/views/layouts/_page.html.haml | 8 +- app/views/layouts/_search.html.haml | 42 +- app/views/layouts/application.html.haml | 8 +- app/views/layouts/devise_empty.html.haml | 17 + app/views/layouts/group.html.haml | 2 +- app/views/layouts/group_settings.html.haml | 3 +- app/views/layouts/header/_default.html.haml | 70 +- app/views/layouts/header/_public.html.haml | 10 - app/views/layouts/nav/_admin.html.haml | 5 + app/views/layouts/nav/_dashboard.html.haml | 11 +- app/views/layouts/nav/_explore.html.haml | 4 +- app/views/layouts/nav/_group.html.haml | 73 +- .../layouts/nav/_group_settings.html.haml | 40 +- app/views/layouts/nav/_profile.html.haml | 16 +- app/views/layouts/nav/_project.html.haml | 26 +- .../layouts/nav/_project_settings.html.haml | 17 +- app/views/layouts/notify.html.haml | 44 +- app/views/layouts/profile.html.haml | 3 +- app/views/layouts/project.html.haml | 14 +- .../_reassigned_issuable_email.text.erb | 2 +- .../_relabeled_issuable_email.html.haml | 3 + .../notify/_relabeled_issuable_email.text.erb | 3 + .../closed_merge_request_email.html.haml | 2 +- .../closed_merge_request_email.text.haml | 2 +- app/views/notify/issue_moved_email.html.haml | 6 + app/views/notify/issue_moved_email.text.erb | 4 + .../merge_request_status_email.html.haml | 2 +- .../merge_request_status_email.text.haml | 2 +- .../merged_merge_request_email.html.haml | 2 +- .../merged_merge_request_email.text.haml | 2 +- .../notify/new_merge_request_email.text.erb | 2 +- .../notify/note_merge_request_email.html.haml | 4 +- .../notify/note_merge_request_email.text.erb | 2 +- app/views/notify/note_snippet_email.html.haml | 1 + app/views/notify/note_snippet_email.text.erb | 8 + .../notify/relabeled_issue_email.html.haml | 1 + .../notify/relabeled_issue_email.text.erb | 1 + .../relabeled_merge_request_email.html.haml | 1 + .../relabeled_merge_request_email.text.erb | 1 + .../notify/repository_push_email.html.haml | 59 +- .../notify/repository_push_email.text.haml | 38 +- app/views/profiles/_event_table.html.haml | 28 +- app/views/profiles/accounts/show.html.haml | 220 +- app/views/profiles/applications.html.haml | 70 - app/views/profiles/audit_log.html.haml | 14 +- app/views/profiles/emails/index.html.haml | 92 +- app/views/profiles/keys/_form.html.haml | 20 +- app/views/profiles/keys/_key.html.haml | 25 +- .../profiles/keys/_key_details.html.haml | 2 +- app/views/profiles/keys/_key_table.html.haml | 20 +- app/views/profiles/keys/index.html.haml | 30 +- app/views/profiles/keys/new.html.haml | 17 - .../notifications/_group_settings.html.haml | 13 + .../notifications/_project_settings.html.haml | 13 + .../notifications/_settings.html.haml | 17 - .../profiles/notifications/show.html.haml | 121 +- .../profiles/notifications/update.js.haml | 6 - app/views/profiles/passwords/edit.html.haml | 58 +- app/views/profiles/passwords/new.html.haml | 7 +- app/views/profiles/preferences/show.html.haml | 99 +- app/views/profiles/show.html.haml | 204 +- .../profiles/two_factor_auths/new.html.haml | 76 +- app/views/projects/_activity.html.haml | 5 +- app/views/projects/_builds_settings.html.haml | 74 + app/views/projects/_errors.html.haml | 5 +- app/views/projects/_home_panel.html.haml | 18 +- app/views/projects/_last_commit.html.haml | 9 +- app/views/projects/_last_push.html.haml | 2 +- app/views/projects/_md_preview.html.haml | 19 +- app/views/projects/_readme.html.haml | 6 +- app/views/projects/_zen.html.haml | 20 +- app/views/projects/artifacts/browse.html.haml | 2 +- app/views/projects/badges/index.html.haml | 24 + app/views/projects/blame/show.html.haml | 6 +- app/views/projects/blob/_blob.html.haml | 12 +- app/views/projects/blob/_editor.html.haml | 11 +- app/views/projects/blob/_image.html.haml | 4 +- app/views/projects/blob/_new_dir.html.haml | 2 +- app/views/projects/blob/_remove.html.haml | 2 +- app/views/projects/blob/_text.html.haml | 25 +- app/views/projects/blob/_upload.html.haml | 2 +- app/views/projects/blob/diff.html.haml | 20 +- app/views/projects/blob/edit.html.haml | 2 +- app/views/projects/blob/new.html.haml | 4 +- app/views/projects/branches/_branch.html.haml | 4 +- app/views/projects/branches/destroy.js.haml | 2 +- app/views/projects/branches/index.html.haml | 4 +- app/views/projects/builds/index.html.haml | 14 +- app/views/projects/builds/show.html.haml | 39 +- .../projects/buttons/_download.html.haml | 2 +- .../projects/buttons/_dropdown.html.haml | 17 +- app/views/projects/buttons/_fork.html.haml | 6 +- .../projects/buttons/_notifications.html.haml | 21 +- app/views/projects/buttons/_star.html.haml | 4 +- app/views/projects/ci/builds/_build.html.haml | 86 + .../projects/ci/commits/_commit.html.haml | 77 + app/views/projects/commit/_builds.html.haml | 70 +- .../{_revert.html.haml => _change.html.haml} | 20 +- .../projects/commit/_ci_commit.html.haml | 52 + app/views/projects/commit/_ci_stage.html.haml | 14 + .../projects/commit/_commit_box.html.haml | 33 +- app/views/projects/commit/branches.html.haml | 1 - app/views/projects/commit/show.html.haml | 5 +- .../commit_statuses/_commit_status.html.haml | 79 - app/views/projects/commits/_commit.html.haml | 20 +- .../projects/commits/_commit_list.html.haml | 13 +- app/views/projects/commits/_commits.html.haml | 10 +- app/views/projects/commits/_head.html.haml | 7 +- app/views/projects/commits/show.html.haml | 4 +- app/views/projects/compare/_form.html.haml | 2 +- app/views/projects/compare/index.html.haml | 2 +- app/views/projects/compare/show.html.haml | 2 +- .../_header_title.html.haml | 1 + .../container_registry/_tag.html.haml | 21 + .../container_registry/index.html.haml | 40 + .../deploy_keys/_deploy_key.html.haml | 45 +- .../projects/deploy_keys/_form.html.haml | 35 +- .../projects/deploy_keys/index.html.haml | 69 +- app/views/projects/diffs/_diffs.html.haml | 21 +- app/views/projects/diffs/_file.html.haml | 26 +- app/views/projects/diffs/_image.html.haml | 8 +- app/views/projects/diffs/_line.html.haml | 26 + .../projects/diffs/_parallel_view.html.haml | 22 +- app/views/projects/diffs/_text_file.html.haml | 30 +- app/views/projects/diffs/_warning.html.haml | 13 +- app/views/projects/edit.html.haml | 76 +- app/views/projects/empty.html.haml | 16 +- app/views/projects/find_file/show.html.haml | 2 +- app/views/projects/forks/_projects.html.haml | 2 + app/views/projects/forks/index.html.haml | 25 +- app/views/projects/forks/new.html.haml | 4 +- .../_generic_commit_status.html.haml | 68 + app/views/projects/go_import.html.haml | 5 - app/views/projects/graphs/ci.html.haml | 2 +- app/views/projects/graphs/commits.html.haml | 2 +- app/views/projects/graphs/languages.html.haml | 2 +- app/views/projects/graphs/show.html.haml | 2 +- .../projects/group_links/index.html.haml | 44 + .../projects/hooks/_project_hook.html.haml | 15 + app/views/projects/hooks/index.html.haml | 173 +- app/views/projects/imports/new.html.haml | 2 +- .../projects/issues/_discussion.html.haml | 4 +- app/views/projects/issues/_form.html.haml | 2 +- app/views/projects/issues/_issue.html.haml | 28 +- .../projects/issues/_merge_requests.html.haml | 6 +- .../projects/issues/_new_branch.html.haml | 13 + .../issues/_related_branches.html.haml | 15 + app/views/projects/issues/index.html.haml | 2 + app/views/projects/issues/show.html.haml | 114 +- app/views/projects/issues/update.js.haml | 3 - app/views/projects/labels/_form.html.haml | 12 +- app/views/projects/labels/_label.html.haml | 27 +- .../merge_requests/_discussion.html.haml | 4 +- .../projects/merge_requests/_form.html.haml | 2 +- .../merge_requests/_merge_request.html.haml | 28 +- .../merge_requests/_new_compare.html.haml | 137 +- .../merge_requests/_new_submit.html.haml | 12 +- .../projects/merge_requests/_show.html.haml | 27 +- .../merge_requests/branch_from.html.haml | 1 + .../merge_requests/branch_from.js.haml | 3 - .../merge_requests/branch_to.html.haml | 1 + .../projects/merge_requests/branch_to.js.haml | 3 - .../dropdowns/_branch.html.haml | 5 + .../dropdowns/_project.html.haml | 5 + .../projects/merge_requests/edit.html.haml | 4 +- .../projects/merge_requests/invalid.html.haml | 2 +- .../merge_requests/show/_builds.html.haml | 3 +- .../merge_requests/show/_diffs.html.haml | 2 +- .../merge_requests/show/_mr_box.html.haml | 5 +- .../merge_requests/show/_mr_title.html.haml | 48 +- .../projects/merge_requests/update.js.haml | 3 - .../merge_requests/update_branches.html.haml | 3 + .../merge_requests/update_branches.js.haml | 9 - .../merge_requests/widget/_heading.html.haml | 29 +- .../merge_requests/widget/_merged.html.haml | 5 + .../widget/_merged_buttons.haml | 11 +- .../merge_requests/widget/_show.html.haml | 23 +- .../widget/open/_accept.html.haml | 7 +- .../open/_merge_when_build_succeeds.html.haml | 5 +- .../widget/open/_not_allowed.html.haml | 4 +- .../merge_requests/widget/open/_wip.html.haml | 10 +- app/views/projects/milestones/_form.html.haml | 12 +- .../projects/milestones/_issue.html.haml | 10 - .../projects/milestones/_issues.html.haml | 7 - .../milestones/_merge_request.html.haml | 8 - .../milestones/_merge_requests.html.haml | 5 - .../projects/milestones/_milestone.html.haml | 36 +- app/views/projects/milestones/show.html.haml | 114 +- app/views/projects/network/_head.html.haml | 2 +- app/views/projects/new.html.haml | 2 +- .../notes/_diff_notes_with_reply.html.haml | 21 +- .../_diff_notes_with_reply_parallel.html.haml | 26 +- .../projects/notes/_discussion.html.haml | 49 +- app/views/projects/notes/_edit_form.html.haml | 9 +- app/views/projects/notes/_form.html.haml | 10 +- app/views/projects/notes/_hints.html.haml | 15 +- app/views/projects/notes/_note.html.haml | 53 +- app/views/projects/notes/_notes.html.haml | 9 +- .../projects/notes/_notes_with_form.html.haml | 31 +- .../notes/discussions/_active.html.haml | 22 - .../notes/discussions/_commit.html.haml | 26 - .../notes/discussions/_diff.html.haml | 30 - .../discussions/_diff_with_notes.html.haml | 30 + .../notes/discussions/_notes.html.haml | 7 + .../notes/discussions/_outdated.html.haml | 19 - .../pipelines/_header_title.html.haml | 1 + app/views/projects/pipelines/_info.html.haml | 37 + app/views/projects/pipelines/index.html.haml | 66 + app/views/projects/pipelines/new.html.haml | 22 + app/views/projects/pipelines/show.html.haml | 9 + .../_shared_group_members.html.haml | 21 + .../projects/project_members/index.html.haml | 3 + .../_branches_list.html.haml | 56 +- .../protected_branches/index.html.haml | 62 +- app/views/projects/refs/logs_tree.js.haml | 7 +- app/views/projects/releases/edit.html.haml | 14 +- .../repositories/_download_archive.html.haml | 2 +- app/views/projects/runners/_form.html.haml | 32 + app/views/projects/runners/_runner.html.haml | 2 +- .../runners/_shared_runners.html.haml | 7 +- app/views/projects/runners/edit.html.haml | 27 +- app/views/projects/runners/show.html.haml | 51 +- app/views/projects/show.html.haml | 14 +- app/views/projects/snippets/index.html.haml | 2 +- app/views/projects/tags/_download.html.haml | 2 +- app/views/projects/tags/_tag.html.haml | 4 +- app/views/projects/tags/index.html.haml | 2 +- app/views/projects/tags/new.html.haml | 8 +- app/views/projects/tags/show.html.haml | 18 +- .../projects/tree/_tree_header.html.haml | 4 +- .../projects/triggers/_trigger.html.haml | 8 +- app/views/projects/triggers/index.html.haml | 119 +- .../projects/variables/_content.html.haml | 8 + app/views/projects/variables/_form.html.haml | 10 + app/views/projects/variables/_table.html.haml | 25 + app/views/projects/variables/index.html.haml | 17 + app/views/projects/variables/show.html.haml | 47 +- app/views/projects/wikis/_form.html.haml | 10 +- app/views/projects/wikis/git_access.html.haml | 2 +- .../repository_check_mailer/notify.html.haml | 8 + .../repository_check_mailer/notify.text.haml | 6 + app/views/search/_category.html.haml | 105 +- app/views/search/_filter.html.haml | 60 +- app/views/search/_form.html.haml | 21 +- app/views/search/_results.html.haml | 17 +- app/views/search/results/_issue.html.haml | 3 +- .../search/results/_merge_request.html.haml | 2 +- app/views/search/results/_milestone.html.haml | 2 +- app/views/search/results/_note.html.haml | 18 +- .../search/results/_snippet_blob.html.haml | 2 +- app/views/search/results/_wiki_blob.html.haml | 4 +- app/views/shared/_clone_panel.html.haml | 6 +- .../_commit_message_container.html.haml | 4 +- app/views/shared/_confirm_modal.html.haml | 2 +- app/views/shared/_file_highlight.html.haml | 5 +- app/views/shared/_group_tips.html.haml | 1 - app/views/shared/_issues.html.haml | 2 +- app/views/shared/_label_row.html.haml | 5 +- app/views/shared/_labels_row.html.haml | 3 + app/views/shared/_merge_requests.html.haml | 2 +- app/views/shared/_no_ssh.html.haml | 2 +- app/views/shared/_service_settings.html.haml | 15 +- app/views/shared/_sort_dropdown.html.haml | 5 + app/views/shared/groups/_group.html.haml | 22 +- app/views/shared/groups/_list.html.haml | 6 + app/views/shared/issuable/_filter.html.haml | 44 +- app/views/shared/issuable/_form.html.haml | 115 +- .../shared/issuable/_label_dropdown.html.haml | 14 + .../issuable/_label_page_create.html.haml | 17 + .../issuable/_label_page_default.html.haml | 20 + .../issuable/_milestone_dropdown.html.haml | 16 + app/views/shared/issuable/_nav.html.haml | 10 +- .../shared/issuable/_participants.html.haml | 16 +- app/views/shared/issuable/_sidebar.html.haml | 150 +- .../shared/milestones/_issuable.html.haml | 27 + .../shared/milestones/_issuables.html.haml | 16 + .../shared/milestones/_issues_tab.html.haml | 10 + .../shared/milestones/_labels_tab.html.haml | 19 + .../milestones/_merge_requests_tab.haml | 12 + .../shared/milestones/_milestone.html.haml | 45 + .../milestones/_participants_tab.html.haml | 8 + .../shared/milestones/_summary.html.haml | 28 + app/views/shared/milestones/_tabs.html.haml | 30 + app/views/shared/milestones/_top.html.haml | 58 + app/views/shared/projects/_dropdown.html.haml | 31 + app/views/shared/projects/_list.html.haml | 26 +- app/views/shared/projects/_project.html.haml | 52 +- app/views/shared/snippets/_blob.html.haml | 2 + app/views/shared/snippets/_form.html.haml | 6 +- app/views/shared/snippets/_header.html.haml | 4 +- app/views/shared/snippets/_snippet.html.haml | 7 +- .../sherlock/file_samples/show.html.haml | 2 +- app/views/sherlock/queries/show.html.haml | 2 +- .../sherlock/transactions/index.html.haml | 2 +- .../sherlock/transactions/show.html.haml | 2 +- app/views/snippets/_snippets.html.haml | 2 +- app/views/users/calendar.html.haml | 2 +- app/views/users/show.html.haml | 197 +- app/views/votes/_votes_block.html.haml | 58 +- app/workers/admin_email_worker.rb | 12 + app/workers/delete_user_worker.rb | 10 + app/workers/emails_on_push_worker.rb | 43 +- app/workers/gitlab_shell_one_shot_worker.rb | 10 + app/workers/irker_worker.rb | 2 +- app/workers/post_receive.rb | 46 +- app/workers/project_cache_worker.rb | 3 + app/workers/project_destroy_worker.rb | 2 +- app/workers/repository_check/batch_worker.rb | 63 + app/workers/repository_check/clear_worker.rb | 17 + .../single_repository_worker.rb | 48 + app/workers/repository_fork_worker.rb | 5 +- app/workers/repository_import_worker.rb | 4 +- bin/background_jobs | 2 +- bin/rails | 5 + bin/rake | 5 + bin/rspec | 5 +- bin/setup | 2 +- bin/spinach | 5 +- bin/spring | 12 +- bin/teaspoon | 8 + bin/web | 4 +- config/application.rb | 78 +- config/boot.rb | 2 +- config/environments/development.rb | 2 +- config/environments/production.rb | 3 + config/environments/test.rb | 5 +- config/gitlab.teatro.yml | 1 - config/gitlab.yml.example | 52 +- config/initializers/1_settings.rb | 90 +- config/initializers/5_backend.rb | 6 +- config/initializers/carrierwave.rb | 4 +- config/initializers/devise.rb | 12 +- config/initializers/go_get.rb | 1 + config/initializers/gollum.rb | 13 + config/initializers/health_check.rb | 3 + config/initializers/metrics.rb | 52 +- config/initializers/monkey_patch.rb | 48 - .../mysql_ignore_postgresql_options.rb | 49 + .../postgresql_opclasses_support.rb | 188 + config/initializers/premailer.rb | 8 + config/initializers/rack_attack.rb.example | 3 +- .../rack_attack_git_basic_auth.rb | 4 +- config/initializers/redis_config.rb | 12 - config/initializers/sentry.rb | 3 + config/initializers/session_store.rb | 7 +- config/initializers/sidekiq.rb | 17 +- config/initializers/trusted_proxies.rb | 3 + config/mail_room.yml | 68 +- config/routes.rb | 103 +- config/sidekiq.yml.example | 2 +- db/fixtures/development/07_milestones.rb | 2 +- db/fixtures/development/10_merge_requests.rb | 5 +- db/fixtures/development/14_builds.rb | 2 +- db/fixtures/production/001_admin.rb | 65 +- ...141258_convert_closed_to_state_in_issue.rb | 18 +- ...onvert_closed_to_state_in_merge_request.rb | 22 +- ...44_convert_closed_to_state_in_milestone.rb | 18 +- ...4_convert_merge_status_in_merge_request.rb | 22 +- .../20130315124931_user_color_scheme.rb | 4 +- ...0_add_last_activity_column_into_project.rb | 16 +- .../20130419190306_allow_merges_for_forks.rb | 8 +- ...130711063759_create_project_group_links.rb | 10 + ...102832_add_access_to_project_group_link.rb | 5 + ...220935_add_visibility_level_to_projects.rb | 6 +- ...92127_migrate_already_imported_projects.rb | 8 +- .../20140502125220_migrate_repo_size.rb | 21 +- ...7100818_add_visibility_level_to_snippet.rb | 14 +- .../20150930110012_add_group_share_lock.rb | 5 + ...58_add_real_size_to_merge_request_diffs.rb | 5 + ...160223192159_add_confidential_to_issues.rb | 6 + .../20160225090018_add_delete_at_to_issues.rb | 6 + ...5101956_add_delete_at_to_merge_requests.rb | 6 + ...14608_add_trigram_indexes_for_searching.rb | 64 + ...0227120001_add_event_field_for_web_hook.rb | 5 + .../20160227120047_add_event_to_services.rb | 5 + ...9193553_add_main_language_to_repository.rb | 5 + ...01124843_add_visibility_level_to_groups.rb | 29 + ...port_credentials_to_project_import_data.rb | 7 + ...8_remove_wrong_import_url_from_projects.rb | 131 + ...5220806_remove_expires_at_from_snippets.rb | 5 + ...221555_disallow_blank_line_code_on_note.rb | 9 + ...roup_visibility_to_application_settings.rb | 31 + .../20160310124959_add_due_date_to_issues.rb | 6 + ...160310185910_add_external_flag_to_users.rb | 5 + ...0314143402_projects_add_pushes_since_gc.rb | 5 + ...0315135439_project_add_repository_check.rb | 8 + .../20160316123110_ci_runners_token_index.rb | 13 + ...92622_change_target_id_to_null_on_todos.rb | 5 + .../20160316204731_add_commit_id_to_todos.rb | 6 + .../20160317092222_add_moved_to_to_issue.rb | 5 + ...12_index_namespaces_on_visibility_level.rb | 7 + ...4020319_remove_todos_for_deleted_issues.rb | 17 + ...0328112808_create_notification_settings.rb | 11 + ...115649_migrate_new_notification_setting.rb | 17 + ...28121138_add_notification_setting_index.rb | 6 + ...52_add_index_on_pending_delete_projects.rb | 6 + ...remove_todos_for_deleted_merge_requests.rb | 17 + ...aring_enabled_from_application_settings.rb | 5 + ...07120251_add_images_enabled_for_project.rb | 5 + ...0_add_repository_checks_enabled_setting.rb | 5 + .../20160412173416_add_fields_to_ci_commit.rb | 8 + db/migrate/20160412173417_update_ci_commit.rb | 35 + .../20160412173418_add_ci_commit_indexes.rb | 19 + .../20160413115152_add_token_to_web_hooks.rb | 5 + ...ed_runners_text_to_application_settings.rb | 5 + .../20160419120017_add_metrics_packet_size.rb | 5 + ...0160421130527_disable_repository_checks.rb | 11 + ...sign_in_sources_to_application_settings.rb | 5 + ...504112519_add_run_untagged_to_ci_runner.rb | 13 + ...94200_remove_wall_enabled_from_projects.rb | 5 + .../20160508215820_add_type_to_notes.rb | 5 + ...508221410_set_type_on_legacy_diff_notes.rb | 5 + ...ck_access_token_to_application_settings.rb | 5 + ...firmation_email_to_application_settings.rb | 12 + db/schema.rb | 146 +- doc/README.md | 54 +- doc/administration/auth/README.md | 11 + doc/administration/auth/ldap.md | 277 + doc/administration/container_registry.md | 375 + doc/administration/environment_variables.md | 2 +- .../high_availability/README.md | 35 + .../high_availability/database.md | 116 + .../high_availability/gitlab.md | 131 + .../high_availability/load_balancer.md | 63 + doc/administration/high_availability/nfs.md | 116 + doc/administration/high_availability/redis.md | 62 + doc/administration/repository_checks.md | 44 + doc/administration/troubleshooting/sidekiq.md | 162 + doc/api/README.md | 2 + doc/api/build_triggers.md | 12 +- doc/api/builds.md | 7 - doc/api/commits.md | 5 +- doc/api/groups.md | 82 + doc/api/issues.md | 206 +- doc/api/labels.md | 159 +- doc/api/licenses.md | 147 + doc/api/merge_requests.md | 198 +- doc/api/milestones.md | 20 +- doc/api/notes.md | 145 + doc/api/projects.md | 315 +- doc/api/runners.md | 4 +- doc/api/services.md | 2 +- doc/api/settings.md | 3 - doc/api/tags.md | 46 +- doc/api/users.md | 88 +- doc/ci/README.md | 51 +- doc/ci/api/README.md | 98 +- doc/ci/api/builds.md | 188 +- doc/ci/api/commits.md | 108 - doc/ci/api/projects.md | 149 - doc/ci/api/runners.md | 81 +- doc/ci/build_artifacts/README.md | 13 +- doc/ci/docker/using_docker_build.md | 95 +- doc/ci/docker/using_docker_images.md | 12 +- doc/ci/enable_or_disable_ci.md | 2 +- doc/ci/examples/README.md | 18 +- doc/ci/{ => examples}/deployment/README.md | 2 +- doc/ci/{languages => examples}/php.md | 8 +- ...and-deploy-python-application-to-heroku.md | 10 +- ...t-and-deploy-ruby-application-to-heroku.md | 6 +- doc/ci/languages/README.md | 7 - doc/ci/quick_start/README.md | 68 +- doc/ci/runners/README.md | 16 +- doc/ci/services/README.md | 12 +- doc/ci/services/mysql.md | 4 +- doc/ci/services/postgres.md | 2 +- doc/ci/services/redis.md | 2 +- doc/ci/ssh_keys/README.md | 10 +- doc/ci/triggers/README.md | 8 +- doc/ci/variables/README.md | 26 +- doc/ci/yaml/README.md | 506 +- doc/container_registry/README.md | 113 + .../img/container_registry.png | Bin 0 -> 354050 bytes .../img/project_feature.png | Bin 0 -> 392842 bytes doc/customization/libravatar.md | 13 + doc/development/README.md | 18 +- doc/development/architecture.md | 2 +- doc/development/benchmarking.md | 69 - doc/development/code_review.md | 78 + doc/development/doc_styleguide.md | 20 +- doc/development/gotchas.md | 103 + doc/development/instrumentation.md | 153 + doc/development/migration_style_guide.md | 46 +- doc/development/performance.md | 258 + doc/development/rake_tasks.md | 2 +- doc/development/scss_styleguide.md | 215 + doc/development/sql.md | 219 + doc/development/testing.md | 137 + doc/development/ui_guide.md | 4 - doc/downgrade_ee_to_ce/README.md | 82 + doc/gitlab-basics/README.md | 34 +- doc/gitlab-basics/basic-git-commands.md | 58 +- ...mpare_braches.png => compare_branches.png} | Bin doc/gitlab-basics/create-issue.md | 2 +- doc/gitlab-basics/create-project.md | 2 +- doc/gitlab-basics/start-using-git.md | 63 +- doc/hooks/custom_hooks.md | 2 +- doc/incoming_email/README.md | 108 +- doc/install/installation.md | 100 +- doc/install/relative_url.md | 2 +- doc/install/requirements.md | 48 +- doc/integration/README.md | 48 +- doc/integration/auth0.md | 89 + doc/integration/cas.md | 19 +- doc/integration/github.md | 20 +- .../img/enabled-oauth-sign-in-sources.png | Bin 0 -> 49081 bytes doc/integration/ldap.md | 205 +- doc/integration/omniauth.md | 123 +- doc/integration/saml.md | 262 +- doc/integration/shibboleth.md | 47 + doc/integration/slack.md | 12 +- doc/intro/README.md | 42 + ...ndividual_contributor_license_agreement.md | 2 +- doc/logs/logs.md | 2 +- doc/markdown/markdown.md | 65 +- doc/monitoring/health_check.md | 66 + doc/monitoring/img/health_check_token.png | Bin 0 -> 10884 bytes .../performance/gitlab_configuration.md | 1 + .../performance/grafana_configuration.md | 149 + .../img/grafana_dashboard_dropdown.png | Bin 0 -> 29419 bytes .../img/grafana_dashboard_import.png | Bin 0 -> 40974 bytes .../img/grafana_data_source_configuration.png | Bin 0 -> 53402 bytes .../img/grafana_data_source_empty.png | Bin 0 -> 44058 bytes .../performance/img/grafana_save_icon.png | Bin 0 -> 16024 bytes .../performance/influxdb_configuration.md | 1 + doc/monitoring/performance/influxdb_schema.md | 1 + doc/monitoring/performance/introduction.md | 3 +- doc/operations/sidekiq_memory_killer.md | 2 +- doc/permissions/permissions.md | 33 +- .../img/jira_service_page.png | Bin 35496 -> 49122 bytes doc/project_services/jira.md | 35 +- doc/project_services/project_services.md | 19 +- doc/public_access/public_access.md | 22 +- doc/raketasks/README.md | 4 +- doc/raketasks/backup_restore.md | 38 +- doc/raketasks/web_hooks.md | 14 +- doc/release/README.md | 10 - doc/release/howto_rc1.md | 55 - doc/release/howto_update_guides.md | 55 - doc/release/master.md | 62 - doc/release/monthly.md | 245 - doc/release/patch.md | 81 - doc/release/security.md | 76 - doc/security/README.md | 3 +- doc/security/two_factor_authentication.md | 2 +- doc/security/user_email_confirmation.md | 7 + doc/security/webhooks.md | 12 +- doc/system_hooks/system_hooks.md | 113 + doc/update/8.2-to-8.3.md | 9 + doc/update/8.3-to-8.4.md | 30 +- doc/update/8.4-to-8.5.md | 12 + doc/update/8.5-to-8.6.md | 173 + doc/update/8.6-to-8.7.md | 154 + doc/update/8.7-to-8.8.md | 154 + doc/update/README.md | 94 +- doc/update/patch_versions.md | 8 +- doc/update/restore_after_failure.md | 83 + doc/update/upgrader.md | 2 +- doc/web_hooks/web_hooks.md | 36 +- doc/workflow/README.md | 3 + doc/workflow/award_emoji.md | 48 + doc/workflow/cherry_pick_changes.md | 53 + doc/workflow/gitlab_flow.md | 6 +- doc/workflow/groups.md | 2 +- doc/workflow/groups/max_access_level.png | Bin 0 -> 135354 bytes .../other_group_sees_shared_project.png | Bin 0 -> 118382 bytes .../groups/share_project_with_groups.png | Bin 0 -> 118868 bytes doc/workflow/img/award_emoji_select.png | Bin 0 -> 65985 bytes .../img/award_emoji_votes_least_popular.png | Bin 0 -> 144501 bytes .../img/award_emoji_votes_most_popular.png | Bin 0 -> 136577 bytes .../img/award_emoji_votes_sort_options.png | Bin 0 -> 162251 bytes .../img/cherry_pick_changes_commit.png | Bin 0 -> 353067 bytes .../img/cherry_pick_changes_commit_modal.png | Bin 0 -> 312659 bytes doc/workflow/img/cherry_pick_changes_mr.png | Bin 0 -> 252085 bytes .../img/cherry_pick_changes_mr_modal.png | Bin 0 -> 225569 bytes doc/workflow/img/new_branch_from_issue.png | Bin 0 -> 120622 bytes .../import_projects_from_bitbucket.md | 2 +- .../importing/import_projects_from_github.md | 16 +- .../import_projects_from_gitlab_com.md | 2 +- doc/workflow/importing/migrating_from_svn.md | 1 + doc/workflow/lfs/lfs_administration.md | 12 +- .../lfs/manage_large_binaries_with_git_lfs.md | 89 +- doc/workflow/merge_requests.md | 6 +- .../merge_requests/commit_compare.png | Bin 89631 -> 110376 bytes .../merge_requests/merge_request_diff.png | Bin 120422 -> 166226 bytes .../merge_request_diff_without_whitespace.png | Bin 98887 -> 121476 bytes doc/workflow/notifications.md | 2 +- doc/workflow/protected_branches.md | 2 +- .../share_projects_with_other_groups.md | 30 + doc/workflow/share_with_group.md | 13 + doc/workflow/share_with_group.png | Bin 0 -> 53784 bytes doc/workflow/shortcuts.png | Bin 48782 -> 90936 bytes doc/workflow/web_editor.md | 32 + docker/README.md | 6 +- features/admin/groups.feature | 5 + features/dashboard/archived_projects.feature | 5 + features/dashboard/dashboard.feature | 8 + features/dashboard/event_filters.feature | 14 +- features/dashboard/todos.feature | 5 + features/explore/projects.feature | 3 +- features/group/milestones.feature | 17 + features/groups.feature | 20 +- features/profile/notifications.feature | 6 + features/profile/profile.feature | 3 +- features/profile/ssh_keys.feature | 2 +- features/project/builds/summary.feature | 2 + features/project/commits/tags.feature | 46 - features/project/create.feature | 16 +- features/project/deploy_keys.feature | 1 - .../project/forked_merge_requests.feature | 1 + features/project/group_links.feature | 16 + features/project/issues/award_emoji.feature | 11 +- features/project/issues/filter_labels.feature | 1 + features/project/issues/issues.feature | 9 +- features/project/labels.feature | 15 + features/project/merge_requests.feature | 47 +- features/project/network_graph.feature | 3 +- features/project/project.feature | 6 + features/project/source/browse_files.feature | 13 - features/project/team_management.feature | 5 + features/search.feature | 27 + features/steps/admin/groups.rb | 19 + features/steps/dashboard/archived_projects.rb | 4 + features/steps/dashboard/dashboard.rb | 21 +- features/steps/dashboard/issues.rb | 13 +- features/steps/dashboard/merge_requests.rb | 13 +- features/steps/dashboard/todos.rb | 21 +- features/steps/explore/projects.rb | 2 +- features/steps/group/milestones.rb | 51 +- features/steps/groups.rb | 35 +- features/steps/profile/active_tab.rb | 4 + features/steps/profile/notifications.rb | 10 + features/steps/profile/profile.rb | 28 +- features/steps/profile/ssh_keys.rb | 4 +- features/steps/project/active_tab.rb | 4 +- features/steps/project/badges/build.rb | 2 +- features/steps/project/builds/summary.rb | 6 + features/steps/project/commits/commits.rb | 11 +- features/steps/project/commits/tags.rb | 90 - features/steps/project/commits/user_lookup.rb | 3 +- features/steps/project/create.rb | 26 +- features/steps/project/deploy_keys.rb | 14 +- .../steps/project/forked_merge_requests.rb | 24 +- features/steps/project/hooks.rb | 10 +- features/steps/project/issues/award_emoji.rb | 38 +- .../steps/project/issues/filter_labels.rb | 9 +- features/steps/project/issues/issues.rb | 24 +- features/steps/project/issues/labels.rb | 2 +- features/steps/project/issues/milestones.rb | 2 +- features/steps/project/labels.rb | 34 + features/steps/project/merge_requests.rb | 79 +- .../project/merge_requests/acceptance.rb | 2 +- .../steps/project/merge_requests/revert.rb | 2 +- features/steps/project/network_graph.rb | 9 +- features/steps/project/project.rb | 10 + features/steps/project/project_group_links.rb | 50 + features/steps/project/snippets.rb | 2 +- features/steps/project/source/browse_files.rb | 13 +- features/steps/project/team_management.rb | 19 + features/steps/project/wiki.rb | 2 +- features/steps/search.rb | 12 +- features/steps/shared/builds.rb | 14 +- features/steps/shared/diff_note.rb | 24 +- features/steps/shared/issuable.rb | 15 +- features/steps/shared/note.rb | 17 +- features/steps/shared/paths.rb | 27 +- features/steps/shared/project.rb | 2 +- features/steps/shared/user.rb | 16 + features/steps/user.rb | 4 +- features/support/capybara.rb | 2 +- features/support/env.rb | 1 + features/support/rerun.rb | 14 + features/user.feature | 13 + fixtures/emojis/digests.json | 11082 ++++++++++++++++ .../migration/create_table_migration.rb | 35 + .../active_record/migration/migration.rb | 55 + lib/api/api.rb | 68 +- lib/api/api_guard.rb | 302 +- lib/api/branches.rb | 2 +- lib/api/commit_statuses.rb | 29 +- lib/api/commits.rb | 16 +- lib/api/entities.rb | 97 +- lib/api/gitignores.rb | 29 + lib/api/groups.rb | 30 +- lib/api/helpers.rb | 40 +- lib/api/internal.rb | 19 +- lib/api/issues.rb | 69 +- lib/api/labels.rb | 30 +- lib/api/licenses.rb | 58 + lib/api/merge_requests.rb | 26 +- lib/api/milestones.rb | 32 +- lib/api/notes.rb | 67 +- lib/api/project_hooks.rb | 4 +- lib/api/project_members.rb | 13 +- lib/api/project_snippets.rb | 15 +- lib/api/projects.rb | 96 +- lib/api/repositories.rb | 6 +- lib/api/runners.rb | 2 +- lib/api/subscriptions.rb | 60 + lib/api/tags.rb | 16 +- lib/api/users.rb | 20 +- lib/award_emoji.rb | 39 +- lib/backup/manager.rb | 15 +- lib/backup/registry.rb | 13 + lib/banzai.rb | 4 + lib/banzai/filter.rb | 2 - .../filter/abstract_reference_filter.rb | 144 +- lib/banzai/filter/autolink_filter.rb | 1 - .../filter/commit_range_reference_filter.rb | 2 +- lib/banzai/filter/commit_reference_filter.rb | 2 +- lib/banzai/filter/emoji_filter.rb | 4 - .../filter/external_issue_reference_filter.rb | 41 +- lib/banzai/filter/external_link_filter.rb | 7 +- lib/banzai/filter/gollum_tags_filter.rb | 54 +- lib/banzai/filter/image_link_filter.rb | 27 + lib/banzai/filter/inline_diff_filter.rb | 22 + lib/banzai/filter/issue_reference_filter.rb | 8 + lib/banzai/filter/label_reference_filter.rb | 99 +- lib/banzai/filter/markdown_filter.rb | 2 - .../filter/merge_request_reference_filter.rb | 2 +- .../filter/milestone_reference_filter.rb | 48 +- lib/banzai/filter/redactor_filter.rb | 2 - lib/banzai/filter/reference_filter.rb | 180 +- .../filter/reference_gatherer_filter.rb | 2 - lib/banzai/filter/relative_link_filter.rb | 1 - lib/banzai/filter/sanitization_filter.rb | 18 +- lib/banzai/filter/snippet_reference_filter.rb | 2 +- lib/banzai/filter/syntax_highlight_filter.rb | 1 - lib/banzai/filter/table_of_contents_filter.rb | 2 - lib/banzai/filter/upload_link_filter.rb | 9 +- lib/banzai/filter/user_reference_filter.rb | 27 +- lib/banzai/filter/wiki_link_filter.rb | 61 + lib/banzai/filter/yaml_front_matter_filter.rb | 25 + lib/banzai/filter_array.rb | 27 + lib/banzai/pipeline/base_pipeline.rb | 4 +- .../pipeline/broadcast_message_pipeline.rb | 2 +- lib/banzai/pipeline/combined_pipeline.rb | 2 +- lib/banzai/pipeline/gfm_pipeline.rb | 6 +- .../pipeline/plain_markdown_pipeline.rb | 2 +- lib/banzai/pipeline/post_process_pipeline.rb | 2 +- lib/banzai/pipeline/pre_process_pipeline.rb | 17 + .../pipeline/reference_extraction_pipeline.rb | 2 +- lib/banzai/pipeline/single_line_pipeline.rb | 2 +- lib/banzai/pipeline/wiki_pipeline.rb | 7 +- lib/banzai/renderer.rb | 26 +- lib/ci/ansi2html.rb | 85 +- lib/ci/api/api.rb | 12 +- lib/ci/api/builds.rb | 33 + lib/ci/api/runners.rb | 18 +- lib/ci/charts.rb | 3 +- lib/ci/gitlab_ci_yaml_processor.rb | 166 +- lib/ci/status.rb | 19 - lib/container_registry/blob.rb | 48 + lib/container_registry/client.rb | 61 + lib/container_registry/config.rb | 16 + lib/container_registry/registry.rb | 21 + lib/container_registry/repository.rb | 48 + lib/container_registry/tag.rb | 77 + lib/file_size_validator.rb | 8 +- lib/gitlab.rb | 5 +- lib/gitlab/akismet_helper.rb | 12 +- lib/gitlab/backend/shell.rb | 73 +- lib/gitlab/badge/build.rb | 46 + lib/gitlab/bitbucket_import/client.rb | 15 +- lib/gitlab/bitbucket_import/importer.rb | 7 +- lib/gitlab/bitbucket_import/key_deleter.rb | 5 +- .../bitbucket_import/project_creator.rb | 6 +- lib/gitlab/compare_result.rb | 9 - lib/gitlab/current_settings.rb | 4 +- lib/gitlab/database.rb | 4 +- lib/gitlab/database/migration_helpers.rb | 142 + lib/gitlab/devise_failure.rb | 23 + lib/gitlab/diff/file.rb | 6 +- lib/gitlab/diff/inline_diff_marker.rb | 36 +- lib/gitlab/diff/parser.rb | 81 +- lib/gitlab/email/message/repository_push.rb | 15 +- lib/gitlab/email/receiver.rb | 25 +- lib/gitlab/email/reply_parser.rb | 2 +- lib/gitlab/exclusive_lease.rb | 30 +- lib/gitlab/fogbugz_import/client.rb | 2 +- lib/gitlab/fogbugz_import/importer.rb | 23 +- lib/gitlab/fogbugz_import/project_creator.rb | 15 +- lib/gitlab/gfm/reference_rewriter.rb | 84 + lib/gitlab/gfm/uploads_rewriter.rb | 51 + lib/gitlab/git_access.rb | 11 +- lib/gitlab/git_post_receive.rb | 60 + lib/gitlab/github_import/branch_formatter.rb | 29 + lib/gitlab/github_import/client.rb | 15 +- lib/gitlab/github_import/comment_formatter.rb | 21 +- lib/gitlab/github_import/importer.rb | 102 +- lib/gitlab/github_import/issue_formatter.rb | 8 + lib/gitlab/github_import/label_formatter.rb | 23 + .../github_import/milestone_formatter.rb | 48 + lib/gitlab/github_import/project_creator.rb | 5 +- .../github_import/pull_request_formatter.rb | 59 +- lib/gitlab/gitignore.rb | 56 + lib/gitlab/gitlab_import/importer.rb | 11 +- lib/gitlab/gitlab_import/project_creator.rb | 1 - lib/gitlab/gon_helper.rb | 18 + .../google_code_import/project_creator.rb | 14 +- lib/gitlab/highlight.rb | 13 +- lib/gitlab/incoming_email.rb | 16 +- lib/gitlab/ldap/access.rb | 5 +- lib/gitlab/markup_helper.rb | 2 +- lib/gitlab/metrics.rb | 66 +- lib/gitlab/metrics/instrumentation.rb | 39 +- lib/gitlab/metrics/metric.rb | 22 +- .../metrics/subscribers/active_record.rb | 1 + lib/gitlab/metrics/subscribers/rails_cache.rb | 41 + lib/gitlab/metrics/system.rb | 11 + lib/gitlab/middleware/go.rb | 50 + lib/gitlab/note_data_builder.rb | 5 +- lib/gitlab/o_auth/user.rb | 10 + lib/gitlab/project_search_results.rb | 11 +- lib/gitlab/push_data_builder.rb | 7 +- lib/gitlab/redis.rb | 50 + lib/gitlab/reference_extractor.rb | 18 +- lib/gitlab/regex.rb | 4 + lib/gitlab/repository_check_logger.rb | 7 + lib/gitlab/routing.rb | 13 + lib/gitlab/saml/auth_hash.rb | 19 + lib/gitlab/saml/config.rb | 21 + lib/gitlab/saml/user.rb | 27 +- lib/gitlab/sanitizers/svg.rb | 35 + lib/gitlab/sanitizers/svg/whitelist.rb | 109 + lib/gitlab/search_results.rb | 28 +- .../sidekiq_middleware/memory_killer.rb | 4 +- lib/gitlab/snippet_search_results.rb | 10 +- lib/gitlab/url_builder.rb | 86 +- lib/gitlab/url_sanitizer.rb | 54 + lib/gitlab/visibility_level.rb | 12 +- lib/gitlab/workhorse.rb | 27 +- lib/json_web_token/rsa_token.rb | 42 + lib/json_web_token/token.rb | 46 + lib/support/init.d/gitlab | 12 +- lib/support/nginx/gitlab | 12 +- lib/support/nginx/gitlab-ssl | 11 +- lib/support/nginx/gitlab_ci | 29 - lib/support/nginx/registry-ssl | 53 + lib/tasks/brakeman.rake | 2 +- lib/tasks/cache.rake | 28 +- lib/tasks/gemojione.rake | 153 + lib/tasks/gitlab/backup.rake | 63 +- lib/tasks/gitlab/check.rake | 27 +- lib/tasks/gitlab/db.rake | 40 + lib/tasks/gitlab/setup.rake | 2 +- lib/tasks/gitlab/update_gitignore.rake | 46 + lib/tasks/gitlab/web_hook.rake | 14 +- lib/tasks/scss-lint.rake | 10 + lib/tasks/spec.rake | 13 +- lib/tasks/spinach.rake | 64 +- public/404.html | 44 +- public/422.html | 45 +- public/500.html | 44 +- public/502.html | 44 +- public/503.html | 54 + public/deploy.html | 41 +- public/logo.svg | 26 - public/robots.txt | 1 + public/static.css | 36 - scripts/notify_slack.sh | 13 + scripts/prepare_build.sh | 36 +- .../registry/.gitkeep | 0 spec/benchmarks/finders/issues_finder_spec.rb | 55 - .../finders/trending_projects_finder_spec.rb | 14 - .../gitlab/markdown/reference_filter_spec.rb | 41 - spec/benchmarks/models/milestone_spec.rb | 17 - spec/benchmarks/models/project_spec.rb | 50 - spec/benchmarks/models/project_team_spec.rb | 23 - spec/benchmarks/models/user_spec.rb | 78 - .../services/projects/create_service_spec.rb | 28 - spec/config/mail_room_spec.rb | 56 + .../admin/impersonation_controller_spec.rb | 19 - .../admin/impersonations_controller_spec.rb | 95 + .../admin/projects_controller_spec.rb | 23 + .../admin/users_controller_spec.rb | 136 +- .../application_controller_spec.rb | 40 - .../autocomplete_controller_spec.rb | 26 +- spec/controllers/branches_controller_spec.rb | 104 - .../ci/projects_controller_spec.rb | 21 + spec/controllers/commit_controller_spec.rb | 53 +- .../groups/avatars_controller_spec.rb | 3 +- .../groups/group_members_controller_spec.rb | 20 + .../groups/milestones_controller_spec.rb | 6 + .../notification_settings_controller_spec.rb | 32 + spec/controllers/groups_controller_spec.rb | 59 +- .../health_check_controller_spec.rb | 105 + .../import/github_controller_spec.rb | 2 + .../controllers/namespaces_controller_spec.rb | 31 +- .../keys_controller_spec.rb} | 12 +- .../projects/avatars_controller_spec.rb | 2 +- .../{ => projects}/blame_controller_spec.rb | 0 .../projects/branches_controller_spec.rb | 148 + .../{ => projects}/commits_controller_spec.rb | 0 .../projects/compare_controller_spec.rb | 8 +- .../projects/forks_controller_spec.rb | 72 + .../projects/group_links_controller_spec.rb | 50 + .../projects/imports_controller_spec.rb | 4 +- .../projects/issues_controller_spec.rb | 224 +- .../merge_requests_controller_spec.rb | 61 +- .../notification_settings_controller_spec.rb | 52 + .../project_members_controller_spec.rb | 65 + .../projects/raw_controller_spec.rb | 2 +- .../projects/repositories_controller_spec.rb | 44 +- .../projects/snippets_controller_spec.rb | 107 + spec/controllers/projects_controller_spec.rb | 57 +- .../registrations_controller_spec.rb | 33 + spec/controllers/root_controller_spec.rb | 22 + ... => sent_notifications_controller_spec.rb} | 0 spec/controllers/sessions_controller_spec.rb | 101 + spec/controllers/uploads_controller_spec.rb | 20 +- spec/controllers/users_controller_spec.rb | 65 +- spec/factories.rb | 223 - spec/factories/abuse_reports.rb | 14 - spec/factories/broadcast_messages.rb | 18 +- spec/factories/ci/builds.rb | 8 +- spec/factories/ci/commits.rb | 1 - spec/factories/ci/runner_projects.rb | 2 - spec/factories/ci/runners.rb | 2 - spec/factories/ci/trigger_requests.rb | 2 - spec/factories/ci/triggers.rb | 2 - spec/factories/ci/variables.rb | 2 - spec/factories/commits.rb | 12 + spec/factories/deploy_keys_projects.rb | 6 + spec/factories/emails.rb | 6 + spec/factories/events.rb | 10 + spec/factories/file_uploader.rb | 20 + spec/factories/forked_project_links.rb | 18 +- spec/factories/groups.rb | 19 + spec/factories/identities.rb | 6 + spec/factories/issues.rb | 22 + spec/factories/keys.rb | 24 + spec/factories/label_links.rb | 14 - spec/factories/labels.rb | 17 +- spec/factories/lfs_objects.rb | 14 +- spec/factories/lfs_objects_projects.rb | 13 - spec/factories/merge_requests.rb | 49 +- spec/factories/milestones.rb | 12 + spec/factories/namespaces.rb | 7 + spec/factories/notes.rb | 27 +- spec/factories/oauth_access_tokens.rb | 7 + spec/factories/oauth_applications.rb | 9 + spec/factories/personal_snippets.rb | 4 + spec/factories/project_group_links.rb | 6 + spec/factories/project_hooks.rb | 9 + spec/factories/project_members.rb | 27 + spec/factories/project_snippets.rb | 5 + spec/factories/project_wikis.rb | 7 + spec/factories/projects.rb | 50 +- spec/factories/protected_branches.rb | 6 + spec/factories/releases.rb | 14 - spec/factories/sent_notifications.rb | 8 + spec/factories/service_hooks.rb | 6 + spec/factories/services.rb | 5 + spec/factories/snippets.rb | 28 + spec/factories/spam_logs.rb | 2 - spec/factories/system_hooks.rb | 5 + spec/factories/todos.rb | 26 +- spec/factories/users.rb | 43 + spec/factories/wiki_pages.rb | 9 + spec/factories_spec.rb | 16 +- spec/features/admin/admin_builds_spec.rb | 1 + .../features/admin/admin_health_check_spec.rb | 55 + spec/features/admin/admin_users_spec.rb | 3 + .../admin_uses_repository_checks_spec.rb | 43 + spec/features/atom/users_spec.rb | 2 +- spec/features/builds_spec.rb | 31 + spec/features/container_registry_spec.rb | 44 + spec/features/dashboard/label_filter_spec.rb | 29 + .../dashboard/user_filters_projects_spec.rb | 27 + spec/features/dashboard_issues_spec.rb | 54 + spec/features/dashboard_milestones_spec.rb | 29 + spec/features/issues/award_emoji_spec.rb | 64 + spec/features/issues/filter_by_labels_spec.rb | 167 + .../issues/filter_by_milestone_spec.rb | 43 +- spec/features/issues/filter_issues_spec.rb | 157 + spec/features/issues/issue_sidebar_spec.rb | 79 + spec/features/issues/move_spec.rb | 85 + .../features/issues/new_branch_button_spec.rb | 50 + spec/features/issues/update_issues_spec.rb | 117 + spec/features/issues_spec.rb | 288 +- spec/features/login_spec.rb | 28 +- spec/features/markdown_spec.rb | 14 +- .../merge_requests/cherry_pick_spec.rb | 44 + .../merge_requests/create_new_mr_spec.rb | 43 + spec/features/merge_requests/edit_mr_spec.rb | 21 + .../filter_by_milestone_spec.rb | 49 +- .../toggle_whitespace_changes.rb | 22 + .../user_lists_merge_requests_spec.rb | 152 + spec/features/milestone_spec.rb | 35 + spec/features/notes_on_merge_requests_spec.rb | 39 +- .../participants_autocomplete_spec.rb | 98 + spec/features/pipelines_spec.rb | 159 + .../profiles/oauth_applications_spec.rb | 39 + spec/features/project/shortcuts_spec.rb | 21 + spec/features/projects/badges/list_spec.rb | 34 + spec/features/projects/commit/builds_spec.rb | 27 + .../projects/commits/cherry_pick_spec.rb | 67 + ...r_views_empty_project_instructions_spec.rb | 63 + .../projects/files/gitignore_dropdown_spec.rb | 30 + ...project_owner_creates_license_file_spec.rb | 61 + ...eate_license_file_in_empty_project_spec.rb | 39 + .../anonymous_user_sees_members_spec.rb | 20 + .../wiki/user_creates_wiki_page_spec.rb | 83 + .../wiki/user_updates_wiki_page_spec.rb | 44 + spec/features/projects_spec.rb | 30 +- spec/features/runners_spec.rb | 49 + spec/features/search_spec.rb | 51 +- .../security/group/internal_access_spec.rb | 109 + .../security/group/private_access_spec.rb | 109 + .../security/group/public_access_spec.rb | 109 + spec/features/security/group_access_spec.rb | 284 - .../security/project/internal_access_spec.rb | 162 +- .../security/project/private_access_spec.rb | 156 +- .../security/project/public_access_spec.rb | 198 +- .../project/snippet/internal_access_spec.rb | 78 + .../project/snippet/private_access_spec.rb | 63 + .../project/snippet/public_access_spec.rb | 93 + spec/features/signup_spec.rb | 80 + spec/features/tags/master_creates_tag_spec.rb | 62 + spec/features/tags/master_deletes_tag_spec.rb | 41 + spec/features/tags/master_updates_tag_spec.rb | 42 + spec/features/tags/master_views_tags_spec.rb | 73 + spec/features/todos/todos_spec.rb | 81 + spec/features/users_spec.rb | 16 +- spec/features/variables_spec.rb | 59 +- spec/finders/group_projects_finder_spec.rb | 89 + spec/finders/groups_finder_spec.rb | 33 + spec/finders/issues_finder_spec.rb | 176 +- spec/finders/joined_groups_finder_spec.rb | 77 + spec/finders/personal_projects_finder_spec.rb | 30 +- spec/finders/projects_finder_spec.rb | 36 +- spec/finders/snippets_finder_spec.rb | 27 +- .../container_registry/config_blob.json | 1 + .../container_registry/tag_manifest.json | 1 + ...ubaddressing_and_key_inside_references.eml | 42 + spec/fixtures/emails/valid_reply.eml | 4 +- spec/fixtures/mail_room_disabled.yml | 11 + spec/fixtures/mail_room_enabled.yml | 11 + spec/fixtures/markdown.md.erb | 25 +- spec/fixtures/sanitized.svg | 50 + spec/fixtures/unsanitized.svg | 50 + spec/helpers/auth_helper_spec.rb | 47 +- spec/helpers/blob_helper_spec.rb | 12 + spec/helpers/ci_status_helper_spec.rb | 6 +- spec/helpers/commits_helper_spec.rb | 29 + spec/helpers/diff_helper_spec.rb | 81 +- spec/helpers/events_helper_spec.rb | 95 +- spec/helpers/form_helper_spec.rb | 46 + spec/helpers/gitlab_markdown_helper_spec.rb | 7 - ...groups_helper.rb => groups_helper_spec.rb} | 0 spec/helpers/import_helper_spec.rb | 25 + spec/helpers/issues_helper_spec.rb | 59 +- spec/helpers/labels_helper_spec.rb | 18 +- spec/helpers/notifications_helper_spec.rb | 37 +- spec/helpers/preferences_helper_spec.rb | 4 +- spec/helpers/projects_helper_spec.rb | 64 +- spec/helpers/visibility_level_helper_spec.rb | 21 +- spec/initializers/trusted_proxies_spec.rb | 51 + .../fixtures/behaviors/quick_submit.html.haml | 6 +- .../fixtures/project_title.html.haml | 27 +- spec/javascripts/fixtures/zen_mode.html.haml | 2 +- spec/javascripts/issue_spec.js.coffee | 6 +- .../merge_request_widget_spec.js.coffee | 55 + spec/javascripts/notes_spec.js.coffee | 1 + spec/javascripts/project_title_spec.js.coffee | 21 +- spec/lib/award_emoji_spec.rb | 26 + .../filter/external_link_filter_spec.rb | 10 +- .../banzai/filter/gollum_tags_filter_spec.rb | 23 +- .../banzai/filter/image_link_filter_spec.rb | 24 + .../banzai/filter/inline_diff_filter_spec.rb | 68 + .../filter/issue_reference_filter_spec.rb | 8 + .../filter/label_reference_filter_spec.rb | 39 +- .../filter/milestone_reference_filter_spec.rb | 165 +- .../lib/banzai/filter/redactor_filter_spec.rb | 76 +- .../banzai/filter/sanitization_filter_spec.rb | 42 +- .../banzai/filter/upload_link_filter_spec.rb | 18 + .../banzai/filter/wiki_link_filter_spec.rb | 85 + .../filter/yaml_front_matter_filter_spec.rb | 53 + spec/lib/banzai/filter_array_spec.rb | 39 + .../lib/banzai/pipeline/wiki_pipeline_spec.rb | 53 + spec/lib/ci/ansi2html_spec.rb | 120 +- spec/lib/ci/charts_spec.rb | 7 + spec/lib/ci/gitlab_ci_yaml_processor_spec.rb | 418 +- spec/lib/ci/status_spec.rb | 41 - spec/lib/container_registry/blob_spec.rb | 61 + spec/lib/container_registry/registry_spec.rb | 28 + .../lib/container_registry/repository_spec.rb | 65 + spec/lib/container_registry/tag_spec.rb | 89 + spec/lib/extracts_path_spec.rb | 2 +- spec/lib/gitlab/akismet_helper_spec.rb | 2 +- spec/lib/gitlab/badge/build_spec.rb | 103 + .../gitlab/bitbucket_import/client_spec.rb | 26 +- .../gitlab/bitbucket_import/importer_spec.rb | 88 + .../ci/build/artifacts/metadata/entry_spec.rb | 4 +- .../gitlab/closing_issue_extractor_spec.rb | 118 +- .../gitlab/database/migration_helpers_spec.rb | 128 + spec/lib/gitlab/diff/file_spec.rb | 14 + spec/lib/gitlab/diff/parser_spec.rb | 7 +- .../email/message/repository_push_spec.rb | 6 +- spec/lib/gitlab/email/receiver_spec.rb | 23 + spec/lib/gitlab/fogbugz_import/client_spec.rb | 24 + .../lib/gitlab/gfm/reference_rewriter_spec.rb | 89 + spec/lib/gitlab/gfm/uploads_rewriter_spec.rb | 66 + .../github_import/branch_formatter_spec.rb | 71 + spec/lib/gitlab/github_import/client_spec.rb | 40 +- .../github_import/comment_formatter_spec.rb | 30 +- .../github_import/issue_formatter_spec.rb | 40 +- .../github_import/label_formatter_spec.rb | 19 + .../github_import/milestone_formatter_spec.rb | 82 + .../github_import/project_creator_spec.rb | 4 +- .../pull_request_formatter_spec.rb | 78 +- .../github_import/wiki_formatter_spec.rb | 7 +- spec/lib/gitlab/gitignore_spec.rb | 40 + spec/lib/gitlab/incoming_email_spec.rb | 26 +- spec/lib/gitlab/ldap/access_spec.rb | 27 +- spec/lib/gitlab/lfs/lfs_router_spec.rb | 4 +- .../gitlab/metrics/instrumentation_spec.rb | 57 +- .../metrics/subscribers/active_record_spec.rb | 3 + .../metrics/subscribers/rails_cache_spec.rb | 77 + spec/lib/gitlab/metrics/system_spec.rb | 6 + spec/lib/gitlab/metrics_spec.rb | 93 +- spec/lib/gitlab/middleware/go_spec.rb | 30 + spec/lib/gitlab/note_data_builder_spec.rb | 3 +- spec/lib/gitlab/o_auth/user_spec.rb | 37 +- .../lib/gitlab/project_search_results_spec.rb | 69 +- spec/lib/gitlab/push_data_builder_spec.rb | 15 +- spec/lib/gitlab/reference_extractor_spec.rb | 22 + spec/lib/gitlab/saml/user_spec.rb | 166 +- spec/lib/gitlab/search_results_spec.rb | 144 + .../lib/gitlab/snippet_search_results_spec.rb | 25 + spec/lib/gitlab/url_builder_spec.rb | 162 +- spec/lib/gitlab/url_sanitizer_spec.rb | 68 + spec/lib/gitlab/workhorse_spec.rb | 18 + spec/lib/gitlab_spec.rb | 17 + spec/lib/json_web_token/rsa_token_spec.rb | 43 + spec/lib/json_web_token/token_spec.rb | 18 + spec/mailers/emails/profile_spec.rb | 6 +- spec/mailers/notify_spec.rb | 207 +- spec/mailers/repository_check_mailer_spec.rb | 21 + spec/mailers/shared/notify.rb | 84 +- spec/models/abuse_report_spec.rb | 28 +- spec/models/application_setting_spec.rb | 56 +- spec/models/blob_spec.rb | 81 + spec/models/broadcast_message_spec.rb | 14 - spec/models/build_spec.rb | 132 +- spec/models/ci/commit_spec.rb | 430 +- spec/models/ci/runner_project_spec.rb | 12 - spec/models/ci/runner_spec.rb | 77 +- spec/models/ci/trigger_spec.rb | 13 - spec/models/ci/variable_spec.rb | 14 - spec/models/commit_spec.rb | 23 +- spec/models/commit_status_spec.rb | 100 +- spec/models/concerns/issuable_spec.rb | 120 +- spec/models/concerns/mentionable_spec.rb | 5 +- spec/models/concerns/milestoneish_spec.rb | 104 + spec/models/concerns/statuseable_spec.rb | 129 + spec/models/concerns/subscribable_spec.rb | 67 + spec/models/deploy_key_spec.rb | 15 - spec/models/deploy_keys_project_spec.rb | 11 - spec/models/email_spec.rb | 11 - spec/models/event_spec.rb | 145 +- spec/models/external_issue_spec.rb | 15 + spec/models/forked_project_link_spec.rb | 11 - spec/models/generic_commit_status_spec.rb | 34 - spec/models/group_spec.rb | 58 +- spec/models/hooks/project_hook_spec.rb | 4 + spec/models/hooks/service_hook_spec.rb | 6 +- spec/models/hooks/system_hook_spec.rb | 74 +- spec/models/hooks/web_hook_spec.rb | 68 +- spec/models/identity_spec.rb | 12 - spec/models/issue_spec.rb | 156 +- spec/models/key_spec.rb | 15 - spec/models/label_link_spec.rb | 12 - spec/models/label_spec.rb | 51 +- spec/models/legacy_diff_note_spec.rb | 74 + spec/models/member_spec.rb | 19 - spec/models/merge_request_spec.rb | 206 +- spec/models/milestone_spec.rb | 107 +- spec/models/namespace_spec.rb | 58 +- spec/models/note_spec.rb | 65 +- spec/models/notification_setting_spec.rb | 17 + spec/models/project_group_link_spec.rb | 17 + spec/models/project_security_spec.rb | 10 +- .../project_services/bamboo_service_spec.rb | 235 +- .../buildkite_service_spec.rb | 17 + .../builds_email_service_spec.rb | 70 +- .../project_services/campfire_service_spec.rb | 42 + .../custom_issue_tracker_service_spec.rb | 49 + .../project_services/drone_ci_service_spec.rb | 13 +- .../emails_on_push_service_spec.rb | 17 + .../external_wiki_service_spec.rb | 17 +- .../project_services/flowdock_service_spec.rb | 14 + .../gemnasium_service_spec.rb | 16 + .../gitlab_issue_tracker_service_spec.rb | 14 + .../project_services/hipchat_service_spec.rb | 18 +- .../project_services/irker_service_spec.rb | 14 +- .../project_services/jira_service_spec.rb | 26 +- .../pivotaltracker_service_spec.rb | 42 + .../project_services/pushover_service_spec.rb | 20 +- .../project_services/redmine_service_spec.rb | 49 + .../slack_service/issue_message_spec.rb | 21 +- .../slack_service/merge_message_spec.rb | 4 +- .../slack_service/note_message_spec.rb | 6 +- .../slack_service/wiki_page_message_spec.rb | 74 + .../project_services/slack_service_spec.rb | 34 +- .../project_services/teamcity_service_spec.rb | 220 +- spec/models/project_snippet_spec.rb | 17 - spec/models/project_spec.rb | 317 +- spec/models/project_team_spec.rb | 44 + spec/models/project_wiki_spec.rb | 15 +- spec/models/protected_branch_spec.rb | 12 - spec/models/release_spec.rb | 12 - spec/models/repository_spec.rb | 667 +- spec/models/service_spec.rb | 21 - spec/models/snippet_spec.rb | 61 +- spec/models/todo_spec.rb | 97 +- spec/models/user_spec.rb | 151 +- spec/requests/api/branches_spec.rb | 4 +- spec/requests/api/builds_spec.rb | 10 +- spec/requests/api/commit_status_spec.rb | 153 - spec/requests/api/commit_statuses_spec.rb | 210 + spec/requests/api/commits_spec.rb | 45 +- spec/requests/api/fork_spec.rb | 2 +- spec/requests/api/gitignores_spec.rb | 29 + spec/requests/api/group_members_spec.rb | 24 +- spec/requests/api/groups_spec.rb | 59 +- spec/requests/api/internal_spec.rb | 12 + spec/requests/api/issues_spec.rb | 303 +- spec/requests/api/labels_spec.rb | 111 +- spec/requests/api/licenses_spec.rb | 136 + spec/requests/api/merge_requests_spec.rb | 118 +- spec/requests/api/milestones_spec.rb | 58 +- spec/requests/api/notes_spec.rb | 174 +- spec/requests/api/project_hooks_spec.rb | 14 +- spec/requests/api/project_members_spec.rb | 24 +- spec/requests/api/project_snippets_spec.rb | 105 + spec/requests/api/projects_spec.rb | 184 +- spec/requests/api/repositories_spec.rb | 17 +- spec/requests/api/runners_spec.rb | 21 +- spec/requests/api/tags_spec.rb | 27 +- spec/requests/api/triggers_spec.rb | 4 +- spec/requests/api/users_spec.rb | 47 + spec/requests/api/variables_spec.rb | 4 +- spec/requests/ci/api/builds_spec.rb | 102 +- spec/requests/ci/api/runners_spec.rb | 83 +- spec/requests/jwt_controller_spec.rb | 72 + spec/routing/admin_routing_spec.rb | 7 + spec/routing/routing_spec.rb | 56 +- .../archive_repository_service_spec.rb | 25 - ...er_registry_authentication_service_spec.rb | 239 + .../services/ci/create_builds_service_spec.rb | 4 +- .../ci/image_for_build_service_spec.rb | 2 +- spec/services/create_snippet_service_spec.rb | 2 +- spec/services/create_tag_service_spec.rb | 53 + spec/services/delete_tag_service_spec.rb | 17 + spec/services/delete_user_service_spec.rb | 58 + spec/services/git_push_service_spec.rb | 144 +- spec/services/git_tag_push_service_spec.rb | 28 +- spec/services/groups/create_service_spec.rb | 20 + spec/services/groups/update_service_spec.rb | 52 + .../issues/bulk_update_service_spec.rb | 2 +- spec/services/issues/create_service_spec.rb | 67 +- spec/services/issues/move_service_spec.rb | 276 + spec/services/issues/update_service_spec.rb | 85 +- .../add_todo_when_build_fails_service_spec.rb | 81 + .../merge_requests/build_service_spec.rb | 181 + .../merge_requests/create_service_spec.rb | 4 +- .../merge_requests/merge_service_spec.rb | 15 + .../merge_when_build_succeeds_service_spec.rb | 16 + .../merge_requests/refresh_service_spec.rb | 30 +- .../merge_requests/update_service_spec.rb | 64 +- spec/services/notes/delete_service_spec.rb | 15 + spec/services/notification_service_spec.rb | 298 +- .../projects/autocomplete_service_spec.rb | 79 + spec/services/projects/create_service_spec.rb | 4 +- .../services/projects/destroy_service_spec.rb | 31 +- .../projects/housekeeping_service_spec.rb | 48 + spec/services/projects/import_service_spec.rb | 30 +- .../projects/transfer_service_spec.rb | 34 + .../projects/unlink_fork_service_spec.rb | 32 + spec/services/projects/update_service_spec.rb | 4 +- spec/services/system_note_service_spec.rb | 92 +- spec/services/todo_service_spec.rb | 120 +- spec/services/update_snippet_service_spec.rb | 2 +- spec/spec_helper.rb | 13 +- spec/support/capybara.rb | 2 +- spec/support/carrierwave.rb | 7 + spec/support/email_helpers.rb | 13 + spec/support/filter_spec_helper.rb | 2 +- spec/support/gitlab_stubs/gitlab_ci.yml | 17 +- .../issue_tracker_service_shared_example.rb | 7 + spec/support/jira_service_helper.rb | 10 +- spec/support/markdown_feature.rb | 8 +- spec/support/matchers/access_matchers.rb | 4 +- spec/support/matchers/benchmark_matchers.rb | 61 - spec/support/matchers/markdown_matchers.rb | 21 +- spec/support/mentionable_shared_examples.rb | 2 + .../project_hook_data_shared_example.rb | 17 +- spec/support/repo_helpers.rb | 2 +- spec/support/stub_gitlab_calls.rb | 37 +- spec/support/test_env.rb | 1 + spec/support/wait_for_ajax.rb | 2 +- spec/support/workhorse_helpers.rb | 16 + spec/tasks/gitlab/backup_rake_spec.rb | 76 +- spec/workers/delete_user_worker_spec.rb | 20 + spec/workers/emails_on_push_worker_spec.rb | 65 +- spec/workers/merge_worker_spec.rb | 2 + spec/workers/post_receive_spec.rb | 59 +- spec/workers/project_cache_worker_spec.rb | 27 + .../repository_check/batch_worker_spec.rb | 46 + .../repository_check/clear_worker_spec.rb | 17 + .../single_repository_worker_spec.rb | 57 + spec/workers/repository_fork_worker_spec.rb | 19 +- spec/workers/repository_import_worker_spec.rb | 26 +- vendor/assets/javascripts/cropper.js | 2993 +++++ vendor/assets/javascripts/date.format.js | 125 + vendor/assets/javascripts/jquery.scrollTo.js | 210 + vendor/assets/stylesheets/cropper.css | 379 + vendor/gitignore/Actionscript.gitignore | 19 + vendor/gitignore/Ada.gitignore | 5 + vendor/gitignore/Agda.gitignore | 1 + vendor/gitignore/Android.gitignore | 39 + vendor/gitignore/AppEngine.gitignore | 2 + .../gitignore/AppceleratorTitanium.gitignore | 3 + vendor/gitignore/ArchLinuxPackages.gitignore | 13 + vendor/gitignore/Autotools.gitignore | 18 + vendor/gitignore/C++.gitignore | 28 + vendor/gitignore/C.gitignore | 33 + vendor/gitignore/CFWheels.gitignore | 12 + vendor/gitignore/CMake.gitignore | 6 + vendor/gitignore/CUDA.gitignore | 6 + vendor/gitignore/CakePHP.gitignore | 25 + vendor/gitignore/ChefCookbook.gitignore | 9 + vendor/gitignore/Clojure.gitignore | 1 + vendor/gitignore/CodeIgniter.gitignore | 6 + vendor/gitignore/CommonLisp.gitignore | 3 + vendor/gitignore/Composer.gitignore | 6 + vendor/gitignore/Concrete5.gitignore | 4 + vendor/gitignore/Coq.gitignore | 3 + vendor/gitignore/CraftCMS.gitignore | 3 + vendor/gitignore/D.gitignore | 20 + vendor/gitignore/DM.gitignore | 5 + vendor/gitignore/Dart.gitignore | 27 + vendor/gitignore/Delphi.gitignore | 66 + vendor/gitignore/Drupal.gitignore | 36 + vendor/gitignore/EPiServer.gitignore | 4 + vendor/gitignore/Eagle.gitignore | 44 + vendor/gitignore/Elisp.gitignore | 5 + vendor/gitignore/Elixir.gitignore | 5 + vendor/gitignore/Elm.gitignore | 4 + vendor/gitignore/Erlang.gitignore | 10 + vendor/gitignore/ExpressionEngine.gitignore | 19 + vendor/gitignore/ExtJs.gitignore | 4 + vendor/gitignore/Fancy.gitignore | 2 + vendor/gitignore/Finale.gitignore | 13 + vendor/gitignore/ForceDotCom.gitignore | 4 + vendor/gitignore/Fortran.gitignore | 1 + vendor/gitignore/FuelPHP.gitignore | 21 + vendor/gitignore/GWT.gitignore | 28 + vendor/gitignore/Gcov.gitignore | 5 + vendor/gitignore/GitBook.gitignore | 16 + vendor/gitignore/Global/Anjuta.gitignore | 3 + vendor/gitignore/Global/Archives.gitignore | 27 + vendor/gitignore/Global/BricxCC.gitignore | 4 + vendor/gitignore/Global/CVS.gitignore | 4 + vendor/gitignore/Global/Calabash.gitignore | 10 + vendor/gitignore/Global/Cloud9.gitignore | 3 + vendor/gitignore/Global/CodeKit.gitignore | 3 + vendor/gitignore/Global/DartEditor.gitignore | 2 + vendor/gitignore/Global/Dreamweaver.gitignore | 7 + vendor/gitignore/Global/Dropbox.gitignore | 4 + vendor/gitignore/Global/Eclipse.gitignore | 51 + .../gitignore/Global/EiffelStudio.gitignore | 2 + vendor/gitignore/Global/Emacs.gitignore | 42 + vendor/gitignore/Global/Ensime.gitignore | 4 + vendor/gitignore/Global/Espresso.gitignore | 1 + vendor/gitignore/Global/FlexBuilder.gitignore | 3 + vendor/gitignore/Global/GPG.gitignore | 2 + .../Global/IPythonNotebook.gitignore | 2 + vendor/gitignore/Global/JDeveloper.gitignore | 13 + vendor/gitignore/Global/JetBrains.gitignore | 44 + vendor/gitignore/Global/KDevelop4.gitignore | 2 + vendor/gitignore/Global/Kate.gitignore | 3 + vendor/gitignore/Global/Lazarus.gitignore | 30 + vendor/gitignore/Global/LibreOffice.gitignore | 2 + vendor/gitignore/Global/Linux.gitignore | 10 + vendor/gitignore/Global/LyX.gitignore | 4 + vendor/gitignore/Global/Matlab.gitignore | 19 + vendor/gitignore/Global/Mercurial.gitignore | 6 + .../Global/MicrosoftOffice.gitignore | 16 + vendor/gitignore/Global/ModelSim.gitignore | 23 + vendor/gitignore/Global/Momentics.gitignore | 8 + vendor/gitignore/Global/MonoDevelop.gitignore | 8 + vendor/gitignore/Global/NetBeans.gitignore | 7 + vendor/gitignore/Global/Ninja.gitignore | 2 + vendor/gitignore/Global/NotepadPP.gitignore | 2 + vendor/gitignore/Global/OSX.gitignore | 24 + vendor/gitignore/Global/Otto.gitignore | 1 + vendor/gitignore/Global/Redcar.gitignore | 1 + vendor/gitignore/Global/Redis.gitignore | 3 + vendor/gitignore/Global/SBT.gitignore | 9 + vendor/gitignore/Global/SVN.gitignore | 1 + vendor/gitignore/Global/SlickEdit.gitignore | 11 + vendor/gitignore/Global/SublimeText.gitignore | 14 + vendor/gitignore/Global/SynopsysVCS.gitignore | 36 + vendor/gitignore/Global/Tags.gitignore | 16 + vendor/gitignore/Global/TextMate.gitignore | 3 + vendor/gitignore/Global/TortoiseGit.gitignore | 2 + vendor/gitignore/Global/Vagrant.gitignore | 1 + vendor/gitignore/Global/Vim.gitignore | 10 + vendor/gitignore/Global/VirtualEnv.gitignore | 12 + .../Global/VisualStudioCode.gitignore | 2 + vendor/gitignore/Global/WebMethods.gitignore | 14 + vendor/gitignore/Global/Windows.gitignore | 18 + vendor/gitignore/Global/Xcode.gitignore | 23 + vendor/gitignore/Global/XilinxISE.gitignore | 67 + vendor/gitignore/Go.gitignore | 24 + vendor/gitignore/Gradle.gitignore | 14 + vendor/gitignore/Grails.gitignore | 33 + vendor/gitignore/Haskell.gitignore | 18 + vendor/gitignore/IGORPro.gitignore | 5 + vendor/gitignore/Idris.gitignore | 2 + vendor/gitignore/Java.gitignore | 12 + vendor/gitignore/Jboss.gitignore | 19 + vendor/gitignore/Jekyll.gitignore | 3 + vendor/gitignore/Joomla.gitignore | 546 + vendor/gitignore/KiCad.gitignore | 20 + vendor/gitignore/Kohana.gitignore | 2 + vendor/gitignore/LabVIEW.gitignore | 16 + vendor/gitignore/Laravel.gitignore | 16 + vendor/gitignore/Leiningen.gitignore | 12 + vendor/gitignore/LemonStand.gitignore | 21 + vendor/gitignore/Lilypond.gitignore | 6 + vendor/gitignore/Lithium.gitignore | 2 + vendor/gitignore/Lua.gitignore | 41 + vendor/gitignore/Magento.gitignore | 104 + vendor/gitignore/Maven.gitignore | 9 + vendor/gitignore/Mercury.gitignore | 13 + .../gitignore/MetaProgrammingSystem.gitignore | 16 + vendor/gitignore/Nanoc.gitignore | 10 + vendor/gitignore/Nim.gitignore | 1 + vendor/gitignore/Node.gitignore | 37 + vendor/gitignore/OCaml.gitignore | 20 + vendor/gitignore/Objective-C.gitignore | 51 + vendor/gitignore/Opa.gitignore | 13 + vendor/gitignore/OpenCart.gitignore | 13 + vendor/gitignore/OracleForms.gitignore | 8 + vendor/gitignore/Packer.gitignore | 5 + vendor/gitignore/Perl.gitignore | 20 + vendor/gitignore/Phalcon.gitignore | 2 + vendor/gitignore/PlayFramework.gitignore | 15 + vendor/gitignore/Plone.gitignore | 18 + vendor/gitignore/Prestashop.gitignore | 32 + vendor/gitignore/Processing.gitignore | 7 + vendor/gitignore/Python.gitignore | 89 + vendor/gitignore/Qooxdoo.gitignore | 5 + vendor/gitignore/Qt.gitignore | 38 + vendor/gitignore/R.gitignore | 33 + vendor/gitignore/ROS.gitignore | 47 + vendor/gitignore/Rails.gitignore | 38 + vendor/gitignore/RhodesRhomobile.gitignore | 9 + vendor/gitignore/Ruby.gitignore | 50 + vendor/gitignore/Rust.gitignore | 7 + vendor/gitignore/SCons.gitignore | 2 + vendor/gitignore/Sass.gitignore | 2 + vendor/gitignore/Scala.gitignore | 17 + vendor/gitignore/Scheme.gitignore | 7 + vendor/gitignore/Scrivener.gitignore | 7 + vendor/gitignore/Sdcc.gitignore | 8 + vendor/gitignore/SeamGen.gitignore | 26 + vendor/gitignore/SketchUp.gitignore | 1 + vendor/gitignore/Smalltalk.gitignore | 18 + vendor/gitignore/Stella.gitignore | 12 + vendor/gitignore/SugarCRM.gitignore | 25 + vendor/gitignore/Swift.gitignore | 63 + vendor/gitignore/Symfony.gitignore | 48 + vendor/gitignore/SymphonyCMS.gitignore | 6 + vendor/gitignore/TeX.gitignore | 180 + vendor/gitignore/Terraform.gitignore | 3 + vendor/gitignore/Textpattern.gitignore | 11 + vendor/gitignore/TurboGears2.gitignore | 20 + vendor/gitignore/Typo3.gitignore | 20 + vendor/gitignore/Umbraco.gitignore | 19 + vendor/gitignore/Unity.gitignore | 30 + vendor/gitignore/UnrealEngine.gitignore | 62 + vendor/gitignore/VVVV.gitignore | 6 + vendor/gitignore/VisualStudio.gitignore | 252 + vendor/gitignore/Waf.gitignore | 4 + vendor/gitignore/WordPress.gitignore | 18 + vendor/gitignore/Xojo.gitignore | 11 + vendor/gitignore/Yeoman.gitignore | 6 + vendor/gitignore/Yii.gitignore | 6 + vendor/gitignore/ZendFramework.gitignore | 25 + vendor/gitignore/Zephir.gitignore | 26 + 2092 files changed, 73012 insertions(+), 20518 deletions(-) create mode 100644 .csscomb.json create mode 100644 .scss-lint.yml delete mode 100644 app/assets/images/ci/arch.jpg delete mode 100644 app/assets/images/ci/favicon.ico delete mode 100644 app/assets/images/ci/loader.gif delete mode 100644 app/assets/images/ci/no_avatar.png delete mode 100644 app/assets/images/ci/rails.png delete mode 100644 app/assets/images/ci/service_sample.png create mode 100644 app/assets/javascripts/blob/blob_gitignore_selector.js.coffee create mode 100644 app/assets/javascripts/blob/blob_license_selector.js.coffee delete mode 100644 app/assets/javascripts/blob/new_blob.js.coffee create mode 100644 app/assets/javascripts/breakpoints.coffee create mode 100644 app/assets/javascripts/compare.js.coffee delete mode 100644 app/assets/javascripts/dashboard.js.coffee create mode 100644 app/assets/javascripts/due_date_select.js.coffee create mode 100644 app/assets/javascripts/gl_crop.js.coffee create mode 100644 app/assets/javascripts/gl_dropdown.js.coffee create mode 100644 app/assets/javascripts/gl_form.js.coffee create mode 100644 app/assets/javascripts/issuable.js.coffee create mode 100644 app/assets/javascripts/issue_status_select.js.coffee create mode 100644 app/assets/javascripts/labels_select.js.coffee create mode 100644 app/assets/javascripts/lib/animate.js.coffee create mode 100644 app/assets/javascripts/lib/datetime_utility.js.coffee create mode 100644 app/assets/javascripts/lib/notify.js.coffee create mode 100644 app/assets/javascripts/lib/type_utility.js.coffee create mode 100644 app/assets/javascripts/lib/url_utility.js.coffee delete mode 100644 app/assets/javascripts/merge_requests.js.coffee create mode 100644 app/assets/javascripts/milestone_select.js.coffee create mode 100644 app/assets/javascripts/right_sidebar.js.coffee create mode 100644 app/assets/javascripts/search.js.coffee create mode 100644 app/assets/javascripts/todos.js.coffee create mode 100644 app/assets/javascripts/user_tabs.js.coffee create mode 100644 app/assets/stylesheets/framework/animations.scss create mode 100644 app/assets/stylesheets/framework/dropdowns.scss create mode 100644 app/assets/stylesheets/framework/modal.scss create mode 100644 app/assets/stylesheets/framework/progress.scss create mode 100644 app/assets/stylesheets/mailers/repository_push_email.scss create mode 100644 app/assets/stylesheets/notify.scss create mode 100644 app/assets/stylesheets/pages/confirmation.scss create mode 100644 app/assets/stylesheets/pages/pipelines.scss create mode 100644 app/assets/stylesheets/pages/settings.scss create mode 100644 app/controllers/admin/health_check_controller.rb delete mode 100644 app/controllers/admin/impersonation_controller.rb create mode 100644 app/controllers/admin/impersonations_controller.rb create mode 100644 app/controllers/concerns/continue_params.rb create mode 100644 app/controllers/concerns/filter_projects.rb create mode 100644 app/controllers/concerns/issuable_actions.rb create mode 100644 app/controllers/concerns/toggle_subscription_action.rb create mode 100644 app/controllers/dashboard/labels_controller.rb create mode 100644 app/controllers/emojis_controller.rb create mode 100644 app/controllers/groups/notification_settings_controller.rb create mode 100644 app/controllers/health_check_controller.rb create mode 100644 app/controllers/jwt_controller.rb create mode 100644 app/controllers/projects/container_registry_controller.rb create mode 100644 app/controllers/projects/group_links_controller.rb create mode 100644 app/controllers/projects/notification_settings_controller.rb create mode 100644 app/controllers/projects/pipelines_controller.rb create mode 100644 app/finders/group_projects_finder.rb create mode 100644 app/finders/groups_finder.rb create mode 100644 app/finders/joined_groups_finder.rb create mode 100644 app/finders/pipelines_finder.rb create mode 100644 app/finders/union_finder.rb delete mode 100644 app/helpers/ci_badge_helper.rb create mode 100644 app/helpers/dropdowns_helper.rb create mode 100644 app/helpers/form_helper.rb create mode 100644 app/helpers/import_helper.rb create mode 100644 app/mailers/repository_check_mailer.rb create mode 100644 app/models/blob.rb create mode 100644 app/models/concerns/milestoneish.rb delete mode 100644 app/models/concerns/notifiable.rb create mode 100644 app/models/concerns/statuseable.rb create mode 100644 app/models/concerns/subscribable.rb delete mode 100644 app/models/diff_line.rb create mode 100644 app/models/legacy_diff_note.rb delete mode 100644 app/models/notification.rb create mode 100644 app/models/notification_setting.rb create mode 100644 app/models/oauth_access_token.rb create mode 100644 app/models/project_group_link.rb create mode 100644 app/models/project_services/slack_service/wiki_page_message.rb delete mode 100644 app/services/archive_repository_service.rb create mode 100644 app/services/auth/container_registry_authentication_service.rb create mode 100644 app/services/ci/create_pipeline_service.rb create mode 100644 app/services/commits/change_service.rb create mode 100644 app/services/commits/cherry_pick_service.rb create mode 100644 app/services/groups/base_service.rb create mode 100644 app/services/groups/create_service.rb create mode 100644 app/services/groups/update_service.rb create mode 100644 app/services/issues/move_service.rb create mode 100644 app/services/merge_requests/add_todo_when_build_fails_service.rb create mode 100644 app/services/notes/delete_service.rb create mode 100644 app/services/projects/unlink_fork_service.rb create mode 100644 app/services/wiki_pages/base_service.rb create mode 100644 app/services/wiki_pages/create_service.rb create mode 100644 app/services/wiki_pages/update_service.rb create mode 100644 app/views/admin/groups/_group.html.haml create mode 100644 app/views/admin/health_check/show.html.haml delete mode 100644 app/views/ci/commits/_commit.html.haml delete mode 100644 app/views/ci/projects/index.html.haml delete mode 100644 app/views/dashboard/milestones/_issue.html.haml delete mode 100644 app/views/dashboard/milestones/_issues.html.haml delete mode 100644 app/views/dashboard/milestones/_merge_request.html.haml delete mode 100644 app/views/dashboard/milestones/_merge_requests.html.haml create mode 100644 app/views/devise/confirmations/almost_there.haml create mode 100644 app/views/emojis/index.html.haml delete mode 100644 app/views/explore/projects/_dropdown.html.haml create mode 100644 app/views/groups/_activities.html.haml create mode 100644 app/views/groups/_shared_projects.html.haml create mode 100644 app/views/groups/activity.html.haml delete mode 100644 app/views/groups/milestones/_issue.html.haml delete mode 100644 app/views/groups/milestones/_issues.html.haml delete mode 100644 app/views/groups/milestones/_merge_request.html.haml delete mode 100644 app/views/groups/milestones/_merge_requests.html.haml create mode 100644 app/views/layouts/devise_empty.html.haml delete mode 100644 app/views/layouts/header/_public.html.haml create mode 100644 app/views/notify/_relabeled_issuable_email.html.haml create mode 100644 app/views/notify/_relabeled_issuable_email.text.erb create mode 100644 app/views/notify/issue_moved_email.html.haml create mode 100644 app/views/notify/issue_moved_email.text.erb create mode 100644 app/views/notify/note_snippet_email.html.haml create mode 100644 app/views/notify/note_snippet_email.text.erb create mode 100644 app/views/notify/relabeled_issue_email.html.haml create mode 100644 app/views/notify/relabeled_issue_email.text.erb create mode 100644 app/views/notify/relabeled_merge_request_email.html.haml create mode 100644 app/views/notify/relabeled_merge_request_email.text.erb delete mode 100644 app/views/profiles/applications.html.haml delete mode 100644 app/views/profiles/keys/new.html.haml create mode 100644 app/views/profiles/notifications/_group_settings.html.haml create mode 100644 app/views/profiles/notifications/_project_settings.html.haml delete mode 100644 app/views/profiles/notifications/_settings.html.haml delete mode 100644 app/views/profiles/notifications/update.js.haml create mode 100644 app/views/projects/_builds_settings.html.haml create mode 100644 app/views/projects/badges/index.html.haml create mode 100644 app/views/projects/ci/builds/_build.html.haml create mode 100644 app/views/projects/ci/commits/_commit.html.haml rename app/views/projects/commit/{_revert.html.haml => _change.html.haml} (62%) create mode 100644 app/views/projects/commit/_ci_commit.html.haml create mode 100644 app/views/projects/commit/_ci_stage.html.haml delete mode 100644 app/views/projects/commit_statuses/_commit_status.html.haml create mode 100644 app/views/projects/container_registry/_header_title.html.haml create mode 100644 app/views/projects/container_registry/_tag.html.haml create mode 100644 app/views/projects/container_registry/index.html.haml create mode 100644 app/views/projects/diffs/_line.html.haml create mode 100644 app/views/projects/forks/_projects.html.haml create mode 100644 app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml delete mode 100644 app/views/projects/go_import.html.haml create mode 100644 app/views/projects/group_links/index.html.haml create mode 100644 app/views/projects/hooks/_project_hook.html.haml create mode 100644 app/views/projects/issues/_new_branch.html.haml create mode 100644 app/views/projects/issues/_related_branches.html.haml delete mode 100644 app/views/projects/issues/update.js.haml create mode 100644 app/views/projects/merge_requests/branch_from.html.haml delete mode 100644 app/views/projects/merge_requests/branch_from.js.haml create mode 100644 app/views/projects/merge_requests/branch_to.html.haml delete mode 100644 app/views/projects/merge_requests/branch_to.js.haml create mode 100644 app/views/projects/merge_requests/dropdowns/_branch.html.haml create mode 100644 app/views/projects/merge_requests/dropdowns/_project.html.haml delete mode 100644 app/views/projects/merge_requests/update.js.haml create mode 100644 app/views/projects/merge_requests/update_branches.html.haml delete mode 100644 app/views/projects/merge_requests/update_branches.js.haml delete mode 100644 app/views/projects/milestones/_issue.html.haml delete mode 100644 app/views/projects/milestones/_issues.html.haml delete mode 100644 app/views/projects/milestones/_merge_request.html.haml delete mode 100644 app/views/projects/milestones/_merge_requests.html.haml delete mode 100644 app/views/projects/notes/discussions/_active.html.haml delete mode 100644 app/views/projects/notes/discussions/_commit.html.haml delete mode 100644 app/views/projects/notes/discussions/_diff.html.haml create mode 100644 app/views/projects/notes/discussions/_diff_with_notes.html.haml create mode 100644 app/views/projects/notes/discussions/_notes.html.haml delete mode 100644 app/views/projects/notes/discussions/_outdated.html.haml create mode 100644 app/views/projects/pipelines/_header_title.html.haml create mode 100644 app/views/projects/pipelines/_info.html.haml create mode 100644 app/views/projects/pipelines/index.html.haml create mode 100644 app/views/projects/pipelines/new.html.haml create mode 100644 app/views/projects/pipelines/show.html.haml create mode 100644 app/views/projects/project_members/_shared_group_members.html.haml create mode 100644 app/views/projects/runners/_form.html.haml create mode 100644 app/views/projects/variables/_content.html.haml create mode 100644 app/views/projects/variables/_form.html.haml create mode 100644 app/views/projects/variables/_table.html.haml create mode 100644 app/views/projects/variables/index.html.haml create mode 100644 app/views/repository_check_mailer/notify.html.haml create mode 100644 app/views/repository_check_mailer/notify.text.haml create mode 100644 app/views/shared/_labels_row.html.haml create mode 100644 app/views/shared/groups/_list.html.haml create mode 100644 app/views/shared/issuable/_label_dropdown.html.haml create mode 100644 app/views/shared/issuable/_label_page_create.html.haml create mode 100644 app/views/shared/issuable/_label_page_default.html.haml create mode 100644 app/views/shared/issuable/_milestone_dropdown.html.haml create mode 100644 app/views/shared/milestones/_issuable.html.haml create mode 100644 app/views/shared/milestones/_issuables.html.haml create mode 100644 app/views/shared/milestones/_issues_tab.html.haml create mode 100644 app/views/shared/milestones/_labels_tab.html.haml create mode 100644 app/views/shared/milestones/_merge_requests_tab.haml create mode 100644 app/views/shared/milestones/_milestone.html.haml create mode 100644 app/views/shared/milestones/_participants_tab.html.haml create mode 100644 app/views/shared/milestones/_summary.html.haml create mode 100644 app/views/shared/milestones/_tabs.html.haml create mode 100644 app/views/shared/milestones/_top.html.haml create mode 100644 app/views/shared/projects/_dropdown.html.haml create mode 100644 app/workers/admin_email_worker.rb create mode 100644 app/workers/delete_user_worker.rb create mode 100644 app/workers/gitlab_shell_one_shot_worker.rb create mode 100644 app/workers/repository_check/batch_worker.rb create mode 100644 app/workers/repository_check/clear_worker.rb create mode 100644 app/workers/repository_check/single_repository_worker.rb create mode 100755 bin/teaspoon create mode 100644 config/initializers/go_get.rb create mode 100644 config/initializers/gollum.rb create mode 100644 config/initializers/health_check.rb delete mode 100644 config/initializers/monkey_patch.rb create mode 100644 config/initializers/mysql_ignore_postgresql_options.rb create mode 100644 config/initializers/postgresql_opclasses_support.rb create mode 100644 config/initializers/premailer.rb delete mode 100644 config/initializers/redis_config.rb create mode 100644 config/initializers/trusted_proxies.rb create mode 100644 db/migrate/20130711063759_create_project_group_links.rb create mode 100644 db/migrate/20130820102832_add_access_to_project_group_link.rb create mode 100644 db/migrate/20150930110012_add_group_share_lock.rb create mode 100644 db/migrate/20160204144558_add_real_size_to_merge_request_diffs.rb create mode 100644 db/migrate/20160223192159_add_confidential_to_issues.rb create mode 100644 db/migrate/20160225090018_add_delete_at_to_issues.rb create mode 100644 db/migrate/20160225101956_add_delete_at_to_merge_requests.rb create mode 100644 db/migrate/20160226114608_add_trigram_indexes_for_searching.rb create mode 100644 db/migrate/20160227120001_add_event_field_for_web_hook.rb create mode 100644 db/migrate/20160227120047_add_event_to_services.rb create mode 100644 db/migrate/20160229193553_add_main_language_to_repository.rb create mode 100644 db/migrate/20160301124843_add_visibility_level_to_groups.rb create mode 100644 db/migrate/20160302151724_add_import_credentials_to_project_import_data.rb create mode 100644 db/migrate/20160302152808_remove_wrong_import_url_from_projects.rb create mode 100644 db/migrate/20160305220806_remove_expires_at_from_snippets.rb create mode 100644 db/migrate/20160307221555_disallow_blank_line_code_on_note.rb create mode 100644 db/migrate/20160308212903_add_default_group_visibility_to_application_settings.rb create mode 100644 db/migrate/20160310124959_add_due_date_to_issues.rb create mode 100644 db/migrate/20160310185910_add_external_flag_to_users.rb create mode 100644 db/migrate/20160314143402_projects_add_pushes_since_gc.rb create mode 100644 db/migrate/20160315135439_project_add_repository_check.rb create mode 100644 db/migrate/20160316123110_ci_runners_token_index.rb create mode 100644 db/migrate/20160316192622_change_target_id_to_null_on_todos.rb create mode 100644 db/migrate/20160316204731_add_commit_id_to_todos.rb create mode 100644 db/migrate/20160317092222_add_moved_to_to_issue.rb create mode 100644 db/migrate/20160320204112_index_namespaces_on_visibility_level.rb create mode 100644 db/migrate/20160324020319_remove_todos_for_deleted_issues.rb create mode 100644 db/migrate/20160328112808_create_notification_settings.rb create mode 100644 db/migrate/20160328115649_migrate_new_notification_setting.rb create mode 100644 db/migrate/20160328121138_add_notification_setting_index.rb create mode 100644 db/migrate/20160329144452_add_index_on_pending_delete_projects.rb create mode 100644 db/migrate/20160331133914_remove_todos_for_deleted_merge_requests.rb create mode 100644 db/migrate/20160331223143_remove_twitter_sharing_enabled_from_application_settings.rb create mode 100644 db/migrate/20160407120251_add_images_enabled_for_project.rb create mode 100644 db/migrate/20160412140240_add_repository_checks_enabled_setting.rb create mode 100644 db/migrate/20160412173416_add_fields_to_ci_commit.rb create mode 100644 db/migrate/20160412173417_update_ci_commit.rb create mode 100644 db/migrate/20160412173418_add_ci_commit_indexes.rb create mode 100644 db/migrate/20160413115152_add_token_to_web_hooks.rb create mode 100644 db/migrate/20160415133440_add_shared_runners_text_to_application_settings.rb create mode 100644 db/migrate/20160419120017_add_metrics_packet_size.rb create mode 100644 db/migrate/20160421130527_disable_repository_checks.rb create mode 100644 db/migrate/20160504091942_add_disabled_oauth_sign_in_sources_to_application_settings.rb create mode 100644 db/migrate/20160504112519_add_run_untagged_to_ci_runner.rb create mode 100644 db/migrate/20160508194200_remove_wall_enabled_from_projects.rb create mode 100644 db/migrate/20160508215820_add_type_to_notes.rb create mode 100644 db/migrate/20160508221410_set_type_on_legacy_diff_notes.rb create mode 100644 db/migrate/20160509201028_add_health_check_access_token_to_application_settings.rb create mode 100644 db/migrate/20160516174813_add_send_user_confirmation_email_to_application_settings.rb create mode 100644 doc/administration/auth/README.md create mode 100644 doc/administration/auth/ldap.md create mode 100644 doc/administration/container_registry.md create mode 100644 doc/administration/high_availability/README.md create mode 100644 doc/administration/high_availability/database.md create mode 100644 doc/administration/high_availability/gitlab.md create mode 100644 doc/administration/high_availability/load_balancer.md create mode 100644 doc/administration/high_availability/nfs.md create mode 100644 doc/administration/high_availability/redis.md create mode 100644 doc/administration/repository_checks.md create mode 100644 doc/administration/troubleshooting/sidekiq.md create mode 100644 doc/api/licenses.md delete mode 100644 doc/ci/api/commits.md delete mode 100644 doc/ci/api/projects.md rename doc/ci/{ => examples}/deployment/README.md (98%) rename doc/ci/{languages => examples}/php.md (97%) delete mode 100644 doc/ci/languages/README.md create mode 100644 doc/container_registry/README.md create mode 100644 doc/container_registry/img/container_registry.png create mode 100644 doc/container_registry/img/project_feature.png delete mode 100644 doc/development/benchmarking.md create mode 100644 doc/development/code_review.md create mode 100644 doc/development/gotchas.md create mode 100644 doc/development/instrumentation.md create mode 100644 doc/development/performance.md create mode 100644 doc/development/scss_styleguide.md create mode 100644 doc/development/sql.md create mode 100644 doc/development/testing.md create mode 100644 doc/downgrade_ee_to_ce/README.md rename doc/gitlab-basics/basicsimages/{compare_braches.png => compare_branches.png} (100%) create mode 100644 doc/integration/auth0.md create mode 100644 doc/integration/img/enabled-oauth-sign-in-sources.png create mode 100644 doc/intro/README.md create mode 100644 doc/monitoring/health_check.md create mode 100644 doc/monitoring/img/health_check_token.png create mode 100644 doc/monitoring/performance/grafana_configuration.md create mode 100644 doc/monitoring/performance/img/grafana_dashboard_dropdown.png create mode 100644 doc/monitoring/performance/img/grafana_dashboard_import.png create mode 100644 doc/monitoring/performance/img/grafana_data_source_configuration.png create mode 100644 doc/monitoring/performance/img/grafana_data_source_empty.png create mode 100644 doc/monitoring/performance/img/grafana_save_icon.png delete mode 100644 doc/release/README.md delete mode 100644 doc/release/howto_rc1.md delete mode 100644 doc/release/howto_update_guides.md delete mode 100644 doc/release/master.md delete mode 100644 doc/release/monthly.md delete mode 100644 doc/release/patch.md delete mode 100644 doc/release/security.md create mode 100644 doc/security/user_email_confirmation.md create mode 100644 doc/update/8.5-to-8.6.md create mode 100644 doc/update/8.6-to-8.7.md create mode 100644 doc/update/8.7-to-8.8.md create mode 100644 doc/update/restore_after_failure.md create mode 100644 doc/workflow/award_emoji.md create mode 100644 doc/workflow/cherry_pick_changes.md create mode 100644 doc/workflow/groups/max_access_level.png create mode 100644 doc/workflow/groups/other_group_sees_shared_project.png create mode 100644 doc/workflow/groups/share_project_with_groups.png create mode 100644 doc/workflow/img/award_emoji_select.png create mode 100644 doc/workflow/img/award_emoji_votes_least_popular.png create mode 100644 doc/workflow/img/award_emoji_votes_most_popular.png create mode 100644 doc/workflow/img/award_emoji_votes_sort_options.png create mode 100644 doc/workflow/img/cherry_pick_changes_commit.png create mode 100644 doc/workflow/img/cherry_pick_changes_commit_modal.png create mode 100644 doc/workflow/img/cherry_pick_changes_mr.png create mode 100644 doc/workflow/img/cherry_pick_changes_mr_modal.png create mode 100644 doc/workflow/img/new_branch_from_issue.png create mode 100644 doc/workflow/share_projects_with_other_groups.md create mode 100644 doc/workflow/share_with_group.md create mode 100644 doc/workflow/share_with_group.png delete mode 100644 features/project/commits/tags.feature create mode 100644 features/project/group_links.feature create mode 100644 features/project/labels.feature delete mode 100644 features/steps/project/commits/tags.rb create mode 100644 features/steps/project/labels.rb create mode 100644 features/steps/project/project_group_links.rb create mode 100644 features/support/rerun.rb create mode 100644 fixtures/emojis/digests.json create mode 100644 generator_templates/active_record/migration/create_table_migration.rb create mode 100644 generator_templates/active_record/migration/migration.rb create mode 100644 lib/api/gitignores.rb create mode 100644 lib/api/licenses.rb create mode 100644 lib/api/subscriptions.rb create mode 100644 lib/backup/registry.rb create mode 100644 lib/banzai/filter/image_link_filter.rb create mode 100644 lib/banzai/filter/inline_diff_filter.rb create mode 100644 lib/banzai/filter/wiki_link_filter.rb create mode 100644 lib/banzai/filter/yaml_front_matter_filter.rb create mode 100644 lib/banzai/filter_array.rb create mode 100644 lib/banzai/pipeline/pre_process_pipeline.rb delete mode 100644 lib/ci/status.rb create mode 100644 lib/container_registry/blob.rb create mode 100644 lib/container_registry/client.rb create mode 100644 lib/container_registry/config.rb create mode 100644 lib/container_registry/registry.rb create mode 100644 lib/container_registry/repository.rb create mode 100644 lib/container_registry/tag.rb create mode 100644 lib/gitlab/badge/build.rb delete mode 100644 lib/gitlab/compare_result.rb create mode 100644 lib/gitlab/database/migration_helpers.rb create mode 100644 lib/gitlab/devise_failure.rb create mode 100644 lib/gitlab/gfm/reference_rewriter.rb create mode 100644 lib/gitlab/gfm/uploads_rewriter.rb create mode 100644 lib/gitlab/git_post_receive.rb create mode 100644 lib/gitlab/github_import/branch_formatter.rb create mode 100644 lib/gitlab/github_import/label_formatter.rb create mode 100644 lib/gitlab/github_import/milestone_formatter.rb create mode 100644 lib/gitlab/gitignore.rb create mode 100644 lib/gitlab/gon_helper.rb create mode 100644 lib/gitlab/metrics/subscribers/rails_cache.rb create mode 100644 lib/gitlab/middleware/go.rb create mode 100644 lib/gitlab/redis.rb create mode 100644 lib/gitlab/repository_check_logger.rb create mode 100644 lib/gitlab/routing.rb create mode 100644 lib/gitlab/saml/auth_hash.rb create mode 100644 lib/gitlab/saml/config.rb create mode 100644 lib/gitlab/sanitizers/svg.rb create mode 100644 lib/gitlab/sanitizers/svg/whitelist.rb create mode 100644 lib/gitlab/url_sanitizer.rb create mode 100644 lib/json_web_token/rsa_token.rb create mode 100644 lib/json_web_token/token.rb delete mode 100644 lib/support/nginx/gitlab_ci create mode 100644 lib/support/nginx/registry-ssl create mode 100644 lib/tasks/gemojione.rake create mode 100644 lib/tasks/gitlab/db.rake create mode 100644 lib/tasks/gitlab/update_gitignore.rake create mode 100644 lib/tasks/scss-lint.rake create mode 100644 public/503.html delete mode 100644 public/logo.svg delete mode 100644 public/static.css create mode 100755 scripts/notify_slack.sh rename app/views/projects/notes/_commit_discussion.html.haml => shared/registry/.gitkeep (100%) delete mode 100644 spec/benchmarks/finders/issues_finder_spec.rb delete mode 100644 spec/benchmarks/finders/trending_projects_finder_spec.rb delete mode 100644 spec/benchmarks/lib/gitlab/markdown/reference_filter_spec.rb delete mode 100644 spec/benchmarks/models/milestone_spec.rb delete mode 100644 spec/benchmarks/models/project_spec.rb delete mode 100644 spec/benchmarks/models/project_team_spec.rb delete mode 100644 spec/benchmarks/models/user_spec.rb delete mode 100644 spec/benchmarks/services/projects/create_service_spec.rb create mode 100644 spec/config/mail_room_spec.rb delete mode 100644 spec/controllers/admin/impersonation_controller_spec.rb create mode 100644 spec/controllers/admin/impersonations_controller_spec.rb create mode 100644 spec/controllers/admin/projects_controller_spec.rb delete mode 100644 spec/controllers/branches_controller_spec.rb create mode 100644 spec/controllers/groups/group_members_controller_spec.rb create mode 100644 spec/controllers/groups/notification_settings_controller_spec.rb create mode 100644 spec/controllers/health_check_controller_spec.rb rename spec/controllers/{profile_keys_controller_spec.rb => profiles/keys_controller_spec.rb} (90%) rename spec/controllers/{ => projects}/blame_controller_spec.rb (100%) create mode 100644 spec/controllers/projects/branches_controller_spec.rb rename spec/controllers/{ => projects}/commits_controller_spec.rb (100%) create mode 100644 spec/controllers/projects/forks_controller_spec.rb create mode 100644 spec/controllers/projects/group_links_controller_spec.rb create mode 100644 spec/controllers/projects/notification_settings_controller_spec.rb create mode 100644 spec/controllers/projects/project_members_controller_spec.rb create mode 100644 spec/controllers/projects/snippets_controller_spec.rb create mode 100644 spec/controllers/registrations_controller_spec.rb rename spec/controllers/{sent_notification_controller_spec.rb => sent_notifications_controller_spec.rb} (100%) create mode 100644 spec/controllers/sessions_controller_spec.rb delete mode 100644 spec/factories.rb create mode 100644 spec/factories/commits.rb create mode 100644 spec/factories/deploy_keys_projects.rb create mode 100644 spec/factories/emails.rb create mode 100644 spec/factories/events.rb create mode 100644 spec/factories/file_uploader.rb create mode 100644 spec/factories/groups.rb create mode 100644 spec/factories/identities.rb create mode 100644 spec/factories/issues.rb create mode 100644 spec/factories/keys.rb create mode 100644 spec/factories/milestones.rb create mode 100644 spec/factories/namespaces.rb create mode 100644 spec/factories/oauth_access_tokens.rb create mode 100644 spec/factories/oauth_applications.rb create mode 100644 spec/factories/personal_snippets.rb create mode 100644 spec/factories/project_group_links.rb create mode 100644 spec/factories/project_hooks.rb create mode 100644 spec/factories/project_members.rb create mode 100644 spec/factories/project_snippets.rb create mode 100644 spec/factories/project_wikis.rb create mode 100644 spec/factories/protected_branches.rb create mode 100644 spec/factories/sent_notifications.rb create mode 100644 spec/factories/service_hooks.rb create mode 100644 spec/factories/services.rb create mode 100644 spec/factories/snippets.rb create mode 100644 spec/factories/system_hooks.rb create mode 100644 spec/factories/users.rb create mode 100644 spec/factories/wiki_pages.rb create mode 100644 spec/features/admin/admin_health_check_spec.rb create mode 100644 spec/features/admin/admin_uses_repository_checks_spec.rb create mode 100644 spec/features/container_registry_spec.rb create mode 100644 spec/features/dashboard/label_filter_spec.rb create mode 100644 spec/features/dashboard/user_filters_projects_spec.rb create mode 100644 spec/features/dashboard_issues_spec.rb create mode 100644 spec/features/dashboard_milestones_spec.rb create mode 100644 spec/features/issues/award_emoji_spec.rb create mode 100644 spec/features/issues/filter_by_labels_spec.rb create mode 100644 spec/features/issues/filter_issues_spec.rb create mode 100644 spec/features/issues/issue_sidebar_spec.rb create mode 100644 spec/features/issues/move_spec.rb create mode 100644 spec/features/issues/new_branch_button_spec.rb create mode 100644 spec/features/issues/update_issues_spec.rb create mode 100644 spec/features/merge_requests/cherry_pick_spec.rb create mode 100644 spec/features/merge_requests/create_new_mr_spec.rb create mode 100644 spec/features/merge_requests/edit_mr_spec.rb create mode 100644 spec/features/merge_requests/toggle_whitespace_changes.rb create mode 100644 spec/features/merge_requests/user_lists_merge_requests_spec.rb create mode 100644 spec/features/milestone_spec.rb create mode 100644 spec/features/participants_autocomplete_spec.rb create mode 100644 spec/features/pipelines_spec.rb create mode 100644 spec/features/profiles/oauth_applications_spec.rb create mode 100644 spec/features/project/shortcuts_spec.rb create mode 100644 spec/features/projects/badges/list_spec.rb create mode 100644 spec/features/projects/commit/builds_spec.rb create mode 100644 spec/features/projects/commits/cherry_pick_spec.rb create mode 100644 spec/features/projects/developer_views_empty_project_instructions_spec.rb create mode 100644 spec/features/projects/files/gitignore_dropdown_spec.rb create mode 100644 spec/features/projects/files/project_owner_creates_license_file_spec.rb create mode 100644 spec/features/projects/files/project_owner_sees_link_to_create_license_file_in_empty_project_spec.rb create mode 100644 spec/features/projects/members/anonymous_user_sees_members_spec.rb create mode 100644 spec/features/projects/wiki/user_creates_wiki_page_spec.rb create mode 100644 spec/features/projects/wiki/user_updates_wiki_page_spec.rb create mode 100644 spec/features/security/group/internal_access_spec.rb create mode 100644 spec/features/security/group/private_access_spec.rb create mode 100644 spec/features/security/group/public_access_spec.rb delete mode 100644 spec/features/security/group_access_spec.rb create mode 100644 spec/features/security/project/snippet/internal_access_spec.rb create mode 100644 spec/features/security/project/snippet/private_access_spec.rb create mode 100644 spec/features/security/project/snippet/public_access_spec.rb create mode 100644 spec/features/signup_spec.rb create mode 100644 spec/features/tags/master_creates_tag_spec.rb create mode 100644 spec/features/tags/master_deletes_tag_spec.rb create mode 100644 spec/features/tags/master_updates_tag_spec.rb create mode 100644 spec/features/tags/master_views_tags_spec.rb create mode 100644 spec/features/todos/todos_spec.rb create mode 100644 spec/finders/group_projects_finder_spec.rb create mode 100644 spec/finders/groups_finder_spec.rb create mode 100644 spec/finders/joined_groups_finder_spec.rb create mode 100644 spec/fixtures/container_registry/config_blob.json create mode 100644 spec/fixtures/container_registry/tag_manifest.json create mode 100644 spec/fixtures/emails/reply_without_subaddressing_and_key_inside_references.eml create mode 100644 spec/fixtures/mail_room_disabled.yml create mode 100644 spec/fixtures/mail_room_enabled.yml create mode 100644 spec/fixtures/sanitized.svg create mode 100644 spec/fixtures/unsanitized.svg create mode 100644 spec/helpers/commits_helper_spec.rb create mode 100644 spec/helpers/form_helper_spec.rb rename spec/helpers/{groups_helper.rb => groups_helper_spec.rb} (100%) create mode 100644 spec/helpers/import_helper_spec.rb create mode 100644 spec/initializers/trusted_proxies_spec.rb create mode 100644 spec/javascripts/merge_request_widget_spec.js.coffee create mode 100644 spec/lib/award_emoji_spec.rb create mode 100644 spec/lib/banzai/filter/image_link_filter_spec.rb create mode 100644 spec/lib/banzai/filter/inline_diff_filter_spec.rb create mode 100644 spec/lib/banzai/filter/wiki_link_filter_spec.rb create mode 100644 spec/lib/banzai/filter/yaml_front_matter_filter_spec.rb create mode 100644 spec/lib/banzai/filter_array_spec.rb create mode 100644 spec/lib/banzai/pipeline/wiki_pipeline_spec.rb delete mode 100644 spec/lib/ci/status_spec.rb create mode 100644 spec/lib/container_registry/blob_spec.rb create mode 100644 spec/lib/container_registry/registry_spec.rb create mode 100644 spec/lib/container_registry/repository_spec.rb create mode 100644 spec/lib/container_registry/tag_spec.rb create mode 100644 spec/lib/gitlab/badge/build_spec.rb create mode 100644 spec/lib/gitlab/bitbucket_import/importer_spec.rb create mode 100644 spec/lib/gitlab/database/migration_helpers_spec.rb create mode 100644 spec/lib/gitlab/fogbugz_import/client_spec.rb create mode 100644 spec/lib/gitlab/gfm/reference_rewriter_spec.rb create mode 100644 spec/lib/gitlab/gfm/uploads_rewriter_spec.rb create mode 100644 spec/lib/gitlab/github_import/branch_formatter_spec.rb create mode 100644 spec/lib/gitlab/github_import/label_formatter_spec.rb create mode 100644 spec/lib/gitlab/github_import/milestone_formatter_spec.rb create mode 100644 spec/lib/gitlab/gitignore_spec.rb create mode 100644 spec/lib/gitlab/metrics/subscribers/rails_cache_spec.rb create mode 100644 spec/lib/gitlab/middleware/go_spec.rb create mode 100644 spec/lib/gitlab/search_results_spec.rb create mode 100644 spec/lib/gitlab/snippet_search_results_spec.rb create mode 100644 spec/lib/gitlab/url_sanitizer_spec.rb create mode 100644 spec/lib/gitlab/workhorse_spec.rb create mode 100644 spec/lib/gitlab_spec.rb create mode 100644 spec/lib/json_web_token/rsa_token_spec.rb create mode 100644 spec/lib/json_web_token/token_spec.rb create mode 100644 spec/mailers/repository_check_mailer_spec.rb create mode 100644 spec/models/blob_spec.rb create mode 100644 spec/models/concerns/milestoneish_spec.rb create mode 100644 spec/models/concerns/statuseable_spec.rb create mode 100644 spec/models/concerns/subscribable_spec.rb create mode 100644 spec/models/legacy_diff_note_spec.rb create mode 100644 spec/models/notification_setting_spec.rb create mode 100644 spec/models/project_group_link_spec.rb create mode 100644 spec/models/project_services/campfire_service_spec.rb create mode 100644 spec/models/project_services/custom_issue_tracker_service_spec.rb create mode 100644 spec/models/project_services/emails_on_push_service_spec.rb rename spec/models/{ => project_services}/external_wiki_service_spec.rb (78%) create mode 100644 spec/models/project_services/pivotaltracker_service_spec.rb create mode 100644 spec/models/project_services/redmine_service_spec.rb create mode 100644 spec/models/project_services/slack_service/wiki_page_message_spec.rb delete mode 100644 spec/requests/api/commit_status_spec.rb create mode 100644 spec/requests/api/commit_statuses_spec.rb create mode 100644 spec/requests/api/gitignores_spec.rb create mode 100644 spec/requests/api/licenses_spec.rb create mode 100644 spec/requests/api/project_snippets_spec.rb create mode 100644 spec/requests/jwt_controller_spec.rb delete mode 100644 spec/services/archive_repository_service_spec.rb create mode 100644 spec/services/auth/container_registry_authentication_service_spec.rb create mode 100644 spec/services/create_tag_service_spec.rb create mode 100644 spec/services/delete_tag_service_spec.rb create mode 100644 spec/services/delete_user_service_spec.rb create mode 100644 spec/services/groups/create_service_spec.rb create mode 100644 spec/services/groups/update_service_spec.rb create mode 100644 spec/services/issues/move_service_spec.rb create mode 100644 spec/services/merge_requests/add_todo_when_build_fails_service_spec.rb create mode 100644 spec/services/merge_requests/build_service_spec.rb create mode 100644 spec/services/notes/delete_service_spec.rb create mode 100644 spec/services/projects/autocomplete_service_spec.rb create mode 100644 spec/services/projects/housekeeping_service_spec.rb create mode 100644 spec/services/projects/unlink_fork_service_spec.rb create mode 100644 spec/support/carrierwave.rb create mode 100644 spec/support/email_helpers.rb create mode 100644 spec/support/issue_tracker_service_shared_example.rb delete mode 100644 spec/support/matchers/benchmark_matchers.rb create mode 100644 spec/support/workhorse_helpers.rb create mode 100644 spec/workers/delete_user_worker_spec.rb create mode 100644 spec/workers/project_cache_worker_spec.rb create mode 100644 spec/workers/repository_check/batch_worker_spec.rb create mode 100644 spec/workers/repository_check/clear_worker_spec.rb create mode 100644 spec/workers/repository_check/single_repository_worker_spec.rb create mode 100644 vendor/assets/javascripts/cropper.js create mode 100644 vendor/assets/javascripts/date.format.js create mode 100755 vendor/assets/javascripts/jquery.scrollTo.js create mode 100644 vendor/assets/stylesheets/cropper.css create mode 100644 vendor/gitignore/Actionscript.gitignore create mode 100644 vendor/gitignore/Ada.gitignore create mode 100644 vendor/gitignore/Agda.gitignore create mode 100644 vendor/gitignore/Android.gitignore create mode 100644 vendor/gitignore/AppEngine.gitignore create mode 100644 vendor/gitignore/AppceleratorTitanium.gitignore create mode 100644 vendor/gitignore/ArchLinuxPackages.gitignore create mode 100644 vendor/gitignore/Autotools.gitignore create mode 100644 vendor/gitignore/C++.gitignore create mode 100644 vendor/gitignore/C.gitignore create mode 100644 vendor/gitignore/CFWheels.gitignore create mode 100644 vendor/gitignore/CMake.gitignore create mode 100644 vendor/gitignore/CUDA.gitignore create mode 100644 vendor/gitignore/CakePHP.gitignore create mode 100644 vendor/gitignore/ChefCookbook.gitignore create mode 120000 vendor/gitignore/Clojure.gitignore create mode 100644 vendor/gitignore/CodeIgniter.gitignore create mode 100644 vendor/gitignore/CommonLisp.gitignore create mode 100644 vendor/gitignore/Composer.gitignore create mode 100644 vendor/gitignore/Concrete5.gitignore create mode 100644 vendor/gitignore/Coq.gitignore create mode 100644 vendor/gitignore/CraftCMS.gitignore create mode 100644 vendor/gitignore/D.gitignore create mode 100644 vendor/gitignore/DM.gitignore create mode 100644 vendor/gitignore/Dart.gitignore create mode 100644 vendor/gitignore/Delphi.gitignore create mode 100644 vendor/gitignore/Drupal.gitignore create mode 100644 vendor/gitignore/EPiServer.gitignore create mode 100644 vendor/gitignore/Eagle.gitignore create mode 100644 vendor/gitignore/Elisp.gitignore create mode 100644 vendor/gitignore/Elixir.gitignore create mode 100644 vendor/gitignore/Elm.gitignore create mode 100644 vendor/gitignore/Erlang.gitignore create mode 100644 vendor/gitignore/ExpressionEngine.gitignore create mode 100644 vendor/gitignore/ExtJs.gitignore create mode 100644 vendor/gitignore/Fancy.gitignore create mode 100644 vendor/gitignore/Finale.gitignore create mode 100644 vendor/gitignore/ForceDotCom.gitignore create mode 120000 vendor/gitignore/Fortran.gitignore create mode 100644 vendor/gitignore/FuelPHP.gitignore create mode 100644 vendor/gitignore/GWT.gitignore create mode 100644 vendor/gitignore/Gcov.gitignore create mode 100644 vendor/gitignore/GitBook.gitignore create mode 100644 vendor/gitignore/Global/Anjuta.gitignore create mode 100644 vendor/gitignore/Global/Archives.gitignore create mode 100644 vendor/gitignore/Global/BricxCC.gitignore create mode 100644 vendor/gitignore/Global/CVS.gitignore create mode 100644 vendor/gitignore/Global/Calabash.gitignore create mode 100644 vendor/gitignore/Global/Cloud9.gitignore create mode 100644 vendor/gitignore/Global/CodeKit.gitignore create mode 100644 vendor/gitignore/Global/DartEditor.gitignore create mode 100644 vendor/gitignore/Global/Dreamweaver.gitignore create mode 100644 vendor/gitignore/Global/Dropbox.gitignore create mode 100644 vendor/gitignore/Global/Eclipse.gitignore create mode 100644 vendor/gitignore/Global/EiffelStudio.gitignore create mode 100644 vendor/gitignore/Global/Emacs.gitignore create mode 100644 vendor/gitignore/Global/Ensime.gitignore create mode 100644 vendor/gitignore/Global/Espresso.gitignore create mode 100644 vendor/gitignore/Global/FlexBuilder.gitignore create mode 100644 vendor/gitignore/Global/GPG.gitignore create mode 100644 vendor/gitignore/Global/IPythonNotebook.gitignore create mode 100644 vendor/gitignore/Global/JDeveloper.gitignore create mode 100644 vendor/gitignore/Global/JetBrains.gitignore create mode 100644 vendor/gitignore/Global/KDevelop4.gitignore create mode 100644 vendor/gitignore/Global/Kate.gitignore create mode 100644 vendor/gitignore/Global/Lazarus.gitignore create mode 100644 vendor/gitignore/Global/LibreOffice.gitignore create mode 100644 vendor/gitignore/Global/Linux.gitignore create mode 100644 vendor/gitignore/Global/LyX.gitignore create mode 100644 vendor/gitignore/Global/Matlab.gitignore create mode 100644 vendor/gitignore/Global/Mercurial.gitignore create mode 100644 vendor/gitignore/Global/MicrosoftOffice.gitignore create mode 100644 vendor/gitignore/Global/ModelSim.gitignore create mode 100644 vendor/gitignore/Global/Momentics.gitignore create mode 100644 vendor/gitignore/Global/MonoDevelop.gitignore create mode 100644 vendor/gitignore/Global/NetBeans.gitignore create mode 100644 vendor/gitignore/Global/Ninja.gitignore create mode 100644 vendor/gitignore/Global/NotepadPP.gitignore create mode 100644 vendor/gitignore/Global/OSX.gitignore create mode 100644 vendor/gitignore/Global/Otto.gitignore create mode 100644 vendor/gitignore/Global/Redcar.gitignore create mode 100644 vendor/gitignore/Global/Redis.gitignore create mode 100644 vendor/gitignore/Global/SBT.gitignore create mode 100644 vendor/gitignore/Global/SVN.gitignore create mode 100644 vendor/gitignore/Global/SlickEdit.gitignore create mode 100644 vendor/gitignore/Global/SublimeText.gitignore create mode 100644 vendor/gitignore/Global/SynopsysVCS.gitignore create mode 100644 vendor/gitignore/Global/Tags.gitignore create mode 100644 vendor/gitignore/Global/TextMate.gitignore create mode 100644 vendor/gitignore/Global/TortoiseGit.gitignore create mode 100644 vendor/gitignore/Global/Vagrant.gitignore create mode 100644 vendor/gitignore/Global/Vim.gitignore create mode 100644 vendor/gitignore/Global/VirtualEnv.gitignore create mode 100644 vendor/gitignore/Global/VisualStudioCode.gitignore create mode 100644 vendor/gitignore/Global/WebMethods.gitignore create mode 100644 vendor/gitignore/Global/Windows.gitignore create mode 100644 vendor/gitignore/Global/Xcode.gitignore create mode 100644 vendor/gitignore/Global/XilinxISE.gitignore create mode 100644 vendor/gitignore/Go.gitignore create mode 100644 vendor/gitignore/Gradle.gitignore create mode 100644 vendor/gitignore/Grails.gitignore create mode 100644 vendor/gitignore/Haskell.gitignore create mode 100644 vendor/gitignore/IGORPro.gitignore create mode 100644 vendor/gitignore/Idris.gitignore create mode 100644 vendor/gitignore/Java.gitignore create mode 100644 vendor/gitignore/Jboss.gitignore create mode 100644 vendor/gitignore/Jekyll.gitignore create mode 100644 vendor/gitignore/Joomla.gitignore create mode 100644 vendor/gitignore/KiCad.gitignore create mode 100644 vendor/gitignore/Kohana.gitignore create mode 100644 vendor/gitignore/LabVIEW.gitignore create mode 100644 vendor/gitignore/Laravel.gitignore create mode 100644 vendor/gitignore/Leiningen.gitignore create mode 100644 vendor/gitignore/LemonStand.gitignore create mode 100644 vendor/gitignore/Lilypond.gitignore create mode 100644 vendor/gitignore/Lithium.gitignore create mode 100644 vendor/gitignore/Lua.gitignore create mode 100644 vendor/gitignore/Magento.gitignore create mode 100644 vendor/gitignore/Maven.gitignore create mode 100644 vendor/gitignore/Mercury.gitignore create mode 100644 vendor/gitignore/MetaProgrammingSystem.gitignore create mode 100644 vendor/gitignore/Nanoc.gitignore create mode 100644 vendor/gitignore/Nim.gitignore create mode 100644 vendor/gitignore/Node.gitignore create mode 100644 vendor/gitignore/OCaml.gitignore create mode 100644 vendor/gitignore/Objective-C.gitignore create mode 100644 vendor/gitignore/Opa.gitignore create mode 100644 vendor/gitignore/OpenCart.gitignore create mode 100644 vendor/gitignore/OracleForms.gitignore create mode 100644 vendor/gitignore/Packer.gitignore create mode 100644 vendor/gitignore/Perl.gitignore create mode 100644 vendor/gitignore/Phalcon.gitignore create mode 100644 vendor/gitignore/PlayFramework.gitignore create mode 100644 vendor/gitignore/Plone.gitignore create mode 100644 vendor/gitignore/Prestashop.gitignore create mode 100644 vendor/gitignore/Processing.gitignore create mode 100644 vendor/gitignore/Python.gitignore create mode 100644 vendor/gitignore/Qooxdoo.gitignore create mode 100644 vendor/gitignore/Qt.gitignore create mode 100644 vendor/gitignore/R.gitignore create mode 100644 vendor/gitignore/ROS.gitignore create mode 100644 vendor/gitignore/Rails.gitignore create mode 100644 vendor/gitignore/RhodesRhomobile.gitignore create mode 100644 vendor/gitignore/Ruby.gitignore create mode 100644 vendor/gitignore/Rust.gitignore create mode 100644 vendor/gitignore/SCons.gitignore create mode 100644 vendor/gitignore/Sass.gitignore create mode 100644 vendor/gitignore/Scala.gitignore create mode 100644 vendor/gitignore/Scheme.gitignore create mode 100644 vendor/gitignore/Scrivener.gitignore create mode 100644 vendor/gitignore/Sdcc.gitignore create mode 100644 vendor/gitignore/SeamGen.gitignore create mode 100644 vendor/gitignore/SketchUp.gitignore create mode 100644 vendor/gitignore/Smalltalk.gitignore create mode 100644 vendor/gitignore/Stella.gitignore create mode 100644 vendor/gitignore/SugarCRM.gitignore create mode 100644 vendor/gitignore/Swift.gitignore create mode 100644 vendor/gitignore/Symfony.gitignore create mode 100644 vendor/gitignore/SymphonyCMS.gitignore create mode 100644 vendor/gitignore/TeX.gitignore create mode 100644 vendor/gitignore/Terraform.gitignore create mode 100644 vendor/gitignore/Textpattern.gitignore create mode 100644 vendor/gitignore/TurboGears2.gitignore create mode 100644 vendor/gitignore/Typo3.gitignore create mode 100644 vendor/gitignore/Umbraco.gitignore create mode 100644 vendor/gitignore/Unity.gitignore create mode 100644 vendor/gitignore/UnrealEngine.gitignore create mode 100644 vendor/gitignore/VVVV.gitignore create mode 100644 vendor/gitignore/VisualStudio.gitignore create mode 100644 vendor/gitignore/Waf.gitignore create mode 100644 vendor/gitignore/WordPress.gitignore create mode 100644 vendor/gitignore/Xojo.gitignore create mode 100644 vendor/gitignore/Yeoman.gitignore create mode 100644 vendor/gitignore/Yii.gitignore create mode 100644 vendor/gitignore/ZendFramework.gitignore create mode 100644 vendor/gitignore/Zephir.gitignore diff --git a/.csscomb.json b/.csscomb.json new file mode 100644 index 0000000000..741cc1488b --- /dev/null +++ b/.csscomb.json @@ -0,0 +1,20 @@ +{ + "exclude": [ + "app/assets/stylesheets/framework/tw_bootstrap_variables.scss", + "app/assets/stylesheets/framework/fonts.scss" + ], + "always-semicolon": true, + "color-case": "lower", + "block-indent": " ", + "color-shorthand": true, + "element-case": "lower", + "space-before-colon": "", + "space-after-colon": " ", + "space-before-combinator": " ", + "space-after-combinator": " ", + "space-between-declarations": "\n", + "space-before-opening-brace": " ", + "space-after-opening-brace": "\n", + "space-before-closing-brace": "\n", + "unitless-zero": true +} diff --git a/.gitignore b/.gitignore index 1eb785451f..8f861d76a3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ .sass-cache/ .secret .vagrant +.byebug_history Vagrantfile backups/* config/aws.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8a729f957a..85730e1b68 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,6 @@ image: "ruby:2.1" services: - mysql:latest - - postgres:latest - redis:latest cache: @@ -12,140 +11,122 @@ cache: variables: MYSQL_ALLOW_EMPTY_PASSWORD: "1" + # retry tests only in CI environment + RSPEC_RETRY_RETRY_COUNT: "3" before_script: - source ./scripts/prepare_build.sh - ruby -v - which ruby - - gem install bundler --no-ri --no-rdoc + - retry gem install bundler --no-ri --no-rdoc - cp config/gitlab.yml.example config/gitlab.yml - touch log/application.log - touch log/test.log - - bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}" + - retry bundle install --without postgres production --jobs $(nproc) "${FLAGS[@]}" - RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load db:migrate +stages: +- test +- notifications + spec:feature: + stage: test script: - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature - tags: - - ruby - - mysql spec:api: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:api - tags: - - ruby - - mysql spec:models: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:models - tags: - - ruby - - mysql spec:lib: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:lib - tags: - - ruby - - mysql spec:services: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:services - tags: - - ruby - - mysql - -spec:benchmark: - script: - - RAILS_ENV=test bundle exec rake spec:benchmark - tags: - - ruby - - mysql - allow_failure: true spec:other: + stage: test script: - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:other - tags: - - ruby - - mysql spinach:project:half: + stage: test script: + - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half - tags: - - ruby - - mysql spinach:project:rest: + stage: test script: + - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest - tags: - - ruby - - mysql spinach:other: + stage: test script: + - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other - tags: - - ruby - - mysql teaspoon: + stage: test script: - RAILS_ENV=test bundle exec teaspoon - tags: - - ruby - - mysql rubocop: + stage: test script: - bundle exec rubocop - tags: - - ruby - - mysql + +scss-lint: + stage: test + script: + - bundle exec rake scss_lint brakeman: + stage: test script: - bundle exec rake brakeman - tags: - - ruby - - mysql flog: + stage: test script: - bundle exec rake flog - tags: - - ruby - - mysql flay: + stage: test script: - bundle exec rake flay - tags: - - ruby - - mysql bundler:audit: + stage: test + only: + - master script: - - "bundle exec bundle-audit update" - - "bundle exec bundle-audit check" - tags: - - ruby - - mysql - allow_failure: true + - "bundle exec bundle-audit check --update --ignore OSVDB-115941" + +db-migrate-reset: + stage: test + script: + - RAILS_ENV=test bundle exec rake db:migrate:reset # Ruby 2.2 jobs spec:feature:ruby22: + stage: test image: ruby:2.2 only: - - master + - master script: - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spec:feature @@ -153,11 +134,9 @@ spec:feature:ruby22: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spec:api:ruby22: + stage: test image: ruby:2.2 only: - master @@ -167,11 +146,9 @@ spec:api:ruby22: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spec:models:ruby22: + stage: test image: ruby:2.2 only: - master @@ -181,11 +158,9 @@ spec:models:ruby22: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spec:lib:ruby22: + stage: test image: ruby:2.2 only: - master @@ -195,11 +170,9 @@ spec:lib:ruby22: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spec:services:ruby22: + stage: test image: ruby:2.2 only: - master @@ -209,26 +182,9 @@ spec:services:ruby22: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql - -spec:benchmark:ruby22: - image: ruby:2.2 - only: - - master - script: - - RAILS_ENV=test bundle exec rake spec:benchmark - cache: - key: "ruby22" - paths: - - vendor - tags: - - ruby - - mysql - allow_failure: true spec:other:ruby22: + stage: test image: ruby:2.2 only: - master @@ -238,49 +194,53 @@ spec:other:ruby22: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spinach:project:half:ruby22: + stage: test image: ruby:2.2 only: - master script: + - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:half cache: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spinach:project:rest:ruby22: + stage: test image: ruby:2.2 only: - master script: + - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:project:rest cache: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql spinach:other:ruby22: + stage: test image: ruby:2.2 only: - master script: + - RAILS_ENV=test bundle exec rake assets:precompile 2>/dev/null - RAILS_ENV=test SIMPLECOV=true bundle exec rake spinach:other cache: key: "ruby22" paths: - vendor - tags: - - ruby - - mysql +notify:slack: + stage: notifications + script: + - ./scripts/notify_slack.sh "#builds" "Build on \`$CI_BUILD_REF_NAME\` failed! Commit \`$(git log -1 --oneline)\` See " + when: on_failure + only: + - master@gitlab-org/gitlab-ce + - tags@gitlab-org/gitlab-ce + - master@gitlab-org/gitlab-ee + - tags@gitlab-org/gitlab-ee diff --git a/.rubocop.yml b/.rubocop.yml index 89aa0591c3..0946ef5d84 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,1032 +1,14 @@ -Style/AccessModifierIndentation: - Description: Check indentation of private/protected visibility modifiers. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-public-private-protected' - Enabled: true - -Style/AccessorMethodName: - Description: Check the naming of accessor methods for get_/set_. - Enabled: false - -Style/Alias: - Description: 'Use alias_method instead of alias.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#alias-method' - Enabled: true - -Style/AlignArray: - Description: >- - Align the elements of an array literal if they span more than - one line. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#align-multiline-arrays' - Enabled: true - -Style/AlignHash: - Description: >- - Align the elements of a hash literal if they span more than - one line. - Enabled: true - -Style/AlignParameters: - Description: >- - Align the parameters of a method call if they span more - than one line. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-double-indent' - Enabled: false - -Style/AndOr: - Description: 'Use &&/|| instead of and/or.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-and-or-or' - Enabled: false - -Style/ArrayJoin: - Description: 'Use Array#join instead of Array#*.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#array-join' - Enabled: false - -Style/AsciiComments: - Description: 'Use only ascii symbols in comments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-comments' - Enabled: true - -Style/AsciiIdentifiers: - Description: 'Use only ascii symbols in identifiers.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#english-identifiers' - Enabled: true - -Style/Attr: - Description: 'Checks for uses of Module#attr.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr' - Enabled: false - -Style/BeginBlock: - Description: 'Avoid the use of BEGIN blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-BEGIN-blocks' - Enabled: true - -Style/BarePercentLiterals: - Description: 'Checks if usage of %() or %Q() matches configuration.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q-shorthand' - Enabled: false - -Style/BlockComments: - Description: 'Do not use block comments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-block-comments' - Enabled: false - -Style/BlockEndNewline: - Description: 'Put end statement of multiline block on its own line.' - Enabled: true - -Style/BlockDelimiters: - Description: >- - Avoid using {...} for multi-line blocks (multiline chaining is - always ugly). - Prefer {...} over do...end for single-line blocks. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' - Enabled: true - -Style/BracesAroundHashParameters: - Description: 'Enforce braces style around hash parameters.' - Enabled: false - -Style/CaseEquality: - Description: 'Avoid explicit use of the case equality operator(===).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-case-equality' - Enabled: false - -Style/CaseIndentation: - Description: 'Indentation of when in a case/when/[else/]end.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#indent-when-to-case' - Enabled: true - -Style/CharacterLiteral: - Description: 'Checks for uses of character literals.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-character-literals' - Enabled: true - -Style/ClassAndModuleCamelCase: - Description: 'Use CamelCase for classes and modules.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#camelcase-classes' - Enabled: true - -Style/ClassAndModuleChildren: - Description: 'Checks style of children classes and modules.' - Enabled: false - -Style/ClassCheck: - Description: 'Enforces consistent use of `Object#is_a?` or `Object#kind_of?`.' - Enabled: false - -Style/ClassMethods: - Description: 'Use self when defining module/class methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#def-self-singletons' - Enabled: false - -Style/ClassVars: - Description: 'Avoid the use of class variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-class-vars' - Enabled: true - -Style/ColonMethodCall: - Description: 'Do not use :: for method call.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#double-colons' - Enabled: false - -Style/CommentAnnotation: - Description: >- - Checks formatting of special comments - (TODO, FIXME, OPTIMIZE, HACK, REVIEW). - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#annotate-keywords' - Enabled: false - -Style/CommentIndentation: - Description: 'Indentation of comments.' - Enabled: true - -Style/ConstantName: - Description: 'Constants should use SCREAMING_SNAKE_CASE.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#screaming-snake-case' - Enabled: true - -Style/DefWithParentheses: - Description: 'Use def with parentheses when there are arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#method-parens' - Enabled: false - -Style/DeprecatedHashMethods: - Description: 'Checks for use of deprecated Hash methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-key' - Enabled: false - -Style/Documentation: - Description: 'Document classes and non-namespace modules.' - Enabled: false - -Style/DotPosition: - Description: 'Checks the position of the dot in multi-line method calls.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains' - Enabled: false - -Style/DoubleNegation: - Description: 'Checks for uses of double negation (!!).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-bang-bang' - Enabled: false - -Style/EachWithObject: - Description: 'Prefer `each_with_object` over `inject` or `reduce`.' - Enabled: false - -Style/ElseAlignment: - Description: 'Align elses and elsifs correctly.' - Enabled: true - -Style/EmptyElse: - Description: 'Avoid empty else-clauses.' - Enabled: false - -Style/EmptyLineBetweenDefs: - Description: 'Use empty lines between defs.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#empty-lines-between-methods' - Enabled: false - -Style/EmptyLines: - Description: "Don't use several empty lines in a row." - Enabled: false - -Style/EmptyLinesAroundAccessModifier: - Description: "Keep blank lines around access modifiers." - Enabled: false - -Style/EmptyLinesAroundBlockBody: - Description: "Keeps track of empty lines around block bodies." - Enabled: false - -Style/EmptyLinesAroundClassBody: - Description: "Keeps track of empty lines around class bodies." - Enabled: false - -Style/EmptyLinesAroundModuleBody: - Description: "Keeps track of empty lines around module bodies." - Enabled: false - -Style/EmptyLinesAroundMethodBody: - Description: "Keeps track of empty lines around method bodies." - Enabled: false - -Style/EmptyLiteral: - Description: 'Prefer literals to Array.new/Hash.new/String.new.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#literal-array-hash' - Enabled: false - -Style/EndBlock: - Description: 'Avoid the use of END blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-END-blocks' - Enabled: false - -Style/EndOfLine: - Description: 'Use Unix-style line endings.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#crlf' - Enabled: false - -Style/EvenOdd: - Description: 'Favor the use of Fixnum#even? && Fixnum#odd?' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods' - Enabled: false - -Style/ExtraSpacing: - Description: 'Do not use unnecessary spacing.' - Enabled: false - -Style/FileName: - Description: 'Use snake_case for source file names.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-files' - Enabled: false - -Style/FlipFlop: - Description: 'Checks for flip flops' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-flip-flops' - Enabled: false - -Style/For: - Description: 'Checks use of for or each in multiline loops.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-for-loops' - Enabled: false - -Style/FormatString: - Description: 'Enforce the use of Kernel#sprintf, Kernel#format or String#%.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#sprintf' - Enabled: false - -Style/GlobalVars: - Description: 'Do not introduce global variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#instance-vars' - Enabled: false - -Style/GuardClause: - Description: 'Check for conditionals that can be replaced with guard clauses' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals' - Enabled: false - -Style/HashSyntax: - Description: >- - Prefer Ruby 1.9 hash syntax { a: 1, b: 2 } over 1.8 syntax - { :a => 1, :b => 2 }. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-literals' - Enabled: true - -Style/IfUnlessModifier: - Description: >- - Favor modifier if/unless usage when you have a - single-line body. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier' - Enabled: false - -Style/IfWithSemicolon: - Description: 'Do not use if x; .... Use the ternary operator instead.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon-ifs' - Enabled: false - -Style/IndentationConsistency: - Description: 'Keep indentation straight.' - Enabled: true - -Style/IndentationWidth: - Description: 'Use 2 spaces for indentation.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' - Enabled: true - -Style/IndentArray: - Description: >- - Checks the indentation of the first element in an array - literal. - Enabled: false - -Style/IndentHash: - Description: 'Checks the indentation of the first key in a hash literal.' - Enabled: false - -Style/InfiniteLoop: - Description: 'Use Kernel#loop for infinite loops.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#infinite-loop' - Enabled: false - -Style/Lambda: - Description: 'Use the new lambda literal syntax for single-line blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#lambda-multi-line' - Enabled: false - -Style/LambdaCall: - Description: 'Use lambda.call(...) instead of lambda.(...).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc-call' - Enabled: false - -Style/LeadingCommentSpace: - Description: 'Comments should start with a space.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#hash-space' - Enabled: false - -Style/LineEndConcatenation: - Description: >- - Use \ instead of + or << to concatenate two string literals at - line end. - Enabled: false - -Style/MethodCallParentheses: - Description: 'Do not use parentheses for method calls with no arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-args-no-parens' - Enabled: false - -Style/MethodDefParentheses: - Description: >- - Checks if the method definitions have or don't have - parentheses. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#method-parens' - Enabled: false - -Style/MethodName: - Description: 'Use the configured style when naming methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-symbols-methods-vars' - Enabled: false - -Style/ModuleFunction: - Description: 'Checks for usage of `extend self` in modules.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#module-function' - Enabled: false - -Style/MultilineBlockChain: - Description: 'Avoid multi-line chains of blocks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#single-line-blocks' - Enabled: false - -Style/MultilineBlockLayout: - Description: 'Ensures newlines after multiline block do statements.' - Enabled: true - -Style/MultilineIfThen: - Description: 'Do not use then for multi-line if/unless.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-then' - Enabled: false - -Style/MultilineOperationIndentation: - Description: >- - Checks indentation of binary operations that span more than - one line. - Enabled: false - -Style/MultilineTernaryOperator: - Description: >- - Avoid multi-line ?: (the ternary operator); - use if/unless instead. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-multiline-ternary' - Enabled: false - -Style/NegatedIf: - Description: >- - Favor unless over if for negative conditions - (or control flow or). - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#unless-for-negatives' - Enabled: false - -Style/NegatedWhile: - Description: 'Favor until over while for negative conditions.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#until-for-negatives' - Enabled: false - -Style/NestedTernaryOperator: - Description: 'Use one expression per branch in a ternary operator.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-ternary' - Enabled: true - -Style/Next: - Description: 'Use `next` to skip iteration instead of a condition at the end.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals' - Enabled: false - -Style/NilComparison: - Description: 'Prefer x.nil? to x == nil.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#predicate-methods' - Enabled: true - -Style/NonNilCheck: - Description: 'Checks for redundant nil checks.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-non-nil-checks' - Enabled: true - -Style/Not: - Description: 'Use ! instead of not.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bang-not-not' - Enabled: true - -Style/NumericLiterals: - Description: >- - Add underscores to large numeric literals to improve their - readability. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscores-in-numerics' - Enabled: false - -Style/OneLineConditional: - Description: >- - Favor the ternary operator(?:) over - if/then/else/end constructs. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#ternary-operator' - Enabled: true - -Style/OpMethod: - Description: 'When defining binary operators, name the argument other.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#other-arg' - 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: - Description: >- - Don't use parentheses around the condition of an - if/unless/while. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-parens-if' - Enabled: true - -Style/PercentLiteralDelimiters: - Description: 'Use `%`-literal delimiters consistently' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-literal-braces' - Enabled: false - -Style/PercentQLiterals: - Description: 'Checks if uses of %Q/%q match the configured preference.' - Enabled: false - -Style/PerlBackrefs: - Description: 'Avoid Perl-style regex back references.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers' - Enabled: false - -Style/PredicateName: - Description: 'Check the names of predicate methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark' - Enabled: false - -Style/Proc: - Description: 'Use proc instead of Proc.new.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#proc' - Enabled: false - -Style/RaiseArgs: - Description: 'Checks the arguments passed to raise/fail.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#exception-class-messages' - Enabled: false - -Style/RedundantBegin: - Description: "Don't use begin blocks when they are not needed." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#begin-implicit' - Enabled: false - -Style/RedundantException: - Description: "Checks for an obsolete RuntimeException argument in raise/fail." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-runtimeerror' - Enabled: false - -Style/RedundantReturn: - Description: "Don't use return where it's not required." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-explicit-return' - Enabled: true - -Style/RedundantSelf: - Description: "Don't use self where it's not needed." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-self-unless-required' - Enabled: false - -Style/RegexpLiteral: - Description: >- - Use %r for regular expressions matching more than - `MaxSlashes` '/' characters. - Use %r only for regular expressions matching more than - `MaxSlashes` '/' character. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-r' - Enabled: false - -Style/RescueModifier: - Description: 'Avoid using rescue in its modifier form.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-rescue-modifiers' - Enabled: false - -Style/SelfAssignment: - Description: >- - Checks for places where self-assignment shorthand should have - been used. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#self-assignment' - Enabled: false - -Style/Semicolon: - Description: "Don't use semicolons to terminate expressions." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-semicolon' - Enabled: false - -Style/SignalException: - Description: 'Checks for proper usage of fail and raise.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#fail-method' - Enabled: false - -Style/SingleLineBlockParams: - Description: 'Enforces the names of some block params.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#reduce-blocks' - Enabled: false - -Style/SingleLineMethods: - Description: 'Avoid single-line methods.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-single-line-methods' - Enabled: false - -Style/SingleSpaceBeforeFirstArg: - Description: >- - Checks that exactly one space is used between a method name - and the first argument for method calls without parentheses. - Enabled: false - -Style/SpaceAfterColon: - Description: 'Use spaces after colons.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceAfterComma: - Description: 'Use spaces after commas.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceAfterControlKeyword: - Description: 'Use spaces after if/elsif/unless/while/until/case/when.' - Enabled: false - -Style/SpaceAfterMethodName: - Description: >- - Do not put a space between a method name and the opening - parenthesis in a method definition. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces' - Enabled: false - -Style/SpaceAfterNot: - Description: Tracks redundant space after the ! operator. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-space-bang' - Enabled: false - -Style/SpaceAfterSemicolon: - Description: 'Use spaces after semicolons.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceBeforeBlockBraces: - Description: >- - Checks that the left block brace has or doesn't have space - before it. - Enabled: false - -Style/SpaceBeforeComma: - Description: 'No spaces before commas.' - Enabled: false - -Style/SpaceBeforeComment: - Description: >- - Checks for missing space between code and a comment on the - same line. - Enabled: false - -Style/SpaceBeforeSemicolon: - Description: 'No spaces before semicolons.' - Enabled: false - -Style/SpaceInsideBlockBraces: - Description: >- - Checks that block braces have or don't have surrounding space. - For blocks taking parameters, checks that the left brace has - or doesn't have trailing space. - Enabled: false - -Style/SpaceAroundEqualsInParameterDefault: - Description: >- - Checks that the equals signs in parameter default assignments - have or don't have surrounding space depending on - configuration. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-around-equals' - Enabled: false - -Style/SpaceAroundOperators: - Description: 'Use spaces around operators.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: false - -Style/SpaceBeforeModifierKeyword: - Description: 'Put a space before the modifier keyword.' - Enabled: false - -Style/SpaceInsideBrackets: - Description: 'No spaces after [ or before ].' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-spaces-braces' - Enabled: false - -Style/SpaceInsideHashLiteralBraces: - Description: "Use spaces inside hash literal braces - or don't." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-operators' - Enabled: true - -Style/SpaceInsideParens: - Description: 'No spaces after ( or before ).' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-spaces-braces' - Enabled: false - -Style/SpaceInsideRangeLiteral: - Description: 'No spaces inside range literals.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-space-inside-range-literals' - Enabled: false - -Style/SpecialGlobalVars: - Description: 'Avoid Perl-style global variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms' - Enabled: false - -Style/StringLiterals: - Description: 'Checks if uses of quotes match the configured preference.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#consistent-string-literals' - Enabled: false - -Style/StringLiteralsInInterpolation: - Description: >- - Checks if uses of quotes inside expressions in interpolated - strings match the configured preference. - Enabled: false - -Style/SymbolProc: - Description: 'Use symbols as procs instead of blocks when possible.' - Enabled: false - -Style/Tab: - Description: 'No hard tabs.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#spaces-indentation' - Enabled: true - -Style/TrailingBlankLines: - Description: 'Checks trailing blank lines and final newline.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#newline-eof' - Enabled: true - -Style/TrailingComma: - Description: 'Checks for trailing comma in parameter lists and literals.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas' - Enabled: false - -Style/TrailingWhitespace: - Description: 'Avoid trailing whitespace.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-trailing-whitespace' - 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: - Description: 'Prefer attr_* methods to trivial readers/writers.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#attr_family' - Enabled: false - -Style/UnlessElse: - Description: >- - Do not use unless with else. Rewrite these with the positive - case first. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-else-with-unless' - Enabled: false - -Style/UnneededCapitalW: - Description: 'Checks for %W when interpolation is not needed.' - Enabled: false - -Style/UnneededPercentQ: - Description: 'Checks for %q/%Q when single quotes or double quotes would do.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-q' - Enabled: false - -Style/VariableInterpolation: - Description: >- - Don't interpolate global, instance and class variables - directly in strings. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#curlies-interpolate' - Enabled: false - -Style/VariableName: - Description: 'Use the configured style when naming variables.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#snake-case-symbols-methods-vars' - Enabled: false - -Style/WhenThen: - Description: 'Use when x then ... for one-line cases.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#one-line-cases' - Enabled: false - -Style/WhileUntilDo: - Description: 'Checks for redundant do after while or until.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-multiline-while-do' - Enabled: false - -Style/WhileUntilModifier: - Description: >- - Favor modifier while/until usage when you have a - single-line body. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#while-as-a-modifier' - Enabled: false - -Style/WordArray: - Description: 'Use %w or %W for arrays of words.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#percent-w' - Enabled: false - -#################### Metrics ################################ - -Metrics/AbcSize: - Description: >- - A calculated magnitude based on number of assignments, - branches, and conditions. - Enabled: true - Max: 70 - -Metrics/CyclomaticComplexity: - Description: >- - A complexity metric that is strongly correlated to the number - 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 - -Metrics/LineLength: - Description: 'Limit lines to 80 characters.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#80-character-limits' - Enabled: false - -Metrics/MethodLength: - Description: 'Avoid methods longer than 10 lines of code.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#short-methods' - Enabled: false - -Metrics/ModuleLength: - Description: 'Avoid modules longer than 100 lines of code.' - Enabled: false - -#################### Lint ################################ -### Warnings - -Lint/AmbiguousOperator: - Description: >- - Checks for ambiguous operators in the first argument of a - method invocation without parentheses. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-as-args' - Enabled: false - -Lint/AmbiguousRegexpLiteral: - Description: >- - Checks for ambiguous regexp literals in the first argument of - a method invocation without parenthesis. - Enabled: false - -Lint/AssignmentInCondition: - Description: "Don't use assignment in conditions." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition' - Enabled: false - -Lint/BlockAlignment: - Description: 'Align block ends correctly.' - Enabled: false - -Lint/ConditionPosition: - Description: >- - Checks for condition placed in a confusing position relative to - the keyword. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#same-line-condition' - Enabled: false - -Lint/Debugger: - Description: 'Check for debugger calls.' - Enabled: false - -Lint/DefEndAlignment: - Description: 'Align ends corresponding to defs correctly.' - Enabled: false - -Lint/DeprecatedClassMethods: - Description: 'Check for deprecated class method calls.' - Enabled: false - -Lint/ElseLayout: - Description: 'Check for odd code arrangement in an else block.' - Enabled: false - -Lint/EmptyEnsure: - Description: 'Checks for empty ensure block.' - Enabled: false - -Lint/EmptyInterpolation: - Description: 'Checks for empty string interpolation.' - Enabled: false - -Lint/EndAlignment: - Description: 'Align ends correctly.' - Enabled: false - -Lint/EndInMethod: - Description: 'END blocks should not be placed inside method definitions.' - Enabled: false - -Lint/EnsureReturn: - Description: 'Do not use return in an ensure block.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-return-ensure' - Enabled: false - -Lint/Eval: - Description: 'The use of eval represents a serious security risk.' - Enabled: false - -Lint/HandleExceptions: - Description: "Don't suppress exception." - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions' - Enabled: false - -Lint/InvalidCharacterLiteral: - Description: >- - Checks for invalid character literals with a non-escaped - whitespace character. - Enabled: false - -Lint/LiteralInCondition: - Description: 'Checks of literals used in conditions.' - Enabled: false - -Lint/LiteralInInterpolation: - Description: 'Checks for literals used in interpolation.' - Enabled: false - -Lint/Loop: - Description: >- - Use Kernel#loop with break rather than begin/end/until or - begin/end/while for post-loop tests. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#loop-with-break' - Enabled: false - -Lint/ParenthesesAsGroupedExpression: - Description: >- - Checks for method calls with a space before the opening - parenthesis. - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#parens-no-spaces' - Enabled: true - -Lint/RequireParentheses: - Description: >- - Use parentheses in the method call to avoid confusion - about precedence. - Enabled: false - -Lint/RescueException: - Description: 'Avoid rescuing the Exception class.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-blind-rescues' - Enabled: true - -Lint/ShadowingOuterLocalVariable: - Description: >- - Do not use the same name as outer local variable - for block arguments or block local variables. - Enabled: false - -Lint/SpaceBeforeFirstArg: - Description: >- - Put a space between a method name and the first argument - in a method call without parentheses. - Enabled: false - -Lint/StringConversionInInterpolation: - Description: 'Checks for Object#to_s usage in string interpolation.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#no-to-s' - Enabled: false - -Lint/UnderscorePrefixedVariableName: - Description: 'Do not use prefix `_` for a variable that is used.' - Enabled: true - -Lint/UnusedBlockArgument: - Description: 'Checks for unused block arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' - Enabled: false - -Lint/UnusedMethodArgument: - Description: 'Checks for unused method arguments.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' - Enabled: false - -Lint/UnreachableCode: - Description: 'Unreachable code.' - Enabled: false - -Lint/UselessAccessModifier: - Description: 'Checks for useless access modifiers.' - Enabled: false - -Lint/UselessAssignment: - Description: 'Checks for useless assignment to a local variable.' - StyleGuide: 'https://github.com/bbatsov/ruby-style-guide#underscore-unused-vars' - Enabled: true - -Lint/UselessComparison: - Description: 'Checks for comparison of something with itself.' - Enabled: false - -Lint/UselessElseWithoutRescue: - Description: 'Checks for useless `else` in `begin..end` without `rescue`.' - Enabled: false - -Lint/UselessSetterCall: - Description: 'Checks for useless setter call to a local variable.' - Enabled: false - -Lint/Void: - Description: 'Possible use of operator/literal/variable in void context.' - Enabled: false - -##################### Rails ################################## - -Rails/ActionFilter: - Description: 'Enforces consistent use of action filter methods.' - Enabled: true - -Rails/Date: - Description: >- - Checks the correct usage of date aware methods, - such as Date.today, Date.current etc. - Enabled: false - -Rails/DefaultScope: - Description: 'Checks if the argument passed to default_scope is a block.' - Enabled: false - -Rails/Delegate: - Description: 'Prefer delegate method for delegations.' - Enabled: false - -Rails/HasAndBelongsToMany: - Description: 'Prefer has_many :through to has_and_belongs_to_many.' - Enabled: true - -Rails/Output: - Description: 'Checks for calls to puts, print, etc.' - Enabled: true - -Rails/ReadWriteAttribute: - Description: >- - Checks for read_attribute(:attr) and - write_attribute(:attr, val). - Enabled: false - -Rails/ScopeArgs: - Description: 'Checks the arguments of ActiveRecord scopes.' - 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: - Description: 'Use validates :attribute, hash of validations.' - Enabled: false - - -# Exclude some of GitLab files -# -# AllCops: - RunRailsCops: true + TargetRubyVersion: 2.1 + # Cop names are not displayed in offense messages by default. Change behavior + # by overriding DisplayCopNames, or by giving the -D/--display-cop-names + # option. + DisplayCopNames: true + # Style guide URLs are not displayed in offense messages by default. Change + # behavior by overriding DisplayStyleGuide, or by giving the + # -S/--display-style-guide option. + DisplayStyleGuide: false + # Exclude some GitLab files Exclude: - 'vendor/**/*' - 'db/**/*' @@ -1039,3 +21,1041 @@ AllCops: - 'lib/email_validator.rb' - 'lib/gitlab/upgrader.rb' - 'lib/gitlab/seeder.rb' + - 'generator_templates/**/*' + + +##################### Style ################################## + +# Check indentation of private/protected visibility modifiers. +Style/AccessModifierIndentation: + Enabled: true + +# Check the naming of accessor methods for get_/set_. +Style/AccessorMethodName: + Enabled: false + +# Use alias_method instead of alias. +Style/Alias: + EnforcedStyle: prefer_alias_method + Enabled: true + +# Align the elements of an array literal if they span more than one line. +Style/AlignArray: + Enabled: true + +# Align the elements of a hash literal if they span more than one line. +Style/AlignHash: + Enabled: true + +# Align the parameters of a method call if they span more than one line. +Style/AlignParameters: + Enabled: false + +# Use &&/|| instead of and/or. +Style/AndOr: + Enabled: false + +# Use `Array#join` instead of `Array#*`. +Style/ArrayJoin: + Enabled: false + +# Use only ascii symbols in comments. +Style/AsciiComments: + Enabled: true + +# Use only ascii symbols in identifiers. +Style/AsciiIdentifiers: + Enabled: true + +# Checks for uses of Module#attr. +Style/Attr: + Enabled: false + +# Avoid the use of BEGIN blocks. +Style/BeginBlock: + Enabled: true + +# Checks if usage of %() or %Q() matches configuration. +Style/BarePercentLiterals: + Enabled: false + +# Do not use block comments. +Style/BlockComments: + Enabled: false + +# Put end statement of multiline block on its own line. +Style/BlockEndNewline: + Enabled: true + +# Avoid using {...} for multi-line blocks (multiline chaining is # always +# ugly). Prefer {...} over do...end for single-line blocks. +Style/BlockDelimiters: + Enabled: true + +# Enforce braces style around hash parameters. +Style/BracesAroundHashParameters: + Enabled: false + +# Avoid explicit use of the case equality operator(===). +Style/CaseEquality: + Enabled: false + +# Indentation of when in a case/when/[else/]end. +Style/CaseIndentation: + Enabled: true + +# Checks for uses of character literals. +Style/CharacterLiteral: + Enabled: true + +# Use CamelCase for classes and modules.' +Style/ClassAndModuleCamelCase: + Enabled: true + +# Checks style of children classes and modules. +Style/ClassAndModuleChildren: + Enabled: false + +# Enforces consistent use of `Object#is_a?` or `Object#kind_of?`. +Style/ClassCheck: + Enabled: false + +# Use self when defining module/class methods. +Style/ClassMethods: + Enabled: false + +# Avoid the use of class variables. +Style/ClassVars: + Enabled: true + +# Do not use :: for method call. +Style/ColonMethodCall: + Enabled: false + +# Checks formatting of special comments (TODO, FIXME, OPTIMIZE, HACK, REVIEW). +Style/CommentAnnotation: + Enabled: false + +# Indentation of comments. +Style/CommentIndentation: + Enabled: true + +# Use the return value of `if` and `case` statements for assignment to a +# variable and variable comparison instead of assigning that variable +# inside of each branch. +Style/ConditionalAssignment: + Enabled: false + +# Constants should use SCREAMING_SNAKE_CASE. +Style/ConstantName: + Enabled: true + +# Use def with parentheses when there are arguments. +Style/DefWithParentheses: + Enabled: false + +# Checks for use of deprecated Hash methods. +Style/DeprecatedHashMethods: + Enabled: false + +# Document classes and non-namespace modules. +Style/Documentation: + Enabled: false + +# Checks the position of the dot in multi-line method calls. +Style/DotPosition: + Enabled: false + +# Checks for uses of double negation (!!). +Style/DoubleNegation: + Enabled: false + +# Prefer `each_with_object` over `inject` or `reduce`. +Style/EachWithObject: + Enabled: false + +# Align elses and elsifs correctly. +Style/ElseAlignment: + Enabled: true + +# Avoid empty else-clauses. +Style/EmptyElse: + Enabled: false + +# Use empty lines between defs. +Style/EmptyLineBetweenDefs: + Enabled: false + +# Don't use several empty lines in a row. +Style/EmptyLines: + Enabled: false + +# Keep blank lines around access modifiers. +Style/EmptyLinesAroundAccessModifier: + Enabled: false + +# Keeps track of empty lines around block bodies. +Style/EmptyLinesAroundBlockBody: + Enabled: false + +# Keeps track of empty lines around class bodies. +Style/EmptyLinesAroundClassBody: + Enabled: false + +# Keeps track of empty lines around module bodies. +Style/EmptyLinesAroundModuleBody: + Enabled: false + +# Keeps track of empty lines around method bodies. +Style/EmptyLinesAroundMethodBody: + Enabled: false + +# Prefer literals to Array.new/Hash.new/String.new. +Style/EmptyLiteral: + Enabled: false + +# Avoid the use of END blocks. +Style/EndBlock: + Enabled: false + +# Use Unix-style line endings. +Style/EndOfLine: + Enabled: false + +# Favor the use of Fixnum#even? && Fixnum#odd? +Style/EvenOdd: + Enabled: false + +# Do not use unnecessary spacing. +Style/ExtraSpacing: + Enabled: false + +# Use snake_case for source file names. +Style/FileName: + Enabled: false + +# Checks for flip flops. +Style/FlipFlop: + Enabled: false + +# Checks use of for or each in multiline loops. +Style/For: + Enabled: false + +# Enforce the use of Kernel#sprintf, Kernel#format or String#%. +Style/FormatString: + Enabled: false + +# Do not introduce global variables. +Style/GlobalVars: + Enabled: false + +# Check for conditionals that can be replaced with guard clauses. +Style/GuardClause: + Enabled: false + +# Prefer Ruby 1.9 hash syntax `{ a: 1, b: 2 }` +# over 1.8 syntax `{ :a => 1, :b => 2 }`. +Style/HashSyntax: + Enabled: true + +# Finds if nodes inside else, which can be converted to elsif. +Style/IfInsideElse: + Enabled: false + +# Favor modifier if/unless usage when you have a single-line body. +Style/IfUnlessModifier: + Enabled: false + +# Do not use if x; .... Use the ternary operator instead. +Style/IfWithSemicolon: + Enabled: false + +# Checks that conditional statements do not have an identical line at the +# end of each branch, which can validly be moved out of the conditional. +Style/IdenticalConditionalBranches: + Enabled: false + +# Checks the indentation of the first line of the right-hand-side of a +# multi-line assignment. +Style/IndentAssignment: + Enabled: false + +# Keep indentation straight. +Style/IndentationConsistency: + Enabled: true + +# Use 2 spaces for indentation. +Style/IndentationWidth: + Enabled: true + +# Checks the indentation of the first element in an array literal. +Style/IndentArray: + Enabled: false + +# Checks the indentation of the first key in a hash literal. +Style/IndentHash: + Enabled: false + +# Use Kernel#loop for infinite loops. +Style/InfiniteLoop: + Enabled: false + +# Use the new lambda literal syntax for single-line blocks. +Style/Lambda: + Enabled: false + +# Use lambda.call(...) instead of lambda.(...). +Style/LambdaCall: + Enabled: false + +# Comments should start with a space. +Style/LeadingCommentSpace: + Enabled: false + +# Use \ instead of + or << to concatenate two string literals at line end. +Style/LineEndConcatenation: + Enabled: false + +# Do not use parentheses for method calls with no arguments. +Style/MethodCallParentheses: + Enabled: false + +# Checks if the method definitions have or don't have parentheses. +Style/MethodDefParentheses: + Enabled: false + +# Use the configured style when naming methods. +Style/MethodName: + Enabled: false + +# Checks for usage of `extend self` in modules. +Style/ModuleFunction: + Enabled: false + +# Avoid multi-line chains of blocks. +Style/MultilineBlockChain: + Enabled: false + +# Ensures newlines after multiline block do statements. +Style/MultilineBlockLayout: + Enabled: true + +# Do not use then for multi-line if/unless. +Style/MultilineIfThen: + Enabled: false + +# Checks indentation of method calls with the dot operator that span more than +# one line. +Style/MultilineMethodCallIndentation: + Enabled: false + +# Checks indentation of binary operations that span more than one line. +Style/MultilineOperationIndentation: + Enabled: false + +# Avoid multi-line `? :` (the ternary operator), use if/unless instead. +Style/MultilineTernaryOperator: + Enabled: false + +# Do not assign mutable objects to constants. +Style/MutableConstant: + Enabled: false + +# Favor unless over if for negative conditions (or control flow or). +Style/NegatedIf: + Enabled: false + +# Favor until over while for negative conditions. +Style/NegatedWhile: + Enabled: false + +# Avoid using nested modifiers. +Style/NestedModifier: + Enabled: false + +# Parenthesize method calls which are nested inside the argument list of +# another parenthesized method call. +Style/NestedParenthesizedCalls: + Enabled: false + +# Use one expression per branch in a ternary operator. +Style/NestedTernaryOperator: + Enabled: true + +# Use `next` to skip iteration instead of a condition at the end. +Style/Next: + Enabled: false + +# Prefer x.nil? to x == nil. +Style/NilComparison: + Enabled: true + +# Checks for redundant nil checks. +Style/NonNilCheck: + Enabled: true + +# Use ! instead of not. +Style/Not: + Enabled: true + +# Add underscores to large numeric literals to improve their readability. +Style/NumericLiterals: + Enabled: false + +# Favor the ternary operator(?:) over if/then/else/end constructs. +Style/OneLineConditional: + Enabled: true + +# When defining binary operators, name the argument other. +Style/OpMethod: + Enabled: false + +# Check for simple usages of parallel assignment. It will only warn when +# the number of variables matches on both sides of the assignment. +Style/ParallelAssignment: + Enabled: false + +# Don't use parentheses around the condition of an if/unless/while. +Style/ParenthesesAroundCondition: + Enabled: true + +# Use `%`-literal delimiters consistently. +Style/PercentLiteralDelimiters: + Enabled: false + +# Checks if uses of %Q/%q match the configured preference. +Style/PercentQLiterals: + Enabled: false + +# Avoid Perl-style regex back references. +Style/PerlBackrefs: + Enabled: false + +# Check the names of predicate methods. +Style/PredicateName: + Enabled: false + +# Use proc instead of Proc.new. +Style/Proc: + Enabled: false + +# Checks the arguments passed to raise/fail. +Style/RaiseArgs: + Enabled: false + +# Don't use begin blocks when they are not needed. +Style/RedundantBegin: + Enabled: false + +# Checks for an obsolete RuntimeException argument in raise/fail. +Style/RedundantException: + Enabled: false + +# Checks usages of Object#freeze on immutable objects. +Style/RedundantFreeze: + Enabled: false + +# TODO: Enable RedundantParentheses Cop. +# Checks for parentheses that seem not to serve any purpose. +Style/RedundantParentheses: + Enabled: false + +# Don't use return where it's not required. +Style/RedundantReturn: + Enabled: true + +# Don't use self where it's not needed. +Style/RedundantSelf: + Enabled: false + +# Use %r for regular expressions matching more than `MaxSlashes` '/' +# characters. Use %r only for regular expressions matching more +# than `MaxSlashes` '/' character. +Style/RegexpLiteral: + Enabled: false + +# Avoid using rescue in its modifier form. +Style/RescueModifier: + Enabled: false + +# Checks for places where self-assignment shorthand should have been used. +Style/SelfAssignment: + Enabled: false + +# Don't use semicolons to terminate expressions. +Style/Semicolon: + Enabled: false + +# Checks for proper usage of fail and raise. +Style/SignalException: + Enabled: false + +# Enforces the names of some block params. +Style/SingleLineBlockParams: + Enabled: false + +# Avoid single-line methods. +Style/SingleLineMethods: + Enabled: false + +# Use spaces after colons. +Style/SpaceAfterColon: + Enabled: false + +# Use spaces after commas. +Style/SpaceAfterComma: + Enabled: false + +# Do not put a space between a method name and the opening parenthesis in a +# method definition. +Style/SpaceAfterMethodName: + Enabled: false + +# Tracks redundant space after the ! operator. +Style/SpaceAfterNot: + Enabled: false + +# Use spaces after semicolons. +Style/SpaceAfterSemicolon: + Enabled: false + +# Checks that the equals signs in parameter default assignments have or don't +# have surrounding space depending on configuration. +Style/SpaceAroundEqualsInParameterDefault: + Enabled: false + +# TODO: Enable SpaceAroundKeyword Cop. +# Use a space around keywords if appropriate. +Style/SpaceAroundKeyword: + Enabled: false + +# Use a single space around operators. +Style/SpaceAroundOperators: + Enabled: true + +# Checks that the left block brace has or doesn't have space before it. +Style/SpaceBeforeBlockBraces: + Enabled: false + +# No spaces before commas. +Style/SpaceBeforeComma: + Enabled: false + +# Checks for missing space between code and a comment on the same line. +Style/SpaceBeforeComment: + Enabled: false + +# Checks that exactly one space is used between a method name and the first +# argument for method calls without parentheses. +Style/SpaceBeforeFirstArg: + Enabled: false + +# No spaces before semicolons. +Style/SpaceBeforeSemicolon: + Enabled: false + +# Checks that block braces have or don't have surrounding space. +# For blocks taking parameters, checks that the left brace has or doesn't +# have trailing space. +Style/SpaceInsideBlockBraces: + Enabled: false + +# No spaces after [ or before ]. +Style/SpaceInsideBrackets: + Enabled: false + +# Use spaces inside hash literal braces - or don't. +Style/SpaceInsideHashLiteralBraces: + Enabled: true + +# No spaces after ( or before ). +Style/SpaceInsideParens: + Enabled: false + +# No spaces inside range literals. +Style/SpaceInsideRangeLiteral: + Enabled: false + +# Checks for padding/surrounding spaces inside string interpolation. +Style/SpaceInsideStringInterpolation: + Enabled: false + +# Avoid Perl-style global variables. +Style/SpecialGlobalVars: + Enabled: false + +# Check for the usage of parentheses around stabby lambda arguments. +Style/StabbyLambdaParentheses: + Enabled: false + +# Checks if uses of quotes match the configured preference. +Style/StringLiterals: + Enabled: false + +# Checks if uses of quotes inside expressions in interpolated strings match the +# configured preference. +Style/StringLiteralsInInterpolation: + Enabled: false + +# Checks if configured preferred methods are used over non-preferred. +Style/StringMethods: + Enabled: false + +# Use %i or %I for arrays of symbols. +Style/SymbolArray: + Enabled: false + +# Use symbols as procs instead of blocks when possible. +Style/SymbolProc: + Enabled: false + +# No hard tabs. +Style/Tab: + Enabled: true + +# Checks trailing blank lines and final newline. +Style/TrailingBlankLines: + Enabled: true + +# Checks for trailing comma in array and hash literals. +Style/TrailingCommaInLiteral: + Enabled: false + +# Checks for trailing comma in argument lists. +Style/TrailingCommaInArguments: + Enabled: false + +# Avoid trailing whitespace. +Style/TrailingWhitespace: + Enabled: false + +# Checks for the usage of unneeded trailing underscores at the end of +# parallel variable assignment. +Style/TrailingUnderscoreVariable: + Enabled: false + +# Prefer attr_* methods to trivial readers/writers. +Style/TrivialAccessors: + Enabled: false + +# Do not use unless with else. Rewrite these with the positive case first. +Style/UnlessElse: + Enabled: false + +# Checks for %W when interpolation is not needed. +Style/UnneededCapitalW: + Enabled: false + +# TODO: Enable UnneededInterpolation Cop. +# Checks for strings that are just an interpolated expression. +Style/UnneededInterpolation: + Enabled: false + +# Checks for %q/%Q when single quotes or double quotes would do. +Style/UnneededPercentQ: + Enabled: false + +# Don't interpolate global, instance and class variables directly in strings. +Style/VariableInterpolation: + Enabled: false + +# Use the configured style when naming variables. +Style/VariableName: + Enabled: false + +# Use when x then ... for one-line cases. +Style/WhenThen: + Enabled: false + +# Checks for redundant do after while or until. +Style/WhileUntilDo: + Enabled: false + +# Favor modifier while/until usage when you have a single-line body. +Style/WhileUntilModifier: + Enabled: false + +# Use %w or %W for arrays of words. +Style/WordArray: + Enabled: false + +# TODO: Enable ZeroLengthPredicate Cop. +# Use #empty? when testing for objects of length 0. +Style/ZeroLengthPredicate: + Enabled: false + + +#################### Metrics ################################ + +# A calculated magnitude based on number of assignments, +# branches, and conditions. +Metrics/AbcSize: + Enabled: true + Max: 60 + +# Avoid excessive block nesting. +Metrics/BlockNesting: + Enabled: true + Max: 4 + +# Avoid classes longer than 100 lines of code. +Metrics/ClassLength: + Enabled: false + +# A complexity metric that is strongly correlated to the number +# of test cases needed to validate a method. +Metrics/CyclomaticComplexity: + Enabled: true + Max: 17 + +# Limit lines to 80 characters. +Metrics/LineLength: + Enabled: false + +# Avoid methods longer than 10 lines of code. +Metrics/MethodLength: + Enabled: false + +# Avoid modules longer than 100 lines of code. +Metrics/ModuleLength: + Enabled: false + +# Avoid parameter lists longer than three or four parameters. +Metrics/ParameterLists: + Enabled: true + Max: 8 + +# A complexity metric geared towards measuring complexity for a human reader. +Metrics/PerceivedComplexity: + Enabled: true + Max: 18 + + +#################### Lint ################################ + +# Checks for ambiguous operators in the first argument of a method invocation +# without parentheses. +Lint/AmbiguousOperator: + Enabled: false + +# Checks for ambiguous regexp literals in the first argument of a method +# invocation without parentheses. +Lint/AmbiguousRegexpLiteral: + Enabled: false + +# Don't use assignment in conditions. +Lint/AssignmentInCondition: + Enabled: false + +# Align block ends correctly. +Lint/BlockAlignment: + Enabled: false + +# Default values in optional keyword arguments and optional ordinal arguments +# should not refer back to the name of the argument. +Lint/CircularArgumentReference: + Enabled: false + +# Checks for condition placed in a confusing position relative to the keyword. +Lint/ConditionPosition: + Enabled: false + +# Check for debugger calls. +Lint/Debugger: + Enabled: false + +# Align ends corresponding to defs correctly. +Lint/DefEndAlignment: + Enabled: false + +# Check for deprecated class method calls. +Lint/DeprecatedClassMethods: + Enabled: true + +# Check for duplicate method definitions. +Lint/DuplicateMethods: + Enabled: false + +# Check for duplicate keys in hash literals. +Lint/DuplicatedKey: + Enabled: false + +# Check for immutable argument given to each_with_object. +Lint/EachWithObjectArgument: + Enabled: false + +# Check for odd code arrangement in an else block. +Lint/ElseLayout: + Enabled: false + +# Checks for empty ensure block. +Lint/EmptyEnsure: + Enabled: false + +# Checks for empty string interpolation. +Lint/EmptyInterpolation: + Enabled: false + +# Align ends correctly. +Lint/EndAlignment: + Enabled: false + +# END blocks should not be placed inside method definitions. +Lint/EndInMethod: + Enabled: false + +# Do not use return in an ensure block. +Lint/EnsureReturn: + Enabled: false + +# The use of eval represents a serious security risk. +Lint/Eval: + Enabled: false + +# Catches floating-point literals too large or small for Ruby to represent. +Lint/FloatOutOfRange: + Enabled: false + +# The number of parameters to format/sprint must match the fields. +Lint/FormatParameterMismatch: + Enabled: false + +# Don't suppress exception. +Lint/HandleExceptions: + Enabled: false + +# TODO: Enable ImplicitStringConcatenation Cop. +# Checks for adjacent string literals on the same line, which could better be +# represented as a single string literal. +Lint/ImplicitStringConcatenation: + Enabled: false + +# TODO: Enable IneffectiveAccessModifier Cop. +# Checks for attempts to use `private` or `protected` to set the visibility +# of a class method, which does not work. +Lint/IneffectiveAccessModifier: + Enabled: false + +# Checks for invalid character literals with a non-escaped whitespace +# character. +Lint/InvalidCharacterLiteral: + Enabled: false + +# Checks of literals used in conditions. +Lint/LiteralInCondition: + Enabled: false + +# Checks for literals used in interpolation. +Lint/LiteralInInterpolation: + Enabled: false + +# Use Kernel#loop with break rather than begin/end/until or begin/end/while +# for post-loop tests. +Lint/Loop: + Enabled: false + +# Do not use nested method definitions. +Lint/NestedMethodDefinition: + Enabled: false + +# Do not omit the accumulator when calling `next` in a `reduce`/`inject` block. +Lint/NextWithoutAccumulator: + Enabled: false + +# Checks for method calls with a space before the opening parenthesis. +Lint/ParenthesesAsGroupedExpression: + Enabled: true + +# Checks for `rand(1)` calls. Such calls always return `0` and most likely +# a mistake. +Lint/RandOne: + Enabled: false + +# Use parentheses in the method call to avoid confusion about precedence. +Lint/RequireParentheses: + Enabled: false + +# Avoid rescuing the Exception class. +Lint/RescueException: + Enabled: true + +# Do not use the same name as outer local variable for block arguments +# or block local variables. +Lint/ShadowingOuterLocalVariable: + Enabled: false + +# 'Checks for Object#to_s usage in string interpolation. +Lint/StringConversionInInterpolation: + Enabled: false + +# Do not use prefix `_` for a variable that is used. +Lint/UnderscorePrefixedVariableName: + Enabled: true + +# Checks for rubocop:disable comments that can be removed. +# Note: this cop is not disabled when disabling all cops. +# It must be explicitly disabled. +Lint/UnneededDisable: + Enabled: false + +# Checks for unused block arguments. +Lint/UnusedBlockArgument: + Enabled: false + +# Checks for unused method arguments. +Lint/UnusedMethodArgument: + Enabled: false + +# Unreachable code. +Lint/UnreachableCode: + Enabled: false + +# Checks for useless access modifiers. +Lint/UselessAccessModifier: + Enabled: false + +# Checks for useless assignment to a local variable. +Lint/UselessAssignment: + Enabled: true + +# Checks for comparison of something with itself. +Lint/UselessComparison: + Enabled: false + +# Checks for useless `else` in `begin..end` without `rescue`. +Lint/UselessElseWithoutRescue: + Enabled: false + +# Checks for useless setter call to a local variable. +Lint/UselessSetterCall: + Enabled: false + +# Possible use of operator/literal/variable in void context. +Lint/Void: + Enabled: false + + +##################### Performance ############################ + +# Use `casecmp` rather than `downcase ==`. +Performance/Casecmp: + Enabled: true + +# TODO: Enable DoubleStartEndWith Cop. +# Use `str.{start,end}_with?(x, ..., y, ...)` instead of +# `str.{start,end}_with?(x, ...) || str.{start,end}_with?(y, ...)`. +Performance/DoubleStartEndWith: + Enabled: false + +# TODO: Enable EndWith Cop. +# Use `end_with?` instead of a regex match anchored to the end of a string. +Performance/EndWith: + Enabled: false + +# Use `strip` instead of `lstrip.rstrip`. +Performance/LstripRstrip: + Enabled: true + +# TODO: Enable RangeInclude Cop. +# Use `Range#cover?` instead of `Range#include?`. +Performance/RangeInclude: + Enabled: false + +# TODO: Enable RedundantBlockCall Cop. +# Use `yield` instead of `block.call`. +Performance/RedundantBlockCall: + Enabled: false + +# TODO: Enable RedundantMatch Cop. +# Use `=~` instead of `String#match` or `Regexp#match` in a context where the +# returned `MatchData` is not needed. +Performance/RedundantMatch: + Enabled: false + +# TODO: Enable RedundantMerge Cop. +# Use `Hash#[]=`, rather than `Hash#merge!` with a single key-value pair. +Performance/RedundantMerge: + # Max number of key-value pairs to consider an offense + MaxKeyValuePairs: 2 + Enabled: false + +# TODO: Enable RedundantSortBy Cop. +# Use `sort` instead of `sort_by { |x| x }`. +Performance/RedundantSortBy: + Enabled: false + +# TODO: Enable StartWith Cop. +# Use `start_with?` instead of a regex match anchored to the beginning of a +# string. +Performance/StartWith: + Enabled: false + +# Use `tr` instead of `gsub` when you are replacing the same number of +# characters. Use `delete` instead of `gsub` when you are deleting +# characters. +Performance/StringReplacement: + Enabled: true + +# TODO: Enable TimesMap Cop. +# Checks for `.times.map` calls. +Performance/TimesMap: + Enabled: false + + +##################### Rails ################################## + +# Enables Rails cops. +Rails: + Enabled: true + +# Enforces consistent use of action filter methods. +Rails/ActionFilter: + Enabled: true + EnforcedStyle: action + +# Checks the correct usage of date aware methods, such as `Date.today`, +# `Date.current`, etc. +Rails/Date: + Enabled: false + +# Prefer delegate method for delegations. +Rails/Delegate: + Enabled: false + +# Prefer `find_by` over `where.first`. +Rails/FindBy: + Enabled: false + +# Prefer `all.find_each` over `all.find`. +Rails/FindEach: + Enabled: false + +# Prefer has_many :through to has_and_belongs_to_many. +Rails/HasAndBelongsToMany: + Enabled: true + +# Checks for calls to puts, print, etc. +Rails/Output: + Enabled: true + +# Checks for incorrect grammar when using methods like `3.day.ago`. +Rails/PluralizationGrammar: + Enabled: false + +# Checks for `read_attribute(:attr)` and `write_attribute(:attr, val)`. +Rails/ReadWriteAttribute: + Enabled: false + +# Checks the arguments of ActiveRecord scopes. +Rails/ScopeArgs: + Enabled: false + +# Checks the correct usage of time zone aware methods. +# http://danilenko.org/2012/7/6/rails_timezones +Rails/TimeZone: + Enabled: false + +# Use validates :attribute, hash of validations. +Rails/Validation: + Enabled: false diff --git a/.scss-lint.yml b/.scss-lint.yml new file mode 100644 index 0000000000..66f9975d4c --- /dev/null +++ b/.scss-lint.yml @@ -0,0 +1,264 @@ +# Linter Documentation: +# https://github.com/brigade/scss-lint/blob/master/lib/scss_lint/linter/README.md + +scss_files: 'app/assets/stylesheets/**/*.scss' + +exclude: + - 'app/assets/stylesheets/pages/emojis.scss' + +linters: + # Reports when you use improper spacing around ! (the "bang") in !default, + # !global, !important, and !optional flags. + BangFormat: + enabled: false + + # Whether or not to prefer `border: 0` over `border: none`. + BorderZero: + enabled: false + + # Reports when you define a rule set using a selector with chained classes + # (a.k.a. adjoining classes). + ChainedClasses: + enabled: false + + # Prefer hexadecimal color codes over color keywords. + # (e.g. `color: green` is a color keyword) + ColorKeyword: + enabled: false + + # Prefer color literals (keywords or hexadecimal codes) to be used only in + # variable declarations. They should be referred to via variables everywhere + # else. + ColorVariable: + enabled: false + + # Which form of comments to prefer in CSS. + Comment: + enabled: false + + # Reports @debug statements (which you probably left behind accidentally). + DebugStatement: + enabled: false + + # Rule sets should be ordered as follows: + # - @extend declarations + # - @include declarations without inner @content + # - properties, @include declarations with inner @content + # - nested rule sets. + DeclarationOrder: + enabled: false + + # `scss-lint:disable` control comments should be preceded by a comment + # explaining why these linters are being disabled for this file. + # See https://github.com/brigade/scss-lint#disabling-linters-via-source for + # more information. + DisableLinterReason: + enabled: true + + # Reports when you define the same property twice in a single rule set. + DuplicateProperty: + enabled: false + + # Separate rule, function, and mixin declarations with empty lines. + EmptyLineBetweenBlocks: + enabled: false + + # Reports when you have an empty rule set. + EmptyRule: + enabled: true + + # Reports when you have an @extend directive. + ExtendDirective: + enabled: false + + # Files should always have a final newline. This results in better diffs + # when adding lines to the file, since SCM systems such as git won't + # think that you touched the last line. + FinalNewline: + enabled: false + + # HEX colors should use three-character values where possible. + HexLength: + enabled: true + + # HEX color values should use lower-case colors to differentiate between + # letters and numbers, e.g. `#E3E3E3` vs. `#e3e3e3`. + HexNotation: + enabled: true + + # Avoid using ID selectors. + IdSelector: + enabled: false + + # The basenames of @imported SCSS partials should not begin with an + # underscore and should not include the filename extension. + ImportPath: + enabled: false + + # Avoid using !important in properties. It is usually indicative of a + # misunderstanding of CSS specificity and can lead to brittle code. + ImportantRule: + enabled: false + + # Indentation should always be done in increments of 2 spaces. + Indentation: + enabled: true + width: 2 + + # Don't write leading zeros for numeric values with a decimal point. + LeadingZero: + enabled: false + + # Reports when you define the same selector twice in a single sheet. + MergeableSelector: + enabled: false + + # Functions, mixins, variables, and placeholders should be declared + # with all lowercase letters and hyphens instead of underscores. + NameFormat: + enabled: false + + # Avoid nesting selectors too deeply. + NestingDepth: + enabled: false + + # Always use placeholder selectors in @extend. + PlaceholderInExtend: + enabled: false + + # Sort properties in a strict order. + PropertySortOrder: + enabled: false + + # Reports when you use an unknown or disabled CSS property + # (ignoring vendor-prefixed properties). + PropertySpelling: + enabled: false + + # Configure which units are allowed for property values. + PropertyUnits: + enabled: false + + # Pseudo-elements, like ::before, and ::first-letter, should be declared + # with two colons. Pseudo-classes, like :hover and :first-child, should + # be declared with one colon. + PseudoElement: + enabled: false + + # Avoid qualifying elements in selectors (also known as "tag-qualifying"). + QualifyingElement: + enabled: false + + # Don't write selectors with a depth of applicability greater than 3. + SelectorDepth: + enabled: false + + # Selectors should always use hyphenated-lowercase, rather than camelCase or + # snake_case. + SelectorFormat: + enabled: false + convention: hyphenated_lowercase + + # Prefer the shortest shorthand form possible for properties that support it. + Shorthand: + enabled: true + + # Each property should have its own line, except in the special case of + # single line rulesets. + SingleLinePerProperty: + enabled: true + allow_single_line_rule_sets: true + + # Split selectors onto separate lines after each comma, and have each + # individual selector occupy a single line. + SingleLinePerSelector: + enabled: false + + # Commas in lists should be followed by a space. + SpaceAfterComma: + enabled: false + + # Properties should be formatted with a single space separating the colon + # from the property's value. + SpaceAfterPropertyColon: + enabled: true + + # Properties should be formatted with no space between the name and the + # colon. + SpaceAfterPropertyName: + enabled: true + + # Variables should be formatted with a single space separating the colon + # from the variable's value. + SpaceAfterVariableColon: + enabled: false + + # Variables should be formatted with no space between the name and the + # colon. + SpaceAfterVariableName: + enabled: false + + # Operators should be formatted with a single space on both sides of an + # infix operator. + SpaceAroundOperator: + enabled: false + + # Opening braces should be preceded by a single space. + SpaceBeforeBrace: + enabled: true + + # Parentheses should not be padded with spaces. + SpaceBetweenParens: + enabled: false + + # Enforces that string literals should be written with a consistent form + # of quotes (single or double). + StringQuotes: + enabled: false + + # Property values, @extend, @include, and @import directives, and variable + # declarations should always end with a semicolon. + TrailingSemicolon: + enabled: false + + # Reports lines containing trailing whitespace. + TrailingWhitespace: + enabled: false + + # Don't write trailing zeros for numeric values with a decimal point. + TrailingZero: + enabled: false + + # Don't use the `all` keyword to specify transition properties. + TransitionAll: + enabled: false + + # Numeric values should not contain unnecessary fractional portions. + UnnecessaryMantissa: + enabled: false + + # Do not use parent selector references (&) when they would otherwise + # be unnecessary. + UnnecessaryParentReference: + enabled: false + + # URLs should be valid and not contain protocols or domain names. + UrlFormat: + enabled: true + + # URLs should always be enclosed within quotes. + UrlQuotes: + enabled: true + + # Properties, like color and font, are easier to read and maintain + # when defined using variables rather than literals. + VariableForProperty: + enabled: false + + # Avoid vendor prefixes. Or rather: don't write them yourself. + VendorPrefix: + enabled: false + + # Omit length units on zero values, e.g. `0px` vs. `0`. + ZeroUnit: + enabled: true diff --git a/CHANGELOG b/CHANGELOG index bb7760bfce..6cdfdefe38 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,21 +1,428 @@ Please view this file on the master branch, on stable branches it's out of date. -v 8.6.0 (unreleased) +v 8.8.2 + - Added remove due date button. !4209 + - Fix access to Pipelines by Anonymous user. !4233 + - Fix Error 500 when accessing application settings due to nil disabled OAuth sign-in sources. !4242 + - Fix Error 500 in CI charts by gracefully handling commits with no durations. !4245 + - Fix table UI on CI builds page. !4249 + - Fix backups if registry is disabled. !4263 + - Fixed issue with merge button color. !4211 + - Fixed issue with enter key selecting wrong option in dropdown. !4210 + - When creating a .gitignore file a dropdown with templates will be provided. !4075 + - Fix concurrent request when updating build log in browser. !4183 + +v 8.8.1 + - Add documentation for the "Health Check" feature + - Allow anonymous users to access a public project's pipelines + - Fix MySQL compatibility in zero downtime migrations helpers + - Fix the CI login to Container Registry (the gitlab-ci-token user) + +v 8.8.0 + - Implement GFM references for milestones (Alejandro Rodríguez) + - Snippets tab under user profile. !4001 (Long Nguyen) + - Fix error when using link to uploads in global snippets + - Fix Error 500 when attempting to retrieve project license when HEAD points to non-existent ref + - Assign labels and milestone to target project when moving issue. !3934 (Long Nguyen) + - Use a case-insensitive comparison in sanitizing URI schemes + - Toggle sign-up confirmation emails in application settings + - Make it possible to prevent tagged runner from picking untagged jobs + - Added `InlineDiffFilter` to the markdown parser. (Adam Butler) + - Added inline diff styling for `change_title` system notes. (Adam Butler) + - Project#open_branches has been cleaned up and no longer loads entire records into memory. + - Escape HTML in commit titles in system note messages + - Fix scope used when accessing container registry + - Fix creation of Ci::Commit object which can lead to pending, failed in some scenarios + - Improve multiple branch push performance by memoizing permission checking + - Log to application.log when an admin starts and stops impersonating a user + - Changing the confidentiality of an issue now creates a new system note (Alex Moore-Niemi) + - Updated gitlab_git to 10.1.0 + - GitAccess#protected_tag? no longer loads all tags just to check if a single one exists + - Reduce delay in destroying a project from 1-minute to immediately + - Make build status canceled if any of the jobs was canceled and none failed + - Upgrade Sidekiq to 4.1.2 + - Added /health_check endpoint for checking service status + - Make 'upcoming' filter for milestones work better across projects + - Sanitize repo paths in new project error message + - Bump mail_room to 0.7.0 to fix stuck IDLE connections + - Remove future dates from contribution calendar graph. + - Support e-mail notifications for comments on project snippets + - Fix API leak of notes of unauthorized issues, snippets and merge requests + - Use ActionDispatch Remote IP for Akismet checking + - Fix error when visiting commit builds page before build was updated + - Add 'l' shortcut to open Label dropdown on issuables and 'i' to create new issue on a project + - Update SVG sanitizer to conform to SVG 1.1 + - Speed up push emails with multiple recipients by only generating the email once + - Updated search UI + - Added authentication service for Container Registry + - Display informative message when new milestone is created + - Sanitize milestones and labels titles + - Support multi-line tag messages. !3833 (Calin Seciu) + - Force users to reset their password after an admin changes it + - Allow "NEWS" and "CHANGES" as alternative names for CHANGELOG. !3768 (Connor Shea) + - Added button to toggle whitespaces changes on diff view + - Backport GitHub Enterprise import support from EE + - Create tags using Rugged for performance reasons. !3745 + - Allow guests to set notification level in projects + - API: Expose Issue#user_notes_count. !3126 (Anton Popov) + - Don't show forks button when user can't view forks + - Fix atom feed links and rendering + - Files over 5MB can only be viewed in their raw form, files over 1MB without highlighting !3718 + - Add support for supressing text diffs using .gitattributes on the default branch (Matt Oakes) + - Add eager load paths to help prevent dependency load issues in Sidekiq workers. !3724 + - Added multiple colors for labels in dropdowns when dups happen. + - Show commits in the same order as `git log` + - Improve description for the Two-factor Authentication sign-in screen. (Connor Shea) + - API support for the 'since' and 'until' operators on commit requests (Paco Guzman) + - Fix Gravatar hint in user profile when Gravatar is disabled. !3988 (Artem Sidorenko) + - Expire repository exists? and has_visible_content? caches after a push if necessary + - Fix unintentional filtering bug in Issue/MR sorted by milestone due (Takuya Noguchi) + - Fix adding a todo for private group members (Ahmad Sherif) + - Bump ace-rails-ap gem version from 2.0.1 to 4.0.2 which upgrades Ace Editor from 1.1.2 to 1.2.3 + - Total method execution timings are no longer tracked + - Allow Admins to remove the Login with buttons for OAuth services and still be able to import !4034. (Andrei Gliga) + - Add API endpoints for un/subscribing from/to a label. !4051 (Ahmad Sherif) + - Hide left sidebar on phone screens to give more space for content + - Redesign navigation for profile and group pages + - Add counter metrics for rails cache + - Import pull requests from GitHub where the source or target branches were removed + - All Grape API helpers are now instrumented + - Improve Issue formatting for the Slack Service (Jeroen van Baarsen) + - Fixed advice on invalid permissions on upload path !2948 (Ludovic Perrine) + - Allows MR authors to have the source branch removed when merging the MR. !2801 (Jeroen Jacobs) + +v 8.7.6 + - Fix links on wiki pages for relative url setups. !4131 (Artem Sidorenko) + - Fix import from GitLab.com to a private instance failure. !4181 + - Fix external imports not finding the import data. !4106 + +v 8.7.5 + - Fix relative links in wiki pages. !4050 + - Fix always showing build notification message when switching between merge requests !4086 + - Fix an issue when filtering merge requests with more than one label. !3886 + - Fix short note for the default scope on build page (Takuya Noguchi) + +v 8.7.4 + - Links for Redmine issue references are generated correctly again !4048 (Benedikt Huss) + - Fix setting trusted proxies !3970 + - Fix BitBucket importer bug when throwing exceptions !3941 + - Use sign out path only if not empty !3989 + - Running rake gitlab:db:drop_tables now drops tables with cascade !4020 + - Running rake gitlab:db:drop_tables uses "IF EXISTS" as a precaution !4100 + - Use a case-insensitive comparison in sanitizing URI schemes + +v 8.7.3 + - Emails, Gitlab::Email::Message, Gitlab::Diff, and Premailer::Adapter::Nokogiri are now instrumented + - Merge request widget displays TeamCity build state and code coverage correctly again. + - Fix the line code when importing PR review comments from GitHub. !4010 + - Wikis are now initialized on legacy projects when checking repositories + - Remove animate.css in favor of a smaller subset of animations. !3937 (Connor Shea) + +v 8.7.2 + - The "New Branch" button is now loaded asynchronously + - Fix error 500 when trying to create a wiki page + - Updated spacing between notification label and button + - Label titles in filters are now escaped properly + +v 8.7.1 + - Throttle the update of `project.last_activity_at` to 1 minute. !3848 + - Fix .gitlab-ci.yml parsing issue when hidde job is a template without script definition. !3849 + - Fix license detection to detect all license files, not only known licenses. !3878 + - Use the `can?` helper instead of `current_user.can?`. !3882 + - Prevent users from deleting Webhooks via API they do not own + - Fix Error 500 due to stale cache when projects are renamed or transferred + - Update width of search box to fix Safari bug. !3900 (Jedidiah) + - Use the `can?` helper instead of `current_user.can?` + +v 8.7.0 + - Gitlab::GitAccess and Gitlab::GitAccessWiki are now instrumented + - Fix vulnerability that made it possible to gain access to private labels and milestones + - The number of InfluxDB points stored per UDP packet can now be configured + - Fix error when cross-project label reference used with non-existent project + - Transactions for /internal/allowed now have an "action" tag set + - Method instrumentation now uses Module#prepend instead of aliasing methods + - Repository.clean_old_archives is now instrumented + - Add support for environment variables on a job level in CI configuration file + - SQL query counts are now tracked per transaction + - The Projects::HousekeepingService class has extra instrumentation + - All service classes (those residing in app/services) are now instrumented + - Developers can now add custom tags to transactions + - Loading of an issue's referenced merge requests and related branches is now done asynchronously + - Enable gzip for assets, makes the page size significantly smaller. !3544 / !3632 (Connor Shea) + - Add support to cherry-pick any commit into any branch in the web interface (Minqi Pan) + - Project switcher uses new dropdown styling + - Load award emoji images separately unless opening the full picker. Saves several hundred KBs of data for most pages. (Connor Shea) + - Do not include award_emojis in issue and merge_request comment_count !3610 (Lucas Charles) + - Restrict user profiles when public visibility level is restricted. + - Add ability set due date to issues, sort and filter issues by due date (Mehmet Beydogan) + - All images in discussions and wikis now link to their source files !3464 (Connor Shea). + - Return status code 303 after a branch DELETE operation to avoid project deletion (Stan Hu) + - Add setting for customizing the list of trusted proxies !3524 + - Allow projects to be transfered to a lower visibility level group + - Fix `signed_in_ip` being set to 127.0.0.1 when using a reverse proxy !3524 + - Improved Markdown rendering performance !3389 + - Make shared runners text in box configurable + - Don't attempt to look up an avatar in repo if repo directory does not exist (Stan Hu) + - API: Ability to subscribe and unsubscribe from issues and merge requests (Robert Schilling) + - Expose project badges in project settings + - Make /profile/keys/new redirect to /profile/keys for back-compat. !3717 + - Preserve time notes/comments have been updated at when moving issue + - Make HTTP(s) label consistent on clone bar (Stan Hu) + - Add support for `after_script`, requires Runner 1.2 (Kamil Trzciński) + - Expose label description in API (Mariusz Jachimowicz) + - API: Ability to update a group (Robert Schilling) + - API: Ability to move issues (Robert Schilling) + - Fix Error 500 after renaming a project path (Stan Hu) + - Fix a bug whith trailing slash in teamcity_url (Charles May) + - Allow back dating on issues when created or updated through the API + - Allow back dating on issue notes when created through the API + - Propose license template when creating a new LICENSE file + - API: Expose /licenses and /licenses/:key + - Fix avatar stretching by providing a cropping feature + - API: Expose `subscribed` for issues and merge requests (Robert Schilling) + - Allow SAML to handle external users based on user's information !3530 + - Allow Omniauth providers to be marked as `external` !3657 + - Add endpoints to archive or unarchive a project !3372 + - Fix a bug whith trailing slash in bamboo_url + - Add links to CI setup documentation from project settings and builds pages + - Display project members page to all members + - Handle nil descriptions in Slack issue messages (Stan Hu) + - Add automated repository integrity checks (OFF by default) + - API: Expose open_issues_count, closed_issues_count, open_merge_requests_count for labels (Robert Schilling) + - API: Ability to star and unstar a project (Robert Schilling) + - Add default scope to projects to exclude projects pending deletion + - Allow to close merge requests which source projects(forks) are deleted. + - Ensure empty recipients are rejected in BuildsEmailService + - Use rugged to change HEAD in Project#change_head (P.S.V.R) + - API: Ability to filter milestones by state `active` and `closed` (Robert Schilling) + - API: Fix milestone filtering by `iid` (Robert Schilling) + - Make before_script and after_script overridable on per-job (Kamil Trzciński) + - API: Delete notes of issues, snippets, and merge requests (Robert Schilling) + - Implement 'Groups View' as an option for dashboard preferences !3379 (Elias W.) + - Better errors handling when creating milestones inside groups + - Fix high CPU usage when PostReceive receives refs/merge-requests/ + - Hide `Create a group` help block when creating a new project in a group + - Implement 'TODOs View' as an option for dashboard preferences !3379 (Elias W.) + - Allow issues and merge requests to be assigned to the author !2765 + - Make Ci::Commit to group only similar builds and make it stateful (ref, tag) + - Gracefully handle notes on deleted commits in merge requests (Stan Hu) + - Decouple membership and notifications + - Fix creation of merge requests for orphaned branches (Stan Hu) + - API: Ability to retrieve a single tag (Robert Schilling) + - While signing up, don't persist the user password across form redisplays + - Fall back to `In-Reply-To` and `References` headers when sub-addressing is not available (David Padilla) + - Remove "Congratulations!" tweet button on newly-created project. (Connor Shea) + - Fix admin/projects when using visibility levels on search (PotHix) + - Build status notifications + - Update email confirmation interface + - API: Expose user location (Robert Schilling) + - API: Do not leak group existence via return code (Robert Schilling) + - ClosingIssueExtractor regex now also works with colons. e.g. "Fixes: #1234" !3591 + - Update number of Todos in the sidebar when it's marked as "Done". !3600 + - Sanitize branch names created for confidential issues + - API: Expose 'updated_at' for issue, snippet, and merge request notes (Robert Schilling) + - API: User can leave a project through the API when not master or owner. !3613 + - Fix repository cache invalidation issue when project is recreated with an empty repo (Stan Hu) + - Fix: Allow empty recipients list for builds emails service when pushed is added (Frank Groeneveld) + - Improved markdown forms + - Diff design updates (colors, button styles, etc) + - Copying and pasting a diff no longer pastes the line numbers or +/- + - Add null check to formData when updating profile content to fix Firefox bug + - Disable spellcheck and autocorrect for username field in admin page + - Delete tags using Rugged for performance reasons (Robert Schilling) + - Add Slack notifications when Wiki is edited (Sebastian Klier) + - Diffs load at the correct point when linking from from number + - Selected diff rows highlight + - Fix emoji categories in the emoji picker + - API: Properly display annotated tags for GET /projects/:id/repository/tags (Robert Schilling) + - Add encrypted credentials for imported projects and migrate old ones + - Properly format all merge request references with ! rather than # !3740 (Ben Bodenmiller) + - Author and participants are displayed first on users autocompletion + - Show number sign on external issue reference text (Florent Baldino) + - Updated print style for issues + - Use GitHub Issue/PR number as iid to keep references + - Import GitHub labels + - Add option to filter by "Owned projects" on dashboard page + - Import GitHub milestones + - Execute system web hooks on push to the project + - Allow enable/disable push events for system hooks + - Fix GitHub project's link in the import page when provider has a custom URL + - Add RAW build trace output and button on build page + - Add incremental build trace update into CI API + +v 8.6.8 + - Prevent privilege escalation via "impersonate" feature + - Prevent privilege escalation via notes API + - Prevent privilege escalation via project webhook API + - Prevent XSS via Git branch and tag names + - Prevent XSS via custom issue tracker URL + - Prevent XSS via `window.opener` + - Prevent XSS via label drop-down + - Prevent information disclosure via milestone API + - Prevent information disclosure via snippet API + - Prevent information disclosure via project labels + - Prevent information disclosure via new merge request page + +v 8.6.7 + - Fix persistent XSS vulnerability in `commit_person_link` helper + - Fix persistent XSS vulnerability in Label and Milestone dropdowns + - Fix vulnerability that made it possible to enumerate private projects belonging to group + +v 8.6.6 + - Expire the exists cache before deletion to ensure project dir actually exists (Stan Hu). !3413 + - Fix error on language detection when repository has no HEAD (e.g., master branch) (Jeroen Bobbeldijk). !3654 + - Fix revoking of authorized OAuth applications (Connor Shea). !3690 + - Fix error on language detection when repository has no HEAD (e.g., master branch). !3654 (Jeroen Bobbeldijk) + - Issuable header is consistent between issues and merge requests + - Improved spacing in issuable header on mobile + +v 8.6.5 + - Fix importing from GitHub Enterprise. !3529 + - Perform the language detection after updating merge requests in `GitPushService`, leading to faster visual feedback for the end-user. !3533 + - Check permissions when user attempts to import members from another project. !3535 + - Only update repository language if it is not set to improve performance. !3556 + - Return status code 303 after a branch DELETE operation to avoid project deletion (Stan Hu). !3583 + - Unblock user when active_directory is disabled and it can be found !3550 + - Fix a 2FA authentication spoofing vulnerability. + +v 8.6.4 + - Don't attempt to fetch any tags from a forked repo (Stan Hu) + - Redesign the Labels page + +v 8.6.3 + - Mentions on confidential issues doesn't create todos for non-members. !3374 + - Destroy related todos when an Issue/MR is deleted. !3376 + - Fix error 500 when target is nil on todo list. !3376 + - Fix copying uploads when moving issue to another project. !3382 + - Ensuring Merge Request API returns boolean values for work_in_progress (Abhi Rao). !3432 + - Fix raw/rendered diff producing different results on merge requests. !3450 + - Fix commit comment alignment (Stan Hu). !3466 + - Fix Error 500 when searching for a comment in a project snippet. !3468 + - Allow temporary email as notification email. !3477 + - Fix issue with dropdowns not selecting values. !3478 + - Update gitlab-shell version and doc to 2.6.12. gitlab-org/gitlab-ee!280 + +v 8.6.2 + - Fix dropdown alignment. !3298 + - Fix issuable sidebar overlaps on tablet. !3299 + - Make dropdowns pixel perfect. !3337 + - Fix order of steps to prevent PostgreSQL errors when running migration. !3355 + - Fix bold text in issuable sidebar. !3358 + - Fix error with anonymous token in applications settings. !3362 + - Fix the milestone 'upcoming' filter. !3364 + !3368 + - Fix comments on confidential issues showing up in activity feed to non-members. !3375 + - Fix `NoMethodError` when visiting CI root path at `/ci`. !3377 + - Add a tooltip to new branch button in issue page. !3380 + - Fix an issue hiding the password form when signed-in with a linked account. !3381 + - Add links to CI setup documentation from project settings and builds pages. !3384 + - Fix an issue with width of project select dropdown. !3386 + - Remove redundant `require`s from Banzai files. !3391 + - Fix error 500 with cancel button on issuable edit form. !3392 + !3417 + - Fix background when editing a highlighted note. !3423 + - Remove tabstop from the WIP toggle links. !3426 + - Ensure private project snippets are not viewable by unauthorized people. + - Gracefully handle notes on deleted commits in merge requests (Stan Hu). !3402 + - Fixed issue with notification settings not saving. !3452 + +v 8.6.1 + - Add option to reload the schema before restoring a database backup. !2807 + - Display navigation controls on mobile. !3214 + - Fixed bug where participants would not work correctly on merge requests. !3329 + - Fix sorting issues by votes on the groups issues page results in SQL errors. !3333 + - Restrict notifications for confidential issues. !3334 + - Do not allow to move issue if it has not been persisted. !3340 + - Add a confirmation step before deleting an issuable. !3341 + - Fixes issue with signin button overflowing on mobile. !3342 + - Auto collapses the navigation sidebar when resizing. !3343 + - Fix build dependencies, when the dependency is a string. !3344 + - Shows error messages when trying to create label in dropdown menu. !3345 + - Fixes issue with assign milestone not loading milestone list. !3346 + - Fix an issue causing the Dashboard/Milestones page to be blank. !3348 + +v 8.6.0 + - Add ability to move issue to another project + - Prevent tokens in the import URL to be showed by the UI + - Fix bug where wrong commit ID was being used in a merge request diff to show old image (Stan Hu) + - Add confidential issues + - Bump gitlab_git to 9.0.3 (Stan Hu) + - Fix diff image view modes (2-up, swipe, onion skin) not working (Stan Hu) + - Support Golang subpackage fetching (Stan Hu) + - Bump Capybara gem to 2.6.2 (Stan Hu) + - New branch button appears on issues where applicable - Contributions to forked projects are included in calendar - Improve the formatting for the user page bio (Connor Shea) + - Easily (un)mark merge request as WIP using link + - Use specialized system notes when MR is (un)marked as WIP + - Removed the default password from the initial admin account created during + setup. A password can be provided during setup (see installation docs), or + GitLab will ask the user to create a new one upon first visit. - Fix issue when pushing to projects ending in .wiki - - Fix avatar stretching by providing a cropping feature (Johann Pardanaud) + - Properly display YAML front matter in Markdown + - Add support for wiki with UTF-8 page names (Hiroyuki Sato) + - Fix wiki search results point to raw source (Hiroyuki Sato) - Don't load all of GitLab in mail_room + - Add information about `image` and `services` field at `job` level in the `.gitlab-ci.yml` documentation (Pat Turner) + - HTTP error pages work independently from location and config (Artem Sidorenko) + - Update `omniauth-saml` to 1.5.0 to allow for custom response attributes to be set + - Memoize @group in Admin::GroupsController (Yatish Mehta) + - Indicate how much an MR diverged from the target branch (Pierre de La Morinerie) + - Added omniauth-auth0 Gem (Daniel Carraro) + - Add label description in tooltip to labels in issue index and sidebar - Strip leading and trailing spaces in URL validator (evuez) + - Add "last_sign_in_at" and "confirmed_at" to GET /users/* API endpoints for admins (evuez) - Return empty array instead of 404 when commit has no statuses in commit status API + - Decrease the font size and the padding of the `.anchor` icons used in the README (Roberto Dip) + - Rewrite logo to simplify SVG code (Sean Lang) + - Allow to use YAML anchors when parsing the `.gitlab-ci.yml` (Pascal Bach) + - Ignore jobs that start with `.` (hidden jobs) + - Hide builds from project's settings when the feature is disabled + - Allow to pass name of created artifacts archive in `.gitlab-ci.yml` + - Refactor and greatly improve search performance + - Add support for cross-project label references + - Ensure "new SSH key" email do not ends up as dead Sidekiq jobs - Update documentation to reflect Guest role not being enforced on internal projects - Allow search for logged out users + - Allow to define on which builds the current one depends on + - Allow user subscription to a label: get notified for issues/merge requests related to that label (Timothy Andrew) + - Fix bug where Bitbucket `closed` issues were imported as `opened` (Iuri de Silvio) - Don't show Issues/MRs from archived projects in Groups view + - Fix wrong "iid of max iid" in Issuable sidebar for some merged MRs + - Fix empty source_sha on Merge Request when there is no diff (Pierre de La Morinerie) - Increase the notes polling timeout over time (Roberto Dip) - Add shortcut to toggle markdown preview (Florent Baldino) - Show labels in dashboard and group milestone views + - Fix an issue when the target branch of a MR had been deleted - Add main language of a project in the list of projects (Tiago Botelho) + - Add #upcoming filter to Milestone filter (Tiago Botelho) - Add ability to show archived projects on dashboard, explore and group pages + - Remove fork link closes all merge requests opened on source project (Florent Baldino) + - Move group activity to separate page + - Create external users which are excluded of internal and private projects unless access was explicitly granted + - Continue parameters are checked to ensure redirection goes to the same instance + - User deletion is now done in the background so the request can not time out + - Canceled builds are now ignored in compound build status if marked as `allowed to fail` + - Trigger a todo for mentions on commits page + - Let project owners and admins soft delete issues and merge requests + +v 8.5.12 + - Prevent privilege escalation via "impersonate" feature + - Prevent privilege escalation via notes API + - Prevent privilege escalation via project webhook API + - Prevent XSS via Git branch and tag names + - Prevent XSS via custom issue tracker URL + - Prevent XSS via `window.opener` + - Prevent information disclosure via snippet API + - Prevent information disclosure via project labels + - Prevent information disclosure via new merge request page + +v 8.5.11 + - Fix persistent XSS vulnerability in `commit_person_link` helper + +v 8.5.10 + - Fix a 2FA authentication spoofing vulnerability. + +v 8.5.9 + - Don't attempt to fetch any tags from a forked repo (Stan Hu). v 8.5.8 - Bump Git version requirement to 2.7.4 @@ -37,6 +444,10 @@ v 8.5.4 v 8.5.3 - Flush repository caches before renaming projects + - Sort starred projects on dashboard based on last activity by default + - Show commit message in JIRA mention comment + - Makes issue page and merge request page usable on mobile browsers. + - Improved UI for profile settings v 8.5.2 - Fix sidebar overlapping content when screen width was below 1200px @@ -72,11 +483,13 @@ v 8.5.1 - Changed padding & background color for highlighted notes - Re-add the newrelic_rpm gem which was removed without any deprecation or warning (Stan Hu) - Update sentry-raven gem to 0.15.6 + - Add build coverage in project's builds page (Steffen Köhler) + - Changed # to ! for merge requests in activity view v 8.5.0 - Fix duplicate "me" in tooltip of the "thumbsup" awards Emoji (Stan Hu) - - Cache various Repository methods to improve performance (Yorick Peterse) - - Fix duplicated branch creation/deletion Web hooks/service notifications when using Web UI (Stan Hu) + - Cache various Repository methods to improve performance + - Fix duplicated branch creation/deletion Webhooks/service notifications when using Web UI (Stan Hu) - Ensure rake tasks that don't need a DB connection can be run without one - Update New Relic gem to 3.14.1.311 (Stan Hu) - Add "visibility" flag to GET /projects api endpoint @@ -152,6 +565,32 @@ v 8.5.0 - Show label row when filtering issues or merge requests by label (Nuttanart Pornprasitsakul) - Add Todos +v 8.4.10 + - Prevent privilege escalation via "impersonate" feature + - Prevent privilege escalation via notes API + - Prevent privilege escalation via project webhook API + - Prevent XSS via Git branch and tag names + - Prevent XSS via custom issue tracker URL + - Prevent XSS via `window.opener` + - Prevent information disclosure via snippet API + - Prevent information disclosure via project labels + - Prevent information disclosure via new merge request page + +v 8.4.9 + - Fix persistent XSS vulnerability in `commit_person_link` helper + +v 8.4.8 + - Fix a 2FA authentication spoofing vulnerability. + +v 8.4.7 + - Don't attempt to fetch any tags from a forked repo (Stan Hu). + +v 8.4.6 + - Bump Git version requirement to 2.7.4 + +v 8.4.5 + - No CE-specific changes + v 8.4.4 - Update omniauth-saml gem to 1.4.2 - Prevent long-running backup tasks from timing out the database connection @@ -206,7 +645,7 @@ v 8.4.0 - Add housekeeping function to project settings page - The default GitLab logo now acts as a loading indicator - Fix caching issue where build status was not updating in project dashboard (Stan Hu) - - Accept 2xx status codes for successful Web hook triggers (Stan Hu) + - Accept 2xx status codes for successful Webhook triggers (Stan Hu) - Fix missing date of month in network graph when commits span a month (Stan Hu) - Expire view caches when application settings change (e.g. Gravatar disabled) (Stan Hu) - Don't notify users twice if they are both project watchers and subscribers (Stan Hu) @@ -262,6 +701,27 @@ v 8.4.0 - Add IP check against DNSBLs at account sign-up - Added cache:key to .gitlab-ci.yml allowing to fine tune the caching +v 8.3.9 + - Prevent privilege escalation via "impersonate" feature + - Prevent privilege escalation via notes API + - Prevent privilege escalation via project webhook API + - Prevent XSS via custom issue tracker URL + - Prevent XSS via `window.opener` + - Prevent information disclosure via project labels + - Prevent information disclosure via new merge request page + +v 8.3.8 + - Fix persistent XSS vulnerability in `commit_person_link` helper + +v 8.3.7 + - Fix a 2FA authentication spoofing vulnerability. + +v 8.3.6 + - Don't attempt to fetch any tags from a forked repo (Stan Hu). + +v 8.3.5 + - Bump Git version requirement to 2.7.4 + v 8.3.4 - Use gitlab-workhorse 0.5.4 (fixes API routing bug) @@ -306,7 +766,7 @@ v 8.3.0 - 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) + - Handle and report SSL errors in Webhook 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) - WIP identifier on merge requests no longer requires trailing space @@ -359,6 +819,17 @@ v 8.3.0 - Expose Git's version in the admin area - Show "New Merge Request" buttons on canonical repos when you have a fork (Josh Frye) +v 8.2.5 + - Prevent privilege escalation via "impersonate" feature + - Prevent privilege escalation via notes API + - Prevent privilege escalation via project webhook API + - Prevent XSS via `window.opener` + - Prevent information disclosure via project labels + - Prevent information disclosure via new merge request page + +v 8.2.4 + - Bump Git version requirement to 2.7.4 + 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) @@ -454,7 +925,7 @@ v 8.1.3 - Use issue editor as cross reference comment author when issue is edited with a new mention - Add Facebook authentication -v 8.1.2 +v 8.1.1 - Fix cloning Wiki repositories via HTTP (Stan Hu) - Add migration to remove satellites directory - Fix specific runners visibility @@ -526,7 +997,7 @@ v 8.1.0 - Ensure code blocks are properly highlighted after a note is updated - Fix wrong access level badge on MR comments - Hide password in the service settings form - - Move CI web hooks page to project settings area + - Move CI webhooks page to project settings area - Fix User Identities API. It now allows you to properly create or update user's identities. - Add user preference to change layout width (Peter Göbel) - Use commit status in merge request widget as preferred source of CI status @@ -569,7 +1040,7 @@ v 8.0.3 - Fix URL shown in Slack notifications - Fix bug where projects would appear to be stuck in the forked import state (Stan Hu) - Fix Error 500 in creating merge requests with > 1000 diffs (Stan Hu) - - Add work_in_progress key to MR web hooks (Ben Boeckel) + - Add work_in_progress key to MR webhooks (Ben Boeckel) v 8.0.2 - Fix default avatar not rendering in network graph (Stan Hu) @@ -860,7 +1331,7 @@ v 7.12.0 - Fix milestone "Browse Issues" button. - Set milestone on new issue when creating issue from index with milestone filter active. - Make namespace API available to all users (Stan Hu) - - Add web hook support for note events (Stan Hu) + - Add webhook support for note events (Stan Hu) - Disable "New Issue" and "New Merge Request" buttons when features are disabled in project settings (Stan Hu) - Remove Rack Attack monkey patches and bump to version 4.3.0 (Stan Hu) - Fix clone URL losing selection after a single click in Safari and Chrome (Stan Hu) @@ -967,7 +1438,7 @@ v 7.11.0 - Add "Create Merge Request" buttons to commits and branches pages and push event. - Show user roles by comments. - Fix automatic blocking of auto-created users from Active Directory. - - Call merge request web hook for each new commits (Arthur Gautier) + - Call merge request webhook for each new commits (Arthur Gautier) - Use SIGKILL by default in Sidekiq::MemoryKiller - Fix mentioning of private groups. - Add style for element in markdown @@ -1079,20 +1550,17 @@ v 7.10.0 - Fix stuck Merge Request merging events from old installations (Ben Bodenmiller) - Fix merge request comments on files with multiple commits - Fix Resource Owner Password Authentication Flow - -v 7.9.4 - - Security: Fix project import URL regex to prevent arbitary local repos from being imported - - Fixed issue where only 25 commits would load in file listings - - Fix LDAP identities after config update - -v 7.9.3 - - Contains no changes - Add icons to Add dropdown items. - Allow admin to create public deploy keys that are accessible to any project. - Warn when gitlab-shell version doesn't match requirement. - Skip email confirmation when set by admin or via LDAP. - Only allow users to reference groups, projects, issues, MRs, commits they have access to. +v 7.9.4 + - Security: Fix project import URL regex to prevent arbitary local repos from being imported + - Fixed issue where only 25 commits would load in file listings + - Fix LDAP identities after config update + v 7.9.3 - Contains no changes @@ -1141,7 +1609,7 @@ v 7.9.0 - Add brakeman (security scanner for Ruby on Rails) - Slack username and channel options - Add grouped milestones from all projects to dashboard. - - Web hook sends pusher email as well as commiter + - Webhook sends pusher email as well as commiter - Add Bitbucket omniauth provider. - Add Bitbucket importer. - Support referencing issues to a project whose name starts with a digit @@ -1264,7 +1732,7 @@ v 7.8.0 - Allow notification email to be set separately from primary email. - API: Add support for editing an existing project (Mika Mäenpää and Hannes Rosenögger) - Don't have Markdown preview fail for long comments/wiki pages. - - When test web hook - show error message instead of 500 error page if connection to hook url was reset + - When test webhook - show error message instead of 500 error page if connection to hook url was reset - Added support for firing system hooks on group create/destroy and adding/removing users to group (Boyan Tabakov) - Added persistent collapse button for left side nav bar (Jason Blanchard) - Prevent losing unsaved comments by automatically restoring them when comment page is loaded again. @@ -1281,7 +1749,7 @@ v 7.8.0 - Show projects user contributed to on user page. Show stars near project on user page. - Improve database performance for GitLab - Add Asana service (Jeremy Benoist) - - Improve project web hooks with extra data + - Improve project webhooks with extra data v 7.7.2 - Update GitLab Shell to version 2.4.2 that fixes a bug when developers can push to protected branch @@ -1766,7 +2234,7 @@ v 6.4.0 - Side-by-side diff view (Steven Thonus) - Internal projects (Jason Hollingsworth) - Allow removal of avatar (Drew Blessing) - - Project web hooks now support issues and merge request events + - Project webhooks now support issues and merge request events - Visiting project page while not logged in will redirect to sign-in instead of 404 (Jason Hollingsworth) - Expire event cache on avatar creation/removal (Drew Blessing) - Archiving old projects (Steven Thonus) @@ -1836,7 +2304,7 @@ v 6.2.0 - Added search for projects by name to api (Izaak Alpert) - Make default user theme configurable (Izaak Alpert) - Update logic for validates_merge_request for tree of MR (Andrew Kumanyaev) - - Rake tasks for web hooks management (Jonhnny Weslley) + - Rake tasks for webhooks management (Jonhnny Weslley) - Extended User API to expose admin and can_create_group for user creation/updating (Boyan Tabakov) - API: Remove group - API: Remove project @@ -2039,7 +2507,7 @@ v 4.2.0 - Async gitolite calls - added satellites logs - can_create_group, can_create_team booleans for User - - Process web hooks async + - Process webhooks async - GFM: Fix images escaped inside links - Network graph improved - Switchable branches for network graph @@ -2073,7 +2541,7 @@ v 4.1.0 v 4.0.0 - Remove project code and path from API. Use id instead - - Return valid cloneable url to repo for web hook + - Return valid cloneable url to repo for webhook - Fixed backup issue - Reorganized settings - Fixed commits compare diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c4522998f4..9fe4cf7b0f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,24 +3,28 @@ **Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - [Contribute to GitLab](#contribute-to-gitlab) - - [Contributor license agreement](#contributor-license-agreement) - - [Security vulnerability disclosure](#security-vulnerability-disclosure) - - [Closing policy for issues and merge requests](#closing-policy-for-issues-and-merge-requests) - - [Helping others](#helping-others) - - [I want to contribute!](#i-want-to-contribute) - - [Issue tracker](#issue-tracker) - - [Feature proposals](#feature-proposals) - - [Issue tracker guidelines](#issue-tracker-guidelines) - - [Issue weight](#issue-weight) - - [Regression issues](#regression-issues) - - [Merge requests](#merge-requests) - - [Merge request guidelines](#merge-request-guidelines) - - [Merge request description format](#merge-request-description-format) - - [Contribution acceptance criteria](#contribution-acceptance-criteria) - - [Changes for Stable Releases](#changes-for-stable-releases) - - [Definition of done](#definition-of-done) - - [Style guides](#style-guides) - - [Code of conduct](#code-of-conduct) + - [Contributor license agreement](#contributor-license-agreement) + - [Security vulnerability disclosure](#security-vulnerability-disclosure) + - [Closing policy for issues and merge requests](#closing-policy-for-issues-and-merge-requests) + - [Helping others](#helping-others) + - [I want to contribute!](#i-want-to-contribute) + - [Implement design & UI elements](#implement-design-ui-elements) + - [Design reference](#design-reference) + - [UI development kit](#ui-development-kit) + - [Issue tracker](#issue-tracker) + - [Feature proposals](#feature-proposals) + - [Issue tracker guidelines](#issue-tracker-guidelines) + - [Issue weight](#issue-weight) + - [Regression issues](#regression-issues) + - [Technical debt](#technical-debt) + - [Merge requests](#merge-requests) + - [Merge request guidelines](#merge-request-guidelines) + - [Merge request description format](#merge-request-description-format) + - [Contribution acceptance criteria](#contribution-acceptance-criteria) + - [Changes for Stable Releases](#changes-for-stable-releases) + - [Definition of done](#definition-of-done) + - [Style guides](#style-guides) + - [Code of conduct](#code-of-conduct) @@ -34,7 +38,7 @@ 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][] +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 @@ -68,10 +72,10 @@ for audiences of all ages. ## Helping others Please help other GitLab users when you can. The channels people will reach out -on can be found on the [getting help page][]. +on can be found on the [getting help page][getting-help]. 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 +respond in the IRC channel. You can also sign up on [CodeTriage][codetriage] to help with the remaining issues on the GitHub issue tracker. ## I want to contribute! @@ -83,6 +87,22 @@ GitLab. This was inspired by [an article by Kent C. Dodds][medium-up-for-grabs]. +## Implement design & UI elements + +### Design reference + +The GitLab design reference can be found in the [gitlab-design] project. +The designs are made using Antetype (`.atype` files). You can use the +[free Antetype viewer (Mac OSX only)] or grab an exported PNG from the design +(the PNG is 1:1). + +The current designs can be found in the [`gitlab1.atype` file]. + +### UI development kit + +Implemented UI elements can also be found at https://gitlab.com/help/ui. Please +note that this page isn't comprehensive at this time. + ## Issue tracker To get support for your particular problem please use the @@ -115,12 +135,23 @@ For feature proposals for EE, open an issue on the 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. +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 or add the following +code snippet right after your description in a new line: `~"feature proposal"`. Please keep feature proposals as small and simple as possible, complex ones might be edited to make them small and simple. +You are encouraged to use the template below for feature proposals. + +``` +## Description including problem, use cases, benefits, and/or goals + +## Proposal + +## Links / references +``` + 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. @@ -223,6 +254,28 @@ addressed. [8.3 Regressions]: https://gitlab.com/gitlab-org/gitlab-ce/issues/4127 [update the notes]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/pro-tips.md#update-the-regression-issue +### Technical debt + +In order to track things that can be improved in GitLab's codebase, we created +the ~"technical debt" label in [GitLab's issue tracker][ce-tracker]. + +This label should be added to issues that describe things that can be improved, +shortcuts that have been taken, code that needs refactoring, features that need +additional attention, and all other things that have been left behind due to +high velocity of development. + +Everyone can create an issue, though you may need to ask for adding a specific +label, if you do not have permissions to do it by yourself. Additional labels +can be combined with the `technical debt` label, to make it easier to schedule +the improvements for a release. + +Issues tagged with the `technical debt` label have the same priority like issues +that describe a new feature to be introduced in GitLab, and should be scheduled +for a release by the appropriate person. + +Make sure to mention the merge request that the `technical debt` issue is +associated with in the description of the issue. + ## Merge requests We welcome merge requests with fixes and improvements to GitLab code, tests, @@ -281,6 +334,7 @@ request is as follows: [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). +1. When writing commit messages please follow [these](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) [guidelines](http://chris.beams.io/posts/git-commit/). The **official merge window** is in the beginning of the month from the 1st to the 7th day of the month. This is the best time to submit an MR and get @@ -299,13 +353,13 @@ 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][]. If you would like quick feedback on your merge -request feel free to mention one of the Merge Marshalls of the [core team][]. +[closed merge requests][closed-merge-requests]. If you would like quick feedback +on your merge request feel free to mention one of the Merge Marshalls in the +[core team] or one of the [Merge request coaches](https://about.gitlab.com/team/). Please ensure that your merge request meets the contribution acceptance criteria. When having your code reviewed and when reviewing merge requests please take the -[thoughtbot code review guidelines](https://github.com/thoughtbot/guides/tree/master/code-review) -into account. +[code review guidelines](doc/development/code_review.md) into account. ### Merge request description format @@ -343,7 +397,8 @@ description area. Copy-paste it to retain the markdown format. 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. 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 or settings options since they complicate + making and testing future changes 1. Changes after submitting the merge request should be in separate commits (no squashing). If necessary, you will be asked to squash when the review is over, before merging. @@ -369,7 +424,7 @@ Like all merge requests the target should be master so all bugfixes are in maste ## Definition of done If you contribute to GitLab please know that changes involve more than just -code. We have the following [definition of done][]. Please ensure you support +code. We have the following [definition of done][definition-of-done]. Please ensure you support the feature you contribute through all of these steps. 1. Description explaining the relevancy (see following item) @@ -404,8 +459,9 @@ merge request: - multi-line method chaining style **Option B**: dot `.` on previous line - string literal quoting style **Option A**: single quoted by default 1. [Rails](https://github.com/bbatsov/rails-style-guide) -1. [Testing](https://github.com/thoughtbot/guides/tree/master/style/testing) +1. [Testing](doc/development/testing.md) 1. [CoffeeScript](https://github.com/thoughtbot/guides/tree/master/style/coffeescript) +1. [SCSS styleguide][scss-styleguide] 1. [Shell commands](doc/development/shell_commands.md) created by GitLab contributors to enhance security 1. [Database Migrations](doc/development/migration_style_guide.md) @@ -448,12 +504,12 @@ 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`. -This Code of Conduct is adapted from the [Contributor Covenant][], version 1.1.0, +This Code of Conduct is adapted from the [Contributor Covenant][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 +[core team]: https://about.gitlab.com/core-team/ +[getting-help]: 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 @@ -467,9 +523,13 @@ available at [http://contributor-covenant.org/version/1/1/0/](http://contributor [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 +[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 [doc-styleguide]: doc/development/doc_styleguide.md "Documentation styleguide" +[scss-styleguide]: doc/development/scss_styleguide.md "SCSS styleguide" +[gitlab-design]: https://gitlab.com/gitlab-org/gitlab-design +[free Antetype viewer (Mac OSX only)]: https://itunes.apple.com/us/app/antetype-viewer/id824152298?mt=12 +[`gitlab1.atype` file]: https://gitlab.com/gitlab-org/gitlab-design/tree/master/gitlab1.atype/ diff --git a/GITLAB_SHELL_VERSION b/GITLAB_SHELL_VERSION index a04abec914..37c2961c24 100644 --- a/GITLAB_SHELL_VERSION +++ b/GITLAB_SHELL_VERSION @@ -1 +1 @@ -2.6.10 +2.7.2 diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION index d2b13eb644..39e898a4f9 100644 --- a/GITLAB_WORKHORSE_VERSION +++ b/GITLAB_WORKHORSE_VERSION @@ -1 +1 @@ -0.6.4 +0.7.1 diff --git a/Gemfile b/Gemfile index db0e7d9766..91ad1706a0 100644 --- a/Gemfile +++ b/Gemfile @@ -1,14 +1,14 @@ source "https://rubygems.org" -gem 'rails', '4.2.5.2' +gem 'rails', '4.2.6' 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 -# See https://groups.google.com/forum/#!topic/rubyonrails-security/doAVp0YaTqY -gem 'sprockets', '~> 2.12.3' +# Specify a sprockets version due to increased performance +# See https://gitlab.com/gitlab-org/gitlab-ce/issues/6069 +gem 'sprockets', '~> 3.6.0' # Default values for AR models gem "default_value_for", "~> 3.0.0" @@ -19,9 +19,10 @@ gem "pg", '~> 0.18.2', group: :postgres # Authentication libraries gem 'devise', '~> 3.5.4' +gem 'doorkeeper', '~> 3.1' gem 'devise-async', '~> 0.9.0' -gem 'doorkeeper', '~> 2.2.0' gem 'omniauth', '~> 1.3.1' +gem 'omniauth-auth0', '~> 1.4.1' gem 'omniauth-azure-oauth2', '~> 0.0.6' gem 'omniauth-bitbucket', '~> 0.0.2' gem 'omniauth-cas3', '~> 1.1.2' @@ -30,11 +31,12 @@ gem 'omniauth-github', '~> 1.1.1' gem 'omniauth-gitlab', '~> 1.0.0' gem 'omniauth-google-oauth2', '~> 0.2.0' gem 'omniauth-kerberos', '~> 0.3.0', group: :kerberos -gem 'omniauth-saml', '~> 1.4.2' +gem 'omniauth-saml', '~> 1.5.0' gem 'omniauth-shibboleth', '~> 1.2.0' gem 'omniauth-twitter', '~> 1.2.0' gem 'omniauth_crowd', '~> 2.2.0' gem 'rack-oauth2', '~> 1.2.1' +gem 'jwt' # Spam and anti-bot protection gem 'recaptcha', require: 'recaptcha/rails' @@ -50,7 +52,7 @@ gem "browser", '~> 1.0.0' # Extracting information from a git repository # Provide access to Gitlab::Git library -gem "gitlab_git", '~> 8.2' +gem "gitlab_git", '~> 10.0' # LDAP Auth # GitLab fork with several improvements to original library. For full list of changes @@ -58,7 +60,9 @@ gem "gitlab_git", '~> 8.2' gem 'gitlab_omniauth-ldap', '~> 1.2.1', require: "omniauth-ldap" # Git Wiki -gem 'gollum-lib', '~> 4.1.0' +# Required manually in config/initializers/gollum.rb to control load order +gem 'gollum-lib', '~> 4.1.0', require: false +gem 'gollum-rugged_adapter', '~> 0.4.2', require: false # Language detection gem "github-linguist", "~> 4.7.0", require: "linguist" @@ -75,7 +79,7 @@ gem "kaminari", "~> 0.16.3" gem "haml-rails", '~> 0.9.0' # Files attachments -gem "carrierwave", '~> 0.9.0' +gem "carrierwave", '~> 0.10.0' # Drag and Drop UI gem 'dropzonejs-rails', '~> 0.7.1' @@ -112,7 +116,7 @@ gem 'diffy', '~> 3.0.3' # Application server group :unicorn do - gem "unicorn", '~> 4.8.2' + gem "unicorn", '~> 4.9.0' gem 'unicorn-worker-killer', '~> 0.4.2' end @@ -146,6 +150,10 @@ gem 'version_sorter', '~> 2.0.0' # Cache gem "redis-rails", '~> 4.0.0' +# Redis +gem 'redis', '~> 3.2' +gem 'connection_pool', '~> 2.0' + # Campfire integration gem 'tinder', '~> 1.10.0' @@ -171,7 +179,7 @@ gem 'ruby-fogbugz', '~> 0.2.1' gem 'd3_rails', '~> 3.5.0' #cal-heatmap -gem 'cal-heatmap-rails', '~> 3.5.0' +gem 'cal-heatmap-rails', '~> 3.6.0' # underscore-rails gem "underscore-rails", "~> 1.8.0" @@ -183,11 +191,14 @@ gem 'babosa', '~> 1.0.2' # Sanitizes SVG input gem "loofah", "~> 2.0.3" +# Working with license +gem 'licensee', '~> 8.0.0' + # Protect against bruteforcing gem "rack-attack", '~> 4.3.1' # Ace editor -gem 'ace-rails-ap', '~> 2.0.1' +gem 'ace-rails-ap', '~> 4.0.2' # Keyboard shortcuts gem 'mousetrap-rails', '~> 1.4.6' @@ -207,33 +218,32 @@ gem 'font-awesome-rails', '~> 4.2' gem 'gitlab_emoji', '~> 0.3.0' gem 'gon', '~> 6.0.1' gem 'jquery-atwho-rails', '~> 1.3.2' -gem 'jquery-rails', '~> 4.0.0' -gem 'jquery-scrollto-rails', '~> 1.4.3' +gem 'jquery-rails', '~> 4.1.0' gem 'jquery-ui-rails', '~> 5.0.0' -gem 'nprogress-rails', '~> 0.1.6.7' gem 'raphael-rails', '~> 2.1.2' -gem 'request_store', '~> 1.2.0' +gem 'request_store', '~> 1.3.0' gem 'select2-rails', '~> 3.5.9' gem 'virtus', '~> 1.0.1' gem 'net-ssh', '~> 3.0.1' +gem 'base32', '~> 0.3.0' # Sentry integration gem 'sentry-raven', '~> 0.15' +gem 'premailer-rails', '~> 1.9.0' + # Metrics group :metrics do gem 'allocations', '~> 1.0', require: false, platform: :mri gem 'method_source', '~> 0.8', require: false gem 'influxdb', '~> 0.2', require: false - gem 'connection_pool', '~> 2.0', require: false end group :development do gem "foreman" - gem 'brakeman', '~> 3.1.0', require: false + gem 'brakeman', '~> 3.2.0', require: false - gem "annotate", "~> 2.6.0" - gem "letter_opener", '~> 1.1.2' + gem 'letter_opener_web', '~> 1.3.0' gem 'quiet_assets', '~> 1.0.2' gem 'rerun', '~> 0.11.0' gem 'bullet', require: false @@ -258,10 +268,12 @@ group :development, :test do gem 'awesome_print', '~> 1.2.0', require: false gem 'fuubar', '~> 2.0.0' - gem 'database_cleaner', '~> 1.4.0' - gem 'factory_girl_rails', '~> 4.3.0' - gem 'rspec-rails', '~> 3.3.0' - gem 'spinach-rails', '~> 0.2.1' + gem 'database_cleaner', '~> 1.4.0' + gem 'factory_girl_rails', '~> 4.6.0' + gem 'rspec-rails', '~> 3.4.0' + gem 'rspec-retry' + gem 'spinach-rails', '~> 0.2.1' + gem 'spinach-rerun-reporter', '~> 0.0.2' # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826) gem 'minitest', '~> 5.7.0' @@ -269,21 +281,22 @@ group :development, :test do # Generate Fake data gem 'ffaker', '~> 2.0.0' - gem 'capybara', '~> 2.4.0' + gem 'capybara', '~> 2.6.2' gem 'capybara-screenshot', '~> 1.0.0' - gem 'poltergeist', '~> 1.8.1' + gem 'poltergeist', '~> 1.9.0' - gem 'teaspoon', '~> 1.0.0' + gem 'teaspoon', '~> 1.1.0' gem 'teaspoon-jasmine', '~> 2.2.0' - gem 'spring', '~> 1.3.6' + gem 'spring', '~> 1.7.0' gem 'spring-commands-rspec', '~> 1.0.4' - gem 'spring-commands-spinach', '~> 1.0.0' + gem 'spring-commands-spinach', '~> 1.1.0' gem 'spring-commands-teaspoon', '~> 0.0.2' - gem 'rubocop', '~> 0.35.0', require: false + gem 'rubocop', '~> 0.38.0', require: false + gem 'scss_lint', '~> 0.47.0', require: false gem 'coveralls', '~> 0.8.2', require: false - gem 'simplecov', '~> 0.10.0', require: false + gem 'simplecov', '~> 0.11.0', require: false gem 'flog', require: false gem 'flay', require: false gem 'bundler-audit', require: false @@ -305,14 +318,13 @@ end gem "newrelic_rpm", '~> 3.14' -gem 'octokit', '~> 3.8.0' +gem 'octokit', '~> 4.3.0' -gem "mail_room", "~> 0.6.1" +gem "mail_room", "~> 0.7" gem 'email_reply_parser', '~> 0.5.8' ## CI -gem 'activerecord-deprecated_finders', '~> 1.0.3' gem 'activerecord-session_store', '~> 0.1.0' gem "nested_form", '~> 0.3.2' @@ -321,3 +333,6 @@ gem 'oauth2', '~> 1.0.0' # Soft deletion gem "paranoia", "~> 2.0" + +# Health check +gem 'health_check', '~> 1.5.1' diff --git a/Gemfile.lock b/Gemfile.lock index 946842b4e2..b55764504c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,42 +3,41 @@ GEM specs: CFPropertyList (2.3.2) RedCloth (4.2.9) - ace-rails-ap (2.0.1) - actionmailer (4.2.5.2) - actionpack (= 4.2.5.2) - actionview (= 4.2.5.2) - activejob (= 4.2.5.2) + ace-rails-ap (4.0.2) + actionmailer (4.2.6) + actionpack (= 4.2.6) + actionview (= 4.2.6) + activejob (= 4.2.6) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 1.0, >= 1.0.5) - actionpack (4.2.5.2) - actionview (= 4.2.5.2) - activesupport (= 4.2.5.2) + actionpack (4.2.6) + actionview (= 4.2.6) + activesupport (= 4.2.6) rack (~> 1.6) rack-test (~> 0.6.2) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (4.2.5.2) - activesupport (= 4.2.5.2) + actionview (4.2.6) + activesupport (= 4.2.6) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 1.0, >= 1.0.5) rails-html-sanitizer (~> 1.0, >= 1.0.2) - activejob (4.2.5.2) - activesupport (= 4.2.5.2) + activejob (4.2.6) + activesupport (= 4.2.6) globalid (>= 0.3.0) - activemodel (4.2.5.2) - activesupport (= 4.2.5.2) + activemodel (4.2.6) + activesupport (= 4.2.6) builder (~> 3.1) - activerecord (4.2.5.2) - activemodel (= 4.2.5.2) - activesupport (= 4.2.5.2) + activerecord (4.2.6) + activemodel (= 4.2.6) + activesupport (= 4.2.6) arel (~> 6.0) - activerecord-deprecated_finders (1.0.4) activerecord-session_store (0.1.2) actionpack (>= 4.0.0, < 5) activerecord (>= 4.0.0, < 5) railties (>= 4.0.0, < 5) - activesupport (4.2.5.2) + activesupport (4.2.6) i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) @@ -51,9 +50,6 @@ GEM activerecord (>= 3.0) akismet (2.0.0) allocations (1.0.4) - annotate (2.6.10) - activerecord (>= 3.2, <= 4.3) - rake (~> 10.4) arel (6.0.3) asana (0.4.0) faraday (~> 0.9) @@ -61,9 +57,7 @@ GEM faraday_middleware-multi_json (~> 0.0) oauth2 (~> 1.0) asciidoctor (1.5.3) - ast (2.1.0) - astrolabe (1.3.1) - parser (~> 2.2) + ast (2.2.0) attr_encrypted (1.3.4) encryptor (>= 1.3.0) attr_required (1.0.0) @@ -76,6 +70,7 @@ GEM ice_nine (~> 0.11.0) thread_safe (~> 0.3, >= 0.3.1) babosa (1.0.2) + base32 (0.3.2) bcrypt (3.1.10) benchmark-ips (2.3.0) better_errors (1.0.1) @@ -86,29 +81,28 @@ GEM bootstrap-sass (3.3.6) autoprefixer-rails (>= 5.2.1) sass (>= 3.3.4) - brakeman (3.1.4) + brakeman (3.2.1) erubis (~> 2.6) - fastercsv (~> 1.5) haml (>= 3.0, < 5.0) highline (>= 1.6.20, < 2.0) - multi_json (~> 1.2) - ruby2ruby (>= 2.1.1, < 2.3.0) - ruby_parser (~> 3.7.0) + ruby2ruby (~> 2.3.0) + ruby_parser (~> 3.8.1) safe_yaml (>= 1.0) sass (~> 3.0) slim (>= 1.3.6, < 4.0) terminal-table (~> 1.4) browser (1.0.1) builder (3.2.2) - bullet (4.14.10) + bullet (5.0.0) activesupport (>= 3.0.0) uniform_notifier (~> 1.9.0) - bundler-audit (0.4.0) + bundler-audit (0.5.0) bundler (~> 1.2) thor (~> 0.18) byebug (8.2.1) - cal-heatmap-rails (3.5.1) - capybara (2.4.4) + cal-heatmap-rails (3.6.0) + capybara (2.6.2) + addressable mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) @@ -117,10 +111,11 @@ GEM capybara-screenshot (1.0.11) capybara (>= 1.0, < 3) launchy - carrierwave (0.9.0) + carrierwave (0.10.0) activemodel (>= 3.2.0) activesupport (>= 3.2.0) json (>= 1.7) + mime-types (>= 1.16) cause (0.1) charlock_holmes (0.7.3) chunky_png (1.3.5) @@ -128,26 +123,27 @@ GEM coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) - coffee-rails (4.1.0) + coffee-rails (4.1.1) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.0) + railties (>= 4.0.0, < 5.1.x) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.10.0) colorize (0.7.7) - concurrent-ruby (1.0.0) + concurrent-ruby (1.0.2) connection_pool (2.2.0) - coveralls (0.8.9) + coveralls (0.8.13) json (~> 1.8) - rest-client (>= 1.6.8, < 2) - simplecov (~> 0.10.0) + simplecov (~> 0.11.0) term-ansicolor (~> 1.3) thor (~> 0.19.1) tins (~> 1.6.0) crack (0.4.3) safe_yaml (~> 1.0.0) creole (0.5.0) + css_parser (1.4.1) + addressable d3_rails (3.5.11) railties (>= 3.1.0) daemons (1.2.3) @@ -176,9 +172,7 @@ GEM diff-lcs (1.2.5) diffy (3.0.7) docile (1.1.5) - domain_name (0.5.25) - unf (>= 0.0.5, < 1.0.0) - doorkeeper (2.2.2) + doorkeeper (3.1.0) railties (>= 3.2) dropzonejs-rails (0.7.2) rails (> 3.1) @@ -189,15 +183,15 @@ GEM encryptor (1.3.0) equalizer (0.0.11) erubis (2.7.0) - escape_utils (1.1.0) + escape_utils (1.1.1) eventmachine (1.0.8) excon (0.45.4) execjs (2.6.0) expression_parser (0.9.0) - factory_girl (4.3.0) + factory_girl (4.5.0) activesupport (>= 3.0.0) - factory_girl_rails (4.3.0) - factory_girl (~> 4.3.0) + factory_girl_rails (4.6.0) + factory_girl (~> 4.5.0) railties (>= 3.0.0) faraday (0.9.2) multipart-post (>= 1.2, < 3) @@ -206,7 +200,6 @@ GEM faraday_middleware-multi_json (0.0.6) faraday_middleware multi_json - fastercsv (1.5.5) ffaker (2.0.0) ffi (1.9.10) fission (0.5.0) @@ -326,8 +319,8 @@ GEM fog-xml (0.1.2) fog-core nokogiri (~> 1.5, >= 1.5.11) - font-awesome-rails (4.5.0.0) - railties (>= 3.2, < 5.0) + font-awesome-rails (4.5.0.1) + railties (>= 3.2, < 5.1) foreman (0.78.0) thor (~> 0.19.1) formatador (0.2.5) @@ -340,7 +333,7 @@ GEM json get_process_mem (0.2.0) gherkin-ruby (0.3.2) - github-linguist (4.7.5) + github-linguist (4.7.6) charlock_holmes (~> 0.7.3) escape_utils (~> 1.1.0) mime-types (>= 1.19) @@ -350,18 +343,18 @@ GEM flowdock (~> 0.7) gitlab-grit (>= 2.4.1) multi_json - gitlab-grit (2.7.3) + gitlab-grit (2.8.1) charlock_holmes (~> 0.6) diff-lcs (~> 1.1) - mime-types (~> 1.15) + mime-types (>= 1.16, < 3) posix-spawn (~> 0.3) gitlab_emoji (0.3.1) gemojione (~> 2.2, >= 2.2.1) - gitlab_git (8.2.0) + gitlab_git (10.1.0) activesupport (~> 4.0) charlock_holmes (~> 0.7.3) github-linguist (~> 4.7.0) - rugged (~> 0.24.0b13) + rugged (~> 0.24.0) gitlab_meta (7.0) gitlab_omniauth-ldap (1.2.1) net-ldap (~> 0.9) @@ -379,6 +372,9 @@ GEM rouge (~> 1.9) sanitize (~> 2.1.0) stringex (~> 2.5.1) + gollum-rugged_adapter (0.4.2) + mime-types (>= 1.15) + rugged (~> 0.24.0, >= 0.21.3) gon (6.0.1) actionpack (>= 3.0) json @@ -406,8 +402,9 @@ GEM html2haml (>= 1.0.1) railties (>= 4.0.1) hashie (3.4.3) + health_check (1.5.1) + rails (>= 2.3.0) highline (1.7.8) - hike (1.2.3) hipchat (1.5.2) httparty mimemagic @@ -419,8 +416,7 @@ GEM haml (~> 4.0.0) nokogiri (~> 1.6.0) ruby_parser (~> 3.5) - http-cookie (1.0.2) - domain_name (~> 0.5) + htmlentities (4.3.4) http_parser.rb (0.5.3) httparty (0.13.7) json (~> 1.8) @@ -434,12 +430,10 @@ GEM json ipaddress (0.8.2) jquery-atwho-rails (1.3.2) - jquery-rails (4.0.5) - rails-dom-testing (~> 1.0) + jquery-rails (4.1.1) + rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - jquery-scrollto-rails (1.4.3) - railties (> 3.1, < 5.0) jquery-turbolinks (2.1.0) railties (>= 3.1.0) turbolinks @@ -453,8 +447,14 @@ GEM kgio (2.10.0) launchy (2.4.3) addressable (~> 2.3) - letter_opener (1.1.2) + letter_opener (1.4.1) launchy (~> 2.2) + letter_opener_web (1.3.0) + actionmailer (>= 3.2) + letter_opener (~> 1.0) + railties (>= 3.2) + licensee (8.0.0) + rugged (>= 0.24b) listen (3.0.5) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) @@ -462,11 +462,11 @@ GEM nokogiri (>= 1.5.9) macaddr (1.7.1) systemu (~> 2.6.2) - mail (2.6.3) - mime-types (>= 1.16, < 3) - mail_room (0.6.1) + mail (2.6.4) + mime-types (>= 1.16, < 4) + mail_room (0.7.0) method_source (0.8.2) - mime-types (1.25.1) + mime-types (2.99.1) mimemagic (0.3.0) mini_portile2 (2.0.0) minitest (5.7.0) @@ -478,11 +478,9 @@ GEM nested_form (0.3.2) net-ldap (0.12.1) net-ssh (3.0.1) - netrc (0.11.0) newrelic_rpm (3.14.1.311) nokogiri (1.6.7.2) mini_portile2 (~> 2.0.0.rc2) - nprogress-rails (0.1.6.7) oauth (0.4.7) oauth2 (1.0.0) faraday (>= 0.8, < 0.10) @@ -490,11 +488,13 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (~> 1.2) - octokit (3.8.0) - sawyer (~> 0.6.0, >= 0.5.3) + octokit (4.3.0) + sawyer (~> 0.7.0, >= 0.5.3) omniauth (1.3.1) hashie (>= 1.2, < 4) rack (>= 1.0, < 3) + omniauth-auth0 (1.4.1) + omniauth-oauth2 (~> 1.1) omniauth-azure-oauth2 (0.0.6) jwt (~> 1.0) omniauth (~> 1.0) @@ -532,8 +532,8 @@ GEM omniauth-oauth2 (1.3.1) oauth2 (~> 1.0) omniauth (~> 1.2) - omniauth-saml (1.4.2) - omniauth (~> 1.1) + omniauth-saml (1.5.0) + omniauth (~> 1.3) ruby-saml (~> 1.1, >= 1.1.1) omniauth-shibboleth (1.2.1) omniauth (>= 1.0.0) @@ -549,16 +549,22 @@ GEM orm_adapter (0.5.0) paranoia (2.1.4) activerecord (~> 4.0) - parser (2.2.3.0) - ast (>= 1.1, < 3.0) + parser (2.3.0.6) + ast (~> 2.2) pg (0.18.4) - poltergeist (1.8.1) + poltergeist (1.9.0) capybara (~> 2.1) cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) posix-spawn (0.3.11) powerpack (0.1.1) + premailer (1.8.6) + css_parser (>= 1.3.6) + htmlentities (>= 4.0.0) + premailer-rails (1.9.2) + actionmailer (>= 3, < 6) + premailer (~> 1.7, >= 1.7.9) pry (0.10.3) coderay (~> 1.1.0) method_source (~> 0.8.1) @@ -586,16 +592,16 @@ GEM rack rack-test (0.6.3) rack (>= 1.0) - rails (4.2.5.2) - actionmailer (= 4.2.5.2) - actionpack (= 4.2.5.2) - actionview (= 4.2.5.2) - activejob (= 4.2.5.2) - activemodel (= 4.2.5.2) - activerecord (= 4.2.5.2) - activesupport (= 4.2.5.2) + rails (4.2.6) + actionmailer (= 4.2.6) + actionpack (= 4.2.6) + actionview (= 4.2.6) + activejob (= 4.2.6) + activemodel (= 4.2.6) + activerecord (= 4.2.6) + activesupport (= 4.2.6) bundler (>= 1.3.0, < 2.0) - railties (= 4.2.5.2) + railties (= 4.2.6) sprockets-rails rails-deprecated_sanitizer (1.0.3) activesupport (>= 4.2.0.alpha) @@ -605,12 +611,12 @@ GEM rails-deprecated_sanitizer (>= 1.0.1) rails-html-sanitizer (1.0.3) loofah (~> 2.0) - railties (4.2.5.2) - actionpack (= 4.2.5.2) - activesupport (= 4.2.5.2) + railties (4.2.6) + actionpack (= 4.2.6) + activesupport (= 4.2.6) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rainbow (2.0.0) + rainbow (2.1.0) raindrops (0.15.0) rake (10.5.0) raphael-rails (2.1.2) @@ -624,7 +630,7 @@ GEM recaptcha (1.0.2) json redcarpet (3.3.3) - redis (3.2.2) + redis (3.3.0) redis-actionpack (4.0.1) actionpack (~> 4) redis-rack (~> 1.5.0) @@ -643,15 +649,11 @@ GEM redis-store (~> 1.1.0) redis-store (1.1.7) redis (>= 2.2) - request_store (1.2.1) + request_store (1.3.0) rerun (0.11.0) listen (~> 3.0) responders (2.1.1) railties (>= 4.2.0, < 5.1) - rest-client (1.8.0) - http-cookie (>= 1.0.2, < 2.0) - mime-types (>= 1.16, < 3.0) - netrc (~> 0.7) rinku (1.7.3) rotp (2.1.1) rouge (1.10.1) @@ -659,62 +661,66 @@ GEM chunky_png rqrcode-rails3 (0.1.7) rqrcode (>= 0.4.2) - rspec (3.3.0) - rspec-core (~> 3.3.0) - rspec-expectations (~> 3.3.0) - rspec-mocks (~> 3.3.0) - rspec-core (3.3.2) - rspec-support (~> 3.3.0) - rspec-expectations (3.3.1) + rspec (3.4.0) + rspec-core (~> 3.4.0) + rspec-expectations (~> 3.4.0) + rspec-mocks (~> 3.4.0) + rspec-core (3.4.4) + rspec-support (~> 3.4.0) + rspec-expectations (3.4.0) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.3.0) - rspec-mocks (3.3.2) + rspec-support (~> 3.4.0) + rspec-mocks (3.4.1) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.3.0) - rspec-rails (3.3.3) + rspec-support (~> 3.4.0) + rspec-rails (3.4.2) actionpack (>= 3.0, < 4.3) activesupport (>= 3.0, < 4.3) railties (>= 3.0, < 4.3) - rspec-core (~> 3.3.0) - rspec-expectations (~> 3.3.0) - rspec-mocks (~> 3.3.0) - rspec-support (~> 3.3.0) - rspec-support (3.3.0) - rubocop (0.35.1) - astrolabe (~> 1.3) - parser (>= 2.2.3.0, < 3.0) + rspec-core (~> 3.4.0) + rspec-expectations (~> 3.4.0) + rspec-mocks (~> 3.4.0) + rspec-support (~> 3.4.0) + rspec-retry (0.4.5) + rspec-core + rspec-support (3.4.1) + rubocop (0.38.0) + parser (>= 2.3.0.6, < 3.0) powerpack (~> 0.1) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.7) - tins (<= 1.6.0) + unicode-display_width (~> 1.0, >= 1.0.1) ruby-fogbugz (0.2.1) crack (~> 0.4) ruby-progressbar (1.7.5) - ruby-saml (1.1.1) + ruby-saml (1.1.2) nokogiri (>= 1.5.10) uuid (~> 2.3) - ruby2ruby (2.2.0) + ruby2ruby (2.3.0) ruby_parser (~> 3.1) sexp_processor (~> 4.0) - ruby_parser (3.7.2) + ruby_parser (3.8.1) sexp_processor (~> 4.1) rubyntlm (0.5.2) rubypants (0.2.0) rufus-scheduler (3.1.10) - rugged (0.24.0b13) + rugged (0.24.0) safe_yaml (1.0.4) sanitize (2.1.0) nokogiri (>= 1.4.4) - sass (3.4.20) + sass (3.4.21) sass-rails (5.0.4) railties (>= 4.0.0, < 5.0) sass (~> 3.1) sprockets (>= 2.8, < 4.0) sprockets-rails (>= 2.0, < 4.0) tilt (>= 1.1, < 3) - sawyer (0.6.0) - addressable (~> 2.3.5) + sawyer (0.7.0) + addressable (>= 2.3.5, < 2.5) faraday (~> 0.8, < 0.10) + scss_lint (0.47.1) + rake (>= 0.9, < 11) + sass (~> 3.4.15) sdoc (0.3.20) json (>= 1.1.3) rdoc (~> 3.10) @@ -726,22 +732,21 @@ GEM sentry-raven (0.15.6) faraday (>= 0.7.6) settingslogic (2.0.9) - sexp_processor (4.6.0) + sexp_processor (4.7.0) sham_rack (1.3.6) rack shoulda-matchers (2.8.0) activesupport (>= 3.0.0) - sidekiq (4.0.1) + sidekiq (4.1.2) concurrent-ruby (~> 1.0) connection_pool (~> 2.2, >= 2.2.0) - json (~> 1.0) redis (~> 3.2, >= 3.2.1) sidekiq-cron (0.4.0) redis-namespace (>= 1.5.2) rufus-scheduler (>= 2.0.24) sidekiq (>= 4.0.0) simple_oauth (0.1.9) - simplecov (0.10.0) + simplecov (0.11.2) docile (~> 1.1.0) json (~> 1.8) simplecov-html (~> 0.10.0) @@ -764,22 +769,22 @@ GEM capybara (>= 2.0.0) railties (>= 3) spinach (>= 0.4) - spring (1.3.6) + spinach-rerun-reporter (0.0.2) + spinach (~> 0.8) + spring (1.7.1) spring-commands-rspec (1.0.4) spring (>= 0.9.1) - spring-commands-spinach (1.0.0) + spring-commands-spinach (1.1.0) spring (>= 0.9.1) spring-commands-teaspoon (0.0.2) spring (>= 0.9.1) - sprockets (2.12.4) - hike (~> 1.2) - multi_json (~> 1.0) - rack (~> 1.0) - tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.3.3) - actionpack (>= 3.0) - activesupport (>= 3.0) - sprockets (>= 2.8, < 4.0) + sprockets (3.6.0) + concurrent-ruby (~> 1.0) + rack (> 1, < 3) + sprockets-rails (3.0.4) + actionpack (>= 4.0) + activesupport (>= 4.0) + sprockets (>= 3.0.0) state_machines (0.4.0) state_machines-activemodel (0.3.0) activemodel (~> 4.1) @@ -791,8 +796,8 @@ GEM systemu (2.6.5) task_list (1.0.2) html-pipeline - teaspoon (1.0.2) - railties (>= 3.2.5, < 5) + teaspoon (1.1.5) + railties (>= 3.2.5, < 6) teaspoon-jasmine (2.2.0) teaspoon (>= 1.0.0) temple (0.7.6) @@ -807,7 +812,7 @@ GEM rack (~> 1.0) thor (0.19.1) thread_safe (0.3.5) - tilt (1.4.1) + tilt (2.0.2) timfel-krb5-auth (0.8.3) tinder (1.10.1) eventmachine (~> 1.0) @@ -833,8 +838,9 @@ GEM underscore-rails (1.8.3) unf (0.1.4) unf_ext - unf_ext (0.0.7.1) - unicorn (4.8.3) + unf_ext (0.0.7.2) + unicode-display_width (1.0.2) + unicorn (4.9.0) kgio (~> 2.6) rack raindrops (~> 0.7) @@ -852,7 +858,7 @@ GEM equalizer (~> 0.0, >= 0.0.9) warden (1.2.4) rack (>= 1.0) - web-console (2.2.1) + web-console (2.3.0) activemodel (>= 4.0) binding_of_caller (>= 0.7.2) railties (>= 4.0) @@ -876,33 +882,32 @@ PLATFORMS DEPENDENCIES RedCloth (~> 4.2.9) - ace-rails-ap (~> 2.0.1) - activerecord-deprecated_finders (~> 1.0.3) + ace-rails-ap (~> 4.0.2) activerecord-session_store (~> 0.1.0) acts-as-taggable-on (~> 3.4) addressable (~> 2.3.8) after_commit_queue akismet (~> 2.0) allocations (~> 1.0) - annotate (~> 2.6.0) asana (~> 0.4.0) asciidoctor (~> 1.5.2) attr_encrypted (~> 1.3.4) awesome_print (~> 1.2.0) babosa (~> 1.0.2) + base32 (~> 0.3.0) benchmark-ips better_errors (~> 1.0.1) binding_of_caller (~> 0.7.2) bootstrap-sass (~> 3.3.0) - brakeman (~> 3.1.0) + brakeman (~> 3.2.0) browser (~> 1.0.0) bullet bundler-audit byebug - cal-heatmap-rails (~> 3.5.0) - capybara (~> 2.4.0) + cal-heatmap-rails (~> 3.6.0) + capybara (~> 2.6.2) capybara-screenshot (~> 1.0.0) - carrierwave (~> 0.9.0) + carrierwave (~> 0.10.0) charlock_holmes (~> 0.7.3) coffee-rails (~> 4.1.0) colorize (~> 0.7.0) @@ -916,11 +921,11 @@ DEPENDENCIES devise-async (~> 0.9.0) devise-two-factor (~> 2.0.0) diffy (~> 3.0.3) - doorkeeper (~> 2.2.0) + doorkeeper (~> 3.1) dropzonejs-rails (~> 0.7.1) email_reply_parser (~> 0.5.8) email_spec (~> 1.6.0) - factory_girl_rails (~> 4.3.0) + factory_girl_rails (~> 4.6.0) ffaker (~> 2.0.0) flay flog @@ -933,27 +938,30 @@ DEPENDENCIES github-markup (~> 1.3.1) gitlab-flowdock-git-hook (~> 1.0.1) gitlab_emoji (~> 0.3.0) - gitlab_git (~> 8.2) + gitlab_git (~> 10.0) gitlab_meta (= 7.0) gitlab_omniauth-ldap (~> 1.2.1) gollum-lib (~> 4.1.0) + gollum-rugged_adapter (~> 0.4.2) gon (~> 6.0.1) grape (~> 0.13.0) grape-entity (~> 0.4.2) haml-rails (~> 0.9.0) + health_check (~> 1.5.1) hipchat (~> 1.5.0) html-pipeline (~> 1.11.0) httparty (~> 0.13.3) influxdb (~> 0.2) jquery-atwho-rails (~> 1.3.2) - jquery-rails (~> 4.0.0) - jquery-scrollto-rails (~> 1.4.3) + jquery-rails (~> 4.1.0) jquery-turbolinks (~> 2.1.0) jquery-ui-rails (~> 5.0.0) + jwt kaminari (~> 0.16.3) - letter_opener (~> 1.1.2) + letter_opener_web (~> 1.3.0) + licensee (~> 8.0.0) loofah (~> 2.0.3) - mail_room (~> 0.6.1) + mail_room (~> 0.7) method_source (~> 0.8) minitest (~> 5.7.0) mousetrap-rails (~> 1.4.6) @@ -962,10 +970,10 @@ DEPENDENCIES net-ssh (~> 3.0.1) newrelic_rpm (~> 3.14) nokogiri (~> 1.6.7, >= 1.6.7.2) - nprogress-rails (~> 0.1.6.7) oauth2 (~> 1.0.0) - octokit (~> 3.8.0) + octokit (~> 4.3.0) omniauth (~> 1.3.1) + omniauth-auth0 (~> 1.4.1) omniauth-azure-oauth2 (~> 0.0.6) omniauth-bitbucket (~> 0.0.2) omniauth-cas3 (~> 1.1.2) @@ -974,38 +982,42 @@ DEPENDENCIES omniauth-gitlab (~> 1.0.0) omniauth-google-oauth2 (~> 0.2.0) omniauth-kerberos (~> 0.3.0) - omniauth-saml (~> 1.4.2) + omniauth-saml (~> 1.5.0) omniauth-shibboleth (~> 1.2.0) omniauth-twitter (~> 1.2.0) omniauth_crowd (~> 2.2.0) org-ruby (~> 0.9.12) paranoia (~> 2.0) pg (~> 0.18.2) - poltergeist (~> 1.8.1) + poltergeist (~> 1.9.0) + premailer-rails (~> 1.9.0) pry-rails quiet_assets (~> 1.0.2) rack-attack (~> 4.3.1) rack-cors (~> 0.4.0) rack-oauth2 (~> 1.2.1) - rails (= 4.2.5.2) + rails (= 4.2.6) rails-deprecated_sanitizer (~> 1.0.3) raphael-rails (~> 2.1.2) rblineprof rdoc (~> 3.6) recaptcha redcarpet (~> 3.3.3) + redis (~> 3.2) redis-namespace redis-rails (~> 4.0.0) - request_store (~> 1.2.0) + request_store (~> 1.3.0) rerun (~> 0.11.0) responders (~> 2.0) rouge (~> 1.10.1) rqrcode-rails3 (~> 0.1.7) - rspec-rails (~> 3.3.0) - rubocop (~> 0.35.0) + rspec-rails (~> 3.4.0) + rspec-retry + rubocop (~> 0.38.0) ruby-fogbugz (~> 0.2.1) sanitize (~> 2.0) sass-rails (~> 5.0.0) + scss_lint (~> 0.47.0) sdoc (~> 0.3.20) seed-fu (~> 2.3.5) select2-rails (~> 3.5.9) @@ -1015,19 +1027,20 @@ DEPENDENCIES shoulda-matchers (~> 2.8.0) sidekiq (~> 4.0) sidekiq-cron (~> 0.4.0) - simplecov (~> 0.10.0) + simplecov (~> 0.11.0) sinatra (~> 1.4.4) six (~> 0.2.0) slack-notifier (~> 1.2.0) spinach-rails (~> 0.2.1) - spring (~> 1.3.6) + spinach-rerun-reporter (~> 0.0.2) + spring (~> 1.7.0) spring-commands-rspec (~> 1.0.4) - spring-commands-spinach (~> 1.0.0) + spring-commands-spinach (~> 1.1.0) spring-commands-teaspoon (~> 0.0.2) - sprockets (~> 2.12.3) + sprockets (~> 3.6.0) state_machines-activerecord (~> 0.3.0) task_list (~> 1.0.2) - teaspoon (~> 1.0.0) + teaspoon (~> 1.1.0) teaspoon-jasmine (~> 2.2.0) test_after_commit (~> 0.4.2) thin (~> 1.6.1) @@ -1036,7 +1049,7 @@ DEPENDENCIES uglifier (~> 2.7.2) underscore-rails (~> 1.8.0) unf (~> 0.1.4) - unicorn (~> 4.8.2) + unicorn (~> 4.9.0) unicorn-worker-killer (~> 0.4.2) version_sorter (~> 2.0.0) virtus (~> 1.0.1) @@ -1045,4 +1058,4 @@ DEPENDENCIES wikicloth (= 0.8.1) BUNDLED WITH - 1.11.2 + 1.12.3 diff --git a/PROCESS.md b/PROCESS.md index 5f4d67bc10..fe3a963110 100644 --- a/PROCESS.md +++ b/PROCESS.md @@ -2,23 +2,39 @@ ## Purpose of describing the contributing process -Below we describe the contributing process to GitLab for two reasons. So that contributors know what to expect from maintainers (possible responses, friendly treatment, etc.). And so that maintainers know what to expect from contributors (use the latest version, ensure that the issue is addressed, friendly treatment, etc.). +Below we describe the contributing process to GitLab for two reasons. So that +contributors know what to expect from maintainers (possible responses, friendly +treatment, etc.). And so that maintainers know what to expect from contributors +(use the latest version, ensure that the issue is addressed, friendly treatment, +etc.). ## Common actions ### Issue team -- Looks for issues without [workflow labels](#how-we-handle-issues) and triages issue -- 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.) -- Monitors all issues for feedback (but especially ones commented on since automatically watching them) + +- Looks for issues without [workflow labels](#how-we-handle-issues) and triages + issue +- 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.) +- 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 -### Merge marshal +### Merge marshall & merge request coach -- Responds to merge requests the issue team mentions them in and monitors for new merge requests -- Provides feedback to the merge request submitter to improve the merge request (style, tests, etc.) -- Mark merge requests 'ready-for-merge' when they meet the contribution guidelines -- Mention developer(s) based on the [list of members and their specialities](https://about.gitlab.com/core-team/) +- Responds to merge requests the issue team mentions them in and monitors for + new merge requests +- Provides feedback to the merge request submitter to improve the merge request + (style, tests, etc.) +- Mark merge requests `Ready for Merge` when they meet the + [contribution acceptance criteria] +- Mention developer(s) based on the + [list of members and their specialities][team] - Closes merge requests with no feedback from the reporter for two weeks ## Priorities of the issue team @@ -30,29 +46,41 @@ Below we describe the contributing process to GitLab for two reasons. So that co ## Mentioning people -The most important thing is making sure valid issues receive feedback from the development team. Therefore the priority is mentioning developers that can help on those issue. Please select someone with relevant experience from [GitLab core team](https://about.gitlab.com/core-team/). If there is nobody mentioned with that expertise look in the commit history for the affected files to find someone. Avoid mentioning the lead developer, this is the person that is least likely to give a timely response. If the involvement of the lead developer is needed the other core team members will mention this person. +The most important thing is making sure valid issues receive feedback from the +development team. Therefore the priority is mentioning developers that can help +on those issue. Please select someone with relevant experience from +[GitLab core team][core-team]. If there is nobody mentioned with that expertise +look in the commit history for the affected files to find someone. Avoid +mentioning the lead developer, this is the person that is least likely to give a +timely response. If the involvement of the lead developer is needed the other +core team members will mention this person. ## 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 we 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 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 - - 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. -- *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 +- ~"Awaiting Feedback" Feedback pending from the reporter +- ~UX needs help from a UX designer +- ~Frontend needs help from a Front-end engineer. Please follow the + ["Implement design & UI elements" guidelines]. +- ~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`. +- ~bug is an issue reporting undesirable or incorrect behavior. +- ~customer is an issue reported by enterprise subscribers. This label should +be accompanied by *bug* or *feature proposal* labels. 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 -These labels describe what development specialities are involved such as: PostgreSQL, UX, LDAP. +These labels describe what development specialities are involved such as: `CI`, +`Core`, `Documentation`, `Frontend`, `Issues`, `Merge Requests`, `Omnibus`, +`Release`, `Repository`, `UX`. ## Assigning issues @@ -60,21 +88,48 @@ If an issue is complex and needs the attention of a specific person, assignment ## Label colors -- Light orange `#fef2c0`: workflow labels for issue team members (awaiting feedback, awaiting confirmation of fix) -- Bright orange `#eb6420`: workflow labels for core team members (attached MR, awaiting developer action/feedback) -- 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: - - Support (see copy & paste response: [Support requests and configuration questions](#support-requests-and-configuration-questions) +- Light orange `#fef2c0`: workflow labels for issue team members (awaiting + feedback, awaiting confirmation of fix) +- Bright orange `#eb6420`: workflow labels for core team members (attached MR, + awaiting developer action/feedback) +- 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: + - Support (see copy & paste response: + [Support requests and configuration questions](#support-requests-and-configuration-questions) ## Be kind -Be kind to people trying to contribute. Be aware that people may be a non-native English speaker, they might not understand things or they might be very sensitive as to how you word things. Use Emoji to express your feelings (heart, star, smile, etc.). Some good tips about giving feedback to merge requests is in the [Thoughtbot code review guide](https://github.com/thoughtbot/guides/tree/master/code-review). +Be kind to people trying to contribute. Be aware that people may be a non-native +English speaker, they might not understand things or they might be very +sensitive as to how you word things. Use Emoji to express your feelings (heart, +star, smile, etc.). Some good tips about giving feedback to merge requests is in +the [Thoughtbot code review guide]. + +## Feature Freeze + +5 working days before the 22nd the stable branches for the upcoming release will +be frozen for major changes. Merge requests may still be merged into master +during this period. By freezing the stable branches prior to a release there's +no need to worry about last minute merge requests potentially breaking a lot of +things. + +What is considered to be a major change is determined on a case by case basis as +this definition depends very much on the context of changes. For example, a 5 +line change might have a big impact on the entire application. Ultimately the +decision will be made by those reviewing a merge request and the release +manager. + +During the feature freeze all merge requests that are meant to go into the next +release should have the correct milestone assigned _and_ have the label +~"Pick into Stable" set. Merge requests without a milestone and this label will +not be merged into any stable branches. ## Copy & paste responses ### Improperly formatted issue -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 \[contributing guidelines\]\(https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#issue-tracker-guidelines). ### Issue report for old version @@ -110,11 +165,11 @@ This merge request has been closed because a request for more information has no ### Accepting merge requests -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? +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) +\[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 @@ -129,4 +184,10 @@ rebase with master to see if that solves the issue. We are currently in the process of closing down the issue tracker on GitHub, to prevent duplication with the GitLab.com issue tracker. Since this is an older issue I'll be closing this for now. If you think this is -still an issue I encourage you to open it on the \[GitLab.com issue tracker\](https://gitlab.com/gitlab-org/gitlab-ce/issues). +still an issue I encourage you to open it on the \[GitLab.com issue tracker\]\(https://gitlab.com/gitlab-org/gitlab-ce/issues). + +[core-team]: https://about.gitlab.com/core-team/ +[team]: https://about.gitlab.com/team/ +[contribution acceptance criteria]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#contribution-acceptance-criteria +["Implement design & UI elements" guidelines]: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#implement-design-ui-elements +[Thoughtbot code review guide]: https://github.com/thoughtbot/guides/tree/master/code-review diff --git a/README.md b/README.md index afa60116eb..418d06a45a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # GitLab -[![build status](https://ci.gitlab.com/projects/1/status.svg?ref=master)](https://ci.gitlab.com/projects/1?ref=master) +[![build status](https://gitlab.com/gitlab-org/gitlab-ce/badges/master/build.svg)](https://gitlab.com/gitlab-org/gitlab-ce/commits/master) [![Build Status](https://semaphoreci.com/api/v1/projects/2f1a5809-418b-4cc2-a1f4-819607579fe7/400484/shields_badge.svg)](https://semaphoreci.com/gitlabhq/gitlabhq) [![Code Climate](https://codeclimate.com/github/gitlabhq/gitlabhq.svg)](https://codeclimate.com/github/gitlabhq/gitlabhq) [![Coverage Status](https://coveralls.io/repos/gitlabhq/gitlabhq/badge.svg?branch=master)](https://coveralls.io/r/gitlabhq/gitlabhq?branch=master) @@ -20,6 +20,10 @@ To see how GitLab looks please see the [features page on our website](https://ab - Completely free and open source (MIT Expat license) - Powered by [Ruby on Rails](https://github.com/rails/rails) +## Hiring + +We're hiring developers, support people, and production engineers all the time, please see our [jobs page](https://about.gitlab.com/jobs/). + ## Editions There are two editions of GitLab: @@ -31,11 +35,11 @@ There are two editions of GitLab: On [about.gitlab.com](https://about.gitlab.com/) you can find more information about: -- [Subscriptions](https://about.gitlab.com/subscription/) +- [Subscriptions](https://about.gitlab.com/pricing/) - [Consultancy](https://about.gitlab.com/consultancy/) - [Community](https://about.gitlab.com/community/) - [Hosted GitLab.com](https://about.gitlab.com/gitlab-com/) use GitLab as a free service -- [GitLab Enterprise Edition](https://about.gitlab.com/gitlab-ee/) with additional features aimed at larger organizations. +- [GitLab Enterprise Edition](https://about.gitlab.com/features/#enterprise) with additional features aimed at larger organizations. - [GitLab CI](https://about.gitlab.com/gitlab-ci/) a continuous integration (CI) server that is easy to integrate with GitLab. ## Requirements @@ -80,7 +84,7 @@ There are a lot of [third-party applications integrating with GitLab](https://ab ## GitLab release cycle -For more information about the release process see the [release documentation](http://doc.gitlab.com/ce/release/). +For more information about the release process see the [release documentation](https://gitlab.com/gitlab-org/release-tools/blob/master/README.md). ## Upgrading diff --git a/VERSION b/VERSION index 1336777f6b..d439d82b62 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -8.5.8 \ No newline at end of file +8.8.2 \ No newline at end of file diff --git a/app/assets/images/ci/arch.jpg b/app/assets/images/ci/arch.jpg deleted file mode 100644 index 0e05674e840c6946d5a40f340790289af2dc25f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25222 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 diff --git a/app/assets/images/ci/loader.gif b/app/assets/images/ci/loader.gif deleted file mode 100644 index 2fcb8f2da0d283628878cbc74b9dd848109a4535..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4405 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 AQ~&?~ diff --git a/app/assets/images/ci/service_sample.png b/app/assets/images/ci/service_sample.png deleted file mode 100644 index 65d29e3fd891b7b8deba8670cb7d74b03056e3d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76024 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 z 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 Vw Pager.init 20, true - $(".event-filter a").bind "click", (event) => + $(".event-filter-link").on "click", (event) => event.preventDefault() @toggleFilter($(event.currentTarget)) @reloadActivities() @@ -12,18 +12,10 @@ class @Activities toggleFilter: (sender) -> - sender.closest('li').toggleClass "active" + $('.event-filter .active').removeClass "active" event_filters = $.cookie("event_filter") filter = sender.attr("id").split("_")[0] - if event_filters - event_filters = event_filters.split(",") - else - event_filters = new Array() + $.cookie "event_filter", (if event_filters isnt filter then filter else ""), { path: '/' } - index = event_filters.indexOf(filter) - if index is -1 - event_filters.push filter - else - event_filters.splice index, 1 - - $.cookie "event_filter", event_filters.join(","), { path: '/' } + if event_filters isnt filter + sender.closest('li').toggleClass "active" diff --git a/app/assets/javascripts/api.js.coffee b/app/assets/javascripts/api.js.coffee index 3e0fdb3f79..3f61ea1eaf 100644 --- a/app/assets/javascripts/api.js.coffee +++ b/app/assets/javascripts/api.js.coffee @@ -1,12 +1,15 @@ @Api = - groups_path: "/api/:version/groups.json" - group_path: "/api/:version/groups/:id.json" - namespaces_path: "/api/:version/namespaces.json" - group_projects_path: "/api/:version/groups/:id/projects.json" - projects_path: "/api/:version/projects.json" + groupsPath: "/api/:version/groups.json" + groupPath: "/api/:version/groups/:id.json" + namespacesPath: "/api/:version/namespaces.json" + groupProjectsPath: "/api/:version/groups/:id/projects.json" + projectsPath: "/api/:version/projects.json" + labelsPath: "/api/:version/projects/:id/labels" + licensePath: "/api/:version/licenses/:key" + gitignorePath: "/api/:version/gitignores/:key" group: (group_id, callback) -> - url = Api.buildUrl(Api.group_path) + url = Api.buildUrl(Api.groupPath) url = url.replace(':id', group_id) $.ajax( @@ -20,7 +23,7 @@ # Return groups list. Filtered by query # Only active groups retrieved groups: (query, skip_ldap, callback) -> - url = Api.buildUrl(Api.groups_path) + url = Api.buildUrl(Api.groupsPath) $.ajax( url: url @@ -34,7 +37,7 @@ # Return namespaces list. Filtered by query namespaces: (query, callback) -> - url = Api.buildUrl(Api.namespaces_path) + url = Api.buildUrl(Api.namespacesPath) $.ajax( url: url @@ -48,7 +51,7 @@ # Return projects list. Filtered by query projects: (query, order, callback) -> - url = Api.buildUrl(Api.projects_path) + url = Api.buildUrl(Api.projectsPath) $.ajax( url: url @@ -61,9 +64,24 @@ ).done (projects) -> callback(projects) + newLabel: (project_id, data, callback) -> + url = Api.buildUrl(Api.labelsPath) + url = url.replace(':id', project_id) + + data.private_token = gon.api_token + $.ajax( + url: url + type: "POST" + data: data + dataType: "json" + ).done (label) -> + callback(label) + .error (message) -> + callback(message.responseJSON) + # Return group projects list. Filtered by query groupProjects: (group_id, query, callback) -> - url = Api.buildUrl(Api.group_projects_path) + url = Api.buildUrl(Api.groupProjectsPath) url = url.replace(':id', group_id) $.ajax( @@ -76,6 +94,22 @@ ).done (projects) -> callback(projects) + # Return text for a specific license + licenseText: (key, data, callback) -> + url = Api.buildUrl(Api.licensePath).replace(':key', key) + + $.ajax( + url: url + data: data + ).done (license) -> + callback(license) + + gitignoreText: (key, callback) -> + url = Api.buildUrl(Api.gitignorePath).replace(':key', key) + + $.get url, (gitignore) -> + callback(gitignore) + buildUrl: (url) -> url = gon.relative_url_root + url if gon.relative_url_root? return url.replace(':version', gon.api_version) diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee index 367bd098bf..bffce5a0c0 100644 --- a/app/assets/javascripts/application.js.coffee +++ b/app/assets/javascripts/application.js.coffee @@ -7,6 +7,7 @@ #= require jquery #= require jquery-ui/autocomplete #= require jquery-ui/datepicker +#= require jquery-ui/draggable #= require jquery-ui/effect-highlight #= require jquery-ui/sortable #= require jquery_ujs @@ -21,7 +22,17 @@ #= require cal-heatmap #= require turbolinks #= require autosave -#= require bootstrap +#= require bootstrap/affix +#= require bootstrap/alert +#= require bootstrap/button +#= require bootstrap/collapse +#= require bootstrap/dropdown +#= require bootstrap/modal +#= require bootstrap/scrollspy +#= require bootstrap/tab +#= require bootstrap/transition +#= require bootstrap/tooltip +#= require bootstrap/popover #= require select2 #= require raphael #= require g.raphael @@ -31,8 +42,6 @@ #= require ace/ace #= require ace/ext-searchbox #= require underscore -#= require nprogress -#= require nprogress-turbolinks #= require dropzone #= require mousetrap #= require mousetrap/pause @@ -42,8 +51,10 @@ #= require shortcuts_issuable #= require shortcuts_network #= require jquery.nicescroll +#= require date.format #= require_tree . #= require fuzzaldrin-plus +#= require cropper window.slugify = (text) -> text.replace(/[^-a-zA-Z0-9]+/g, '_').toLowerCase() @@ -109,6 +120,8 @@ window.onload = -> setTimeout shiftWindow, 100 $ -> + bootstrapBreakpoint = bp.getBreakpointSize() + $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF") # Click a .js-select-on-focus field, select the contents @@ -138,7 +151,7 @@ $ -> # Initialize tooltips $('body').tooltip( - selector: '.has_tooltip, [data-toggle="tooltip"]' + selector: '.has-tooltip, [data-toggle="tooltip"]' placement: (_, el) -> $el = $(el) $el.data('placement') || 'bottom' @@ -161,7 +174,7 @@ $ -> $('.trigger-submit').on 'change', -> $(@).parents('form').submit() - $('abbr.timeago, .js-timeago').timeago() + gl.utils.localTimeAgo($('abbr.timeago, .js-timeago'), true) # Flash if (flash = $(".flash-container")).length > 0 @@ -191,6 +204,7 @@ $ -> $('.header-content .title').toggle() $('.header-content .navbar-collapse').toggle() $('.navbar-toggle').toggleClass('active') + $('.navbar-toggle i').toggleClass("fa-angle-right fa-angle-left") # Show/hide comments on diff $("body").on "click", ".js-toggle-diff-comments", (e) -> @@ -210,82 +224,68 @@ $ -> $this = $(this) $this.attr 'value', $this.val() return - + $(document) .off 'keyup', 'input[type="search"]' .on 'keyup', 'input[type="search"]' , (e) -> $this = $(this) $this.attr 'value', $this.val() + $sidebarGutterToggle = $('.js-sidebar-toggle') + $navIconToggle = $('.toggle-nav-collapse') + $(document) .off 'breakpoint:change' .on 'breakpoint:change', (e, breakpoint) -> if breakpoint is 'sm' or breakpoint is 'xs' - $gutterIcon = $('.gutter-toggle').find('i') + $gutterIcon = $sidebarGutterToggle.find('i') if $gutterIcon.hasClass('fa-angle-double-right') - $gutterIcon.closest('a').trigger('click') + $sidebarGutterToggle.trigger('click') + + $navIcon = $navIconToggle.find('.fa') + if $navIcon.hasClass('fa-angle-left') + $navIconToggle.trigger('click') $(document) - .off 'click', 'aside .gutter-toggle' - .on 'click', 'aside .gutter-toggle', (e) -> + .off 'click', '.js-sidebar-toggle' + .on 'click', '.js-sidebar-toggle', (e, triggered) -> e.preventDefault() $this = $(this) $thisIcon = $this.find 'i' + $allGutterToggleIcons = $('.js-sidebar-toggle i') if $thisIcon.hasClass('fa-angle-double-right') - $thisIcon + $allGutterToggleIcons .removeClass('fa-angle-double-right') .addClass('fa-angle-double-left') - $this - .closest('aside') + $('aside.right-sidebar') .removeClass('right-sidebar-expanded') .addClass('right-sidebar-collapsed') $('.page-with-sidebar') .removeClass('right-sidebar-expanded') .addClass('right-sidebar-collapsed') else - $thisIcon + $allGutterToggleIcons .removeClass('fa-angle-double-left') .addClass('fa-angle-double-right') - $this - .closest('aside') + $('aside.right-sidebar') .removeClass('right-sidebar-collapsed') .addClass('right-sidebar-expanded') $('.page-with-sidebar') .removeClass('right-sidebar-collapsed') .addClass('right-sidebar-expanded') - $.cookie("collapsed_gutter", - $('.right-sidebar') - .hasClass('right-sidebar-collapsed'), { path: '/' }) - - bootstrapBreakpoint = undefined; - checkBootstrapBreakpoints = -> - if $('.device-xs').is(':visible') - bootstrapBreakpoint = "xs" - else if $('.device-sm').is(':visible') - bootstrapBreakpoint = "sm" - else if $('.device-md').is(':visible') - bootstrapBreakpoint = "md" - else if $('.device-lg').is(':visible') - bootstrapBreakpoint = "lg" - - setBootstrapBreakpoints = -> - if $('.device-xs').length - return - - $("body") - .append('
'+ - '
'+ - '
'+ - '
') - checkBootstrapBreakpoints() + if not triggered + $.cookie("collapsed_gutter", + $('.right-sidebar') + .hasClass('right-sidebar-collapsed'), { path: '/' }) fitSidebarForSize = -> oldBootstrapBreakpoint = bootstrapBreakpoint - checkBootstrapBreakpoints() + bootstrapBreakpoint = bp.getBreakpointSize() if bootstrapBreakpoint != oldBootstrapBreakpoint $(document).trigger('breakpoint:change', [bootstrapBreakpoint]) checkInitialSidebarSize = -> + bootstrapBreakpoint = bp.getBreakpointSize() if bootstrapBreakpoint is "xs" or "sm" $(document).trigger('breakpoint:change', [bootstrapBreakpoint]) @@ -294,6 +294,5 @@ $ -> .on "resize", (e) -> fitSidebarForSize() - setBootstrapBreakpoints() checkInitialSidebarSize() new Aside() diff --git a/app/assets/javascripts/aside.js.coffee b/app/assets/javascripts/aside.js.coffee index 8547310194..66ab505432 100644 --- a/app/assets/javascripts/aside.js.coffee +++ b/app/assets/javascripts/aside.js.coffee @@ -5,7 +5,6 @@ class @Aside e.preventDefault() btn = $(e.currentTarget) icon = btn.find('i') - console.log('1') if icon.hasClass('fa-angle-left') btn.parent().find('section').hide() diff --git a/app/assets/javascripts/autosave.js.coffee b/app/assets/javascripts/autosave.js.coffee index 5d3fe81da7..28f8e10366 100644 --- a/app/assets/javascripts/autosave.js.coffee +++ b/app/assets/javascripts/autosave.js.coffee @@ -16,11 +16,11 @@ class @Autosave try text = window.localStorage.getItem @key - catch + catch e return @field.val text if text?.length > 0 - @field.trigger "input" + @field.trigger "input" save: -> return unless window.localStorage? @@ -35,5 +35,5 @@ class @Autosave reset: -> return unless window.localStorage? - try + try window.localStorage.removeItem @key diff --git a/app/assets/javascripts/awards_handler.coffee b/app/assets/javascripts/awards_handler.coffee index 360acb864f..bf95e06b4e 100644 --- a/app/assets/javascripts/awards_handler.coffee +++ b/app/assets/javascripts/awards_handler.coffee @@ -1,37 +1,77 @@ class @AwardsHandler - constructor: (@post_emoji_url, @noteable_type, @noteable_id, @aliases) -> - $(".add-award").click (event)-> + constructor: (@getEmojisUrl, @postEmojiUrl, @noteableType, @noteableId, @unicodes) -> + $('.js-add-award').on 'click', (event) => event.stopPropagation() event.preventDefault() - $(".emoji-menu").show() - $("#emoji_search").focus() - $("html").on 'click', (event) -> - if !$(event.target).closest(".emoji-menu").length - if $(".emoji-menu").is(":visible") - $(".emoji-menu").hide() + @showEmojiMenu() + + $('html').on 'click', (event) -> + if !$(event.target).closest('.emoji-menu').length + if $('.emoji-menu').is(':visible') + $('.emoji-menu').removeClass 'is-visible' + + $('.awards') + .off 'click' + .on 'click', '.js-emoji-btn', @handleClick @renderFrequentlyUsedBlock() - @setupSearch() + + handleClick: (e) -> + e.preventDefault() + emoji = $(this) + .find('.icon') + .data 'emoji' + + if emoji is 'thumbsup' and awardsHandler.didUserClickEmoji $(this), 'thumbsdown' + awardsHandler.addAward 'thumbsdown' + + else if emoji is 'thumbsdown' and awardsHandler.didUserClickEmoji $(this), 'thumbsup' + awardsHandler.addAward 'thumbsup' + + awardsHandler.addAward emoji + + $(this).trigger 'blur' + + didUserClickEmoji: (that, emoji) -> + if $(that).siblings("button:has([data-emoji=#{emoji}])").attr('data-original-title') + $(that).siblings("button:has([data-emoji=#{emoji}])").attr('data-original-title').indexOf('me') > -1 + + showEmojiMenu: -> + if $('.emoji-menu').length + if $('.emoji-menu').is '.is-visible' + $('.emoji-menu').removeClass 'is-visible' + $('#emoji_search').blur() + else + $('.emoji-menu').addClass 'is-visible' + $('#emoji_search').focus() + else + $('.js-add-award').addClass 'is-loading' + $.get @getEmojisUrl, (response) => + $('.js-add-award').removeClass 'is-loading' + $('.js-award-holder').append response + setTimeout => + $('.emoji-menu').addClass 'is-visible' + $('#emoji_search').focus() + @setupSearch() + , 200 addAward: (emoji) -> - emoji = @normilizeEmojiName(emoji) @postEmoji emoji, => @addAwardToEmojiBar(emoji) - $(".emoji-menu").hide() + $('.emoji-menu').removeClass 'is-visible' addAwardToEmojiBar: (emoji) -> @addEmojiToFrequentlyUsedList(emoji) - emoji = @normilizeEmojiName(emoji) if @exist(emoji) if @isActive(emoji) @decrementCounter(emoji) else - counter = @findEmojiIcon(emoji).siblings(".counter") + counter = @findEmojiIcon(emoji).siblings('.js-counter') counter.text(parseInt(counter.text()) + 1) - counter.parent().addClass("active") + counter.parent().addClass('active') @addMeToAuthorList(emoji) else @createEmoji(emoji) @@ -40,43 +80,47 @@ class @AwardsHandler @findEmojiIcon(emoji).length > 0 isActive: (emoji) -> - @findEmojiIcon(emoji).parent().hasClass("active") + @findEmojiIcon(emoji).parent().hasClass('active') decrementCounter: (emoji) -> - counter = @findEmojiIcon(emoji).siblings(".counter") + counter = @findEmojiIcon(emoji).siblings('.js-counter') emojiIcon = counter.parent() if parseInt(counter.text()) > 1 counter.text(parseInt(counter.text()) - 1) - emojiIcon.removeClass("active") + emojiIcon.removeClass('active') @removeMeFromAuthorList(emoji) - else if emoji == "thumbsup" || emoji == "thumbsdown" - emojiIcon.tooltip("destroy") + else if emoji == 'thumbsup' || emoji == 'thumbsdown' + emojiIcon.tooltip('destroy') counter.text(0) - emojiIcon.removeClass("active") + emojiIcon.removeClass('active') @removeMeFromAuthorList(emoji) else - emojiIcon.tooltip("destroy") + emojiIcon.tooltip('destroy') emojiIcon.remove() removeMeFromAuthorList: (emoji) -> - award_block = @findEmojiIcon(emoji).parent() - authors = award_block.attr("data-original-title").split(", ") - authors.splice(authors.indexOf("me"),1) - award_block.closest(".award").attr("data-original-title", authors.join(", ")) - @resetTooltip(award_block) + awardBlock = @findEmojiIcon(emoji).parent() + authors = awardBlock + .attr('data-original-title') + .split(', ') + authors.splice(authors.indexOf('me'),1) + awardBlock + .closest('.js-emoji-btn') + .attr('data-original-title', authors.join(', ')) + @resetTooltip(awardBlock) addMeToAuthorList: (emoji) -> - award_block = @findEmojiIcon(emoji).parent() - origTitle = award_block.attr("data-original-title").trim() + awardBlock = @findEmojiIcon(emoji).parent() + origTitle = awardBlock.attr('data-original-title').trim() authors = [] if origTitle authors = origTitle.split(', ') - authors.push("me") - award_block.attr("title", authors.join(", ")) - @resetTooltip(award_block) + authors.push('me') + awardBlock.attr('data-original-title', authors.join(', ')) + @resetTooltip(awardBlock) resetTooltip: (award) -> - award.tooltip("destroy") + award.tooltip('destroy') # "destroy" call is asynchronous and there is no appropriate callback on it, this is why we need to set timeout. setTimeout (-> @@ -88,83 +132,84 @@ class @AwardsHandler emojiCssClass = @resolveNameToCssClass(emoji) nodes = [] - nodes.push("
") - nodes.push("
") - nodes.push("
1
") - nodes.push("
") + nodes.push( + "" + ) - emoji_node = $(nodes.join("\n")).insertBefore(".awards-controls").find(".emoji-icon").data("emoji", emoji) - - $(".award").tooltip() + $(nodes.join("\n")) + .insertBefore('.js-award-holder') + .find('.emoji-icon') + .data('emoji', emoji) + $('.award-control').tooltip() resolveNameToCssClass: (emoji) -> - emoji_icon = $(".emoji-menu-content [data-emoji='#{emoji}']") + emojiIcon = $(".emoji-menu-content [data-emoji='#{emoji}']") - if emoji_icon.length > 0 - unicodeName = emoji_icon.data("unicode-name") + if emojiIcon.length > 0 + unicodeName = emojiIcon.data('unicode-name') else # Find by alias - unicodeName = $(".emoji-menu-content [data-aliases*=':#{emoji}:']").data("unicode-name") + unicodeName = $(".emoji-menu-content [data-aliases*=':#{emoji}:']").data('unicode-name') "emoji-#{unicodeName}" postEmoji: (emoji, callback) -> - $.post @post_emoji_url, { note: { + $.post @postEmojiUrl, { note: { note: ":#{emoji}:" - noteable_type: @noteable_type - noteable_id: @noteable_id + noteable_type: @noteableType + noteable_id: @noteableId }},(data) -> if data.ok callback.call() findEmojiIcon: (emoji) -> - $(".award [data-emoji='#{emoji}']") + $(".awards > .js-emoji-btn [data-emoji='#{emoji}']") scrollToAwards: -> $('body, html').animate({ scrollTop: $('.awards').offset().top - 80 }, 200) - normilizeEmojiName: (emoji) -> - @aliases[emoji] || emoji - addEmojiToFrequentlyUsedList: (emoji) -> - frequently_used_emojis = @getFrequentlyUsedEmojis() - frequently_used_emojis.push(emoji) - $.cookie('frequently_used_emojis', frequently_used_emojis.join(","), { expires: 365 }) + frequentlyUsedEmojis = @getFrequentlyUsedEmojis() + frequentlyUsedEmojis.push(emoji) + $.cookie('frequently_used_emojis', frequentlyUsedEmojis.join(','), { expires: 365 }) getFrequentlyUsedEmojis: -> - frequently_used_emojis = ($.cookie('frequently_used_emojis') || "").split(",") - _.compact(_.uniq(frequently_used_emojis)) + frequentlyUsedEmojis = ($.cookie('frequently_used_emojis') || '').split(',') + _.compact(_.uniq(frequentlyUsedEmojis)) renderFrequentlyUsedBlock: -> if $.cookie('frequently_used_emojis') - frequently_used_emojis = @getFrequentlyUsedEmojis() + frequentlyUsedEmojis = @getFrequentlyUsedEmojis() - ul = $("